195 lines
6.3 KiB
Markdown
195 lines
6.3 KiB
Markdown
# 🎬 PyMedia Manager
|
|
|
|
**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).
|
|
|
|
> ⚡ **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
|
|
- **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.
|
|
|
|
### 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.
|
|
|
|
### 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`.
|
|
|
|
---
|
|
|
|
## 🛠️ Pré-requisitos Gerais
|
|
|
|
* Docker e Docker Compose.
|
|
* Hardware Intel com iGPU ativa (QuickSync).
|
|
* Drivers de vídeo instalados no host (`/dev/dri`).
|
|
* **Permissões:** O usuário do Docker precisa de acesso de leitura/escrita nas pastas.
|
|
|
|
### Configuração de Pastas e Permissões (Obrigatório)
|
|
Antes de rodar qualquer versão, crie as pastas e ajuste as permissões para evitar erros de "Access Denied":
|
|
|
|
```bash
|
|
# 1. Crie as pastas de dados locais
|
|
mkdir -p data
|
|
|
|
# 2. Dê permissão total (O container roda internamente como root/user misto)
|
|
sudo chmod -R 777 data
|
|
sudo chmod -R 777 /home/creidsu/downloads # Ajuste para sua pasta de mídia real
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Opção A: Rodar em Produção (Imagem Pronta)
|
|
*Use esta opção se você quer apenas usar o software sem compilar nada.*
|
|
|
|
1. Crie um arquivo `docker-compose.yml` com o conteúdo abaixo:
|
|
|
|
```yaml
|
|
version: "3.8"
|
|
services:
|
|
pymediamanager:
|
|
# Imagem pronta do Registry (Não precisa compilar)
|
|
image: gitea.creidsuhs.net/creidsu/pymediamanager:latest
|
|
|
|
container_name: pymediamanager
|
|
privileged: true # Obrigatório para acesso total à GPU
|
|
restart: unless-stopped
|
|
|
|
# Acesso ao Hardware de Vídeo
|
|
devices:
|
|
- /dev/dri:/dev/dri
|
|
|
|
# Grupo de Vídeo (Verifique o ID com 'ls -ln /dev/dri/renderD128')
|
|
group_add:
|
|
- "993"
|
|
|
|
environment:
|
|
- TZ=America/Sao_Paulo
|
|
# O SEGREDO DO HASWELL: Força o driver antigo
|
|
- LIBVA_DRIVER_NAME=i965
|
|
|
|
volumes:
|
|
# Apenas dados persistentes (Banco de dados e configs)
|
|
- ./data:/app/data
|
|
# Mapeamento de Mídia (Host : Container)
|
|
- /sua/pasta/downloads:/downloads
|
|
|
|
ports:
|
|
- 8501:8501
|
|
```
|
|
|
|
2. **Execute:**
|
|
```bash
|
|
# Baixa a imagem mais recente
|
|
docker-compose pull
|
|
|
|
# Sobe o servidor
|
|
docker-compose up -d
|
|
```
|
|
|
|
---
|
|
|
|
## 🏗️ Opção B: Compilar Localmente (Build)
|
|
*Use esta opção se você está desenvolvendo ou alterou o código fonte.*
|
|
|
|
1. Clone o repositório:
|
|
```bash
|
|
git clone https://gitea.creidsuhs.net/creidsu/pymediamanager.git
|
|
cd pymediamanager
|
|
```
|
|
|
|
2. Use este `docker-compose.yml` (focado em build):
|
|
|
|
```yaml
|
|
version: "3.8"
|
|
services:
|
|
pymediamanager:
|
|
# Compila a partir da pasta atual
|
|
build: .
|
|
image: pymediamanager:local
|
|
|
|
container_name: pymediamanager
|
|
privileged: true
|
|
restart: unless-stopped
|
|
|
|
devices:
|
|
- /dev/dri:/dev/dri
|
|
group_add:
|
|
- "993"
|
|
|
|
environment:
|
|
- TZ=America/Sao_Paulo
|
|
- LIBVA_DRIVER_NAME=i965
|
|
|
|
volumes:
|
|
# Mapeia o código fonte para desenvolvimento (Hot-reload)
|
|
# Nota: Se mudar a estrutura de pastas, remova este mapeamento e rebuilde
|
|
# - ./app:/app
|
|
|
|
- ./data:/app/data
|
|
- /sua/pasta/downloads:/downloads
|
|
|
|
ports:
|
|
- 8501:8501
|
|
```
|
|
|
|
3. **Compile e Execute:**
|
|
```bash
|
|
# O --build força a recriação da imagem
|
|
docker-compose up -d --build
|
|
```
|
|
|
|
---
|
|
|
|
## 🖥️ Como Usar
|
|
|
|
Acesse no navegador: **`http://SEU-IP:8501`**
|
|
|
|
### Aba 1: Gerenciador
|
|
Use para limpar o "lixo" (arquivos `.txt`, `.nfo`, samples) ou mover pastas inteiras antes de processar.
|
|
|
|
### Aba 2: Renomeador
|
|
1. Selecione a pasta da série (ex: `/downloads/MinhaSerie`).
|
|
2. Clique em **Analisar**.
|
|
3. Verifique a tabela de "De -> Para".
|
|
4. Se estiver correto, clique em **Confirmar**.
|
|
|
|
### Aba 3: Encoder
|
|
1. Selecione a pasta organizada.
|
|
2. Marque se deseja excluir o original após o sucesso.
|
|
3. Clique em **Iniciar**.
|
|
4. **Pode fechar a aba!** O processo roda em background. Ao voltar, ele mostrará o progresso atual.
|
|
|
|
---
|
|
|
|
## 🛠️ Solução de Problemas
|
|
|
|
**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`.
|
|
|
|
**2. Erro no Log: `Failed to initialise VAAPI connection: -1`**
|
|
* Conflito entre o driver novo (`iHD`) e o hardware antigo.
|
|
* **Solução:** O script já possui uma função automática que tenta apagar o driver `iHD` e forçar o `i965`. Verifique se a variável `LIBVA_DRIVER_NAME=i965` está no docker-compose.
|
|
|
|
**3. Erro: `413 Payload Too Large` ao fazer Push para o Gitea**
|
|
* O Proxy (Nginx/Cloudflare) está bloqueando o tamanho da imagem.
|
|
* **Solução:** Desative o Proxy da Cloudflare (Nuvem Cinza) temporariamente ou configure `client_max_body_size 0;` no Nginx.
|
|
|
|
---
|
|
|
|
## 📦 Stack Tecnológica
|
|
|
|
* **Linguagem:** Python 3.10
|
|
* **Frontend:** Streamlit
|
|
* **Engine de Vídeo:** FFmpeg (VAAPI Nativo)
|
|
* **Banco de Dados:** SQLite + JSON (Estado)
|
|
* **Base OS:** Ubuntu 22.04 LTS |