Skip to main content

DSM 7.1.1 42962 Update 6 AME 코덱 및 트랜스코딩

DSM 7.1.1 42962 Update 6 및,
DSM 6.0 7321 Update 0와 2024년 3월 27일 자 기준으로 가장 최신 버전인 DSM 7.2.1 69057 Update 4의
Advanced Media Extensions, Video Station 트랜스코딩, Synology Photo의 얼굴 인식을 활성화하는 방법을 기재한다.

이를 통해 Synology Photo에서 HEIC, HEVC 파일을 읽어 들일 수 있게 된다.


설치과정

1. 헤놀로지

image.png

먼저, 패키지 센터에서 Advanced Media Extensions를 제거하고 설치한다.

설치 후 열지는 않는다.

Synology Photo와 Video Station도 설치한다.

image.png

또한, 패키지 센터에서 설정에 진입하여, 패키지 소스에 다음 내용을 추가한다.

이름 : synocommunity
위치 : http://packages.synocommunity.com

image.png

추가된 커뮤니티 탭에서 FFmpeg를 검색하여 4, 5, 6을 모두 설치한다.

image.png

제어판 > 터미널 및 SNMP에서 SSH 서비스를 활성화한다.

2. 시놀로지 데모

https://demo.synology.com/ko-kr/dsm

위 링크에 접속하여 시놀로지 데모 (한국어판)를 실행한다.

image.png

패키지 센터에서 Advanced Media Extensions을 열고 (기본적으로 설치돼 있음) 라이센스 가져오기를 클릭한다.

image.png

이메일 인증이 가능한 아무 계정으로, 새 시놀로지 계정을 생성하여 로그인한다.

image.png

설치가 완료되었다면, 제어판 > 작업 스케줄러 > 생성 > 트리거 된 작업 사용자 정의 스크립트를 생성한다.

image.png

일반에서 사용자는 root가 아닌 demouser로 설정한다.

image.png

작업 설정에서 사용자 정의 스크립트에 다음 내용을 추가하고 저장한다.

cd /volume1/homes/
tar -cvf AMEPack.tar /volume1/@appstore/CodecPack/pack

image.png

이후 생성한 스크립트를 실행한다.

image.png

파일 스테이션의 homes에 진입하면, AMEPack.tar이 보일 것이다.
용량은 AAC가 빠진 HEVC 코덱만 존재하기에, 77MB 혹은 80MB 가량일 것이다.

해당 파일을 다운로드한다.

이제 시놀로지 데모는 종료하여도 된다.

3. 다시 헤놀로지

다운로드한 AMEPack.tar 파일을 헤놀로지에 업로드한다.

SSH로 해당 경로에 접속하여야 하기에, 접속하기 편한 경로로 설정한다.
가능하다면 AMEPack.tar 파일이 존재하는 폴더에는 다른 파일이 없게 하는 것이 좋다.

image.png

파일의 경로는 속성의 위치에서 확인할 수 있다.

4. 헤놀로지 SSH

이후 SSH에 접속하여 sudo -i를 입력해 root로 로그인한다.

다음 명령어를 입력하여 작업 환경을 root 경로로 변경한다.

cd /

다음 명령어를 입력하여, AMEPack.tar 파일을 root 경로로 이동한다.
필자의 예시는 다음과 같다.

mv volume1/Archive-Main/_XPEnology/AME/AMEPack.tar /

다음 명령어를 입력하여 root 경로의 AMEPack.tar의 압축을 해제한다.

tar -xvf /AMEPack.tar

image.png

정상적으로 실행된 경우, Volume1/@appstore 경로에 압축이 해제된다.

5. AME Patch

AME 코덱을 과거 버전 (DSM 7.0 이전)으로 속여, 시놀로지 로그인을 우회한다.

ame72.py

ame72.py 원본 코드
import hashlib
import os

r = ['669066909066906690', 'B801000000', '30']
s_old = [(0x1F28, 0), (0x48F5, 1), (0x4921, 1), (0x4953, 1), (0x4975, 1), (0x9AC8, 2)]
s_new = [(0x3718, 0), (0x60a5, 1), (0x60d1, 1), (0x6111, 1), (0x6137, 1), (0xB5f0, 2)]

