27 KiB
27 KiB
Anime Downloader for FlaskFarm
Anime Downloader는 FlaskFarm 플랫폼에서 동작하는 애니메이션 자동 다운로드 플러그인입니다. 국내 주요 스트리밍 사이트(Ohli24, Linkkf, Anilife)를 지원하며, 강력한 보안 우회 기능을 탑재하여 안정적인 다운로드를 보장합니다.
🚀 주요 기능 (Key Features)
- 다중 사이트 지원: Ohli24, Anilife, Linkkf 등 다양한 소스에서 영상 검색 및 다운로드.
- 자막 최적화:
- 자막 전용 다운로드 (Linkkf): 영상 없이 자막(VTT)만 별도로 추출하여 SRT로 변환 후 다운로드할 수 있습니다.
- 자막 합침 (Muxing): 다운로드된 외부 자막(SRT)을 MP4 컨테이너에 자동으로 삽입하여 범용성을 높입니다.
- 강력한 우회 기술 (Anti-Bot Bypass):
- TLS Fingerprint 변조:
curl_cffi를 사용하여 실제 Chrome 브라우저처럼 위장, Cloudflare 및 각종 봇 차단을 무력화합니다. - CDN 자동 감지: 스트리밍 서버(CDN)의 도메인이 수시로 변경되더라도 자동으로 감지하여 대응합니다. (예: 14B 가짜 파일 문제 해결)
- TLS Fingerprint 변조:
- 스마트 다운로드 큐:
ffmpeg및yt-dlp기반의 큐 시스템으로 안정적인 이어받기 및 재시도를 지원합니다. - 사용자 편의성 및 보안:
- 보안 스트리밍 (Secure Streaming): 외부 플레이어(MXPlayer, VLC 등) 연동 시 API 키를 노출하지 않고 **임시 스트리밍 토큰(5분 만료)**을 발급하여 안전한 시청 환경을 제공합니다.
- 범용 플레이어 연동: IINA, PotPlayer, VLC, nPlayer, Infuse, MX Player 등 8종 이상의 외부 플레이어와 정교한 URL Scheme/Intent 연동을 지원합니다.
- Proxy 설정: IP 차단 시 손쉽게 우회할 수 있도록 웹 설정 UI에서 프록시 서버를 지정할 수 있습니다.
- 모듈형 테마 시스템: CSS 변수와 동적 로딩을 활용하여 데스크탑/모바일 모두에 최적화된 사이트별 테마를 제공합니다.
- 실시간 피드백: 다운로드 상태, 중복 파일 감지 등을 실시간 알림으로 제공합니다.
📺 지원 사이트 (Supported Sites)
1. Ohli24 (애니24)
- 특징: 강력한 인프라와 다양한 라이브러리.
- 기술:
Zendriver(Daemon모드) 및Camoufox를 이용한 브라우저 에뮬레이션 우회. - 기능: 검색, 목록 조회, 자동 다운로드, 임시 토큰 기반 보안 스트리밍.
2. Linkkf (링크애니)
- 특징: 빠른 업데이트 속도.
- 기능: 검색 및 다운로드.
3. Anilife (애니라이프)
- 특징: 다양한 화질 제공.
- 기술: Playwright 등을 활용한 브라우저 에뮬레이션(필요 시).
🛠 설치 및 문제 해결 (Troubleshooting)
필수 요구 사항
- Python 패키지 (Dependencies):
curl_cffi: TLS Fingerprint 변조를 통한 Cloudflare 및 보안 사이트 우회용.Zendriver: 가벼운 브라우저 데몬 모드를 통한 고속 크롤링 지원.Camoufox: 강력한 안티봇 탐지 우회를 위한 고보안 브라우저 에뮬레이터.yt-dlp: 스트리밍 영상(HLS/DASH) 다운로드 핵심 엔진.- 기타:
requests,lxml,beautifulsoup4,flask-login등.
- 시스템 도구 (System Tools):
- ffmpeg: 영상/음성 병합 및 자막 합침 기능을 위한 필수 도구 (시스템 PATH 등록 필요).
- Browser (Chrome/Chromium): Zendriver 및 Camoufox 구동을 위한 브라우저 환경 필요.
자주 묻는 질문 (FAQ)
Q1. 설정 페이지 접근 시 404 오류가 뜹니다.
- 원인: 플러그인 초기화 파일(
plugin.py)이 누락되었기 때문입니다. - 해결:
plugin.py파일이 존재하는지 확인하고, 없다면 복구 후 서버를 재시작하세요.
Q2. 검색 시 결과가 없거나 "Document is empty" 오류가 발생합니다.
- 원인: 사이트의 보안 정책에 의해 접속이 차단된 경우입니다.
- 해결:
- 최신 버전으로 업데이트하세요. (
curl_cffi적용 버전) - 설정 페이지에서 Proxy URL을 비워두거나, 작동하는 유효한 프록시 IP를 입력하세요.
- 최신 버전으로 업데이트하세요. (
Q3. 다운로드된 파일 용량이 매우 작습니다 (14 Byte 등).
- 원인: CDN 서버에서 봇 접근을 감지하고 가짜 파일을 보낸 것입니다.
- 해결: 플러그인 자체적으로 이를 감지하고 우회하는 패치가 적용되었습니다. 최신 버전 사용 시 자동으로 해결됩니다.
⚙️ 설정 가이드
- FlaskFarm 웹 > 플러그인 > Anime Downloader > 설정으로 이동합니다.
- Proxy URL: 필요한 경우
http://IP:PORT형식으로 입력 (기본값: 공란). - 저장 경로: 다운로드된 파일이 저장될 경로 설정.
- 다운로드 방법:
yt-dlp(기본) 추천.
📝 변경 이력 (Changelog)
v0.7.7 (2026-01-19)
- Linkkf 추출 핵심 보강 및 Anilife 고속화:
- 전용 헤더 처리: Linkkf 스트리밍 영상(m3u8) 추출 시 Referer 헤더가 유실되던 문제를 CDP 타입 래핑(
zd.cdp.network.Headers())으로 완벽 해결. - Anilife 퍼포먼스: 애니라이프 영상 추출 시 불필요한 대기 시간을 제거하고 네비게이션 전략을 최적화하여 추출 속도를 개선했습니다.
- GDM 연동 안정성: yt-dlp 호출 시
--add-header옵션을 통해 모든 보안 파라미터를 정확히 전달하도록 보강했습니다.
- 전용 헤더 처리: Linkkf 스트리밍 영상(m3u8) 추출 시 Referer 헤더가 유실되던 문제를 CDP 타입 래핑(
v0.7.6 (2026-01-12)
- 모바일 상단 메뉴 스크롤 힌트 도입:
- 메뉴가 가로로 길어질 때 우측에 은은한 페이드 효과를 추가하여 '더 많은 메뉴'가 있음을 직관적으로 알 수 있도록 개선했습니다.
- 아주 가늘고 투명한 스크롤바 가이드를 추가하여 모던한 감성을 더했습니다.
- CSS 구문 최적화 및 미디어 쿼리 중복을 정리했습니다.
v0.7.5 (2026-01-12)
- 모바일 레이아웃 가로 핏 완벽 최적화:
- 화면이 70%만 보이고 오른쪽으로 밀리던 현상을 해결하기 위해 전역적인 너비 정규화(
width: 100%)와 오버플로우 차단을 적용했습니다. - 모바일 브라우저 렌더링 오류를 유발하는
background-attachment: fixed속성을 모바일 한정으로 해제했습니다. - 모든 요소에
box-sizing: border-box를 강제하여 패딩으로 인한 너비 확장을 방지했습니다. - 에피소드 그리드를 모바일 1열 배치로 최적화하여 오버플로우를 원천 차단했습니다.
- 화면이 70%만 보이고 오른쪽으로 밀리던 현상을 해결하기 위해 전역적인 너비 정규화(
v0.7.4 (2026-01-12)
- 모바일 레이아웃 시프트 최종 수정:
- 부트스트랩
row의 음수 마진으로 인해 화면이 오른쪽으로 밀려 보이던 현상을 정규화 작업을 통해 해결했습니다. html,body레벨에서 가로 오버플로우를 차단하고 전역적인 단위 대응(100vw)을 적용하여 안정적인 가로 핏을 구현했습니다.- 상단 메뉴(브레드크럼)가 부모 너비를 확장시키지 않도록
display속성을 개선했습니다.
- 부트스트랩
v0.7.3 (2026-01-12)
- Anilife 모바일 UI 최적화 (프리미엄 개편):
- 분석 페이지: 가로 여백을 최소화(15px -> 2px)하여 모바일 가독성 증대.
- 큐 페이지: 기존 테이블 레이아웃을 모바일 전용 카드형 레이아웃으로 전면 교체. 파일명과 진행률 바를 강조하고 2단 정보 그리드를 도입하여 가시성 확보.
- 오버플로우 수정: 상단 메뉴(브레드크럼) 가로 스크롤 적용 및 액션 버튼 자동 줄바꿈 배치를 통해 화면 넘침 해결.
- Linkkf 안정화 및 자막 연동:
- 자막 자동화: GDM(v0.2.30+) 연동을 통해 비디오와 자막을 동시에 안전하게 다운로드.
- 경로 정규화: 저장 경로 내 중복 구분자(
//./) 발생 문제를 원천 해결. - 추출 성능: 비디오 URL 추출 시 타임아웃 및 예외 처리를 강화하여 UI 프리징 방지.
v0.7.2 (2026-01-11)
- Linkkf 자막 전용 다운로드 지원:
- 에피소드 분석 페이지에 "자막만 다운로드" 버튼 추가. (VTT 추출 및 SRT 자동 변환)
- 백그라운드 스레드 처리를 통해 대량의 자막을 끊김 없이 다운로드 가능.
- Linkkf 목록-분석 연동 강화:
- 목록(
list) 페이지 카드에 "작품소개" 버튼 추가하여 원클릭 분석 지원. - URL 파라미터(
code)를 통한 자동 분석 로직 개선으로 연동 편의성 증대.
- 목록(
- 플러그인 핫 리로드 안정화:
- Linkkf, AniLife, Ohli24 모든 모듈의 DB 모델에
extend_existing: True옵션 적용. - 플러그인 자가 업데이트 시 DB 모델 제약으로 인한 리로드 실패 문제 해결.
- Linkkf, AniLife, Ohli24 모든 모듈의 DB 모델에
- UI/UX 보안:
- 분석 페이지의 AJAX 요청 결과 핸들링을 강화하여 사용자에게 정확한 성공/실패 알림 제공.
v0.7.1 (2026-01-11)
- GDM 통합 버그 수정 (Hotfix):
- UI 필드 매핑 수정: 큐 페이지에서 GDM 작업의 상태, 진행률 등이 'undefined'로 표시되던 필드명 불일치 문제 해결.
- 실시간 업데이트(Socket) 강화: GDM 전용 소켓 이벤트 리스너를 추가하여, 수동 새로고침 없이도 다운로드 상태가 실시간으로 반영되도록 개선.
- 모든 모듈 적용: Linkkf뿐만 아니라 AniLife, Ohli24 큐 페이지에도 동일한 수정 사항 반영.
v0.7.0 (2026-01-11)
- GDM(Gommi Downloader Manager) 통합 고도화:
- 통합 큐 페이지: 링크애니, 애니라이프, 오클리24의 큐 페이지에서 GDM 작업을 실시간으로 확인 및 중지/삭제 가능하도록 통합.
- 상태 자동 동기화: GDM 다운로드 완료 시 콜백을 통해 로컬 DB 상태를 자동으로 '컴플리트'로 업데이트하여 목록 페이지(
list)에 즉시 반영. - GDM 작업 매핑: GDM의 다양한 상태 코드 및 진행률을 각 플러그인 UI 형식에 맞게 변환 처리.
- 안정성 강화:
- 백그라운드 DB 안정화: 스케줄러 및 비동기 작업 중 데이터베이스 접근 시
app_context오류 방지를 위해 전역적인 컨텍스트 래핑 적용. - 자동 다운로드 로직 개선: 링크애니 '전체(all)' 모드 모니터링 및 자동 에피소드 등록 로직 보강.
- 백그라운드 DB 안정화: 스케줄러 및 비동기 작업 중 데이터베이스 접근 시
- 알림 시스템: 링크애니 새 에피소드 감지 시 Discord/Telegram 알림 기능 및 설정 UI 추가.
v0.6.25 (2026-01-09)
- 자가 업데이트 기능 추가: 모든 설정 페이지 (Ohli24, Anilife, Linkkf)에서 "업데이트" 버튼 클릭으로 Git Pull 및 플러그인 핫 리로드 지원
- 버전 체크 API: GitHub에서 최신 버전 정보를 가져와 업데이트 알림 표시 (1시간 캐싱)
- 공통 베이스 통합:
AnimeModuleBase에get_update_info,reload_plugin메서드 추가로 모든 모듈에서 자동 사용 가능
v0.6.24 (2026-01-08)
- Ohli24 GDM 연동 버그 수정:
- 썸네일 누락 해결: GDM 위임 시
image키를thumbnail로 올바르게 매핑하여 목록에서 이미지가 보이도록 수정. - 소스 타입 통일: GDM 측 명칭 변경에 맞춰
ani24대신ohli24를 기본값으로 사용 (하위 호환 유지). - 검색 결과 썸네일: 일부 환경에서 썸네일 URL이 누락되던 필드 보강.
- 썸네일 누락 해결: GDM 위임 시
v0.6.23 (2026-01-08)
- Linkkf 다운로드 완전 복구:
- Zendriver Daemon CDP 헤더 버그 수정:
zd.cdp.network.Headers()타입 래핑 누락으로 Referer 헤더가 적용되지 않던 문제 해결. - HTML 엔티티 디코딩 개선: iframe URL의
&등 HTML 엔티티를html.unescape()로 올바르게 디코딩. - GDM yt-dlp 헤더 전달:
--add-header옵션으로 Referer/User-Agent를 yt-dlp에 전달하여 CDN 리다이렉트 방지.
- Zendriver Daemon CDP 헤더 버그 수정:
- 부수 효과: Ohli24 등 모든 브라우저 기반 추출에서 동일한 헤더 적용 개선.
v0.6.22 (2026-01-08)
- Linkkf 추출 로직 강화: Cloudflare 보호가 강화된 Linkkf 도메인(flexora.xyz 등)에 대응하기 위해 브라우저 기반(Zendriver/Camoufox) 추출 엔진을 도입했습니다.
- 오추출 방지: 광고나 서비스 차단 페이지(Google Cloud 등)의 iframe을 비디오 URL로 오인하는 문제를 수정했습니다.
v0.6.21 (2026-01-07)
- Linkkf GDM 연동 수정:
- GDM 위임 전 실제 스트림 URL(m3u8) 추출 로직을 강제 호출하여 "Invalid data" 오류 해결.
- Linkkf 설정의 다운로드 방식 및 쓰레드 수를 GDM에 전달하도록 개선.
- 추출된 Referer 헤더 및 자막 정보를 GDM에 누락 없이 전달.
v0.6.20 (2026-01-07)
- GDM 연동 고도화 및 버그 수정:
- App Context 오류 해결: 백그라운드 쓰레드(일괄 추가, Camoufox 설치, 자막 합침)에서 발생하던
RuntimeError: Working outside of application context수정. - 다운로드 설정 연동: Ohli24 설정의 다운로드 방식(aria2c/ytdlp) 및 쓰레드 수를 GDM에 그대로 전달하여 멀티쓰레드 다운로드 지원.
- App Context 오류 해결: 백그라운드 쓰레드(일괄 추가, Camoufox 설치, 자막 합침)에서 발생하던
- 안정성 개선:
- GDM 위임 시 파일명/제목/썸네일 등 메타데이터 가공 로직 보강.
v0.6.15 (2026-01-07)
- Zendriver Daemon 비동기 네비게이션 최적화:
browser.get(url)대기 시간으로 인한 17초 지연 해결- 네비게이션 전 리소스 블로킹 설정 (about:blank에서 미리 차단)
asyncio.create_task()를 활용한 비동기 네비게이션 + 병렬 DOM 폴링- 리스트/에피소드 페이지 마커 발견 즉시 조기 반환 → 예상 속도 1~3초
v0.6.14 (2026-01-07)
- Ohli24 Docker 성능 고속화:
- Zendriver Daemon에 리눅스/도커 전용 최적화 플래그 추가 (
--no-zygote,--disable-dev-shm-usage,--disable-features=IsolateOrigins,site-per-process등) - 정밀 성능 메트릭 도입 (
/tmp/zendriver_daemon.log에서 Init/Nav/Block/Poll 단계별 시간 측정 가능) - 목록 페이지 페칭 시 Zendriver Daemon(Layer 3A)을 최우선 순위로 격상 (기존 17초 → 1초 내외 단축 기대)
LogicOhli24.get_base_url()및 각 모듈에서 URL 끝 슬래시 제거(rstrip) 처리를 강화하여 불필요한 리다이렉트 방지
- Zendriver Daemon에 리눅스/도커 전용 최적화 플래그 추가 (
- Zendriver Daemon 안정성:
- 리눅스 환경의
/dev/shm여유 공간 체크 로직 추가 - 변수 참조 오류(
NameError,elapsed->total_elapsed) 수정 및 에러 핸들링 보강
- 리눅스 환경의
v0.6.13 (2026-01-07)
- 초기화 순서 오류 수정:
P.logger접근 전P인스턴스 생성이 완료되도록curl_cffi자동 설치 루틴 위치 조정 (NameError: name 'P' is not defined해결)
v0.6.11 (2026-01-07)
- Docker 환경 최적화:
curl_cffi라이브러리 부재 시 자동 설치(pip install) 루틴 추가- URL 추출 실패 시 GDM 위임 중단 및 에러 처리 강화
- Ohli24 GDM 연동 버그 수정:
LogicOhli24.add메서드의 인덴트 오류 및 문법 오류 해결- 다운로드 완료 시 Ohli24 DB 자동 업데이트 로직 안정화
__init__.py안정성 강화 (P.logic 지연 로딩 대응)
- Anilife GDM 연동:
ModuleQueue연동으로 Anilife 다운로드가 GDM (Gommi Downloader Manager)으로 통합- Ohli24와 동일한 패턴으로
source_type: "anilife"메타데이터 포함 - Go FFMPEG 버튼 → Go GDM 버튼으로 변경 및 GDM 큐 페이지로 링크
- 파일명 정리 개선:
Util.change_text_for_use_filename()함수에서 연속 점(..) → 단일 점(.) 변환- 끝에 오는 점/공백 자동 제거로 Synology NAS에서 Windows 8.3 단축 파일명 생성 방지
- Git 워크플로우 개선:
- GitHub + Gitea 양방향 동시 푸시 설정 (GitHub 우선)
v0.5.3 (2026-01-04)
- 보안 스트리밍 토큰 시스템 도입:
- 외부 플레이어 연동 시 API 키 노출 방지를 위한 임시 토큰(TTL 5분) 발급 로직 구현
- 인증 없이 접근 가능한
/normal/라우트를 통한 보안 스트리밍 엔드포인트 추가
- 외부 플레이어 연동 고도화:
- VLC Android 지원:
vlc://대신 Android Intent 형식을 적용하여 재생 오류 해결 - MXPlayer 최적화: MIME 타입 명시 및 한글 파일명 URL 인코딩 안정화 (RFC 5987 대응)
- VLC Android 지원:
- 모바일 UI/UX 미세 조정:
- 외부 플레이어 아이콘 오버플로우 수정 (모바일에서 두 줄로 자동 줄바꿈)
- 비디오 플레이어 모달 내 영상 세로 중앙 정렬 보강
- 다운로드 목록 페이지(
list)의 카드 여백 최적화 (p-4→p-3)
- 버그 수정:
Content-Disposition헤더의 한글 파일명 유니코드 오류 해결
v0.5.2 (2026-01-04)
- 재사용 가능한 비디오 모달 컴포넌트 도입:
templates/anime_downloader/components/video_modal.html- 공통 모달 HTMLstatic/js/video_modal.js- VideoModal JavaScript 모듈static/css/video_modal.css- 비디오 모달 전용 스타일시트
- Alist 스타일 UI 개선:
- 에피소드 드롭다운: 파란색 하이라이트 배경의 에피소드 선택기
- 자동 다음 토글 스위치: iOS 스타일 슬라이더 토글
- 외부 플레이어 버튼: IINA, PotPlayer, VLC, nPlayer, Infuse, OmniPlayer, MX Player, MPV 지원
- 코드 재사용성 향상:
- Ohli24 list 페이지에서 인라인 코드 ~145줄 → ~9줄로 축소
VideoModal.init()API로 간편 초기화 및openWithPlaylist()메서드 지원
v0.5.1 (2026-01-04)
- Ohli24 레이아웃 표준화:
- 모든 Ohli24 페이지(Setting, Search, Queue, List, Request)에 일관된 1400px max-width 및 중앙 정렬 적용
ohli24.css에 공통 wrapper(.ohli24-common-wrapper) 및 헤더 스타일 추가- List/Queue 페이지
visible클래스 누락 수정 (content-cloak 트리거 추가) - Request 페이지 에피소드 카드 순차 렌더링 문제 해결 (
requestAnimationFrame사용)
- Anilife 폴백 체인 개선:
get_html함수에 Zendriver subprocess 폴백 추가 (Daemon 실패 시 자동 전환)- Playwright 폴백을 Camoufox로 변경 (더 강력한 안티봇 우회)
- 3단계 폴백: Zendriver Daemon → Zendriver Subprocess → Camoufox
- Anilife 반응형 레이아웃:
- Request 페이지에
anilife-common-wrapper클래스 적용 - 모바일(
<992px): 100% 너비 / 데스크탑(≥992px): 1400px max-width
- Request 페이지에
- Linkkf CSS 준비:
linkkf.css에 공통 wrapper 스타일 추가 (향후 레이아웃 표준화 대비)
v0.5.0 (2026-01-03)
- Ohli24 비디오 플레이어 UI 전면 개편:
- 프리미엄 글래스모피즘 디자인: 플레이어 모달 및 플레이리스트 컨트롤에 투명 유리 테마 적용
- Video.js 8.10.0 업그레이드: 최신 엔진으로 안정성 및 재생 성능 최적화
- "Scale to Fill" (줌) 기능: 모바일 전체화면 시 검은 여백을 없애고 화면을 가득 채우는 기능 추가
- 중앙 재생 버튼 개선: 모바일에 최적화된 대형 중앙 재생 버튼 및 아이콘 정렬 수정
- Anilife / Ohli24 검색 엔진 고도화:
- Zendriver Daemon 최적화: 매 요청마다 브라우저를 띄우지 않고 백그라운드 프로세스 활용 (응답 속도 2~3초로 단축)
- 완결 카테고리 & 년도별 필터링: Ohli24 검색에 '완결' 버튼 추가 및 년도별(2020~2025) 상세 필터링 지원
- 모던 로딩 UI: 시각적으로 세련된 멀티 링 프리로더 및 글래스모피즘 AJAX 스피너 도입
- Python 3.14 및 최신 스택 지원:
- Flask 3.1.2, SQLAlchemy 2.0.45 등 최신 라이브러리 호환성 확보 및
AssertionError경고 제거
- Flask 3.1.2, SQLAlchemy 2.0.45 등 최신 라이브러리 호환성 확보 및
- 안정성 및 UX 강화:
- Enter 키 검색: 모든 분석/검색 페이지에서 Enter 키 지원
- Zendriver 자동 설치: 환경에 패키지가 없을 경우 실행 시 자동 설치
- 타입 힌트 리팩토링:
mod_ohli24.py,mod_anilife.py전반에 엄격한 타입 힌트 적용
v0.4.18 (2026-01-03)
- Ohli24 4단계 폴백 체인 구현:
curl_cffi→cloudscraper→Zendriver→Camoufox - 현재 전략: 가볍고 빠른
Zendriver와 풀 브라우저Camoufox조합으로 클라우드플레어 완전 우회
v0.4.17 (2026-01-02)
- Ohli24 디자인 고도화 (전반적 UI 개선):
- 썸네일 에피소드 배지: 이미지 좌측 상단에 글래스모피즘 스타일의 세련된 에피소드 번호 배지(앰버 컬러) 추가
- 액션 버튼 디자인: 목록 페이지 버튼("작품보기", "보기", "삭제" 등)을 미니멀한
.btn-minimal디자인으로 개편 - 모바일 UX 최적화: 모바일에서 "보기"(블루), "삭제"(레드) 버튼에 선명한 색상을 부여하여 가독성 및 조작성 증대
- 데스크탑 레이아웃: 시작/완료 날짜와 액션 버튼 사이의 간격을 대폭 늘려(Horizontal Separation) 시각적 균형 확보
- 인터렉션: 호버 효과 및 블루 그래디언트 강조로 프리미엄 피드백 제공
v0.4.15 (2026-01-02)
- Ohli24 날짜 표시 및 디자인 개선:
- 요청일(시작) 및 완료일 배지에 색상 구분 적용 (Slate/Green) 및 "시작:", "완료:" 라벨 추가
- 모바일 뷰에서 날짜 배지가 카드 내부에 깔끔하게 스택되도록 레이아웃 최적화
- Ohli24 검색 UI 모바일 최적화:
- 모바일 화면에서 검색 필터(정렬, 옵션) 및 버튼의 크기를 줄여 공간 효율성 증대
- 검색창과 버튼 배치를 모바일에 맞게 2단 레이아웃으로 조정
v0.4.13 (2026-01-02)
- Ohli24 CSS 사이드 이펙트 수정:
- 페이지별 독립 wrapper (
.ohli24-list-page,.ohli24-request-page,.ohli24-queue-page) 적용으로 스타일 간섭 완전 차단 - 요청(Request) 페이지의 에피소드 카드 가로 정렬 레이아웃 복구 및 최적화
- 요청 페이지 내 불필요한 인라인 스타일 제거 및 외부 CSS로 일원화
- 페이지별 독립 wrapper (
- 안정성 강화:
- Ohli24: 큐 추가 시 즉시 메타데이터 파싱 및 DB 동기화 로직 강화
- FfmpegQueue: 로컬 파일 존재 시 DB 상태 동기화 누락 수정
- 검색: Ohli24 검색 결과 유효성 체크 로직 추가로 런타임 오류 방지
- 모듈 검색 지원:
model_base.py내 Ohli24 및 Linkkf 전용 검색 지원 추가
v0.4.5 (2026-01-02)
- CSS 테마 아키텍처 전면 개편:
- 사이트별 독립 테마 파일 분리 (
anilife.css,linkkf.css,ohli24.css) - 공통 모바일 로직 및 알림 스타일을
mobile_custom.css로 통합 (중복 코드 ~2,000줄 제거) - Jinja2 템플릿을 활용한 테마 동적 로딩 시스템 구현
- 사이트별 독립 테마 파일 분리 (
- 백엔드 안정성 및 UX 강화:
- Anilife:
get_series_info파싱 로직 개선으로IndexError방지 및 크롤링 안정성 확보 - 중복 다운로드 알림: 이미 파일이 존재하거나 DB에 기록이 있을 경우 사용자에게 명확한 알림 메시지 출력
- CSS 호환성:
line-clamp속성 크로스 브라우저 호환성 패치 적용
- Anilife:
v0.4.3 (2026-01-02)
- 모바일 UX 대폭 개선:
- 시스템 알림(bootstrap-notify) 커스텀 스타일링 (사이트별 테마 색상 적용)
- Anilife: Cosmic Violet / Linkkf: Forest Green / Ohli24: Slate Blue
- 모바일에서 상단 nav-pills 메뉴가 가려지는 문제 수정 (margin-top 50px)
- List 페이지 검색/초기화 버튼 사이즈 최적화
- DOM 요소 오버플로우 방지 및 컨텐츠 정렬 개선
- 다운로더 쓰레드 설정:
anilife_download_threads설정 추가 (yt-dlp concurrent-fragments)- Linkkf
get_downloader에서linkkf_download_threads설정 반영
v0.4.0 (2026-01-02)
- Discord 알림 개선:
- 다운로드 완료 시에만 알림 전송 (시작 시 알림 제거)
- 알림 메시지에 포스터 이미지 및 파일명 포함
- DB 매핑 개선:
- 다운로드 시작 즉시 메타데이터(제목, 에피소드 번호, 화질 등) DB 동기화
download_completed에서 모든 필드 정확히 매핑
- UI/UX 개선:
- Ohli24 목록에 에피소드 번호 배지 추가 (고대비 노란색)
- Linkkf 목록에 "자막합침" 버튼 추가 (ffmpeg로 SRT 자막 MP4에 삽입)
- Linkkf 다운로드 수정:
get_downloader메서드 추가 및 설정 페이지의 다운로드 방식 반영prepare_extraURL 덮어쓰기 버그 수정- yt-dlp Fragment 파일 자동 정리
- 로그 최적화:
- yt-dlp 진행률 로그 빈도 감소 (10회당 1회)
- 중복 로그 제거 (
download_completed단일 호출)
v0.3.7 (2026-01-01)
- 설정 페이지 폴더 탐색 기능 추가:
- Ohli24, Anilife, Linkkf 모든 설정 페이지에 폴더 탐색 버튼 적용
- 저장 폴더 옆 "탐색" 버튼 클릭 시 모달 폴더 브라우저 팝업
..(상위 폴더),.(현재 폴더) 네비게이션 지원- 더블클릭으로 하위 폴더 진입, 클릭으로 선택
- 최소/최대 높이 설정으로 일관된 UI 제공 (min-height: 300px, max-height: 600px)
v0.3.3 (2026-01-01)
- Ohli24 Play 버튼 구현:
- 요청 페이지에서 파일이 존재할 경우 즉시 재생 가능한 "Play" 버튼 추가
- VideoJS 기반의 비디오 플레이어 및 플레이리스트 UI 적용 (Linkkf와 동일한 UX 제공)
- 백그라운드 파일 감지 로직 개선 (파일명의 해상도 부분 등을 glob 패턴으로 유연하게 매칭)
- 모바일 UI 최적화:
- Ohli24 요청 페이지에서 모바일 상단 메뉴가 컨텐츠를 가리는 현상 수정 (CSS 미디어 쿼리 적용)
- Linkkf 리팩토링 및 개선:
- 카테고리 데이터 소스를 API 기반(
singlefilter.php)으로 전면 전환하여 안정성 확보 - "완결" 버튼 제거 및 "방영중" 버튼 클릭 시 "Anime List" 로드되도록 변경
- 검색창 및 버튼 UI 디자인 개선 (높이 조정, 정렬 수정, "Elegant" 스타일 적용)
- "Top" 카테고리를 내부 API 연동으로 전환하여 정확도 향상
- 카테고리 데이터 소스를 API 기반(
v0.3.0 (2025-12-31)
- VideoJS 플레이리스트: 비디오 플레이어에서 다음 에피소드 자동 재생
- 플레이리스트 UI: 이전/다음 버튼, 에피소드 목록 토글
- 실시간 갱신: 플레이어 열려있을 때 10초마다 새 에피소드 감지 및 알림
v0.2.2 (2025-12-31)
- 해상도 자동 감지: m3u8 master playlist에서 해상도(1080p/720p 등)를 파싱하여 파일명에 반영
- Discord 알림 개선: 큰 썸네일 이미지, Discord Blurple 색상, ISO 타임스탬프 적용
- Queue 페이지 UI: 좌우 여백을 다른 페이지들과 일치하도록 수정
- Pre-commit hook: 커밋 시 info.yaml 버전 자동 증가 (patch 버전)
v0.2.1 (2025-12-30)
- CDN 보안 우회: cdndania.com 쿠키 기반 인증 처리 (
curl_cffi세션 유지) - CdndaniaDownloader: 별도 프로세스 기반 HLS 세그먼트 다운로더 추가
- 프록시 지원 강화: 세그먼트 다운로드 시 프록시 적용