diff --git a/README.md b/README.md index 4a843cd..cddf84e 100644 --- a/README.md +++ b/README.md @@ -1,178 +1,157 @@ -🎬 PyMedia Manager +# 🎬 PyMedia Manager -PyMedia Manager é uma solução completa e self-hosted para organização e otimização de bibliotecas de mídia. Ele atua como uma interface centralizada para gerenciar downloads, renomear séries automaticamente com padrões complexos e transcodificar vídeos usando aceleração de hardware. +**PyMedia Manager** é uma solução completa e *self-hosted* para organização, renomeação e transcodificação de bibliotecas de mídia. Projetado para transformar uma pasta de downloads caótica em uma biblioteca organizada para servidores de mídia (Jellyfin/Plex). - Otimizado para: Processadores Intel antigos (4ª Geração / Haswell) utilizando drivers i965 e FFmpeg via VAAPI nativo. +> ⚡ **Otimização de Hardware:** Este projeto foi ajustado especificamente para processadores **Intel de 4ª Geração (Haswell)**, utilizando drivers `i965` e FFmpeg via `VAAPI` nativo para máxima performance e estabilidade. -✨ Funcionalidades -1. 📂 Gerenciador de Arquivos +--- - Navegação visual estilo "Explorer" dentro do servidor. +## ✨ Funcionalidades - Mover, Excluir e Criar pastas. +### 1. 📂 Gerenciador de Arquivos +- **Interface Visual:** Navegue pelas pastas do servidor como em um sistema operacional. +- **Ações:** Mover, Excluir (lixeira), Renomear arquivos individualmente e Criar novas pastas. +- **Preview:** Visualização rápida de tamanho e data de modificação. - Renomeação manual de arquivos individuais. +### 2. 🏷️ Renomeador de Séries (Regex Inteligente) +- **Detecção Automática:** Identifica padrões como `S01E01`, `1x01`, `S01 - EP01`, `Season 1 Episode 1`. +- **Organização:** Cria automaticamente a estrutura `Nome da Série > Temporada XX > Episódio YY.mkv`. +- **Segurança:** Tabela de pré-visualização ("De -> Para") antes de aplicar qualquer alteração. -2. 🏷️ Renomeador de Séries (Regex) +### 3. ⚙️ Encoder (FFmpeg Persistente) +- **Backend Desacoplado:** O processo de conversão roda em uma *thread* de fundo. Você pode fechar o navegador ou atualizar a página (F5) que o progresso não é perdido. +- **Intel Haswell Ready:** Utiliza o driver legado `i965` e inicialização explícita de VAAPI para evitar conflitos de driver. +- **Seleção de Faixas:** Mantém vídeos em H.264, copia áudios (POR/ENG/JPN) e legendas (PT-BR) sem recompressão. +- **Espelhamento:** Replica a estrutura de pastas da origem para a pasta `finalizados`. - Detecção inteligente de padrões (Scene, Anime, P2P). +--- - Suporta: S01E01, 1x01, S01 - EP01, Season 1 Episode 1. +## 🚀 Instalação e Deploy - Tabela de Preview antes de aplicar alterações. - - Organização automática: Move para Nome da Série/Temporada XX/Episódio YY.mkv. - -3. ⚙️ Encoder (FFmpeg Haswell) - - Backend Persistente: O processo continua rodando mesmo se fechar o navegador (sobrevive ao F5). - - Aceleração de Hardware: Uso nativo de h264_vaapi sobre o driver i965. - - Preservação de Áudio/Legenda: Mantém áudios (POR/ENG/JPN) e legendas (PT-BR) copiando o stream (copy), sem perda de qualidade. - - Estrutura Espelhada: Replica a estrutura de pastas da origem para a pasta finalizados. - -🚀 Instalação e Deploy -Pré-requisitos - - Docker e Docker Compose instalados. - - Hardware Intel com iGPU ativa (QuickSync). - - Drivers de vídeo no host (/dev/dri). - -1. Clonar o Repositório -code Bash +### Pré-requisitos +* Docker e Docker Compose. +* Hardware Intel com iGPU ativa (QuickSync). +* Drivers de vídeo instalados no host (`/dev/dri`). +### 1. Clonar o Repositório +```bash git clone http://seu-gitea-url/seu-usuario/pymediamanager.git cd pymediamanager +``` -2. Estrutura de Pastas - -O projeto deve ter a seguinte estrutura básica. Crie as pastas de dados se não existirem: -code Bash +### 2. Estrutura de Pastas Necessária +O projeto espera a seguinte estrutura. Crie as pastas se não existirem: +```bash mkdir -p data -mkdir -p downloads/concluidos -mkdir -p downloads/temp -mkdir -p downloads/finalizados +mkdir -p app/modules +# As pastas de mídia geralmente ficam fora, ex: /home/user/downloads +``` -3. Permissões (Crítico) +### 3. Configurar Permissões (Crítico ⚠️) +O Docker precisa de permissão total para ler, escrever, criar pastas e deletar arquivos no seu diretório de downloads. -Como o container precisa manipular arquivos no host, garanta permissões de escrita na pasta do projeto e nas pastas de mídia: -code Bash - -# Dá permissão na pasta do projeto +```bash +# Permissão na pasta do projeto sudo chmod -R 777 . -# Dá permissão na sua pasta de downloads (ajuste o caminho conforme necessário) +# Permissão na pasta de mídia do Host sudo chmod -R 777 /home/seu-usuario/downloads +``` -4. Configuração do docker-compose.yml - -Crie ou edite o arquivo docker-compose.yml na raiz: -code Yaml +### 4. Arquivo `docker-compose.yml` +Crie ou verifique o arquivo na raiz do projeto: +```yaml version: "3.8" services: pymediamanager: build: . container_name: pymediamanager - privileged: true # Necessário para acesso total ao hardware + privileged: true # Obrigatório para acesso total à GPU restart: unless-stopped - # Mapeamento da Placa de Vídeo + # Acesso ao Hardware de Vídeo devices: - /dev/dri:/dev/dri - # Permissão do Grupo de Vídeo (Geralmente 993, 109 ou 'render') - # Rode 'ls -ln /dev/dri' no host para descobrir o número correto do grupo render + # Grupo de Vídeo (Verifique o ID com 'ls -ln /dev/dri/renderD128') group_add: - "993" environment: - TZ=America/Sao_Paulo - # FORÇA O DRIVER ANTIGO PARA INTEL HASWELL (4ª GERAÇÃO) + # O SEGREDO DO HASWELL: Força o driver antigo - LIBVA_DRIVER_NAME=i965 volumes: # Código Fonte - ./app:/app - # Banco de Dados e Estados + # Banco de Dados e Estados (Persistência) - ./data:/app/data - # Pastas de Mídia (Ajuste o lado esquerdo para o seu caminho real) + # Mapeamento de Mídia (Host : Container) - /home/creidsu/downloads:/downloads ports: - 8501:8501 +``` -5. Compilar e Rodar - -Para subir o sistema pela primeira vez ou após alterações no código: -code Bash +### 5. Compilar e Rodar +Sempre que alterar o código ou o Dockerfile, use `--build`: +```bash docker-compose up -d --build +``` -Para acompanhar os logs em tempo real (útil para ver o FFmpeg trabalhando): -code Bash +Para ver os logs do FFmpeg em tempo real: +```bash docker logs -f pymediamanager +``` -🖥️ Como Usar +--- -Acesse no seu navegador: http://IP-DO-SERVIDOR:8501 -Aba 1: Gerenciador +## 🖥️ Como Usar -Use para limpar o "lixo" da pasta de downloads ou mover arquivos para pastas de séries antes de renomear. -Aba 2: Renomeador +Acesse no navegador: **`http://IP-DO-SEU-SERVER:8501`** - Selecione a pasta da série (ex: /downloads/Frieren). +### Aba 1: Gerenciador +Use para limpar o "lixo" (arquivos `.txt`, `.nfo`, samples) ou mover pastas inteiras antes de processar. - Clique em Analisar. +### Aba 2: Renomeador +1. Selecione a pasta raiz da série (ex: `/downloads/MinhaSerie`). +2. Clique em **Analisar**. +3. Confira a tabela. Se o Regex pegou tudo certo, clique em **Confirmar Renomeação**. - Verifique a tabela de "De -> Para". +### Aba 3: Encoder +1. Selecione a pasta organizada. +2. Marque se deseja excluir os originais após o sucesso. +3. Clique em **Iniciar**. +4. O sistema criará o arquivo `encoder_status.json`. A interface vai ler esse arquivo a cada 5 segundos. +5. **Pode fechar a aba!** O servidor continuará trabalhando. - Se estiver correto, clique em Confirmar. +--- -Aba 3: Encoder +## 🛠️ Solução de Problemas - Selecione a pasta raiz ou a pasta da série. +**1. Erro: `Permission denied` / `Read-only file system`** +* O container não tem permissão na pasta do host. +* **Solução:** Rode `sudo chmod -R 777 /caminho/dos/downloads`. - Marque se deseja excluir o original após o sucesso. +**2. Erro no Log: `Failed to initialise VAAPI connection: -1`** +* Conflito entre o driver novo (`iHD`) e o hardware antigo. +* **Solução:** O script `worker.py` já possui uma função `prepare_driver_environment()` que tenta apagar o driver `iHD` e forçar o `i965`. Verifique se a variável `LIBVA_DRIVER_NAME=i965` está no docker-compose. - Clique em Iniciar. +**3. Docker não inicia (`group 'render' not found`)** +* O ID do grupo de vídeo muda de sistema para sistema. +* **Solução:** No terminal do host, digite `ls -ln /dev/dri`. Pegue o segundo número (ex: 993, 107) e coloque no `group_add` do `docker-compose.yml`. - Pode fechar a aba! O processo roda em background. Ao voltar, ele mostrará o progresso atual lendo o arquivo de estado. +--- -🛠️ Solução de Problemas (Troubleshooting) +## 📦 Stack Tecnológica -Erro: Permission denied ao mover arquivos. - - Execute sudo chmod -R 777 /sua/pasta/downloads no host. O Docker precisa de permissão total para criar pastas e mover arquivos. - -Erro: Failed to initialise VAAPI connection no log. - - Isso geralmente é conflito de driver. O sistema foi projetado para apagar automaticamente o driver iHD (novo) e usar o i965 (antigo). - - Verifique se LIBVA_DRIVER_NAME=i965 está no docker-compose. - - Verifique se o seu processador é realmente Haswell/Broadwell (Gen 4/5). Se for mais novo (Gen 8+), remova a variável de ambiente e o código de limpeza de driver. - -Erro: Docker não sobe (group render not found). - - O ID do grupo render muda de Linux para Linux. - - Rode ls -ln /dev/dri/renderD128. O segundo número (ex: 993, 107) é o ID do grupo. Coloque esse número em group_add no docker-compose. - -📝 Tecnologias - - Python 3.10+ - - Streamlit (Interface Web) - - FFmpeg (Engine de Transcodificação) - - SQLite (Banco de Dados Local) - - Docker (Containerização) \ No newline at end of file +* **Linguagem:** Python 3.10 +* **Frontend:** Streamlit +* **Engine de Vídeo:** FFmpeg (via `subprocess`) +* **Banco de Dados:** SQLite + JSON (Estado) +* **Container:** Docker (Ubuntu Base) \ No newline at end of file