From 8f61e1568c4cc7337a843e18213f567e6a5bdc3b Mon Sep 17 00:00:00 2001 From: ed Date: Sat, 11 Feb 2023 11:17:37 +0000 Subject: [PATCH] transcode chiptunes to opus; * new audio/MPT formats: apac bonk dfpwm ilbc it itgz itr itz mo3 mod mptm mt2 okt s3gz s3m s3r s3z xm xmgz xmr xmz xpk * new image/PIL formats: blp dcx emf eps fits flc fli fpx im j2k j2p psd spi wmf --- copyparty/__main__.py | 14 +++++++------- copyparty/authsrv.py | 4 ++-- copyparty/mdns.py | 2 +- copyparty/mtag.py | 7 ++++--- copyparty/svchub.py | 6 ++++++ copyparty/up2k.py | 2 +- copyparty/util.py | 2 ++ copyparty/web/browser.js | 6 +++--- 8 files changed, 26 insertions(+), 17 deletions(-) diff --git a/copyparty/__main__.py b/copyparty/__main__.py index b3c793e6..63739f47 100755 --- a/copyparty/__main__.py +++ b/copyparty/__main__.py @@ -25,9 +25,9 @@ from textwrap import dedent from .__init__ import ANYWIN, CORES, PY2, VT100, WINDOWS, E, EnvParams, unicode from .__version__ import CODENAME, S_BUILD_DT, S_VERSION -from .authsrv import expand_config_file, re_vol, upgrade_cfg_fmt, split_cfg_ln -from .svchub import SvcHub +from .authsrv import expand_config_file, re_vol, split_cfg_ln, upgrade_cfg_fmt from .cfg import flagcats, onedash +from .svchub import SvcHub from .util import ( IMPLICATIONS, JINJA_VER, @@ -866,11 +866,11 @@ def add_thumbnail(ap): # 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:' - ap2.add_argument("--th-r-pil", metavar="T,T", type=u, default="bmp,dib,gif,icns,ico,jpg,jpeg,jp2,jpx,pcx,png,pbm,pgm,ppm,pnm,sgi,tga,tif,tiff,webp,xbm,dds,xpm,heif,heifs,heic,heics,avif,avifs", help="image formats to decode using pillow") - ap2.add_argument("--th-r-vips", metavar="T,T", type=u, default="jpg,jpeg,jp2,jpx,jxl,tif,tiff,png,webp,heic,avif,fit,fits,fts,exr,svg,hdr,ppm,pgm,pfm,gif,nii", help="image formats to decode using pyvips") - ap2.add_argument("--th-r-ffi", metavar="T,T", type=u, default="apng,avif,avifs,bmp,dds,dib,fit,fits,fts,gif,heic,heics,heif,heifs,icns,ico,jp2,jpeg,jpg,jpx,jxl,pbm,pcx,pfm,pgm,png,pnm,ppm,psd,sgi,tga,tif,tiff,webp,xbm,xpm", help="image formats to decode using ffmpeg") - ap2.add_argument("--th-r-ffv", metavar="T,T", type=u, default="av1,asf,avi,flv,m4v,mkv,mjpeg,mjpg,mpg,mpeg,mpg2,mpeg2,h264,avc,mts,h265,hevc,mov,3gp,mp4,ts,mpegts,nut,ogv,ogm,rm,vob,webm,wmv", help="video formats to decode using ffmpeg") - ap2.add_argument("--th-r-ffa", metavar="T,T", type=u, default="aac,m4a,ogg,opus,flac,alac,mp3,mp2,ac3,dts,wma,ra,wav,aif,aiff,au,alaw,ulaw,mulaw,amr,gsm,ape,tak,tta,wv,mpc", help="audio formats to decode using ffmpeg") + ap2.add_argument("--th-r-pil", metavar="T,T", type=u, default="avif,avifs,blp,bmp,dcx,dds,dib,emf,eps,fits,flc,fli,fpx,gif,heic,heics,heif,heifs,icns,ico,im,j2p,j2k,jp2,jpeg,jpg,jpx,pbm,pcx,pgm,png,pnm,ppm,psd,sgi,spi,tga,tif,tiff,webp,wmf,xbm,xpm", help="image formats to decode using pillow") + ap2.add_argument("--th-r-vips", metavar="T,T", type=u, default="avif,exr,fit,fits,fts,gif,hdr,heic,jp2,jpeg,jpg,jpx,jxl,nii,pfm,pgm,png,ppm,svg,tif,tiff,webp", help="image formats to decode using pyvips") + ap2.add_argument("--th-r-ffi", metavar="T,T", type=u, default="apng,avif,avifs,bmp,dds,dib,fit,fits,fts,gif,hdr,heic,heics,heif,heifs,icns,ico,jp2,jpeg,jpg,jpx,jxl,pbm,pcx,pfm,pgm,png,pnm,ppm,psd,sgi,tga,tif,tiff,webp,xbm,xpm", help="image formats to decode using ffmpeg") + ap2.add_argument("--th-r-ffv", metavar="T,T", type=u, default="3gp,asf,av1,avc,avi,flv,h264,h265,hevc,m4v,mjpeg,mjpg,mkv,mov,mp4,mpeg,mpeg2,mpegts,mpg,mpg2,mts,nut,ogm,ogv,rm,ts,vob,webm,wmv", help="video formats to decode using ffmpeg") + ap2.add_argument("--th-r-ffa", metavar="T,T", type=u, default="aac,ac3,aif,aiff,alac,alaw,amr,apac,ape,au,bonk,dfpwm,dts,flac,gsm,ilbc,it,itgz,itr,itz,m4a,mo3,mod,mp2,mp3,mpc,mptm,mt2,mulaw,ogg,okt,opus,ra,s3gz,s3m,s3r,s3z,tak,tta,ulaw,wav,wma,wv,xm,xmgz,xmr,xmz,xpk", help="audio formats to decode using ffmpeg") def add_transcoding(ap): diff --git a/copyparty/authsrv.py b/copyparty/authsrv.py index 0e78cf5e..830a9490 100644 --- a/copyparty/authsrv.py +++ b/copyparty/authsrv.py @@ -14,7 +14,7 @@ from datetime import datetime from .__init__ import ANYWIN, TYPE_CHECKING, WINDOWS from .bos import bos -from .cfg import vf_bmap, vf_vmap, vf_cmap, flagdescs, permdescs +from .cfg import flagdescs, permdescs, vf_bmap, vf_cmap, vf_vmap from .util import ( IMPLICATIONS, META_NOBOTS, @@ -37,7 +37,7 @@ if True: # pylint: disable=using-constant-test from typing import Any, Generator, Optional, Union - from .util import RootLogger, NamedLogger + from .util import NamedLogger, RootLogger if TYPE_CHECKING: pass diff --git a/copyparty/mdns.py b/copyparty/mdns.py index 928d5fd9..ba2bfc98 100644 --- a/copyparty/mdns.py +++ b/copyparty/mdns.py @@ -11,6 +11,7 @@ from ipaddress import IPv4Network, IPv6Network from .__init__ import TYPE_CHECKING from .__init__ import unicode as U from .multicast import MC_Sck, MCast +from .stolen.dnslib import AAAA from .stolen.dnslib import CLASS as DC from .stolen.dnslib import ( NSEC, @@ -20,7 +21,6 @@ from .stolen.dnslib import ( SRV, TXT, A, - AAAA, DNSHeader, DNSQuestion, DNSRecord, diff --git a/copyparty/mtag.py b/copyparty/mtag.py index 9f48c3c6..7f4a5d1b 100644 --- a/copyparty/mtag.py +++ b/copyparty/mtag.py @@ -11,14 +11,15 @@ import sys from .__init__ import PY2, WINDOWS, E, unicode from .bos import bos from .util import ( + FFMPEG_URL, REKOBO_LKEY, - sfsenc, fsenc, is_exe, min_ex, pybin, retchk, runcmd, + sfsenc, uncyg, ) @@ -296,8 +297,8 @@ class MTag(object): if not self.usable: if is_exe: - t = "need ffmpeg to read media tags; copyparty.exe cannot use mutagen" - self.log(t) + t = "copyparty.exe cannot use mutagen; need ffprobe.exe to read media tags: " + self.log(t + FFMPEG_URL) return msg = "need Mutagen{} to read media tags so please run this:\n{}{} -m pip install --user mutagen\n" diff --git a/copyparty/svchub.py b/copyparty/svchub.py index e6d27802..e986ad2e 100644 --- a/copyparty/svchub.py +++ b/copyparty/svchub.py @@ -35,6 +35,7 @@ from .tcpsrv import TcpSrv from .th_srv import HAVE_PIL, HAVE_VIPS, HAVE_WEBP, ThumbSrv from .up2k import Up2k from .util import ( + FFMPEG_URL, VERSIONS, Daemon, Garda, @@ -42,6 +43,7 @@ from .util import ( HMaccas, alltrace, ansi_re, + is_exe, min_ex, mp, pybin, @@ -208,6 +210,10 @@ class SvcHub(object): else: msg = "need either Pillow, pyvips, or FFmpeg to create thumbnails; for example:\n{0}{1} -m pip install --user Pillow\n{0}{1} -m pip install --user pyvips\n{0}apt install ffmpeg" msg = msg.format(" " * 37, os.path.basename(pybin)) + if is_exe: + msg = "copyparty.exe cannot use Pillow or pyvips; need ffprobe.exe and ffmpeg.exe to create thumbnails: " + msg += FFMPEG_URL + self.log("thumb", msg, c=3) if not args.no_acode and args.no_thumb: diff --git a/copyparty/up2k.py b/copyparty/up2k.py index 38e74c38..7ce5f750 100644 --- a/copyparty/up2k.py +++ b/copyparty/up2k.py @@ -37,7 +37,6 @@ from .util import ( atomic_move, db_ex_chk, djoin, - sfsenc, fsenc, gen_filekey, gen_filekey_dbg, @@ -53,6 +52,7 @@ from .util import ( s3dec, s3enc, sanitize_fn, + sfsenc, spack, statdir, vjoin, diff --git a/copyparty/util.py b/copyparty/util.py index 7162a6d3..30cc823a 100644 --- a/copyparty/util.py +++ b/copyparty/util.py @@ -144,6 +144,8 @@ SYMTIME = sys.version_info > (3, 6) and os.utime in os.supports_follow_symlinks META_NOBOTS = '' +FFMPEG_URL = "https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z" + HTTPCODE = { 200: "OK", 201: "Created", diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index 2281cd24..fe8a6f14 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -1479,9 +1479,9 @@ try { catch (ex) { } -var re_au_native = can_ogg ? /\.(opus|ogg|m4a|aac|mp3|wav|flac)$/i : - have_acode ? /\.(opus|m4a|aac|mp3|wav|flac)$/i : /\.(m4a|aac|mp3|wav|flac)$/i, - re_au_all = /\.(aac|m4a|ogg|opus|flac|alac|mp3|mp2|ac3|dts|wma|ra|wav|aif|aiff|au|alaw|ulaw|mulaw|amr|gsm|ape|tak|tta|wv|mpc)$/i; +var re_au_native = can_ogg ? /\.(aac|flac|m4a|mp3|ogg|opus|wav)$/i : + have_acode ? /\.(aac|flac|m4a|mp3|opus|wav)$/i : /\.(aac|flac|m4a|mp3|wav)$/i, + re_au_all = /\.(aac|ac3|aif|aiff|alac|alaw|amr|ape|au|dfpwm|dts|flac|gsm|it|itgz|itr|itz|m4a|mo3|mod|mp2|mp3|mpc|mptm|mt2|mulaw|ogg|okt|opus|ra|s3gz|s3m|s3r|s3z|tak|tta|ulaw|wav|wma|wv|xm|xmgz|xmr|xmz|xpk)$/i; // extract songs + add play column