copyparty 1.16.20__tar.gz → 1.17.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. {copyparty-1.16.20 → copyparty-1.17.0}/PKG-INFO +41 -2
  2. {copyparty-1.16.20 → copyparty-1.17.0}/README.md +40 -1
  3. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/__main__.py +5 -2
  4. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/__version__.py +3 -3
  5. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/svchub.py +8 -0
  6. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/szip.py +10 -6
  7. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/util.py +2 -0
  8. copyparty-1.17.0/copyparty/web/browser.css.gz +0 -0
  9. copyparty-1.17.0/copyparty/web/browser.js.gz +0 -0
  10. copyparty-1.17.0/copyparty/web/util.js.gz +0 -0
  11. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty.egg-info/PKG-INFO +41 -2
  12. copyparty-1.16.20/copyparty/web/browser.css.gz +0 -0
  13. copyparty-1.16.20/copyparty/web/browser.js.gz +0 -0
  14. copyparty-1.16.20/copyparty/web/util.js.gz +0 -0
  15. {copyparty-1.16.20 → copyparty-1.17.0}/LICENSE +0 -0
  16. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/__init__.py +0 -0
  17. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/authsrv.py +0 -0
  18. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/bos/__init__.py +0 -0
  19. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/bos/bos.py +0 -0
  20. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/bos/path.py +0 -0
  21. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/broker_mp.py +0 -0
  22. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/broker_mpw.py +0 -0
  23. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/broker_thr.py +0 -0
  24. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/broker_util.py +0 -0
  25. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/cert.py +0 -0
  26. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/cfg.py +0 -0
  27. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/dxml.py +0 -0
  28. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/fsutil.py +0 -0
  29. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/ftpd.py +0 -0
  30. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/httpcli.py +0 -0
  31. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/httpconn.py +0 -0
  32. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/httpsrv.py +0 -0
  33. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/ico.py +0 -0
  34. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/mdns.py +0 -0
  35. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/metrics.py +0 -0
  36. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/mtag.py +0 -0
  37. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/multicast.py +0 -0
  38. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/pwhash.py +0 -0
  39. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/res/COPYING.txt +0 -0
  40. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/res/__init__.py +0 -0
  41. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/res/insecure.pem +0 -0
  42. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/smbd.py +0 -0
  43. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/ssdp.py +0 -0
  44. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/star.py +0 -0
  45. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/__init__.py +0 -0
  46. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/dnslib/__init__.py +0 -0
  47. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/dnslib/bimap.py +0 -0
  48. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/dnslib/bit.py +0 -0
  49. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/dnslib/buffer.py +0 -0
  50. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/dnslib/dns.py +0 -0
  51. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/dnslib/label.py +0 -0
  52. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/dnslib/lex.py +0 -0
  53. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/dnslib/ranges.py +0 -0
  54. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/ifaddr/__init__.py +0 -0
  55. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/ifaddr/_posix.py +0 -0
  56. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/ifaddr/_shared.py +0 -0
  57. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/ifaddr/_win32.py +0 -0
  58. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/qrcodegen.py +0 -0
  59. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/stolen/surrogateescape.py +0 -0
  60. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/sutil.py +0 -0
  61. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/tcpsrv.py +0 -0
  62. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/tftpd.py +0 -0
  63. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/th_cli.py +0 -0
  64. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/th_srv.py +0 -0
  65. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/u2idx.py +0 -0
  66. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/up2k.py +0 -0
  67. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/a/__init__.py +0 -0
  68. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/a/partyfuse.py +0 -0
  69. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/a/u2c.py +0 -0
  70. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/a/webdav-cfg.bat +0 -0
  71. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/baguettebox.js.gz +0 -0
  72. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/browser.html +0 -0
  73. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/browser2.html +0 -0
  74. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/cf.html +0 -0
  75. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/dbg-audio.js.gz +0 -0
  76. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/dd/2.png +0 -0
  77. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/dd/3.png +0 -0
  78. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/dd/4.png +0 -0
  79. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/dd/5.png +0 -0
  80. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/dd/__init__.py +0 -0
  81. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/__init__.py +0 -0
  82. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/busy.mp3.gz +0 -0
  83. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/easymde.css.gz +0 -0
  84. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/easymde.js.gz +0 -0
  85. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/fuse.py +0 -0
  86. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/marked.js.gz +0 -0
  87. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/mini-fa.css.gz +0 -0
  88. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/mini-fa.woff +0 -0
  89. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/prism.css.gz +0 -0
  90. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/prism.js.gz +0 -0
  91. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/prismd.css.gz +0 -0
  92. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/scp.woff2 +0 -0
  93. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/sha512.ac.js.gz +0 -0
  94. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/deps/sha512.hw.js.gz +0 -0
  95. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/md.css.gz +0 -0
  96. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/md.html +0 -0
  97. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/md.js.gz +0 -0
  98. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/md2.css.gz +0 -0
  99. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/md2.js.gz +0 -0
  100. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/mde.css.gz +0 -0
  101. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/mde.html +0 -0
  102. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/mde.js.gz +0 -0
  103. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/msg.css.gz +0 -0
  104. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/msg.html +0 -0
  105. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/rups.css.gz +0 -0
  106. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/rups.html +0 -0
  107. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/rups.js.gz +0 -0
  108. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/shares.css.gz +0 -0
  109. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/shares.html +0 -0
  110. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/shares.js.gz +0 -0
  111. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/splash.css.gz +0 -0
  112. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/splash.html +0 -0
  113. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/splash.js.gz +0 -0
  114. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/svcs.html +0 -0
  115. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/svcs.js.gz +0 -0
  116. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/ui.css.gz +0 -0
  117. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/up2k.js.gz +0 -0
  118. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty/web/w.hash.js.gz +0 -0
  119. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty.egg-info/SOURCES.txt +0 -0
  120. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty.egg-info/dependency_links.txt +0 -0
  121. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty.egg-info/entry_points.txt +0 -0
  122. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty.egg-info/requires.txt +0 -0
  123. {copyparty-1.16.20 → copyparty-1.17.0}/copyparty.egg-info/top_level.txt +0 -0
  124. {copyparty-1.16.20 → copyparty-1.17.0}/pyproject.toml +0 -0
  125. {copyparty-1.16.20 → copyparty-1.17.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: copyparty
3
- Version: 1.16.20
3
+ Version: 1.17.0
4
4
  Summary: Portable file server with accelerated resumable uploads, deduplication, WebDAV, FTP, zeroconf, media indexer, video thumbnails, audio transcoding, and write-only folders
5
5
  Author-email: ed <copyparty@ocv.me>
6
6
  License: MIT
@@ -108,6 +108,8 @@ turn almost any device into a file server with resumable uploads/downloads using
108
108
  * [rss feeds](#rss-feeds) - monitor a folder with your RSS reader
109
109
  * [recent uploads](#recent-uploads) - list all recent uploads
110
110
  * [media player](#media-player) - plays almost every audio format there is
111
+ * [playlists](#playlists) - create and play [m3u8](https://en.wikipedia.org/wiki/M3U) playlists
112
+ * [creating a playlist](#creating-a-playlist) - with a standalone mediaplayer or copyparty
111
113
  * [audio equalizer](#audio-equalizer) - and [dynamic range compressor](https://en.wikipedia.org/wiki/Dynamic_range_compression)
112
114
  * [fix unreliable playback on android](#fix-unreliable-playback-on-android) - due to phone / app settings
113
115
  * [markdown viewer](#markdown-viewer) - and there are *two* editors
@@ -205,6 +207,7 @@ just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/
205
207
  * or if you are on android, [install copyparty in termux](#install-on-android)
206
208
  * or maybe you have a [synology nas / dsm](./docs/synology-dsm.md)
207
209
  * or if your computer is messed up and nothing else works, [try the pyz](#zipapp)
210
+ * or if your OS is dead, give the [bootable flashdrive / cd-rom](https://a.ocv.me/pub/stuff/edcd001/enterprise-edition/) a spin
208
211
  * or if you don't trust copyparty yet and want to isolate it a little, then...
209
212
  * ...maybe [prisonparty](./bin/prisonparty.sh) to create a tiny [chroot](https://wiki.archlinux.org/title/Chroot) (very portable),
210
213
  * ...or [bubbleparty](./bin/bubbleparty.sh) to wrap it in [bubblewrap](https://github.com/containers/bubblewrap) (much better)
@@ -308,6 +311,7 @@ also see [comparison to similar software](./docs/versus.md)
308
311
  * ☑ file manager (cut/paste, delete, [batch-rename](#batch-rename))
309
312
  * ☑ audio player (with [OS media controls](https://user-images.githubusercontent.com/241032/215347492-b4250797-6c90-4e09-9a4c-721edf2fb15c.png) and opus/mp3 transcoding)
310
313
  * ☑ play video files as audio (converted on server)
314
+ * ☑ create and play [m3u8 playlists](#playlists)
311
315
  * ☑ image gallery with webm player
312
316
  * ☑ textfile browser with syntax hilighting
313
317
  * ☑ [thumbnails](#thumbnails)
@@ -360,6 +364,8 @@ project goals / philosophy
360
364
  * adaptable, malleable, hackable
361
365
  * no build steps; modify the js/python without needing node.js or anything like that
362
366
 
367
+ becoming rich is specifically *not* a motivation, but if you wanna donate then see my [github profile](https://github.com/9001) regarding donations for my FOSS stuff in general (also THANKS!)
368
+
363
369
 
364
370
  ## notes
365
371
 
@@ -788,6 +794,7 @@ select which type of archive you want in the `[⚙️] config` tab:
788
794
  * `up2k.db` and `dir.txt` is always excluded
789
795
  * bsdtar supports streaming unzipping: `curl foo?zip | bsdtar -xv`
790
796
  * good, because copyparty's zip is faster than tar on small files
797
+ * but `?tar` is better for large files, especially if the total exceeds 4 GiB
791
798
  * `zip_crc` will take longer to download since the server has to read each file twice
792
799
  * this is only to support MS-DOS PKZIP v2.04g (october 1993) and older
793
800
  * how are you accessing copyparty actually
@@ -1092,11 +1099,13 @@ click the `play` link next to an audio file, or copy the link target to [share i
1092
1099
 
1093
1100
  open the `[🎺]` media-player-settings tab to configure it,
1094
1101
  * "switches":
1102
+ * `[🔁]` repeats one single song forever
1095
1103
  * `[🔀]` shuffles the files inside each folder
1096
1104
  * `[preload]` starts loading the next track when it's about to end, reduces the silence between songs
1097
1105
  * `[full]` does a full preload by downloading the entire next file; good for unreliable connections, bad for slow connections
1098
1106
  * `[~s]` toggles the seekbar waveform display
1099
1107
  * `[/np]` enables buttons to copy the now-playing info as an irc message
1108
+ * `[📻]` enables buttons to create an [m3u playlist](#playlists) with the selected songs
1100
1109
  * `[os-ctl]` makes it possible to control audio playback from the lockscreen of your device (enables [mediasession](https://developer.mozilla.org/en-US/docs/Web/API/MediaSession))
1101
1110
  * `[seek]` allows seeking with lockscreen controls (buggy on some devices)
1102
1111
  * `[art]` shows album art on the lockscreen
@@ -1115,11 +1124,39 @@ open the `[🎺]` media-player-settings tab to configure it,
1115
1124
  * "transcode to":
1116
1125
  * `[opus]` produces an `opus` whenever transcoding is necessary (the best choice on Android and PCs)
1117
1126
  * `[awo]` is `opus` in a `weba` file, good for iPhones (iOS 17.5 and newer) but Apple is still fixing some state-confusion bugs as of iOS 18.2.1
1118
- * `[caf]` is `opus` in a `caf` file, good for iPhones (iOS 11 through 17), technically unsupported by Apple but works for the mos tpart
1127
+ * `[caf]` is `opus` in a `caf` file, good for iPhones (iOS 11 through 17), technically unsupported by Apple but works for the most part
1119
1128
  * `[mp3]` -- the myth, the legend, the undying master of mediocre sound quality that definitely works everywhere
1120
1129
  * "tint" reduces the contrast of the playback bar
1121
1130
 
1122
1131
 
1132
+ ### playlists
1133
+
1134
+ create and play [m3u8](https://en.wikipedia.org/wiki/M3U) playlists -- see example [text](https://a.ocv.me/pub/demo/music/?doc=example-playlist.m3u) and [player](https://a.ocv.me/pub/demo/music/#m3u=example-playlist.m3u)
1135
+
1136
+ click a file with the extension `m3u` or `m3u8` (for example `mixtape.m3u` or `touhou.m3u8` ) and you get two choices: Play / Edit
1137
+
1138
+ playlists can include songs across folders anywhere on the server, but filekeys/dirkeys are NOT supported, so the listener must have read-access or get-access to the files
1139
+
1140
+
1141
+ ### creating a playlist
1142
+
1143
+ with a standalone mediaplayer or copyparty
1144
+
1145
+ you can use foobar2000, deadbeef, just about any standalone player should work -- but you might need to edit the filepaths in the playlist so they fit with the server-URLs
1146
+
1147
+ alternatively, you can create the playlist using copyparty itself:
1148
+
1149
+ * open the `[🎺]` media-player-settings tab and enable the `[📻]` create-playlist feature -- this adds two new buttons in the bottom-right tray, `[📻add]` and `[📻copy]` which appear when you listen to music, or when you select a few audiofiles
1150
+
1151
+ * click the `📻add` button while a song is playing (or when you've selected some songs) and they'll be added to "the list" (you can't see it yet)
1152
+
1153
+ * at any time, click `📻copy` to send the playlist to your clipboard
1154
+ * you can then continue adding more songs if you'd like
1155
+ * if you want to wipe the playlist and start from scratch, just refresh the page
1156
+
1157
+ * create a new textfile, name it `something.m3u` and paste the playlist there
1158
+
1159
+
1123
1160
  ### audio equalizer
1124
1161
 
1125
1162
  and [dynamic range compressor](https://en.wikipedia.org/wiki/Dynamic_range_compression)
@@ -2441,6 +2478,8 @@ copyparty returns a truncated sha512sum of your PUT/POST as base64; you can gene
2441
2478
 
2442
2479
  you can provide passwords using header `PW: hunter2`, cookie `cppwd=hunter2`, url-param `?pw=hunter2`, or with basic-authentication (either as the username or password)
2443
2480
 
2481
+ > for basic-authentication, all of the following are accepted: `password` / `whatever:password` / `password:whatever` (the username is ignored)
2482
+
2444
2483
  NOTE: curl will not send the original filename if you use `-T` combined with url-params! Also, make sure to always leave a trailing slash in URLs unless you want to override the filename
2445
2484
 
2446
2485
 
@@ -50,6 +50,8 @@ turn almost any device into a file server with resumable uploads/downloads using
50
50
  * [rss feeds](#rss-feeds) - monitor a folder with your RSS reader
51
51
  * [recent uploads](#recent-uploads) - list all recent uploads
52
52
  * [media player](#media-player) - plays almost every audio format there is
53
+ * [playlists](#playlists) - create and play [m3u8](https://en.wikipedia.org/wiki/M3U) playlists
54
+ * [creating a playlist](#creating-a-playlist) - with a standalone mediaplayer or copyparty
53
55
  * [audio equalizer](#audio-equalizer) - and [dynamic range compressor](https://en.wikipedia.org/wiki/Dynamic_range_compression)
54
56
  * [fix unreliable playback on android](#fix-unreliable-playback-on-android) - due to phone / app settings
55
57
  * [markdown viewer](#markdown-viewer) - and there are *two* editors
@@ -147,6 +149,7 @@ just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/
147
149
  * or if you are on android, [install copyparty in termux](#install-on-android)
148
150
  * or maybe you have a [synology nas / dsm](./docs/synology-dsm.md)
149
151
  * or if your computer is messed up and nothing else works, [try the pyz](#zipapp)
152
+ * or if your OS is dead, give the [bootable flashdrive / cd-rom](https://a.ocv.me/pub/stuff/edcd001/enterprise-edition/) a spin
150
153
  * or if you don't trust copyparty yet and want to isolate it a little, then...
151
154
  * ...maybe [prisonparty](./bin/prisonparty.sh) to create a tiny [chroot](https://wiki.archlinux.org/title/Chroot) (very portable),
152
155
  * ...or [bubbleparty](./bin/bubbleparty.sh) to wrap it in [bubblewrap](https://github.com/containers/bubblewrap) (much better)
@@ -250,6 +253,7 @@ also see [comparison to similar software](./docs/versus.md)
250
253
  * ☑ file manager (cut/paste, delete, [batch-rename](#batch-rename))
251
254
  * ☑ audio player (with [OS media controls](https://user-images.githubusercontent.com/241032/215347492-b4250797-6c90-4e09-9a4c-721edf2fb15c.png) and opus/mp3 transcoding)
252
255
  * ☑ play video files as audio (converted on server)
256
+ * ☑ create and play [m3u8 playlists](#playlists)
253
257
  * ☑ image gallery with webm player
254
258
  * ☑ textfile browser with syntax hilighting
255
259
  * ☑ [thumbnails](#thumbnails)
@@ -302,6 +306,8 @@ project goals / philosophy
302
306
  * adaptable, malleable, hackable
303
307
  * no build steps; modify the js/python without needing node.js or anything like that
304
308
 
309
+ becoming rich is specifically *not* a motivation, but if you wanna donate then see my [github profile](https://github.com/9001) regarding donations for my FOSS stuff in general (also THANKS!)
310
+
305
311
 
306
312
  ## notes
307
313
 
@@ -730,6 +736,7 @@ select which type of archive you want in the `[⚙️] config` tab:
730
736
  * `up2k.db` and `dir.txt` is always excluded
731
737
  * bsdtar supports streaming unzipping: `curl foo?zip | bsdtar -xv`
732
738
  * good, because copyparty's zip is faster than tar on small files
739
+ * but `?tar` is better for large files, especially if the total exceeds 4 GiB
733
740
  * `zip_crc` will take longer to download since the server has to read each file twice
734
741
  * this is only to support MS-DOS PKZIP v2.04g (october 1993) and older
735
742
  * how are you accessing copyparty actually
@@ -1034,11 +1041,13 @@ click the `play` link next to an audio file, or copy the link target to [share i
1034
1041
 
1035
1042
  open the `[🎺]` media-player-settings tab to configure it,
1036
1043
  * "switches":
1044
+ * `[🔁]` repeats one single song forever
1037
1045
  * `[🔀]` shuffles the files inside each folder
1038
1046
  * `[preload]` starts loading the next track when it's about to end, reduces the silence between songs
1039
1047
  * `[full]` does a full preload by downloading the entire next file; good for unreliable connections, bad for slow connections
1040
1048
  * `[~s]` toggles the seekbar waveform display
1041
1049
  * `[/np]` enables buttons to copy the now-playing info as an irc message
1050
+ * `[📻]` enables buttons to create an [m3u playlist](#playlists) with the selected songs
1042
1051
  * `[os-ctl]` makes it possible to control audio playback from the lockscreen of your device (enables [mediasession](https://developer.mozilla.org/en-US/docs/Web/API/MediaSession))
1043
1052
  * `[seek]` allows seeking with lockscreen controls (buggy on some devices)
1044
1053
  * `[art]` shows album art on the lockscreen
@@ -1057,11 +1066,39 @@ open the `[🎺]` media-player-settings tab to configure it,
1057
1066
  * "transcode to":
1058
1067
  * `[opus]` produces an `opus` whenever transcoding is necessary (the best choice on Android and PCs)
1059
1068
  * `[awo]` is `opus` in a `weba` file, good for iPhones (iOS 17.5 and newer) but Apple is still fixing some state-confusion bugs as of iOS 18.2.1
1060
- * `[caf]` is `opus` in a `caf` file, good for iPhones (iOS 11 through 17), technically unsupported by Apple but works for the mos tpart
1069
+ * `[caf]` is `opus` in a `caf` file, good for iPhones (iOS 11 through 17), technically unsupported by Apple but works for the most part
1061
1070
  * `[mp3]` -- the myth, the legend, the undying master of mediocre sound quality that definitely works everywhere
1062
1071
  * "tint" reduces the contrast of the playback bar
1063
1072
 
1064
1073
 
1074
+ ### playlists
1075
+
1076
+ create and play [m3u8](https://en.wikipedia.org/wiki/M3U) playlists -- see example [text](https://a.ocv.me/pub/demo/music/?doc=example-playlist.m3u) and [player](https://a.ocv.me/pub/demo/music/#m3u=example-playlist.m3u)
1077
+
1078
+ click a file with the extension `m3u` or `m3u8` (for example `mixtape.m3u` or `touhou.m3u8` ) and you get two choices: Play / Edit
1079
+
1080
+ playlists can include songs across folders anywhere on the server, but filekeys/dirkeys are NOT supported, so the listener must have read-access or get-access to the files
1081
+
1082
+
1083
+ ### creating a playlist
1084
+
1085
+ with a standalone mediaplayer or copyparty
1086
+
1087
+ you can use foobar2000, deadbeef, just about any standalone player should work -- but you might need to edit the filepaths in the playlist so they fit with the server-URLs
1088
+
1089
+ alternatively, you can create the playlist using copyparty itself:
1090
+
1091
+ * open the `[🎺]` media-player-settings tab and enable the `[📻]` create-playlist feature -- this adds two new buttons in the bottom-right tray, `[📻add]` and `[📻copy]` which appear when you listen to music, or when you select a few audiofiles
1092
+
1093
+ * click the `📻add` button while a song is playing (or when you've selected some songs) and they'll be added to "the list" (you can't see it yet)
1094
+
1095
+ * at any time, click `📻copy` to send the playlist to your clipboard
1096
+ * you can then continue adding more songs if you'd like
1097
+ * if you want to wipe the playlist and start from scratch, just refresh the page
1098
+
1099
+ * create a new textfile, name it `something.m3u` and paste the playlist there
1100
+
1101
+
1065
1102
  ### audio equalizer
1066
1103
 
1067
1104
  and [dynamic range compressor](https://en.wikipedia.org/wiki/Dynamic_range_compression)
@@ -2383,6 +2420,8 @@ copyparty returns a truncated sha512sum of your PUT/POST as base64; you can gene
2383
2420
 
2384
2421
  you can provide passwords using header `PW: hunter2`, cookie `cppwd=hunter2`, url-param `?pw=hunter2`, or with basic-authentication (either as the username or password)
2385
2422
 
2423
+ > for basic-authentication, all of the following are accepted: `password` / `whatever:password` / `password:whatever` (the username is ignored)
2424
+
2386
2425
  NOTE: curl will not send the original filename if you use `-T` combined with url-params! Also, make sure to always leave a trailing slash in URLs unless you want to override the filename
2387
2426
 
2388
2427
 
@@ -1017,7 +1017,7 @@ def add_upload(ap):
1017
1017
  ap2.add_argument("--df", metavar="GiB", type=u, default="0", help="ensure \033[33mGiB\033[0m free disk space by rejecting upload requests; assumes gigabytes unless a unit suffix is given: [\033[32m256m\033[0m], [\033[32m4\033[0m], [\033[32m2T\033[0m] (volflag=df)")
1018
1018
  ap2.add_argument("--sparse", metavar="MiB", type=int, default=4, help="windows-only: minimum size of incoming uploads through up2k before they are made into sparse files")
1019
1019
  ap2.add_argument("--turbo", metavar="LVL", type=int, default=0, help="configure turbo-mode in up2k client; [\033[32m-1\033[0m] = forbidden/always-off, [\033[32m0\033[0m] = default-off and warn if enabled, [\033[32m1\033[0m] = default-off, [\033[32m2\033[0m] = on, [\033[32m3\033[0m] = on and disable datecheck")
1020
- ap2.add_argument("--u2j", metavar="JOBS", type=int, default=2, help="web-client: number of file chunks to upload in parallel; 1 or 2 is good for low-latency (same-country) connections, 4-8 for android clients, 16 for cross-atlantic (max=64)")
1020
+ ap2.add_argument("--u2j", metavar="JOBS", type=int, default=2, help="web-client: number of file chunks to upload in parallel; 1 or 2 is good when latency is low (same-country), 2~4 for android-clients, 2~6 for cross-atlantic. Max is 6 in most browsers. Big values increase network-speed but may reduce HDD-speed")
1021
1021
  ap2.add_argument("--u2sz", metavar="N,N,N", type=u, default="1,64,96", help="web-client: default upload chunksize (MiB); sets \033[33mmin,default,max\033[0m in the settings gui. Each HTTP POST will aim for \033[33mdefault\033[0m, and never exceed \033[33mmax\033[0m. Cloudflare max is 96. Big values are good for cross-atlantic but may increase HDD fragmentation on some FS. Disable this optimization with [\033[32m1,1,1\033[0m]")
1022
1022
  ap2.add_argument("--u2ow", metavar="NUM", type=int, default=0, help="web-client: default setting for when to replace/overwrite existing files; [\033[32m0\033[0m]=never, [\033[32m1\033[0m]=if-client-newer, [\033[32m2\033[0m]=always (volflag=u2ow)")
1023
1023
  ap2.add_argument("--u2sort", metavar="TXT", type=u, default="s", help="upload order; [\033[32ms\033[0m]=smallest-first, [\033[32mn\033[0m]=alphabetical, [\033[32mfs\033[0m]=force-s, [\033[32mfn\033[0m]=force-n -- alphabetical is a bit slower on fiber/LAN but makes it easier to eyeball if everything went fine")
@@ -1300,6 +1300,9 @@ def add_salt(ap, fk_salt, dk_salt, ah_salt):
1300
1300
  ap2.add_argument("--fk-salt", metavar="SALT", type=u, default=fk_salt, help="per-file accesskey salt; used to generate unpredictable URLs for hidden files")
1301
1301
  ap2.add_argument("--dk-salt", metavar="SALT", type=u, default=dk_salt, help="per-directory accesskey salt; used to generate unpredictable URLs to share folders with users who only have the 'get' permission")
1302
1302
  ap2.add_argument("--warksalt", metavar="SALT", type=u, default="hunter2", help="up2k file-hash salt; serves no purpose, no reason to change this (but delete all databases if you do)")
1303
+ ap2.add_argument("--show-ah-salt", action="store_true", help="on startup, print the effective value of \033[33m--ah-salt\033[0m (the autogenerated value in $XDG_CONFIG_HOME unless otherwise specified)")
1304
+ ap2.add_argument("--show-fk-salt", action="store_true", help="on startup, print the effective value of \033[33m--fk-salt\033[0m (the autogenerated value in $XDG_CONFIG_HOME unless otherwise specified)")
1305
+ ap2.add_argument("--show-dk-salt", action="store_true", help="on startup, print the effective value of \033[33m--dk-salt\033[0m (the autogenerated value in $XDG_CONFIG_HOME unless otherwise specified)")
1303
1306
 
1304
1307
 
1305
1308
  def add_shutdown(ap):
@@ -1341,7 +1344,7 @@ def add_admin(ap):
1341
1344
 
1342
1345
  def add_thumbnail(ap):
1343
1346
  th_ram = (RAM_AVAIL or RAM_TOTAL or 9) * 0.6
1344
- th_ram = int(max(min(th_ram, 6), 1) * 10) / 10
1347
+ th_ram = int(max(min(th_ram, 6), 0.3) * 10) / 10
1345
1348
  ap2 = ap.add_argument_group('thumbnail options')
1346
1349
  ap2.add_argument("--no-thumb", action="store_true", help="disable all thumbnails (volflag=dthumb)")
1347
1350
  ap2.add_argument("--no-vthumb", action="store_true", help="disable video thumbnails (volflag=dvthumb)")
@@ -1,8 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- VERSION = (1, 16, 20)
4
- CODENAME = "COPYparty"
5
- BUILD_DT = (2025, 4, 13)
3
+ VERSION = (1, 17, 0)
4
+ CODENAME = "mixtape.m3u"
5
+ BUILD_DT = (2025, 4, 26)
6
6
 
7
7
  S_VERSION = ".".join(map(str, VERSION))
8
8
  S_BUILD_DT = "{0:04d}-{1:02d}-{2:02d}".format(*BUILD_DT)
@@ -247,6 +247,14 @@ class SvcHub(object):
247
247
  setattr(args, "ipu_iu", iu)
248
248
  setattr(args, "ipu_nm", nm)
249
249
 
250
+ for zs in "ah_salt fk_salt dk_salt".split():
251
+ if getattr(args, "show_%s" % (zs,)):
252
+ self.log("root", "effective %s is %s" % (zs, getattr(args, zs)))
253
+
254
+ if args.ah_cli or args.ah_gen:
255
+ args.no_ses = True
256
+ args.shr = ""
257
+
250
258
  if not self.args.no_ses:
251
259
  self.setup_session_db()
252
260
 
@@ -48,6 +48,7 @@ def gen_fdesc(sz , crc32 , z64 ) :
48
48
 
49
49
  def gen_hdr(
50
50
  h_pos ,
51
+ z64 ,
51
52
  fn ,
52
53
  sz ,
53
54
  lastmod ,
@@ -64,7 +65,6 @@ def gen_hdr(
64
65
  # appnote 4.5 / zip 3.0 (2008) / unzip 6.0 (2009) says to add z64
65
66
  # extinfo for values which exceed H, but that becomes an off-by-one
66
67
  # (can't tell if it was clamped or exactly maxval), make it obvious
67
- z64 = sz >= 0xFFFFFFFF
68
68
  z64v = [sz, sz] if z64 else []
69
69
  if h_pos and h_pos >= 0xFFFFFFFF:
70
70
  # central, also consider ptr to original header
@@ -238,6 +238,7 @@ class StreamZip(StreamArc):
238
238
 
239
239
  sz = st.st_size
240
240
  ts = st.st_mtime
241
+ h_pos = self.pos
241
242
 
242
243
  crc = 0
243
244
  if self.pre_crc:
@@ -246,8 +247,12 @@ class StreamZip(StreamArc):
246
247
 
247
248
  crc &= 0xFFFFFFFF
248
249
 
249
- h_pos = self.pos
250
- buf = gen_hdr(None, name, sz, ts, self.utf8, crc, self.pre_crc)
250
+ # some unzip-programs expect a 64bit data-descriptor
251
+ # even if the only 32bit-exceeding value is the offset,
252
+ # so force that by placeholdering the filesize too
253
+ z64 = h_pos >= 0xFFFFFFFF or sz >= 0xFFFFFFFF
254
+
255
+ buf = gen_hdr(None, z64, name, sz, ts, self.utf8, crc, self.pre_crc)
251
256
  yield self._ct(buf)
252
257
 
253
258
  for buf in yieldfile(src, self.args.iobuf):
@@ -260,8 +265,6 @@ class StreamZip(StreamArc):
260
265
 
261
266
  self.items.append((name, sz, ts, crc, h_pos))
262
267
 
263
- z64 = sz >= 4 * 1024 * 1024 * 1024
264
-
265
268
  if z64 or not self.pre_crc:
266
269
  buf = gen_fdesc(sz, crc, z64)
267
270
  yield self._ct(buf)
@@ -300,7 +303,8 @@ class StreamZip(StreamArc):
300
303
 
301
304
  cdir_pos = self.pos
302
305
  for name, sz, ts, crc, h_pos in self.items:
303
- buf = gen_hdr(h_pos, name, sz, ts, self.utf8, crc, self.pre_crc)
306
+ z64 = h_pos >= 0xFFFFFFFF or sz >= 0xFFFFFFFF
307
+ buf = gen_hdr(h_pos, z64, name, sz, ts, self.utf8, crc, self.pre_crc)
304
308
  mbuf += self._ct(buf)
305
309
  if len(mbuf) >= 16384:
306
310
  yield mbuf
@@ -451,6 +451,8 @@ FN_EMB = set([".prologue.html", ".epilogue.html", "readme.md", "preadme.md"])
451
451
 
452
452
 
453
453
  def read_ram() :
454
+ # NOTE: apparently no need to consider /sys/fs/cgroup/memory.max
455
+ # (cgroups2) since the limit is synced to /proc/meminfo
454
456
  a = b = 0
455
457
  try:
456
458
  with open("/proc/meminfo", "rb", 0x10000) as f:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: copyparty
3
- Version: 1.16.20
3
+ Version: 1.17.0
4
4
  Summary: Portable file server with accelerated resumable uploads, deduplication, WebDAV, FTP, zeroconf, media indexer, video thumbnails, audio transcoding, and write-only folders
5
5
  Author-email: ed <copyparty@ocv.me>
6
6
  License: MIT
@@ -108,6 +108,8 @@ turn almost any device into a file server with resumable uploads/downloads using
108
108
  * [rss feeds](#rss-feeds) - monitor a folder with your RSS reader
109
109
  * [recent uploads](#recent-uploads) - list all recent uploads
110
110
  * [media player](#media-player) - plays almost every audio format there is
111
+ * [playlists](#playlists) - create and play [m3u8](https://en.wikipedia.org/wiki/M3U) playlists
112
+ * [creating a playlist](#creating-a-playlist) - with a standalone mediaplayer or copyparty
111
113
  * [audio equalizer](#audio-equalizer) - and [dynamic range compressor](https://en.wikipedia.org/wiki/Dynamic_range_compression)
112
114
  * [fix unreliable playback on android](#fix-unreliable-playback-on-android) - due to phone / app settings
113
115
  * [markdown viewer](#markdown-viewer) - and there are *two* editors
@@ -205,6 +207,7 @@ just run **[copyparty-sfx.py](https://github.com/9001/copyparty/releases/latest/
205
207
  * or if you are on android, [install copyparty in termux](#install-on-android)
206
208
  * or maybe you have a [synology nas / dsm](./docs/synology-dsm.md)
207
209
  * or if your computer is messed up and nothing else works, [try the pyz](#zipapp)
210
+ * or if your OS is dead, give the [bootable flashdrive / cd-rom](https://a.ocv.me/pub/stuff/edcd001/enterprise-edition/) a spin
208
211
  * or if you don't trust copyparty yet and want to isolate it a little, then...
209
212
  * ...maybe [prisonparty](./bin/prisonparty.sh) to create a tiny [chroot](https://wiki.archlinux.org/title/Chroot) (very portable),
210
213
  * ...or [bubbleparty](./bin/bubbleparty.sh) to wrap it in [bubblewrap](https://github.com/containers/bubblewrap) (much better)
@@ -308,6 +311,7 @@ also see [comparison to similar software](./docs/versus.md)
308
311
  * ☑ file manager (cut/paste, delete, [batch-rename](#batch-rename))
309
312
  * ☑ audio player (with [OS media controls](https://user-images.githubusercontent.com/241032/215347492-b4250797-6c90-4e09-9a4c-721edf2fb15c.png) and opus/mp3 transcoding)
310
313
  * ☑ play video files as audio (converted on server)
314
+ * ☑ create and play [m3u8 playlists](#playlists)
311
315
  * ☑ image gallery with webm player
312
316
  * ☑ textfile browser with syntax hilighting
313
317
  * ☑ [thumbnails](#thumbnails)
@@ -360,6 +364,8 @@ project goals / philosophy
360
364
  * adaptable, malleable, hackable
361
365
  * no build steps; modify the js/python without needing node.js or anything like that
362
366
 
367
+ becoming rich is specifically *not* a motivation, but if you wanna donate then see my [github profile](https://github.com/9001) regarding donations for my FOSS stuff in general (also THANKS!)
368
+
363
369
 
364
370
  ## notes
365
371
 
@@ -788,6 +794,7 @@ select which type of archive you want in the `[⚙️] config` tab:
788
794
  * `up2k.db` and `dir.txt` is always excluded
789
795
  * bsdtar supports streaming unzipping: `curl foo?zip | bsdtar -xv`
790
796
  * good, because copyparty's zip is faster than tar on small files
797
+ * but `?tar` is better for large files, especially if the total exceeds 4 GiB
791
798
  * `zip_crc` will take longer to download since the server has to read each file twice
792
799
  * this is only to support MS-DOS PKZIP v2.04g (october 1993) and older
793
800
  * how are you accessing copyparty actually
@@ -1092,11 +1099,13 @@ click the `play` link next to an audio file, or copy the link target to [share i
1092
1099
 
1093
1100
  open the `[🎺]` media-player-settings tab to configure it,
1094
1101
  * "switches":
1102
+ * `[🔁]` repeats one single song forever
1095
1103
  * `[🔀]` shuffles the files inside each folder
1096
1104
  * `[preload]` starts loading the next track when it's about to end, reduces the silence between songs
1097
1105
  * `[full]` does a full preload by downloading the entire next file; good for unreliable connections, bad for slow connections
1098
1106
  * `[~s]` toggles the seekbar waveform display
1099
1107
  * `[/np]` enables buttons to copy the now-playing info as an irc message
1108
+ * `[📻]` enables buttons to create an [m3u playlist](#playlists) with the selected songs
1100
1109
  * `[os-ctl]` makes it possible to control audio playback from the lockscreen of your device (enables [mediasession](https://developer.mozilla.org/en-US/docs/Web/API/MediaSession))
1101
1110
  * `[seek]` allows seeking with lockscreen controls (buggy on some devices)
1102
1111
  * `[art]` shows album art on the lockscreen
@@ -1115,11 +1124,39 @@ open the `[🎺]` media-player-settings tab to configure it,
1115
1124
  * "transcode to":
1116
1125
  * `[opus]` produces an `opus` whenever transcoding is necessary (the best choice on Android and PCs)
1117
1126
  * `[awo]` is `opus` in a `weba` file, good for iPhones (iOS 17.5 and newer) but Apple is still fixing some state-confusion bugs as of iOS 18.2.1
1118
- * `[caf]` is `opus` in a `caf` file, good for iPhones (iOS 11 through 17), technically unsupported by Apple but works for the mos tpart
1127
+ * `[caf]` is `opus` in a `caf` file, good for iPhones (iOS 11 through 17), technically unsupported by Apple but works for the most part
1119
1128
  * `[mp3]` -- the myth, the legend, the undying master of mediocre sound quality that definitely works everywhere
1120
1129
  * "tint" reduces the contrast of the playback bar
1121
1130
 
1122
1131
 
1132
+ ### playlists
1133
+
1134
+ create and play [m3u8](https://en.wikipedia.org/wiki/M3U) playlists -- see example [text](https://a.ocv.me/pub/demo/music/?doc=example-playlist.m3u) and [player](https://a.ocv.me/pub/demo/music/#m3u=example-playlist.m3u)
1135
+
1136
+ click a file with the extension `m3u` or `m3u8` (for example `mixtape.m3u` or `touhou.m3u8` ) and you get two choices: Play / Edit
1137
+
1138
+ playlists can include songs across folders anywhere on the server, but filekeys/dirkeys are NOT supported, so the listener must have read-access or get-access to the files
1139
+
1140
+
1141
+ ### creating a playlist
1142
+
1143
+ with a standalone mediaplayer or copyparty
1144
+
1145
+ you can use foobar2000, deadbeef, just about any standalone player should work -- but you might need to edit the filepaths in the playlist so they fit with the server-URLs
1146
+
1147
+ alternatively, you can create the playlist using copyparty itself:
1148
+
1149
+ * open the `[🎺]` media-player-settings tab and enable the `[📻]` create-playlist feature -- this adds two new buttons in the bottom-right tray, `[📻add]` and `[📻copy]` which appear when you listen to music, or when you select a few audiofiles
1150
+
1151
+ * click the `📻add` button while a song is playing (or when you've selected some songs) and they'll be added to "the list" (you can't see it yet)
1152
+
1153
+ * at any time, click `📻copy` to send the playlist to your clipboard
1154
+ * you can then continue adding more songs if you'd like
1155
+ * if you want to wipe the playlist and start from scratch, just refresh the page
1156
+
1157
+ * create a new textfile, name it `something.m3u` and paste the playlist there
1158
+
1159
+
1123
1160
  ### audio equalizer
1124
1161
 
1125
1162
  and [dynamic range compressor](https://en.wikipedia.org/wiki/Dynamic_range_compression)
@@ -2441,6 +2478,8 @@ copyparty returns a truncated sha512sum of your PUT/POST as base64; you can gene
2441
2478
 
2442
2479
  you can provide passwords using header `PW: hunter2`, cookie `cppwd=hunter2`, url-param `?pw=hunter2`, or with basic-authentication (either as the username or password)
2443
2480
 
2481
+ > for basic-authentication, all of the following are accepted: `password` / `whatever:password` / `password:whatever` (the username is ignored)
2482
+
2444
2483
  NOTE: curl will not send the original filename if you use `-T` combined with url-params! Also, make sure to always leave a trailing slash in URLs unless you want to override the filename
2445
2484
 
2446
2485
 
Binary file
File without changes
File without changes
File without changes
File without changes
File without changes