Jellyfin stream proxy
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-27 04:21:26 +00:00
docs fix: preserve every VidBolt HLS audio and subtitle rendition 2026-10-27 04:21:26 +00:00
examples feat: add catalog-backed HLS resolver and safe migration inventory 2026-10-25 05:01:39 +00:00
src/jellyfin_stream_proxy fix: preserve every VidBolt HLS audio and subtitle rendition 2026-10-27 04:21:26 +00:00
tests fix: preserve every VidBolt HLS audio and subtitle rendition 2026-10-27 04:21:26 +00:00
.gitignore feat: add safe source management CLI and batch catalog imports 2026-10-25 05:26:24 +00:00
pyproject.toml feat: add catalog-backed HLS resolver and safe migration inventory 2026-10-25 05:01:39 +00:00
README.md fix: preserve every VidBolt HLS audio and subtitle rendition 2026-10-27 04:21:26 +00:00

Jellyfin Stream Proxy

Proxy para a biblioteca Jellyfin: um .strm por episódio, várias fontes e seleção automática ao iniciar a reprodução.

  • Repositório privado no YuGit exclusivamente.
  • Python 3.12+, biblioteca padrão, sem criar bancos nem serviços auxiliares.
  • Versão 0.1: seleção de início de reprodução para HLS e MP4 (PF, AF, AD, AZ, BA e AOC).
  • Fontes MP4 entram desativadas até validação real de Range, decode e seek.
  • Resolvedor unificado implantado na porta 8931, preservando rotas legadas. A migração dos arquivos elegíveis foi concluída; casos especiais permanecem intocados.

Código

  • src/jellyfin_stream_proxy/catalog.py — catálogo validado e recarregável.
  • src/jellyfin_stream_proxy/probes.py — preflight de manifesto e segmento, prioridade e cache.
  • src/jellyfin_stream_proxy/server.py — rota estável e serviço HTTP.
  • src/jellyfin_stream_proxy/legacy.py — compatibilidade com o proxy atual.
  • src/jellyfin_stream_proxy/migration.py — inventário e plano somente leitura.
  • src/jellyfin_stream_proxy/cli.py — comandos administrativos.
  • docs/ — arquitetura, segurança e implantação.

Uma URL única por episódio se parece com:

http://<GATEWAY_JELLYFIN>:8931/v1/play/ep_<ID_ESTAVEL>

O ID não depende de URL de mídia e o catálogo privado guarda as fontes reais.

Testes

PYTHONPATH=src python3 -m unittest discover -s tests -v
PYTHONPATH=src python3 -m jellyfin_stream_proxy check --catalog examples/catalog.example.json

A migração reversível dos arquivos elegíveis foi executada. Consulte docs/migration-report.md e docs/deployment.md.

Padrão definitivo dos arquivos Jellyfin

Nome neutro, sem sufixo: S01E01.strm (não S01EP01.strm nem S01E01 - PROXY.strm).

Animes/ hack SIGN (2002)/ Season 01/ S01E01.strm S01E02.strm S01E03.strm

Cada arquivo contém apenas a URL estável do proxy. AF, AD, AZ, BA, PF e AOC são opções internas do catálogo, não arquivos extras na biblioteca. O proxy seleciona a primeira opção saudável HLS ou MP4 e redireciona para a fonte correspondente.

Na migração, preservar versões com sufixo até concluir backup, comparação de episódios, validação do novo ponteiro e indexação pelo Jellyfin. O inventário permanece somente leitura; library_migrate.py executa a migração reversível autorizada.

Administração de fontes

A CLI já oferece source add/list/test/update/enable/disable/remove e catalog import. Suporta várias URLs para o mesmo provedor com IDs individuais, deduplicação por upstream, dry-run de lotes e backups das versões válidas do catálogo. Novas fontes entram desativadas; ativação exige preflight HLS/MP4, FFprobe, decode e seek.