prefix = '/var/packages/CodecPack/target/usr'
so = prefix + '/lib/libsynoame-license.so'

print("Patching")
with open(so, 'r+b') as fh:
    full = fh.read()
    if hashlib.md5(full).digest().hex() in ['fcc1084f4eadcf5855e6e8494fb79e23', '923fd0d58e79b7dc0f6c377547545930']:
        print("MD5 match older version not AME 1.1.0-51005 date: 21/06/2023")
        for x in s_old:
            fh.seek(x[0] + 0x8000, 0)
            fh.write(bytes.fromhex(r[x[1]]))
    elif hashlib.md5(full).digest().hex() in ['09e3adeafe85b353c9427d93ef0185e9']:
        print("MD5 match version AME 1.1.0-51005 date: 21/06/2023")
        for x in s_new:
            fh.seek(x[0] + 0x8000, 0)
            fh.write(bytes.fromhex(r[x[1]]))    
    else:
        print("MD5 mismatch, not matching any version of AME")
        exit(1)
    

lic = '/usr/syno/etc/license/data/ame/offline_license.json'
os.makedirs(os.path.dirname(lic), exist_ok=True)
with open(lic, 'w') as licf:
    licf.write('[{"appType": 14, "appName": "ame", "follow": ["device"], "server_time": 1666000000, "registered_at": 1651000000, "expireTime": 0, "status": "valid", "firstActTime": 1651000001, "extension_gid": null, "licenseCode": "0", "duration": 1576800000, "attribute": {"codec": "hevc", "type": "free"}, "licenseContent": 1}, {"appType": 14, "appName": "ame", "follow": ["device"], "server_time": 1666000000, "registered_at": 1651000000, "expireTime": 0, "status": "valid", "firstActTime": 1651000001, "extension_gid": null, "licenseCode": "0", "duration": 1576800000, "attribute": {"codec": "aac", "type": "free"}, "licenseContent": 1}]')


print("Checking whether patch is successful...")
ret = os.system(prefix + "/bin/synoame-bin-check-license")
if ret == 0:
    print("Successful, updating codecs...")
    os.system(prefix + "/bin/synoame-bin-auto-install-needed-codec")
    print("Done")
else:
    print(f"Patch is unsuccessful, retcode = {ret}")

 

위 첨부 파일을 다운로드하여, 마찬가지로 root 경로로 옮긴다.

sudo -i
cd /

필자의 경우 다음과 같다.

mv volume1/Archive-Main/_XPEnology/AME72/ame72.py /

다음 명령어를 입력하여, ame72.py 파일을 파이썬으로 실행시킨다.

python ame72.py

image.png

정상적으로 실행된 경우, 위와 같이 출력된다.

codecpatch72.sh

codecpatch72.sh 원본 코드
#!/bin/sh
set -eo pipefail;
shopt -s nullglob;

#variables
bin_file="synocodectool"
conf_file="activation.conf"
conf_path="/usr/syno/etc/codec"
conf_string='{"success":true,"activated_codec":["hevc_dec","ac3_dec","h264_dec","h264_enc","aac_dec","aac_enc","mpeg4part2_dec","vc1_dec","vc1_enc"],"token":"123456789987654abc"}'
opmode="patchhelp"

