Communitygithub.com

zimodzh/hls-dot0-to-mp4-skill

Agent Skill: Huawei Browser sniff-download / HLS `.0` cache (aq.m3u8.0 · *.ts.0 · *.key.0) → desktop-playable MP4. Mobile playable, PC cannot open — local remux only, no URL scraping, no DRM.

hls-dot0-to-mp4-skill란 무엇인가요?

이 스킬은 Huawei Browser (Huawei Browser) 자원 스니핑(sniff-download) 기능으로 다운로드된 HLS (HTTP Live Streaming) 캐시 폴더를 데스크톱에서 재생 가능한 MP4 파일로 변환합니다. Huawei Browser는 각 비디오를 UUID 이름의 폴더에 저장하며, 모든 파일 이름 끝에 `.0` 확장자를 추가합니다. (예: aq.m3u8.0, *.ts.0, *.key.0). 이로 인해 모바일 기기에서는 자체 DB로 재생이 가능하지만, PC 플레이어나 FFmpeg에서는 인식되지 않습니다. 이 스킬은 `.ts.0` → `.ts`, `.key.0` → `.key` 하드링크를 생성하고, 원본 재생 목록을 FFmpeg `-c copy` 명령어로 리먹스한 후 임시 이름만 삭제합니다. Cursor, Claude Code, Codex 등 AI 기반 터미널 에이전트에서 실행 가능하며, Huawei Browser 캐시에 대해 검증되었습니다. 다른 브라우저나 DRM 콘텐츠는 지원하지 않습니다.

지원 대상~Claude Code~Codex CLI✓Cursor
npx skills add zimodzh/hls-dot0-to-mp4-skill

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

HLS .0 캐시 → MP4

Huawei Browser 스니프-다운로드는 각 동영상을 암호화된 HLS의 UUID 폴더로 저장한 다음 모든 파일 이름에 .0을 추가합니다. 휴대폰 플레이어는 자체 DB와 이 이름을 읽습니다. PC 플레이어와 FFmpeg는 읽지 못합니다.

이 스킬은 .ts.0→.ts 및 .key.0→.key를 하드링크하고, 원본 재생 목록을 FFmpeg(-c copy)에 전달한 다음 임시 이름만 삭제하여 해당 캐시를 변환합니다. Huawei Browser 캐시에서 검증되었습니다. 다른 브라우저는 테스트되지 않았습니다.

사용 시기

다음 중 하나라도 해당되면 활성화하세요:

  • 폴더 이름이 64f1723d-421b-495c-8a10-85ab7d74ddab와 같습니다.
  • 파일 이름이 aq.m3u8.0, *.ts.0, *.key.0입니다.
  • 사용자가 嗅探下载 / 华为浏览器 / VideoData / 手机能播电脑不能 이라고 말합니다.
  • 로그에 DLEngine, DLSegMgr, download_content_가 포함되어 있습니다.

m3u8 URL 다운로드(N_m3u8DL-RE / 猫抓), Widevine/PSSH DRM, 또는 이미 일반 .mp4를 리먹스하는 데는 사용하지 마십시오.

레이아웃 (작업 공간 검색 신뢰 금지)

