anihub-tv 0.0.0-stage → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +89 -2
- package/css/app.css +4 -0
- package/docs/ANISTREAM-0.3.0.md +60 -0
- package/docs/HISTORICO-0.2.0.md +99 -0
- package/docs/PESQUISA-QUALIDADE-0.2.0.md +74 -0
- package/docs/TESTE-NA-TV.md +40 -0
- package/index.html +9 -0
- package/js/ani-client.js +19 -0
- package/js/app.js +276 -0
- package/js/core.js +101 -0
- package/js/top-provider.js +44 -0
- package/js/vendor/APACHE-2.0.txt +202 -0
- package/js/vendor/NOTICE.txt +5 -0
- package/js/vendor/hls.LICENSE +28 -0
- package/js/vendor/hls.light.min.js +2 -0
- package/package.json +28 -4
- package/service/anistream.js +177 -0
- package/service/index.js +616 -0
- package/service/media-probe.js +42 -0
- package/service/runtime.js +349 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Animes Brasil TV contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,90 @@
|
|
|
1
|
-
|
|
1
|
+
Instalação alternativa pelo npm: no TizenBrew, escolha Adicionar módulo → npm e digite `anihub-tv@0.3.1`. Esta distribuição não depende do acesso público ao repositório GitHub.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# AniHub — 0.3.1
|
|
4
|
+
|
|
5
|
+
Cliente independente PT-BR para Samsung Tizen 3.0 / Chromium 47, com **AniStream como fonte principal após conectar a conta**. Animes Brasil e TopAnimes continuam disponíveis como alternativas. Código novo, separado de Cinefy e StremioK.
|
|
6
|
+
|
|
7
|
+
## Entrada automática
|
|
8
|
+
|
|
9
|
+
O aplicativo oferece o **Quick Connect oficial do AniStream**. Você autoriza o aparelho uma vez no site; o app guarda somente o token de sessão no próprio aparelho e verifica sua validade ao abrir. A senha não está no código, pacote ou relatório. Cada TV/computador deve ser vinculado separadamente.
|
|
10
|
+
|
|
11
|
+
Enquanto o token for aceito, não é preciso repetir o login. O servidor pode expirar ou revogar a sessão; nesse caso, será necessário vincular novamente. Não existe promessa de login permanente nem um refresh-token inventado. Falhas de rede e recusas HTTP403 preservam a sessão; HTTP401 pede nova entrada.
|
|
12
|
+
|
|
13
|
+
## Recursos
|
|
14
|
+
|
|
15
|
+
- Catálogo e busca AniStream autenticados, temporadas carregadas sob demanda, favoritos e progresso locais.
|
|
16
|
+
- Dentro da temporada, episódios sem arquivo com **áudio japonês e legenda portuguesa de texto identificados** são ocultados. Fontes disponíveis usam a mesma preferência ao iniciar, evitando troca silenciosa para áudio dublado.
|
|
17
|
+
- PT-BR explícito tem prioridade; Português sem variante regional é aceito com aviso. PT-PT explícito, legendas forçadas de placas/músicas e legendas apenas de imagem não são tratadas como correspondência completa.
|
|
18
|
+
- Qualidades ordenadas por resolução e bitrate de origem, com resolução efetiva exibida pelo vídeo. Não há upscale nem conversão local para 720p.
|
|
19
|
+
- HLS solicitado com H.264/AAC; a origem pode copiar ou transcodificar conforme necessário. A ponte não recodifica vídeo. Não se promete cópia de vídeo em todo arquivo, nem 4K onde a origem não o fornece.
|
|
20
|
+
- Legendas JSON/SRT/ASS/SSA são lidas como dados e convertidas em WebVTT na ponte. Tempos e texto são preservados; efeitos, fontes, desenhos e posicionamentos especiais de ASS não são reproduzidos integralmente. Falas repetidas sobrepostas são reunidas para reduzir o custo no navegador antigo. Legendas de imagem não usam OCR.
|
|
21
|
+
- O vídeo aguarda o carregamento da legenda. Se ela falhar, o player pausa e avisa, em vez de continuar sem texto. A legenda sobe quando os controles aparecem.
|
|
22
|
+
- Atualização ao abrir, pesquisar e retornar ao aplicativo; botões de atualização nas temporadas e nos episódios. Uma atualização de catálogo não substitui um vídeo ativo.
|
|
23
|
+
- O modo Animes Brasil mantém Top 10 da semana, Top animes, lançamentos e a busca adicional TopAnimes da versão anterior. Em Conta AniStream, escolha a fonte principal desejada. A opção Buscar outras fontes permite consultar as alternativas sem apagar a sessão AniStream.
|
|
24
|
+
|
|
25
|
+
## Vincular a conta
|
|
26
|
+
|
|
27
|
+
1. Abra **Conta AniStream → Vincular por código Quick Connect**.
|
|
28
|
+
2. No celular ou computador, entre em [AniStream — Benefícios](https://anistream.biz/benefits).
|
|
29
|
+
3. Abra Quick Connect, digite os seis números mostrados no aparelho e autorize esse dispositivo. O código temporário expira em cinco minutos.
|
|
30
|
+
4. O catálogo AniStream abre automaticamente. Ao abrir novamente, o app restaura a sessão.
|
|
31
|
+
|
|
32
|
+
Na verificação real, a conta gratuita mostrava aplicativos como benefício de apoio; depois da ativação Premium pelo próprio usuário, o site exibiu Quick Connect e o vínculo funcionou. Não foi contornado controle de acesso, contratado plano ou alterada cobrança pelo aplicativo.
|
|
33
|
+
|
|
34
|
+
A entrada por usuário e senha do perfil Jellyfin também está implementada, mas **não foi validada com as credenciais reais**; as tentativas anteriores foram recusadas. O caminho comprovado nesta entrega é Quick Connect. A senha de perfil pode ser diferente da senha da conta por e-mail.
|
|
35
|
+
|
|
36
|
+
## Prévia local
|
|
37
|
+
|
|
38
|
+
Requer Node.js somente para desenvolvimento:
|
|
39
|
+
|
|
40
|
+
```powershell
|
|
41
|
+
node tools/dev.cjs
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Abra http://127.0.0.1:8128/ . O endereço http://127.0.0.1:8128/#anistream abre Conta AniStream. A prévia serve somente os arquivos de execução, sem disponibilizar os HTML não confiáveis usados como fixtures de teste.
|
|
45
|
+
|
|
46
|
+
Essa URL funciona no próprio computador. Na TV, localhost aponta para a TV; a instalação deve usar o módulo TizenBrew com seu serviço local, sem depender do PC ligado.
|
|
47
|
+
|
|
48
|
+
## Instalar pelo TizenBrew
|
|
49
|
+
|
|
50
|
+
Esta versão é distribuída em um repositório separado: **srwayne15-bot/AniHub**. Ela preserva Anime-TV, Cinefy e StremioK. Ainda não foi testada fisicamente na TV.
|
|
51
|
+
|
|
52
|
+
Para instalar esta versão:
|
|
53
|
+
|
|
54
|
+
1. TizenBrew → Gerenciador de módulos → Adicionar módulo GitHub.
|
|
55
|
+
2. Use `srwayne15-bot/AniHub@main` no campo GitHub, sem `gh/`. O app aparecerá como **AniHub**.
|
|
56
|
+
3. Confira **v0.3.1** na lateral. O manifesto inicia `service/index.js` no serviço Node do TizenBrew.
|
|
57
|
+
4. Feche e reabra TizenBrew após alterações no serviço. O CDN pode demorar a atualizar arquivos de @main.
|
|
58
|
+
5. Vincule a conta nessa TV por Quick Connect. A sessão do computador não acompanha o pacote.
|
|
59
|
+
|
|
60
|
+
Não substitua nem remova Cinefy ou StremioK. Esta versão não inclui um WGT autônomo: o serviço Node da ponte depende do TizenBrew.
|
|
61
|
+
|
|
62
|
+
## Armazenamento e acesso
|
|
63
|
+
|
|
64
|
+
- Somente chaves `abtv.v1.*`, sem limpeza global. Histórico limitado a 30 episódios, favoritos a 100 e cache inicial do modo Animes Brasil a 48 cards.
|
|
65
|
+
- O token fica em `abtv.v1.anistream-session`; a senha nunca é persistida. Falha de quota avisa que a sessão ficou apenas na memória.
|
|
66
|
+
- TizenBrew compartilha a origem/armazenamento entre módulos. O prefixo evita colisões, mas **não isola nem criptografa o token contra outro módulo da mesma origem**. Sair remove apenas a sessão deste app e solicita seu encerramento no servidor, sem revogar todos os outros aparelhos.
|
|
67
|
+
- Ponte em 127.0.0.1:8238, TLS validado e destinos de origem restritos. Tokens não aparecem nas URLs entregues ao player: playlists, segmentos, imagens e legendas usam tickets locais temporários.
|
|
68
|
+
- HTML externo nunca é executado como aplicativo. A integração não injeta scripts de propaganda nem abre iframes publicitários.
|
|
69
|
+
|
|
70
|
+
## Desenvolvimento e testes
|
|
71
|
+
|
|
72
|
+
```powershell
|
|
73
|
+
npm install --ignore-scripts
|
|
74
|
+
node tools/build-service.cjs
|
|
75
|
+
npm test
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Ferramentas de teste: Acorn e jsdom nas versões de package.json. A TV não instala dependências npm. hls.js 1.6.13 está incluído localmente.
|
|
79
|
+
|
|
80
|
+
Edite os arquivos de origem do serviço e execute `node tools/build-service.cjs`: o resultado reúne todos os helpers em `service/index.js`, conforme o carregamento do TizenBrew. Esse arquivo gerado precisa acompanhar a publicação.
|
|
81
|
+
|
|
82
|
+
**73 verificações automatizadas aprovadas**: 48 gerais e 25 AniStream. Elas cobrem ES5, identidade de episódios, quotas, autenticação simulada, persistência da sessão, HTTP401/403, preferência de idiomas, Quick Connect, proteção de destinos, URLs opacas, conversão e deduplicação de legendas e espera pelo carregamento antes de reproduzir. Rede e mídia são simuladas nessas suítes.
|
|
83
|
+
|
|
84
|
+
A autenticação real pelo site, catálogo, restauração de sessão e reprodução 1920×1080 com legenda portuguesa visível foram verificados no Opera do computador. Evidências em `evidence/`; os detalhes e limites constam em [ANISTREAM-0.3.0.md](docs/ANISTREAM-0.3.0.md).
|
|
85
|
+
|
|
86
|
+
**Não houve teste na Samsung.** Ainda precisam de validação real: desempenho, codecs/TLS, HLS nativo/MSE, WebVTT, fontes e continuidade ao alternar para YouTube no Tizen 3.0. ES5 validado não substitui esse teste.
|
|
87
|
+
|
|
88
|
+
## Licenças
|
|
89
|
+
|
|
90
|
+
Código novo MIT. hls.js Apache-2.0, com licenças e avisos em js/vendor. Catálogo e mídias pertencem a seus titulares. Fixtures HTML são dados de teste, sem execução no app. Não há credenciais nem biblioteca de episódios no pacote.
|
package/css/app.css
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
*{box-sizing:border-box}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:#10121c;color:#f3f4fa;font-family:Arial,Helvetica,sans-serif}button,input{font:inherit}button{cursor:pointer;color:inherit;border:1px solid #41465d;background:#242a3e;border-radius:10px;padding:14px 20px;min-height:54px;outline:none}button:focus,input:focus{outline:4px solid #b9f36b;outline-offset:3px;background-color:#343e50;color:#fff}button:disabled{opacity:.45}button.primary{background:#b9f36b;color:#111c13;font-weight:bold;border-color:#b9f36b}.hidden{display:none!important}#shell{height:100%;display:flex}aside{width:244px;flex-shrink:0;background:#141824;border-right:1px solid #2a3043;padding:35px 22px;position:relative}.brand{display:flex;align-items:center;margin-bottom:58px;font-size:16px;line-height:1.35;letter-spacing:2px}.brand-mark{display:block;font-size:46px;font-weight:bold;color:#b9f36b;margin-right:13px;letter-spacing:-5px}.brand-mark span{font-size:28px}nav button{width:100%;display:block;text-align:left;border-color:transparent;background:transparent;margin-bottom:14px;padding:17px 12px;font-size:18px}.nav-item.active{color:#b9f36b;background:#252e2b}.sidebar-bottom{position:absolute;bottom:30px;font-size:14px;line-height:1.9;color:#acb5c8}.sidebar-bottom small{font-size:13px}.live-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:#b9f36b;margin-right:7px}main{flex:1;min-width:0;height:100%;overflow-y:auto;padding:26px 44px 70px}header{display:flex;justify-content:space-between;align-items:center;height:60px;color:#b5bfd4;font-size:17px}header button{padding:10px 18px;min-height:46px;font-size:16px}#status{height:32px;font-size:14px;color:#b4becf;padding-top:8px}.hero{border-radius:20px;padding:40px;background:linear-gradient(110deg,#243331,#22263d);margin:20px 0 32px;min-height:250px;position:relative}.hero h1{font-size:42px;line-height:1.12;margin:13px 0 18px;max-width:740px}.hero p{max-width:720px;color:#cad2de;line-height:1.55;font-size:18px;margin:10px 0 24px}.eyebrow{font-size:13px;letter-spacing:2px;color:#b9f36b;font-weight:bold;text-transform:uppercase}.section-title{display:flex;align-items:center;justify-content:space-between;margin:28px 0 18px}.section-title h2{font-size:25px;margin:0}.muted{color:#aab5c8;font-size:16px;line-height:1.5}.grid{display:flex;flex-wrap:wrap;margin:0 -9px}.card{display:block;width:calc(25% - 18px);margin:9px;padding:0;border:1px solid #30384c;background:#1a2030;overflow:hidden;text-align:left;position:relative}.card img{display:block;width:100%;height:160px;object-fit:cover;background:#293146}.card .info{padding:15px;min-height:104px}.card strong{display:block;font-size:18px;line-height:1.3;margin:4px 0 10px}.card small{font-size:14px;color:#bac5d6}.badge{display:inline-block;padding:5px 8px;font-size:12px;background:#2d3a36;color:#d9f3b5;border-radius:5px;margin:0 7px 6px 0}.badge.warn{background:#493d29;color:#ffe1a7}.detail-top{display:flex;margin-top:24px}.poster{width:190px;height:280px;object-fit:cover;border-radius:14px;background:#222c3b;margin-right:30px}.detail-copy{flex:1}.detail-copy h1{font-size:34px;margin:12px 0 16px}.detail-copy p{font-size:17px;line-height:1.5;color:#bec9db;max-width:880px}.actions button{margin:5px 10px 8px 0}.seasons{margin:22px 0 12px}.seasons button{margin:6px 10px 6px 0}.seasons .selected{border-color:#b9f36b;color:#b9f36b}.episodes .card img{height:125px}.episode-heading{font-size:30px;line-height:1.25}.source{padding:22px;background:#1b2233;border:1px solid #343e56;border-radius:12px;margin:15px 0}.source h3{margin:0 0 12px}.source p{line-height:1.5;color:#bdc9da}.source button{margin:6px 10px 0 0}.empty{padding:48px 25px;background:#1b2131;border-radius:15px;margin-top:25px}.empty h2{font-size:28px}.search-input{font-size:25px;width:100%;padding:17px 20px;background:#1b2334;border:1px solid #505c73;border-radius:10px;color:#fff;outline:none;margin:24px 0 15px}.keyboard{max-width:860px;margin:8px 0 28px}.keyboard button{width:58px;min-height:48px;padding:9px;margin:5px;font-size:18px}.keyboard button.wide{width:130px}.setting{padding:25px 0;border-bottom:1px solid #354055;max-width:900px}.setting h3{font-size:23px}.setting button{margin-right:14px}#dialog{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(3,7,15,.9);z-index:50;display:flex;align-items:center;justify-content:center}.dialog-box{background:#222b3f;border:1px solid #4a5873;border-radius:20px;padding:38px;max-width:820px;width:80%;max-height:90%;overflow:auto}.dialog-box h2{font-size:30px}.dialog-box p{font-size:19px;line-height:1.6;color:#d1d9e6}.dialog-box button{margin:8px 12px 8px 0}#player{position:fixed;top:0;right:0;bottom:0;left:0;background:#000;z-index:30}video{width:100%;height:100%;object-fit:contain}#player-hud{position:absolute;bottom:0;left:0;right:0;padding:65px 45px 30px;background:linear-gradient(transparent,rgba(0,0,0,.95));font-size:18px}#player-hud h2{font-size:30px;margin:14px 0}.player-buttons{margin-top:20px}.player-buttons button{margin:5px 10px 0 0;font-size:16px}.timeline{height:5px;background:#515969;margin:20px 0 10px}#progress-bar{height:100%;width:0;background:#b9f36b}#toast{position:fixed;bottom:30px;left:50%;transform:translateX(-50%);background:#e6f6cd;color:#122414;padding:18px 30px;border-radius:10px;z-index:100;font-size:18px;max-width:80%}@media(min-width:1700px){aside{width:280px;padding:45px 28px}main{padding:35px 56px 80px}.hero{padding:55px;min-height:300px}.hero h1{font-size:52px}.card img{height:205px}.card strong{font-size:22px}.card .info{min-height:125px}nav button{font-size:21px}.episodes .card img{height:155px}}@media(max-width:1000px){aside{width:190px;padding:25px 14px}main{padding:20px 25px}.card{width:calc(33.333% - 18px)}.hero h1{font-size:33px}.card img{height:125px}}
|
|
2
|
+
.ranking-grid{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;padding:8px 6px 15px;margin:0 -6px 20px}.ranking-grid .card{flex:0 0 calc(25% - 18px);min-width:200px}.ranking-grid .card img{height:270px;object-fit:cover}.ranking-grid .card .info{min-height:120px}.ranking-grid .badge{font-size:14px;font-weight:bold}@media(max-width:1000px){.ranking-grid .card{flex-basis:calc(33.333% - 18px)}.ranking-grid .card img{height:220px}}
|
|
3
|
+
|
|
4
|
+
video::cue { font-size: 32px; color: #fff; background-color: rgba(0,0,0,.75); }
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# AniStream — integração 0.3.0
|
|
2
|
+
|
|
3
|
+
Verificado em 9 de novembro de 2026. Esta versão passa a usar o AniStream como fonte principal após o vínculo da conta. O código não contém senha de usuário.
|
|
4
|
+
|
|
5
|
+
## Autenticação comprovada
|
|
6
|
+
|
|
7
|
+
O vínculo foi realizado pelo Quick Connect oficial: o app pediu um código ao servidor, o usuário autorizou o aparelho em [Benefícios do AniStream](https://anistream.biz/benefits), e o servidor entregou um token para esse cliente. A conta exibiu Premium ativo após a assinatura feita pelo próprio usuário. O agente não realizou pagamento nem alterou o plano.
|
|
8
|
+
|
|
9
|
+
O servidor informou Quick Connect habilitado. O fluxo segue a [documentação oficial Jellyfin](https://kotlin-sdk.jellyfin.org/guide/authentication.html): iniciar, consultar a autorização em intervalos de cinco segundos e trocar o segredo temporário por uma sessão. O segredo de pareamento fica somente na memória do serviço e não acompanha o código de seis números mostrado na tela.
|
|
10
|
+
|
|
11
|
+
O app salva token, ID do usuário, identificador do aparelho e nome de perfil no armazenamento desse cliente. Ao abrir a raiz da prévia novamente, a sessão foi validada e o catálogo apareceu sem senha ou novo código. Isso foi observado no navegador, não apenas simulado.
|
|
12
|
+
|
|
13
|
+
Esse token não é um refresh-token. O app o reutiliza enquanto for válido; uma revogação/expiração HTTP401 exige novo vínculo. HTTP403 ou falha de rede não apagam a sessão. A opção de senha do perfil existe, mas as tentativas reais feitas durante a implementação foram recusadas; **Quick Connect é o caminho validado**.
|
|
14
|
+
|
|
15
|
+
## Idiomas e temporadas
|
|
16
|
+
|
|
17
|
+
O catálogo consulta as rotas atuais de itens da API usada pelo próprio frontend do AniStream. Cada temporada é carregada sob demanda. Só aparecem episódios com pelo menos um arquivo que tenha faixa japonesa e legenda portuguesa de texto identificadas pelos metadados.
|
|
18
|
+
|
|
19
|
+
Na seleção, PT-BR explícito tem prioridade; Português sem variante é indicado como tal. PT-PT explícito, faixas forçadas e legendas apenas de placas/músicas não substituem uma legenda de diálogos. Legendas de imagem, como PGS, não são convertidas por OCR nem anunciadas como texto compatível.
|
|
20
|
+
|
|
21
|
+
No teste real de **86 EIGHTY-SIX**, a temporada listou 23 episódios elegíveis. O episódio 1 ofereceu origem 1080p, áudio japonês e uma legenda portuguesa SRT. Não foi feita auditoria auditiva de todo o episódio nem confirmação regional de que a faixa marcada genericamente como Português é PT-BR. A confirmação de idioma pelo usuário continua opcional e vale somente para o episódio conferido.
|
|
22
|
+
|
|
23
|
+
## Vídeo e legendas
|
|
24
|
+
|
|
25
|
+
O cliente solicita HLS H.264/AAC com alta capacidade de bitrate e permite copiar vídeo/áudio quando a origem puder fazê-lo. A ponte encaminha mídia, sem recodificar. A origem pode remuxar ou transcodificar conforme seus recursos; não se promete ausência de transcodificação para qualquer arquivo, nem qualidade 4K inexistente.
|
|
26
|
+
|
|
27
|
+
Legendas são pedidas no formato suportado pelo endpoint oficial — JSON para SubRip/SRT, ASS/SSA original quando aplicável, ou WebVTT — e convertidas em WebVTT na ponte. Não há execução de JavaScript recebido. Texto, acentos e tempos são preservados; efeitos, desenhos, fontes e posicionamento complexo de ASS têm limitações nessa conversão.
|
|
28
|
+
|
|
29
|
+
A resposta de teste tinha muitas entradas repetidas. O primeiro limite de 4 MB era insuficiente; a leitura final é limitada a 16 MB, com até 50 mil eventos JSON. Entradas de texto idêntico com tempos sobrepostos são unidas, sem juntar reaparições separadas. Na amostra, isso reduziu 37.817 cues de saída para **985**, com **44.903 bytes** de WebVTT. O resultado convertido fica em memória durante o ticket, evitando extração repetida, e é descartado ao encerrar a reprodução ou expirar.
|
|
30
|
+
|
|
31
|
+
O vídeo aguarda o carregamento da legenda. Falha ou demora de carregamento pausa a reprodução e avisa. WebVTT aparece na posição usual durante o vídeo e sobe quando os controles ficam visíveis.
|
|
32
|
+
|
|
33
|
+
## Evidência real no computador
|
|
34
|
+
|
|
35
|
+
- Quick Connect autorizado no site oficial, seguido de catálogo autenticado na prévia.
|
|
36
|
+
- Reabertura da página com restauração da sessão, sem nova entrada.
|
|
37
|
+
- Busca por 86, carregamento das temporadas e 23 episódios com as faixas requeridas.
|
|
38
|
+
- Vídeo do episódio 1 decodificado no Opera em **1920×1080**, duração informada de aproximadamente 23:41, e reprodução progredindo por mais de sete minutos.
|
|
39
|
+
- Legenda portuguesa visível no próprio player. A captura `evidence/anistream-fullhd-0.3.0.jpg` mostra simultaneamente o episódio, a dimensão efetiva e o texto da legenda.
|
|
40
|
+
- Pausa em 421,150 segundos, avanço até 431,150 segundos e retomada, mantendo vídeo 1080p e recurso de legenda carregado.
|
|
41
|
+
- Consulta adicional de Tokyo Revengers: 56 episódios elegíveis, organizados pela própria fonte em uma única temporada. O episódio 56 informou origem 1080p, japonês e legenda portuguesa, aproximadamente 4,84 Mb/s; sua reprodução não foi testada. Não foi inferida uma divisão canônica de temporadas diferente da numeração da fonte.
|
|
42
|
+
- Métricas de WebVTT em `evidence/anistream-subtitle-metrics-0.3.0.json`; nenhum texto completo de legenda, senha, token ou URL de mídia da conta foi incluído nesse relatório.
|
|
43
|
+
|
|
44
|
+
As propriedades de mídia expostas pela ferramenta de navegador não forneceram contadores de bytes de áudio. O áudio japonês foi selecionado pelo índice da faixa e solicitado ao servidor; isso não é uma declaração de auditoria auditiva independente. A captura prova a legenda portuguesa visível e as dimensões efetivas naquele teste.
|
|
45
|
+
|
|
46
|
+
## Testes automatizados
|
|
47
|
+
|
|
48
|
+
**72 verificações aprovadas**, divididas em 47 gerais e 25 de AniStream. As suítes usam rede/mídia simuladas para testar: ECMAScript 5 de todos os arquivos de execução, autenticação e Quick Connect, persistência e quota, preservação de dados de outros módulos, HTTP401/403, seleção de faixas, ocultação de episódios, validação de IDs/hosts, conversão/deduplicação, URLs locais sem token upstream, espera pela legenda, falha segura e limpeza do player.
|
|
49
|
+
|
|
50
|
+
As duas suítes e as evidências reais são distintas. `npm test` executa ambas. O arquivo único do serviço é gerado de todos os módulos e a correspondência é validada por teste.
|
|
51
|
+
|
|
52
|
+
## Armazenamento e instalação
|
|
53
|
+
|
|
54
|
+
A sessão está no navegador/aparelho que fez o vínculo, não no pacote. Na TV, será necessário autorizar um novo código uma vez. Não copie o token do computador nem publique credenciais.
|
|
55
|
+
|
|
56
|
+
O TizenBrew compartilha armazenamento entre módulos: o prefixo evita colisões, mas não fornece isolamento ou criptografia contra outro módulo da mesma origem. O app não executa limpeza global. Se faltar quota, avisa que a sessão não ficou persistente.
|
|
57
|
+
|
|
58
|
+
Os destinos são restritos a HTTPS do serviço AniStream; a origem autentica cada pedido. O player recebe somente tickets locais temporários. Parâmetros de autenticação exigidos pela API de mídia ficam na ponte, sem aparecer no manifesto local ou nos endereços das imagens/legendas entregues à interface. TLS não é desativado.
|
|
59
|
+
|
|
60
|
+
**Nenhum teste foi feito na Samsung UN55MU7500.** Permanecem pendentes de teste físico o HLS nativo/MSE, WebVTT, áudio, TLS, memória/desempenho e retorno após abrir YouTube. Não foi comprovada reprodução 4K nesta entrega. Não houve publicação no GitHub nem instalação na TV.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Animes Brasil TV
|
|
2
|
+
|
|
3
|
+
Cliente independente, criado do zero para Samsung Tizen 3.0 / Chromium 47. Fontes: **Animes Brasil e TopAnimes**. Não é aplicativo oficial, não herda o código do Anime-TV anterior e não modifica Cinefy ou StremioK.
|
|
4
|
+
|
|
5
|
+
## Entrega 0.2.0
|
|
6
|
+
|
|
7
|
+
- **Full HD comprovado no computador:** busca extra genérica no TopAnimes, HLS H.264/AAC, dimensões medidas nos bytes do vídeo e reprodução efetiva em 1920×1080 no Edge.
|
|
8
|
+
- Busca nos dois catálogos e botão **Buscar outras fontes (1080p+)** dentro da ficha e do episódio. A tela do episódio do Animes Brasil consulta automaticamente a fonte extra e junta os formatos quando título, temporada e número coincidem sem ambiguidade.
|
|
9
|
+
- A fonte original de maior qualidade é preservada. Fontes são ordenadas por resolução e bitrate; não há conversão para 720p, recodificação ou confirmação extra antes de reproduzir.
|
|
10
|
+
- **Limites:** nove de 17 episódios públicos da amostra retornaram 1080p pelo novo adaptador. Não há garantia de Full HD em todo o catálogo nem fonte 4K comprovada. AniStream reproduziu 1080p na sessão do navegador, mas **ainda não está integrado ao aplicativo**. Não há teste na Samsung.
|
|
11
|
+
- Pesquisa, fontes, alternativas e evidências: [PESQUISA-QUALIDADE-0.2.0.md](docs/PESQUISA-QUALIDADE-0.2.0.md).
|
|
12
|
+
|
|
13
|
+
- Interface PT-BR para controle remoto, busca com teclado na tela, temporadas, favoritos e continuar assistindo.
|
|
14
|
+
- Início com **Top 10 da semana** e **Top animes**, nas listas e ordem publicadas pela fonte, além dos últimos episódios. As duas fileiras permitem navegação horizontal por setas. Cards do ranking marcados como dublados abrem a busca pelo título sem o sufixo de dublagem, para escolher a edição legendada; a posição original não é renumerada.
|
|
15
|
+
- Consulta nova ao abrir, pesquisar e retornar do estado minimizado. Botões de atualização na ficha e no episódio.
|
|
16
|
+
- Histórico identifica o caminho exato do episódio; não mistura episódios de temporadas diferentes.
|
|
17
|
+
- Respostas antigas de consultas canceladas não substituem a tela atual.
|
|
18
|
+
- HTML da fonte é tratado como dados. Nenhum script, iframe publicitário, OneSignal ou biblioteca do site é executado.
|
|
19
|
+
- Integração de **Blogger**: formatos MP4 progressivos com vídeo H.264 e áudio AAC. MP4 direto da CDN `hugh.cdn.rumble.cloud` também é examinado por leituras parciais do arquivo. No TopAnimes, HLS público em CDNs conhecidas é validado por leitura de PAT/PMT/SPS de dois segmentos, sem executar scripts da fonte. Outros players não recebem botões de reprodução. Não é um extrator universal.
|
|
20
|
+
- Resolução informada pelo player separada da dimensão efetiva decodificada. As fontes mostram resolução, origem e compatibilidade; escolher uma fonte abre o vídeo diretamente, sem uma segunda confirmação.
|
|
21
|
+
- O site indica versões legendadas, mas não comprova as duas línguas por faixas. Isso é indicado na lista sem bloquear o vídeo. “Confirmar idioma” registra a conferência opcional do usuário **apenas para aquele episódio**.
|
|
22
|
+
|
|
23
|
+
## Resultados anteriores na fonte Animes Brasil
|
|
24
|
+
|
|
25
|
+
Na amostra de Tokyo Revengers T4 E6, o Blogger ofereceu **720p e 360p**, sem formato 1080p progressivo com áudio. O vídeo foi realmente reproduzido no Edge do computador em **1280×720**. A resolução não comprova nitidez nativa nem ausência de upscale. O aplicativo não transforma 720p em 1080p e esta fonte ainda **não atende a preferência de 1080p nesse episódio**.
|
|
26
|
+
|
|
27
|
+
Não foi realizado teste na Samsung. ES5 validado não garante codecs, TLS ou desempenho do serviço na TV. As evidências em `evidence/` distinguem simulação e reprodução efetiva no computador.
|
|
28
|
+
|
|
29
|
+
### Correção 0.1.1: opção FULL HD do site
|
|
30
|
+
|
|
31
|
+
O adaptador anterior ignorava MP4 direto e só resolvia Blogger. No episódio **Dragon Ball Super: Beerus T1 E5**, o botão do site chamado **FULL HD** aponta para um MP4 cujas trilhas informam **1280×720, H.264 e áudio Opus**. O Edge também leu 1280×720 efetivos desse arquivo. A versão HD do Blogger fornece H.264/AAC em 720p e 360p. A 0.1.1 examinava o original, mas o excluía da seleção por causa do áudio. Evidência: `evidence/dragon-live-0.1.1.json`.
|
|
32
|
+
|
|
33
|
+
### Correção 0.1.2: preservar a imagem da fonte original
|
|
34
|
+
|
|
35
|
+
A resolução igual não significa qualidade igual. A comparação do mesmo quadro em 120 segundos, decodificado em 1280×720 nas duas fontes, identifica duas versões diferentes. O arquivo original do site tem taxa média total estimada em **6,54 Mb/s**; o formato 720p do Blogger informa aproximadamente **2,17 Mb/s**. O bitrate sozinho não mede qualidade perceptiva, mas a escolha do Blogger descartava a fonte de imagem usada pelo player FULL HD do site.
|
|
36
|
+
|
|
37
|
+
A 0.1.2 passou a oferecer **FULL HD · original do site**, preservando os bytes recebidos, sem recodificar. A opção com Opus é rotulada para teste manual: pode ser comparada no computador, mas imagem e som na Samsung não foram testados. Ela não é declarada H.264/AAC compatível e uma falha não troca silenciosamente para Blogger. A partir da 0.1.3, escolher essa fonte inicia o vídeo diretamente, sem confirmação extra.
|
|
38
|
+
|
|
39
|
+
Capturas de comparação: `evidence/comparison-site-original-120s.png` e `evidence/comparison-app-blogger-120s.png`. Resultados: `evidence/quality-comparison.json` e `evidence/original-verification-0.1.2.json`. Somente a TV poderá confirmar o funcionamento de áudio Opus neste aparelho; a especificação Samsung 2017 não lista Opus: https://developer.samsung.com/smarttv/develop/specifications/media-specifications/2017-tv-video-specifications.html.
|
|
40
|
+
|
|
41
|
+
## Instalar pelo TizenBrew
|
|
42
|
+
|
|
43
|
+
Na 0.1.3, a pedido do usuário, foram removidas as confirmações adicionais de qualidade, codec e idioma ao escolher uma fonte ou trocar a qualidade. Não há reprodução automática ao abrir o episódio: o usuário escolhe uma fonte e ela inicia diretamente. Falhas continuam sendo apresentadas e não provocam troca silenciosa de fonte.
|
|
44
|
+
|
|
45
|
+
Esta entrega está em um repositório Git local separado. **Ainda não foi publicada.**
|
|
46
|
+
|
|
47
|
+
Depois da publicação autorizada de todos os arquivos de execução em um novo repositório público:
|
|
48
|
+
|
|
49
|
+
1. Abra TizenBrew → Gerenciador de módulos → Adicionar módulo GitHub.
|
|
50
|
+
2. Informe `SEU-USUARIO/AnimesBrasil-TV@main` no campo de módulo GitHub (sem `gh/`).
|
|
51
|
+
3. Abra **Animes Brasil TV**. O manifesto inicia `service/index.js` no próprio serviço Node do TizenBrew.
|
|
52
|
+
4. Se o serviço não responder, feche e abra o TizenBrew. Não é necessário deixar o computador ligado.
|
|
53
|
+
5. Confira **v0.2.0** na barra lateral. O cache do CDN pode atrasar atualizações de `@main`; arquivos JS/CSS também possuem versão na URL. Alterações no serviço podem exigir reiniciar o TizenBrew.
|
|
54
|
+
|
|
55
|
+
O endereço de repositório acima é um modelo de instalação, não uma publicação existente. Não substitua o módulo original do StremioK ou do Cinefy.
|
|
56
|
+
|
|
57
|
+
## Prévia local
|
|
58
|
+
|
|
59
|
+
Requer Node.js instalado no computador (somente desenvolvimento):
|
|
60
|
+
|
|
61
|
+
```powershell
|
|
62
|
+
node tools/dev.cjs
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Abra **http://127.0.0.1:8128**. O servidor de prévia e a ponte de origem escutam somente no próprio computador. `localhost` na TV apontaria para a TV, portanto essa URL não é uma instalação na televisão.
|
|
66
|
+
|
|
67
|
+
## Validações
|
|
68
|
+
|
|
69
|
+
```powershell
|
|
70
|
+
$env:ABTV_TEST_TOOLS = 'CAMINHO\node_modules'
|
|
71
|
+
node tests/run.cjs
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Ferramentas de teste: Acorn 8.19.0 e jsdom 26.1.0, somente no computador. Alternativamente, instale as dependências de desenvolvimento com `npm install --ignore-scripts` na pasta do projeto e execute `npm test`, sem definir ABTV_TEST_TOOLS. O código executado na TV não tem dependências npm; hls.js está incluído localmente. Testes cobrem ES5, parsers de HTML, correspondência entre fontes, IDs/temporadas, SPS H.264, manifestos, descarte de respostas antigas, restrições de origem, ausência de scripts externos, reprodução direta sem confirmação extra, armazenamento cheio e ciclo de vida do player. A reprodução real no computador está documentada separadamente dos testes simulados.
|
|
75
|
+
|
|
76
|
+
Ao alterar o serviço, edite `service/runtime.js`, `service/media-probe.js` e/ou `js/top-provider.js`, depois execute `node tools/build-service.cjs`. O resultado `service/index.js` reúne todos os módulos em um arquivo, como necessário para carregamento pelo TizenBrew.
|
|
77
|
+
|
|
78
|
+
## Armazenamento e segurança
|
|
79
|
+
|
|
80
|
+
- Somente chaves **abtv.v1.***, sem `localStorage.clear()`. Histórico limitado a 30 episódios, favoritos a 100, cache inicial a 48 cards.
|
|
81
|
+
- Quota excedida mantém mudanças em memória na sessão e avisa o usuário. O armazenamento do TizenBrew continua compartilhado; os prefixos não são uma barreira de segurança.
|
|
82
|
+
- Ponte local **127.0.0.1:8238**, separada das portas dos outros projetos.
|
|
83
|
+
- A ponte consulta apenas rotas públicas de animesbrasil.app e topanimes.net, players públicos integrados e CDNs de mídia explicitamente permitidas. Não recebe URLs arbitrárias do navegador. HLS é encaminhado sem recodificação; cabeçalhos de imagem antes do MPEG-TS são retirados, preservando o vídeo.
|
|
84
|
+
- Vídeos passam por tickets temporários e suporte a HTTP Range. Tokens assinados não são persistidos em arquivos nem registrados em logs.
|
|
85
|
+
- TLS permanece validado. Não contorna CAPTCHA, login, DRM, assinatura ou bloqueios de acesso. Erros de origem são apresentados sem tentar contornar proteções.
|
|
86
|
+
- Os anúncios carregados por scripts de páginas não são executados. Anúncios incorporados ao vídeo não podem ser removidos por essa abordagem.
|
|
87
|
+
|
|
88
|
+
## Primeiro teste na TV
|
|
89
|
+
|
|
90
|
+
1. Abrir, buscar Dragon Ball Super Beerus e abrir o episódio 5 na ficha Animes Brasil.
|
|
91
|
+
2. Aguardar a busca adicional e conferir a opção TopAnimes 1080p. Depois buscar outros títulos; conferir também Tokyo Revengers e a separação de temporadas.
|
|
92
|
+
3. Escolher a fonte desejada. O vídeo abre diretamente; conferir áudio, legenda, imagem e som.
|
|
93
|
+
4. Pausar, avançar 10 segundos, sair e retomar; conferir o episódio e o progresso.
|
|
94
|
+
5. Abrir YouTube e retornar: catálogo atualizado sem reinicialização forçada; vídeo ativo não é trocado por atualização automática.
|
|
95
|
+
6. Conferir Minha lista e dados do Cinefy/StremioK. Reportar erros e a versão exibida.
|
|
96
|
+
|
|
97
|
+
## Direitos
|
|
98
|
+
|
|
99
|
+
O código novo está sob MIT. hls.js 1.6.13 está sob Apache-2.0; avisos e licenças ficam em `js/vendor/`. Catálogo, imagens e vídeos pertencem aos respectivos titulares e não estão incluídos como biblioteca de mídia. As capturas HTML em `tests/fixtures` são dados de teste, sem execução dos scripts contidos nelas. O pequeno trecho TS serve apenas para verificar a leitura de metadados. O aplicativo não garante disponibilidade nem autorização de distribuição dos conteúdos da fonte.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Pesquisa e implementação de qualidade — 0.2.0
|
|
2
|
+
|
|
3
|
+
Verificação em 9 de novembro de 2026. O resultado entregue é uma integração genérica do TopAnimes, mantendo Animes Brasil. O AniStream também foi avaliado com a sessão que já estava aberta no navegador do usuário. Nenhuma senha, cookie ou credencial dessa sessão foi copiada para o projeto.
|
|
4
|
+
|
|
5
|
+
## Decisão e alcance
|
|
6
|
+
|
|
7
|
+
**TopAnimes foi integrado para ampliar a oferta de 1080p agora**, sem exigir conta. A busca consulta ambos os catálogos. Dentro de um episódio do Animes Brasil, uma consulta adicional procura título exato e episódio compatível na fonte extra. Havendo correspondência única de título, temporada e número, os formatos se juntam na mesma tela, em ordem de resolução e bitrate. Não há nomes de animes fixados no código de produção.
|
|
8
|
+
|
|
9
|
+
Se as temporadas forem organizadas de formas diferentes, o aplicativo não adivinha a equivalência. O botão **Buscar outras fontes (1080p+)** permite abrir a ficha da outra fonte e escolher o episódio por sua própria numeração. Identificadores de episódios, favoritos e progresso continuam separados por origem.
|
|
10
|
+
|
|
11
|
+
**Isso não garante 1080p para todos os episódios.** Em 17 episódios públicos examinados, o adaptador verificou 1080p em nove; oito usam players ainda não integrados. Foram incluídos títulos antigos, recentes, temporadas iniciais e posteriores. A disponibilidade muda com as fontes. O resultado atende à consulta genérica do catálogo, mas não à promessa de cobertura integral em Full HD.
|
|
12
|
+
|
|
13
|
+
**Não foi comprovada uma fonte 4K nesta pesquisa.** O aplicativo ordena 1440p/2160p acima de 1080p caso encontre um formato verificável compatível; não oferece uma qualidade que a origem não entregou. Dimensões de 1920×1080 não comprovam resolução de produção nativa, ausência de upscale ou qualidade perceptiva superior em todas as cenas.
|
|
14
|
+
|
|
15
|
+
## Comparação de alternativas
|
|
16
|
+
|
|
17
|
+
| Fonte | Evidência observada | Decisão |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| [Animes Brasil](https://animesbrasil.app) | No episódio Dragon Ball Super: Beerus E5, o botão FULL HD usa MP4 1280×720 H.264/Opus, com imagem diferente e maior bitrate que o Blogger 720p. | Mantido, inclusive seu arquivo original. Não renomear 720p como 1080p. |
|
|
20
|
+
| [TopAnimes](https://topanimes.net/) | HLS público H.264/AAC 1920×1080 medido em segmentos de nove episódios; outros players do catálogo não foram integrados. | Adaptador implementado; maior ganho comprovado sem cadastro nesta rodada. |
|
|
21
|
+
| [AniStream](https://anistream.biz/library) | A biblioteca exibiu 1.175 títulos. Em 86 EIGHTY-SIX T1 E1, reprodução real no navegador em 1920×1080; interface informou H.264, AAC japonês e opções de legenda Português ASS. | Candidato promissor para ampliar cobertura. **Ainda não integrado ao cliente de TV.** |
|
|
22
|
+
| [AnimesFHD](https://animesfhd.net) | Site público acessível; o nome da plataforma não comprova dimensões dos arquivos. Não foi comprovada nesta rodada uma alternativa reproduzível melhor que o HLS integrado. | Não selecionado como fonte de Full HD garantido. |
|
|
23
|
+
| [AnimesIce](https://animesice.app) | Catálogo público acessível, frontend moderno. Não foi concluída validação de um fluxo de mídia para Chromium 47. | Não integrado; não declarar qualidade ou compatibilidade sem medição. |
|
|
24
|
+
| [AnimeSaga](https://animesaga.net/languages/portuguese) | Consulta pública retornou HTTP 403 no ambiente de pesquisa. | Não contornar bloqueio nem assumir cobertura. |
|
|
25
|
+
|
|
26
|
+
### AniStream: o que o acesso permitiu confirmar
|
|
27
|
+
|
|
28
|
+
Foi usada somente a sessão já conectada. O player inicialmente exibiu erro transitório, depois reproduziu normalmente. Aos 38 segundos, a propriedade do vídeo informou **1920×1080, readyState 4 e reprodução ativa**. A tela Dados de Reprodução informou H.264 High/SDR/yuv420p, AAC japonês estéreo a 48 kHz e aproximadamente 0,19 Mb/s, arquivo MKV com bitrate total informado de 2,81 Mb/s e reprodução HLS com transcodificação. São dados do player e do navegador; não medi separadamente os segmentos desse serviço nem determinei o tipo exato de transcodificação.
|
|
29
|
+
|
|
30
|
+
O menu de qualidade desse episódio ofereceu apenas 1080p H264; **não 4K**. O menu de legendas ofereceu Português ASS; a variante PT-BR não foi identificada explicitamente por código de idioma. Não foi feita auditoria de toda a biblioteca nem teste desse serviço na TV.
|
|
31
|
+
|
|
32
|
+
O frontend público usa login com validação Turnstile e uma autenticação adicional para o serviço de mídia. A senha sozinha não substitui esse fluxo. Copiar a sessão do navegador para o app criaria dependência temporária de credenciais e não constituiria integração estável. Por isso o pacote não contém login improvisado nem a conta do usuário. A integração AniStream exige implementar o fluxo normal de autenticação, expiração e legendas compatível com a TV; permanece trabalho pendente, sem contornar CAPTCHA, assinatura ou permissões.
|
|
33
|
+
|
|
34
|
+
## Amostra de mídia do TopAnimes
|
|
35
|
+
|
|
36
|
+
Todos os resultados positivos abaixo foram obtidos por leitura dos bytes do vídeo: PAT/PMT do MPEG-TS identificam H.264/AAC; o SPS H.264 fornece dimensões. Foram examinados o primeiro segmento e outro segmento posterior, com dimensões e codecs coincidentes. Não dependem do selo FHD no site.
|
|
37
|
+
|
|
38
|
+
| Série / episódio | Resultado do adaptador |
|
|
39
|
+
|---|---|
|
|
40
|
+
| Dragon Ball Super: Beerus E1 | Player externo ainda não integrado |
|
|
41
|
+
| Dragon Ball Super: Beerus E5 | **1920×1080, H.264/AAC** |
|
|
42
|
+
| Sousou no Frieren E1 e E28 | Player externo ainda não integrado |
|
|
43
|
+
| Naruto E1 e E220 | Player externo ainda não integrado |
|
|
44
|
+
| One Piece E1 | Player externo ainda não integrado |
|
|
45
|
+
| One Piece E1180 | **1920×1080, H.264/AAC** |
|
|
46
|
+
| Kimetsu no Yaiba E1 e E26 | Players externos ainda não integrados |
|
|
47
|
+
| Kanojo no Tomodachi E6 | **1920×1080, H.264/AAC** |
|
|
48
|
+
| Tensei Kizoku, Kantei Skill de Nariagaru 3 E7 | **1920×1080, H.264/AAC** |
|
|
49
|
+
| Kanata kara E6 | **1920×1080, H.264/AAC** |
|
|
50
|
+
| Hotel Inhumans 2 E6 | **1920×1080, H.264/AAC** |
|
|
51
|
+
| Tank Chair E6 | **1920×1080, H.264/AAC** |
|
|
52
|
+
| Ao no Hako 2 E5 | **1920×1080, H.264/AAC** |
|
|
53
|
+
| Ao Ashi 2 E6 | **1920×1080, H.264/AAC** |
|
|
54
|
+
|
|
55
|
+
Os JSON completos estão em `evidence/research-quality-0.2.0.json` e `evidence/research-current-0.2.0.json`. Bitrates HLS registrados são estimativas do primeiro segmento, não médias do episódio. Não comparar diretamente esses valores com a média de um MP4 inteiro.
|
|
56
|
+
|
|
57
|
+
## Implementação e compatibilidade
|
|
58
|
+
|
|
59
|
+
- HLS da fonte é entregue pela ponte local, sem recodificar o vídeo ou reduzir a resolução. Alguns segmentos possuem um cabeçalho de imagem antes do MPEG-TS; a ponte remove apenas esse prefixo e preserva os bytes TS.
|
|
60
|
+
- Somente hosts HTTPS conhecidos são aceitos, inclusive redirecionamentos observados das CDNs. URLs arbitrárias, credenciais em URL, hosts locais e portas diferentes são rejeitados.
|
|
61
|
+
- A consulta ao player usa a ação normal pública do próprio site. Nenhum script, iframe, anúncio ou protetor externo é executado pelo app. Players não integrados não ganham botão de reprodução.
|
|
62
|
+
- Manifestos criptografados, HEVC e formatos sem validação de dimensões não são anunciados como compatíveis. Não houve implementação de quebra de DRM ou acesso privado.
|
|
63
|
+
- HLS nativo é tentado quando o elemento de vídeo declara suporte. Caso contrário, usa-se [hls.js 1.6.13](https://github.com/video-dev/hls.js/tree/v1.6.13) com MSE, sem worker e com limites de buffer. A biblioteca e todo JavaScript executado na TV passaram pelo parser ECMAScript 5; suas licenças estão em `js/vendor/`.
|
|
64
|
+
- O perfil examina H.264 de 8 bits e chroma 4:2:0 com áudio AAC. A [especificação Samsung 2017](https://developer.samsung.com/smarttv/develop/specifications/media-specifications/2017-tv-video-specifications.html) é a referência de codecs. Ela não substitui teste na UN55MU7500, nem garante o comportamento de HLS pelo elemento HTML5 dentro do TizenBrew.
|
|
65
|
+
- Preservados PT-BR, Top 10 semanal, Top animes, atualização ao retornar ao app, controles remotos, favoritos e histórico. Sem limpeza global do armazenamento compartilhado do TizenBrew.
|
|
66
|
+
|
|
67
|
+
## Evidências e limites dos testes
|
|
68
|
+
|
|
69
|
+
1. **45 verificações automatizadas aprovadas**: ES5 de frontend, vendor e serviço, parsers, separação de episódios, correspondência conservadora, leitura de SPS, CDNs, rejeição de manifestos não suportados, armazenamento cheio, ciclo de vida do HLS e fluxos da interface. Testes de interface isolados usam rede e mídia simuladas.
|
|
70
|
+
2. **Reprodução real no Edge do computador**: busca pelo título → episódio original do Animes Brasil → alternativa TopAnimes encontrada automaticamente → vídeo 1920×1080 efetivo, com contadores de áudio e vídeo decodificados maiores que zero. Pausa e retomada após avanço até 125 segundos funcionaram; a reprodução progrediu além de 127 segundos.
|
|
71
|
+
3. Navegação por seta para Buscar outras fontes e abertura do catálogo TopAnimes com cinco episódios verificadas. Capturas em 1920×1080 e 1280×720.
|
|
72
|
+
4. Dados em `evidence/live-fullhd-0.2.0.json`, `evidence/tests.json` e capturas correspondentes. Sem cookies, senhas ou URLs temporárias de mídia nos relatórios.
|
|
73
|
+
|
|
74
|
+
**Nenhum teste foi feito na televisão.** Permanecem dependentes de teste real: HLS nativo/MSE, áudio e legenda, desempenho do serviço Node no TizenBrew, TLS, troca com YouTube e continuidade após longos períodos suspenso. A cobertura integral do catálogo em 1080p e a integração AniStream não estão concluídas. Não há fonte 4K comprovada nesta entrega.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
Instalação alternativa pelo npm: no TizenBrew, escolha Adicionar módulo → npm e digite `anihub-tv@0.3.1`. Esta distribuição não depende do acesso público ao repositório GitHub.
|
|
2
|
+
|
|
3
|
+
# Primeiro teste do AniHub na TV
|
|
4
|
+
|
|
5
|
+
Versão inicial para este teste: **0.3.1**. Aparelho alvo: Samsung UN55MU7500, Tizen 3.0. Ainda não há resultado de teste físico registrado.
|
|
6
|
+
|
|
7
|
+
## Instalação
|
|
8
|
+
|
|
9
|
+
1. Abra TizenBrew → Gerenciador de módulos → Adicionar módulo → GitHub.
|
|
10
|
+
2. Digite **srwayne15-bot/AniHub@main**, sem `gh/` no campo GitHub.
|
|
11
|
+
3. Confirme e abra **AniHub**. Não remova Anime-TV, Cinefy ou StremioK.
|
|
12
|
+
4. Confira **v0.3.1** na lateral. Se o serviço não responder, feche e reabra o TizenBrew. Não limpe seus dados.
|
|
13
|
+
|
|
14
|
+
O caminho `gh/srwayne15-bot/AniHub@main` é a forma interna usada pelo CDN/TizenBrew; o campo de módulo GitHub acrescenta o prefixo. Se sua versão do gerenciador tiver um único campo genérico, confira o exemplo mostrado por ela antes de inserir o identificador.
|
|
15
|
+
|
|
16
|
+
## Conectar AniStream
|
|
17
|
+
|
|
18
|
+
1. No AniHub da TV: **Conta AniStream → Vincular por código Quick Connect**.
|
|
19
|
+
2. No celular/computador: [AniStream → Benefícios](https://anistream.biz/benefits) → Quick Connect.
|
|
20
|
+
3. Digite os seis números da TV e autorize esse aparelho. O código vale por cinco minutos.
|
|
21
|
+
4. Aguarde o catálogo AniStream. O token fica nessa TV, sem senha no pacote.
|
|
22
|
+
|
|
23
|
+
O vínculo já realizado no computador não instala nem transfere a sessão para a TV. Depois da primeira vinculação nessa TV, o app reutiliza a sessão enquanto o servidor permitir.
|
|
24
|
+
|
|
25
|
+
## Ordem do teste
|
|
26
|
+
|
|
27
|
+
1. **Abertura e controle:** navegue por setas e Enter, abra a busca e digite `86`.
|
|
28
|
+
2. **Episódios:** abra 86 EIGHTY-SIX → temporada → episódio 1. Confira a fonte 1080p com japonês e legenda portuguesa.
|
|
29
|
+
3. **Reprodução:** escolha Assistir em 1080p. Aguarde a legenda carregar; confira imagem, voz japonesa e texto em português. O player deve informar a dimensão efetiva; o esperado para essa amostra é 1920×1080.
|
|
30
|
+
4. **Controles:** pausar, avançar 10 segundos, continuar e voltar. Conferir se a legenda acompanha.
|
|
31
|
+
5. **Sessão:** saia e abra novamente. O catálogo AniStream deve retornar sem novo código.
|
|
32
|
+
6. **Retorno de outro app:** abra YouTube e depois AniHub; confira a atualização das telas e o botão Atualizar fontes dentro do episódio.
|
|
33
|
+
|
|
34
|
+
Tokyo Revengers também foi consultado no computador: a fonte organiza 56 episódios sob uma temporada; o episódio 56 informou 1080p, japonês e legenda portuguesa. Não se deve presumir que essa numeração seja a divisão canônica de outras fontes.
|
|
35
|
+
|
|
36
|
+
## Se algo falhar
|
|
37
|
+
|
|
38
|
+
Informe **em qual etapa**, a mensagem exibida e se houve **imagem, som e legenda**. Uma foto da tela ajuda; não inclua senha nem token. Não faça reinicialização forçada ou limpeza global de dados antes de relatar o resultado.
|
|
39
|
+
|
|
40
|
+
Os 73 testes automatizados e a reprodução real no computador não substituem este teste. O carregamento do serviço foi simulado no contrato de VM do TizenBrew, mas não houve execução em Node 4 nativo nem na TV. HLS, WebVTT, TLS, memória e codecs dependem dessa verificação física.
|
package/index.html
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="theme-color" content="#10121c"><title>AniHub</title><link rel="stylesheet" href="css/app.css?v=0.3.1"></head>
|
|
3
|
+
<body><div id="shell">
|
|
4
|
+
<aside><div class="brand"><span class="brand-mark">A<span>+</span></span><strong>ANIHUB<br>TV</strong></div><nav id="nav"><button data-action="home" class="nav-item">Início</button><button data-action="search" class="nav-item">Buscar anime</button><button data-action="favorites" class="nav-item">Minha lista</button><button data-action="history" class="nav-item">Continuar assistindo</button><button data-action="account" class="nav-item">Conta AniStream</button><button data-action="settings" class="nav-item">Preferências</button></nav><div class="sidebar-bottom"><span class="live-dot"></span>Cliente independente<br><small>v0.3.1 · Tizen 3.0</small></div></aside>
|
|
5
|
+
<main id="main"><header><span id="breadcrumb">Seu próximo episódio</span><button id="refresh" data-action="refresh">Atualizar agora</button></header><div id="status" role="status" aria-live="polite"></div><section id="content"></section></main>
|
|
6
|
+
</div><div id="dialog" class="hidden" role="dialog" aria-modal="true" aria-labelledby="dialog-title"><div class="dialog-box"><span class="eyebrow">ANIHUB TV</span><h2 id="dialog-title"></h2><p id="dialog-text"></p><div id="dialog-options"></div></div></div>
|
|
7
|
+
<div id="player" class="hidden"><video id="video" preload="metadata"></video><div id="player-hud"><span class="eyebrow" id="player-state">Preparando vídeo</span><h2 id="player-title"></h2><p id="player-quality"></p><div class="timeline"><div id="progress-bar"></div></div><div id="player-time">00:00 / --:--</div><div class="player-buttons"><button data-action="seek-back">−10 s</button><button data-action="play-pause">Pausar / continuar</button><button data-action="seek-forward">+10 s</button><button data-action="quality">Qualidade</button><button data-action="next">Próximo episódio</button><button data-action="close-player">Voltar ao anime</button></div></div></div>
|
|
8
|
+
<div id="toast" class="hidden" role="status"></div>
|
|
9
|
+
<script src="js/top-provider.js?v=0.3.1"></script><script src="js/core.js?v=0.3.1"></script><script src="js/vendor/hls.light.min.js?v=1.6.13"></script><script src="js/ani-client.js?v=0.3.1"></script><script src="js/app.js?v=0.3.1"></script></body></html>
|
package/js/ani-client.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/* Device-local session only. Password is sent once to the local bridge, never saved. ES5. */
|
|
2
|
+
var ABTVAniClient = (function () {
|
|
3
|
+
'use strict';
|
|
4
|
+
var key = 'abtv.v1.anistream-session', deviceKey = 'abtv.v1.anistream-device', preferenceKey = 'abtv.v1.anistream-primary', current = null, primary = false, persistent = false, authLost = function () {};
|
|
5
|
+
try { var saved = JSON.parse(localStorage.getItem(key) || 'null'); if (saved && saved.token && saved.userId && saved.deviceId) { current = saved; persistent = true; } primary = localStorage.getItem(preferenceKey) === 'true'; } catch (ignore) {}
|
|
6
|
+
function device() { var value; try { value = localStorage.getItem(deviceKey); } catch (ignore) {} if (!value) { value = 'abtv-' + Date.now().toString(36) + '-' + Math.random().toString(36).slice(2) + Math.random().toString(36).slice(2); try { localStorage.setItem(deviceKey, value); } catch (ignore2) {} } return value; }
|
|
7
|
+
function setPrimary(value) { primary = value === true; try { localStorage.setItem(preferenceKey, String(primary)); } catch (ignore) {} }
|
|
8
|
+
function save(data) { current = data.session; current.name = data.name; persistent = false; setPrimary(true); try { localStorage.setItem(key, JSON.stringify(current)); persistent = true; } catch (ignore) {} }
|
|
9
|
+
function forget() { current = null; persistent = false; try { localStorage.removeItem(key); } catch (ignore) {} }
|
|
10
|
+
function call(route, path, body, cb) {
|
|
11
|
+
var xhr = new XMLHttpRequest(), ended = false; xhr.open(body === null ? 'GET' : 'POST', 'http://127.0.0.1:8238' + route + '?path=' + encodeURIComponent(path || ''), true); xhr.timeout = 95000; xhr.setRequestHeader('X-ABTV', '1');
|
|
12
|
+
if (current) { xhr.setRequestHeader('X-ABTV-Ani', JSON.stringify({ token: current.token, userId: current.userId, deviceId: current.deviceId })); }
|
|
13
|
+
if (body !== null) { xhr.setRequestHeader('Content-Type', 'application/json'); }
|
|
14
|
+
function finish(e, d) { if (ended) { return; } ended = true; cb(e, d); }
|
|
15
|
+
xhr.onload = function () { var d; try { d = JSON.parse(xhr.responseText); } catch (ignore) { finish('Resposta inválida do serviço local.'); return; } if (xhr.status !== 200) { if (d.code === 'AUTH_REQUIRED' && route !== '/ani/login') { forget(); authLost(); } finish(d.error || 'Falha na consulta AniStream.', d); } else { finish(null, d); } };
|
|
16
|
+
xhr.onerror = function () { finish('Serviço local indisponível. Feche e abra o TizenBrew.'); }; xhr.ontimeout = function () { finish('AniStream demorou demais. Tente atualizar.'); }; xhr.onabort = function () { ended = true; }; xhr.send(body === null ? null : JSON.stringify(body)); return xhr;
|
|
17
|
+
}
|
|
18
|
+
return { call: call, save: save, forget: forget, device: device, setPrimary: setPrimary, isPrimary: function () { return primary; }, connected: function () { return !!current; }, name: function () { return current && current.name || 'Perfil AniStream'; }, persistent: function () { return persistent; }, onAuthLost: function (fn) { authLost = fn; } };
|
|
19
|
+
}());
|