Procedimentos e exemplos: docs/source-management.md. O catálogo de produção contém as identidades da biblioteca migrada. Novas origens precisam ser verificadas antes da ativação. Compatibilidade de mídia: docs/formats.md.

Filmes

O mesmo catálogo cobre Filmes/Título (Ano), com ID mv_ independente dos episódios ep_. Um filme usa Título (Ano).strm e pode ter vários destinos MP4/HLS sem duplicar itens no Jellyfin. Os filmes elegíveis foram migrados para ponteiros neutros, com originais preservados em quarentena.

Implantação na porta 8931

O cloud-lab agora usa a implementação do repositório na mesma porta 8931, por meio de /home/cloud/hls-proxy/hls_proxy.py (inicializador mínimo) e do restart.sh já existente. Código e catálogo: /home/cloud/hls-proxy/jellyfin-stream-proxy/; configuração privada e URLs assinadas continuam fora do Git.

A biblioteca elegível usa a rota estável na 8931. O usuário confirmou playback do piloto; a 8932 foi desativada. Os backups de migração preservam os antigos ponteiros.

Encerramento do piloto 8932

O usuário confirmou a reprodução de Cyberpunk S01E01 no aplicativo Jellyfin pela porta 8931. A instância temporária 8932 foi encerrada de forma seletiva e deixou de ouvir conexões. A 8931 continuou com healthz 200 e Cyberpunk 302 em checagem após o encerramento; Jellyfin running healthy. AF/PF originais, S01E01.strm e backups foram preservados. A migração em massa ocorreu posteriormente e está documentada separadamente.

Migração da biblioteca (25/10/2026)

9.649 STRM neutros em um catálogo de 9.655 identidades. Sete ponteiros antigos de seis episódios foram preservados devido a falhas de mídia ou rotas especiais. Os originais estão em quarentena reversível. A auditoria posterior encontrou zero caminhos obsoletos; a exceção de 26 episódios em uma pasta oculta foi corrigida e indexada. Relatório em docs/migration-report.md.

Seleção rápida e preferência de provedor (produção)

Preferência obrigatória por classe de provedor: PF primeiro, AF como primeiro fallback, depois AD/AZ/BA, LEGACY de proveniência desconhecida e AOC. A prioridade numérica no JSON ordena espelhos dentro da classe, mas não pode inverter PF e AF.

  • Quando há uma única fonte habilitada, o proxy responde imediatamente com HTTP 302, sem preflight: não existe alternativa para escolher. Se a origem estiver indisponível, o player pode falhar; esse caminho rápido não repara URLs quebradas.
  • Quando há duas ou mais fontes habilitadas, o preflight e o fallback continuam obrigatórios. Seleções saudáveis ficam em cache por 45 s, falhas por 10 s. Não existe recuperação automática após uma reprodução já iniciada.
  • O alias /master.m3u8 continua aceitando apenas HLS; MP4 não é convertido ficticiamente.
  • Deploy de 25/10/2026: 9.592 itens com uma única fonte habilitada acelerados. Cyberpunk S01E01 agora escolhe PF antes de AF, mesmo quando o JSON antigo traz AF com prioridade numérica menor. Resolução a frio de AF único medida em aproximadamente 0,001 s, contra 1,72 s no exemplo pré-alteração. São medidas da seleção, não do carregamento integral do vídeo. FFmpeg do Cyberpunk passou com 72 quadros após seek e Jellyfin permaneceu saudável.

Rollback restrito a estes dois módulos: /home/cloud/hls-proxy/backups/jsp-fastpath-priority-20261025T082004Z. Nenhum STRM ou catálogo foi reescrito por essa otimização.

Resolvedor adaptativo e segmentos em streaming

