From 4a85bdfaf6354db6b30869b9b8ca86f685a58872 Mon Sep 17 00:00:00 2001 From: tigerenwork Date: Wed, 12 Aug 2026 00:45:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BC=A9=E7=95=A5=E5=9B=BE=E4=BC=98?= =?UTF-8?q?=E5=85=88=E4=BB=8E=E6=9C=AC=E5=9C=B0=E8=A7=86=E9=A2=91=E6=8A=BD?= =?UTF-8?q?=E5=B8=A7=E7=94=9F=E6=88=90,=E8=BF=9C=E7=A8=8B=E5=9B=BE?= =?UTF-8?q?=E4=B8=BA=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DEPLOY.md | 4 +- app/main.py | 97 ++++++++++++++---- app/ytdl.py | 25 +++++ ...6faa8ca099061048598101fa6cf0ab9f5fcf76.img | Bin 0 -> 14433 bytes ...e1b77b813229c0d3a79901489ead901d0967e2.img | Bin 0 -> 16957 bytes ...6f1bf0daecf070b66568cd0ece19ad033cd5ec.img | Bin 0 -> 10269 bytes ui/src/app/download-card.component.html | 5 +- ui/src/app/download-row.component.html | 4 +- 8 files changed, 109 insertions(+), 26 deletions(-) create mode 100644 metube-config/thumbnails/ae6faa8ca099061048598101fa6cf0ab9f5fcf76.img create mode 100644 metube-config/thumbnails/c5e1b77b813229c0d3a79901489ead901d0967e2.img create mode 100644 metube-config/thumbnails/f36f1bf0daecf070b66568cd0ece19ad033cd5ec.img diff --git a/DEPLOY.md b/DEPLOY.md index c001eb7..0596e7b 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -27,8 +27,8 @@ default, e.g. via QEMU emulation). ```sh docker buildx build --platform linux/amd64 \ - --build-arg VERSION=1.16 \ - -t 192.168.2.212:3000/tigeren/metube:1.16 \ + --build-arg VERSION=1.17 \ + -t 192.168.2.212:3000/tigeren/metube:1.17 \ --push . ``` diff --git a/app/main.py b/app/main.py index 46ba8f8..ae33ea0 100644 --- a/app/main.py +++ b/app/main.py @@ -357,39 +357,100 @@ def sniff_image_type(data: bytes) -> str: return 'application/octet-stream' +def _placeholder_thumb_response(): + return web.Response(text=PLACEHOLDER_THUMB, content_type='image/svg+xml', headers={'Cache-Control': 'public, max-age=3600'}) + + +async def _probe_duration(video_path): + """Duration of a local media file in seconds via ffprobe, or None.""" + cmd = ['ffprobe', '-v', 'error', '-show_entries', 'format=duration', + '-of', 'csv=p=0', video_path] + try: + proc = await asyncio.create_subprocess_exec( + *cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.DEVNULL) + out, _ = await asyncio.wait_for(proc.communicate(), timeout=15) + return float(out.decode().strip()) + except Exception: # noqa: BLE001 - probing is best-effort + return None + + +async def _extract_video_frame(video_path, thumb_path, duration): + """Extract a frame from a local video file with ffmpeg. Returns True on success.""" + if not duration: + duration = await _probe_duration(video_path) + seek = 1.0 + if duration: + try: + duration = float(duration) + seek = max(0.0, min(duration * 0.25, duration - 1.0)) + except (TypeError, ValueError): + pass + cmd = ['ffmpeg', '-hide_banner', '-loglevel', 'error', + '-ss', str(seek), '-i', video_path, + '-frames:v', '1', '-vf', 'scale=480:-2', '-q:v', '4', + # thumb_path has a generic .img extension: force the JPEG encoder and + # image2 muxer explicitly (ffmpeg would otherwise guess from the name) + '-c:v', 'mjpeg', '-f', 'image2', + '-y', thumb_path] + try: + proc = await asyncio.create_subprocess_exec( + *cmd, stdout=asyncio.subprocess.DEVNULL, stderr=asyncio.subprocess.PIPE) + _, err = await asyncio.wait_for(proc.communicate(), timeout=30) + except Exception as exc: # noqa: BLE001 - includes TimeoutError; fall through to other sources + log.warning(f"ffmpeg frame extraction failed for {video_path}: {exc}") + try: + proc.kill() + except Exception: # noqa: BLE001 - process may not exist + pass + return False + if proc.returncode != 0: + log.warning(f"ffmpeg frame extraction failed for {video_path}: {err.decode(errors='replace')[-200:]}") + return False + return os.path.exists(thumb_path) + + @routes.get(config.URL_PREFIX + 'thumbnail') async def thumbnail(request): - """Serve a cached copy of a download's remote thumbnail. + """Serve a cached thumbnail for a download. - The URL is taken from stored yt-dlp metadata for the given download key — - clients can never point this endpoint at arbitrary URLs. Missing/invalid - thumbnails fall back to a placeholder SVG. + Sources, in order: a frame extracted from the local file (ffmpeg), the + remote thumbnail URL from stored yt-dlp metadata — clients can never point + this endpoint at arbitrary URLs — and finally a placeholder SVG. """ key = request.query.get('id') if not key: raise web.HTTPBadRequest() info = dqueue.find_info(key) - if info is None or not info.thumbnail: - return web.Response(text=PLACEHOLDER_THUMB, content_type='image/svg+xml', headers={'Cache-Control': 'public, max-age=3600'}) + thumb_url = getattr(info, 'thumbnail', None) if info is not None else None + log.debug(f"[Thumb] key={key[:60]} found={info is not None} has_url={bool(thumb_url)}") thumb_dir = os.path.join(config.STATE_DIR, 'thumbnails') os.makedirs(thumb_dir, exist_ok=True) thumb_path = os.path.join(thumb_dir, hashlib.sha1(key.encode('utf-8')).hexdigest() + '.img') if not os.path.exists(thumb_path): - try: - timeout = aiohttp.ClientTimeout(total=15) - async with aiohttp.ClientSession(timeout=timeout) as session: - async with session.get(info.thumbnail, headers={'User-Agent': 'Mozilla/5.0 MeTube'}) as resp: - if resp.status != 200: - return web.Response(text=PLACEHOLDER_THUMB, content_type='image/svg+xml', headers={'Cache-Control': 'public, max-age=3600'}) - data = await resp.read() - with open(thumb_path, 'wb') as f: - f.write(data) - except Exception as exc: # noqa: BLE001 - fall back to placeholder on any fetch error - log.warning(f"Failed to fetch thumbnail for {key}: {exc}") - return web.Response(text=PLACEHOLDER_THUMB, content_type='image/svg+xml', headers={'Cache-Control': 'public, max-age=3600'}) + # Prefer a frame from the local file: works even for downloads whose + # metadata predates thumbnail storage, and survives expiring remote URLs + local_file = dqueue.find_download_file(key) + log.debug(f"[Thumb] local_file={local_file}") + if local_file: + await _extract_video_frame(local_file, thumb_path, getattr(info, 'duration', None)) + + if not os.path.exists(thumb_path) and thumb_url: + try: + timeout = aiohttp.ClientTimeout(total=15) + async with aiohttp.ClientSession(timeout=timeout) as session: + async with session.get(thumb_url, headers={'User-Agent': 'Mozilla/5.0 MeTube'}) as resp: + if resp.status == 200: + data = await resp.read() + with open(thumb_path, 'wb') as f: + f.write(data) + except Exception as exc: # noqa: BLE001 - fall back to placeholder on any fetch error + log.warning(f"Failed to fetch thumbnail for {key}: {exc}") + + if not os.path.exists(thumb_path): + return _placeholder_thumb_response() with open(thumb_path, 'rb') as f: data = f.read() diff --git a/app/ytdl.py b/app/ytdl.py index b5060cc..efdd5d6 100644 --- a/app/ytdl.py +++ b/app/ytdl.py @@ -326,6 +326,11 @@ class PersistentQueue: # Ensure file_exists field exists if not hasattr(v, 'file_exists'): v.file_exists = None + # Ensure thumbnail/duration fields exist (added for the thumbnail UI) + if not hasattr(v, 'thumbnail'): + v.thumbnail = None + if not hasattr(v, 'duration'): + v.duration = None self.dict[k] = Download(None, None, None, None, None, None, {}, v) def exists(self, key): @@ -396,6 +401,20 @@ class DownloadQueue: return v return None + def find_download_file(self, key): + """Absolute path of the downloaded file for key, if it exists on disk.""" + info = self.find_info(key) + if info is None: + return None + filename = getattr(info, 'filename', None) + if not filename: + return None + dldirectory, error = self.__calc_download_path(info.quality, info.format, getattr(info, 'folder', None)) + if error is not None or not dldirectory: + return None + path = os.path.join(dldirectory, filename) + return path if os.path.exists(path) else None + async def __import_queue(self): for k, v in self.queue.saved_items(): await self.__add_download(v, True) @@ -475,6 +494,12 @@ class DownloadQueue: if full_entry and 'title' in full_entry: title = full_entry['title'] log.debug(f"[PreCheck] Got real title from full extraction: '{title}'") + # Backfill thumbnail/duration for flat playlist entries + if not getattr(dl, 'thumbnail', None): + thumbnails = full_entry.get('thumbnails') or [] + dl.thumbnail = full_entry.get('thumbnail') or (thumbnails[-1].get('url') if thumbnails else None) + if not getattr(dl, 'duration', None): + dl.duration = full_entry.get('duration') except Exception as e: log.warning(f"[PreCheck] Failed to get full info: {e}, using placeholder title") diff --git a/metube-config/thumbnails/ae6faa8ca099061048598101fa6cf0ab9f5fcf76.img b/metube-config/thumbnails/ae6faa8ca099061048598101fa6cf0ab9f5fcf76.img new file mode 100644 index 0000000000000000000000000000000000000000..e28ba26856d5c0b8ebdb9a833da5c0b938039803 GIT binary patch literal 14433 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 literal 0 HcmV?d00001 diff --git a/metube-config/thumbnails/f36f1bf0daecf070b66568cd0ece19ad033cd5ec.img b/metube-config/thumbnails/f36f1bf0daecf070b66568cd0ece19ad033cd5ec.img new file mode 100644 index 0000000000000000000000000000000000000000..c3d1c7c2c796962feb7bcb96ae2e62cbef304ed6 GIT binary patch literal 10269 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
- - - - + {{ row.value.duration | duration }} diff --git a/ui/src/app/download-row.component.html b/ui/src/app/download-row.component.html index c97d652..a8cfefa 100644 --- a/ui/src/app/download-row.component.html +++ b/ui/src/app/download-row.component.html @@ -1,8 +1,8 @@
- - + + {{ row.value.duration | duration }}