diff --git a/README.md b/README.md index 60ae5bc2..81f01f9c 100644 --- a/README.md +++ b/README.md @@ -511,7 +511,7 @@ it does static images with Pillow / pyvips / FFmpeg, and uses FFmpeg for video f audio files are covnerted into spectrograms using FFmpeg unless you `--no-athumb` (and some FFmpeg builds may need `--th-ff-swr`) images with the following names (see `--th-covers`) become the thumbnail of the folder they're in: `folder.png`, `folder.jpg`, `cover.png`, `cover.jpg` -* and, if you enable [file indexing](#file-indexing), all remaining folders will also get thumbnails (as long as they contain any pics at all) +* and, if you enable [file indexing](#file-indexing), it will also try those names as dotfiles (`.folder.jpg` and so), and then fallback on the first picture in the folder (if it has any pictures at all) in the grid/thumbnail view, if the audio player panel is open, songs will start playing when clicked * indicated by the audio files having the ▶ icon instead of 💾 diff --git a/copyparty/__main__.py b/copyparty/__main__.py index 6e871d4a..0525671e 100755 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -1138,7 +1138,7 @@ def add_thumbnail(ap): ap2.add_argument("--th-poke", metavar="SEC", type=int, default=300, help="activity labeling cooldown -- avoids doing keepalive pokes (updating the mtime) on thumbnail folders more often than \033[33mSEC\033[0m seconds") ap2.add_argument("--th-clean", metavar="SEC", type=int, default=43200, help="cleanup interval; 0=disabled") ap2.add_argument("--th-maxage", metavar="SEC", type=int, default=604800, help="max folder age -- folders which haven't been poked for longer than \033[33m--th-poke\033[0m seconds will get deleted every \033[33m--th-clean\033[0m seconds") - ap2.add_argument("--th-covers", metavar="N,N", type=u, default="folder.png,folder.jpg,cover.png,cover.jpg", help="folder thumbnails to stat/look for; enabling \033[33m-e2d\033[0m will make these case-insensitive, and also automatically select thumbnails for all folders that contain pics, even if none match this pattern") + ap2.add_argument("--th-covers", metavar="N,N", type=u, default="folder.png,folder.jpg,cover.png,cover.jpg", help="folder thumbnails to stat/look for; enabling \033[33m-e2d\033[0m will make these case-insensitive, and try them as dotfiles (.folder.jpg), and also automatically select thumbnails for all folders that contain pics, even if none match this pattern") # https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html # https://github.com/libvips/libvips # ffmpeg -hide_banner -demuxers | awk '/^ D /{print$2}' | while IFS= read -r x; do ffmpeg -hide_banner -h demuxer=$x; done | grep -E '^Demuxer |extensions:' diff --git a/copyparty/svchub.py b/copyparty/svchub.py index a6082ef8..1a84ad35 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -405,7 +405,11 @@ class SvcHub(object): if al.rsp_jtr: al.rsp_slp = 0.000001 - al.th_covers = set(al.th_covers.split(",")) + zsl = al.th_covers.split(",") + zsl = [x.strip() for x in zsl] + zsl = [x for x in zsl if x] + al.th_covers = set(zsl) + al.th_coversd = set(zsl + ["." + x for x in zsl]) for k in "c".split(" "): vl = getattr(al, k) diff --git a/copyparty/up2k.py b/copyparty/up2k.py index 414f8c1f..32e8685e 100644 --- a/copyparty/up2k.py +++ b/copyparty/up2k.py @@ -1165,8 +1165,12 @@ class Up2k(object): files.append((sz, lmod, iname)) liname = iname.lower() if sz and ( - iname in self.args.th_covers - or (not cv and liname.rsplit(".", 1)[-1] in CV_EXTS) + iname in self.args.th_coversd + or ( + not cv + and liname.rsplit(".", 1)[-1] in CV_EXTS + and not iname.startswith(".") + ) ): cv = iname @@ -3088,7 +3092,7 @@ class Up2k(object): with self.rescan_cond: self.rescan_cond.notify_all() - if rd and sz and fn.lower() in self.args.th_covers: + if rd and sz and fn.lower() in self.args.th_coversd: # wasteful; db_add will re-index actual covers # but that won't catch existing files crd, cdn = rd.rsplit("/", 1) if "/" in rd else ("", rd)