Implement ViewIt Plugin System Documentation and Update Project Notes
- Added comprehensive documentation for the ViewIt Plugin System, detailing the plugin loading process, required methods, optional features, and community extension workflow. - Updated project notes to reflect the current structure, build process, search logic, and known issues. - Introduced new build scripts for installing the add-on and creating ZIP packages. - Added test scripts for TMDB API integration, including argument parsing and logging functionality. - Enhanced existing plugins with improved search logic and error handling.
This commit is contained in:
BIN
scripts/__pycache__/test_einschalten_api.cpython-312.pyc
Normal file
BIN
scripts/__pycache__/test_einschalten_api.cpython-312.pyc
Normal file
Binary file not shown.
BIN
scripts/__pycache__/test_tmdb.cpython-312.pyc
Normal file
BIN
scripts/__pycache__/test_tmdb.cpython-312.pyc
Normal file
Binary file not shown.
42
scripts/build_install_addon.sh
Executable file
42
scripts/build_install_addon.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
SRC_ADDON_DIR="${ROOT_DIR}/addon"
|
||||
INSTALL_DIR="${ROOT_DIR}/dist"
|
||||
|
||||
ADDON_XML="${SRC_ADDON_DIR}/addon.xml"
|
||||
if [[ ! -f "${ADDON_XML}" ]]; then
|
||||
echo "Missing: ${ADDON_XML}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ADDON_ID="$(python3 - "${ADDON_XML}" <<'PY'
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
tree = ET.parse(sys.argv[1])
|
||||
root = tree.getroot()
|
||||
print(root.attrib.get("id", "plugin.unknown"))
|
||||
PY
|
||||
)"
|
||||
|
||||
DEST_DIR="${INSTALL_DIR}/${ADDON_ID}"
|
||||
|
||||
mkdir -p "${INSTALL_DIR}"
|
||||
rm -rf "${DEST_DIR}"
|
||||
mkdir -p "${DEST_DIR}"
|
||||
|
||||
# Copy add-on files (single source of truth: addon/)
|
||||
if command -v rsync >/dev/null 2>&1; then
|
||||
rsync -a --delete \
|
||||
--exclude '__pycache__/' \
|
||||
--exclude '*.pyc' \
|
||||
"${SRC_ADDON_DIR}/" "${DEST_DIR}/"
|
||||
else
|
||||
cp -a "${SRC_ADDON_DIR}/." "${DEST_DIR}/"
|
||||
find "${DEST_DIR}" -type d -name '__pycache__' -prune -exec rm -rf {} + || true
|
||||
find "${DEST_DIR}" -type f -name '*.pyc' -delete || true
|
||||
fi
|
||||
|
||||
echo "${DEST_DIR}"
|
||||
42
scripts/build_kodi_zip.sh
Executable file
42
scripts/build_kodi_zip.sh
Executable file
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
INSTALL_DIR="${ROOT_DIR}/dist"
|
||||
SRC_ADDON_DIR="${ROOT_DIR}/addon"
|
||||
ADDON_XML="${SRC_ADDON_DIR}/addon.xml"
|
||||
|
||||
if [[ ! -f "${ADDON_XML}" ]]; then
|
||||
echo "Missing: ${ADDON_XML}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ADDON_ID="$(python3 - "${ADDON_XML}" <<'PY'
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
tree = ET.parse(sys.argv[1])
|
||||
root = tree.getroot()
|
||||
print(root.attrib.get("id", "plugin.unknown"))
|
||||
PY
|
||||
)"
|
||||
|
||||
ADDON_VERSION="$(python3 - "${ADDON_XML}" <<'PY'
|
||||
import sys
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
tree = ET.parse(sys.argv[1])
|
||||
root = tree.getroot()
|
||||
print(root.attrib.get("version", "0.0.0"))
|
||||
PY
|
||||
)"
|
||||
|
||||
ZIP_NAME="${ADDON_ID}-${ADDON_VERSION}.zip"
|
||||
ZIP_PATH="${INSTALL_DIR}/${ZIP_NAME}"
|
||||
|
||||
ADDON_DIR="$("${ROOT_DIR}/scripts/build_install_addon.sh" >/dev/null; echo "${INSTALL_DIR}/${ADDON_ID}")"
|
||||
|
||||
rm -f "${ZIP_PATH}"
|
||||
(cd "${INSTALL_DIR}" && zip -r "${ZIP_NAME}" "$(basename "${ADDON_DIR}")" >/dev/null)
|
||||
|
||||
echo "${ZIP_PATH}"
|
||||
50
scripts/test_tmdb.py
Executable file
50
scripts/test_tmdb.py
Executable file
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env python3
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
try:
|
||||
from source.kodi_addon.tmdb import lookup_tv_show
|
||||
except Exception:
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "source", "kodi_addon"))
|
||||
from tmdb import lookup_tv_show # type: ignore[import-not-found]
|
||||
|
||||
|
||||
def main() -> int:
|
||||
parser = argparse.ArgumentParser(description="Manueller Test fuer tmdb.py (Plot + Poster).")
|
||||
parser.add_argument("title", nargs="?", default="Dark", help="Serientitel (Default: Dark)")
|
||||
parser.add_argument("--key", default=os.environ.get("TMDB_API_KEY", ""), help="TMDB API Key (oder env TMDB_API_KEY)")
|
||||
parser.add_argument("--lang", default=os.environ.get("TMDB_LANGUAGE", "de-DE"), help="Sprache, z.B. de-DE")
|
||||
parser.add_argument("--log-responses", action="store_true", help="Antwort-JSON (gekürzt) loggen")
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.key:
|
||||
print(
|
||||
"Fehlt: --key oder env TMDB_API_KEY\n"
|
||||
"Beispiel: TMDB_API_KEY=DEIN_KEY ./scripts/test_tmdb.py\n"
|
||||
"Oder: ./scripts/test_tmdb.py \"Dark\" --key DEIN_KEY",
|
||||
file=sys.stderr,
|
||||
)
|
||||
return 2
|
||||
|
||||
meta = lookup_tv_show(
|
||||
title=args.title,
|
||||
api_key=args.key,
|
||||
language=args.lang,
|
||||
log=print,
|
||||
log_responses=args.log_responses,
|
||||
)
|
||||
if not meta:
|
||||
print("Kein Treffer / keine Meta-Daten.")
|
||||
return 1
|
||||
|
||||
print("\nRESULT")
|
||||
print("plot:", (meta.plot or "")[:500])
|
||||
print("poster:", meta.poster)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user