O seletor usa saúde temporária por fonte quando existem alternativas. Falhas colocam uma fonte temporariamente em recuperação (10 a 60 segundos), e fontes recuperadas reassumem sua prioridade PF > AF > AD/AZ/BA > FHD > LEGACY > AOC.

  • Fonte única: HTTP 302 imediato sem preflight. Isso não prova disponibilidade da origem.
  • Fontes múltiplas: cache positivo por 45 segundos, com preflight antecipado da próxima alternativa após 350 ms de atraso da fonte prioritária; AF não derrota PF apenas por responder antes.
  • Concorrência global limitada por semáforo e pool de 8 trabalhadores, sem sondagem permanente da biblioteca.
  • Erros reais de origem alimentam o cache; cancelamento do player não é automaticamente falha. O feedback de segmentos HLS terceirizados continua parcial.
  • Segmentos HLS do AnimeFire são enviados em blocos de 64 KiB, sem baixar o segmento inteiro antes de começar a responder. Range/HEAD preservados.
  • Para novas fontes, cadastro e ativação exigem testes profundos via CLI (manifesto/segmento, Range, codec, decode e seek), separados do preflight leve de runtime.
  • Não há fallback no meio de uma reprodução já iniciada. Fontes AF em manutenção podem continuar sem reproduzir.

Detalhes em docs/performance.md. Essa atualização não modificou STRM nem catálogo.

AnimesFHD (adapter implementado; piloto em produção)

O catálogo reconhece FHD / fhd_hls com URLs canônicas da API animesfhd.net para AniStream e AnimesDigital. O proxy reescreve variantes e segmentos HLS para rotas próprias com extensões adequadas, preserva Range/seek e renova assinaturas em cache limitado. Não acessa destinos arbitrários nem altera a identidade do .strm.

Em 25/10/2026, o adapter foi implantado na instância existente da porta 8931 após testes isolados. O piloto Devil May Cry (2007), S01E01 foi confirmado pelo usuário no aplicativo Jellyfin, com seek e áudio PT-BR. Após aprovação, o lote S01E02–S01E08 também foi cadastrado: oito .strm neutros, cada um com uma fonte FHD (AnimesDigital) individual no catálogo. As sete novas fontes passaram em FFprobe, decode e seek de 60 segundos pelo container Jellyfin; playback dos episódios 2–8 no aplicativo ainda precisa ser confirmado. O catálogo de produção ficou com 9.712 identidades e o proxy permaneceu saudável, sem reinício para o segundo lote.

Procedimento e limitações: docs/animesfhd.md. Registro de implantação, backup e rollback: docs/fhd-devil-may-cry-pilot.md.

Descoberta AnimesFHD em lote (somente desenvolvimento)

O comando fhd-discover consulta o AnimesFHD por título ou ID, mapeia identidades exatas e prepara até 50 episódios para revisão. Consulte docs/fhd-discovery.md.

Importação completa por ID: AnimeFire + AnimesFHD

O comando anime-import aceita --af-id, --fhd-id ou ambos, enumera todos os episódios disponíveis do anime (até 3.000, sem truncamento silencioso), associa por temporada/episódio e prepara lotes de até 50, com preferência PT-BR e deduplicação contra o catálogo. Quando os dois IDs são informados, só combina resultados com ano e título compatíveis. Com --apply, todos os sublotes são gravados atomicamente pelo editor existente, com fontes desativadas, sem alterar .strm ou fontes em reprodução. Habilitar fontes e criar ponteiros novos exige validação de mídia separada. A API AnimeFire foi conferida via api.animefire.one/anime/<id> e /episode/<id>; mídia AF reutiliza o transporte legado fixo Akumast. Não cria serviço, agendador ou banco. Somente o código foi implementado no repositório de desenvolvimento; não houve deploy. Consulte docs/anime-id-import.md.

Importação em massa de AnimesFHD: vários títulos e .strm automáticos

