Mover arquivos parcialmente correspondentes que já existem (transcodificador Plex)

2

Eu estou tentando descobrir como escrever isso como um script bash "padrão" (rodando em um QNAP), mas não tenho certeza de onde começar - eu posso fazê-lo no NodeJS (já que eu uso isso o tempo todo para meu trabalho), mas realmente preferiria ter algo.

Estou procurando indicações de como fazer isso em vez de um script real (embora não deixe que isso o impeça); -)

Usando os arquivos convertidos do Plex (para compatibilidade, etc.) - a entrada para isso é uma árvore de pastas com vários arquivos de filme (as extensões são mais comumente .avi, .mp4 ou .mkv), o que torna um. arquivo mp4 em um caminho ligeiramente diferente.

Eu quero copiar (não mover - deixarei o Plex limpar sua própria bagunça) os arquivos de saída do Plex de volta sobre os arquivos de entrada.

Exemplo de estrutura - de ...

Plex Versions/Optimized for Mobile/My Tv Show/S01E01.mp4

... para ...

My TV Show (1990-1995)/Season 1/s01e01 My Episode Name.mkv

Notas:

  • O caminho da raiz para ambos é o mesmo (para minha configuração, outros podem ter a pasta Plex Versions dentro da pasta My TV Show (1990-1995) - esse script irá para o GitHub quando feito, etc.).

  • O nome do programa de TV pode mudar. Eu coloquei a data inicial e final (ou um - se estiver em andamento) entre parênteses. O Plex usará o nome "oficial", que pode ter um ano inicial se houver mais de um programa com o mesmo nome.

  • Tendo em mente o que precede, posso ter vários programas com o mesmo nome base, mas anos diferentes.

  • O nome de base de destino estará na pasta Season x (número da temporada sem entrelinha 0 ) e terá o mesmo prefixo.

  • Se for a estação 0, talvez ela esteja na pasta Specials/ (as coisas ficarão consistentes em algum momento).

  • Se o nome do arquivo original tiver um nome de arquivo .mp4, o arquivo de destino copiado deverá ter um nome de arquivo .m4v.

  • Após a cópia do novo arquivo, o arquivo original pode ser removido (deixando os arquivos de origem e de destino da cópia).

Se eu estivesse fazendo isso no NodeJS, faria algo como o seguinte:

  1. Obtenha uma lista classificada de pastas do programa de TV (as apresentações anteriores geralmente não levam anos, enquanto as posteriores são feitas).
  2. Para cada pasta, regex substitui os anos finais ( /-\d*\)/ to "" para incluir apenas o ano inicial e a correspondência insensível a maiúsculas e minúsculas nas pastas do Plex. Se não houver correspondência, tente sem ano.
  3. Se nenhuma correspondência for encontrada, volte para 2 e tente novamente.
  4. Obtenha uma lista de arquivos da versão do Plex que correspondam ao padrão /S\d+E\d+\.mp4/ (pode haver legendas incluídas quando acabei de copiar tudo e não filtrar os fluxos).
  5. Para cada arquivo, obtenha o número da temporada e pesquise a pasta Season x para o mesmo prefixo. Se for a época 0, pesquise também a pasta Specials .
  6. Substitua a extensão no nome correspondente por .mp4, se nenhuma substituição for feita, substitua-a por .m4v.
  7. Copie o arquivo Plex para o novo caminho + nome.
  8. Remova o arquivo correspondente e volte para 5.

Agora variáveis para nomes que eu posso fazer, mesmo para o unlink óbvio - o que eu gostaria de ajudar é -

Melhor maneira de fazer a correspondência de pasta inicial (é 1-3 da melhor maneira, ou existe um atalho melhor? Olhando para este: Copie os arquivos para uma pasta de destino somente se os arquivos já existirem, mas os arquivos de origem tiverem uma extensão de arquivo diferente )

Verificando se um arquivo existe e tente diferentes combinações de extensão, se não.

edite: há mais de 30 tb de arquivos, e o Plex não substitui os arquivos originais (há uma solicitação aberta desde 2015).

    
por Rycochet 18.04.2017 / 14:51

1 resposta

2

Eu pessoalmente sugiro usar o FFmpeg para converter os arquivos dentro do seu pasta primária da Biblioteca Plex. Algo ao longo das linhas de:

set -s globstar;

for f in ./**/*.{avi,mp4,mkv}; do
    ffmpeg -i "$f" -c:a aac -c:v libx264 -preset slow "${f%.*}_b.mp4"
    rm "$f"
    mv "${f%.*}_b.mp4" "${f%.*}.mp4"
done

Você também pode configurar o Plex para armazenar sua versão otimizada no diretório dos arquivos originais.

Dito isso, esse código pode fazer o que você está procurando, mas não foi testado:

Plex_Main="/Main/Plex/Dir/"
Optimized="/Optimized/Versions/Dir/"

for DIR in "$Optimized"/*; do
    if [[ -d "$DIR" ]]; then
        SHOW_MATCHES=("$Plex_Main"/*"$(basename "$DIR")"*/)

        # If there is one, and only one, match
        if [[ ${#SHOW_MATCHES[@]} -eq 1 ]]; then
            # The non-optimized show path
            SHOW_PATH="$Plex_Main"/*"$(basename "${DIR[0]}")"*

            for f in "$DIR"/*.mp4; do
                # Remove file extension
                EP_ID="${f%.*}"

                EP_MATCHES=("$SHOW_PATH"/*"${EP_ID[0]}"*)

                if [[ ${#EP_MATCHES[@]} -eq 1 ]]; then
                    ORIG_FILE="${EP_MATCHES[0]}"
                    cp "$f" "$SHOW_PATH/${ORIG_FILE%.*}.mp4"
                fi
            done
        fi
    fi
done
    
por 18.04.2017 / 15:56

Tags