From 26cc319a2291fe24cd24730e6289b1d5a4a8d112 Mon Sep 17 00:00:00 2001 From: LordGrey <48840279+Lord-Grey@users.noreply.github.com> Date: Sun, 20 Aug 2023 14:16:11 +0200 Subject: [PATCH] Auto PR creating, GitHub Releases & Clean-ups (#49) * Allow to publish PR + cleanups * Enable dependabot * Updates after linter * fix: make mypy happy * New version for clean-ups * Add release flow * fix: handle PIL library on android --------- Co-authored-by: Andrea Ghensi --- .gitattributes | 2 + .github/dependabot.yml | 7 + .github/workflows/publish-addon.yml | 69 ++ .gitignore | 15 +- .pre-commit-config.yaml | 35 + Pipfile | 18 + README.md | 17 +- addon.py | 43 -- pyproject.toml | 34 + resources/fanart.png | Bin 66900 -> 0 bytes resources/lib/hyperion/message_pb2.py | 384 ----------- resources/lib/misc.py | 48 -- .../addon.xml | 20 +- .../resources}/__init__.py | 0 script.service.hyperion/resources/fanart.png | Bin 0 -> 70622 bytes .../resources}/icon.png | Bin .../resource.language.de_de/strings.po | 0 .../resource.language.en_gb/strings.po | 18 +- .../resource.language.he_il/strings.po | 0 .../resource.language.it_it/strings.po | 0 .../resources}/lib/__init__.py | 0 .../resources}/lib/hyperion/__init__.py | 0 .../resources}/lib/hyperion/hyperion.py | 84 +-- .../resources}/lib/hyperion/message.proto | 0 .../resources/lib/hyperion/message_pb2.py | 617 ++++++++++++++++++ script.service.hyperion/resources/lib/misc.py | 47 ++ .../resources}/lib/monitor.py | 61 +- .../resources}/lib/settings.py | 43 +- .../resources}/screenshot-01.png | Bin .../resources}/settings.xml | 0 script.service.hyperion/service.py | 42 ++ 31 files changed, 1018 insertions(+), 586 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/publish-addon.yml create mode 100644 .pre-commit-config.yaml create mode 100644 Pipfile delete mode 100644 addon.py create mode 100644 pyproject.toml delete mode 100644 resources/fanart.png delete mode 100644 resources/lib/hyperion/message_pb2.py delete mode 100644 resources/lib/misc.py rename addon.xml => script.service.hyperion/addon.xml (71%) rename {resources => script.service.hyperion/resources}/__init__.py (100%) create mode 100644 script.service.hyperion/resources/fanart.png rename {resources => script.service.hyperion/resources}/icon.png (100%) rename {resources => script.service.hyperion/resources}/language/resource.language.de_de/strings.po (100%) rename {resources => script.service.hyperion/resources}/language/resource.language.en_gb/strings.po (80%) rename {resources => script.service.hyperion/resources}/language/resource.language.he_il/strings.po (100%) rename {resources => script.service.hyperion/resources}/language/resource.language.it_it/strings.po (100%) rename {resources => script.service.hyperion/resources}/lib/__init__.py (100%) rename {resources => script.service.hyperion/resources}/lib/hyperion/__init__.py (100%) rename {resources => script.service.hyperion/resources}/lib/hyperion/hyperion.py (68%) rename {resources => script.service.hyperion/resources}/lib/hyperion/message.proto (100%) create mode 100644 script.service.hyperion/resources/lib/hyperion/message_pb2.py create mode 100644 script.service.hyperion/resources/lib/misc.py rename {resources => script.service.hyperion/resources}/lib/monitor.py (73%) rename {resources => script.service.hyperion/resources}/lib/settings.py (51%) rename {resources => script.service.hyperion/resources}/screenshot-01.png (100%) rename {resources => script.service.hyperion/resources}/settings.xml (100%) create mode 100644 script.service.hyperion/service.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..e33811f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" diff --git a/.github/workflows/publish-addon.yml b/.github/workflows/publish-addon.yml new file mode 100644 index 0000000..5f800d0 --- /dev/null +++ b/.github/workflows/publish-addon.yml @@ -0,0 +1,69 @@ +name: Check, release and publish addon + +on: [push] + +env: + ADDON_NAME: script.service.hyperion + TARGET_KODI_VER: nexus + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: "3.11" + - name: Install addon checker + run: | + pip install -q kodi-addon-checker + - name: Check with addon-checker + run: | + kodi-addon-checker --branch $TARGET_KODI_VER --allow-folder-id-mismatch $ADDON_NAME + + github_release: + runs-on: ubuntu-latest + permissions: + contents: write + + needs: check + if: github.ref_type == 'tag' + steps: + - uses: actions/checkout@v3 + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: "3.11" + - name: Install addon submitter + run: | + pip install -q git+https://github.com/xbmc/kodi-addon-submitter.git + - name: Package addon + run: | + submit-addon -s -z $ADDON_NAME + - name: Publish release + uses: ncipollo/release-action@v1 + with: + artifacts: "*.zip" + + kodi_publish: + runs-on: ubuntu-latest + + needs: check + if: github.ref_type == 'tag' + steps: + - uses: actions/checkout@v3 + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: "3.11" + - name: Install addon submitter + run: | + pip install -q git+https://github.com/xbmc/kodi-addon-submitter.git + - name: Submit addon + run: | + submit-addon -r repo-scripts -b $TARGET_KODI_VER -s --pull-request $ADDON_NAME + env: + GH_USERNAME: ${{ github.actor }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} + EMAIL: "${{ github.actor }}@users.noreply.github.com" diff --git a/.gitignore b/.gitignore index 9f11b75..7507c49 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,14 @@ -.idea/ +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# python +*.pyo +__pycache__ +.idea +Pipfile.lock +.mypy_cache +.ruff_cache diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..1aa1776 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,35 @@ +default_language_version: + python: python3 +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.3.0 + hooks: + - id: check-toml + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + - id: check-added-large-files + - repo: https://github.com/executablebooks/mdformat + rev: 0.7.16 + hooks: + - id: mdformat + exclude: CHANGELOG.md + additional_dependencies: + - mdformat-black + - mdformat-frontmatter + - mdformat-admon + - repo: https://github.com/psf/black + rev: 22.10.0 + hooks: + - id: black + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: 'v0.0.252' + hooks: + - id: ruff + args: [--fix, --exit-non-zero-on-fix] + - repo: https://github.com/pre-commit/mirrors-mypy + rev: 'v1.4.1' + hooks: + - id: mypy + additional_dependencies: + - types-protobuf diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..0b8cebf --- /dev/null +++ b/Pipfile @@ -0,0 +1,18 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] +kodistubs = "*" +kodi-addon-checker = "*" + +[requires] +python_version = "3.11" + +[scripts] +pre-commit = "pre-commit install" +lint = "pre-commit run --all" +check = "kodi-addon-checker --branch nexus --allow-folder-id-mismatch script.service.hyperion-control" diff --git a/README.md b/README.md index 19d2ba6..4f923b7 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,15 @@ -# script.service.hyperion +# Hyperion Capture for Kodi 20 (Nexus) + +[![Latest-Release](https://img.shields.io/github/v/release/hyperion-project/hyperion.kodi?include_prereleases&label=Latest%20Release&logo=github&logoColor=white&color=0f83e7)](https://github.com/hyperion-project/hyperion.kodi/releases) +[![Join Translation](https://img.shields.io/badge/POEditor-translate-green.svg)](https://poeditor.com/join/project/yKr4KrF7G2) +[![Forum](https://img.shields.io/website/https/hyperion-project.org.svg?label=Forum&down_color=red&down_message=offline&up_color=4bc51d&up_message=online&logo=homeadvisor&logoColor=white)](https://www.hyperion-project.org) Kodi add-on to capture video data and send it to Hyperion. -Note that this plugin does not currently work for Kodi running on Raspberry Pi. -There is an outstanding Kodi fix for that. -Information about Hyperion can be found here: https://wiki.hyperion-project.org +**Note:** This plugin does not currently work for Kodi running on Raspberry Pi. There is an outstanding Kodi fix for that. + +Information about Hyperion can be found here: + +### Installation -The add-on can be installed by downloading the zip and installing it via the Kodi Add-On zip install or -extracting it to the addons directory (i.e.~/.kodi/addons on Linux or %AppData%\Kodi\addons on Windows) +- Download .zip from release page and use "Install from zip file" dialog at the Kodi addons section. diff --git a/addon.py b/addon.py deleted file mode 100644 index 872c430..0000000 --- a/addon.py +++ /dev/null @@ -1,43 +0,0 @@ -""" - Kodi video capturer for Hyperion - - Copyright (c) 2013-1016 Hyperion Team - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -""" - -import xbmc -import xbmcaddon - -from resources.lib.misc import MessageHandler -from resources.lib.settings import Settings -from resources.lib.monitor import HyperionMonitor - - -def main(): - addon = xbmcaddon.Addon() - player = xbmc.Player() - settings = Settings(addon.getSettings()) - output_handler = MessageHandler(addon) - monitor = HyperionMonitor(settings, player, output_handler) - monitor.main_loop() - - -if __name__ == "__main__": - main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..35183e6 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,34 @@ +[tool.mypy] +check_untyped_defs = true +disallow_any_generics = true +disallow_incomplete_defs = true +disallow_untyped_calls = false +disallow_untyped_defs = true +no_implicit_optional = true +show_error_codes = true +strict_equality = true +strict_optional = true +warn_redundant_casts = true +warn_unreachable = true +warn_unused_configs = true +warn_unused_ignores = true + +[tool.ruff] +select = ["B", "C", "D", "E", "F", "I", "N", "S", "U", "W"] +ignore = ["E501", "D212", "D103", "D107"] +target-version = "py310" +src = ["resources"] + +[tool.ruff.per-file-ignores] +"script.service.hyperion/resources/lib/monitor.py" = ["N802", "D102"] +"script.service.hyperion/resources/lib/hyperion/message_pb2.py" = ["D100"] +"__init__.py" = ["D104"] + +[tool.ruff.pydocstyle] +convention = "google" + +[tool.ruff.isort] +force-single-line = true + +[tool.ruff.pyupgrade] +keep-runtime-typing = true diff --git a/resources/fanart.png b/resources/fanart.png deleted file mode 100644 index 9b0d3f1b25c70be911aa951375c0b0cc44065ddc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66900 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

=Bm4mwp1@BEZ;T7b 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 diff --git a/resources/lib/hyperion/message_pb2.py b/resources/lib/hyperion/message_pb2.py deleted file mode 100644 index d872395..0000000 --- a/resources/lib/hyperion/message_pb2.py +++ /dev/null @@ -1,384 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: message.proto -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='message.proto', - package='proto', - syntax='proto2', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\rmessage.proto\x12\x05proto\"\x82\x01\n\x0fHyperionRequest\x12/\n\x07\x63ommand\x18\x01 \x02(\x0e\x32\x1e.proto.HyperionRequest.Command\"8\n\x07\x43ommand\x12\t\n\x05\x43OLOR\x10\x01\x12\t\n\x05IMAGE\x10\x02\x12\t\n\x05\x43LEAR\x10\x03\x12\x0c\n\x08\x43LEARALL\x10\x04*\x04\x08\n\x10\x65\"\x87\x01\n\x0c\x43olorRequest\x12\x10\n\x08priority\x18\x01 \x02(\x05\x12\x10\n\x08RgbColor\x18\x02 \x02(\x05\x12\x10\n\x08\x64uration\x18\x03 \x01(\x05\x32\x41\n\x0c\x63olorRequest\x12\x16.proto.HyperionRequest\x18\n \x01(\x0b\x32\x13.proto.ColorRequest\"\xb1\x01\n\x0cImageRequest\x12\x10\n\x08priority\x18\x01 \x02(\x05\x12\x12\n\nimagewidth\x18\x02 \x02(\x05\x12\x13\n\x0bimageheight\x18\x03 \x02(\x05\x12\x11\n\timagedata\x18\x04 \x02(\x0c\x12\x10\n\x08\x64uration\x18\x05 \x01(\x05\x32\x41\n\x0cimageRequest\x12\x16.proto.HyperionRequest\x18\x0b \x01(\x0b\x32\x13.proto.ImageRequest\"c\n\x0c\x43learRequest\x12\x10\n\x08priority\x18\x01 \x02(\x05\x32\x41\n\x0c\x63learRequest\x12\x16.proto.HyperionRequest\x18\x0c \x01(\x0b\x32\x13.proto.ClearRequest\"\x85\x01\n\rHyperionReply\x12\'\n\x04type\x18\x01 \x02(\x0e\x32\x19.proto.HyperionReply.Type\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\r\n\x05video\x18\x04 \x01(\x05\"\x1c\n\x04Type\x12\t\n\x05REPLY\x10\x01\x12\t\n\x05VIDEO\x10\x02' -) - - - -_HYPERIONREQUEST_COMMAND = _descriptor.EnumDescriptor( - name='Command', - full_name='proto.HyperionRequest.Command', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='COLOR', index=0, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='IMAGE', index=1, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='CLEAR', index=2, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='CLEARALL', index=3, number=4, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=93, - serialized_end=149, -) -_sym_db.RegisterEnumDescriptor(_HYPERIONREQUEST_COMMAND) - -_HYPERIONREPLY_TYPE = _descriptor.EnumDescriptor( - name='Type', - full_name='proto.HyperionReply.Type', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='REPLY', index=0, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='VIDEO', index=1, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - serialized_start=682, - serialized_end=710, -) -_sym_db.RegisterEnumDescriptor(_HYPERIONREPLY_TYPE) - - -_HYPERIONREQUEST = _descriptor.Descriptor( - name='HyperionRequest', - full_name='proto.HyperionRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='command', full_name='proto.HyperionRequest.command', index=0, - number=1, type=14, cpp_type=8, label=2, - has_default_value=False, default_value=1, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _HYPERIONREQUEST_COMMAND, - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(10, 101), ], - oneofs=[ - ], - serialized_start=25, - serialized_end=155, -) - - -_COLORREQUEST = _descriptor.Descriptor( - name='ColorRequest', - full_name='proto.ColorRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='priority', full_name='proto.ColorRequest.priority', index=0, - number=1, type=5, cpp_type=1, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='RgbColor', full_name='proto.ColorRequest.RgbColor', index=1, - number=2, type=5, cpp_type=1, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='duration', full_name='proto.ColorRequest.duration', index=2, - number=3, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - _descriptor.FieldDescriptor( - name='colorRequest', full_name='proto.ColorRequest.colorRequest', index=0, - number=10, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - serialized_start=158, - serialized_end=293, -) - - -_IMAGEREQUEST = _descriptor.Descriptor( - name='ImageRequest', - full_name='proto.ImageRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='priority', full_name='proto.ImageRequest.priority', index=0, - number=1, type=5, cpp_type=1, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='imagewidth', full_name='proto.ImageRequest.imagewidth', index=1, - number=2, type=5, cpp_type=1, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='imageheight', full_name='proto.ImageRequest.imageheight', index=2, - number=3, type=5, cpp_type=1, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='imagedata', full_name='proto.ImageRequest.imagedata', index=3, - number=4, type=12, cpp_type=9, label=2, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='duration', full_name='proto.ImageRequest.duration', index=4, - number=5, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - _descriptor.FieldDescriptor( - name='imageRequest', full_name='proto.ImageRequest.imageRequest', index=0, - number=11, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - serialized_start=296, - serialized_end=473, -) - - -_CLEARREQUEST = _descriptor.Descriptor( - name='ClearRequest', - full_name='proto.ClearRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='priority', full_name='proto.ClearRequest.priority', index=0, - number=1, type=5, cpp_type=1, label=2, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - _descriptor.FieldDescriptor( - name='clearRequest', full_name='proto.ClearRequest.clearRequest', index=0, - number=12, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=True, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - serialized_start=475, - serialized_end=574, -) - - -_HYPERIONREPLY = _descriptor.Descriptor( - name='HyperionReply', - full_name='proto.HyperionReply', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='type', full_name='proto.HyperionReply.type', index=0, - number=1, type=14, cpp_type=8, label=2, - has_default_value=False, default_value=1, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='success', full_name='proto.HyperionReply.success', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='error', full_name='proto.HyperionReply.error', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='video', full_name='proto.HyperionReply.video', index=3, - number=4, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _HYPERIONREPLY_TYPE, - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - serialized_start=577, - serialized_end=710, -) - -_HYPERIONREQUEST.fields_by_name['command'].enum_type = _HYPERIONREQUEST_COMMAND -_HYPERIONREQUEST_COMMAND.containing_type = _HYPERIONREQUEST -_HYPERIONREPLY.fields_by_name['type'].enum_type = _HYPERIONREPLY_TYPE -_HYPERIONREPLY_TYPE.containing_type = _HYPERIONREPLY -DESCRIPTOR.message_types_by_name['HyperionRequest'] = _HYPERIONREQUEST -DESCRIPTOR.message_types_by_name['ColorRequest'] = _COLORREQUEST -DESCRIPTOR.message_types_by_name['ImageRequest'] = _IMAGEREQUEST -DESCRIPTOR.message_types_by_name['ClearRequest'] = _CLEARREQUEST -DESCRIPTOR.message_types_by_name['HyperionReply'] = _HYPERIONREPLY -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -HyperionRequest = _reflection.GeneratedProtocolMessageType('HyperionRequest', (_message.Message,), { - 'DESCRIPTOR' : _HYPERIONREQUEST, - '__module__' : 'message_pb2' - # @@protoc_insertion_point(class_scope:proto.HyperionRequest) - }) -_sym_db.RegisterMessage(HyperionRequest) - -ColorRequest = _reflection.GeneratedProtocolMessageType('ColorRequest', (_message.Message,), { - 'DESCRIPTOR' : _COLORREQUEST, - '__module__' : 'message_pb2' - # @@protoc_insertion_point(class_scope:proto.ColorRequest) - }) -_sym_db.RegisterMessage(ColorRequest) - -ImageRequest = _reflection.GeneratedProtocolMessageType('ImageRequest', (_message.Message,), { - 'DESCRIPTOR' : _IMAGEREQUEST, - '__module__' : 'message_pb2' - # @@protoc_insertion_point(class_scope:proto.ImageRequest) - }) -_sym_db.RegisterMessage(ImageRequest) - -ClearRequest = _reflection.GeneratedProtocolMessageType('ClearRequest', (_message.Message,), { - 'DESCRIPTOR' : _CLEARREQUEST, - '__module__' : 'message_pb2' - # @@protoc_insertion_point(class_scope:proto.ClearRequest) - }) -_sym_db.RegisterMessage(ClearRequest) - -HyperionReply = _reflection.GeneratedProtocolMessageType('HyperionReply', (_message.Message,), { - 'DESCRIPTOR' : _HYPERIONREPLY, - '__module__' : 'message_pb2' - # @@protoc_insertion_point(class_scope:proto.HyperionReply) - }) -_sym_db.RegisterMessage(HyperionReply) - -_COLORREQUEST.extensions_by_name['colorRequest'].message_type = _COLORREQUEST -HyperionRequest.RegisterExtension(_COLORREQUEST.extensions_by_name['colorRequest']) -_IMAGEREQUEST.extensions_by_name['imageRequest'].message_type = _IMAGEREQUEST -HyperionRequest.RegisterExtension(_IMAGEREQUEST.extensions_by_name['imageRequest']) -_CLEARREQUEST.extensions_by_name['clearRequest'].message_type = _CLEARREQUEST -HyperionRequest.RegisterExtension(_CLEARREQUEST.extensions_by_name['clearRequest']) - -# @@protoc_insertion_point(module_scope) diff --git a/resources/lib/misc.py b/resources/lib/misc.py deleted file mode 100644 index 9e8ccf6..0000000 --- a/resources/lib/misc.py +++ /dev/null @@ -1,48 +0,0 @@ -""" - Kodi video capturer for Hyperion - - Copyright (c) 2013-2016 Hyperion Team - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. -""" -from __future__ import annotations - -import xbmc -import xbmcaddon - - -class MessageHandler: - """Notify and logging facility for Kodi add-ons.""" - - def __init__(self, addon: xbmcaddon.Addon) -> None: - self._addon = addon - self._addon_name = addon.getAddonInfo('name') - self._addon_icon = addon.getAddonInfo('icon') - - def log(self, message: str, level=xbmc.LOGDEBUG) -> None: - """Writes the message to the logger with the addon name as prefix.""" - xbmc.log(f"[{self._addon_name}] - {message}", level=level) - - def notify(self, label_id: int) -> None: - """Displays a notification with the localized message.""" - message = self._addon.getLocalizedString(label_id) - xbmc.executebuiltin( - f"XBMC.Notification({self._addon_name},{message},1000,{self._addon_icon})" - ) - \ No newline at end of file diff --git a/addon.xml b/script.service.hyperion/addon.xml similarity index 71% rename from addon.xml rename to script.service.hyperion/addon.xml index d432956..6979809 100644 --- a/addon.xml +++ b/script.service.hyperion/addon.xml @@ -1,32 +1,36 @@ - + + - +

Capture and send your current Kodi-picture to your Hyperion Ambient Lighting system. Übermittle das aktuelle Kodi-Bild an dein Hyperion Ambient Lighting System. Cattura e invia l'immagine corrente di Kodi ad tuo sistema di Ambient Lighting Hyperion. Hyperion is an opensource Bias or Ambient Lighting implementation which runs on many devices.[CR]This addon sends through the Hyperion PROTO-port your current picture to your Hyperion daemon for further processing like black border detection or smoothing. Hyperion ist ein Bias oder Ambient Lighting System, welches auf vielen Plattformen lauffähig ist.[CR]Dieses Addon sendet über den PROTO-Port laufend Bilder an Hyperion. - Hyperion è un'implentazione open source di Bias o Ambient Lighting che supporta molti dispositivi.[CR]Questo addon invia l'immagine corrente alla porta PROTO del demone Hyperion per ulteriori elaborazioni come il rilevamento bordi neri o lo smoothing. - en de he + Hyperion è un'implementazione open source di Bias o Ambient Lighting che supporta molti dispositivi.[CR]Questo addon invia l'immagine corrente alla porta PROTO del demone Hyperion per ulteriori elaborazioni come il rilevamento bordi neri o lo smoothing. all https://hyperion-project.org/forum https://www.hyperion-project.org https://github.com/hyperion-project/hyperion.kodi MIT - v1.0.6 - - Kodi Nexus support. Dropped earlier versions. - - Maintain aspect-ratio for grapped images + + 20.0.1 + - Clean-ups + - Handle missing PIL library on Android + 20.0.0 + - Kodi 20 (Nexus) support + - New languages: Hebrew, Italian resources/icon.png resources/fanart.png resources/screenshot-01.png - + diff --git a/resources/__init__.py b/script.service.hyperion/resources/__init__.py similarity index 100% rename from resources/__init__.py rename to script.service.hyperion/resources/__init__.py diff --git a/script.service.hyperion/resources/fanart.png b/script.service.hyperion/resources/fanart.png new file mode 100644 index 0000000000000000000000000000000000000000..3944f05142be3ba7fa294e3909e66ec919bea33c GIT binary patch literal 70622 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 E0Jhw<#sB~S literal 0 HcmV?d00001 diff --git a/resources/icon.png b/script.service.hyperion/resources/icon.png similarity index 100% rename from resources/icon.png rename to script.service.hyperion/resources/icon.png diff --git a/resources/language/resource.language.de_de/strings.po b/script.service.hyperion/resources/language/resource.language.de_de/strings.po similarity index 100% rename from resources/language/resource.language.de_de/strings.po rename to script.service.hyperion/resources/language/resource.language.de_de/strings.po diff --git a/resources/language/resource.language.en_gb/strings.po b/script.service.hyperion/resources/language/resource.language.en_gb/strings.po similarity index 80% rename from resources/language/resource.language.en_gb/strings.po rename to script.service.hyperion/resources/language/resource.language.en_gb/strings.po index fe54ac7..f52092c 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/script.service.hyperion/resources/language/resource.language.en_gb/strings.po @@ -16,39 +16,39 @@ msgstr "" msgctxt "#32001" msgid "General" -msgstr "" +msgstr "General" msgctxt "#32002" msgid "Enable addon (Grabbing)" -msgstr "" +msgstr "Enable addon (Grabbing)" msgctxt "#32003" msgid "Hyperion hostname or IP-address" -msgstr "" +msgstr "Hyperion hostname or IP-address" msgctxt "#32004" msgid "Hyperion host PROTO-port" -msgstr "" +msgstr "Hyperion host PROTO-port" msgctxt "#32005" msgid "Hyperion priority channel" -msgstr "" +msgstr "Hyperion priority channel" msgctxt "#32006" msgid "Reconnect timeout (s)" -msgstr "" +msgstr "Reconnect timeout (s)" msgctxt "#32007" msgid "Enable when on screensaver" -msgstr "" +msgstr "Enable when on screensaver" msgctxt "#32008" msgid "Grabber picture width (pixel)" -msgstr "" +msgstr "Grabber picture width (pixel)" msgctxt "#32010" msgid "Frame rate (fps)" -msgstr "" +msgstr "Frame rate (fps)" msgctxt "#32100" msgid "Error: Unable to connect to Hyperion. Wrong hostname or IP-address?" diff --git a/resources/language/resource.language.he_il/strings.po b/script.service.hyperion/resources/language/resource.language.he_il/strings.po similarity index 100% rename from resources/language/resource.language.he_il/strings.po rename to script.service.hyperion/resources/language/resource.language.he_il/strings.po diff --git a/resources/language/resource.language.it_it/strings.po b/script.service.hyperion/resources/language/resource.language.it_it/strings.po similarity index 100% rename from resources/language/resource.language.it_it/strings.po rename to script.service.hyperion/resources/language/resource.language.it_it/strings.po diff --git a/resources/lib/__init__.py b/script.service.hyperion/resources/lib/__init__.py similarity index 100% rename from resources/lib/__init__.py rename to script.service.hyperion/resources/lib/__init__.py diff --git a/resources/lib/hyperion/__init__.py b/script.service.hyperion/resources/lib/hyperion/__init__.py similarity index 100% rename from resources/lib/hyperion/__init__.py rename to script.service.hyperion/resources/lib/hyperion/__init__.py diff --git a/resources/lib/hyperion/hyperion.py b/script.service.hyperion/resources/lib/hyperion/hyperion.py similarity index 68% rename from resources/lib/hyperion/hyperion.py rename to script.service.hyperion/resources/lib/hyperion/hyperion.py index aa8a511..1597914 100644 --- a/resources/lib/hyperion/hyperion.py +++ b/script.service.hyperion/resources/lib/hyperion/hyperion.py @@ -1,36 +1,39 @@ """ - Kodi video capturer for Hyperion - - Copyright (c) 2013-2016 Hyperion Team - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +Kodi video capturer for Hyperion. + +Copyright (c) 2013-2023 Hyperion Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. """ +# mypy: ignore-errors import socket import struct +from typing import Any -from .message_pb2 import HyperionRequest -from .message_pb2 import HyperionReply +from .message_pb2 import ClearRequest from .message_pb2 import ColorRequest +from .message_pb2 import HyperionReply +from .message_pb2 import HyperionRequest from .message_pb2 import ImageRequest -from .message_pb2 import ClearRequest -class Hyperion(object): + +class Hyperion: """ Hyperion connection class. @@ -40,10 +43,10 @@ class Hyperion(object): Note that the function will block until a reply has been received from the Hyperion server (or the call has timed out) """ - + def __init__(self, server: str, port: int) -> None: """ - Constructor + Constructor. Args: server: server address of Hyperion @@ -57,13 +60,13 @@ def __init__(self, server: str, port: int) -> None: self._socket.connect((server, port)) def __del__(self) -> None: - """Destructor""" + """Destructor.""" # close the socket self._socket.close() - def send_color(self, color, priority, duration = -1) -> None: + def send_color(self, color: int, priority: int, duration: int = -1) -> None: """ - Send a static color to Hyperion + Send a static color to Hyperion. Args: color: integer value with the color as 0x00RRGGBB @@ -77,10 +80,12 @@ def send_color(self, color, priority, duration = -1) -> None: color_request.priority = priority color_request.duration = duration self._send_message(request) - - def send_image(self, width, height, data, priority, duration = -1) -> None: + + def send_image( + self, width: int, height: int, data: bytes, priority: int, duration: int = -1 + ) -> None: """ - Send an image to Hyperion + Send an image to Hyperion. Args: width: width of the image @@ -98,9 +103,9 @@ def send_image(self, width, height, data, priority, duration = -1) -> None: image_request.priority = priority image_request.duration = duration self._send_message(request) - - def clear(self, priority) -> None: - """Clear the given priority channel + + def clear(self, priority: int) -> None: + """Clear the given priority channel. Args: priority: the priority channel to clear @@ -110,14 +115,14 @@ def clear(self, priority) -> None: clear_request = request.Extensions[ClearRequest.clearRequest] clear_request.priority = priority self._send_message(request) - + def clear_all(self) -> None: """Clear all active priority channels.""" request = HyperionRequest() request.command = HyperionRequest.CLEARALL self._send_message(request) - - def _send_message(self, message: HyperionRequest) -> None: + + def _send_message(self, message: Any) -> None: """ Send the given proto message to Hyperion. @@ -126,7 +131,6 @@ def _send_message(self, message: HyperionRequest) -> None: Args: message : proto request to send """ - binary_request = message.SerializeToString() binary_size = struct.pack(">I", len(binary_request)) self._socket.sendall(binary_size) diff --git a/resources/lib/hyperion/message.proto b/script.service.hyperion/resources/lib/hyperion/message.proto similarity index 100% rename from resources/lib/hyperion/message.proto rename to script.service.hyperion/resources/lib/hyperion/message.proto diff --git a/script.service.hyperion/resources/lib/hyperion/message_pb2.py b/script.service.hyperion/resources/lib/hyperion/message_pb2.py new file mode 100644 index 0000000..707b36c --- /dev/null +++ b/script.service.hyperion/resources/lib/hyperion/message_pb2.py @@ -0,0 +1,617 @@ +# mypy: ignore-errors +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: message.proto +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +DESCRIPTOR = _descriptor.FileDescriptor( + name="message.proto", + package="proto", + syntax="proto2", + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\rmessage.proto\x12\x05proto"\x82\x01\n\x0fHyperionRequest\x12/\n\x07\x63ommand\x18\x01 \x02(\x0e\x32\x1e.proto.HyperionRequest.Command"8\n\x07\x43ommand\x12\t\n\x05\x43OLOR\x10\x01\x12\t\n\x05IMAGE\x10\x02\x12\t\n\x05\x43LEAR\x10\x03\x12\x0c\n\x08\x43LEARALL\x10\x04*\x04\x08\n\x10\x65"\x87\x01\n\x0c\x43olorRequest\x12\x10\n\x08priority\x18\x01 \x02(\x05\x12\x10\n\x08RgbColor\x18\x02 \x02(\x05\x12\x10\n\x08\x64uration\x18\x03 \x01(\x05\x32\x41\n\x0c\x63olorRequest\x12\x16.proto.HyperionRequest\x18\n \x01(\x0b\x32\x13.proto.ColorRequest"\xb1\x01\n\x0cImageRequest\x12\x10\n\x08priority\x18\x01 \x02(\x05\x12\x12\n\nimagewidth\x18\x02 \x02(\x05\x12\x13\n\x0bimageheight\x18\x03 \x02(\x05\x12\x11\n\timagedata\x18\x04 \x02(\x0c\x12\x10\n\x08\x64uration\x18\x05 \x01(\x05\x32\x41\n\x0cimageRequest\x12\x16.proto.HyperionRequest\x18\x0b \x01(\x0b\x32\x13.proto.ImageRequest"c\n\x0c\x43learRequest\x12\x10\n\x08priority\x18\x01 \x02(\x05\x32\x41\n\x0c\x63learRequest\x12\x16.proto.HyperionRequest\x18\x0c \x01(\x0b\x32\x13.proto.ClearRequest"\x85\x01\n\rHyperionReply\x12\'\n\x04type\x18\x01 \x02(\x0e\x32\x19.proto.HyperionReply.Type\x12\x0f\n\x07success\x18\x02 \x01(\x08\x12\r\n\x05\x65rror\x18\x03 \x01(\t\x12\r\n\x05video\x18\x04 \x01(\x05"\x1c\n\x04Type\x12\t\n\x05REPLY\x10\x01\x12\t\n\x05VIDEO\x10\x02', +) + + +_HYPERIONREQUEST_COMMAND = _descriptor.EnumDescriptor( + name="Command", + full_name="proto.HyperionRequest.Command", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="COLOR", + index=0, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="IMAGE", + index=1, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="CLEAR", + index=2, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="CLEARALL", + index=3, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=93, + serialized_end=149, +) +_sym_db.RegisterEnumDescriptor(_HYPERIONREQUEST_COMMAND) + +_HYPERIONREPLY_TYPE = _descriptor.EnumDescriptor( + name="Type", + full_name="proto.HyperionReply.Type", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="REPLY", + index=0, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="VIDEO", + index=1, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=682, + serialized_end=710, +) +_sym_db.RegisterEnumDescriptor(_HYPERIONREPLY_TYPE) + + +_HYPERIONREQUEST = _descriptor.Descriptor( + name="HyperionRequest", + full_name="proto.HyperionRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="command", + full_name="proto.HyperionRequest.command", + index=0, + number=1, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=1, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[ + _HYPERIONREQUEST_COMMAND, + ], + serialized_options=None, + is_extendable=True, + syntax="proto2", + extension_ranges=[ + (10, 101), + ], + oneofs=[], + serialized_start=25, + serialized_end=155, +) + + +_COLORREQUEST = _descriptor.Descriptor( + name="ColorRequest", + full_name="proto.ColorRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="priority", + full_name="proto.ColorRequest.priority", + index=0, + number=1, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="RgbColor", + full_name="proto.ColorRequest.RgbColor", + index=1, + number=2, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="duration", + full_name="proto.ColorRequest.duration", + index=2, + number=3, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[ + _descriptor.FieldDescriptor( + name="colorRequest", + full_name="proto.ColorRequest.colorRequest", + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=True, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=158, + serialized_end=293, +) + + +_IMAGEREQUEST = _descriptor.Descriptor( + name="ImageRequest", + full_name="proto.ImageRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="priority", + full_name="proto.ImageRequest.priority", + index=0, + number=1, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="imagewidth", + full_name="proto.ImageRequest.imagewidth", + index=1, + number=2, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="imageheight", + full_name="proto.ImageRequest.imageheight", + index=2, + number=3, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="imagedata", + full_name="proto.ImageRequest.imagedata", + index=3, + number=4, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="duration", + full_name="proto.ImageRequest.duration", + index=4, + number=5, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[ + _descriptor.FieldDescriptor( + name="imageRequest", + full_name="proto.ImageRequest.imageRequest", + index=0, + number=11, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=True, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=296, + serialized_end=473, +) + + +_CLEARREQUEST = _descriptor.Descriptor( + name="ClearRequest", + full_name="proto.ClearRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="priority", + full_name="proto.ClearRequest.priority", + index=0, + number=1, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[ + _descriptor.FieldDescriptor( + name="clearRequest", + full_name="proto.ClearRequest.clearRequest", + index=0, + number=12, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=True, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=475, + serialized_end=574, +) + + +_HYPERIONREPLY = _descriptor.Descriptor( + name="HyperionReply", + full_name="proto.HyperionReply", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="type", + full_name="proto.HyperionReply.type", + index=0, + number=1, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=1, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="success", + full_name="proto.HyperionReply.success", + index=1, + number=2, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="error", + full_name="proto.HyperionReply.error", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="video", + full_name="proto.HyperionReply.video", + index=3, + number=4, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[ + _HYPERIONREPLY_TYPE, + ], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=577, + serialized_end=710, +) + +_HYPERIONREQUEST.fields_by_name["command"].enum_type = _HYPERIONREQUEST_COMMAND +_HYPERIONREQUEST_COMMAND.containing_type = _HYPERIONREQUEST +_HYPERIONREPLY.fields_by_name["type"].enum_type = _HYPERIONREPLY_TYPE +_HYPERIONREPLY_TYPE.containing_type = _HYPERIONREPLY +DESCRIPTOR.message_types_by_name["HyperionRequest"] = _HYPERIONREQUEST +DESCRIPTOR.message_types_by_name["ColorRequest"] = _COLORREQUEST +DESCRIPTOR.message_types_by_name["ImageRequest"] = _IMAGEREQUEST +DESCRIPTOR.message_types_by_name["ClearRequest"] = _CLEARREQUEST +DESCRIPTOR.message_types_by_name["HyperionReply"] = _HYPERIONREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HyperionRequest = _reflection.GeneratedProtocolMessageType( + "HyperionRequest", + (_message.Message,), + { + "DESCRIPTOR": _HYPERIONREQUEST, + "__module__": "message_pb2" + # @@protoc_insertion_point(class_scope:proto.HyperionRequest) + }, +) +_sym_db.RegisterMessage(HyperionRequest) + +ColorRequest = _reflection.GeneratedProtocolMessageType( + "ColorRequest", + (_message.Message,), + { + "DESCRIPTOR": _COLORREQUEST, + "__module__": "message_pb2" + # @@protoc_insertion_point(class_scope:proto.ColorRequest) + }, +) +_sym_db.RegisterMessage(ColorRequest) + +ImageRequest = _reflection.GeneratedProtocolMessageType( + "ImageRequest", + (_message.Message,), + { + "DESCRIPTOR": _IMAGEREQUEST, + "__module__": "message_pb2" + # @@protoc_insertion_point(class_scope:proto.ImageRequest) + }, +) +_sym_db.RegisterMessage(ImageRequest) + +ClearRequest = _reflection.GeneratedProtocolMessageType( + "ClearRequest", + (_message.Message,), + { + "DESCRIPTOR": _CLEARREQUEST, + "__module__": "message_pb2" + # @@protoc_insertion_point(class_scope:proto.ClearRequest) + }, +) +_sym_db.RegisterMessage(ClearRequest) + +HyperionReply = _reflection.GeneratedProtocolMessageType( + "HyperionReply", + (_message.Message,), + { + "DESCRIPTOR": _HYPERIONREPLY, + "__module__": "message_pb2" + # @@protoc_insertion_point(class_scope:proto.HyperionReply) + }, +) +_sym_db.RegisterMessage(HyperionReply) + +_COLORREQUEST.extensions_by_name["colorRequest"].message_type = _COLORREQUEST +HyperionRequest.RegisterExtension(_COLORREQUEST.extensions_by_name["colorRequest"]) +_IMAGEREQUEST.extensions_by_name["imageRequest"].message_type = _IMAGEREQUEST +HyperionRequest.RegisterExtension(_IMAGEREQUEST.extensions_by_name["imageRequest"]) +_CLEARREQUEST.extensions_by_name["clearRequest"].message_type = _CLEARREQUEST +HyperionRequest.RegisterExtension(_CLEARREQUEST.extensions_by_name["clearRequest"]) + +# @@protoc_insertion_point(module_scope) diff --git a/script.service.hyperion/resources/lib/misc.py b/script.service.hyperion/resources/lib/misc.py new file mode 100644 index 0000000..d8616bc --- /dev/null +++ b/script.service.hyperion/resources/lib/misc.py @@ -0,0 +1,47 @@ +""" +Kodi video capturer for Hyperion. + +Copyright (c) 2013-2023 Hyperion Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +""" +from __future__ import annotations + +import xbmc +import xbmcaddon + + +class MessageHandler: + """Notify and logging facility for Kodi add-ons.""" + + def __init__(self, addon: xbmcaddon.Addon) -> None: + self._addon = addon + self._addon_name = addon.getAddonInfo("name") + self._addon_icon = addon.getAddonInfo("icon") + + def log(self, message: str, level: int = xbmc.LOGDEBUG) -> None: + """Writes the message to the logger with the addon name as prefix.""" + xbmc.log(f"[{self._addon_name}] - {message}", level=level) + + def notify(self, label_id: int) -> None: + """Displays a notification with the localized message.""" + message = self._addon.getLocalizedString(label_id) + xbmc.executebuiltin( + f"XBMC.Notification({self._addon_name},{message},1000,{self._addon_icon})" + ) diff --git a/resources/lib/monitor.py b/script.service.hyperion/resources/lib/monitor.py similarity index 73% rename from resources/lib/monitor.py rename to script.service.hyperion/resources/lib/monitor.py index 4de4eec..7c719b2 100644 --- a/resources/lib/monitor.py +++ b/script.service.hyperion/resources/lib/monitor.py @@ -1,26 +1,28 @@ """ - Kodi video capturer for Hyperion - - Copyright (c) 2013-2016 Hyperion Team - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +Kodi video capturer for Hyperion. + +Copyright (c) 2013-2023 Hyperion Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. """ +from collections.abc import Callable + import xbmc from PIL import Image @@ -28,6 +30,8 @@ from resources.lib.misc import MessageHandler from resources.lib.settings import Settings +State = Callable[[], "State"] + class HyperionMonitor(xbmc.Monitor): """Class to capture changes in settings and screensaver state.""" @@ -60,8 +64,11 @@ def onScreensaverActivated(self) -> None: @property def grabbing(self) -> bool: """Checks if grabbing is requested based on the current state and settings.""" - return self.settings.enable and self._player.isPlayingVideo() \ + return ( + self.settings.enable + and self._player.isPlayingVideo() and (self.settings.enable_screensaver or not self._screensaver) + ) def notify_error(self, label_id: int) -> None: if self.show_error_message: @@ -73,7 +80,7 @@ def main_loop(self) -> None: while not self.abortRequested(): state = state() - def disconnected_state(self): + def disconnected_state(self) -> State: if not self.grabbing: xbmc.sleep(500) return self.disconnected_state @@ -84,7 +91,7 @@ def disconnected_state(self): self.notify_error(32100) return self.error_state - def error_state(self): + def error_state(self) -> State: rev = self.settings.rev for _ in range(self.settings.timeout): if rev != self.settings.rev: @@ -99,7 +106,7 @@ def connect(self) -> None: self._hyperion = Hyperion(settings.address, settings.port) self._capture = xbmc.RenderCapture() - def get_capture_size(self): + def get_capture_size(self) -> tuple[tuple[int, int], int]: width = self.settings.capture_width aspect_ratio = self._capture.getAspectRatio() height = int(width / aspect_ratio) @@ -107,7 +114,7 @@ def get_capture_size(self): expected_capture_size = width * height * 4 # size * 4 bytes - RGBA return capture_size, expected_capture_size - def connected_state(self): + def connected_state(self) -> State: if not self.grabbing: del self._hyperion return self.disconnected_state @@ -125,7 +132,7 @@ def connected_state(self): return self.connected_state # v17+ use BGRA format, converting to RGB - image = Image.frombytes("RGB", capture_size, bytes(cap_image), 'raw', "BGRX") + image = Image.frombytes("RGB", capture_size, bytes(cap_image), "raw", "BGRX") try: # send image to hyperion diff --git a/resources/lib/settings.py b/script.service.hyperion/resources/lib/settings.py similarity index 51% rename from resources/lib/settings.py rename to script.service.hyperion/resources/lib/settings.py index 60b9ced..4b6462f 100644 --- a/resources/lib/settings.py +++ b/script.service.hyperion/resources/lib/settings.py @@ -1,25 +1,25 @@ """ - Kodi video capturer for Hyperion +Kodi video capturer for Hyperion. - Copyright (c) 2013-2016 Hyperion Team +Copyright (c) 2013-2023 Hyperion Team - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. """ from __future__ import annotations @@ -36,21 +36,24 @@ def __init__(self, settings: xbmcaddon.Settings) -> None: self.rev = 0 self._settings = settings self.needs_reconnection = False - self._address = None - self._port = None + self._address = "localhost" + self._port = 19445 self.read_settings() @property def address(self) -> str: + """Hyperion server's hostname or IP-address.""" return self._address @address.setter def address(self, value: str) -> None: + """Hyperion server's hostname or IP-address.""" self.needs_reconnection = self._address != value self._address = value @property def port(self) -> int: + """Hyperion server port.""" return self._port @port.setter @@ -59,7 +62,7 @@ def port(self, value: int) -> None: self._port = value def read_settings(self) -> None: - """Read all settings""" + """Read all settings.""" settings = self._settings self.enable = settings.getBool("hyperion_enable") self.enable_screensaver = settings.getBool("screensaver_enable") diff --git a/resources/screenshot-01.png b/script.service.hyperion/resources/screenshot-01.png similarity index 100% rename from resources/screenshot-01.png rename to script.service.hyperion/resources/screenshot-01.png diff --git a/resources/settings.xml b/script.service.hyperion/resources/settings.xml similarity index 100% rename from resources/settings.xml rename to script.service.hyperion/resources/settings.xml diff --git a/script.service.hyperion/service.py b/script.service.hyperion/service.py new file mode 100644 index 0000000..8721f9a --- /dev/null +++ b/script.service.hyperion/service.py @@ -0,0 +1,42 @@ +""" +Kodi video capturer for Hyperion. + +Copyright (c) 2013-2023 Hyperion Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +""" + +import xbmc +import xbmcaddon +from resources.lib.misc import MessageHandler +from resources.lib.monitor import HyperionMonitor +from resources.lib.settings import Settings + + +def main() -> None: + addon = xbmcaddon.Addon() + player = xbmc.Player() + settings = Settings(addon.getSettings()) + output_handler = MessageHandler(addon) + monitor = HyperionMonitor(settings, player, output_handler) + monitor.main_loop() + + +if __name__ == "__main__": + main()