From b7aea38d77b2af1133cb2f7bbed630371d332ae5 Mon Sep 17 00:00:00 2001 From: ed Date: Sat, 18 Mar 2023 18:38:37 +0000 Subject: [PATCH] add iOS uploader (mk.ii) --- README.md | 33 +++++++++++++++++------ contrib/ios/upload-to-copyparty.shortcut | Bin 0 -> 25888 bytes 2 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 contrib/ios/upload-to-copyparty.shortcut diff --git a/README.md b/README.md index 547989d9..dd64eb3d 100644 --- a/README.md +++ b/README.md @@ -11,19 +11,13 @@ turn your phone or raspi into a portable file server with resumable uploads/down * server only needs Python (`2.7` or `3.3+`), all dependencies optional * browse/upload with [IE4](#browser-support) / netscape4.0 on win3.11 (heh) * protocols: [http](#the-browser) // [ftp](#ftp-server) // [webdav](#webdav-server) // [smb/cifs](#smb-server) +* [android app](#android-app) and [iPhone shortcuts](#ios-shortcuts) **[Get started](#quickstart)!** or visit the **[read-only demo server](https://a.ocv.me/pub/demo/)** 👀 running from a basement in finland 📷 **screenshots:** [browser](#the-browser) // [upload](#uploading) // [unpost](#unpost) // [thumbnails](#thumbnails) // [search](#searching) // [fsearch](#file-search) // [zip-DL](#zip-downloads) // [md-viewer](#markdown-viewer) -## get the app - -Get it on F-Droid '' f-droid version info '' github version info - -(the app is **NOT** the full copyparty server! just a basic upload client, nothing fancy yet) - - ## readme toc * top @@ -83,6 +77,8 @@ turn your phone or raspi into a portable file server with resumable uploads/down * [browser support](#browser-support) - TLDR: yes * [client examples](#client-examples) - interact with copyparty using non-browser clients * [mount as drive](#mount-as-drive) - a remote copyparty server as a local filesystem +* [android app](#android-app) - upload to copyparty with one tap +* [iOS shortcuts](#iOS-shortcuts) - there is no iPhone app, but * [performance](#performance) - defaults are usually fine - expect `8 GiB/s` download, `1 GiB/s` upload * [client-side](#client-side) - when uploading files * [security](#security) - some notes on hardening @@ -1225,6 +1221,27 @@ alternatively, some alternatives roughly sorted by speed (unreproducible benchma most clients will fail to mount the root of a copyparty server unless there is a root volume (so you get the admin-panel instead of a browser when accessing it) -- in that case, mount a specific volume instead +# android app + +upload to copyparty with one tap + +Get it on F-Droid '' f-droid version info '' github version info + +the app is **NOT** the full copyparty server! just a basic upload client, nothing fancy yet + +if you want to run the copyparty server on your android device, see [install on android](#install-on-android) + + +# iOS shortcuts + +there is no iPhone app, but the following shortcuts are almost just as good: + +* [upload to copyparty](https://www.icloud.com/shortcuts/41e98dd985cb4d3bb433222bc1e9e770) ([offline](https://github.com/9001/copyparty/raw/hovudstraum/contrib/ios/upload-to-copyparty.shortcut)) ([png](https://user-images.githubusercontent.com/241032/226118053-78623554-b0ed-482e-98e4-6d57ada58ea4.png)) based on the [original](https://www.icloud.com/shortcuts/ab415d5b4de3467b9ce6f151b439a5d7) by [Daedren](https://github.com/Daedren) (thx!) + * can strip exif, upload files, pics, vids, links, clipboard + * can download links and rehost the target file on copyparty (see first comment inside the shortcut) + * pics become lowres if you share from gallery to shortcut, so better to launch the shortcut and pick stuff from there + + # performance defaults are usually fine - expect `8 GiB/s` download, `1 GiB/s` upload @@ -1387,7 +1404,7 @@ these are standalone programs and will never be imported / evaluated by copypart the self-contained "binary" [copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py) will unpack itself and run copyparty, assuming you have python installed of course -you can reduce the sfx size by repacking it; see [./docs/devnotes.md#sfx-repack](#./docs/devnotes.md#sfx-repack) +you can reduce the sfx size by repacking it; see [./docs/devnotes.md#sfx-repack](./docs/devnotes.md#sfx-repack) ## copyparty.exe diff --git a/contrib/ios/upload-to-copyparty.shortcut b/contrib/ios/upload-to-copyparty.shortcut new file mode 100644 index 0000000000000000000000000000000000000000..7b2bf75d4f2e4ca2618dc5cf041a2a97a0adc3f6 GIT binary patch literal 25888 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 literal 0 HcmV?d00001