#arrays
declare -A binhash_version_list=(
    ["cde88ed8fdb2bfeda8de52ef3adede87a72326ef"]="6.0-7321-0_6.0.3-8754-8"
    ["ec0c3f5bbb857fa84f5d1153545d30d7b408520b"]="6.1-15047-0_6.1.1-15101-4"
    ["1473d6ad6ff6e5b8419c6b0bc41006b72fd777dd"]="6.1.2-15132-0_6.1.3-15152-8"
    ["26e42e43b393811c176dac651efc5d61e4569305"]="6.1.4-15217-0_6.2-23739-2"
    ["1d01ee38211f21c67a4311f90315568b3fa530e6"]="6.2.1-23824-0_6.2.3-25426-3"
    ["c2f07f4cebf0bfb63e3ca38f811fd5b6112a797e"]="7.0.1-42216-0_7.0.1-42218-3"
    ["796ac7fab2dcad7978a0e8ae48abc9150aba916c"]="7.1-42661-0_7.1-42661-0"
    ["22445f5b0d8b6714954b50930c47b8805cf32b98"]="7.1-42661-0_7.1-42661-0"
    ["18461b62813166652fd64a96e06237fde81925f7"]="7.1.1-42962-0_7.1.1-42962-6"
    ["d316d5b2b080346b4bc197ad5ad7994ac043a15d"]="7.2-64570-0_7.2-64570-1"
    ["a205aa337d808213cf6d4d839b035cde0237b424"]="7.2.1-69057-0_7.2.1-69057-4"
)

declare -A patchhash_binhash_list=(
    ["e5c1a65b3967968560476fcda5071fd37db40223"]="cde88ed8fdb2bfeda8de52ef3adede87a72326ef"
    ["d58f5b33ff2b6f2141036837ddf15dd5188384c6"]="ec0c3f5bbb857fa84f5d1153545d30d7b408520b"
    ["56ca9adaf117e8aae9a3a2e29bbcebf0d8903a99"]="1473d6ad6ff6e5b8419c6b0bc41006b72fd777dd"
    ["511dec657daa60b0f11da20295e2c665ba2c749c"]="26e42e43b393811c176dac651efc5d61e4569305"
    ["93067026c251b100e27805a8b4b9d8f0ae8e291c"]="1d01ee38211f21c67a4311f90315568b3fa530e6"
    ["873749b00e1624df4b01335e0b69102acc185eb9"]="c2f07f4cebf0bfb63e3ca38f811fd5b6112a797e"
    ["06d543b2aab5ea73600ca96497febdad96dc7864"]="796ac7fab2dcad7978a0e8ae48abc9150aba916c"
    ["3a5ed18dc41ff243f3481b6e3cf4770651df0b54"]="22445f5b0d8b6714954b50930c47b8805cf32b98"
    ["4bfa2a72da607752435e432545f98f1a0b3815a8"]="18461b62813166652fd64a96e06237fde81925f7"
    ["8ffe49d91dc0fcd3268ff1afcbc9132d1ae634d1"]="d316d5b2b080346b4bc197ad5ad7994ac043a15d"
    ["1f4491bf5f27f0719ddebdcab6ff4eff56c64b2c"]="a205aa337d808213cf6d4d839b035cde0237b424"
)

declare -A binhash_patch_list=(
    ["cde88ed8fdb2bfeda8de52ef3adede87a72326ef"]="00002dc0: 27000084c0eb4cb9b6000000badd6940\n00003660: 24f0000000e8961e000084c00f84b400"
    ["ec0c3f5bbb857fa84f5d1153545d30d7b408520b"]="00002dc0: 27000084c0eb4cb9b7000000bafd6940\n000036f0: 0000e8291e000084c0eb1eb9ec000000"
    ["1473d6ad6ff6e5b8419c6b0bc41006b72fd777dd"]="00002dc0: 27000084c0eb4cb9b7000000baad6a40\n000036f0: 0000e8291e000084c0eb1eb9ec000000"
    ["26e42e43b393811c176dac651efc5d61e4569305"]="00002dc0: 27000084c0eb4cb9ba000000badf6a40\n00003710: f0000000e8271e000084c0eb1eb9ef00"
    ["1d01ee38211f21c67a4311f90315568b3fa530e6"]="00002dc0: 27000084c0eb4cb9bd000000baf76a40\n00003720: 24f0000000e8261e000084c0eb1eb9f2"
    ["c2f07f4cebf0bfb63e3ca38f811fd5b6112a797e"]="00002dc0: 000084c0eb2141b8c1000000b9586c40\n00003780: 1d000084c0e90d0100009041b8f60000"
    ["796ac7fab2dcad7978a0e8ae48abc9150aba916c"]="000035b0: 74cd4889efe8f623000084c0eb004c8d\n000040a0: fdffff4c89efe80519000084c0eb0048"
    ["22445f5b0d8b6714954b50930c47b8805cf32b98"]="00003850: e7e89a27000084c0eb00488dac249000\n00004340: fdffff4c89efe8a51c000084c0eb0048"
    ["18461b62813166652fd64a96e06237fde81925f7"]="000038e0: e7e89a27000084c0eb00488dac249000\n000043d0: fdffff4c89efe8a51c000084c0eb0048"
    ["d316d5b2b080346b4bc197ad5ad7994ac043a15d"]="00004220: 08fdffffe87722000084c090e9000000\n00004390: ffe80a21000084c090e900000000488b"
    ["a205aa337d808213cf6d4d839b035cde0237b424"]="00004220: 08fdffffe87722000084c090e9000000\n00004390: ffe80a21000084c090e900000000488b"
)

