HEX
Server: Apache/2.4.63 (Unix)
System: Linux Synopilou92 4.4.302+ #72806 SMP Mon Jul 21 23:16:00 CST 2025 x86_64
User: pilou92 (1026)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: //var/packages/CodecPack/scripts/synoame-get-app-id.py
#!/usr/bin/env python3
import json
import optparse
import pathlib
import re
import subprocess
import sys
import syslog

PLUGIN_ACTION_TYPE_MAPPING = {
    "ui": "--app-id",
    "hevc": "--need-hevc",
    "h264": "--need-h264",
    "vc1": "--need-vc1",
}


def log_info(msg):
    syslog.syslog(syslog.LOG_INFO | syslog.LOG_LOCAL1, msg)
    print(msg)


def update_process_name():
    sys.argv[0] = "synoame-get-app-id.py"


def get_options_parser():
    parser = optparse.OptionParser()
    parser.add_option("--type", dest="type", help="{ui|hevc|h264|vc1}")
    parser.add_option("--output", dest="output", help="write to file instead of stdout")

    return parser


def validate_options(options):
    valid_options = [
        (options.type, ("ui", "hevc", "h264", "vc1")),
    ]
    for value, possible_values in valid_options:
        if value not in possible_values:
            return False
    return True


def validate_app_id(value):
    pattern = "[A-Za-z0-9._-]+"
    return bool(re.fullmatch(pattern, value))


def run_plugin_to_get_app_id(plugin_path, action):
    ret = subprocess.run([plugin_path, action], capture_output=True)

    app_id = ret.stdout.strip().decode("utf-8")
    if app_id == "":
        return None
    if not validate_app_id(app_id):
        log_info(f"[{app_id}] is not valid app id")
        return None

    return app_id


def run_plugins(type):
    full_event = "ame_pack_install"
    plugin_dir = f"/usr/local/plugin/{full_event}"

    p = pathlib.Path(plugin_dir)
    if not p.exists():
        log_info(f"plugin dir {plugin_dir} not exists")
        return []

    app_ids = []
    for f in p.iterdir():
        if not f.is_file():
            continue

        plugin_path = f.as_posix()
        try:
            action = PLUGIN_ACTION_TYPE_MAPPING.get(type)
            app_id = run_plugin_to_get_app_id(plugin_path, action)
            if isinstance(app_id, str) and len(app_id) > 0:
                app_ids.append(app_id)
        except Exception as error:
            log_info(f"Failed to run {plugin_path}, error: {error}")

    return app_ids


if __name__ == "__main__":
    update_process_name()

    parser = get_options_parser()
    (options, args) = parser.parse_args()

    if not options.type:
        parser.print_help()
        sys.exit(1)

    if not validate_options(options):
        parser.print_help()
        sys.exit(1)

    app_ids = run_plugins(options.type)

    if options.output:
        path = options.output
        json.dump(app_ids, open(path, "w"))
    else:
        print(json.dumps(app_ids))

    sys.exit(0)