O novo comando fhd-bulk (em desenvolvimento, não implantado em produção) pesquisa uma página de até 20 animes dublados, combina os IDs/temporadas/episódios com os nomes e aliases exatos da biblioteca e apresenta um dry-run. Com --allow-new, admite criar títulos novos de nome/ano inequívocos. Os demais ficam em REVIEW. A opção --apply --max-episodes 50 --public-base <ORIGEM_CONFIÁVEL> testa cada fonte numa instância isolada, exige FFprobe, decode e seek com FFmpeg do Jellyfin, habilita somente fontes aprovadas no catálogo com backup e cria um único .strm estável por episódio. É idempotente, preserva arquivos existentes e repara ponteiros faltantes após interrupções. Não cria container, banco ou agendador. O primeiro piloto autorizado foi publicado em produção via código isolado, sem deploy permanente do comando: 36 episódios de Nanatsu em 24+12 por temporadas revisadas e 2 fontes FHD alternativas para Blades, com 38 aprovações FFmpeg/seek e catálogo 9.712 → 9.748. A aplicação massiva para outros títulos segue pendente de autorização. Veja docs/fhd-bulk.md e docs/fhd-pilot-38-20261025.md.

Correção pontual PF: Street Fighter (2026)

Em 25/10/2026, o filme Street Fighter (2026) não reproduzia devido a HTTP 403/Cloudflare 1010 na antiga origem R2 registrada no catálogo. A API atual do PF retornou o mesmo objeto MP4 em outro bucket R2, acessível com HTTP 206 e FFmpeg/seek. Adicionamos apenas o novo host à allowlist, atualizamos exclusivamente a fonte PF desse filme no catálogo e preservamos sua URL .strm estável. O proxy passou por reinício seletivo, mantendo Jellyfin saudável e 9.748 identidades no catálogo. Não houve troca dos demais endereços PF. O teste pelo FFmpeg do container usando a URL estável, inclusive seek, passou; reprodução no cliente Jellyfin ainda precisa de confirmação. Backup de escopo: /home/cloud/hls-proxy/backups/jsp-pf-street-fighter-20261025T222427Z. Relatório e rollback.

Recuperação automática PF (implantada na produção)

O módulo pf_recovery.py adiciona recuperação de rotação do bucket R2 ao proxy existente. Quando uma origem PF MP4 salva retorna 403/404/410, o proxy consulta o endpoint fixo de um filme sentinela do PF, valida o destino e a assinatura MP4 com Range, guarda um único host aprovado em cache, e tenta novamente com o mesmo caminho de objeto. O mecanismo funciona para filmes e episódios e também no preflight de seleção PF/AF; preserva os .strm e o catálogo, sem agendador, container ou banco. Não tenta adivinhar caminhos de arquivos que mudaram nem atualizar origens de outros sites.

Em 25/10/2026, 11 arquivos PF antigos responderam com o caminho intacto no bucket novo, e uma instância temporária isolada comprovou o fluxo completo com o filme 72 Horas em Miami (2026): FFprobe H.264/AAC, FFmpeg de oito quadros e seek de 60 segundos. Os 128 testes passaram. Implantado no proxy de produção no cloud-lab após aval em 25/10/2026, com cópia de segurança /home/cloud/hls-proxy/backups/jsp-pf-auto-deploy-20261025T225713Z, troca atômica somente de quatro módulos e reinício seletivo. FFprobe/FFmpeg do Jellyfin confirmaram MP4 antigo (72 Horas em Miami), MP4 novo (Street Fighter) e seek de 60 segundos; catálogo e .strm preservados. Reprodução no cliente usando a nova recuperação automática ainda requer confirmação. Documentação e rollback.

Extensão LEGACY R2 (produção)

A auditoria encontrou 60 fontes catalogadas como LEGACY com MP4 no bucket R2 antigo usado pelo PF, todas sob /tv/, mas sem proveniência comprovada. A rota MP4 já conseguia recuperá-las diretamente; agora o preflight para episódios com múltiplas fontes também faz a recuperação, limitada ao host/caminho antigo verificado. Outros LEGACY e CDNs de AF/AD/AZ/BA/AOC/FHD não entram nessa exceção. O código alterado foi apenas probes.py; publicação autorizada após 131 regressões e validada em produção com FX Fighter Kurumi-chan S01E03 (FFprobe, decode inicial e seek 60s). Backup: /home/cloud/hls-proxy/backups/jsp-legacy-r2-preflight-20261025T231419Z. Catálogo e .strm inalterados; sem push. Detalhes e rollback.

