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)