Cursor/ripgrep은 바이너리 *.0 파일을 생략합니다. Glob **/*.ts.0은 73개의 세그먼트가 있어도 0을 반환합니다. 디렉터리 목록(Get-ChildItem / dir / Path.iterdir)을 통해 파일을 증명하거나 재생 목록 이름 경로를 읽어서(바이너리 읽기 오류 = 파일 존재) 증명하세요.

각 동영상 폴더:

<uuid>/
  aq.m3u8.0          # 재생 목록; foo.ts와 foo.key 참조 (.0 없음)
  <digits>.ts.0      # AES-128 MPEG-TS, 각각 ~10초
  <digits>.key.0     # 16바이트 HLS 키

선택적 형제 log/<uuid>.txt는 DLEngine 텍스트이며 미디어가 아닙니다.

트리가 다른 경우(키 누락, 중첩 디렉터리, aq.m3u8.0 없음) references/layout.md를 읽으십시오.

워크플로우

하드 게이트 — 변환 또는 다운로드 전에 이 작업을 수행하십시오.

0. ffmpeg 찾기, 또는 중지 후 요청

제한된 검색만 수행합니다(전체 드라이브를 재귀적으로 탐색하지 마십시오). scripts/convert.py는 동일한 순서를 사용합니다:

  1. --ffmpeg / 환경 변수 HLS_DOT0_FFMPEG
  2. <cache-root>/ffmpeg.exe 또는 <cache-root>/ffmpeg
  3. PATH (where.exe ffmpeg / command -v ffmpeg)
  4. 여전히 없으면 몇 가지 일반적인 디렉터리: %LOCALAPPDATA%\Microsoft\WinGet\Links\ffmpeg.exe, %USERPROFILE%\scoop\shims\ffmpeg.exe, C:\ffmpeg\bin\ffmpeg.exe, /opt/homebrew/bin/ffmpeg, /usr/local/bin/ffmpeg

ffmpeg -version(또는 해당 절대 경로)를 실행하십시오. 성공 → 1단계로 이동합니다.

찾을 수 없으면 중지하십시오. 사용자에게 정확히 다음 두 가지 옵션을 요청하십시오. 사용자가 응답할 때까지 설치하거나 변환하지 마십시오:

  • A. 사용자가 직접 ffmpeg를 설치하거나 넣은 후 준비가 되면 알려줍니다. — 이 검색 + -version을 다시 실행합니다.
  • B. 당신이 설치합니다. — 먼저 OS와 아키텍처를 감지합니다(win32 + PROCESSOR_ARCHITECTURE / uname -s + uname -m). 그런 다음 references/ffmpeg-install.md의 일치하는 기본값만 따르십시오.

설치 규칙: 하나의 기본 명령어, 실패 시 하나의 대체 명령어, 그런 다음 다시 요청합니다. 사용자가 동의하지 않으면 ffmpeg를 얻기 위해 Homebrew / Chocolatey / Scoop을 설치하지 마십시오. 다운로드한 바이너리를 이 스킬 저장소에 커밋하지 마십시오. 성공적인 설치 후 새 셸에서 또는 설치 프로그램 경로를 통해 -version을 확인하십시오(Windows PATH는 종료된 후 구식일 수 있음).

1. 계획 (출력 후 변환)

UUID 디렉터리(8-4-4-4-12 16진수)를 나열합니다. 각각에 대해 *.ts.0, *.key.0 개수와 aq.m3u8.0 존재 여부를 확인합니다. 세그먼트가 0개이거나 키가 없는 폴더는 건너뜁니다.

기본 순서: 폴더 이름 A–Z. --start(기본값 1)부터 --out-dir(기본값 <cache-root>/mp4)에 01.mp4, 02.mp4, ...로 출력 번호를 매깁니다. 스크립트는 해당 mp4가 이미 존재하면 이름을 건너뜁니다(JSON skipped: true). 단, --force가 있는 경우는 예외입니다. 부분 배치 후 동일한 명령어를 다시 실행하면 이미 완료된 번호는 유지되고 나머지가 변환됩니다. 두 번째 번호 매기기 체계를 만들지 마십시오.

2. 번들 스크립트 실행 (재발명 금지)

이 스킬 루트에서:

python scripts/convert.py --root <cache-root> --dry-run
python scripts/convert.py --root <cache-root> --out-dir <cache-root>/mp4 --start 1
python scripts/convert.py --root <cache-root> --folder <uuid> --name 01 --force

새 트리에서는 항상 먼저 --dry-run을 전달하십시오. 스크립트 표준 출력은 JSON이고, 진행 상황은 표준 오류로 전달됩니다.

재생 목록을 *.ts.0으로 다시 쓰지 마십시오. FFmpeg는 -allowed_extensions ALL을 사용해도 해당 확장자를 거부합니다(not in allowed_segment_extensions). aq.m3u8.0에 이미 있는 이름으로 하드링크/복사하십시오.

PowerShell $ErrorActionPreference = "Stop"와 ffmpeg -i file -f null -로 출력을 검사하지 마십시오. FFmpeg는 배너를 표준 오류로 출력합니다. PowerShell은 이를 종료 오류로 처리하고 catch가 mp4를 삭제하면 성공적인 변환을 지울 수 있습니다.

정확한 FFmpeg 플래그(취약 — 생략 금지):

ffmpeg -y -hide_banner -loglevel warning -stats -allowed_extensions ALL -protocol_whitelist file,crypto,data -i play.m3u8 -c copy out.mp4

3. 정리 및 보고

스크립트는 이번 실행에서 자신이 만든 임시 이름만 제거하고(이미 .0 파일을 가리키는 남은 하드링크 포함) 항상 play.m3u8을 제거합니다. 원본 *.ts.0 / *.key.0 / aq.m3u8.0은 유지됩니다. .0 파일에 대한 하드링크가 아닌 사전 존재하는 .ts / .key는 삭제하지 않습니다.

표로 보고: 번호, 크기, 알려진 경우 길이, sps_warning. SPS 및 기타 실패는 references/troubleshooting.md를 참조하십시오.

사용자가 SPS 경고 파일을 다시 인코딩하도록 요청하는 경우: ffmpeg -i 04.mp4 -c:v libx264 -crf 18 -c:a copy 04_fixed.mp4 — 전체 배치가 아닌 해당 파일만.

체크리스트

  • 디렉터리 목록에 .ts.0 및 .key.0이 표시됨(검색 도구는 거짓말할 수 있음)
  • ffmpeg 찾음(제한된 검색) 또는 사용자가 A/B 선택; -version 정상; 전체 디스크 검색 없음
  • 설치하는 경우: OS/아키텍처 감지; references/ffmpeg-install.md의 일치하는 명령어만
  • --dry-run 계획이 올바른 것 같음(개수, 출력 이름, 기존 mp4에 대한 SKIP)
  • 하나의 폴더 변환 후 사용자가 재생 가능(전체 변환을 요청하지 않은 경우)
  • 배치 JSON ok / skipped / 항목별 오류; 임시 링크 사라짐
  • 사용자가 스팟 확인할 수 있도록 SPS 경고 번호 언급

출력 형식

Converted N/M videos → <out-dir>
01.mp4  101 MB  (~12:10)  ok
04.mp4  251 MB  (~23:59)  SPS warning — check start and ~10s cuts
FAIL  <uuid>  missing key.0

주의 사항

  • .0이 실제 미디어입니다. 인덱싱을 건너뛰는 Glob/바이너리는 "파일 누락"이 아닙니다.
  • 재생 목록 URI="….key" 및 ….ts — 디스크에는 ….key.0 / ….ts.0입니다.
  • 하드링크는 동일한 볼륨에 유지되어야 합니다. os.link가 실패하면 복사(느림, 추가 디스크).
  • non-existing SPS 0 referenced in buffering period는 일반적으로 -c copy에서 외관상 문제입니다. 10초 경계를 확인하고 재생이 깨진 경우에만 다시 인코딩하십시오.
  • GUI 도구(N_m3u8DL-RE, m3u8-to-mp4)는 표준 확장자를 기대합니다. 이름 바꾸기/하드링크 후에 작동하며 원시 Huawei 이름에서는 작동하지 않습니다.
  • 이것은 로컬 키가 있는 표준 HLS AES-128입니다(DLEngine 로그에 no pssh). Widevine 우회가 아닙니다.
  • ffmpeg가 없으면 → 먼저 A/B를 요청하십시오. 조용히 winget/brew/apt를 실행하거나 exe를 다운로드하지 마십시오.
  • 기존 01.mp4 등은 오류가 아니라 건너뜁니다. 사용자가 해당 파일을 덮어쓰려는 경우에만 --force를 사용하십시오.

관련 스킬