Primeira expansão adicional: 37 novos episódios FHD

Em 25/10/2026, um lote revisado adicionou 37 episódios: Tomo-chan Is a Girl! (2023) (13), Wandance (2025) (12) e Yuri!!! on Ice (2016) (12). Todas as fontes passaram por HLS preflight, FFprobe de áudio/vídeo, decode e seek de 60s no FFmpeg do container Jellyfin. Catálogo: 9.748 → 9.785, com 37 novos STRM neutros e todos os registros antigos intactos. Oshi no Ko ficou de fora por falha da fonte de S01E01; outros animes com episódios/temporadas ambíguos ficaram REVIEW. Backup de escopo: /home/cloud/hls-proxy/backups/jsp-populate-anime-37-20261025T234801Z. Sem deploy permanente do importador nem push. Falta scan da biblioteca Animes e teste do player/áudio PT-BR. Detalhes em docs/fhd-populate-37-20261025.md.

Validação de fontes PF desativadas pelo caminho real do proxy (26/10/2026)

O teste administrativo de ativação estava diferente da reprodução do Jellyfin: fazia preflight MP4 direto no bucket R2 antigo, retornava HTTP 403 e rejeitava uma origem que o proxy recupera. Em desenvolvimento, a CLI agora usa ActivationProbe com --proxy-base privado para conferir a rota existente /src/mp4 mesmo antes de habilitar a fonte; exige HTTP 206/Range/ftyp, mantém FFprobe/decode/seek e passa o mesmo verificador para a segunda barreira de ativação. 134 testes aprovados. Ainda não implantado em produção, pois a Ella iniciou ativação concorrente com o container temporário jsp-enable; a alteração no repositório não modifica o validador dela em execução.

Auditoria atual: 10.531 identidades, 11.746 fontes, 951 PF desativadas. Entre 938 identidades com PF desativado, 747 ainda não têm .strm canônico; habilitar PF não cria automaticamente esses ponteiros. Rever IDs e depois criar uma única entrada por episódio em lotes protegidos. Casos /s/ e host fontedecanais-live permanecem em REVIEW. Diagnóstico, teste e pendências.

Política: preservar TODOS os áudios e legendas (27/10/2026)

A prioridade PT-BR é para escolher a fonte, nunca para eliminar idiomas de um stream. O proxy deve preservar integralmente faixas de áudio, legendas e metadados HLS #EXT-X-MEDIA disponíveis e seguros (idioma, rótulo, grupo, DEFAULT/AUTOSELECT), cabendo ao Jellyfin apresentar o seletor de faixas. Na implementação anterior do VidBolt, o filtro de idiomas do piloto contrariava essa regra. Foi removido no desenvolvimento, com regressão 151/151 e teste de manifesto: Ted Lasso passou de 2/2 para 10 áudios e 40 legendas; Reacher passou de 3/2 para 29 áudios e 41 legendas.

Ainda NÃO implantado: o FFprobe do Jellyfin 8.1.3 levou mais de 48 segundos sem concluir ao abrir a master com 50–70 rendições. O demuxer HLS acessa playlists sequencialmente; versão oficial instalada não suporta a otimização upstream proposta em 23/10/2026 (parallel_open). Preservar todas as faixas é o objetivo definitivo; não sacrificar tempo de abertura para deploy precipitado. O FHD e legados precisam auditorias/adaptações específicas quando oferecem rendições. Zokoanime continua apenas candidato e, se entrar, deverá ser última fonte de fallback de animes, também sem eliminar legendas. Detalhes e bloqueador em política de áudio e legendas.

