# Troço Play — atualização do catálogo M3U

## Correções incluídas

Esta versão corrige a atualização do catálogo no cPanel e a classificação de itens M3U. A fonte é baixada para um arquivo temporário e só substitui o catálogo vigente depois de ser validada. Respostas vazias, HTML de bloqueio, listas truncadas ou listas abaixo do limite mínimo são rejeitadas; em caso de erro, a transação é revertida e o arquivo anterior é preservado.

A sincronização é substitutiva: itens que continuam na fonte são atualizados, itens novos são inseridos e itens ausentes são removidos, junto com os vínculos dependentes de EPG, favoritos, histórico e relatórios para evitar registros órfãos. Cópias da mesma lista com credenciais diferentes não duplicam o catálogo.

A classificação prioriza o caminho real da URL. Caminhos `/live/` são canais; `/movie/`, `/movies/`, `/vod/` e `/film/` são filmes; `/series/` são séries. O grupo M3U só funciona como apoio quando o caminho não informa o tipo. Temporadas e episódios são reconhecidos em formatos como `S01 E02`, `S1E2` e `1x02`. A limpeza de títulos remove marcadores de playlist, aspas e prefixos indevidos.

## Configuração no cPanel

Mantenha `CPANEL_MODE=1`, `FLASK_SKIP_SCHEDULER=1`, `HTTPS_ENABLED=true` e `FFMPEG_ENABLED=false` em hospedagem compartilhada. Configure `M3U_READ_TIMEOUT=900` ou maior para listas extensas. O novo parâmetro opcional `M3U_MIN_ENTRIES` tem padrão `10` e impede que uma resposta incompleta apague o catálogo atual.

No painel administrativo, em **Config M3U**, salve a fonte autorizada e execute a atualização manual. Para atualização automática, use o Cron Job HTTP já documentado em `DEPLOY_CPANEL.md`. As credenciais devem permanecer somente nas variáveis do cPanel ou em `instance/settings.json`, nunca no repositório.

## Verificação realizada

Foram executados teste sintático do Flask, quatro casos de classificação por caminho da URL, limpeza de títulos e teste isolado de substituição com remoção de catálogo antigo e rejeição de lista inválida. O servidor de prévia foi reiniciado na porta 5001 e respondeu à página de login via HTTPS.

## Correção adicional de títulos

Foi corrigido o caso em que a fonte enviava `tvg-name="Sem título"` e o nome real do conteúdo após a vírgula. O placeholder agora é descartado quando isolado, sem alterar títulos legítimos que apenas contenham a expressão como parte do nome. Também foi adicionada uma migração idempotente que saneia registros antigos, reclassifica itens pela URL e oculta somente VODs realmente sem identificação.

Na amostra M3U autorizada analisada, foram identificados 1.714 canais, 20.615 filmes e 188.952 séries; nenhuma série resultou com o prefixo “Sem título”.

## Correção adicional de sessões M3U simultâneas

A reserva passou a considerar o host real da URL do conteúdo. O endpoint de canais, o player web, o player TV e a verificação auxiliar agora usam o mesmo índice de fonte e reescrevem a URL antes de gerar o token. A mesma sessão reutiliza a conta já reservada, enquanto sessões de usuários diferentes recebem índices distintos quando existem contas compatíveis livres. O failover do proxy não tenta credenciais de outro servidor.

Também foi corrigida a comparação de horários entre SQLite e UTC, e o índice exclusivo de `user_streaming.source_index` permanece protegido no schema.

## Segurança da troca de M3U e rotação simultânea

A troca de M3U continua protegida por arquivo temporário, validação de cabeçalho/quantidade e rollback do banco: se o download, parse ou sincronização falhar, o catálogo anterior permanece ativo. A nova fonte só substitui a anterior depois de passar pela validação.

A seleção de credenciais agora é feita por sessão e pelo host do conteúdo. Canais, filmes e séries utilizam o mesmo índice reservado; o endpoint de canais deixou de usar sempre a primeira credencial. A mesma sessão reaproveita sua conta, usuários diferentes recebem contas diferentes quando há disponibilidade e o quarto acesso é recusado quando todas as contas compatíveis estão ocupadas.
