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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 Qjxg%TIj><&DyvWd0Jv70ng9R* literal 0 HcmV?d00001