Três séries novas para validar o VidBolt no Jellyfin (27/10/2026)

Corrigimos o piloto anterior de fontes alternativas com três séries ausentes no catálogo: Breaking Bad (2008; TMDb 1396), Peaky Blinders (2013; 60574) e Reacher (2022; 108978). Somente S01E01 de cada uma foi incluído com um único STRM estável e fonte VB HLS, após teste isolado e novo teste na produção (FFprobe A/V, quadros reais iniciais, áudio, seek de 45s e playlist PT-BR). O caso Stranger Things falhou em seek e foi excluído. Catálogo: 10.534 identidades, 11.752 fontes; todas as fontes anteriores preservadas. O container Jellyfin lê os três STRM; a presença no UI e a seleção real de faixas ainda precisam de confirmação. Nos três manifests há áudio eng/por e legendas PT-BR; comandos audio= e postMessage da documentação VidBolt pertencem apenas ao iframe e não são aplicados pelo Jellyfin. Backup: /home/cloud/hls-proxy/backups/jsp-vidbolt-new3-20261027T032751Z. Detalhes em docs/vidbolt-3id-pilot-20261026.md.

VidBolt (VB): piloto de 3 episódios, com fallback (26–27/10/2026) — estado anterior

Integração restrita no proxy atual, sem criar serviço ou .strm: Ted Lasso S01E01 (TMDb 97546), Bleach S01E01 (30984) e One-Punch Man S01E01 (63926). Cada um recebeu uma fonte VB HLS alternativa, de prioridade inferior às fontes PF/AF/AZ existentes. O adaptador obtém playlists atuais pelo VidBolt, reescreve segmentos HLS disfarçados de .jpg/.js e fragmentos Callisto assinados .m4s para rotas locais com IDs opacos, com allowlist fixa de host/caminho e sem desligar as proteções globais do FFmpeg. No piloto isolado e novamente em produção: 3/3 FFprobe áudio+vídeo, 12 quadros reais iniciais e 12 após seek de 45s. São 149 testes de regressão aprovados. O catálogo passou de 11.746 a 11.749 fontes, mantendo 10.531 episódios/filmes, os .strm e as fontes anteriores inalterados. Backup: /home/cloud/hls-proxy/backups/jsp-vidbolt-3id-20261027T030519Z. O proxy foi reiniciado seletivamente; Jellyfin segue saudável. Reprodução em cliente Jellyfin e dublagem PT-BR não confirmadas. Não expandir automaticamente. Documentação, limitações e rollback.

Validação rápida PF — implantada na administração (26/10/2026)

O comando source enable-batch está disponível no CLI administrativo existente do cloud-lab, sem alterar o proxy de reprodução. Aceita um manifesto JSON revisado de 1 a 50 pares exatos de episódio e ID da fonte, opera inicialmente em leitura e só habilita fontes com --apply. Usa 6 workers por padrão e FFprobe/FFmpeg do container Jellyfin; testa MP4 via proxy com recuperação R2, presença de vídeo e áudio, pelo menos oito quadros decodificados no início e após seek de 45s. O limite -t 5 -frames:v 12 acelerou as validações na amostra sem alterar a classificação dos casos problemáticos; não limitar separadamente -frames:a nem remover -t 5. Uma prova interna, consumível uma vez e com validade limitada, elimina o segundo HTTP apenas quando há validação profunda real e o catálogo inteiro permanece idêntico dentro do lock. Mudança concorrente aborta o lote sem escrita parcial.

Suite: 140 testes aprovados. Piloto e teste com CLI de produção: seis fontes (4 boas/2 quebradas), exatamente quatro aprovadas, duas rejeitadas; --apply somente em cópia isolada. Nenhuma fonte PF foi ativada pela implantação; catálogo permanece com 10.531 identidades, 1.317 PF ativas e 54 desativadas. Sem novos serviços, STRM, reinício ou alteração do catálogo. Backup dos dois módulos: /home/cloud/hls-proxy/backups/jsp-fast-validation-20261026T175951Z. Relatório, uso e rollback.

