Compare commits

..

3 Commits

6 changed files with 21 additions and 10 deletions

View File

@@ -3,6 +3,16 @@
FlaskFarm용 범용 다운로드 매니저 플러그인입니다. FlaskFarm용 범용 다운로드 매니저 플러그인입니다.
여러 다운로더 플러그인(YouTube, Anime 등)의 다운로드 요청을 통합 관리하고 큐(Queue)를 제공합니다. 여러 다운로더 플러그인(YouTube, Anime 등)의 다운로드 요청을 통합 관리하고 큐(Queue)를 제공합니다.
## v0.2.24 변경사항 (2026-01-08)
- **Chrome 확장프로그램 추가**: YouTube에서 GDM으로 바로 다운로드 전송
- **Public API 추가**: `/public/youtube/formats`, `/public/youtube/add` (로그인 불필요)
- **진행률 표시 개선**: aria2c 다운로드 시 진행률 파싱 수정
- **카드 상태별 색상**: 완료(초록), 에러(빨강), 다운로드 중(파랑) 배경 구분
- **부분 DOM 업데이트**: 이미지 깜빡임 방지, 성능 최적화
- **소스 타입 수정**: ani24 → ohli24로 통일
- **FFmpeg HLS 안정성**: 비표준 m3u8 확장자(`.txt`) 지원 및 호환성 옵션 최적화
- **썸네일 버그 수정**: 외부 플러그인 위임 시 썸네일 누락 현상 수정
## v0.2.17 변경사항 (2026-01-08) ## v0.2.17 변경사항 (2026-01-08)
- **yt-dlp HTTP 헤더 지원**: `options.headers` 딕셔너리에서 `--add-header` 인자를 생성하여 Referer/User-Agent 등 커스텀 헤더를 yt-dlp에 전달합니다. - **yt-dlp HTTP 헤더 지원**: `options.headers` 딕셔너리에서 `--add-header` 인자를 생성하여 Referer/User-Agent 등 커스텀 헤더를 yt-dlp에 전달합니다.
- **Linkkf CDN 리다이렉트 해결**: Referer 헤더 없이 m3u8 URL 접근 시 Google Cloud로 리다이렉트되던 문제 수정. - **Linkkf CDN 리다이렉트 해결**: Referer 헤더 없이 m3u8 URL 접근 시 Google Cloud로 리다이렉트되던 문제 수정.

View File

@@ -12,7 +12,7 @@ def get_downloader(source_type: str) -> Optional[BaseDownloader]:
from .ytdlp_aria2 import YtdlpAria2Downloader from .ytdlp_aria2 import YtdlpAria2Downloader
return YtdlpAria2Downloader() return YtdlpAria2Downloader()
elif source_type in ('ani24', 'hls'): elif source_type in ('ohli24', 'ani24', 'hls'):
from .ffmpeg_hls import FfmpegHlsDownloader from .ffmpeg_hls import FfmpegHlsDownloader
return FfmpegHlsDownloader() return FfmpegHlsDownloader()

View File

@@ -80,13 +80,13 @@ class FfmpegHlsDownloader(BaseDownloader):
except Exception as ce: except Exception as ce:
logger.error(f"Failed to read cookies_file: {ce}") logger.error(f"Failed to read cookies_file: {ce}")
# 입력 전 설정 (Reconnection & HTTP persistence fix) # 입력 전 설정 (Reconnection & Allowed extensions for non-standard m3u8 like .txt)
cmd.extend([ cmd.extend([
'-allowed_extensions', 'ALL',
'-reconnect', '1', '-reconnect', '1',
'-reconnect_at_eof', '1', '-reconnect_at_eof', '1',
'-reconnect_streamed', '1', '-reconnect_streamed', '1',
'-reconnect_delay_max', '5', '-reconnect_delay_max', '5'
'-http_persistent', '0'
]) ])
# 입력 URL # 입력 URL
@@ -178,7 +178,8 @@ class FfmpegHlsDownloader(BaseDownloader):
def _get_duration(self, url: str, ffprobe_path: str, headers: Dict) -> float: def _get_duration(self, url: str, ffprobe_path: str, headers: Dict) -> float:
"""ffprobe로 영상 길이 획득""" """ffprobe로 영상 길이 획득"""
try: try:
cmd = [ffprobe_path, '-v', 'error', '-show_entries', 'format=duration', cmd = [ffprobe_path, '-v', 'error', '-allowed_extensions', 'ALL',
'-show_entries', 'format=duration',
'-of', 'default=noprint_wrappers=1:nokey=1'] '-of', 'default=noprint_wrappers=1:nokey=1']
if headers: if headers:

View File

@@ -1,6 +1,6 @@
title: "GDM" title: "GDM"
package_name: gommi_downloader_manager package_name: gommi_downloader_manager
version: '0.2.23' version: '0.2.26'
description: FlaskFarm 범용 다운로더 큐 - YouTube, 애니24, 링크애니, Anilife 지원 description: FlaskFarm 범용 다운로더 큐 - YouTube, 애니24, 링크애니, Anilife 지원
developer: projectdx developer: projectdx
home: https://gitea.yommi.duckdns.org/projectdx/gommi_downloader_manager home: https://gitea.yommi.duckdns.org/projectdx/gommi_downloader_manager

View File

@@ -394,14 +394,14 @@ class ModuleQueue(PluginModuleBase):
if caller_plugin: if caller_plugin:
cp_lower = caller_plugin.lower() cp_lower = caller_plugin.lower()
if 'anilife' in cp_lower: return 'anilife' if 'anilife' in cp_lower: return 'anilife'
if 'ohli24' in cp_lower or 'ani24' in cp_lower: return 'ani24' if 'ohli24' in cp_lower or 'ani24' in cp_lower: return 'ohli24'
if 'linkkf' in cp_lower: return 'linkkf' if 'linkkf' in cp_lower: return 'linkkf'
if 'youtube' in cp_lower: return 'youtube' if 'youtube' in cp_lower: return 'youtube'
# 2. 메타데이터 기반 판단 # 2. 메타데이터 기반 판단
if meta and meta.get('source'): if meta and meta.get('source'):
ms_lower = meta.get('source').lower() ms_lower = meta.get('source').lower()
if ms_lower in ['ani24', 'ohli24']: return 'ani24' if ms_lower in ['ani24', 'ohli24']: return 'ohli24'
if ms_lower == 'anilife': return 'anilife' if ms_lower == 'anilife': return 'anilife'
if ms_lower == 'linkkf': return 'linkkf' if ms_lower == 'linkkf': return 'linkkf'
@@ -409,7 +409,7 @@ class ModuleQueue(PluginModuleBase):
if 'youtube.com' in url_lower or 'youtu.be' in url_lower: if 'youtube.com' in url_lower or 'youtu.be' in url_lower:
return 'youtube' return 'youtube'
elif 'ani24' in url_lower or 'ohli24' in url_lower: elif 'ani24' in url_lower or 'ohli24' in url_lower:
return 'ani24' return 'ohli24'
elif 'linkkf' in url_lower: elif 'linkkf' in url_lower:
return 'linkkf' return 'linkkf'
elif 'anilife' in url_lower: elif 'anilife' in url_lower:

View File

@@ -924,7 +924,7 @@
// Source badge color based on type // Source badge color based on type
const sourceColors = { const sourceColors = {
'ani24': 'background: linear-gradient(135deg, #f59e0b, #d97706);', 'ohli24': 'background: linear-gradient(135deg, #f59e0b, #d97706);',
'ohli24': 'background: linear-gradient(135deg, #f59e0b, #d97706);', 'ohli24': 'background: linear-gradient(135deg, #f59e0b, #d97706);',
'anilife': 'background: linear-gradient(135deg, #ec4899, #be185d);', 'anilife': 'background: linear-gradient(135deg, #ec4899, #be185d);',
'youtube': 'background: linear-gradient(135deg, #ef4444, #b91c1c);', 'youtube': 'background: linear-gradient(135deg, #ef4444, #b91c1c);',