declare -a binpath_list=()

declare -a path_list=(
    "/usr/syno/bin"
    "/volume1/@appstore/VideoStation/bin"
    "/volume2/@appstore/VideoStation/bin"
    "/volume3/@appstore/VideoStation/bin"
    "/volume1/@appstore/MediaServer/bin"
    "/volume2/@appstore/MediaServer/bin"
    "/volume3/@appstore/MediaServer/bin"
    "/volume1/@appstore/SurveillanceStation/bin"
    "/volume2/@appstore/SurveillanceStation/bin"
    "/volume3/@appstore/SurveillanceStation/bin"
    "/volume1/@appstore/CodecPack/bin"
    "/volume2/@appstore/CodecPack/bin"
    "/volume3/@appstore/CodecPack/bin"
    "/volume1/@appstore/AudioStation/bin"
    "/volume2/@appstore/AudioStation/bin"
    "/volume3/@appstore/AudioStation/bin"
)

declare -a versions_list=(
    "6.0 7321-0"
    "6.0 7321-1"
    "6.0 7321-2"
    "6.0 7321-3"
    "6.0 7321-4"
    "6.0 7321-5"
    "6.0 7321-6"
    "6.0 7321-7"
    "6.0.1 7393-0"
    "6.0.1 7393-1"
    "6.0.1 7393-2"
    "6.0.2 8451-0"
    "6.0.2 8451-1"
    "6.0.2 8451-2"
    "6.0.2 8451-3"
    "6.0.2 8451-4"
    "6.0.2 8451-5"
    "6.0.2 8451-6"
    "6.0.2 8451-7"
    "6.0.2 8451-8"
    "6.0.2 8451-9"
    "6.0.2 8451-10"
    "6.0.2 8451-11"
    "6.0.3 8754-0"
    "6.0.3 8754-1"
    "6.0.3 8754-2"
    "6.0.3 8754-3"
    "6.0.3 8754-4"
    "6.0.3 8754-5"
    "6.0.3 8754-6"
    "6.0.3 8754-7"
    "6.0.3 8754-8"
    "6.1 15047-0"
    "6.1 15047-1"
    "6.1 15047-2"
    "6.1.1 15101-0"
    "6.1.1 15101-1"
    "6.1.1 15101-2"
    "6.1.1 15101-3"
    "6.1.1 15101-4"
    "6.1.2 15132-0"
    "6.1.2 15132-1"
    "6.1.3 15152-0"
    "6.1.3 15152-1"
    "6.1.3 15152-2"
    "6.1.3 15152-3"
    "6.1.3 15152-4"
    "6.1.3 15152-5"
    "6.1.3 15152-6"
    "6.1.3 15152-7"
    "6.1.3 15152-8"
    "6.1.4 15217-0"
    "6.1.4 15217-1"
    "6.1.4 15217-2"
    "6.1.4 15217-3"
    "6.1.4 15217-4"
    "6.1.4 15217-5"
    "6.1.4 15217-0"
    "6.1.5 15254-0"
    "6.1.5 15254-1"
    "6.1.6 15266-0"
    "6.1.6 15266-1"
    "6.1.7 15284-0"
    "6.1.7 15284-1"
    "6.1.7 15284-2"
    "6.1.7 15284-3"
    "6.2 23739-0"
    "6.2 23739-1"
    "6.2 23739-2"
    "6.2.1 23824-0"
    "6.2.1 23824-1"
    "6.2.1 23824-2"
    "6.2.1 23824-3"
    "6.2.1 23824-4"
    "6.2.1 23824-5"
    "6.2.1 23824-6"
    "6.2.2 24922-0"
    "6.2.2 24922-1"
    "6.2.2 24922-2"
    "6.2.2 24922-3"
    "6.2.2 24922-4"
    "6.2.2 24922-5"
    "6.2.2 24922-6"
    "6.2.3 25423-0"
    "6.2.3 25426-0"
    "6.2.3 25426-2"
    "6.2.3 25426-3"
    "7.0.1 42218-0"
    "7.0.1 42218-1"
    "7.0.1 42218-2"
    "7.0.1 42218-3"
    "7.1 42661-0"
    "7.1 42661-1"
    "7.1 42661-2"
    "7.1 42661-3"
    "7.1 42661-4"
    "7.1.1 42951"
    "7.1.1 42962-0"
    "7.1.1 42962-1"
    "7.1.1 42962-2"
    "7.1.1 42962-3"
    "7.1.1 42962-4"
    "7.1.1 42962-5"
    "7.1.1 42962-6"
    "7.2 64570-0"
    "7.2 64570-1"
    "7.2.1 69057-0"
    "7.2.1 69057-1"
    "7.2.1 69057-2"
    "7.2.1 69057-3"
    "7.2.1 69057-4"
)