Benchmark controlado de validação PF (histórico anterior ao deploy, 26/10/2026)

Numa amostra fixa de 12 MP4 do proxy de produção (8 válidos e 4 reprovados), FFmpeg -t 5 -frames:v 12 sem limite de quadros de áudio, com 6 workers, preservou 12/12 classificações, terminando em 13,94 s (contra 20,37 s do procedimento anterior com 3 workers). Oito workers reduziram para 12,65 s, mas aumentaram o pico de CPU a ~91% em um servidor de 4 cores. Não usar -frames:a 12: rejeitou indevidamente sete vídeos saudáveis. Não omitir -t 5: um vídeo quebrado de Bleach passou ao esperar quadros além da janela. Uma segunda sondagem HTTP serial custou 3,062 s para oito fontes; o atestado temporário por fonte foi apenas simulado e ainda precisaria de proteção transacional contra expiração, replay e alteração do catálogo. Nenhuma otimização foi implantada. Benchmark completo.

PF: ativação em massa concluída em produção (26/10/2026)

Após aval explícito, o CLI administrativo da produção foi atualizado sem substituir os comandos reduzidos existentes, com backup em /home/cloud/hls-proxy/backups/jsp-pf-admin-cli-20261026T155643Z e sem reinício do proxy ou do Jellyfin. Dos 834 PF desativados, 780 passaram por HTTP 206, FFprobe áudio/vídeo, decodificação inicial, seek de 45s no FFmpeg do container e segunda validação do catálogo; foram ativados em 17 lotes de até 50. Outros 54 ficaram desativados (46 falhas de decode inicial, 3 FFprobe e 5 preflight). Resultado: 1.317 fontes PF ativas e 54 desativadas, 10.531 identidades / 11.746 fontes no catálogo. Comparação completa com o backup confirmou que apenas as 780 fontes aprovadas foram ativadas, sem alterar identidades ou arquivos .strm. Seis episódios foram testados via /v1/play no FFprobe do Jellyfin, proxy e Jellyfin saudáveis. Backup e 20 provas arquivadas em /home/cloud/hls-proxy/backups/jsp-pf-activation-20261026T155821Z (subpasta activation-audit). Pendente revisar o único .strm legado direto, as 54 fontes reprovadas e os casos separados de REVIEW do formato /s/ ou host fontedecanais, sem forçar ativação. Relatório e rollback.

Atualização histórica: ativação administrativa PF (antes do deploy em 26/10/2026)

A CLI do repositório corrige falsos erros de preflight ao validar fontes MP4 desativadas através do proxy (206, Range, assinatura MP4), preservando FFprobe/decode/seek e a segunda barreira de ativação. Suite: 134 testes. A CLI de produção tem comandos de importação intencionalmente removidos; o merge mínimo foi preparado e testado em três fontes PF desativadas sem modificar produção. Após a Ella encerrar a execução anterior, o catálogo tinha 537 fontes PF ativas / 834 desativadas. Uma auditoria somente leitura pelo proxy verificou 829/834 preflights; cinco permanecem com falha. Os STRM que antes faltavam já foram criados pela Ella: 822 ponteiros canônicos e um legado direto exigindo revisão. A nova CLI ainda NÃO foi implantada: a ferramenta bloqueou as operações de backup/deploy na produção. Nenhuma nova fonte foi ativada por essa auditoria. Detalhes: docs/pf-activation-cli-recovery-20261026.md.

Enriquecimento de episodios AF-only

Consultar docs/source-enrichment.md: primeiro PF, AD, AZ, BA e AOC ja testados; GoAnime/Goyabu/SuperFlix ficam para pesquisa posterior. Uma URL STRM estavel, alternativas apenas no catalogo e lotes de no maximo 50.