이미 존재하는 부분적으로 일치하는 파일 이동(Plex 트랜스코더)

이미 존재하는 부분적으로 일치하는 파일 이동(Plex 트랜스코더)

이것을 "표준" bash 스크립트(QNAP에서 실행)로 작성하는 방법을 찾으려고 노력하고 있지만 어디서부터 시작해야 할지 모르겠습니다. NodeJS에서 할 수 있습니다(작업에 항상 사용하기 때문에). , 하지만 정말 뭔가를 갖고 싶습니다.

나는 실제 스크립트보다는 이 작업을 수행하는 방법에 대한 포인터를 찾고 있습니다(그래도 멈추지 마세요) ;-)

내장된 Plex 변환 파일(호환성 등을 위해) 사용 - 다양한 영화 파일(확장자는 가장 일반적으로 .avi, .mp4 또는 .mkv임)이 포함된 폴더 트리를 입력한 다음 .mp4 파일로 만듭니다. 조금 다른 길.

Plex 출력 파일을 입력 파일 위에 다시 복사하고 싶습니다(이동하지 않음 - Plex가 자체적으로 정리하도록 함).

예제 구조 - from...

Plex 버전/모바일에 최적화됨/내 TV 쇼/S01E01.mp4

...에게...

내 TV 쇼(1990-1995)/시즌 1/s01e01 내 에피소드 이름.mkv

노트:

  • 둘 다의 루트 경로는 동일합니다(내 설정의 경우 다른 사람이 폴더 Plex Versions내에 폴더를 가지고 있을 수 있습니다 My TV Show (1990-1995). 이 스크립트는 완료되면 GitHub에 저장됩니다).

  • TV 프로그램 이름은 변경될 수 있습니다. 시작일과 종료일(또는 -진행 중인 경우 후행 날짜)을 괄호 안에 넣었습니다. Plex는 동일한 이름을 가진 프로그램이 두 개 이상 있는 경우 시작 연도가 있을 수 있는 "공식" 이름을 사용합니다.

  • 위의 사항을 염두에 두고 기본 이름은 동일하지만 연도가 다른 여러 쇼가 있을 수 있습니다.

  • 대상 기본 이름은 Season x폴더(선두가 없는 시즌 번호 0)에 있으며 동일한 접두사를 갖습니다.

  • 시즌 0이라면 대신 폴더에 있을 수도 있습니다 Specials/(어느 시점에는 일관성을 유지하겠습니다).

  • 원본 파일 이름이 .mp4 파일 이름인 경우 복사된 대상 파일의 파일 이름은 .m4v여야 합니다.

  • 새 파일을 복사한 후 원본 파일을 제거할 수 있습니다(복사 원본과 대상 파일은 그대로 유지).

NodeJS에서 이 작업을 수행했다면 다음과 같은 작업을 수행했을 것입니다.

  1. TV 쇼 폴더의 정렬된 목록을 가져옵니다(이전 쇼에는 일반적으로 연도가 없지만 이후 쇼에는 연도가 있습니다).
  2. 각 폴더 정규식에 대해 종료 연도를 대체합니다( 시작 연도만 포함 /-\d*\)/하고 ""Plex 폴더와 대소문자를 구분하지 않고 일치합니다. 일치하지 않으면 연도 없이 시도합니다.
  3. 일치하는 항목이 없으면 2로 돌아가서 다시 시도하세요.
  4. 패턴과 일치하는 Plex 버전 파일 목록을 가져옵니다 /S\d+E\d+\.mp4/(모든 것을 리핑하고 스트림을 필터링하지 않았을 때의 자막이 포함될 수 있음).
  5. 각 파일에 대해 시즌 번호를 얻은 다음 Season x폴더에서 동일한 접두어를 검색하세요. 시즌 0이면 Specials폴더도 검색해 보세요.
  6. 일치하는 이름의 확장자를 .mp4로 바꾸고, 바꾸지 않은 경우 .m4v로 바꿉니다.
  7. Plex 파일을 새 경로+이름에 복사합니다.
  8. 일치하는 파일을 제거한 다음 5로 돌아갑니다.

이제 내가 할 수 있는 이름에 대한 변수는 명백한 연결 해제에도 동일합니다. 제가 도움을 받고 싶은 것은 다음과 같습니다.

초기 폴더를 일치시키는 가장 좋은 방법(1-3이 가장 좋은 방법입니까, 아니면 더 나은 단축키가 있습니까? 다음을 살펴보십시오.파일이 이미 존재하는 경우에만 대상 폴더에 파일을 복사합니다. 하지만 소스 파일의 파일 확장자는 다릅니다.)

파일이 있는지 확인하고, 없으면 다른 확장자 조합을 시도해 보세요.

편집: 30TB가 넘는 파일이 있는데 Plex는 그렇습니다.~ 아니다원본 파일을 교체합니다(2015년부터 공개 요청이 있었습니다).

답변1

개인적으로 기본 Plex 라이브러리 폴더 내의 파일을 변환하려면 FFmpeg를 사용하는 것이 좋습니다. 다음과 같은 내용이 있습니다.

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

또한 원본 파일 디렉터리 내에 최적화된 버전을 저장하도록 Plex를 설정할 수도 있습니다.

즉, 이 코드는~할 것 같다당신이 찾고있는 것을 수행하지만 완전히 테스트되지 않았습니다.

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

답변2

다음과 같은 Plex 최적화 버전을 자동으로 사용하면 안 됩니다.

  1. 부정한
    여기에 이미지 설명을 입력하세요
  2. 세척
    여기에 이미지 설명을 입력하세요
  3. 자막 및/또는 챕터 없음
    여기에 이미지 설명을 입력하세요
  4. 디인터레이스되지 않음
    여기에 이미지 설명을 입력하세요
  5. 귀하 또는 다른 시청자가 (더 이상) 원하지 않는 언어로 된 자막이 내장되어 있는 경우

이는 알려진 버그에 따라 다르거나 입력이 트랜스코딩 소프트웨어 또는 iGPU의 필요한 인코딩 프로필에 100% 맞지 않을 수도 있습니다. 따라서 더 나은 방법은 최적화된 버전을 보고 개별적으로 교체하는 것입니다. 원본 파일을 잃어버리는 것은 저장 공간을 절약하는 것보다 더 큰 문제가 될 수 있습니다. 비용 때문에 공간을 절약하는 것이 목표라면 너무 많은 비디오를 다시 트랜스코딩하면 전기 요금이 늘어나고 스토리지 비용은 시간이 지남에 따라 점점 더 저렴해지고 있다는 점을 잊지 마십시오.

그리고 마지막으로대부분의 재트랜스코딩은 품질 저하를 의미합니다.그리고 그것의올바른 트랜스코딩 옵션을 찾는 것은 쉬운 일이 아닙니다.품질과 파일 크기에 대한 요구 사항을 충족합니다.

관련 정보