mirror of
				https://github.com/9001/copyparty.git
				synced 2025-11-04 05:43:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			165 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
## devnotes toc
 | 
						|
 | 
						|
* top
 | 
						|
    * [future plans](#future-plans) - some improvement ideas
 | 
						|
* [design](#design)
 | 
						|
    * [why chunk-hashes](#why-chunk-hashes) - a single sha512 would be better, right?
 | 
						|
* [sfx repack](#sfx-repack) - reduce the size of an sfx by removing features
 | 
						|
* [building](#building)
 | 
						|
    * [dev env setup](#dev-env-setup)
 | 
						|
    * [just the sfx](#just-the-sfx)
 | 
						|
    * [complete release](#complete-release)
 | 
						|
* [todo](#todo) - roughly sorted by priority
 | 
						|
    * [discarded ideas](#discarded-ideas)
 | 
						|
 | 
						|
 | 
						|
## future plans
 | 
						|
 | 
						|
some improvement ideas
 | 
						|
 | 
						|
* the JS is a mess -- a preact rewrite would be nice
 | 
						|
  * preferably without build dependencies like webpack/babel/node.js, maybe a python thing to assemble js files into main.js
 | 
						|
  * good excuse to look at using virtual lists (browsers start to struggle when folders contain over 5000 files)
 | 
						|
* the UX is a mess -- a proper design would be nice
 | 
						|
  * very organic (much like the python/js), everything was an afterthought
 | 
						|
  * true for both the layout and the visual flair
 | 
						|
  * something like the tron board-room ui (or most other hollywood ones, like ironman) would be :100:
 | 
						|
* some of the python files are way too big
 | 
						|
  * `up2k.py` ended up doing all the file indexing / db management
 | 
						|
  * `httpcli.py` should be separated into modules in general
 | 
						|
 | 
						|
 | 
						|
# design
 | 
						|
 | 
						|
## why chunk-hashes
 | 
						|
 | 
						|
a single sha512 would be better, right?
 | 
						|
 | 
						|
this was due to `crypto.subtle` [not yet](https://github.com/w3c/webcrypto/issues/73) providing a streaming api (or the option to seed the sha512 hasher with a starting hash)
 | 
						|
 | 
						|
as a result, the hashes are much less useful than they could have been (search the server by sha512, provide the sha512 in the response http headers, ...)
 | 
						|
 | 
						|
however it allows for hashing multiple chunks in parallel, greatly increasing upload speed from fast storage (NVMe, raid-0 and such)
 | 
						|
 | 
						|
* both the [browser uploader](https://github.com/9001/copyparty#uploading) and the [commandline one](https://github.com/9001/copyparty/blob/hovudstraum/bin/up2k.py) does this now, allowing for fast uploading even from plaintext http
 | 
						|
 | 
						|
hashwasm would solve the streaming issue but reduces hashing speed for sha512 (xxh128 does 6 GiB/s), and it would make old browsers and [iphones](https://bugs.webkit.org/show_bug.cgi?id=228552) unsupported
 | 
						|
 | 
						|
* blake2 might be a better choice since xxh is non-cryptographic, but that gets ~15 MiB/s on slower androids
 | 
						|
 | 
						|
 | 
						|
## assumptions
 | 
						|
 | 
						|
### mdns
 | 
						|
 | 
						|
* outgoing replies will always fit in one packet
 | 
						|
* if a client mentions any of our services, assume it's not missing any
 | 
						|
* always answer with all services, even if the client only asked for a few
 | 
						|
* not-impl: probe tiebreaking (too complicated)
 | 
						|
* not-impl: unicast listen (assume avahi took it)
 | 
						|
 | 
						|
 | 
						|
# sfx repack
 | 
						|
 | 
						|
reduce the size of an sfx by removing features
 | 
						|
 | 
						|
if you don't need all the features, you can repack the sfx and save a bunch of space; all you need is an sfx and a copy of this repo (nothing else to download or build, except if you're on windows then you need msys2 or WSL)
 | 
						|
* `393k` size of original sfx.py as of v1.1.3
 | 
						|
* `310k` after `./scripts/make-sfx.sh re no-cm`
 | 
						|
* `269k` after `./scripts/make-sfx.sh re no-cm no-hl`
 | 
						|
 | 
						|
the features you can opt to drop are
 | 
						|
* `cm`/easymde, the "fancy" markdown editor, saves ~82k
 | 
						|
* `hl`, prism, the syntax hilighter, saves ~41k
 | 
						|
* `fnt`, source-code-pro, the monospace font, saves ~9k
 | 
						|
* `dd`, the custom mouse cursor for the media player tray tab, saves ~2k
 | 
						|
 | 
						|
for the `re`pack to work, first run one of the sfx'es once to unpack it
 | 
						|
 | 
						|
**note:** you can also just download and run [/scripts/copyparty-repack.sh](https://github.com/9001/copyparty/blob/hovudstraum/scripts/copyparty-repack.sh) -- this will grab the latest copyparty release from github and do a few repacks; works on linux/macos (and windows with msys2 or WSL)
 | 
						|
 | 
						|
 | 
						|
# building
 | 
						|
 | 
						|
## dev env setup
 | 
						|
 | 
						|
you need python 3.9 or newer due to type hints
 | 
						|
 | 
						|
the rest is mostly optional; if you need a working env for vscode or similar
 | 
						|
 | 
						|
```sh
 | 
						|
python3 -m venv .venv
 | 
						|
. .venv/bin/activate
 | 
						|
pip install jinja2 strip_hints  # MANDATORY
 | 
						|
pip install mutagen  # audio metadata
 | 
						|
pip install pyftpdlib  # ftp server
 | 
						|
pip install Pillow pyheif-pillow-opener pillow-avif-plugin  # thumbnails
 | 
						|
pip install black==21.12b0 click==8.0.2 bandit pylint flake8 isort mypy  # vscode tooling
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
## just the sfx
 | 
						|
 | 
						|
first grab the web-dependencies from a previous sfx (assuming you don't need to modify something in those):
 | 
						|
 | 
						|
```sh
 | 
						|
rm -rf copyparty/web/deps
 | 
						|
curl -L https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py >x.py
 | 
						|
python3 x.py --version
 | 
						|
rm x.py
 | 
						|
mv /tmp/pe-copyparty/copyparty/web/deps/ copyparty/web/deps/
 | 
						|
```
 | 
						|
 | 
						|
then build the sfx using any of the following examples:
 | 
						|
 | 
						|
```sh
 | 
						|
./scripts/make-sfx.sh           # regular edition
 | 
						|
./scripts/make-sfx.sh gz no-cm  # gzip-compressed + no fancy markdown editor
 | 
						|
```
 | 
						|
 | 
						|
 | 
						|
## complete release
 | 
						|
 | 
						|
also builds the sfx so skip the sfx section above
 | 
						|
 | 
						|
in the `scripts` folder:
 | 
						|
 | 
						|
* run `make -C deps-docker` to build all dependencies
 | 
						|
* run `./rls.sh 1.2.3` which uploads to pypi + creates github release + sfx
 | 
						|
 | 
						|
 | 
						|
# todo
 | 
						|
 | 
						|
roughly sorted by priority
 | 
						|
 | 
						|
* nothing! currently
 | 
						|
 | 
						|
 | 
						|
## discarded ideas
 | 
						|
 | 
						|
* reduce up2k roundtrips
 | 
						|
  * start from a chunk index and just go
 | 
						|
  * terminate client on bad data
 | 
						|
    * not worth the effort, just throw enough conncetions at it
 | 
						|
* single sha512 across all up2k chunks?
 | 
						|
  * crypto.subtle cannot into streaming, would have to use hashwasm, expensive
 | 
						|
* separate sqlite table per tag
 | 
						|
  * performance fixed by skipping some indexes (`+mt.k`)
 | 
						|
* audio fingerprinting
 | 
						|
  * only makes sense if there can be a wasm client and that doesn't exist yet (except for olaf which is agpl hence counts as not existing)
 | 
						|
* `os.copy_file_range` for up2k cloning
 | 
						|
  * almost never hit this path anyways
 | 
						|
* up2k partials ui
 | 
						|
  * feels like there isn't much point
 | 
						|
* cache sha512 chunks on client
 | 
						|
  * too dangerous -- overtaken by turbo mode
 | 
						|
* comment field
 | 
						|
  * nah
 | 
						|
* look into android thumbnail cache file format
 | 
						|
  * absolutely not
 | 
						|
* indexedDB for hashes, cfg enable/clear/sz, 2gb avail, ~9k for 1g, ~4k for 100m, 500k items before autoeviction
 | 
						|
  * blank hashlist when up-ok to skip handshake
 | 
						|
    * too many confusing side-effects
 | 
						|
* hls framework for Someone Else to drop code into :^)
 | 
						|
  * probably not, too much stuff to consider -- seeking, start at offset, task stitching (probably np-hard), conditional passthru, rate-control (especially multi-consumer), session keepalive, cache mgmt...
 |