#functions
print_usage() { 
printf "
SYNOPSIS
    patch.sh [-h] [-p|-r|-l]
DESCRIPTION
    Patch to enable transcoding without a valid serial in DSM 6+
        -h      Print this help message
        -p      Patch synocodectool
        -r      Restore from original from backup
        -l      List supported DSM versions
"
}
check_path () {
    for i in "${path_list[@]}"; do
        if [ -e "$i/$bin_file" ]; then
            binpath_list+=( "$i/$bin_file" )
        fi
    done
}

check_version () {
    local ver="$1"
    for i in "${versions_list[@]}" ; do
        [[ "$i" == "$ver" ]] && return 0
    done ||  return 1
}

list_versions () {
    for i in "${versions_list[@]}"; do
        echo "$i"
    done
    return 0
}

patch_menu() {
    local options=("$@")
    echo "Available binaries to patch/restore:"
    local PS3="Please choose which binary you want to patch/restore:"
    select option in "${options[@]}" "Quit"; do    
    if [[ $REPLY = "$(( ${#options[@]}+1 ))" ]] ; then
        echo "Goodbye"
        exit 0
    fi
    bin_path="$option"
    break
done
}

restore_menu() {
    local options=("$@")
    echo "Available backups to restore:"
    local PS3="Please choose which binary you want to restore to $bin_path:"
    select option in "${options[@]}" "Quit"; do    
    if [[ $REPLY = "$(( ${#options[@]}+1 ))" ]] ; then
        echo "Goodbye"
        exit 0
    fi
    backup_file="$option"
    break
done
}

patch_common () {
    source "/etc/VERSION"
    dsm_version="$productversion $buildnumber-$smallfixnumber"
    if [[ ! "$dsm_version" ]] ; then
        echo "Something went wrong. Could not fetch DSM version"
        exit 1
    fi

    echo "Detected DSM version: $dsm_version"

    if ! check_version "$dsm_version" ; then
        echo "Patch for DSM Version ($dsm_version) not found."
        echo "Patch is available for versions: "
        list_versions
        exit 1
    fi
    
    echo "Patch for DSM Version ($dsm_version) AVAILABLE!"    
    check_path
    
    if  ! (( ${#binpath_list[@]} )) ; then
        echo "Something went wrong. Could not find synocodectool"
        exit 1
    fi
    
    patch_menu "${binpath_list[@]}"
}

patch () {
    patch_common
    local backup_path="${bin_path%??????????????}/backup"
    local synocodectool_hash="$(sha1sum "$bin_path" | cut -f1 -d\ )"
    if [[ "${binhash_version_list[$synocodectool_hash]+isset}" ]] ; then
        local backup_identifier="${synocodectool_hash:0:8}"
        if [[ -f "$backup_path/$bin_file.$backup_identifier" ]]; then
            backup_hash="$(sha1sum "$backup_path/$bin_file.$backup_identifier" | cut -f1 -d\ )"
            if [[ "${binhash_version_list[$backup_hash]+isset}" ]]; then
                echo "Restored synocodectool and valid backup detected (DSM ${binhash_version_list[$backup_hash]}) . Patching..."
                echo -e "${binhash_patch_list[$synocodectool_hash]}" | xxd -r - "$bin_path"                
                echo "Patched successfully"
                echo "Creating spoofed activation.conf.."
                if [ ! -e "$conf_path/$conf_file" ] ; then
                    mkdir -p $conf_path
                    echo "$conf_string" > "$conf_path/$conf_file"
                    chattr +i "$conf_path/$conf_file"
                    echo "Spoofed activation.conf created successfully"
                    exit 0
                    else
                    chattr -i "$conf_path/$conf_file"
                    rm "$conf_path/$conf_file"
                    echo "$conf_string" > "$conf_path/$conf_file"
                    chattr +i "$conf_path/$conf_file"
                    echo "Spoofed activation.conf created successfully"
                    exit 0
                fi
            else
                echo "Corrupted backup and original synocodectool detected. Overwriting backup..."
                mkdir -p "$backup_path"
                cp -p "$bin_path" \
                "$backup_path/$bin_file.$backup_identifier"
                exit 0
            fi
        else    
            echo "Detected valid synocodectool. Creating backup.."
            mkdir -p "$backup_path"
            cp -p "$bin_path" \
            "$backup_path/$bin_file.$backup_identifier"
            echo "Patching..."
            echo -e "${binhash_patch_list[$synocodectool_hash]}" | xxd -r - "$bin_path"            
            echo "Patched"
            echo "Creating spoofed activation.conf.."
            if [ ! -e "$conf_path/$conf_file" ] ; then
                mkdir -p $conf_path
                echo "$conf_string" > "$conf_path/$conf_file"
                chattr +i "$conf_path/$conf_file"
                echo "Spoofed activation.conf created successfully"
                exit 0
            else
                chattr -i "$conf_path/$conf_file"
                rm "$conf_path/$conf_file"
                echo "$conf_string" > "$conf_path/$conf_file"
                chattr +i "$conf_path/$conf_file"
                echo "Spoofed activation.conf created successfully"
                exit 0
            fi
        fi
    elif [[ "${patchhash_binhash_list[$synocodectool_hash]+isset}" ]]; then
        local original_hash="${patchhash_binhash_list[$synocodectool_hash]}"
        local backup_identifier="${original_hash:0:8}"
        if [[ -f "$backup_path/$bin_file.$backup_identifier" ]]; then
            backup_hash="$(sha1sum "$backup_path/$bin_file.$backup_identifier" | cut -f1 -d\ )"
            if [[ "$original_hash"="$backup_hash" ]]; then
                echo "Valid backup and patched synocodectool detected. Skipping patch."
                exit 0
            else
                echo "Patched synocodectool and corrupted backup detected. Skipping patch."
                exit 1
            fi
        else
            echo "Patched synocodectool and no backup detected. Skipping patch."
            exit 1  
        fi
    else
            echo "Corrupted synocodectool detected. Please use the -r option to try restoring it."
            exit 1
    fi 
}

rollback () {
    patch_common
    local backup_path="${bin_path%??????????????}/backup"
    local synocodectool_hash="$(sha1sum "$bin_path" | cut -f1 -d\ )"
    if [[ "${patchhash_binhash_list[$synocodectool_hash]+isset}" ]] ; then
        local original_hash="${patchhash_binhash_list[$synocodectool_hash]}"
        local backup_identifier="${original_hash:0:8}"
        if [[ -e "$backup_path/$bin_file.$backup_identifier" ]] ; then
            local backup_hash="$(sha1sum "$backup_path/$bin_file.$backup_identifier" | cut -f1 -d\ )"
                if [[ "$original_hash" = "$backup_hash" ]]; then
                    cp -p "$backup_path/$bin_file.$backup_identifier" \
                    "$bin_path"
                    echo "Backup restored successfully (DSM ${binhash_version_list[$backup_hash]})"
                    exit 0
                else
                    echo "No valid backup found for patched synocodectool currently in use. You can download the original file for DSM ${binhash_version_list[$original_hash]}  from https://github.com/stl88083365/synocodectool-patch/."
                    exit 1
                fi
        else
            echo "No backups found for patched synocodectool currently in use. You can download the original file for DSM ${binhash_version_list[$original_hash]}  from https://github.com/stl88083365/synocodectool-patch/."
            exit 1
        fi
    elif [[ "${binhash_version_list[$synocodectool_hash]+isset}" ]]; then
        echo "Detected unpatched original synocodectool. Restoring not neccessary!"
        exit 0
    else
        echo "Detected corrupted synocodectool."
        local backup_files=( "$backup_path"/* )
        if (( ${#backup_files[@]} )); then
            restore_menu "${backup_files[@]}"
            echo "Checking Hash.."
            local backup_hash="$(sha1sum "$backup_file" | cut -f1 -d\ )"
            if [[ "${binhash_version_list[$backup_hash]+isset}" ]]; then
                cp -p "$backup_file" \
                "$bin_path"
                echo "Backup restored successfully (DSM ${binhash_version_list[$backup_hash]})"
                exit 0
            else
                echo "Not a valid backup. You can either try restoring another backup or download the original file for DSM $dsm_version from https://github.com/stl88083365/synocodectool-patch/."
                exit 1
            fi
        else
            echo "No backups found. You can download the original file for DSM $dsm_version from https://github.com/stl88083365/synocodectool-patch/."
            exit 1
        fi
    fi        
}

#main()
if (( $EUID != 0 )); then
    echo "Please run as root"
    exit 1
fi

while getopts "prhl" flag; do
    case "${flag}" in
        p) opmode="patch";;
        r) opmode="patchrollback" ;;
        h) opmode="${opmode}" ;;
        l) opmode="listversions" ;;
        *) echo "Incorrect option specified in command line" ; exit 2 ;;
    esac
done

case "${opmode}" in
    patch) patch ;;
    patchrollback) rollback ;;
    patchhelp) print_usage ; exit 2 ;;
    listversions) list_versions ;;
    *) echo "Incorrect combination of flags. Use option -h to get help."
       exit 2 ;;
esac

위 첨부 파일을 다운로드하여, 마찬가지로 root 경로로 옮긴다.

출처는 GitHub wirgen SynoCodecTool-Patch이다.

대응되는 버전은 2024년 3월 27일 자 기준으로 최신 버전인 DSM 7.2.1 69057 Update 4까지 가능하다.
최저는 DSM 6.0 7321 Update 0이다.

필자의 버전인 DSM 7.1.1 42962 Update 6을 포함한다.

sudo -i
cd /

필자의 경우 다음과 같다.

mv volume1/Archive-Main/_XPEnology/CodecPatch72/codecpatch72.sh /

다음 명령어를 입력하여, codecpatch72.sh 파일을 부착한다.

sh codecpatch72.sh -p

image.png

1, 2, 3 모두를 설치할 때까지 반복한다.

  1. image.png
  2. image.png

  3. image.png

정상적으로 실행된 경우, 위와 같이 출력된다.

다음 명령어를 입력하여 Video Station의 FFMPEG 패치를 진행한다.

출처는 GitHub AlexPresso VideoStation-FFMPEG-Patcher이며,
다음 명령어로 최신 버전의 설치가 가능하다.
2024년 3월 27일 기준 v3.0이다.

bash -c "$(curl "https://raw.githubusercontent.com/AlexPresso/VideoStation-FFMPEG-Patcher/main/patcher.sh")"

image.png

정상적으로 실행된 경우, 위와 같이 출력된다.

unpatch

Unpatch는 다음 명령어를 사용한다.

curl https://raw.githubusercontent.com/AlexPresso/VideoStation-FFMPEG-Patcher/main/patcher.sh | bash -s -- -a unpatch

image.png

다음 명령어를 입력하여 Wrapper Video Station 패치를 진행한다.

출처는 GitHub Darknebular Wrapper Video Station이며,
다음 명령어로 최신 버전의 설치가 가능하다.
2024년 3월 27일 기준 v3.9.7이다.

bash -c "$(curl "https://raw.githubusercontent.com/darknebular/Wrapper_VideoStation/main/installer.sh")"

image.png

I (대문자 아이)를 입력하여 설치를 진행한다.


Unpatch는 설치 과정에서 선택이 가능하다.

image.png

YES를 입력하면, 삭제 후 자동으로 설치한다.

image.png

정상적으로 실행된 경우, 위와 같이 출력된다.

6. DSM 재부팅

image.png

image.png

재부팅 후 AME를 확인해보면, 위의 두 장의 사진 중 한 장과 같은 상태가 될 것이다.
필자는 첫 번째 사진의 상태이다.

만약 라이센스 가져오기 버튼이 뜬다면, AME를 재설치 하고 5번 과정을 다시 진행한다.

첫 번째 사진의 경우 AAC가 붙지 않은 것을 확인할 수 있는데,
SSH에서 root 권한으로 다음 명령어를 입력하여, 실제로 어떠한지 확인해볼 수 있다.

cat /usr/syno/etc/codec/activation.conf
root@Nori-Archive-II:~# cat /usr/syno/etc/codec/activation.conf
{"success":true,"activated_codec":["hevc_dec","ac3_dec","h264_dec","h264_enc","aac_dec","aac_enc",
"mpeg4part2_dec","vc1_dec","vc1_enc"],"token":"123456789987654abc"}

aac_dec, aac_enc 항목이 확인되므로, AME의 화면과는 관계 없이 정상적으로 작동할 것이다.

 

ERROR 404) Synology Photo 얼굴 인식 패치

 

Synology Photo에서 얼굴 인식을 하기 위한 패치가 남아있지만,
필자의 경우 이 패치를 하지 않아도 얼굴 인식이 가능했다.

만약 패치를 해야하는 경우, 다음 명령어를 입력하여 진행할 수 있다.

wget https://github.com/jinlife/Synology_Photos_Face_Patch/releases/latest/download/libsynophoto-plugin-model.so -O /var/packages/SynologyPhotos/target/usr/lib/libsynophoto-plugin-model.so

이하 테스트 결과

image.png

Video Station에서 DTS 오디오 트랙의 영상이 제대로 재생되는 것을 확인했다.

image.png

코덱 없음 (시놀로지 데모에서 AME를 제거 후 재생)

image.png

Synology Photo HEIC 이미지 테스트

image.png

코덱 없음 (시놀로지 데모에서 AME를 제거 후 실행)

 

Audio Station에서는 AME가 없어도 AAC가 재생되는 것 같음.


주의사항

Synology Photo의 HEIC 및 HEVC의 정상적인 지원을 위해서는,
Synology Photo 혹은 File Station을 이용하여 파일을 업로드하거나 이동하는 것이 권장된다.

만약 Windows의 SMB 혹은 WebDAV으로 파일 탐색기에서 파일을 업로드하거나 이동할 경우
Synology Photo에서 HEIC, HEVC 파일을 읽어 들이지 못 할 수도 있다.

다만, 정상적으로 설치되었다면 SMB를 이용하여도 멀쩡히 인식되어야 한다.

 

자동 재색인은 Photo 경로에서 직접적인 수정이 일어났을 때에만 시행된다.

mount -o bind 혹은 심볼릭 링크로 다른 경로를 붙인 경우, 반드시 Photo 경로에서 작업해야 한다.