From abf92c3252e95e3b54a9c4c80b5098002ef7dba0 Mon Sep 17 00:00:00 2001 From: pannal Date: Sun, 24 Dec 2023 04:00:11 +0100 Subject: [PATCH] [script.plexmod] 0.7.3-rev2 --- screensaver.picture.slideshow/addon.xml | 122 - screensaver.picture.slideshow/changelog.txt | 286 - screensaver.picture.slideshow/default.py | 15 - screensaver.picture.slideshow/lib/gui.py | 516 - screensaver.picture.slideshow/lib/utils.py | 145 - .../resources/fanart.jpg | Bin 148242 -> 0 bytes .../resources/icon.png | Bin 112411 -> 0 bytes .../resource.language.af_za/strings.po | 136 - .../resource.language.am_et/strings.po | 137 - .../resource.language.ar_sa/strings.po | 136 - .../resource.language.az_az/strings.po | 136 - .../resource.language.be_by/strings.po | 137 - .../resource.language.bg_bg/strings.po | 136 - .../resource.language.bs_ba/strings.po | 136 - .../resource.language.ca_es/strings.po | 136 - .../resource.language.cs_cz/strings.po | 137 - .../resource.language.cy_gb/strings.po | 136 - .../resource.language.da_dk/strings.po | 137 - .../resource.language.de_de/strings.po | 137 - .../resource.language.el_gr/strings.po | 136 - .../resource.language.en_au/strings.po | 136 - .../resource.language.en_gb/strings.po | 137 - .../resource.language.en_nz/strings.po | 136 - .../resource.language.en_us/strings.po | 136 - .../language/resource.language.eo/strings.po | 137 - .../resource.language.es_ar/strings.po | 136 - .../resource.language.es_es/strings.po | 137 - .../resource.language.es_mx/strings.po | 136 - .../resource.language.et_ee/strings.po | 137 - .../resource.language.eu_es/strings.po | 136 - .../resource.language.fa_af/strings.po | 136 - .../resource.language.fa_ir/strings.po | 136 - .../resource.language.fi_fi/strings.po | 137 - .../resource.language.fo_fo/strings.po | 136 - .../resource.language.fr_ca/strings.po | 136 - .../resource.language.fr_fr/strings.po | 137 - .../resource.language.gl_es/strings.po | 136 - .../resource.language.he_il/strings.po | 137 - .../resource.language.hi_in/strings.po | 137 - .../resource.language.hr_hr/strings.po | 136 - .../resource.language.hu_hu/strings.po | 136 - .../resource.language.id_id/strings.po | 136 - .../resource.language.is_is/strings.po | 137 - .../resource.language.it_it/strings.po | 137 - .../resource.language.ja_jp/strings.po | 137 - .../resource.language.ko_kr/strings.po | 137 - .../resource.language.lt_lt/strings.po | 136 - .../resource.language.lv_lv/strings.po | 136 - .../language/resource.language.mi/strings.po | 136 - .../resource.language.mk_mk/strings.po | 136 - .../resource.language.ms_my/strings.po | 136 - .../resource.language.mt_mt/strings.po | 136 - .../resource.language.my_mm/strings.po | 136 - .../resource.language.nb_no/strings.po | 136 - .../resource.language.nl_nl/strings.po | 137 - .../resource.language.pl_pl/strings.po | 137 - .../resource.language.pt_br/strings.po | 136 - .../resource.language.pt_pt/strings.po | 136 - .../resource.language.ro_ro/strings.po | 137 - .../resource.language.ru_ru/strings.po | 136 - .../resource.language.sk_sk/strings.po | 137 - .../resource.language.sl_si/strings.po | 136 - .../resource.language.sq_al/strings.po | 136 - .../resource.language.sr_rs/strings.po | 136 - .../resource.language.sr_rs@latin/strings.po | 136 - .../resource.language.sv_se/strings.po | 137 - .../resource.language.ta_in/strings.po | 137 - .../resource.language.tg_tj/strings.po | 136 - .../resource.language.th_th/strings.po | 136 - .../resource.language.tr_tr/strings.po | 136 - .../resource.language.uk_ua/strings.po | 137 - .../resource.language.uz_uz/strings.po | 136 - .../resource.language.vi_vn/strings.po | 136 - .../resource.language.zh_cn/strings.po | 137 - .../resource.language.zh_tw/strings.po | 137 - .../resources/settings.xml | 159 - .../default/1080i/script-python-slideshow.xml | 315 - .../skins/default/media/overlayfade.png | Bin 195 -> 0 bytes .../skins/default/media/screensaver-black.png | Bin 140 -> 0 bytes .../default/media/screensaver-progress.png | Bin 177 -> 0 bytes .../default/media/screensaver-splash.png | Bin 9073 -> 0 bytes script.areace/LICENSE.txt | 21 - script.areace/addon.xml | 22 - script.areace/resources/data_loader.py | 18 - script.areace/resources/fanart.jpg | Bin 446907 -> 0 bytes script.areace/resources/icon.png | Bin 175300 -> 0 bytes script.areace/resources/main_dialog.py | 11 - script.areace/resources/settings.xml | 8 - script.areace/resources/telegram.py | 26 - script.areace/script.py | 7 - .../LICENSES/GPL-3.0-only.txt | 674 -- script.common.plugin.cache/addon.xml | 21 - script.common.plugin.cache/changelog.txt | 75 - script.common.plugin.cache/icon.png | Bin 59226 -> 0 bytes .../resource.language.en_gb/strings.po | 54 - .../resources/lib/__init__.py | 11 - .../resources/lib/entry_point.py | 16 - .../resources/lib/service.py | 68 - .../lib/storage_server/StorageServer.py | 821 -- .../resources/lib/storage_server/__init__.py | 11 - .../lib/storage_server/storageserverdummy.py | 40 - .../resources/settings.xml | 38 - script.copacetic.helper/LICENSE.txt | 674 -- script.copacetic.helper/README.md | 43 - script.copacetic.helper/addon.xml | 24 - script.copacetic.helper/plugin.py | 6 - script.copacetic.helper/resources/fanart.jpg | Bin 583161 -> 0 bytes script.copacetic.helper/resources/icon.png | Bin 25327 -> 0 bytes .../resource.language.en_gb/strings.po | 114 - .../resources/lib/plugin/content.py | 269 - .../resources/lib/plugin/json_map.py | 256 - .../resources/lib/plugin/library.py | 147 - .../resources/lib/plugin/listing.py | 47 - .../resources/lib/plugin/main.py | 58 - .../resources/lib/script/actions.py | 344 - .../resources/lib/service/art.py | 300 - .../resources/lib/service/monitor.py | 256 - .../resources/lib/service/player.py | 41 - .../resources/lib/service/settings.py | 84 - .../resources/lib/utilities.py | 243 - .../resources/settings.xml | 22 - script.copacetic.helper/script.py | 18 - script.copacetic.helper/service.py | 6 - script.module.dropbox_auth/LICENSE.txt | 20 - script.module.dropbox_auth/addon.xml | 21 - script.module.dropbox_auth/authenticate.py | 121 - .../resource.language.de_de/strings.po | 58 - .../resource.language.en_gb/strings.po | 58 - script.module.dropbox_auth/resources/utils.py | 53 - script.module.infotagger/README.md | 50 - script.module.infotagger/addon.xml | 19 - script.module.infotagger/icon.png | Bin 19185 -> 0 bytes .../resources/modules/infotagger/listitem.py | 262 - script.module.jurialmunkey/addon.xml | 16 - script.module.jurialmunkey/icon.png | Bin 21434 -> 0 bytes .../resource.language.en_gb/strings.po | 27 - .../resources/modules/jurialmunkey/bcache.py | 89 - .../resources/modules/jurialmunkey/dialog.py | 73 - .../resources/modules/jurialmunkey/futils.py | 113 - .../resources/modules/jurialmunkey/logger.py | 150 - .../resources/modules/jurialmunkey/parser.py | 188 - .../resources/modules/jurialmunkey/plugin.py | 58 - .../resources/modules/jurialmunkey/reqapi.py | 264 - .../resources/modules/jurialmunkey/scache.py | 285 - .../resources/modules/jurialmunkey/thread.py | 54 - .../resources/modules/jurialmunkey/tmdate.py | 19 - .../resources/modules/jurialmunkey/window.py | 136 - script.module.protobuf/.gitignore | 6 - script.module.protobuf/LICENSE | 42 - script.module.protobuf/README.md | 9 - script.module.protobuf/Taskfile.yml | 57 - script.module.protobuf/addon.xml | 22 - script.module.protobuf/resources/icon.png | Bin 7237 -> 0 bytes .../resources/lib/google/protobuf/__init__.py | 33 - .../resources/lib/google/protobuf/any_pb2.py | 27 - .../resources/lib/google/protobuf/api_pb2.py | 33 - .../lib/google/protobuf/compiler/__init__.py | 0 .../google/protobuf/compiler/plugin_pb2.py | 36 - .../lib/google/protobuf/descriptor.py | 1266 --- .../google/protobuf/descriptor_database.py | 177 - .../lib/google/protobuf/descriptor_pb2.py | 2227 ----- .../lib/google/protobuf/descriptor_pool.py | 1290 --- .../lib/google/protobuf/duration_pb2.py | 27 - .../lib/google/protobuf/empty_pb2.py | 27 - .../lib/google/protobuf/field_mask_pb2.py | 27 - .../lib/google/protobuf/internal/__init__.py | 30 - .../protobuf/internal/_parameterized.py | 443 - .../protobuf/internal/api_implementation.py | 163 - .../lib/google/protobuf/internal/builder.py | 130 - .../google/protobuf/internal/containers.py | 710 -- .../lib/google/protobuf/internal/decoder.py | 1067 -- .../lib/google/protobuf/internal/encoder.py | 829 -- .../protobuf/internal/enum_type_wrapper.py | 124 - .../protobuf/internal/extension_dict.py | 214 - .../google/protobuf/internal/field_mask.py | 333 - .../protobuf/internal/message_listener.py | 78 - .../protobuf/internal/python_message.py | 1514 --- .../protobuf/internal/testing_refleaks.py | 142 - .../google/protobuf/internal/type_checkers.py | 431 - .../protobuf/internal/well_known_types.py | 582 -- .../google/protobuf/internal/wire_format.py | 268 - .../lib/google/protobuf/json_format.py | 929 -- .../resources/lib/google/protobuf/message.py | 425 - .../lib/google/protobuf/message_factory.py | 234 - .../lib/google/protobuf/proto_builder.py | 134 - .../lib/google/protobuf/pyext/__init__.py | 0 .../lib/google/protobuf/pyext/cpp_message.py | 72 - .../lib/google/protobuf/reflection.py | 95 - .../resources/lib/google/protobuf/service.py | 228 - .../lib/google/protobuf/service_reflection.py | 295 - .../lib/google/protobuf/source_context_pb2.py | 27 - .../lib/google/protobuf/struct_pb2.py | 37 - .../lib/google/protobuf/symbol_database.py | 220 - .../lib/google/protobuf/text_encoding.py | 108 - .../lib/google/protobuf/text_format.py | 1857 ---- .../lib/google/protobuf/timestamp_pb2.py | 27 - .../resources/lib/google/protobuf/type_pb2.py | 43 - .../lib/google/protobuf/unknown_fields.py | 120 - .../lib/google/protobuf/util/__init__.py | 0 .../lib/google/protobuf/wrappers_pb2.py | 43 - .../LICENSES/GPL-3.0-only | 674 -- script.module.python.twitch/addon.xml | 49 - script.module.python.twitch/changelog.txt | 108 - .../resources/__init__.py | 9 - .../resource.language.af_za/strings.po | 25 - .../resource.language.am_et/strings.po | 25 - .../resource.language.ar_sa/strings.po | 25 - .../resource.language.ast_es/strings.po | 25 - .../resource.language.az_az/strings.po | 25 - .../resource.language.be_by/strings.po | 25 - .../resource.language.bg_bg/strings.po | 25 - .../resource.language.bs_ba/strings.po | 25 - .../resource.language.ca_es/strings.po | 25 - .../resource.language.cs_cz/strings.po | 25 - .../resource.language.cy_gb/strings.po | 25 - .../resource.language.da_dk/strings.po | 26 - .../resource.language.de_de/strings.po | 26 - .../resource.language.el_gr/strings.po | 25 - .../resource.language.en_au/strings.po | 25 - .../resource.language.en_gb/strings.po | 25 - .../resource.language.en_nz/strings.po | 25 - .../resource.language.en_us/strings.po | 25 - .../language/resource.language.eo/strings.po | 25 - .../resource.language.es_ar/strings.po | 25 - .../resource.language.es_es/strings.po | 26 - .../resource.language.es_mx/strings.po | 25 - .../resource.language.et_ee/strings.po | 25 - .../resource.language.eu_es/strings.po | 25 - .../resource.language.fa_af/strings.po | 25 - .../resource.language.fa_ir/strings.po | 25 - .../resource.language.fi_fi/strings.po | 26 - .../resource.language.fo_fo/strings.po | 25 - .../resource.language.fr_ca/strings.po | 25 - .../resource.language.fr_fr/strings.po | 26 - .../resource.language.gl_es/strings.po | 25 - .../resource.language.he_il/strings.po | 25 - .../resource.language.hi_in/strings.po | 25 - .../resource.language.hr_hr/strings.po | 26 - .../resource.language.hu_hu/strings.po | 26 - .../resource.language.hy_am/strings.po | 25 - .../resource.language.id_id/strings.po | 25 - .../resource.language.is_is/strings.po | 25 - .../resource.language.it_it/strings.po | 26 - .../resource.language.ja_jp/strings.po | 25 - .../resource.language.kn_in/strings.po | 25 - .../resource.language.ko_kr/strings.po | 26 - .../resource.language.lt_lt/strings.po | 25 - .../resource.language.lv_lv/strings.po | 25 - .../language/resource.language.mi/strings.po | 25 - .../resource.language.mk_mk/strings.po | 25 - .../resource.language.ml_in/strings.po | 25 - .../resource.language.mn_mn/strings.po | 25 - .../resource.language.ms_my/strings.po | 25 - .../resource.language.mt_mt/strings.po | 25 - .../resource.language.my_mm/strings.po | 25 - .../resource.language.nb_no/strings.po | 25 - .../resource.language.nl_nl/strings.po | 25 - .../resource.language.oc_fr/strings.po | 25 - .../resource.language.os_os/strings.po | 25 - .../resource.language.pl_pl/strings.po | 26 - .../resource.language.pt_br/strings.po | 25 - .../resource.language.pt_pt/strings.po | 25 - .../resource.language.ro_ro/strings.po | 25 - .../resource.language.ru_ru/strings.po | 26 - .../resource.language.si_lk/strings.po | 25 - .../resource.language.sk_sk/strings.po | 25 - .../resource.language.sl_si/strings.po | 25 - .../resource.language.sq_al/strings.po | 25 - .../resource.language.sr_rs/strings.po | 25 - .../resource.language.sr_rs@latin/strings.po | 25 - .../resource.language.sv_se/strings.po | 25 - .../language/resource.language.szl/strings.po | 25 - .../resource.language.ta_in/strings.po | 25 - .../resource.language.te_in/strings.po | 25 - .../resource.language.tg_tj/strings.po | 25 - .../resource.language.th_th/strings.po | 25 - .../resource.language.tr_tr/strings.po | 25 - .../resource.language.uk_ua/strings.po | 25 - .../resource.language.uz_uz/strings.po | 25 - .../resource.language.vi_vn/strings.po | 25 - .../resource.language.zh_cn/strings.po | 26 - .../resource.language.zh_tw/strings.po | 25 - .../resources/lib/__init__.py | 13 - .../resources/lib/twitch/__init__.py | 30 - .../resources/lib/twitch/api/__init__.py | 18 - .../lib/twitch/api/helix/__init__.py | 27 - .../lib/twitch/api/helix/analytics.py | 48 - .../resources/lib/twitch/api/helix/bits.py | 29 - .../resources/lib/twitch/api/helix/clips.py | 43 - .../lib/twitch/api/helix/entitlements.py | 50 - .../resources/lib/twitch/api/helix/games.py | 114 - .../resources/lib/twitch/api/helix/search.py | 39 - .../resources/lib/twitch/api/helix/streams.py | 93 - .../lib/twitch/api/helix/subscriptions.py | 37 - .../resources/lib/twitch/api/helix/tags.py | 48 - .../resources/lib/twitch/api/helix/users.py | 117 - .../resources/lib/twitch/api/helix/videos.py | 50 - .../lib/twitch/api/helix/webhooks.py | 27 - .../resources/lib/twitch/api/parameters.py | 240 - .../resources/lib/twitch/api/usher.py | 251 - .../resources/lib/twitch/exceptions.py | 15 - .../resources/lib/twitch/keys.py | 132 - .../resources/lib/twitch/log.py | 110 - .../resources/lib/twitch/methods.py | 23 - .../resources/lib/twitch/oauth/__init__.py | 17 - .../resources/lib/twitch/oauth/clients.py | 71 - .../lib/twitch/oauth/helix/__init__.py | 14 - .../lib/twitch/oauth/helix/scopes.py | 54 - .../resources/lib/twitch/oauth/validation.py | 19 - .../resources/lib/twitch/parser.py | 174 - .../resources/lib/twitch/queries.py | 262 - .../resources/lib/twitch/scraper.py | 123 - .../resources/media/icon.png | Bin 19547 -> 0 bytes script.module.t1mlib/LICENSE.txt | 282 - script.module.t1mlib/addon.xml | 23 - script.module.t1mlib/lib/t1mlib.py | 304 - script.module.t1mlib/readme.txt | 9 - script.module.t1mlib/resources/icon.png | Bin 7237 -> 0 bytes .../LICENSES/GPL-2.0-only.txt | 339 - script.module.tubed.api/addon.xml | 49 - .../resource.language.af_za/strings.po | 54 - .../resource.language.am_et/strings.po | 53 - .../resource.language.ar_sa/strings.po | 53 - .../resource.language.ast_es/strings.po | 54 - .../resource.language.az_az/strings.po | 53 - .../resource.language.be_by/strings.po | 54 - .../resource.language.bg_bg/strings.po | 54 - .../resource.language.bs_ba/strings.po | 53 - .../resource.language.ca_es/strings.po | 54 - .../resource.language.cs_cz/strings.po | 54 - .../resource.language.cy_gb/strings.po | 54 - .../resource.language.da_dk/strings.po | 54 - .../resource.language.de_de/strings.po | 54 - .../resource.language.el_gr/strings.po | 53 - .../resource.language.en_au/strings.po | 54 - .../resource.language.en_gb/strings.po | 53 - .../resource.language.en_nz/strings.po | 53 - .../resource.language.en_us/strings.po | 54 - .../language/resource.language.eo/strings.po | 53 - .../resource.language.es_ar/strings.po | 54 - .../resource.language.es_es/strings.po | 54 - .../resource.language.es_mx/strings.po | 54 - .../resource.language.et_ee/strings.po | 54 - .../resource.language.eu_es/strings.po | 54 - .../resource.language.fa_af/strings.po | 53 - .../resource.language.fa_ir/strings.po | 54 - .../resource.language.fi_fi/strings.po | 54 - .../resource.language.fo_fo/strings.po | 53 - .../resource.language.fr_ca/strings.po | 54 - .../resource.language.fr_fr/strings.po | 54 - .../resource.language.gl_es/strings.po | 54 - .../resource.language.he_il/strings.po | 54 - .../resource.language.hi_in/strings.po | 53 - .../resource.language.hr_hr/strings.po | 54 - .../resource.language.hu_hu/strings.po | 54 - .../resource.language.hy_am/strings.po | 53 - .../resource.language.id_id/strings.po | 53 - .../resource.language.is_is/strings.po | 54 - .../resource.language.it_it/strings.po | 54 - .../resource.language.ja_jp/strings.po | 54 - .../resource.language.kn_in/strings.po | 53 - .../resource.language.ko_kr/strings.po | 54 - .../resource.language.lt_lt/strings.po | 54 - .../resource.language.lv_lv/strings.po | 54 - .../language/resource.language.mi/strings.po | 53 - .../resource.language.mk_mk/strings.po | 54 - .../resource.language.ml_in/strings.po | 53 - .../resource.language.mn_mn/strings.po | 53 - .../resource.language.ms_my/strings.po | 54 - .../resource.language.mt_mt/strings.po | 53 - .../resource.language.my_mm/strings.po | 54 - .../resource.language.nb_no/strings.po | 54 - .../resource.language.nl_nl/strings.po | 54 - .../resource.language.oc_fr/strings.po | 53 - .../resource.language.os_os/strings.po | 53 - .../resource.language.pl_pl/strings.po | 54 - .../resource.language.pt_br/strings.po | 54 - .../resource.language.pt_pt/strings.po | 54 - .../resource.language.ro_ro/strings.po | 54 - .../resource.language.ru_ru/strings.po | 54 - .../resource.language.si_lk/strings.po | 53 - .../resource.language.sk_sk/strings.po | 54 - .../resource.language.sl_si/strings.po | 54 - .../resource.language.sq_al/strings.po | 53 - .../resource.language.sr_rs/strings.po | 54 - .../resource.language.sr_rs@latin/strings.po | 54 - .../resource.language.sv_se/strings.po | 54 - .../language/resource.language.szl/strings.po | 54 - .../resource.language.ta_in/strings.po | 54 - .../resource.language.te_in/strings.po | 53 - .../resource.language.tg_tj/strings.po | 53 - .../resource.language.th_th/strings.po | 54 - .../resource.language.tr_tr/strings.po | 54 - .../resource.language.uk_ua/strings.po | 54 - .../resource.language.uz_uz/strings.po | 53 - .../resource.language.vi_vn/strings.po | 54 - .../resource.language.zh_cn/strings.po | 54 - .../resource.language.zh_tw/strings.po | 54 - .../resources/lib/__init__.py | 11 - .../resources/lib/service.py | 13 - .../resources/lib/src/__init__.py | 11 - .../resources/lib/src/constants/__init__.py | 18 - .../resources/lib/src/constants/config.py | 12 - .../resources/lib/src/httpd/__init__.py | 11 - .../resources/lib/src/httpd/daemon.py | 97 - .../resources/lib/src/httpd/handler.py | 203 - .../resources/lib/src/service.py | 39 - .../resources/lib/src/tubed_api/__init__.py | 24 - .../lib/src/tubed_api/constants/__init__.py | 17 - .../lib/src/tubed_api/constants/http.py | 19 - .../resources/lib/src/tubed_api/exceptions.py | 65 - .../lib/src/tubed_api/oauth/__init__.py | 13 - .../lib/src/tubed_api/oauth/client.py | 214 - .../lib/src/tubed_api/oauth/scopes.py | 32 - .../lib/src/tubed_api/usher/__init__.py | 14 - .../lib/src/tubed_api/usher/lib/__init__.py | 11 - .../lib/src/tubed_api/usher/lib/itags.json | 1160 --- .../lib/src/tubed_api/usher/lib/mpeg_dash.py | 596 -- .../lib/src/tubed_api/usher/lib/quality.py | 74 - .../lib/src/tubed_api/usher/lib/subtitles.py | 127 - .../lib/src/tubed_api/usher/lib/video_info.py | 390 - .../lib/src/tubed_api/usher/resolver.py | 24 - .../lib/src/tubed_api/utils/__init__.py | 11 - .../lib/src/tubed_api/utils/logger.py | 185 - .../resources/lib/src/tubed_api/utils/time.py | 33 - .../lib/src/tubed_api/v3/__init__.py | 40 - .../lib/src/tubed_api/v3/api/__init__.py | 16 - .../lib/src/tubed_api/v3/api/activities.py | 25 - .../lib/src/tubed_api/v3/api/captions.py | 42 - .../src/tubed_api/v3/api/channel_banners.py | 18 - .../src/tubed_api/v3/api/channel_sections.py | 36 - .../lib/src/tubed_api/v3/api/channels.py | 24 - .../src/tubed_api/v3/api/comment_threads.py | 30 - .../lib/src/tubed_api/v3/api/comments.py | 48 - .../src/tubed_api/v3/api/guide_categories.py | 19 - .../src/tubed_api/v3/api/i18n_languages.py | 18 - .../lib/src/tubed_api/v3/api/i18n_regions.py | 18 - .../lib/src/tubed_api/v3/api/members.py | 18 - .../src/tubed_api/v3/api/membership_levels.py | 18 - .../src/tubed_api/v3/api/playlist_items.py | 36 - .../lib/src/tubed_api/v3/api/playlists.py | 36 - .../lib/src/tubed_api/v3/api/search.py | 18 - .../lib/src/tubed_api/v3/api/subscriptions.py | 30 - .../lib/src/tubed_api/v3/api/thumbnails.py | 18 - .../v3/api/video_abuse_report_reasons.py | 18 - .../src/tubed_api/v3/api/video_categories.py | 18 - .../lib/src/tubed_api/v3/api/videos.py | 54 - .../lib/src/tubed_api/v3/api/watermarks.py | 24 - .../resources/lib/src/tubed_api/v3/query.py | 150 - .../lib/src/tubed_api/v3/request_handler.py | 60 - .../resources/media/fanart.jpg | Bin 457244 -> 0 bytes .../resources/media/icon.png | Bin 37924 -> 0 bytes .../resources/settings.xml | 25 - script.plexmod/.gitignore | 3 + .../LICENSE.txt | 210 + script.plexmod/README.md | 33 + script.plexmod/TESTING_SQUAD.md | 2 + script.plexmod/addon.xml | 49 + script.plexmod/changelog.txt | 655 ++ script.plexmod/default.py | 5 + script.plexmod/fanart.jpg | Bin 0 -> 71213 bytes script.plexmod/icon.png | Bin 0 -> 25724 bytes script.plexmod/lib/__init__.py | 20 + .../lib/_included_packages/__init__.py | 8 + .../_included_packages/icmplib/__init__.py | 44 + .../_included_packages/icmplib/exceptions.py | 214 + .../lib/_included_packages/icmplib/models.py | 491 + .../_included_packages/icmplib/multiping.py | 277 + .../lib/_included_packages/icmplib/ping.py | 298 + .../lib/_included_packages/icmplib/sockets.py | 806 ++ .../_included_packages/icmplib/traceroute.py | 212 + .../lib/_included_packages/icmplib/utils.py | 199 + .../_included_packages/plexnet}/__init__.py | 0 .../plexnet/asyncadapter.py | 338 + .../lib/_included_packages/plexnet/audio.py | 153 + .../_included_packages/plexnet/audioobject.py | 83 + .../_included_packages/plexnet/callback.py | 54 + .../_included_packages/plexnet/captions.py | 80 + .../lib/_included_packages/plexnet/compat.py | 26 + .../_included_packages/plexnet/exceptions.py | 22 + .../lib/_included_packages/plexnet/gdm.py | 347 + .../lib/_included_packages/plexnet/http.py | 329 + .../lib/_included_packages/plexnet/locks.py | 67 + .../lib/_included_packages/plexnet/media.py | 258 + .../_included_packages/plexnet/mediachoice.py | 55 + .../plexnet/mediadecisionengine.py | 510 + .../lib/_included_packages/plexnet/myplex.py | 92 + .../plexnet/myplexaccount.py | 323 + .../plexnet/myplexmanager.py | 79 + .../plexnet/myplexrequest.py | 13 + .../plexnet/myplexserver.py | 36 + .../plexnet/netif/__init__.py | 217 + .../plexnet/netif/getifaddrs.py | 192 + .../plexnet/netif/ipconfig.py | 58 + .../plexnet/netif/winpsif.py | 22 + .../plexnet/nowplayingmanager.py | 215 + .../lib/_included_packages/plexnet/photo.py | 63 + .../_included_packages/plexnet/playlist.py | 183 + .../_included_packages/plexnet/playqueue.py | 786 ++ .../lib/_included_packages/plexnet/plexapp.py | 403 + .../plexnet/plexconnection.py | 284 + .../_included_packages/plexnet/plexlibrary.py | 634 ++ .../_included_packages/plexnet/plexmedia.py | 154 + .../_included_packages/plexnet/plexobjects.py | 572 ++ .../_included_packages/plexnet/plexpart.py | 178 + .../_included_packages/plexnet/plexplayer.py | 934 ++ .../_included_packages/plexnet/plexrequest.py | 46 + .../plexnet/plexresource.py | 231 + .../_included_packages/plexnet/plexresult.py | 102 + .../_included_packages/plexnet/plexserver.py | 700 ++ .../plexnet/plexservermanager.py | 651 ++ .../_included_packages/plexnet/plexstream.py | 195 + .../plexnet/serverdecision.py | 102 + .../plexnet/signalslot/__init__.py | 11 + .../plexnet/signalslot/contrib}/__init__.py | 0 .../signalslot/contrib/task/__init__.py | 1 + .../plexnet/signalslot/contrib/task/task.py | 76 + .../plexnet/signalslot/contrib/task/test.py | 185 + .../plexnet/signalslot/exceptions.py | 28 + .../plexnet/signalslot/signal.py | 176 + .../plexnet/signalslot/slot.py | 74 + .../plexnet/signalslot/tests.py | 206 + .../plexnet/signalsmixin.py | 41 + .../plexnet/simpleobjects.py | 21 + .../_included_packages/plexnet/threadutils.py | 94 + .../lib/_included_packages/plexnet/util.py | 311 + .../lib/_included_packages/plexnet/verlib.py | 329 + .../lib/_included_packages/plexnet/video.py | 782 ++ .../plexnet/videosession.py | 416 + script.plexmod/lib/backgroundthread.py | 255 + script.plexmod/lib/colors.py | 79 + script.plexmod/lib/compat.py | 21 + script.plexmod/lib/distro.py | 1399 +++ script.plexmod/lib/exceptions.py | 4 + script.plexmod/lib/image.py | 12 + script.plexmod/lib/kodijsonrpc.py | 106 + script.plexmod/lib/main.py | 178 + script.plexmod/lib/metadata.py | 34 + script.plexmod/lib/playback_utils.py | 201 + script.plexmod/lib/player.py | 1480 +++ script.plexmod/lib/plex.py | 454 + script.plexmod/lib/util.py | 1009 ++ script.plexmod/lib/windows/__init__.py | 5 + script.plexmod/lib/windows/background.py | 43 + script.plexmod/lib/windows/busy.py | 142 + script.plexmod/lib/windows/currentplaylist.py | 337 + script.plexmod/lib/windows/dropdown.py | 247 + script.plexmod/lib/windows/episodes.py | 1202 +++ script.plexmod/lib/windows/home.py | 1388 +++ script.plexmod/lib/windows/info.py | 149 + script.plexmod/lib/windows/kodigui.py | 1105 +++ script.plexmod/lib/windows/library.py | 1868 ++++ script.plexmod/lib/windows/mixins.py | 61 + script.plexmod/lib/windows/musicplayer.py | 169 + script.plexmod/lib/windows/opener.py | 169 + script.plexmod/lib/windows/optionsdialog.py | 55 + script.plexmod/lib/windows/pagination.py | 274 + script.plexmod/lib/windows/photos.py | 530 + .../lib/windows/playbacksettings.py | 64 + .../lib/windows/playerbackground.py | 54 + script.plexmod/lib/windows/playersettings.py | 340 + script.plexmod/lib/windows/playlist.py | 325 + script.plexmod/lib/windows/playlists.py | 138 + script.plexmod/lib/windows/preplay.py | 720 ++ script.plexmod/lib/windows/preplayutils.py | 35 + script.plexmod/lib/windows/search.py | 435 + script.plexmod/lib/windows/seekdialog.py | 2204 ++++ script.plexmod/lib/windows/settings.py | 836 ++ script.plexmod/lib/windows/signin.py | 146 + script.plexmod/lib/windows/slidehshow.py | 108 + script.plexmod/lib/windows/subitems.py | 647 ++ script.plexmod/lib/windows/tracks.py | 348 + script.plexmod/lib/windows/userselect.py | 234 + script.plexmod/lib/windows/videoplayer.py | 596 ++ script.plexmod/lib/windows/windowutils.py | 84 + script.plexmod/plugin.py | 75 + script.plexmod/pm4k_cache_template.xml | 5 + .../resource.language.cs_cz/strings.po | 927 ++ .../resource.language.de_de/strings.po | 1946 ++++ .../resource.language.en_gb/strings.po | 1647 +++ .../resource.language.es_es/strings.po | 951 ++ .../resource.language.fr_fr/strings.po | 953 ++ .../resource.language.hu_hu/strings.po | 928 ++ .../resource.language.it_it/strings.po | 951 ++ .../resource.language.pl_pl/strings.po | 984 ++ .../resource.language.pt_br/strings.po | 951 ++ .../resource.language.pt_pt/strings.po | 980 ++ .../resource.language.ru_ru/strings.po | 951 ++ .../resource.language.zh_cn/strings.po | 1075 ++ script.plexmod/resources/settings.xml | 335 + .../skins/Main/1080i/script-plex-album.xml | 628 ++ .../skins/Main/1080i/script-plex-artist.xml | 527 + .../Main/1080i/script-plex-background.xml | 65 + .../skins/Main/1080i/script-plex-blank.xml | 12 + .../skins/Main/1080i/script-plex-busy.xml | 28 + .../skins/Main/1080i/script-plex-busy_msg.xml | 35 + .../skins/Main/1080i/script-plex-dropdown.xml | 201 + .../1080i/script-plex-dropdown_header.xml | 247 + .../skins/Main/1080i/script-plex-episodes.xml | 1820 ++++ .../skins/Main/1080i/script-plex-home.xml | 8622 ++++++++++++++++ .../skins/Main/1080i/script-plex-info.xml | 281 + .../script-plex-listview-16x9-chunked.xml | 879 ++ .../Main/1080i/script-plex-listview-16x9.xml | 842 ++ .../script-plex-listview-square-chunked.xml | 943 ++ .../1080i/script-plex-listview-square.xml | 908 ++ .../script-plex-music_current_playlist.xml | 790 ++ .../Main/1080i/script-plex-music_player.xml | 578 ++ .../Main/1080i/script-plex-options_dialog.xml | 136 + .../skins/Main/1080i/script-plex-photo.xml | 717 ++ .../Main/1080i/script-plex-pin_login.xml | 82 + .../skins/Main/1080i/script-plex-playlist.xml | 883 ++ .../Main/1080i/script-plex-playlists.xml | 567 ++ .../Main/1080i/script-plex-plex_pass.xml | 39 + .../Main/1080i/script-plex-posters-small.xml | 877 ++ .../skins/Main/1080i/script-plex-posters.xml | 851 ++ .../skins/Main/1080i/script-plex-pre_play.xml | 1494 +++ .../Main/1080i/script-plex-pre_signin.xml | 39 + .../Main/1080i/script-plex-refresh_code.xml | 39 + .../skins/Main/1080i/script-plex-search.xml | 8839 +++++++++++++++++ .../skins/Main/1080i/script-plex-seasons.xml | 1361 +++ .../Main/1080i/script-plex-seek_dialog.xml | 1106 +++ .../skins/Main/1080i/script-plex-settings.xml | 684 ++ .../script-plex-settings_select_dialog.xml | 94 + .../1080i/script-plex-signin_background.xml | 21 + .../Main/1080i/script-plex-signin_blank.xml | 49 + .../Main/1080i/script-plex-slideshow.xml | 63 + .../skins/Main/1080i/script-plex-squares.xml | 769 ++ .../Main/1080i/script-plex-track_context.xml | 67 + .../Main/1080i/script-plex-user_select.xml | 901 ++ .../script-plex-video_current_playlist.xml | 480 + .../Main/1080i/script-plex-video_player.xml | 1343 +++ .../script-plex-video_settings_dialog.xml | 159 + .../Main/media/script.plex/busy-back.png | Bin 0 -> 1280 bytes .../Main/media/script.plex/busy-diffuse.png | Bin 0 -> 356 bytes .../skins/Main/media/script.plex/busy.gif | Bin 0 -> 739 bytes .../media/script.plex/buttons/blank-focus.png | Bin 0 -> 2808 bytes .../Main/media/script.plex/buttons/blank.png | Bin 0 -> 436 bytes .../script.plex/buttons/chapters-focus.png | Bin 0 -> 3360 bytes .../media/script.plex/buttons/chapters.png | Bin 0 -> 596 bytes .../media/script.plex/buttons/home-focus.png | Bin 0 -> 1303 bytes .../Main/media/script.plex/buttons/home.png | Bin 0 -> 845 bytes .../media/script.plex/buttons/info-focus.png | Bin 0 -> 4487 bytes .../Main/media/script.plex/buttons/info.png | Bin 0 -> 1263 bytes .../media/script.plex/buttons/media-focus.png | Bin 0 -> 3780 bytes .../Main/media/script.plex/buttons/media.png | Bin 0 -> 825 bytes .../media/script.plex/buttons/more-focus.png | Bin 0 -> 3286 bytes .../script.plex/buttons/more-vertical.png | Bin 0 -> 433 bytes .../Main/media/script.plex/buttons/more.png | Bin 0 -> 663 bytes .../media/script.plex/buttons/next-focus.png | Bin 0 -> 3894 bytes .../Main/media/script.plex/buttons/next.png | Bin 0 -> 923 bytes .../media/script.plex/buttons/pause-focus.png | Bin 0 -> 3269 bytes .../Main/media/script.plex/buttons/pause.png | Bin 0 -> 493 bytes .../media/script.plex/buttons/play-focus.png | Bin 0 -> 3790 bytes .../Main/media/script.plex/buttons/play.png | Bin 0 -> 910 bytes .../Main/media/script.plex/buttons/power.png | Bin 0 -> 868 bytes .../script.plex/buttons/pqueue-focus.png | Bin 0 -> 4124 bytes .../Main/media/script.plex/buttons/pqueue.png | Bin 0 -> 1052 bytes .../script.plex/buttons/repeat-focus.png | Bin 0 -> 3473 bytes .../script.plex/buttons/repeat-one-focus.png | Bin 0 -> 3645 bytes .../media/script.plex/buttons/repeat-one.png | Bin 0 -> 873 bytes .../Main/media/script.plex/buttons/repeat.png | Bin 0 -> 752 bytes .../script.plex/buttons/resume-focus.png | Bin 0 -> 3414 bytes .../Main/media/script.plex/buttons/resume.png | Bin 0 -> 756 bytes .../script.plex/buttons/role-selected.png | Bin 0 -> 13304 bytes .../media/script.plex/buttons/role-shadow.png | Bin 0 -> 13171 bytes .../script.plex/buttons/rotate-focus.png | Bin 0 -> 4439 bytes .../Main/media/script.plex/buttons/rotate.png | Bin 0 -> 1317 bytes .../script.plex/buttons/search-focus.png | Bin 0 -> 1526 bytes .../Main/media/script.plex/buttons/search.png | Bin 0 -> 861 bytes .../script.plex/buttons/settings-focus.png | Bin 0 -> 4159 bytes .../media/script.plex/buttons/settings.png | Bin 0 -> 1079 bytes .../script.plex/buttons/shuffle-focus.png | Bin 0 -> 4873 bytes .../media/script.plex/buttons/shuffle.png | Bin 0 -> 1407 bytes .../buttons/skip-forward-focus.png | Bin 0 -> 5065 bytes .../script.plex/buttons/skip-forward.png | Bin 0 -> 1223 bytes .../script.plex/buttons/square2x2-focus.png | Bin 0 -> 3445 bytes .../media/script.plex/buttons/square2x2.png | Bin 0 -> 539 bytes .../media/script.plex/buttons/stop-focus.png | Bin 0 -> 3402 bytes .../Main/media/script.plex/buttons/stop.png | Bin 0 -> 474 bytes .../script.plex/buttons/subtitle-focus.png | Bin 0 -> 4620 bytes .../media/script.plex/buttons/subtitle.png | Bin 0 -> 1072 bytes .../media/script.plex/buttons/tags-focus.png | Bin 0 -> 5419 bytes .../Main/media/script.plex/buttons/tags.png | Bin 0 -> 1601 bytes .../script.plex/buttons/trailer-focus.png | Bin 0 -> 5999 bytes .../media/script.plex/buttons/trailer.png | Bin 0 -> 1899 bytes .../media/script.plex/circle-progress/0.png | Bin 0 -> 420 bytes .../media/script.plex/circle-progress/1.png | Bin 0 -> 516 bytes .../media/script.plex/circle-progress/10.png | Bin 0 -> 1500 bytes .../media/script.plex/circle-progress/11.png | Bin 0 -> 1613 bytes .../media/script.plex/circle-progress/12.png | Bin 0 -> 1733 bytes .../media/script.plex/circle-progress/13.png | Bin 0 -> 1764 bytes .../media/script.plex/circle-progress/14.png | Bin 0 -> 1818 bytes .../media/script.plex/circle-progress/15.png | Bin 0 -> 1824 bytes .../media/script.plex/circle-progress/2.png | Bin 0 -> 641 bytes .../media/script.plex/circle-progress/3.png | Bin 0 -> 770 bytes .../media/script.plex/circle-progress/4.png | Bin 0 -> 914 bytes .../media/script.plex/circle-progress/5.png | Bin 0 -> 1006 bytes .../media/script.plex/circle-progress/6.png | Bin 0 -> 1063 bytes .../media/script.plex/circle-progress/7.png | Bin 0 -> 1142 bytes .../media/script.plex/circle-progress/8.png | Bin 0 -> 1269 bytes .../media/script.plex/circle-progress/9.png | Bin 0 -> 1391 bytes .../Main/media/script.plex/drop-shadow.png | Bin 0 -> 1819 bytes .../Main/media/script.plex/gray-square.png | Bin 0 -> 155 bytes .../media/script.plex/home/avatar-diffuse.png | Bin 0 -> 589 bytes .../script.plex/home/background-fallback.png | Bin 0 -> 188030 bytes .../Main/media/script.plex/home/busy.gif | Bin 0 -> 58766 bytes .../media/script.plex/home/device/check.png | Bin 0 -> 520 bytes .../media/script.plex/home/device/error.png | Bin 0 -> 1217 bytes .../home/device/focus-refreshing.gif | Bin 0 -> 6211 bytes .../script.plex/home/device/focus-secure.png | Bin 0 -> 561 bytes .../script.plex/home/device/focus-unknown.png | Bin 0 -> 561 bytes .../home/device/focus-unreachable.png | Bin 0 -> 506 bytes .../media/script.plex/home/device/home.png | Bin 0 -> 367 bytes .../script.plex/home/device/home_small.png | Bin 0 -> 300 bytes .../script.plex/home/device/lock-24px.png | Bin 0 -> 598 bytes .../media/script.plex/home/device/lock.png | Bin 0 -> 630 bytes .../media/script.plex/home/device/plex.png | Bin 0 -> 4939 bytes .../script.plex/home/device/refreshing.gif | Bin 0 -> 6238 bytes .../media/script.plex/home/device/secure.png | Bin 0 -> 674 bytes .../media/script.plex/home/device/unknown.png | Bin 0 -> 664 bytes .../script.plex/home/device/unreachable.png | Bin 0 -> 651 bytes .../Main/media/script.plex/home/plex.png | Bin 0 -> 1579 bytes .../script.plex/home/selected-section.png | Bin 0 -> 6642 bytes .../Main/media/script.plex/home/selected.png | Bin 0 -> 851 bytes .../media/script.plex/home/type/artist.png | Bin 0 -> 1331 bytes .../media/script.plex/home/type/channels.png | Bin 0 -> 298 bytes .../script.plex/home/type/home-selected.png | Bin 0 -> 7286 bytes .../Main/media/script.plex/home/type/home.png | Bin 0 -> 1846 bytes .../media/script.plex/home/type/movie.png | Bin 0 -> 1107 bytes .../media/script.plex/home/type/photo.png | Bin 0 -> 1252 bytes .../media/script.plex/home/type/playlists.png | Bin 0 -> 268 bytes .../Main/media/script.plex/home/type/show.png | Bin 0 -> 396 bytes .../script.plex/indicators/arrow-down.png | Bin 0 -> 409 bytes .../media/script.plex/indicators/arrow-up.png | Bin 0 -> 403 bytes .../script.plex/indicators/busy-photo.gif | Bin 0 -> 62280 bytes .../media/script.plex/indicators/camera.png | Bin 0 -> 634 bytes .../indicators/chevron-white-l.png | Bin 0 -> 1127 bytes .../script.plex/indicators/chevron-white.png | Bin 0 -> 564 bytes .../script.plex/indicators/circle-152.png | Bin 0 -> 4185 bytes .../script.plex/indicators/circle-19.png | Bin 0 -> 316 bytes .../script.plex/indicators/cornerbox.png | Bin 0 -> 317 bytes .../indicators/dropdown-triangle.png | Bin 0 -> 275 bytes .../media/script.plex/indicators/info-sep.png | Bin 0 -> 178 bytes .../media/script.plex/indicators/pause.png | Bin 0 -> 212 bytes .../indicators/player-selection-time.png | Bin 0 -> 446 bytes .../player-selection-time_arrow.png | Bin 0 -> 249 bytes .../indicators/player-selection-time_box.png | Bin 0 -> 335 bytes .../script.plex/indicators/playing-circle.png | Bin 0 -> 680 bytes .../media/script.plex/indicators/remove.png | Bin 0 -> 450 bytes .../media/script.plex/indicators/replay.png | Bin 0 -> 1168 bytes .../indicators/seek-selection-marker.png | Bin 0 -> 339 bytes .../media/script.plex/indicators/spinner.png | Bin 0 -> 824 bytes .../indicators/unwatched-rounded.png | Bin 0 -> 2180 bytes .../script.plex/indicators/unwatched.png | Bin 0 -> 2112 bytes .../masks/listview-16x9-backgroundmask.png | Bin 0 -> 1204 bytes .../Main/media/script.plex/masks/role.png | Bin 0 -> 4606 bytes .../Main/media/script.plex/player-fade.png | Bin 0 -> 332 bytes .../Main/media/script.plex/progress/0.png | Bin 0 -> 154 bytes .../Main/media/script.plex/progress/10.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/100.png | Bin 0 -> 156 bytes .../Main/media/script.plex/progress/12.png | Bin 0 -> 163 bytes .../Main/media/script.plex/progress/14.png | Bin 0 -> 163 bytes .../Main/media/script.plex/progress/16.png | Bin 0 -> 163 bytes .../Main/media/script.plex/progress/18.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/2.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/20.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/22.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/24.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/26.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/28.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/30.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/32.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/34.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/36.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/38.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/4.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/40.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/42.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/44.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/46.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/48.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/50.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/52.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/54.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/56.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/58.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/6.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/60.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/62.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/64.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/66.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/68.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/70.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/72.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/74.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/76.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/78.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/8.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/80.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/82.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/84.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/86.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/88.png | Bin 0 -> 164 bytes .../Main/media/script.plex/progress/90.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/92.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/94.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/96.png | Bin 0 -> 165 bytes .../Main/media/script.plex/progress/98.png | Bin 0 -> 165 bytes .../script.plex/ratings/imdb/image.rating.png | Bin 0 -> 2909 bytes .../ratings/other/image.rating.png | Bin 0 -> 662 bytes .../rottentomatoes/image.rating.certified.png | Bin 0 -> 2754 bytes .../rottentomatoes/image.rating.plus.png | Bin 0 -> 462 bytes .../rottentomatoes/image.rating.ripe.png | Bin 0 -> 1990 bytes .../rottentomatoes/image.rating.rotten.png | Bin 0 -> 2358 bytes .../rottentomatoes/image.rating.spilled.png | Bin 0 -> 2802 bytes .../rottentomatoes/image.rating.upright.png | Bin 0 -> 2108 bytes .../script.plex/ratings/tmdb/image.rating.png | Bin 0 -> 1243 bytes .../reviews/image.review.fresh.png | Bin 0 -> 1238 bytes .../reviews/image.review.rotten.png | Bin 0 -> 1306 bytes .../media/script.plex/section_type/movie.png | Bin 0 -> 16177 bytes .../media/script.plex/section_type/music.png | Bin 0 -> 16307 bytes .../media/script.plex/section_type/photo.png | Bin 0 -> 16385 bytes .../media/script.plex/section_type/show.png | Bin 0 -> 15762 bytes .../media/script.plex/settings/checkbox.png | Bin 0 -> 364 bytes .../media/script.plex/settings/checkmark.png | Bin 0 -> 512 bytes .../media/script.plex/settings/expanded.png | Bin 0 -> 338 bytes .../Main/media/script.plex/sign_in/back.jpg | Bin 0 -> 130557 bytes .../media/script.plex/sign_in/digits/0.png | Bin 0 -> 4573 bytes .../media/script.plex/sign_in/digits/1.png | Bin 0 -> 713 bytes .../media/script.plex/sign_in/digits/2.png | Bin 0 -> 3368 bytes .../media/script.plex/sign_in/digits/3.png | Bin 0 -> 4067 bytes .../media/script.plex/sign_in/digits/4.png | Bin 0 -> 2566 bytes .../media/script.plex/sign_in/digits/5.png | Bin 0 -> 2997 bytes .../media/script.plex/sign_in/digits/6.png | Bin 0 -> 5154 bytes .../media/script.plex/sign_in/digits/7.png | Bin 0 -> 2246 bytes .../media/script.plex/sign_in/digits/8.png | Bin 0 -> 5382 bytes .../media/script.plex/sign_in/digits/9.png | Bin 0 -> 5106 bytes .../media/script.plex/sign_in/digits/A.png | Bin 0 -> 4290 bytes .../media/script.plex/sign_in/digits/B.png | Bin 0 -> 3575 bytes .../media/script.plex/sign_in/digits/C.png | Bin 0 -> 4192 bytes .../media/script.plex/sign_in/digits/D.png | Bin 0 -> 3586 bytes .../media/script.plex/sign_in/digits/E.png | Bin 0 -> 552 bytes .../media/script.plex/sign_in/digits/F.png | Bin 0 -> 539 bytes .../media/script.plex/sign_in/digits/G.png | Bin 0 -> 4383 bytes .../media/script.plex/sign_in/digits/H.png | Bin 0 -> 537 bytes .../media/script.plex/sign_in/digits/I.png | Bin 0 -> 511 bytes .../media/script.plex/sign_in/digits/J.png | Bin 0 -> 1134 bytes .../media/script.plex/sign_in/digits/K.png | Bin 0 -> 3368 bytes .../media/script.plex/sign_in/digits/L.png | Bin 0 -> 525 bytes .../media/script.plex/sign_in/digits/M.png | Bin 0 -> 4291 bytes .../media/script.plex/sign_in/digits/N.png | Bin 0 -> 3641 bytes .../media/script.plex/sign_in/digits/O.png | Bin 0 -> 5231 bytes .../media/script.plex/sign_in/digits/P.png | Bin 0 -> 2346 bytes .../media/script.plex/sign_in/digits/Q.png | Bin 0 -> 5435 bytes .../media/script.plex/sign_in/digits/R.png | Bin 0 -> 3523 bytes .../media/script.plex/sign_in/digits/S.png | Bin 0 -> 4454 bytes .../media/script.plex/sign_in/digits/T.png | Bin 0 -> 520 bytes .../media/script.plex/sign_in/digits/U.png | Bin 0 -> 2371 bytes .../media/script.plex/sign_in/digits/V.png | Bin 0 -> 4241 bytes .../media/script.plex/sign_in/digits/W.png | Bin 0 -> 5489 bytes .../media/script.plex/sign_in/digits/X.png | Bin 0 -> 4200 bytes .../media/script.plex/sign_in/digits/Y.png | Bin 0 -> 2372 bytes .../media/script.plex/sign_in/digits/Z.png | Bin 0 -> 2550 bytes .../script.plex/sign_in/generating-code.jpg | Bin 0 -> 110012 bytes .../script.plex/sign_in/linking-account.jpg | Bin 0 -> 113729 bytes .../media/script.plex/sign_in/pin-display.jpg | Bin 0 -> 131456 bytes .../media/script.plex/sign_in/plexpass.jpg | Bin 0 -> 147243 bytes .../media/script.plex/sign_in/pre-signin.jpg | Bin 0 -> 309135 bytes .../script.plex/sign_in/refresh-code.jpg | Bin 0 -> 128150 bytes .../skins/Main/media/script.plex/splash.png | Bin 0 -> 9464 bytes .../script.plex/square-rounded-shadow.png | Bin 0 -> 3941 bytes .../skins/Main/media/script.plex/stars/0.png | Bin 0 -> 679 bytes .../skins/Main/media/script.plex/stars/1.png | Bin 0 -> 700 bytes .../skins/Main/media/script.plex/stars/2.png | Bin 0 -> 699 bytes .../skins/Main/media/script.plex/stars/3.png | Bin 0 -> 697 bytes .../skins/Main/media/script.plex/stars/4.png | Bin 0 -> 686 bytes .../skins/Main/media/script.plex/stars/5.png | Bin 0 -> 568 bytes .../thumb_fallbacks/broken-photo-thumb.png | Bin 0 -> 98851 bytes .../thumb_fallbacks/broken-photo.png | Bin 0 -> 5551 bytes .../script.plex/thumb_fallbacks/movie.png | Bin 0 -> 13306 bytes .../script.plex/thumb_fallbacks/movie16x9.png | Bin 0 -> 17652 bytes .../script.plex/thumb_fallbacks/music.png | Bin 0 -> 16467 bytes .../script.plex/thumb_fallbacks/photo.png | Bin 0 -> 16984 bytes .../script.plex/thumb_fallbacks/role.png | Bin 0 -> 43891 bytes .../script.plex/thumb_fallbacks/show.png | Bin 0 -> 12438 bytes .../media/script.plex/transparent-6px.png | Bin 0 -> 160 bytes .../script.plex/user_select/admin-back.png | Bin 0 -> 719 bytes .../script.plex/user_select/admin-icon.png | Bin 0 -> 954 bytes .../user_select/avatar-background.png | Bin 0 -> 3476 bytes .../user_select/avatar-diffuse.png | Bin 0 -> 3224 bytes .../script.plex/user_select/backspace.png | Bin 0 -> 966 bytes .../script.plex/user_select/backspace_nf.png | Bin 0 -> 938 bytes .../user_select/item-background-bottom.png | Bin 0 -> 421 bytes .../user_select/item-background-top.png | Bin 0 -> 976 bytes .../user_select/item-background.png | Bin 0 -> 1022 bytes .../media/script.plex/user_select/plex.png | Bin 0 -> 5374 bytes .../user_select/protected-back.png | Bin 0 -> 719 bytes .../user_select/protected-icon.png | Bin 0 -> 688 bytes .../script.plex/white-outline-rounded.png | Bin 0 -> 537 bytes .../media/script.plex/white-square-1px.png | Bin 0 -> 146 bytes .../media/script.plex/white-square-6px.png | Bin 0 -> 155 bytes .../script.plex/white-square-left-rounded.png | Bin 0 -> 404 bytes .../script.plex/white-square-rounded-4r.png | Bin 0 -> 228 bytes .../white-square-rounded-top-padded.png | Bin 0 -> 464 bytes .../white-square-rounded-with-shadow.png | Bin 0 -> 3060 bytes .../script.plex/white-square-rounded.png | Bin 0 -> 457 bytes .../script.plex/white-square-tl-rounded.png | Bin 0 -> 365 bytes .../script.plex/white-square-top-rounded.png | Bin 0 -> 403 bytes .../Main/media/script.plex/white-square.png | Bin 0 -> 155 bytes script.plexmod/resources/skins/Main/skin.xml | 14 + script.plexmod/screensaver.py | 24 + script.plexmod/service.py | 21 + script.radioparadise/CHANGELOG.md | 29 - script.radioparadise/COPYING | 674 -- script.radioparadise/LICENSE.txt | 16 - script.radioparadise/README.md | 39 - script.radioparadise/addon.xml | 24 - script.radioparadise/resources/clearlogo.png | Bin 45608 -> 0 bytes script.radioparadise/resources/fanart.jpg | Bin 386955 -> 0 bytes script.radioparadise/resources/icon.png | Bin 28087 -> 0 bytes .../resource.language.en_gb/strings.po | 46 - .../resources/lib/__init__.py | 0 .../resources/lib/radioparadise.py | 142 - script.radioparadise/resources/lib/script.py | 58 - script.radioparadise/resources/lib/service.py | 285 - script.radioparadise/resources/settings.xml | 60 - .../Default/720p/script-radioparadise.xml | 40 - .../resources/skins/Default/media/logo.png | Bin 13388 -> 0 bytes .../skins/Default/media/menu-focus.png | Bin 184 -> 0 bytes script.radioparadise/script.py | 5 - script.radioparadise/service.py | 5 - script.service.hyperion-control/addon.xml | 49 - .../resources/__init__.py | 1 - .../resources/fanart.png | Bin 70622 -> 0 bytes .../resources/icon.png | Bin 153145 -> 0 bytes .../resource.language.de_de/strings.po | 194 - .../resource.language.en_gb/strings.po | 194 - .../resource.language.es_es/strings.po | 194 - .../resource.language.fr_fr/strings.po | 196 - .../resource.language.hu_hu/strings.po | 194 - .../resource.language.pl_pl/strings.po | 194 - .../resources/lib/__init__.py | 1 - .../resources/lib/api_client.py | 108 - .../resources/lib/gui.py | 80 - .../resources/lib/hyperion.py | 109 - .../resources/lib/interfaces.py | 98 - .../resources/lib/logger.py | 25 - .../resources/lib/monitor.py | 35 - .../resources/lib/player.py | 47 - .../resources/lib/settings_manager.py | 175 - .../resources/lib/ssdp.py | 111 - .../resources/lib/utils.py | 25 - .../resources/screenshot-01.png | Bin 226746 -> 0 bytes .../resources/settings.xml | 29 - script.service.hyperion-control/service.py | 45 - script.service.hyperion/addon.xml | 36 - script.service.hyperion/resources/__init__.py | 0 script.service.hyperion/resources/fanart.png | Bin 70622 -> 0 bytes script.service.hyperion/resources/icon.png | Bin 153145 -> 0 bytes .../resource.language.de_de/strings.po | 63 - .../resource.language.en_gb/strings.po | 63 - .../resource.language.he_il/strings.po | 66 - .../resource.language.it_it/strings.po | 63 - .../resources/lib/__init__.py | 0 script.service.hyperion/resources/lib/gui.py | 34 - .../resources/lib/hyperion/__init__.py | 0 .../resources/lib/hyperion/hyperion.py | 146 - .../resources/lib/hyperion/message.proto | 82 - .../resources/lib/hyperion/message_pb2.py | 617 -- .../resources/lib/logger.py | 25 - .../resources/lib/monitor.py | 159 - .../resources/lib/settings.py | 78 - .../resources/screenshot-01.png | Bin 110923 -> 0 bytes .../resources/settings.xml | 15 - script.service.hyperion/service.py | 46 - script.wikipedia/LICENSE.txt | 674 -- script.wikipedia/README.md | 72 - script.wikipedia/addon.xml | 21 - script.wikipedia/fanart.jpg | Bin 50926 -> 0 bytes script.wikipedia/icon.png | Bin 139573 -> 0 bytes .../resource.language.en_gb/strings.po | 27 - script.wikipedia/resources/lib/api.py | 378 - script.wikipedia/resources/lib/script.py | 39 - script.wikipedia/resources/script.py | 8 - .../skins/default/1080i/script-wikipedia.xml | 132 - service.languagepreferencemanager/LICENSE.txt | 340 - service.languagepreferencemanager/README.md | 30 - service.languagepreferencemanager/addon.xml | 36 - .../changelog.txt | 97 - service.languagepreferencemanager/default.py | 57 - .../resources/fanart.jpg | Bin 261523 -> 0 bytes .../resources/icon.png | Bin 111986 -> 0 bytes .../resource.language.en_gb/strings.po | 314 - .../resources/lib/langcodes.py | 65 - .../resources/lib/prefparser.py | 100 - .../resources/lib/prefsettings.py | 164 - .../resources/lib/prefutils.py | 382 - .../resources/settings.xml | 842 -- service.watchedlist/LICENSE.txt | 674 -- service.watchedlist/addon.xml | 43 - service.watchedlist/changelog.txt | 109 - service.watchedlist/default.py | 31 - service.watchedlist/fanart.jpg | Bin 147130 -> 0 bytes service.watchedlist/icon.png | Bin 22921 -> 0 bytes service.watchedlist/lib/watchedlist/api.py | 110 - service.watchedlist/lib/watchedlist/utils.py | 209 - .../lib/watchedlist/watchedlist.py | 1846 ---- service.watchedlist/manual.py | 34 - .../resource.language.de_de/strings.po | 389 - .../resource.language.en_gb/strings.po | 419 - .../resource.language.he_il/strings.po | 409 - service.watchedlist/resources/settings.xml | 37 - 1012 files changed, 89138 insertions(+), 62790 deletions(-) delete mode 100644 screensaver.picture.slideshow/addon.xml delete mode 100644 screensaver.picture.slideshow/changelog.txt delete mode 100644 screensaver.picture.slideshow/default.py delete mode 100644 screensaver.picture.slideshow/lib/gui.py delete mode 100644 screensaver.picture.slideshow/lib/utils.py delete mode 100644 screensaver.picture.slideshow/resources/fanart.jpg delete mode 100644 screensaver.picture.slideshow/resources/icon.png delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.af_za/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.am_et/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.ar_sa/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.az_az/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.be_by/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.bg_bg/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.bs_ba/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.ca_es/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.cs_cz/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.cy_gb/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.da_dk/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.de_de/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.el_gr/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.en_au/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.en_gb/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.en_nz/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.en_us/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.eo/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.es_ar/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.es_es/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.es_mx/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.et_ee/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.eu_es/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.fa_af/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.fa_ir/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.fi_fi/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.fo_fo/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.fr_ca/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.fr_fr/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.gl_es/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.he_il/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.hi_in/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.hr_hr/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.hu_hu/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.id_id/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.is_is/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.it_it/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.ja_jp/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.ko_kr/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.lt_lt/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.lv_lv/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.mi/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.mk_mk/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.ms_my/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.mt_mt/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.my_mm/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.nb_no/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.nl_nl/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.pl_pl/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.pt_br/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.pt_pt/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.ro_ro/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.ru_ru/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.sk_sk/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.sl_si/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.sq_al/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.sr_rs/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.sr_rs@latin/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.sv_se/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.ta_in/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.tg_tj/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.th_th/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.tr_tr/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.uk_ua/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.uz_uz/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.vi_vn/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.zh_cn/strings.po delete mode 100644 screensaver.picture.slideshow/resources/language/resource.language.zh_tw/strings.po delete mode 100644 screensaver.picture.slideshow/resources/settings.xml delete mode 100644 screensaver.picture.slideshow/resources/skins/default/1080i/script-python-slideshow.xml delete mode 100644 screensaver.picture.slideshow/resources/skins/default/media/overlayfade.png delete mode 100644 screensaver.picture.slideshow/resources/skins/default/media/screensaver-black.png delete mode 100644 screensaver.picture.slideshow/resources/skins/default/media/screensaver-progress.png delete mode 100644 screensaver.picture.slideshow/resources/skins/default/media/screensaver-splash.png delete mode 100644 script.areace/LICENSE.txt delete mode 100644 script.areace/addon.xml delete mode 100644 script.areace/resources/data_loader.py delete mode 100644 script.areace/resources/fanart.jpg delete mode 100644 script.areace/resources/icon.png delete mode 100644 script.areace/resources/main_dialog.py delete mode 100644 script.areace/resources/settings.xml delete mode 100644 script.areace/resources/telegram.py delete mode 100644 script.areace/script.py delete mode 100644 script.common.plugin.cache/LICENSES/GPL-3.0-only.txt delete mode 100644 script.common.plugin.cache/addon.xml delete mode 100644 script.common.plugin.cache/changelog.txt delete mode 100644 script.common.plugin.cache/icon.png delete mode 100644 script.common.plugin.cache/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.common.plugin.cache/resources/lib/__init__.py delete mode 100644 script.common.plugin.cache/resources/lib/entry_point.py delete mode 100644 script.common.plugin.cache/resources/lib/service.py delete mode 100644 script.common.plugin.cache/resources/lib/storage_server/StorageServer.py delete mode 100644 script.common.plugin.cache/resources/lib/storage_server/__init__.py delete mode 100644 script.common.plugin.cache/resources/lib/storage_server/storageserverdummy.py delete mode 100644 script.common.plugin.cache/resources/settings.xml delete mode 100644 script.copacetic.helper/LICENSE.txt delete mode 100644 script.copacetic.helper/README.md delete mode 100644 script.copacetic.helper/addon.xml delete mode 100644 script.copacetic.helper/plugin.py delete mode 100644 script.copacetic.helper/resources/fanart.jpg delete mode 100644 script.copacetic.helper/resources/icon.png delete mode 100644 script.copacetic.helper/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.copacetic.helper/resources/lib/plugin/content.py delete mode 100644 script.copacetic.helper/resources/lib/plugin/json_map.py delete mode 100644 script.copacetic.helper/resources/lib/plugin/library.py delete mode 100644 script.copacetic.helper/resources/lib/plugin/listing.py delete mode 100644 script.copacetic.helper/resources/lib/plugin/main.py delete mode 100644 script.copacetic.helper/resources/lib/script/actions.py delete mode 100644 script.copacetic.helper/resources/lib/service/art.py delete mode 100644 script.copacetic.helper/resources/lib/service/monitor.py delete mode 100644 script.copacetic.helper/resources/lib/service/player.py delete mode 100644 script.copacetic.helper/resources/lib/service/settings.py delete mode 100644 script.copacetic.helper/resources/lib/utilities.py delete mode 100644 script.copacetic.helper/resources/settings.xml delete mode 100644 script.copacetic.helper/script.py delete mode 100644 script.copacetic.helper/service.py delete mode 100644 script.module.dropbox_auth/LICENSE.txt delete mode 100644 script.module.dropbox_auth/addon.xml delete mode 100644 script.module.dropbox_auth/authenticate.py delete mode 100644 script.module.dropbox_auth/resources/language/resource.language.de_de/strings.po delete mode 100644 script.module.dropbox_auth/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.module.dropbox_auth/resources/utils.py delete mode 100644 script.module.infotagger/README.md delete mode 100644 script.module.infotagger/addon.xml delete mode 100644 script.module.infotagger/icon.png delete mode 100644 script.module.infotagger/resources/modules/infotagger/listitem.py delete mode 100644 script.module.jurialmunkey/addon.xml delete mode 100644 script.module.jurialmunkey/icon.png delete mode 100644 script.module.jurialmunkey/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/bcache.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/dialog.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/futils.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/logger.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/parser.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/plugin.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/reqapi.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/scache.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/thread.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/tmdate.py delete mode 100644 script.module.jurialmunkey/resources/modules/jurialmunkey/window.py delete mode 100644 script.module.protobuf/.gitignore delete mode 100644 script.module.protobuf/LICENSE delete mode 100644 script.module.protobuf/README.md delete mode 100644 script.module.protobuf/Taskfile.yml delete mode 100644 script.module.protobuf/addon.xml delete mode 100644 script.module.protobuf/resources/icon.png delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/__init__.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/any_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/api_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/compiler/__init__.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/compiler/plugin_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/descriptor.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/descriptor_database.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/descriptor_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/descriptor_pool.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/duration_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/empty_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/field_mask_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/__init__.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/_parameterized.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/api_implementation.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/builder.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/containers.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/decoder.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/encoder.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/enum_type_wrapper.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/extension_dict.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/field_mask.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/message_listener.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/python_message.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/testing_refleaks.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/type_checkers.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/well_known_types.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/internal/wire_format.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/json_format.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/message.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/message_factory.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/proto_builder.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/pyext/__init__.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/pyext/cpp_message.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/reflection.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/service.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/service_reflection.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/source_context_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/struct_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/symbol_database.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/text_encoding.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/text_format.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/timestamp_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/type_pb2.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/unknown_fields.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/util/__init__.py delete mode 100644 script.module.protobuf/resources/lib/google/protobuf/wrappers_pb2.py delete mode 100644 script.module.python.twitch/LICENSES/GPL-3.0-only delete mode 100644 script.module.python.twitch/addon.xml delete mode 100644 script.module.python.twitch/changelog.txt delete mode 100644 script.module.python.twitch/resources/__init__.py delete mode 100644 script.module.python.twitch/resources/language/resource.language.af_za/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.am_et/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ar_sa/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ast_es/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.az_az/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.be_by/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.bg_bg/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.bs_ba/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ca_es/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.cs_cz/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.cy_gb/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.da_dk/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.de_de/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.el_gr/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.en_au/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.en_nz/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.en_us/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.eo/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.es_ar/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.es_es/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.es_mx/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.et_ee/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.eu_es/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.fa_af/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.fa_ir/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.fi_fi/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.fo_fo/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.fr_ca/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.fr_fr/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.gl_es/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.he_il/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.hi_in/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.hr_hr/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.hu_hu/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.hy_am/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.id_id/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.is_is/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.it_it/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ja_jp/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.kn_in/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ko_kr/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.lt_lt/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.lv_lv/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.mi/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.mk_mk/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ml_in/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.mn_mn/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ms_my/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.mt_mt/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.my_mm/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.nb_no/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.nl_nl/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.oc_fr/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.os_os/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.pl_pl/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.pt_br/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.pt_pt/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ro_ro/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ru_ru/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.si_lk/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.sk_sk/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.sl_si/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.sq_al/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.sr_rs/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.sr_rs@latin/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.sv_se/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.szl/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.ta_in/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.te_in/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.tg_tj/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.th_th/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.tr_tr/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.uk_ua/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.uz_uz/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.vi_vn/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.zh_cn/strings.po delete mode 100644 script.module.python.twitch/resources/language/resource.language.zh_tw/strings.po delete mode 100644 script.module.python.twitch/resources/lib/__init__.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/__init__.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/__init__.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/__init__.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/analytics.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/bits.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/clips.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/entitlements.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/games.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/search.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/streams.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/subscriptions.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/tags.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/users.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/videos.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/helix/webhooks.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/parameters.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/api/usher.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/exceptions.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/keys.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/log.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/methods.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/oauth/__init__.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/oauth/clients.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/oauth/helix/__init__.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/oauth/helix/scopes.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/oauth/validation.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/parser.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/queries.py delete mode 100644 script.module.python.twitch/resources/lib/twitch/scraper.py delete mode 100644 script.module.python.twitch/resources/media/icon.png delete mode 100644 script.module.t1mlib/LICENSE.txt delete mode 100644 script.module.t1mlib/addon.xml delete mode 100644 script.module.t1mlib/lib/t1mlib.py delete mode 100644 script.module.t1mlib/readme.txt delete mode 100644 script.module.t1mlib/resources/icon.png delete mode 100644 script.module.tubed.api/LICENSES/GPL-2.0-only.txt delete mode 100644 script.module.tubed.api/addon.xml delete mode 100644 script.module.tubed.api/resources/language/resource.language.af_za/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.am_et/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ar_sa/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ast_es/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.az_az/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.be_by/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.bg_bg/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.bs_ba/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ca_es/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.cs_cz/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.cy_gb/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.da_dk/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.de_de/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.el_gr/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.en_au/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.en_nz/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.en_us/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.eo/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.es_ar/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.es_es/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.es_mx/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.et_ee/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.eu_es/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.fa_af/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.fa_ir/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.fi_fi/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.fo_fo/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.fr_ca/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.fr_fr/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.gl_es/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.he_il/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.hi_in/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.hr_hr/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.hu_hu/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.hy_am/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.id_id/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.is_is/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.it_it/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ja_jp/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.kn_in/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ko_kr/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.lt_lt/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.lv_lv/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.mi/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.mk_mk/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ml_in/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.mn_mn/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ms_my/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.mt_mt/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.my_mm/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.nb_no/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.nl_nl/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.oc_fr/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.os_os/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.pl_pl/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.pt_br/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.pt_pt/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ro_ro/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ru_ru/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.si_lk/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.sk_sk/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.sl_si/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.sq_al/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.sr_rs/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.sr_rs@latin/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.sv_se/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.szl/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.ta_in/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.te_in/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.tg_tj/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.th_th/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.tr_tr/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.uk_ua/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.uz_uz/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.vi_vn/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.zh_cn/strings.po delete mode 100644 script.module.tubed.api/resources/language/resource.language.zh_tw/strings.po delete mode 100644 script.module.tubed.api/resources/lib/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/service.py delete mode 100644 script.module.tubed.api/resources/lib/src/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/constants/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/constants/config.py delete mode 100644 script.module.tubed.api/resources/lib/src/httpd/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/httpd/daemon.py delete mode 100644 script.module.tubed.api/resources/lib/src/httpd/handler.py delete mode 100644 script.module.tubed.api/resources/lib/src/service.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/constants/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/constants/http.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/exceptions.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/oauth/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/oauth/client.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/oauth/scopes.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/usher/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/itags.json delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/mpeg_dash.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/quality.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/subtitles.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/video_info.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/usher/resolver.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/utils/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/utils/logger.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/utils/time.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/__init__.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/activities.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/captions.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channel_banners.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channel_sections.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channels.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/comment_threads.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/comments.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/guide_categories.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/i18n_languages.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/i18n_regions.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/members.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/membership_levels.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/playlist_items.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/playlists.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/search.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/subscriptions.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/thumbnails.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/video_abuse_report_reasons.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/video_categories.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/videos.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/api/watermarks.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/query.py delete mode 100644 script.module.tubed.api/resources/lib/src/tubed_api/v3/request_handler.py delete mode 100644 script.module.tubed.api/resources/media/fanart.jpg delete mode 100644 script.module.tubed.api/resources/media/icon.png delete mode 100644 script.module.tubed.api/resources/settings.xml create mode 100644 script.plexmod/.gitignore rename {screensaver.picture.slideshow => script.plexmod}/LICENSE.txt (61%) create mode 100644 script.plexmod/README.md create mode 100644 script.plexmod/TESTING_SQUAD.md create mode 100644 script.plexmod/addon.xml create mode 100644 script.plexmod/changelog.txt create mode 100644 script.plexmod/default.py create mode 100644 script.plexmod/fanart.jpg create mode 100644 script.plexmod/icon.png create mode 100644 script.plexmod/lib/__init__.py create mode 100644 script.plexmod/lib/_included_packages/__init__.py create mode 100644 script.plexmod/lib/_included_packages/icmplib/__init__.py create mode 100644 script.plexmod/lib/_included_packages/icmplib/exceptions.py create mode 100644 script.plexmod/lib/_included_packages/icmplib/models.py create mode 100644 script.plexmod/lib/_included_packages/icmplib/multiping.py create mode 100644 script.plexmod/lib/_included_packages/icmplib/ping.py create mode 100644 script.plexmod/lib/_included_packages/icmplib/sockets.py create mode 100644 script.plexmod/lib/_included_packages/icmplib/traceroute.py create mode 100644 script.plexmod/lib/_included_packages/icmplib/utils.py rename {script.copacetic.helper/resources => script.plexmod/lib/_included_packages/plexnet}/__init__.py (100%) create mode 100644 script.plexmod/lib/_included_packages/plexnet/asyncadapter.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/audio.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/audioobject.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/callback.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/captions.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/compat.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/exceptions.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/gdm.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/http.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/locks.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/media.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/mediachoice.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/mediadecisionengine.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/myplex.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/myplexaccount.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/myplexmanager.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/myplexrequest.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/myplexserver.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/netif/__init__.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/netif/getifaddrs.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/netif/ipconfig.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/netif/winpsif.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/nowplayingmanager.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/photo.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/playlist.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/playqueue.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexapp.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexconnection.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexlibrary.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexmedia.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexobjects.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexpart.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexplayer.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexrequest.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexresource.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexresult.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexserver.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexservermanager.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/plexstream.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/serverdecision.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalslot/__init__.py rename {script.module.protobuf/resources/lib/google => script.plexmod/lib/_included_packages/plexnet/signalslot/contrib}/__init__.py (100%) create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/__init__.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/task.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/test.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalslot/exceptions.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalslot/signal.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalslot/slot.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalslot/tests.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/signalsmixin.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/simpleobjects.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/threadutils.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/util.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/verlib.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/video.py create mode 100644 script.plexmod/lib/_included_packages/plexnet/videosession.py create mode 100644 script.plexmod/lib/backgroundthread.py create mode 100644 script.plexmod/lib/colors.py create mode 100644 script.plexmod/lib/compat.py create mode 100644 script.plexmod/lib/distro.py create mode 100644 script.plexmod/lib/exceptions.py create mode 100644 script.plexmod/lib/image.py create mode 100644 script.plexmod/lib/kodijsonrpc.py create mode 100644 script.plexmod/lib/main.py create mode 100644 script.plexmod/lib/metadata.py create mode 100644 script.plexmod/lib/playback_utils.py create mode 100644 script.plexmod/lib/player.py create mode 100644 script.plexmod/lib/plex.py create mode 100644 script.plexmod/lib/util.py create mode 100644 script.plexmod/lib/windows/__init__.py create mode 100644 script.plexmod/lib/windows/background.py create mode 100644 script.plexmod/lib/windows/busy.py create mode 100644 script.plexmod/lib/windows/currentplaylist.py create mode 100644 script.plexmod/lib/windows/dropdown.py create mode 100644 script.plexmod/lib/windows/episodes.py create mode 100644 script.plexmod/lib/windows/home.py create mode 100644 script.plexmod/lib/windows/info.py create mode 100644 script.plexmod/lib/windows/kodigui.py create mode 100644 script.plexmod/lib/windows/library.py create mode 100644 script.plexmod/lib/windows/mixins.py create mode 100644 script.plexmod/lib/windows/musicplayer.py create mode 100644 script.plexmod/lib/windows/opener.py create mode 100644 script.plexmod/lib/windows/optionsdialog.py create mode 100644 script.plexmod/lib/windows/pagination.py create mode 100644 script.plexmod/lib/windows/photos.py create mode 100644 script.plexmod/lib/windows/playbacksettings.py create mode 100644 script.plexmod/lib/windows/playerbackground.py create mode 100644 script.plexmod/lib/windows/playersettings.py create mode 100644 script.plexmod/lib/windows/playlist.py create mode 100644 script.plexmod/lib/windows/playlists.py create mode 100644 script.plexmod/lib/windows/preplay.py create mode 100644 script.plexmod/lib/windows/preplayutils.py create mode 100644 script.plexmod/lib/windows/search.py create mode 100644 script.plexmod/lib/windows/seekdialog.py create mode 100644 script.plexmod/lib/windows/settings.py create mode 100644 script.plexmod/lib/windows/signin.py create mode 100644 script.plexmod/lib/windows/slidehshow.py create mode 100644 script.plexmod/lib/windows/subitems.py create mode 100644 script.plexmod/lib/windows/tracks.py create mode 100644 script.plexmod/lib/windows/userselect.py create mode 100644 script.plexmod/lib/windows/videoplayer.py create mode 100644 script.plexmod/lib/windows/windowutils.py create mode 100644 script.plexmod/plugin.py create mode 100644 script.plexmod/pm4k_cache_template.xml create mode 100644 script.plexmod/resources/language/resource.language.cs_cz/strings.po create mode 100644 script.plexmod/resources/language/resource.language.de_de/strings.po create mode 100644 script.plexmod/resources/language/resource.language.en_gb/strings.po create mode 100644 script.plexmod/resources/language/resource.language.es_es/strings.po create mode 100644 script.plexmod/resources/language/resource.language.fr_fr/strings.po create mode 100644 script.plexmod/resources/language/resource.language.hu_hu/strings.po create mode 100644 script.plexmod/resources/language/resource.language.it_it/strings.po create mode 100644 script.plexmod/resources/language/resource.language.pl_pl/strings.po create mode 100644 script.plexmod/resources/language/resource.language.pt_br/strings.po create mode 100644 script.plexmod/resources/language/resource.language.pt_pt/strings.po create mode 100644 script.plexmod/resources/language/resource.language.ru_ru/strings.po create mode 100644 script.plexmod/resources/language/resource.language.zh_cn/strings.po create mode 100644 script.plexmod/resources/settings.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-album.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-artist.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-background.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-blank.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-busy.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-busy_msg.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-dropdown.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-dropdown_header.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-episodes.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-home.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-info.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-listview-16x9-chunked.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-listview-16x9.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-listview-square-chunked.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-listview-square.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-music_current_playlist.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-music_player.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-options_dialog.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-photo.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-pin_login.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-playlist.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-playlists.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-plex_pass.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-posters-small.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-posters.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-pre_play.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-pre_signin.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-refresh_code.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-search.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-seasons.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-seek_dialog.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-settings.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-settings_select_dialog.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-signin_background.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-signin_blank.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-slideshow.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-squares.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-track_context.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-user_select.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-video_current_playlist.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-video_player.xml create mode 100644 script.plexmod/resources/skins/Main/1080i/script-plex-video_settings_dialog.xml create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/busy-back.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/busy-diffuse.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/busy.gif create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/blank-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/blank.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/chapters-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/chapters.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/home-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/home.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/info-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/info.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/media-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/media.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/more-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/more-vertical.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/more.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/next-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/next.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/pause-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/pause.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/play-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/play.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/power.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/pqueue-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/pqueue.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/repeat-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/repeat-one-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/repeat-one.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/repeat.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/resume-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/resume.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/role-selected.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/role-shadow.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/rotate-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/rotate.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/search-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/search.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/settings-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/settings.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/shuffle-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/shuffle.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/skip-forward-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/skip-forward.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/square2x2-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/square2x2.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/stop-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/stop.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/subtitle-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/subtitle.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/tags-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/tags.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/trailer-focus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/buttons/trailer.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/0.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/1.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/10.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/11.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/12.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/13.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/14.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/15.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/2.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/3.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/4.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/5.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/6.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/7.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/8.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/circle-progress/9.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/drop-shadow.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/gray-square.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/avatar-diffuse.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/background-fallback.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/busy.gif create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/check.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/error.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-refreshing.gif create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-secure.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-unknown.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-unreachable.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/home.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/home_small.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/lock-24px.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/lock.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/plex.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/refreshing.gif create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/secure.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/unknown.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/device/unreachable.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/plex.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/selected-section.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/selected.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/type/artist.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/type/channels.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/type/home-selected.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/type/home.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/type/movie.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/type/photo.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/type/playlists.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/home/type/show.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/arrow-down.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/arrow-up.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/busy-photo.gif create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/camera.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/chevron-white-l.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/chevron-white.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/circle-152.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/circle-19.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/cornerbox.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/dropdown-triangle.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/info-sep.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/pause.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/player-selection-time.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/player-selection-time_arrow.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/player-selection-time_box.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/playing-circle.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/remove.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/replay.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/seek-selection-marker.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/spinner.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/unwatched-rounded.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/indicators/unwatched.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/masks/listview-16x9-backgroundmask.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/masks/role.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/player-fade.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/0.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/10.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/100.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/12.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/14.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/16.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/18.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/2.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/20.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/22.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/24.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/26.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/28.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/30.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/32.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/34.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/36.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/38.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/4.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/40.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/42.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/44.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/46.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/48.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/50.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/52.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/54.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/56.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/58.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/6.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/60.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/62.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/64.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/66.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/68.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/70.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/72.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/74.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/76.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/78.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/8.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/80.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/82.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/84.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/86.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/88.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/90.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/92.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/94.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/96.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/progress/98.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/imdb/image.rating.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/other/image.rating.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.certified.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.plus.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.ripe.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.rotten.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.spilled.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.upright.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/ratings/tmdb/image.rating.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/reviews/image.review.fresh.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/reviews/image.review.rotten.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/section_type/movie.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/section_type/music.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/section_type/photo.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/section_type/show.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/settings/checkbox.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/settings/checkmark.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/settings/expanded.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/back.jpg create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/0.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/1.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/2.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/3.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/4.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/5.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/6.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/7.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/8.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/9.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/A.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/B.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/C.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/D.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/E.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/F.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/G.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/H.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/I.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/J.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/K.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/L.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/M.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/N.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/O.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/P.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/Q.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/R.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/S.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/T.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/U.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/V.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/W.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/X.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/Y.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/Z.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/generating-code.jpg create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/linking-account.jpg create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/pin-display.jpg create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/plexpass.jpg create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/pre-signin.jpg create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/sign_in/refresh-code.jpg create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/splash.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/square-rounded-shadow.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/stars/0.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/stars/1.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/stars/2.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/stars/3.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/stars/4.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/stars/5.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/broken-photo-thumb.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/broken-photo.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/movie.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/movie16x9.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/music.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/photo.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/role.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/show.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/transparent-6px.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/admin-back.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/admin-icon.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/avatar-background.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/avatar-diffuse.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/backspace.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/backspace_nf.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/item-background-bottom.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/item-background-top.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/item-background.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/plex.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/protected-back.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/user_select/protected-icon.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-outline-rounded.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-1px.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-6px.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-left-rounded.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-rounded-4r.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-rounded-top-padded.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-rounded-with-shadow.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-rounded.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-tl-rounded.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square-top-rounded.png create mode 100644 script.plexmod/resources/skins/Main/media/script.plex/white-square.png create mode 100644 script.plexmod/resources/skins/Main/skin.xml create mode 100644 script.plexmod/screensaver.py create mode 100644 script.plexmod/service.py delete mode 100644 script.radioparadise/CHANGELOG.md delete mode 100644 script.radioparadise/COPYING delete mode 100644 script.radioparadise/LICENSE.txt delete mode 100644 script.radioparadise/README.md delete mode 100644 script.radioparadise/addon.xml delete mode 100644 script.radioparadise/resources/clearlogo.png delete mode 100644 script.radioparadise/resources/fanart.jpg delete mode 100644 script.radioparadise/resources/icon.png delete mode 100644 script.radioparadise/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.radioparadise/resources/lib/__init__.py delete mode 100644 script.radioparadise/resources/lib/radioparadise.py delete mode 100644 script.radioparadise/resources/lib/script.py delete mode 100644 script.radioparadise/resources/lib/service.py delete mode 100644 script.radioparadise/resources/settings.xml delete mode 100644 script.radioparadise/resources/skins/Default/720p/script-radioparadise.xml delete mode 100644 script.radioparadise/resources/skins/Default/media/logo.png delete mode 100644 script.radioparadise/resources/skins/Default/media/menu-focus.png delete mode 100644 script.radioparadise/script.py delete mode 100644 script.radioparadise/service.py delete mode 100644 script.service.hyperion-control/addon.xml delete mode 100644 script.service.hyperion-control/resources/__init__.py delete mode 100644 script.service.hyperion-control/resources/fanart.png delete mode 100644 script.service.hyperion-control/resources/icon.png delete mode 100644 script.service.hyperion-control/resources/language/resource.language.de_de/strings.po delete mode 100644 script.service.hyperion-control/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.service.hyperion-control/resources/language/resource.language.es_es/strings.po delete mode 100644 script.service.hyperion-control/resources/language/resource.language.fr_fr/strings.po delete mode 100644 script.service.hyperion-control/resources/language/resource.language.hu_hu/strings.po delete mode 100644 script.service.hyperion-control/resources/language/resource.language.pl_pl/strings.po delete mode 100644 script.service.hyperion-control/resources/lib/__init__.py delete mode 100644 script.service.hyperion-control/resources/lib/api_client.py delete mode 100644 script.service.hyperion-control/resources/lib/gui.py delete mode 100644 script.service.hyperion-control/resources/lib/hyperion.py delete mode 100644 script.service.hyperion-control/resources/lib/interfaces.py delete mode 100644 script.service.hyperion-control/resources/lib/logger.py delete mode 100644 script.service.hyperion-control/resources/lib/monitor.py delete mode 100644 script.service.hyperion-control/resources/lib/player.py delete mode 100644 script.service.hyperion-control/resources/lib/settings_manager.py delete mode 100644 script.service.hyperion-control/resources/lib/ssdp.py delete mode 100644 script.service.hyperion-control/resources/lib/utils.py delete mode 100644 script.service.hyperion-control/resources/screenshot-01.png delete mode 100644 script.service.hyperion-control/resources/settings.xml delete mode 100644 script.service.hyperion-control/service.py delete mode 100644 script.service.hyperion/addon.xml delete mode 100644 script.service.hyperion/resources/__init__.py delete mode 100644 script.service.hyperion/resources/fanart.png delete mode 100644 script.service.hyperion/resources/icon.png delete mode 100644 script.service.hyperion/resources/language/resource.language.de_de/strings.po delete mode 100644 script.service.hyperion/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.service.hyperion/resources/language/resource.language.he_il/strings.po delete mode 100644 script.service.hyperion/resources/language/resource.language.it_it/strings.po delete mode 100644 script.service.hyperion/resources/lib/__init__.py delete mode 100644 script.service.hyperion/resources/lib/gui.py delete mode 100644 script.service.hyperion/resources/lib/hyperion/__init__.py delete mode 100644 script.service.hyperion/resources/lib/hyperion/hyperion.py delete mode 100644 script.service.hyperion/resources/lib/hyperion/message.proto delete mode 100644 script.service.hyperion/resources/lib/hyperion/message_pb2.py delete mode 100644 script.service.hyperion/resources/lib/logger.py delete mode 100644 script.service.hyperion/resources/lib/monitor.py delete mode 100644 script.service.hyperion/resources/lib/settings.py delete mode 100644 script.service.hyperion/resources/screenshot-01.png delete mode 100644 script.service.hyperion/resources/settings.xml delete mode 100644 script.service.hyperion/service.py delete mode 100644 script.wikipedia/LICENSE.txt delete mode 100644 script.wikipedia/README.md delete mode 100644 script.wikipedia/addon.xml delete mode 100644 script.wikipedia/fanart.jpg delete mode 100644 script.wikipedia/icon.png delete mode 100644 script.wikipedia/resources/language/resource.language.en_gb/strings.po delete mode 100644 script.wikipedia/resources/lib/api.py delete mode 100644 script.wikipedia/resources/lib/script.py delete mode 100644 script.wikipedia/resources/script.py delete mode 100644 script.wikipedia/resources/skins/default/1080i/script-wikipedia.xml delete mode 100644 service.languagepreferencemanager/LICENSE.txt delete mode 100644 service.languagepreferencemanager/README.md delete mode 100644 service.languagepreferencemanager/addon.xml delete mode 100644 service.languagepreferencemanager/changelog.txt delete mode 100644 service.languagepreferencemanager/default.py delete mode 100644 service.languagepreferencemanager/resources/fanart.jpg delete mode 100644 service.languagepreferencemanager/resources/icon.png delete mode 100644 service.languagepreferencemanager/resources/language/resource.language.en_gb/strings.po delete mode 100644 service.languagepreferencemanager/resources/lib/langcodes.py delete mode 100644 service.languagepreferencemanager/resources/lib/prefparser.py delete mode 100644 service.languagepreferencemanager/resources/lib/prefsettings.py delete mode 100644 service.languagepreferencemanager/resources/lib/prefutils.py delete mode 100644 service.languagepreferencemanager/resources/settings.xml delete mode 100644 service.watchedlist/LICENSE.txt delete mode 100644 service.watchedlist/addon.xml delete mode 100644 service.watchedlist/changelog.txt delete mode 100644 service.watchedlist/default.py delete mode 100644 service.watchedlist/fanart.jpg delete mode 100644 service.watchedlist/icon.png delete mode 100644 service.watchedlist/lib/watchedlist/api.py delete mode 100644 service.watchedlist/lib/watchedlist/utils.py delete mode 100644 service.watchedlist/lib/watchedlist/watchedlist.py delete mode 100644 service.watchedlist/manual.py delete mode 100644 service.watchedlist/resources/language/resource.language.de_de/strings.po delete mode 100644 service.watchedlist/resources/language/resource.language.en_gb/strings.po delete mode 100644 service.watchedlist/resources/language/resource.language.he_il/strings.po delete mode 100644 service.watchedlist/resources/settings.xml diff --git a/screensaver.picture.slideshow/addon.xml b/screensaver.picture.slideshow/addon.xml deleted file mode 100644 index ec2aa2293..000000000 --- a/screensaver.picture.slideshow/addon.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - Sluimerskerm wat prente vertoon as skyfievertoning - መመልከቻ ማዳኛ የ ምስል ተንሸራታች ማሳያ - شاشة التوقف هي التي تعرض صورة تلقائيا - Ахоўнік экрану што робіць паказ слайдаў - Скрийнсейвър, изобразяващ презентация от картини - Estalvi de pantalla que mostra una presentació de diapositives d'imatges - Spořič obrazovky promítající obrázky - Arbedwr sgrin sy'n dangos sioe o ddelweddau - Pauseskærm som afspiller et diasshow - Bildschirmschoner, der eine Bilder-Diashow anzeigt - Μία προφύλαξη οθόνης παρουσίασης διαφανειών - Screensaver that displays an image slideshow - Screensaver that displays an image slideshow - Screensaver that displays an image slideshow - Un salvapantallas que muestra una presentación de imágenes - Un protector de pantalla que muestra una presentación de imágenes - Protector de pantalla que muestra una presentación de imágenes - Ekraanisäästja, mis näitab piltide slaidiesitlust - Näytönsäästäjä, joka toistaa kuvia diaesityksenä - Économiseur d'écran affichant un diaporama - Économiseur d'écran affichant un diaporama - O gardapantallas que amosa unha presentación de imaxes - שומר מסך אשר יציג מצגת של תמונות - सक्रीनसेवर जो चित्रो के स्लीडेशो को प्रदर्शन करता है - Čuvar zaslona koji prikazuje slikovnu prezentaciju - Képernyővédő ami diavetítést csinál - Skjáhvíla sem sýnir skyggnusýningu mynda - Salvaschermo che mostra una presentazione di immagini - 画像をスライドショー表示するスクリーンセーバー - 이미지 슬라이드쇼를 보여주는 화면 보호기 - Ekrano užsklanda, kuri rodo skaidrių peržiūrą - Ekrānsaudzētājs, kas rāda attēlu slīdīti - Заштита на екран што покажува слајдшоу од слики - Penyelamat skrin yang memaparkan paparan slaid imej - Screensaver သည်ပုံများကို slideshow အဖြစ်ပြသပေးသည်။ - Schermbeveiliging die een diavoorstelling toont - Skjermbeskytter med lysbildefremvisning - Wygaszacz ekranu wyświetlający pokaz slajdów - Protecção de ecrã que mostra uma apresentação de slides - Proteção de tela que mostra uma apresentação de fotografias - Protector ecran care afișează o diaporamă de imagini - Заставка, показывающая слайд-шоу из изображений - Šetrič obrazovky zobrazujúci prezentáciu obrázkov - Ohranjevalnik zaslona, ki prikazuje diaprojekcijo slik - Ruajtës ekrani, që paraqet një shfaqje në seri ‘slideshow’ të imazheve - En skärmsläckare som visar ett bildspel - படகாட்சி திரைகாப்பன் - Resim slayt şovu gösteren ekran koruyucu - Заставка що відображує слайдшоу із зображень. - Trình bảo vệ màn hình giống như một trình chiếu ảnh - 幻灯片屏幕保护程序 - 顯示圖片幻燈秀的螢幕保護程式 - Die Skyfievertoning sluimerskerm wys jou 'n skyfie vertoning met verskeie oorgang effekte. Dit kan gestel word om jou biblioteek se musiek of video aanhangerkuns, of 'n persoonlike lêer met prente te vertoon. - የ ተንሸራታች ማሳያ መመልከቻ ማዳኛ የተለያዩ ተንሸራታች ማሳያ ምስሎች በ ተለያዩ መሸጋገሪያ ውጤቶችን በመጠቀም ያሳይዎታል፡ ማዋቀር ይችላሉ የ ሙዚቃ መጻህፍት ቤት ወይንም የ ቪዲዮ ወይንም የምስሎች ፎልደር እንዲያሳይ - شاشة توقف العرض التلقائي ستظهر لك عرض تدريجي للصور باستخدام تأثيرات تحول مختلفة. ممكن أن تكون كونت لتعرض مكتبة الموسيقى أو الفيديو الخاصة بك, أو مجلد مخصص من الصور. - Слайдавы ахоўнік экрану будзе паказваць выявы з дапамогай разнастайных пераходных эфектаў. Можна сканфігураваць для паказу вашых бібліятэк музыкі ці відэа, альбо пэўных каталогаў з выявамі - Скрийнсейвърът „Презентация“ изобразява презентация от картини с разнообразни ефекти при прехода между отделните картини. Можете да зададете като източник на картини фен-арт изображенията от видео/музикалната библиотеката или персонална папка с изображения. - El protector de pantalles Projecció mostrarà una projecció de diapositives utilitzant diferents efectes de transició. Es pot configurar per mostrar el fanart de les vostres biblioteques de música o un directori d'imatges personalitzat - Spořič obrazovky promítání vám bude promítat zvolené obrázky s použitím různých přechodových efektů. Může být nastaven k zobrazování fanart z vašich hudebních, či video knihoven, nebo vlastní složky obrázků. - Bydd yr arbedwr sgrin Slideshow yn dangos sioe o ddelweddau dan ddefnyddio amryw o effeithiau trawsnewidiol.Mae modd ei ffurfweddu i ddangos celf eich cerddoriaeth neu fideo neu ffolder cyfaddas o ddelweddau. - Diasshow-pauseskærmen vil vise et diasshow af billeder ved hjælp af forskellige overgangseffekter. Den kan konfigureres til at vise fankunst fra dit biblioteks musik eller videoer, eller billeder fra en selvvalgt mappe. - Der Slideshow-Bildschirmschoner zeigt eine Bilder-Slideshow mit verschiedenen Übergangseffekten. Er kann so konfiguriert werden, dass Musik oder Video Fanarts aus der Bibliothek, oder Bilder eines bestimmten Ordners angezeigt werden. - Η προφύλαξη οθόνης Slideshow θα εμφανίσει μία σειρά εικόνων χρησιμοποιώντας ένα πλήθος εφέ μετάβασης. Μπορεί να ρυθμιστεί ούτως ώστε να εμφανίζει τις εικόνες fanart της μουσικής ή βίντεο συλλογής σας, ή έναν προσωπικό φάκελο εικόνων - The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images - The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images - The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images - El salvapantallas Slideshow mostrará una presentación de imágenes usando varios efectos de transición. Puede ser configurado para mostrar los fanart de tus bibliotecas de música o video, o las imágenes de una carpeta. - El protector de pantalla Slideshow mostrará una presentación de imágenes usando varios efectos de transición. Puede ser configurado para mostrar los fanart de tus bibliotecas de música o video, o las imágenes de una carpeta. - El protector de pantalla Presentación de Imágenes te mostrará una presentación de imágenes usando varios efectos de transición. Puede ser configurado para mostrar tus librerías de fanart de música o video, o una carpeta de imágenes personalizada. - Slaidiesitluse ekraanisäästja näitab sulle slaidiesitlust kasutades erinevaid üleminekuefekte. Slaidiesitlust on võimalik koostada nii muusika või videote fännipiltidest kui ka kasutades selleks spetsiaalset määratud piltide kausta. - Slideshow-näytönsäästäjä näyttää diaesityksen käyttäen erilaisia siirtymätehosteita. Sen voi asettaa näyttämään musiikki- tai videokirjastojen fanitaidetta tai kuvia valitusta kuvakansiosta. - L'économiseur Diaporama affiche un album photo en utilisant divers effets de transition. Il peut afficher la collection de fanarts vidéos ou musicaux, ou un dossier personnalisé d'images. - L'économiseur d'écran diaporama vous montrera un diaporama d'images avec différents effets de transition. Il peut être configuré pour afficher votre audiothèque, les fanarts de vos vidéos ou un dossier personnalisé d'images. - O gardapantallas Slideshow amosará unha presentación de imaxes empregando varios efectos de transición. Pode ser configurado para amosar os carteis das túas biblotecas de video ou música ou imaxes dun cartafol personalizado. - השומר מסך יציג לך מצגת של תמונות אשר עושה שימוש במעברים שונים. יש אפשרות להגדיר את תמונות הפאנארט של ספריות המוזיקה והוידאו, או תיקיית תמונות אישית - Čuvar zaslona slikovne prezentacije prikazuje slikovnu prezentaciju uz razne prijelazne efekte. Može se podesiti da prikazuje Vašu bazu glazbenih ili video slika omota, ili odabranu mapu sa slikama - A Slideshow képernyővédő diavetítés-szerűen képeket mutat egymás után különböző váltási effektussal. Beállítható úgy hogy a médiatárból mutasson zenei-, vagy film fanartképeket, vagy egy egyedi mappából mutassa azokat. - Þessi skjáhvíla sýnir þér skyggnusýningu af myndum með ýmsum myndbrellum. Það er hægt að stilla hana til að sýna Fanart myndir úr tónlistar eða myndbandasöfnum, eða frá sérsniðinni möppu með myndum. - Il salvaschermo Slideshow mostra una presentazione di immagini usando diversi effetti di transizione. Può essere configurato per mostrare le fanart delle librerie musica o video, oppure una cartella di immagini specifica - The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images - 슬라이드쇼 화면 보호기는 다양한 화면 전환효과를 이용해 이미지 슬라이드쇼를 보여줍니다. 음악 라이브러리, 비디오 팬아트, 사용자 폴더의 사진을 볼 수 있게 설정할 수 있습니다. - Skaidrių peržiūros ekrano užsklanda atvaizduoja skaidrių peržiūros vaizdus, naudojant įvairius perėjimo efektus. Jis konfigūruojamas, kad rodyti jūsų bibliotekos muzikos ar vaizdo FanArt arba pasirinktinį paveikslėlių aplanką - Slīdītes ekrānsaudzētājs parādīs slīdīti ar attēliem, izmantojot dažādus pārejas efektus. To var konfigurēt, lai rāda fanumākslu no mūzikas vai video bibliotekām, vai arī no pielāgotas attēlu mapes - Слајдшоу заштитата на екран ќе покаже слајд шоу на слики користејќи ефекти на транзиција. Може да биде конфигурирано да покажува и плакат од вашата музика или филмови или ваша папка со слики - Penyelamat skrin paparan slaid akan paparkan paparan slaid imej menggunakan pelabgai kesan peralihan. Ia boleh dikonfigur untuk tunjukkan pustaka muzik atau seni peminat anda, atau folder imej suai - De Diavoorstellingsschermbeveiliging zal u een diavoorstelling tonen met verschillende overgangseffecten. U kan muziek- of videofanart uit uw bibliotheek tonen of zelf een map opgeven die afbeeldingen bevat. - Denne skjermbeskytteren viser bilder med forskjellige overgangseffekter. Den kan konfigureres til å vise fanart fra musikk- eller videobiblioteket ditt, eller en mappe med bilder. - Ten wygaszacz ekranu to pokaz slajdów obrazów, przy użyciu różnych efektów przejść. Może być skonfigurowany tak, aby pokazywał fototapety filmów, muzyki lub obrazy z niestandardowego folderu. - O protector de ecrã de slides irá mostrar-lhe imagens usando vários efeitos de transição. Pode ser configurada para mostrar as imagens de Fanart da sua biblioteca de música ou de vídeo, e também pode mostrar as imagens de uma pasta à sua escolha. - O screensaver Slideshow irá mostrar-lhe uma apresentação de slides de suas fotografias usando diferentes efeitos de transição. Ele pode ser configurado para visualizar fanarts de sua biblioteca de músicas ou de vídeo, ou ainda utilizar uma pasta personalizada que contenha imagens - Protector ecran de tip diaporamă care va afișa imagini folosind diferite efecte de tranziție. Poate fi configurat să afișeze imagini creații artistice din mediateca audio sau video sau dintr-un dosar personalizat. - Эта заставка показывается слайд-шоу из изображений, используя различные эффекты переходов. Заставку можно настроить для показ фанарта для музыки и видео из вашей библиотеки мультимедиа или изображениям из заданной папки. - Tento šetrič vám ukáže prezentáciu obrázkov za použitia rôznych efektov prechodov. Môže byť nastavený na zobrazovanie vašej knižnice hudby alebo video fanartov, alebo vlastného priečinku s obrázkami. - Predvajalnik slik prikaže diaprojekcijo slik z uporabo različnih učinkov prehoda. To je mogoče nastaviti tako, da se prikažejo ozadja knjižnice glasbe ali videa alislike iz izbrane mape. - Ruajtësi i ekranit ‘Slideshow’ do t'ju paraqesë një shfaqje në seri të imazheve, duke përdorur efekte të ndryshme tranzicioni. Mund të konfigurohet që të shfaqë sfonde të koleksiont të muzikës apo vidjove tuaja, ose imazhe prej një dosjeje të caktuar - Bildspel är en skärmsläckare som visar ett bildspel med olika övergångseffekter. Den kan ställas in för att visa din musik- eller video-fanart från biblioteket eller en utvald mapp med bilder. - படகாட்சி திரைகாப்பன் பல்வேறு படங்களை பல மாற்ற விளைவுகளை பயன்படுத்தி படகாட்சி செய்யும். இது உங்கள் நூலகங்கள் இசை அல்லது வீடியோ விசிறிபடம் அல்லது படக்கொப்புரை படங்களை காட்சியில் காண்பிக்குமாறு செய்யமுடியும். - Slideshow ekran koruyucu size farklı geçiş efektleriyle resim gösterisi yapar. Müzik kütüphanenizden veya video fanart yada özel bir klasördeki resimlerden seçilebilir. - Заставка Слайдшоу показує зображення по черзі, використовуючи різноманітні ефекти переходу. Заставка може бути налаштована на показ зображень з різних джерел: обкладинок відео фільмів, обкладинок музичних альбомів або будь-яких фото із вказаної користувачем папки. - Trình bảo vệ màn hình Slideshow sẽ giúp bạn trình chiếu bộ sưu tập ảnh với các hiệu ứng chuyển đổi đẹp mắt. Bạn có thể tuỳ chỉnh để hiện thông tin về bài hát, video, fanart hoặc một thư mục chứa ảnh bất kì - 幻灯片屏保将使用各种过渡效果以幻灯片形式显示您的图片。你可以设置它显示音乐或视频资料库同人画,或某个文件夹中的图片。 - 幻燈片屏幕保護程序可以顯示使用各種過場效果的幻燈片播放。它可以被配置為顯示您的圖書館音樂模式或視頻圖庫,或自行定義的文件夾中的圖像。 - all - GPL-2.0-only - https://forum.kodi.tv/showthread.php?tid=154032 - https://gitlab.com/ronie/screensaver.picture.slideshow - - resources/icon.png - resources/fanart.jpg - - - add support for image types provided by imagedecoder addons - - diff --git a/screensaver.picture.slideshow/changelog.txt b/screensaver.picture.slideshow/changelog.txt deleted file mode 100644 index 21c1b5a71..000000000 --- a/screensaver.picture.slideshow/changelog.txt +++ /dev/null @@ -1,286 +0,0 @@ -v7.0.3 -- bump for release - -v7.0.2 -- fix encoding - -v7.0.1 -- add support for image types provided by imagedecoder addons - -v7.0.0 -- update for kodi nexus - -v6.4.2 -- revert some changes due to python/json problem with windows paths -- make recursive slideshow optional - -v6.4.1 -- fix crash when video files are present - -v6.4.0 -- add basic support for picture addons - -v6.3.6 -- add vignette option - -v6.3.5 -- added an option to display full image path - -v6.3.4 -- don't require shares to be writable - -v6.3.3 -- update for kodi 20 - -v6.3.2 -- improve xbmcvfs file read handling - -v6.3.1 -- use official python libraries - -v6.3.0 -- use art table to retrieve fanart -- use json to read and write cache - -v6.2.0 -- convert skin to 1080p -- add support for more picture extensions - -v6.1.0 -- update exif, iptc and xmp data parsers -- fix: display background setting was not selectable -- fix: slideshow with no effect was broken - -v6.0.2 -- cleanup - -v6.0.1 -- bump - -v6.0.0 -- changes for python 3 - -v5.0.9 -- fix splash image kept spinning in the background, eating up cpu - -v5.0.8 -- re-add option to disable animations - -v5.0.4 -- add option to disable animations - -v5.0.3 -- move repo to gitlab - -v5.0.2 --cosmetics -- skin tweaks - -v5.0.1 -- add black background - -v4.2.3 -- don't crash when failing to retrieve skinpath - -v4.2.2 -- extra logging - -v4.2.1 -- cosmetics - -v4.2.0 -- add resume from last position option - -v4.1.4 -- better handling when picture folder is empty - -v4.1.3 -- use image instead of largeimage controls - -v4.1.2 -- don't create empty cache file -- delete empty cache files - -v4.1.1 -- don't crash when advancedsettings.xml is corrupt - -v4.1.0 -- option to exclude dirs/files using pictureexcludes in advancedsettings.xml - -v4.0.1 -- fix cache creation when an empty cache file is present. - -v4.0.0 -- remove simplejson support - -v3.0.3 -- language update -- cosmetics - -v3.0.2 -- fix randomizing the list - -v3.0.1 -- fix index creation during update - -v3.0.0 -- bump for jarvis -- always use image index -- remove option to create an index - -v2.1.9 -- auto placement of exif info labels - -v2.1.8 -- fix background creation of image index - -v2.1.7 -- move music info to bottom - -v2.1.6 -- cosmetics - -v2.1.5 -- use different method to find the addon.xml of the skin - -v2.1.4 -- fix missing settings string -- fix crash on update due to incompatible settings - -v2.1.3 -- language update - -v2.1.2 -- make background image optional - -v2.1.1 -- add background image to reduce black borders - -v2.1.0 -- add update thread - -v2.0.11 -- add option to show both folder- and filename - -v2.0.10 -- updated language files from Transifex - -v2.0.9 -- deprecate xbmc.abortRequested - -v2.0.8 -- add missing images - -v2.0.7 -- fix recursive scan (paths must end with a slash) - -v2.0.6 -- fix update index button - -v2.0.5 -- fix crash on exit - -v2.0.4 -- apply dim value to the whole screen - -v2.0.3 -- more screen space for image filename -- disable caching of images - -v2.0.2 -- change name to screensaver.picture.slideshow - -v2.0.1 -- deprecate previous version - -v2.0.0 -- kodi name change - -v1.0.6 -- increase zorder - -v1.0.5 -- fixed unicode error - -v1.0.4 -- fixed: seekbar dialog would display on top of screensaver - -v1.0.3 -- update language files - -v1.0.2 -- fix album cover missing when playing music - -v1.0.1 -- add xml header - -v1.0.0 -- gotham release - -v0.1.8 -- update language files - -v0.1.7 -- use natural sort order - -v0.1.6 -- fix empty tags handling in xmp library - -v0.1.5 -- auto update cache -- only use cache with image folder source - -v0.1.4 -- fix crash when checking cached images - -v0.1.3 -- add support for xmp tags -- make music info slightly transparent (prevent burn-in) - -v0.1.2 -- added yyyy-mm-dd format - -v0.1.1 -- fix potential issues due to missing module imports - -v0.1.0 -- added option to disable the randomizing of images -- added display name for fanart -- added cache option - -v0.0.9 -- silence iptc warnings -- update code for xbmc 12.1 - -v0.0.8 -- added music info option -- localize date format -- removed iptc info labels - -v0.0.7 -- change picture tags code - -v0.0.6 -- use largeimage controls in skin -- add support for exif tags - -v0.0.5 -- added dependencies to addon.xml - -v0.0.4 -- fixed: previous image would briefly show when switching from the current to the next -- fixed: adjust animation speeds according to the effectslowdown value of the skin -- fixed: pre-load images -- changed: allow images to be displayed up to 60 seonds -- added: option to scale the image fullscreen -- added: option to display the image name -- added: splash screen during startup - -v0.0.3 -- added: multipath support - -v0.0.2 -- added: fanart image - -v0.0.1 -- initial release diff --git a/screensaver.picture.slideshow/default.py b/screensaver.picture.slideshow/default.py deleted file mode 100644 index 372c33898..000000000 --- a/screensaver.picture.slideshow/default.py +++ /dev/null @@ -1,15 +0,0 @@ -import xbmcaddon - -ADDON = xbmcaddon.Addon() -CWD = ADDON.getAddonInfo('path') -ADDONVERSION = ADDON.getAddonInfo('version') - -from lib.utils import * - -if __name__ == '__main__': - log('script version %s started' % ADDONVERSION) - from lib import gui - screensaver_gui = gui.Screensaver('script-python-slideshow.xml', CWD, 'default') - screensaver_gui.doModal() - del screensaver_gui -log('script stopped') diff --git a/screensaver.picture.slideshow/lib/gui.py b/screensaver.picture.slideshow/lib/gui.py deleted file mode 100644 index e1f3f0ee1..000000000 --- a/screensaver.picture.slideshow/lib/gui.py +++ /dev/null @@ -1,516 +0,0 @@ -# * This Program is free software; you can redistribute it and/or modify -# * it under the terms of the GNU General Public License as published by -# * the Free Software Foundation; either version 2, or (at your option) -# * any later version. -# * -# * This Program is distributed in the hope that it will be useful, -# * but WITHOUT ANY WARRANTY; without even the implied warranty of -# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# * GNU General Public License for more details. -# * -# * You should have received a copy of the GNU General Public License -# * along with Kodi; see the file COPYING. If not, write to -# * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -# * http://www.gnu.org/copyleft/gpl.html - -import copy -import random -import threading -from xml.dom.minidom import parse -import exifread -from iptcinfo3 import IPTCInfo -import xbmcgui -from lib.utils import * - -ADDON = xbmcaddon.Addon() -SKINDIR = xbmc.getSkinDir() - -# images types that can contain exif/iptc data -EXIF_TYPES = ('.jpg', '.jpeg', '.tif', '.tiff') - -# random effect list to choose from -EFFECTLIST = ["('conditional', 'effect=zoom start=100 end=400 center=auto time=%i condition=true'),", - "('conditional', 'effect=slide start=1920,0 end=-1920,0 time=%i condition=true'), ('conditional', 'effect=zoom start=%i end=%i center=auto time=%i condition=true')", - "('conditional', 'effect=slide start=-1920,0 end=1920,0 time=%i condition=true'), ('conditional', 'effect=zoom start=%i end=%i center=auto time=%i condition=true')", - "('conditional', 'effect=slide start=0,1080 end=0,-1080 time=%i condition=true'), ('conditional', 'effect=zoom start=%i end=%i center=auto time=%i condition=true')", - "('conditional', 'effect=slide start=0,-1080 end=0,1080 time=%i condition=true'), ('conditional', 'effect=zoom start=%i end=%i center=auto time=%i condition=true')", - "('conditional', 'effect=slide start=1920,1080 end=-1920,-1080 time=%i condition=true'), ('conditional', 'effect=zoom start=%i end=%i center=auto time=%i condition=true')", - "('conditional', 'effect=slide start=-1920,1080 end=1920,-1080 time=%i condition=true'), ('conditional', 'effect=zoom start=%i end=%i center=auto time=%i condition=true')", - "('conditional', 'effect=slide start=1920,-1080 end=-1920,1080 time=%i condition=true'), ('conditional', 'effect=zoom start=%i end=%i center=auto time=%i condition=true')", - "('conditional', 'effect=slide start=-1920,-1080 end=1920,1080 time=%i condition=true'), ('conditional', 'effect=zoom start=%i end=%i center=auto time=%i condition=true')"] - -# get local dateformat to localize the exif date tag -DATEFORMAT = xbmc.getRegion('dateshort') - - -class BinaryFile(xbmcvfs.File): - def read(self, numBytes: int = 0) -> bytes: - if not numBytes: - return b"" - return bytes(self.readBytes(numBytes)) - - -class Screensaver(xbmcgui.WindowXMLDialog): - def __init__( self, *args, **kwargs ): - pass - - def onInit(self): - # load vars - self._get_vars() - # get addon settings - self._get_settings() - # get the effectslowdown value from the current skin - effectslowdown = self._get_animspeed() - # use default if we couldn't find the effectslowdown value - if not effectslowdown: - effectslowdown = 1 - # calculate the animation time - speedup = 1 / float(effectslowdown) - self.adj_time = int(101000 * speedup) - # get the images - self._get_items() - if self.slideshow_type == 2 and not self.slideshow_random and self.slideshow_resume: - self._get_offset() - if self.items: - # hide startup splash - self._set_prop('Splash', 'hide') - # start slideshow - self._start_show(copy.deepcopy(self.items)) - - def _get_vars(self): - # get the screensaver window id - self.winid = xbmcgui.Window(xbmcgui.getCurrentWindowDialogId()) - # init the monitor class to catch onscreensaverdeactivated calls - self.Monitor = MyMonitor(action = self._exit) - self.stop = False - self.startup = True - self.offset = 0 - - def _get_settings(self): - # read addon settings - self.slideshow_type = ADDON.getSettingInt('type') - self.slideshow_path = ADDON.getSettingString('path') - self.slideshow_effect = ADDON.getSettingInt('effect') - # labelenum is broken, we use enum and get the index (index 0 = 2 secs) - self.slideshow_time = ADDON.getSettingInt('time') + 2 - # convert float to hex value usable by the skin - self.slideshow_dim = hex(int('%.0f' % (float(100 - ADDON.getSettingInt('level')) * 2.55)))[2:] + 'ffffff' - self.slideshow_overlay = ADDON.getSettingBool('overlay') - self.slideshow_recursive = ADDON.getSettingBool('recursive') - self.slideshow_random = ADDON.getSettingBool('random') - self.slideshow_resume = ADDON.getSettingBool('resume') - self.slideshow_scale = ADDON.getSettingBool('scale') - self.slideshow_name = ADDON.getSettingInt('label') - self.slideshow_date = ADDON.getSettingBool('date') - self.slideshow_iptc = ADDON.getSettingBool('iptc') - self.slideshow_music = ADDON.getSettingBool('music') - self.slideshow_bg = ADDON.getSettingBool('background') - # select which image controls from the xml we are going to use - if self.slideshow_scale: - self.image1 = self.getControl(3) - self.image2 = self.getControl(4) - self.getControl(1).setVisible(False) - self.getControl(2).setVisible(False) - self.getControl(5).setVisible(False) - self.getControl(6).setVisible(False) - else: - self.image1 = self.getControl(1) - self.image2 = self.getControl(2) - self.getControl(3).setVisible(False) - self.getControl(4).setVisible(False) - if self.slideshow_bg: - self.image3 = self.getControl(5) - self.image4 = self.getControl(6) - if self.slideshow_name == 0: - self.getControl(99).setVisible(False) - else: - self.namelabel = self.getControl(99) - self.datelabel = self.getControl(100) - self.textbox = self.getControl(101) - # set the dim property - self._set_prop('Dim', self.slideshow_dim) - # show vignette overlay during slideshow if enabled - if self.slideshow_overlay: - self._set_prop('Overlay', 'show') - # show music info during slideshow if enabled - if self.slideshow_music: - self._set_prop('Music', 'show') - # show background if enabled - if self.slideshow_bg: - self._set_prop('Background', 'show') - - def _start_show(self, items): - # we need to start the update thread after the deep copy of self.items finishes - thread = img_update(data=self._get_items) - thread.start() - # start with image 1 - cur_img = self.image1 - order = [1,2] - # loop until onScreensaverDeactivated is called - while (not self.Monitor.abortRequested()) and (not self.stop): - # keep track of image position, needed to save the offset - self.position = self.offset - # iterate through all the images - for img in items[self.offset:]: - # cache file may be outdated - if self.slideshow_type == 2 and not xbmcvfs.exists(img[0]): - continue - # add image to gui - useCache = False - if img[0].startswith('http'): # do not redownload images from online sources each time - useCache = True - cur_img.setImage(img[0],useCache) - # add background image to gui - if (not self.slideshow_scale) and self.slideshow_bg: - if order[0] == 1: - self.image3.setImage(img[0],useCache) - else: - self.image4.setImage(img[0],useCache) - # give xbmc some time to load the image - if not self.startup: - xbmc.sleep(1000) - else: - self.startup = False - # get exif and iptc tags if enabled in settings and we have an image that can contain this data - datetime = '' - title = '' - description = '' - keywords = '' - exif = False - iptc_ti = False - iptc_de = False - iptc_ke = False - if self.slideshow_type == 2 and (self.slideshow_date or self.slideshow_iptc) and (os.path.splitext(img[0])[1].lower() in EXIF_TYPES): - # get exif date - if self.slideshow_date: - exiffile = BinaryFile(img[0]) - try: - exiftags = exifread.process_file(exiffile, details=False, stop_tag='DateTimeOriginal') - if 'EXIF DateTimeOriginal' in exiftags: - datetime = exiftags['EXIF DateTimeOriginal'].values - # sometimes exif date returns useless data, probably no date set on camera - if datetime == '0000:00:00 00:00:00': - datetime = '' - else: - try: - # localize the date format - date = datetime[:10].split(':') - time = datetime[10:] - if DATEFORMAT[1] == 'm': - datetime = date[1] + '-' + date[2] + '-' + date[0] + ' ' + time - elif DATEFORMAT[1] == 'd': - datetime = date[2] + '-' + date[1] + '-' + date[0] + ' ' + time - else: - datetime = date[0] + '-' + date[1] + '-' + date[2] + ' ' + time - except: - pass - exif = True - except: - pass - exiffile.close() - # get iptc title, description and keywords - if self.slideshow_iptc: - iptcfile = BinaryFile(img[0]) - try: - iptc = IPTCInfo(iptcfile) - if iptc['object name']: - title = bytes(iptc['object name']).decode('utf-8') - iptc_ti = True - if iptc['caption/abstract']: - description = bytes(iptc['caption/abstract']).decode('utf-8') - iptc_de = True - if iptc['keywords']: - tags = [] - for tag in iptc['keywords']: - tags.append(bytes(tag).decode('utf-8')) - keywords = ', '.join(tags) - iptc_ke = True - except: - pass - iptcfile.close() - # get xmp title, description and subject - if (not iptc_ti or not iptc_de or not iptc_ke): - try: - xmpfile = xbmcvfs.File(img[0]) - data = xmpfile.readBytes().decode('cp437') - xmpdata = re.search(r'(.*?)(.*?)<', xmpdata.group(1), flags=re.DOTALL) - if titlematch and not iptc_ti: - title = titlematch.group(1).encode('cp437').decode('utf-8') - iptc_ti = True - descmatch = re.search(r'(.*?)<', xmpdata.group(1), flags=re.DOTALL) - if descmatch and not iptc_de: - description = descmatch.group(1).encode('cp437').decode('utf-8') - iptc_de = True - subjmatch = re.search(r'(.*?)', '').replace('', '') - iptc_ke = True - except: - pass - xmpfile.close() - # display exif date if we have one - if exif: - self.datelabel.setLabel('[I]' + datetime + '[/I]') - self.datelabel.setVisible(True) - else: - self.datelabel.setVisible(False) - # display iptc data if we have any - if iptc_ti or iptc_de or iptc_ke: - self.textbox.setText('[CR]'.join([title, keywords] if title == description else [title, description, keywords])) - self.textbox.setVisible(True) - else: - self.textbox.setVisible(False) - # get the file or foldername if enabled in settings - if self.slideshow_name != 0: - if self.slideshow_name == 1: # filename - if self.slideshow_type == 2: - if self.slideshow_path.startswith('plugin://'): - NAME, EXT = os.path.splitext(os.path.basename(img[1])) - else: - NAME, EXT = os.path.splitext(os.path.basename(img[0])) - else: - NAME = img[1] - elif self.slideshow_name == 2: # directory name - if self.slideshow_path.startswith('plugin://'): - NAME, EXT = os.path.splitext(os.path.basename(img[1])) # only filename is available - else: - ROOT, NAME = os.path.split(os.path.dirname(img[0])) - elif self.slideshow_name == 3: # directory name / filename - if self.slideshow_type == 2: - if self.slideshow_path.startswith('plugin://'): - NAME, EXT = os.path.splitext(os.path.basename(img[1])) # only filename is available - else: - ROOT, FOLDER = os.path.split(os.path.dirname(img[0])) - FILE, EXT = os.path.splitext(os.path.basename(img[0])) - NAME = FOLDER + ' / ' + FILE - else: - ROOT, FOLDER = os.path.split(os.path.dirname(img[0])) - NAME = FOLDER + ' / ' + img[1] - elif self.slideshow_name == 4: # full path - if self.slideshow_path.startswith('plugin://'): - NAME, EXT = os.path.splitext(os.path.basename(img[1])) # only filename is available - else: - NAME = os.path.realpath(img[0]) - self.namelabel.setLabel(NAME) - # set animations - if self.slideshow_effect == 0: - # add slide anim - self._set_prop('Slide%d' % order[0], '0') - self._set_prop('Slide%d' % order[1], '1') - elif self.slideshow_effect == 1 or self.slideshow_effect == 2: - # add random slide/zoom anim - if self.slideshow_effect == 2: - # add random slide/zoom anim - self._anim(cur_img) - # add fade anim, used for both fade and slide/zoom anim - self._set_prop('Fade%d' % order[0], '0') - self._set_prop('Fade%d' % order[1], '1') - elif self.slideshow_effect == 3: - # we need to hide the images when no effect is selected, add fade effect with time=0 - self._set_prop('NoEffectFade%d' % order[0], '0') - self._set_prop('NoEffectFade%d' % order[1], '1') - # add fade anim to background images - if self.slideshow_bg and self.slideshow_effect != 3: - self._set_prop('Fade1%d' % order[0], '0') - self._set_prop('Fade1%d' % order[1], '1') - # define next image - if cur_img == self.image1: - cur_img = self.image2 - order = [2,1] - else: - cur_img = self.image1 - order = [1,2] - # slideshow time in secs (we already slept for 1 second) - count = self.slideshow_time - 1 - # display the image for the specified amount of time - while (not self.Monitor.abortRequested()) and (not self.stop) and count > 0: - count -= 1 - xbmc.sleep(1000) - # break out of the for loop if onScreensaverDeactivated is called - if self.stop or self.Monitor.abortRequested(): - break - self.position += 1 - self.offset = 0 - items = copy.deepcopy(self.items) - - def _get_items(self, update=False): - self.slideshow_type = ADDON.getSettingInt('type') - log('slideshow type: %i' % self.slideshow_type) - # check if we have an image folder, else fallback to video fanart - if self.slideshow_type == 2: - hexfile = checksum(self.slideshow_path.encode('utf-8')) + '_' + str(self.slideshow_recursive) # check if path has changed, so we can create a new cache at startup - log('image path: %s' % self.slideshow_path) - log('update: %s' % update) - if (not xbmcvfs.exists(CACHEFILE % hexfile)) or update: # create a new cache if no cache exits or during the background scan - log('create cache') - create_cache(self.slideshow_path, hexfile) - self.items = self._read_cache(hexfile) - log('items: %s' % len(self.items)) - if not self.items: - self.slideshow_type = 0 - # delete empty cache file - if xbmcvfs.exists(CACHEFILE % hexfile): - xbmcvfs.delete(CACHEFILE % hexfile) - # video fanart - if self.slideshow_type == 0: - methods = [('VideoLibrary.GetMovies', 'movies'), ('VideoLibrary.GetTVShows', 'tvshows')] - # music fanart - elif self.slideshow_type == 1: - methods = [('AudioLibrary.GetArtists', 'artists')] - # query the db - if not self.slideshow_type == 2: - self.items = [] - for method in methods: - json_query = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "' + method[0] + '", "params": {"properties": ["art"]}, "id": 1}') - json_response = json.loads(json_query) - if 'result' in json_response and json_response['result'] != None and method[1] in json_response['result']: - for item in json_response['result'][method[1]]: - if 'fanart' in item['art']: - self.items.append([item['art']['fanart'], item['label']]) - # randomize - if self.slideshow_random: - random.seed() - random.shuffle(self.items) - - def _get_offset(self): - try: - offset = xbmcvfs.File(RESUMEFILE) - self.offset = int(offset.read()) - offset.close() - except: - self.offset = 0 - - def _save_offset(self): - if not xbmcvfs.exists(CACHEFOLDER): - xbmcvfs.mkdir(CACHEFOLDER) - try: - offset = xbmcvfs.File(RESUMEFILE, 'w') - offset.write(str(self.position)) - offset.close() - except: - log('failed to save resume point') - - def _read_cache(self, hexfile): - try: - cache = xbmcvfs.File(CACHEFILE % hexfile) - images = json.load(cache) - cache.close() - except: - images = [] - return images - - def _anim(self, cur_img): - # reset position the current image - cur_img.setPosition(0, 0) - # pick a random anim - number = random.randint(0,8) - posx = 0 - posy = 0 - # add 1 sec fadeout time to showtime - anim_time = self.slideshow_time + 1 - # set zoom level depending on the anim time - zoom = 110 + anim_time - if number == 1 or number == 5 or number == 7: - posx = int(-1920 + (19.2 * anim_time) + 0.5) - elif number == 2 or number == 6 or number == 8: - posx = int(1920 - (19.2 * anim_time) + 0.5) - if number == 3 or number == 5 or number == 6: - posy = int(-1080 + (10.8 * anim_time) + 0.5) - elif number == 4 or number == 7 or number == 8: - posy = int(1080 - (10.8 * anim_time) + 0.5) - # position the current image - cur_img.setPosition(posx, posy) - # add the animation to the current image - if number == 0: - cur_img.setAnimations(eval(EFFECTLIST[number] % (self.adj_time))) - else: - cur_img.setAnimations(eval(EFFECTLIST[number] % (self.adj_time, zoom, zoom, self.adj_time))) - - def _get_animspeed(self): - # find the skindir - json_query = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "Addons.GetAddonDetails", "params": {"addonid": "%s", "properties": ["path"]}, "id": 1}' % SKINDIR) - json_response = json.loads(json_query) - if 'result' in json_response and (json_response['result'] != None) and 'addon' in json_response['result'] and 'path' in json_response['result']['addon']: - skinpath = json_response['result']['addon']['path'] - else: - log('failed to retrieve skin path') - log(SKINDIR) - log(json_query) - return - skinxml = xbmcvfs.translatePath(os.path.join(skinpath, 'addon.xml')) - try: - # parse the skin addon.xml - self.xml = parse(skinxml) - # find all extension tags - tags = self.xml.documentElement.getElementsByTagName( 'extension' ) - for tag in tags: - # find the effectslowdown attribute - for (name, value) in tag.attributes.items(): - if name == 'effectslowdown': - anim = value - return anim - except: - log('failed to parse addon.xml') - return - - def _set_prop(self, name, value): - self.winid.setProperty('SlideView.%s' % name, value) - - def _clear_prop(self, name): - self.winid.clearProperty('SlideView.%s' % name) - - def _exit(self): - # exit when onScreensaverDeactivated gets called - self.stop = True - # clear our properties on exit - self._clear_prop('Slide1') - self._clear_prop('Slide2') - self._clear_prop('Fade1') - self._clear_prop('Fade2') - self._clear_prop('Fade11') - self._clear_prop('Fade12') - self._clear_prop('Dim') - self._clear_prop('Overlay') - self._clear_prop('Music') - self._clear_prop('Splash') - self._clear_prop('Background') - # save the current position to file - if self.slideshow_type == 2 and not self.slideshow_random and self.slideshow_resume: - self._save_offset() - self.close() - - -class img_update(threading.Thread): - def __init__( self, *args, **kwargs ): - self._get_items = kwargs['data'] - threading.Thread.__init__(self) - self.stop = False - self.Monitor = MyMonitor(action = self._exit) - - def run(self): - while (not self.Monitor.abortRequested()) and (not self.stop): - # create a fresh index as quickly as possible after slidshow started - self._get_items(True) - count = 0 - while count != 3600: # check for new images every hour - xbmc.sleep(1000) - count += 1 - if self.Monitor.abortRequested() or self.stop: - return - - def _exit(self): - # exit when onScreensaverDeactivated gets called - self.stop = True - - -class MyMonitor(xbmc.Monitor): - def __init__( self, *args, **kwargs ): - self.action = kwargs['action'] - - def onScreensaverDeactivated(self): - self.action() - - def onDPMSActivated(self): - self.action() diff --git a/screensaver.picture.slideshow/lib/utils.py b/screensaver.picture.slideshow/lib/utils.py deleted file mode 100644 index 30a84a6cb..000000000 --- a/screensaver.picture.slideshow/lib/utils.py +++ /dev/null @@ -1,145 +0,0 @@ -import hashlib -import os -import json -import re -import sys -import urllib -import xbmc -import xbmcvfs -import xbmcaddon -import xml.etree.ElementTree as etree - -ADDON = xbmcaddon.Addon() -ADDONID = ADDON.getAddonInfo('id') -LANGUAGE = ADDON.getLocalizedString - -# supported image types by the screensaver -IMAGE_TYPES = ['.jpg', '.jpeg', '.png', '.tif', '.tiff', '.gif', '.pcx', '.bmp', '.tga', '.ico', '.nef', '.webp', '.jp2', '.apng'] -HEIF_TYPES = ['.heic', '.heif'] -MPO_TYPES = ['.mpo'] -RAW_TYPES = ['.3fr', '.arw', '.cr2', '.crw', '.dcr', '.dng', '.erf', '.kdc', '.mdc', '.mef', '.mos', '.mrw', '.nef', '.nrw', '.orf', '.pef', '.ppm', '.raf', '.raw', '.rw2', '.srw', '.x3f'] -CACHEFOLDER = xbmcvfs.translatePath(ADDON.getAddonInfo('profile')) -CACHEFILE = os.path.join(CACHEFOLDER, 'cache_%s') -RESUMEFILE = os.path.join(CACHEFOLDER, 'offset') -ASFILE = xbmcvfs.translatePath('special://profile/advancedsettings.xml') - -def log(txt): - message = '%s: %s' % (ADDONID, txt) - xbmc.log(msg=message, level=xbmc.LOGDEBUG) - -def checksum(path): - return hashlib.md5(path).hexdigest() - -def create_cache(path, hexfile): - images = walk(path) - if not xbmcvfs.exists(CACHEFOLDER): - xbmcvfs.mkdir(CACHEFOLDER) - # remove old cache files - dirs, files = xbmcvfs.listdir(CACHEFOLDER) - for item in files: - if item != 'settings.xml': - xbmcvfs.delete(os.path.join(CACHEFOLDER,item)) - if images: - # create cache file - try: - cache = xbmcvfs.File(CACHEFILE % hexfile, 'w') - json.dump(images, cache) - cache.close() - except: - log('failed to save cachefile') - -def get_excludes(): - regexes = [] - if xbmcvfs.exists(ASFILE): - try: - tree = etree.parse(ASFILE) - root = tree.getroot() - excludes = root.find('pictureexcludes') - if excludes is not None: - for expr in excludes: - regexes.append(expr.text) - except: - pass - return regexes - -def walk(path): - images = [] - folders = [] - excludes = get_excludes() - # multipath support - if path.startswith('multipath://'): - # get all paths from the multipath - paths = path[12:-1].split('/') - for item in paths: - folders.append(urllib.unquote_plus(item)) - else: - folders.append(path) - for folder in folders: - if xbmcvfs.exists(xbmcvfs.translatePath(folder)): - dirs = [] - files = [] - if xbmc.getCondVisibility('System.HasAddon(imagedecoder.heif)'): - IMAGE_TYPES.extend(HEIF_TYPES) - if xbmc.getCondVisibility('System.HasAddon(imagedecoder.mpo)'): - IMAGE_TYPES.extend(MPO_TYPES) - if xbmc.getCondVisibility('System.HasAddon(imagedecoder.raw)'): - IMAGE_TYPES.extend(RAW_TYPES) - # get all files and subfolders - if folder.startswith('plugin://'): - getroot = xbmc.executeJSONRPC('{"jsonrpc":"2.0", "method":"Files.GetDirectory", "params":{"directory":"%s", "sort":{"method":"label"}}, "id":1 }' % folder) - root = json.loads(getroot) - if 'result' in root and 'files' in root["result"]: - for item in root["result"]["files"]: - if item["filetype"] == "file": - files.append(item) - elif item["filetype"] == "directory": - dirs.append(item["file"]) - else: - dirs, files = xbmcvfs.listdir(folder) - log('dirs: %s' % len(dirs)) - log('files: %s' % len(files)) - if not folder.startswith('plugin://'): - # natural sort - convert = lambda text: int(text) if text.isdigit() else text - alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] - files.sort(key=alphanum_key) - for item in files: - # check pictureexcludes from as.xml - fileskip = False - if excludes: - for string in excludes: - regex = re.compile(string) - if folder.startswith('plugin://'): - match = regex.search(item["label"]) - else: - match = regex.search(item) - if match: - fileskip = True - break - # filter out all images - if folder.startswith('plugin://'): - if os.path.splitext(item["label"])[1].lower() in IMAGE_TYPES and not fileskip: - images.append([item["file"], item["label"]]) - else: - if os.path.splitext(item)[1].lower() in IMAGE_TYPES and not fileskip: - images.append([os.path.join(folder,item), item]) - if xbmcaddon.Addon().getSettingBool('recursive'): - for item in dirs: - # check pictureexcludes from as.xml - dirskip = False - if excludes: - for string in excludes: - regex = re.compile(string) - match = regex.search(item) - if match: - dirskip = True - break - # recursively scan all subfolders - if not dirskip: - if item.startswith('plugin://'): - images += walk(item) - else: - images += walk(os.path.join(folder,item,'')) # make sure paths end with a slash - else: - log('folder does not exist') - return images diff --git a/screensaver.picture.slideshow/resources/fanart.jpg b/screensaver.picture.slideshow/resources/fanart.jpg deleted file mode 100644 index bb4461b58839959a41286c0f79427a56db5f4140..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148242 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 diff --git a/screensaver.picture.slideshow/resources/icon.png b/screensaver.picture.slideshow/resources/icon.png deleted file mode 100644 index e8715b8bc0fc09e550bd1207a13f55fe9b68c3af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112411 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\n" -"Language-Team: Amharic (Ethiopia) \n" -"Language: am_et\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "መመልከቻ ማዳኛ የ ምስል ተንሸራታች ማሳያ" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "የ ተንሸራታች ማሳያ መመልከቻ ማዳኛ የተለያዩ ተንሸራታች ማሳያ ምስሎች በ ተለያዩ መሸጋገሪያ ውጤቶችን በመጠቀም ያሳይዎታል፡ ማዋቀር ይችላሉ የ ሙዚቃ መጻህፍት ቤት ወይንም የ ቪዲዮ ወይንም የምስሎች ፎልደር እንዲያሳይ" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "የ ተንሸራታች ማሳያ ምስሎች ምንጭ" - -msgctxt "#30001" -msgid "Folder" -msgstr "ፎልደር" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "የ ቪዲዮ ደጋፊዎች ስእል" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "የ ሙዚቃ ደጋፊዎች ስእል" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "የምስል ፎልደር" - -msgctxt "#30005" -msgid "Dim level" -msgstr "የማደብዘዣ ደረጃ" - -msgctxt "#30006" -msgid "Effect" -msgstr "ውጤቱ" - -msgctxt "#30007" -msgid "Slide" -msgstr "ተንሸራታች" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "መስቀልኛ ማፍዘዥ" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "መፈለጊያ እና ማሳያ" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "እያንዳንዱ ምስል የሚታይበት ጊዜ በሰከንድ" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "በሙሉ መመልከቻ ዘዴ የ ምስሎች መመጠኛ" - -msgctxt "#30012" -msgid "Display image name" -msgstr "የ ምስሉን ስም ማሳያ" - -msgctxt "#30013" -msgid "Disabled" -msgstr "ተሰናክሏል" - -msgctxt "#30014" -msgid "Use filename" -msgstr "የ ፋይል ስም መጠቀሚያ" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "የ ፎልደር ስም መጠቀሚያ" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "ምስሎቹን በነሲብ ቅደም ተከተል ማሳያ" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "ፎልደር- እና የ ፋይል ስም ይጠቀሙ" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "የ ስእል ቀን ማሳያ" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "ተጨማሪ የ ስእል ቁራጭ ማሳያ" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "ድምፅ በሚጫወት ጊዜ የ ሙዚቃ መረጃ ማሳያ" - -msgctxt "#30024" -msgid "Basic" -msgstr "መሰረታዊ" - -msgctxt "#30025" -msgid "Additional" -msgstr "ተጨማሪ" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.ar_sa/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.ar_sa/strings.po deleted file mode 100644 index 68370d552..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.ar_sa/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Arabic (http://www.transifex.com/projects/p/xbmc-addons/language/ar/)\n" -"Language: ar\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "شاشة التوقف هي التي تعرض صورة تلقائيا" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "شاشة توقف العرض التلقائي ستظهر لك عرض تدريجي للصور باستخدام تأثيرات تحول مختلفة. ممكن أن تكون كونت لتعرض مكتبة الموسيقى أو الفيديو الخاصة بك, أو مجلد مخصص من الصور." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "مصدر صور العرض التلقائي" - -msgctxt "#30001" -msgid "Folder" -msgstr "مجلد" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "فيديوFanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "موسيقىFanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "مجلد الصور" - -msgctxt "#30005" -msgid "Dim level" -msgstr "مستوى ضعيف" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "معطلة" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "أساسي" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.az_az/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.az_az/strings.po deleted file mode 100644 index b31e9d5eb..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.az_az/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: Kodi add-ons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: az_az\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.be_by/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.be_by/strings.po deleted file mode 100644 index f8df455d0..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.be_by/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-07-22 14:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Belarusian \n" -"Language: be_by\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Ахоўнік экрану што робіць паказ слайдаў" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Слайдавы ахоўнік экрану будзе паказваць выявы з дапамогай разнастайных пераходных эфектаў. Можна сканфігураваць для паказу вашых бібліятэк музыкі ці відэа, альбо пэўных каталогаў з выявамі" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Крыніца выяў для слаўдаў" - -msgctxt "#30001" -msgid "Folder" -msgstr "Тэчка" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Відэа Фанарт" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Музычны Фанарт" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Каталог Выяў" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Узровень Dim" - -msgctxt "#30006" -msgid "Effect" -msgstr "Эфект" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Перакрыццё" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Колькасць секунд на кожную выяву" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Расцягнуць выявы на ўвесь экран" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Паказваць імя выявы" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Забаронена" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Ужыць імя файла" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Ужыць імя тэчкі" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Паказваць выявы ў выпадковым парадку" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Паказваць дату выявы" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Паказваць дадатковыя тэгі выявы" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Паказваць звесткі музыкі падчас прайгравання" - -msgctxt "#30024" -msgid "Basic" -msgstr "Асноўны" - -msgctxt "#30025" -msgid "Additional" -msgstr "Дадатковы" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.bg_bg/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.bg_bg/strings.po deleted file mode 100644 index ed4d2551c..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.bg_bg/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Bulgarian (http://www.transifex.com/projects/p/xbmc-addons/language/bg/)\n" -"Language: bg\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Скрийнсейвър, изобразяващ презентация от картини" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Скрийнсейвърът „Презентация“ изобразява презентация от картини с разнообразни ефекти при прехода между отделните картини. Можете да зададете като източник на картини фен-арт изображенията от видео/музикалната библиотеката или персонална папка с изображения." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Източник на изображения" - -msgctxt "#30001" -msgid "Folder" -msgstr "Папка" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Фен-арт на видео файловете" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Фен-арт на аудио файловете" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Папка с изображения" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Степен на затъмняване" - -msgctxt "#30006" -msgid "Effect" -msgstr "Ефект" - -msgctxt "#30007" -msgid "Slide" -msgstr "Плъзгане" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Плавен преход" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Изобразяване всяко изображение за (Х сек)" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Показвай имената на снимките" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Изключена" - -msgctxt "#30014" -msgid "Use filename" -msgstr "..името на файла" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "...името на папката" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Показвай изображенията в произволен ред" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Ползвай папка и име на файла" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Показвай датата" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Основни" - -msgctxt "#30025" -msgid "Additional" -msgstr "Допълнителни" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.bs_ba/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.bs_ba/strings.po deleted file mode 100644 index 5335743e5..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.bs_ba/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Bosnian (http://www.transifex.com/projects/p/xbmc-addons/language/bs/)\n" -"Language: bs\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Fascikle" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Onemogućeno" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.ca_es/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.ca_es/strings.po deleted file mode 100644 index 889b83ddb..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.ca_es/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Catalan (http://www.transifex.com/projects/p/xbmc-addons/language/ca/)\n" -"Language: ca\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Estalvi de pantalla que mostra una presentació de diapositives d'imatges" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "El protector de pantalles Projecció mostrarà una projecció de diapositives utilitzant diferents efectes de transició. Es pot configurar per mostrar el fanart de les vostres biblioteques de música o un directori d'imatges personalitzat" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Font de les imatges de la presentació" - -msgctxt "#30001" -msgid "Folder" -msgstr "Carpeta" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart de vídeo" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart de música" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Carpeta de les imatges" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nivell d'atenuació" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efecte" - -msgctxt "#30007" -msgid "Slide" -msgstr "Diapositiva" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Nombre de segons per mostrar cada imatge" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Escala de les imatges a pantalla completa" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Nom de l'imatge a mostrar per pantalla" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Inhabilitat" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Utilitza nom d'arxiu" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Utilitza el nom de la carpeta" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Mostrar les imatges en ordre aleatori" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Mostrar la data de la foto" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Mostra etiquetes d'imatge addicionals" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Mostra informació de música durant la reproducció d'àudio" - -msgctxt "#30024" -msgid "Basic" -msgstr "Bàsic" - -msgctxt "#30025" -msgid "Additional" -msgstr "Adicional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.cs_cz/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.cs_cz/strings.po deleted file mode 100644 index 984b1ec7a..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.cs_cz/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-06-22 08:43+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Czech \n" -"Language: cs_cz\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.13\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Spořič obrazovky promítající obrázky" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Spořič obrazovky promítání vám bude promítat zvolené obrázky s použitím různých přechodových efektů. Může být nastaven k zobrazování fanart z vašich hudebních, či video knihoven, nebo vlastní složky obrázků" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Zdroj promítaných obrázků" - -msgctxt "#30001" -msgid "Folder" -msgstr "Složka" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Hudební Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Složka s obrázky" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Úroveň ztmavení" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Snímek" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Prolnutí" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Posun a přiblížení" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Doba zobrazení každého obrázku (sekundy)" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Škálovat obrázek na rozlišení celé obrazovky" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Zobrazit název obrázku" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Zakázáno" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Použít název souboru" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Použít název složky" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Zobrazit obrázky v náhodném pořadí" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Použij složku- a jméno souboru" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Zobrazit datum obrázku" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Zobrazit další značky obrázku" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Zobrazit informace o hudbě při přehrávání zvuku" - -msgctxt "#30024" -msgid "Basic" -msgstr "Základní" - -msgctxt "#30025" -msgid "Additional" -msgstr "Další" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Zobrazit obrázek na pozadí" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.cy_gb/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.cy_gb/strings.po deleted file mode 100644 index 6c5489b39..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.cy_gb/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Welsh (http://www.transifex.com/projects/p/xbmc-addons/language/cy/)\n" -"Language: cy\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Arbedwr sgrin sy'n dangos sioe o ddelweddau" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Bydd yr arbedwr sgrin Slideshow yn dangos sioe o ddelweddau dan ddefnyddio amryw o effeithiau trawsnewidiol.Mae modd ei ffurfweddu i ddangos celf eich cerddoriaeth neu fideo neu ffolder cyfaddas o ddelweddau." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Ffynhonnell delweddau sioe sleidiau" - -msgctxt "#30001" -msgid "Folder" -msgstr "Ffolder" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Celf fideo" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Celf cerddoriaeth" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Ffolder Delweddau" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Lefel pylu" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effaith" - -msgctxt "#30007" -msgid "Slide" -msgstr "Sleid" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Croes bylu" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Tremio a chwyddo" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Sawl eiliadau i ddangos pob delwedd" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Graddio pob delwedd i'r sgrin lawn" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Dangos enw delwedd" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Analluogwyd" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Defnyddio enw ffeil" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Defnyddio enw ffolder" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Dangos delweddau ar hap" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Dangos dyddiad llun" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Dangos tagiau lluniau ychwanegol" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Dangos gwybodaeth cerddoriaeth wrth chwarae sain" - -msgctxt "#30024" -msgid "Basic" -msgstr "Elfennol" - -msgctxt "#30025" -msgid "Additional" -msgstr "Ychwanegol" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.da_dk/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.da_dk/strings.po deleted file mode 100644 index 50aedd94d..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.da_dk/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-07-13 13:14+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Danish \n" -"Language: da_dk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Pauseskærm som afspiller et diasshow" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Diasshow-pauseskærmen vil vise et diasshow af billeder ved hjælp af forskellige overgangseffekter. Den kan konfigureres til at vise fankunst fra dit biblioteks musik eller videoer, eller billeder fra en selvvalgt mappe." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Kilde til billeder i diasshow" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mappe" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video-fankunst" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Musik-fankunst" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Billedemappe" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Dæmpningsniveau" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Dias" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Glidende overgang" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Panorering og zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Antal sekunder hvert billede bliver vist" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Skaler billeder til fuld skærm" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Vis billednavn" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Deaktiveret" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Anvend filnavn" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Anvend mappenavn" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Vis billederne i tilfældig rækkefølge" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Brug fuld sti" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Brug mappe- og filnavn" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Vis billeddato" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Vis yderligere billedetiketter" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Vis information om musikken mens den bliver afspillet" - -msgctxt "#30024" -msgid "Basic" -msgstr "Simpel" - -msgctxt "#30025" -msgid "Additional" -msgstr "Yderligere" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Genoptag diasshow fra sidste position" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Vis baggrundsbillede" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Brug vignette øverst" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.de_de/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.de_de/strings.po deleted file mode 100644 index b496bda9c..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.de_de/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2023-01-31 22:15+0000\n" -"Last-Translator: Demian \n" -"Language-Team: German \n" -"Language: de_de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Bildschirmschoner, der eine Bilder-Diashow anzeigt" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Der Slideshow-Bildschirmschoner zeigt eine Bilder-Diashow mit verschiedenen Übergangseffekten. Er kann so konfiguriert werden, dass Musik- oder Videofanart aus der Bibliothek oder Bilder eines bestimmten Ordners angezeigt werden" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Quelle der Diashowbilder" - -msgctxt "#30001" -msgid "Folder" -msgstr "Ordner" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Videofanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Musikfanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Bildordner" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Abdunkelungsgrad" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Seite" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Überblendung" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Schwenk und Zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Anzahl an Sekunden, die jedes Bild angezeigt wird" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Bilder auf Vollbild skalieren" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Bildname anzeigen" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Deaktiviert" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Dateiname verwenden" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Ordnername verwenden" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Bilder in zufälliger Reihenfolge anzeigen" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Vollständigen Pfad verwenden" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Ordner- und Dateiname verwenden" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Bilddatum anzeigen" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Zusätzliche Bildschlagwörter anzeigen" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Musikinformationen während der Wiedergabe anzeigen" - -msgctxt "#30024" -msgid "Basic" -msgstr "Basis" - -msgctxt "#30025" -msgid "Additional" -msgstr "Zusätzlich" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Diashow von letzter Position vorsetzen" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Hintergrundbild anzeigen" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Vignettenoverlay verwenden" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.el_gr/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.el_gr/strings.po deleted file mode 100644 index 7e6b8fbbe..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.el_gr/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Greek (http://www.transifex.com/projects/p/xbmc-addons/language/el/)\n" -"Language: el\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Μία προφύλαξη οθόνης παρουσίασης διαφανειών" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Η προφύλαξη οθόνης Slideshow θα εμφανίσει μία σειρά εικόνων χρησιμοποιώντας ένα πλήθος εφέ μετάβασης. Μπορεί να ρυθμιστεί ούτως ώστε να εμφανίζει τις εικόνες fanart της μουσικής ή βίντεο συλλογής σας, ή έναν προσωπικό φάκελο εικόνων" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Πηγή εικόνων παρουσίασης διαφανειών" - -msgctxt "#30001" -msgid "Folder" -msgstr "Φάκελος" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart Βίντεο" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart Μουσικής" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Φάκελος Εικόνων" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Επίπεδο αμαύρωσης" - -msgctxt "#30006" -msgid "Effect" -msgstr "Εφέ" - -msgctxt "#30007" -msgid "Slide" -msgstr "Διαφάνεια" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Σταδιακό σβήσιμο" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Εφέ pan & zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Δευτερόλεπτα προβολής κάθε εικόνας" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Εικόνες σε κλίμακα στην πλήρη οθόνη" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Προβολή ονόματος εικόνας" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Ανενεργή" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Χρήση ονόματος αρχείου" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Χρήση ονόματος φακέλου" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Εμφάνιση εικόνων σε τυχαία σειρά" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Χρήση φακέλου- και ονόματος αρχείου" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Προβολή της ημερομηνίας της εικόνας" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Προβολή επιπλέον ετικετών της εικόνας" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Προβολή μουσικών πληροφοριών κατά την αναπαραγωγή" - -msgctxt "#30024" -msgid "Basic" -msgstr "Βασικό" - -msgctxt "#30025" -msgid "Additional" -msgstr "Επιπρόσθετα" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Προβολή εικόνας παρασκηνίου" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.en_au/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.en_au/strings.po deleted file mode 100644 index 9648aee3d..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.en_au/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: English (Australia) (http://www.transifex.com/projects/p/xbmc-addons/language/en_AU/)\n" -"Language: en_AU\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Folder" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Image Folder" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Dim level" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Disabled" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Basic" - -msgctxt "#30025" -msgid "Additional" -msgstr "Additional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.en_gb/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index ba0adb0b5..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: Kodi add-ons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_gb\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 - -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 - -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.en_nz/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.en_nz/strings.po deleted file mode 100644 index f3e14e090..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.en_nz/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: English (New Zealand) (http://www.transifex.com/projects/p/xbmc-addons/language/en_NZ/)\n" -"Language: en_NZ\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Screensaver that displays an image slideshow" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Source of slideshow images" - -msgctxt "#30001" -msgid "Folder" -msgstr "Folder" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Music Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Image Folder" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Dim level" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effect" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Crossfade" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Pan and zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Amount of seconds to display each image" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Scale images fullscreen" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Display image name" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Disabled" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Use filename" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Use foldername" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Display images in random order" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Use folder- and filename" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Display picture date" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Display additional picture tags" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Display music info during audio playback" - -msgctxt "#30024" -msgid "Basic" -msgstr "Basic" - -msgctxt "#30025" -msgid "Additional" -msgstr "Additional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Display background picture" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.en_us/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.en_us/strings.po deleted file mode 100644 index 7773b0da1..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.en_us/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: English (US) (http://www.transifex.com/projects/p/xbmc-addons/language/en_US/)\n" -"Language: en_US\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Screensaver that displays an image slideshow" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Source of slideshow images" - -msgctxt "#30001" -msgid "Folder" -msgstr "Folder" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Music Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Image Folder" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Dim level" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effect" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Crossfade" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Pan and zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Amount of seconds to display each image" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Scale images fullscreen" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Display image name" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Disabled" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Use filename" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Use foldername" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Display images in random order" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Use folder- and filename" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Display picture date" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Display additional picture tags" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Display music info during audio playback" - -msgctxt "#30024" -msgid "Basic" -msgstr "Basic" - -msgctxt "#30025" -msgid "Additional" -msgstr "Additional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Display background picture" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Use vignette overlay" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.eo/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.eo/strings.po deleted file mode 100644 index 61659543e..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.eo/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-07-22 14:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Esperanto \n" -"Language: eo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Malŝaltita" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.es_ar/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.es_ar/strings.po deleted file mode 100644 index a18a8dad7..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.es_ar/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Spanish (Argentina) (http://www.transifex.com/projects/p/xbmc-addons/language/es_AR/)\n" -"Language: es_AR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Un protector de pantalla que muestra una presentación de imágenes" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "El protector de pantalla Slideshow mostrará una presentación de imágenes usando varios efectos de transición. Puede ser configurado para mostrar los fanart de tus bibliotecas de música o video, o las imágenes de una carpeta." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Origen de las imágenes" - -msgctxt "#30001" -msgid "Folder" -msgstr "Carpeta" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart de video" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart de música" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Imagenes de una carpeta" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nivel de atenuación" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efecto" - -msgctxt "#30007" -msgid "Slide" -msgstr "Diapositiva" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Crossfade" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Desplazamiento y zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Número de segundos a mostrar cada imagen" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Escalar las imágenes en pantalla completa" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Mostrar nombre de la imágen" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Deshabilitado" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Usar nombre de archivo" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Usar nombre de carpeta" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Mostrar las imágenes en orden aleatorio" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Mostrar fecha de la imagen" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Mostrar etiquetas adicionales de la imagen" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Mostrar info de música durante reproducción de audio" - -msgctxt "#30024" -msgid "Basic" -msgstr "Básico" - -msgctxt "#30025" -msgid "Additional" -msgstr "Adicional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.es_es/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.es_es/strings.po deleted file mode 100644 index 9429a1b39..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.es_es/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2023-06-20 15:42+0000\n" -"Last-Translator: José Antonio Alvarado \n" -"Language-Team: Spanish (Spain) \n" -"Language: es_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.18\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Salvapantallas que muestra una presentación de imágenes" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "El salvapantallas Slideshow mostrará una presentación de imágenes usando varios efectos de transición. Puede ser configurado para mostrar los fanart de tus colecciones de música o video, o las imágenes de una carpeta" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Fuente de la presentación de imágenes" - -msgctxt "#30001" -msgid "Folder" -msgstr "Carpeta" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart de video" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart de música" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Carpeta de imágenes" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nivel de atenuación" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efecto" - -msgctxt "#30007" -msgid "Slide" -msgstr "Diapositiva" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Fundido cruzado" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Desplazamiento y zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Número de segundos a mostrar cada imagen" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Escalar las imágenes en pantalla completa" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Mostrar nombre de la imágen" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Desactivado" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Usar nombre de archivo" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Usar nombre de carpeta" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Mostrar las imágenes en orden aleatorio" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Usar ruta completa" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Usar nombre de carpeta y archivo" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Mostrar fecha de imagen" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Mostrar etiqueta adicional de imagen" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Mostrar información de la música durante la reproducción de audio" - -msgctxt "#30024" -msgid "Basic" -msgstr "Básico" - -msgctxt "#30025" -msgid "Additional" -msgstr "Adicional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Reanudar la presentación de imágenes desde la última posición" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Mostrar imágen de fondo" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Usar superposición de viñeta" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.es_mx/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.es_mx/strings.po deleted file mode 100644 index 2846869d8..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.es_mx/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Spanish (Mexico) (http://www.transifex.com/projects/p/xbmc-addons/language/es_MX/)\n" -"Language: es_MX\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Protector de pantalla que muestra una presentación de imágenes" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "El protector de pantalla Presentación de Imágenes te mostrará una presentación de imágenes usando varios efectos de transición. Puede ser configurado para mostrar tus librerías de fanart de música o video, o una carpeta de imágenes personalizada." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Fuente de imágenes de presentación" - -msgctxt "#30001" -msgid "Folder" -msgstr "Carpeta" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart de Video" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart de Música" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Carpeta de Imágenes" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nivel de atenuamiento" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Deshabilitado" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Básico" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.et_ee/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.et_ee/strings.po deleted file mode 100644 index 71069dd31..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.et_ee/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-08-22 10:14+0000\n" -"Last-Translator: rimasx \n" -"Language-Team: Estonian \n" -"Language: et_ee\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Ekraanisäästja, mis näitab piltide slaidiesitlust" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Slaidiesitluse ekraanisäästja näitab sulle slaidiesitlust kasutades erinevaid üleminekuefekte. Slaidiesitlust on võimalik koostada nii muusika või videote fännipiltidest kui ka kasutades selleks spetsiaalset määratud piltide kausta" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Slaidiesitluse piltide allikas" - -msgctxt "#30001" -msgid "Folder" -msgstr "Kaustanimi" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video fännipildid" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Muusika fännipildid" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Piltide kaust" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Hämarduse aste" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slaid" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Siire" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Panoraamina ja suurenda" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Sekundite arv iga pildi kuvamiseks" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Suurenda pilt täisekraanile" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Näita pildi nime" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Ei kasutata" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Kasuta faili nime" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Kasuta kausta nime" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Näita pilte suvalises järjekorras" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Kasuta kausta- ja failinime" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Näita pildi kuupäeva" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Näita pildi täiendavaid silte" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Heli taasesitlusel näita muusika infot" - -msgctxt "#30024" -msgid "Basic" -msgstr "Põhiline" - -msgctxt "#30025" -msgid "Additional" -msgstr "Täiendav" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Jätka slaidiseanssi poolelijäänud kohast" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Kuva taustapilt" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.eu_es/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.eu_es/strings.po deleted file mode 100644 index 7ca9971f5..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.eu_es/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Basque (http://www.transifex.com/projects/p/xbmc-addons/language/eu/)\n" -"Language: eu\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Karpeta" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Dim maila" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Ezgaituta" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.fa_af/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.fa_af/strings.po deleted file mode 100644 index c62ceecb5..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.fa_af/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Persian (http://www.transifex.com/projects/p/xbmc-addons/language/fa/)\n" -"Language: fa\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "پوشه" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "غیرفعال" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.fa_ir/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.fa_ir/strings.po deleted file mode 100644 index 57d137dd0..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.fa_ir/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Persian (Iran) (http://www.transifex.com/projects/p/xbmc-addons/language/fa_IR/)\n" -"Language: fa_IR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "پوشه" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "میزان نور محافظ" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "اسلاید" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "غیر فعال" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "ساده" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.fi_fi/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.fi_fi/strings.po deleted file mode 100644 index e404dd4ea..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.fi_fi/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-07-17 10:14+0000\n" -"Last-Translator: Oskari Lavinto \n" -"Language-Team: Finnish \n" -"Language: fi_fi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Näytönsäästäjä, joka näyttää kuvaesitystä" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Slideshow-näytönsäästäjä näyttää kuvaesityksen erilaisilla siirtymätehosteilla. Se voidaan määrittää esittämään musiikki- tai videokirjastojen fanart-kuvia tai tai valitun kansion kuvia." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Esityksen kuvalähde" - -msgctxt "#30001" -msgid "Folder" -msgstr "Kansio" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Videokirjaston fanart-kuvat" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Musiikkikirjaston fanart-kuvat" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Kuvakansio" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Himmennystaso" - -msgctxt "#30006" -msgid "Effect" -msgstr "Tehoste" - -msgctxt "#30007" -msgid "Slide" -msgstr "Liu'utus" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Ristihäivytys" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Panorointi ja zoomaus" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Yksittäisen kuvan näyttöaika sekunteina" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Skaalaa kuvat koko ruutuun" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Näytä kuvan nimi" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Ei käytössä" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Käytä tiedoston nimeä" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Käytän kansion nimeä" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Näytä kuvat satunnaisessa järjestyksessä" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Käytä koko tiedostosijaintia" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Käytä kansion ja tiedoston nimeä" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Näytä kuvan päiväys" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Näytä lisää kuvatunnisteita" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Näytä musiikin tiedot toistettaessa ääntä" - -msgctxt "#30024" -msgid "Basic" -msgstr "Perus" - -msgctxt "#30025" -msgid "Additional" -msgstr "Laaja" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Jatka kuvaesitystä aiemmasta sijainnista" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Näytä taustakuva" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Käytä vinjetti-peittokuvaa" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.fo_fo/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.fo_fo/strings.po deleted file mode 100644 index 57e121a2b..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.fo_fo/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Faroese (http://www.transifex.com/projects/p/xbmc-addons/language/fo/)\n" -"Language: fo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mappa" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Sløkt" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.fr_ca/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.fr_ca/strings.po deleted file mode 100644 index d0f065e5c..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.fr_ca/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: French (Canada) (http://www.transifex.com/projects/p/xbmc-addons/language/fr_CA/)\n" -"Language: fr_CA\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Économiseur d'écran affichant un diaporama" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "L'économiseur d'écran diaporama vous montrera un diaporama d'images avec différents effets de transition. Il peut être configuré pour afficher votre audiothèque, les fanarts de vos vidéos ou un dossier personnalisé d'images." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Source des images pour le diaporama" - -msgctxt "#30001" -msgid "Folder" -msgstr "Dossier" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart de la vidéo" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart de la musique" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Dossier des images" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Niveau d'atténuation" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effet" - -msgctxt "#30007" -msgid "Slide" -msgstr "Glisser" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Fondu" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Panoramique et zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Durée d'affichage de chaque image en secondes" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Agrandir les images en plein écran" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Afficher le nom des images" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Désactivé" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Utiliser le nom du fichier" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Utiliser le nom du dossier" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Afficher les images dans un ordre aléatoire" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Utiliser le nom de dossier et de fichier" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Afficher la date des images" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Afficher les balises supplémentaires de l'image" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Afficher les infos de la musique lors de la lecture audio" - -msgctxt "#30024" -msgid "Basic" -msgstr "De base" - -msgctxt "#30025" -msgid "Additional" -msgstr "Supplémentaire" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Afficher une image d'arrière-plan" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.fr_fr/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.fr_fr/strings.po deleted file mode 100644 index 3f6a4b640..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.fr_fr/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-12-23 18:15+0000\n" -"Last-Translator: skypichat \n" -"Language-Team: French (France) \n" -"Language: fr_fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Économiseur d'écran affichant un diaporama" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "L'économiseur Diaporama affiche un album photo en utilisant divers effets de transition. Il peut afficher la collection de fanarts vidéos ou musicaux, ou un dossier personnalisé d'images" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Source des images du diaporama" - -msgctxt "#30001" -msgid "Folder" -msgstr "Dossier" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart vidéo" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart musique" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Dossier d'images" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Niveau d'assombrissement" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effet" - -msgctxt "#30007" -msgid "Slide" -msgstr "Diaporama" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Fondu-enchaîné" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Panoramique et zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Durée d'affichage de chaque image en secondes" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Redimensionner les images en plein écran" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Afficher le nom de l'image" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Désactivé" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Utiliser le nom du fichier" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Utiliser le nom du dossier" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Afficher les images dans un ordre aléatoire" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Utiliser le chemin complet" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Utiliser dossier et nom de fichier" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Afficher la date de l'image" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Afficher les informations additionnelles de l'image" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Afficher les informations sur la musique pendant la lecture audio" - -msgctxt "#30024" -msgid "Basic" -msgstr "Basique" - -msgctxt "#30025" -msgid "Additional" -msgstr "Additionnel" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Reprendre le diaporama à partir de la dernière position" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Afficher l'image d'arrière-plan" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Utiliser la superposition de vignettes" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.gl_es/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.gl_es/strings.po deleted file mode 100644 index e59c38036..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.gl_es/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Galician (http://www.transifex.com/projects/p/xbmc-addons/language/gl/)\n" -"Language: gl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "O gardapantallas que amosa unha presentación de imaxes" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "O gardapantallas Slideshow amosará unha presentación de imaxes empregando varios efectos de transición. Pode ser configurado para amosar os carteis das túas biblotecas de video ou música ou imaxes dun cartafol personalizado." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Fonte das imaxes para a presentación" - -msgctxt "#30001" -msgid "Folder" -msgstr "Cartafol" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Carteis de Video" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Carteis de Música" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Cartafol de Imaxes" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nivel de atenuación" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efecto" - -msgctxt "#30007" -msgid "Slide" -msgstr "Presentación" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Atenuación" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Panorámica e ampliación" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "tempo en segundos nos que se amosará cada imaxe" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Escalar imaxes a pantalla completa" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Amosar o nome da imaxe" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Desactivado" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Usar o nome do ficheiro" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Usar o nome do cartafol" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Amosar imaxes ó chou" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Usar o cartafol- e o nome do ficheiro" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Amosar a data da imaxe" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Amosar etiquetas adicionais da imaxe" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Amosar a información de audio durante a reprodución" - -msgctxt "#30024" -msgid "Basic" -msgstr "Básico" - -msgctxt "#30025" -msgid "Additional" -msgstr "Adicional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Amosar unha imaxe de fondo" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.he_il/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.he_il/strings.po deleted file mode 100644 index 52787e604..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.he_il/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-08-03 14:29+0000\n" -"Last-Translator: Yaron Shahrabani \n" -"Language-Team: Hebrew (Israel) \n" -"Language: he_il\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "שומר מסך אשר יציג מצגת של תמונות" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "השומר מסך יציג לך מצגת של תמונות אשר עושה שימוש במעברים שונים. יש אפשרות להגדיר את תמונות הפאנארט של ספריות המוזיקה והוידאו, או תיקיית תמונות אישית" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "מקור תמונות המצגת" - -msgctxt "#30001" -msgid "Folder" -msgstr "תיקיה" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "וידאו פאנארט" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "מוזיקה פאנארט" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "תיקיית תמונות" - -msgctxt "#30005" -msgid "Dim level" -msgstr "רמת עמעום" - -msgctxt "#30006" -msgid "Effect" -msgstr "אפקט" - -msgctxt "#30007" -msgid "Slide" -msgstr "מצגת" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "התמזגות" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "תקריב וחיתוך מסך" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "כמות השניות כדי להציג כל תמונה" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "הגדל תמונות למסף מלא" - -msgctxt "#30012" -msgid "Display image name" -msgstr "הצג שם תמונה" - -msgctxt "#30013" -msgid "Disabled" -msgstr "מנוטרל" - -msgctxt "#30014" -msgid "Use filename" -msgstr "השתמש בשם קובץ" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "השתמש בשם תיקיה" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "הצגת התמונות בסדר אקראי" - -msgctxt "#30017" -msgid "Use full path" -msgstr "להשתמש בנתיב המלא" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "להשתמש בתיקייה- ובשם הקובץ" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "הצג תאריך תמונה" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "הצג תוויות תמונה נוספות" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "הצג פרטי מוזיקה בזמן ניגון אודיו" - -msgctxt "#30024" -msgid "Basic" -msgstr "בסיסי" - -msgctxt "#30025" -msgid "Additional" -msgstr "נוסף" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "להמשיך את המצגת מאין שהופסקה" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "הצג תמונת רקע" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.hi_in/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.hi_in/strings.po deleted file mode 100644 index 07ebf35a1..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.hi_in/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-07-22 14:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Hindi (India) \n" -"Language: hi_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "सक्रीनसेवर जो चित्रो के स्लीडेशो को प्रदर्शन करता है" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "स्लीडेशो चित्रो का सोर्स" - -msgctxt "#30001" -msgid "Folder" -msgstr "फोल्डर" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "वीडियो फ़ानर्ट" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "म्यूज़िक फ़ानर्ट" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "चित्र फ़ानर्ट" - -msgctxt "#30005" -msgid "Dim level" -msgstr "डिम का ताल" - -msgctxt "#30006" -msgid "Effect" -msgstr "एफेक्ट" - -msgctxt "#30007" -msgid "Slide" -msgstr "\tपरिकलन" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "क्रॉसफेड" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "पएन और ज़ूम करे" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "प्रतेक चित्र को प्रदर्शन करने मे सेकेंड्स की मात्रा" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "चित्रो को फुलस्क्रीन मे नापे" - -msgctxt "#30012" -msgid "Display image name" -msgstr "चित्र के नाम का प्रदर्सन करे" - -msgctxt "#30013" -msgid "Disabled" -msgstr "विकलांग" - -msgctxt "#30014" -msgid "Use filename" -msgstr "फाइलनेम का प्रयोग करे" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "फोल्डर के नेम का प्रयोग करे" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "चित्रो को यादृच्छिक तरीके से प्रदर्सन करे" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "चित्र के दिनांक का प्रदर्सन करे" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "अतिरिक्त पिक्चर टॅग्स का प्रदर्सन करे" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "ऑडियो प्लेबॅक के दौरान गाने की जानकारी दिखाए" - -msgctxt "#30024" -msgid "Basic" -msgstr "बुनियादी" - -msgctxt "#30025" -msgid "Additional" -msgstr "अतिरिक्त" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.hr_hr/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.hr_hr/strings.po deleted file mode 100644 index 43e568a5d..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.hr_hr/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Croatian (http://www.transifex.com/projects/p/xbmc-addons/language/hr/)\n" -"Language: hr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Čuvar zaslona koji prikazuje slikovnu prezentaciju" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Čuvar zaslona slikovne prezentacije prikazuje slikovnu prezentaciju uz razne prijelazne efekte. Može se podesiti da prikazuje Vašu bazu glazbenih ili video slika omota, ili odabranu mapu sa slikama" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Izvor slika slikovne prezentacije" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mapa" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video slika omota" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Glazbena slika omota" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Mapa sa slikama" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Razina zatamnjenja" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Prezentacija" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Pretapanje" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Obrezivanje i zumiranje" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Trajanje u sekundama prikaza svake slike" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Razvuci slike preko cijelog zaslona" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Prikaži naziv slike" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Onemogućen" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Koristi naziv datoteke" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Koristi naziv mape" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Prikaži slike naizmjeničnim odabirom" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Korisit mapu - i naziv datoteke" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Prikaži datum slike" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Prikaži dodatne oznake slike" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Prikaži glazbene informacije tijekom audio reprodukcije" - -msgctxt "#30024" -msgid "Basic" -msgstr "Osnovno" - -msgctxt "#30025" -msgid "Additional" -msgstr "Dodatno" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Prikaži sliku pozadine" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.hu_hu/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.hu_hu/strings.po deleted file mode 100644 index 4581e2a30..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.hu_hu/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Hungarian (http://www.transifex.com/projects/p/xbmc-addons/language/hu/)\n" -"Language: hu\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Képernyővédő ami diavetítést csinál" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "A Slideshow képernyővédő diavetítés-szerűen képeket mutat egymás után különböző váltási effektussal. Beállítható úgy hogy a médiatárból mutasson zenei-, vagy film fanartképeket, vagy egy egyedi mappából mutassa azokat." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Diavetítés képeinek elérhetősége" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mappa" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Videó Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Zene Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Kép mappa" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Elsötétítés szintje" - -msgctxt "#30006" -msgid "Effect" -msgstr "Hatás" - -msgctxt "#30007" -msgid "Slide" -msgstr "Csúszka" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Átmosás" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Pásztázás és nagyítás (Pan&Zoom)" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Képek megjelenítési ideje másodperceben" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Képek teljes képernyőre igazítása" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Kép nevének megjelenítése" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Letiltva" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Fájlnév használata" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Mappanév használata" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Képek véletlenszerű betöltése" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Képadatok megjelenítése" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Hozzáadott képelemek megjelenítése" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Zene infó megjelenítése lejátszás közben" - -msgctxt "#30024" -msgid "Basic" -msgstr "Alap" - -msgctxt "#30025" -msgid "Additional" -msgstr "Hozzáadott" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.id_id/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.id_id/strings.po deleted file mode 100644 index f36db9b2e..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.id_id/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Indonesian (http://www.transifex.com/projects/p/xbmc-addons/language/id/)\n" -"Language: id\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Folder" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart Musik" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Tingkat redup" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Non Aktif" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Dasar" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.is_is/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.is_is/strings.po deleted file mode 100644 index 549629c40..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.is_is/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2023-09-25 12:11+0000\n" -"Last-Translator: Sveinn í Felli \n" -"Language-Team: Icelandic \n" -"Language: is_is\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 5.0.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Skjáhvíla sem sýnir skyggnusýningu mynda" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Þessi skjáhvíla sýnir þér skyggnusýningu af myndum með ýmsum myndbrellum. Það er hægt að stilla hana til að sýna aðdáendamyndir úr tónlistar eða myndskeiðasöfnum, eða úr sérsniðinni möppu með myndum" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Veita skyggnumynda" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mappa" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Aðdáendamyndir myndskeiða" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Aðdáendamyndir tónlistar" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Myndamappa" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Birtustilling" - -msgctxt "#30006" -msgid "Effect" -msgstr "Myndbrellur" - -msgctxt "#30007" -msgid "Slide" -msgstr "Skruna" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Krossblanda" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Hliðrun og aðdráttur" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Tími í sekúndum sem á að sýna hverja mynd" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Kvarða myndir á allan skjáinn" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Sýna nafn myndar" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Óvirkt" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Nota skráarheiti" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Nota möppuheiti" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Birta myndir í handahófskenndri röð" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Nota fulla slóð" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Nota möppu- og skráarnafn" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Sýna dagsetningu myndar" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Sýna frekari merkingar myndar" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Sýna tónlistarupplýsingar meðan lag er spilað" - -msgctxt "#30024" -msgid "Basic" -msgstr "Einfalt" - -msgctxt "#30025" -msgid "Additional" -msgstr "Meira" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Halda skyggnusýningu áfram úr síðustu stöðu" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Sýna bakgrunnsmynd" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Nota merki sem yfirlag" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.it_it/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.it_it/strings.po deleted file mode 100644 index d2c18cc43..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.it_it/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-08-30 20:14+0000\n" -"Last-Translator: Massimo Pissarello \n" -"Language-Team: Italian \n" -"Language: it_it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Salvaschermo che mostra una presentazione di immagini" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Il salvaschermo Slideshow mostra una presentazione di immagini usando diversi effetti di transizione. Può essere configurato per mostrare le fanart delle librerie musica o video, oppure una cartella di immagini specifica" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Fonte delle immagini" - -msgctxt "#30001" -msgid "Folder" -msgstr "Cartella" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart video" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart musica" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Cartella immagini" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Livello oscuramento" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effetto" - -msgctxt "#30007" -msgid "Slide" -msgstr "Diapositiva" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Dissolvenza incrociata" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Panoramica e zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Numero di secondi per visualizzare ciascuna immagine" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Ridimensiona immagini a schermo intero" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Visualizza nome immagine" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Disabilitato" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Usa nome file" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Usa nome cartella" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Visualizza immagini in ordine casuale" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Usa percorso completo" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Usa cartella- e nome file" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Visualizza data immagine" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Visualizza tag aggiuntivi immagine" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Visualizza informazioni sulla musica durante la riproduzione audio" - -msgctxt "#30024" -msgid "Basic" -msgstr "Base" - -msgctxt "#30025" -msgid "Additional" -msgstr "Supplementare" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Riprendi presentazione dall'ultima posizione" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Visualizza immagine di sfondo" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Usa sovrapposizione vignettatura" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.ja_jp/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.ja_jp/strings.po deleted file mode 100644 index b5166edf1..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.ja_jp/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-07-22 14:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Japanese \n" -"Language: ja_jp\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "画像をスライドショー表示するスクリーンセーバー" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "スライドショー画像" - -msgctxt "#30001" -msgid "Folder" -msgstr "フォルダー" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "映像ファンアート" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "音楽ファンアート" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "画像フォルダー" - -msgctxt "#30005" -msgid "Dim level" -msgstr "ぼかしレベル" - -msgctxt "#30006" -msgid "Effect" -msgstr "エフェクト" - -msgctxt "#30007" -msgid "Slide" -msgstr "スライド" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "クロスフェード" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "パン&ズーム" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "各画像を表示する秒数" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "イメージをフルスクリーンにスケーリング" - -msgctxt "#30012" -msgid "Display image name" -msgstr "イメージ名を表示" - -msgctxt "#30013" -msgid "Disabled" -msgstr "無効" - -msgctxt "#30014" -msgid "Use filename" -msgstr "ファイル名を使う" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "フォルダ名を使う" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "ランダムにイメージを表示する" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "画像の日付を表示" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "イメージタグの追加を表示" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "オーディオ再生時に音楽情報を表示" - -msgctxt "#30024" -msgid "Basic" -msgstr "標準" - -msgctxt "#30025" -msgid "Additional" -msgstr "追加" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.ko_kr/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.ko_kr/strings.po deleted file mode 100644 index 3bb7f8a8f..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.ko_kr/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-07-01 15:22+0000\n" -"Last-Translator: Minho Park \n" -"Language-Team: Korean \n" -"Language: ko_kr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "이미지 슬라이드쇼를 보여주는 화면 보호기" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "슬라이드쇼 화면 보호기는 다양한 화면 전환효과를 이용해 이미지 슬라이드쇼를 보여줍니다. 음악 라이브러리, 비디오 팬아트, 사용자 폴더의 사진을 볼 수 있게 설정할 수 있습니다" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "슬라이드쇼 이미지 소스" - -msgctxt "#30001" -msgid "Folder" -msgstr "폴더" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "비디오 팬아트" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "음악 팬아트" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "이미지 폴더" - -msgctxt "#30005" -msgid "Dim level" -msgstr "어두운 정도" - -msgctxt "#30006" -msgid "Effect" -msgstr "효과" - -msgctxt "#30007" -msgid "Slide" -msgstr "슬라이드" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "크로스페이드" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "확대와 이동" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "각 이미지를 표시할 시간 (초)" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "전체화면 늘이기" - -msgctxt "#30012" -msgid "Display image name" -msgstr "이미지 이름 표시" - -msgctxt "#30013" -msgid "Disabled" -msgstr "사용 안 함" - -msgctxt "#30014" -msgid "Use filename" -msgstr "파일명 사용" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "폴더명 사용" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "무작위 순으로 이미지 표시" - -msgctxt "#30017" -msgid "Use full path" -msgstr "전체 경로 사용" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "사용자 폴더 - 파일 이름" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "사진 날짜 표시" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "부가 사진 태그 표시" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "오디오 재생중에 음악 정보 표시" - -msgctxt "#30024" -msgid "Basic" -msgstr "기본" - -msgctxt "#30025" -msgid "Additional" -msgstr "부가" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "이전 위치에서 슬라이드쇼 다시 시작" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "배경 사진 표시" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "비네트 오버레이 사용" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.lt_lt/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.lt_lt/strings.po deleted file mode 100644 index dc5688493..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.lt_lt/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Lithuanian (http://www.transifex.com/projects/p/xbmc-addons/language/lt/)\n" -"Language: lt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Ekrano užsklanda, kuri rodo skaidrių peržiūrą" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Skaidrių peržiūros ekrano užsklanda atvaizduoja skaidrių peržiūros vaizdus, naudojant įvairius perėjimo efektus. Jis konfigūruojamas, kad rodyti jūsų bibliotekos muzikos ar vaizdo FanArt arba pasirinktinį paveikslėlių aplanką" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Skaidrių peržiūros paveikslėlių šaltinis" - -msgctxt "#30001" -msgid "Folder" -msgstr "Aplankas" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Vaizdo Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Muzikos Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Paveikslėlių aplankas" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Pritemdymo lygis" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efektas" - -msgctxt "#30007" -msgid "Slide" -msgstr "Skaidrės" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Užslanka" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Perkelti ir padidinti" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Laikas sekundėmis, kiekvieno paveikslėlio rodymui" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Paveikslėlių mastelis visame ekrane" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Rodyti paveikslėlio pavadinimą" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Atjungta" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Naudoti failo pavadinimą" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Naudoti aplanko pavadinimą" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Rodytis paveikslėlius atsitiktine tvarka" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Naudoti aplanko ir failo vardą" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Rodyti nuotraukos datą" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Rodyti papildomas nuotraukų žymes" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Rodyti muzikos informaciją garso atkūrimo metu" - -msgctxt "#30024" -msgid "Basic" -msgstr "Pagrindinis" - -msgctxt "#30025" -msgid "Additional" -msgstr "Papildomas" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Rodyti fono paveikslėlį" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.lv_lv/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.lv_lv/strings.po deleted file mode 100644 index 282beab17..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.lv_lv/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Latvian (http://www.transifex.com/projects/p/xbmc-addons/language/lv/)\n" -"Language: lv\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Ekrānsaudzētājs, kas rāda attēlu slīdīti" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Slīdītes ekrānsaudzētājs parādīs slīdīti ar attēliem, izmantojot dažādus pārejas efektus. To var konfigurēt, lai rāda fanumākslu no mūzikas vai video bibliotekām, vai arī no pielāgotas attēlu mapes" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Slīdītes attēlu avots" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mape" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video fanumāksla" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Mūzikas fanumāksla" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Attēlu mape" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Tumšuma līmenis" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efekts" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Izslēgts" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Pamata" - -msgctxt "#30025" -msgid "Additional" -msgstr "Papildus" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.mi/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.mi/strings.po deleted file mode 100644 index 719a3ecd5..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.mi/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: Kodi add-ons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.mk_mk/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.mk_mk/strings.po deleted file mode 100644 index 1a8ca82cd..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.mk_mk/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Macedonian (http://www.transifex.com/projects/p/xbmc-addons/language/mk/)\n" -"Language: mk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Заштита на екран што покажува слајдшоу од слики" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Слајдшоу заштитата на екран ќе покаже слајд шоу на слики користејќи ефекти на транзиција. Може да биде конфигурирано да покажува и плакат од вашата музика или филмови или ваша папка со слики" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Извор на слики за слајдшоу" - -msgctxt "#30001" -msgid "Folder" -msgstr "Папки" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Видео плакати" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Плакати од музиката" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Папка со слики" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Ниво на стемнување" - -msgctxt "#30006" -msgid "Effect" -msgstr "Ефект" - -msgctxt "#30007" -msgid "Slide" -msgstr "Слајд" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Преклоп" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Пан и Зум" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Колку секунди да се прикаже секоја слика" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Оневозможено" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Основно" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.ms_my/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.ms_my/strings.po deleted file mode 100644 index a332ef8a7..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.ms_my/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Malay (http://www.transifex.com/projects/p/xbmc-addons/language/ms/)\n" -"Language: ms\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Penyelamat skrin yang memaparkan paparan slaid imej" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Penyelamat skrin paparan slaid akan paparkan paparan slaid imej menggunakan pelabgai kesan peralihan. Ia boleh dikonfigur untuk tunjukkan pustaka muzik atau seni peminat anda, atau folder imej suai" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Sumber imej paparan slaid" - -msgctxt "#30001" -msgid "Folder" -msgstr "Folder" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video Seni Peminat" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Muzik Seni Peminat" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Folder Imej" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Aras malap" - -msgctxt "#30006" -msgid "Effect" -msgstr "Kesan" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slaid" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Resap Silang" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Lata dan zum" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Amaun saat untuk paparkan setiap imej" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Skala imej berskrin penuh" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Papar nama imej" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Dilumpuhkan" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Guna nama fail" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Guna nama folder" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Papar imej dalam tertib rawak" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Papar tarikh gambar" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Papar tag gambar tambahan" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Papar maklumat muzik semasa main balik audio" - -msgctxt "#30024" -msgid "Basic" -msgstr "Asas" - -msgctxt "#30025" -msgid "Additional" -msgstr "Tambahan" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.mt_mt/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.mt_mt/strings.po deleted file mode 100644 index 50466c926..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.mt_mt/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Maltese (http://www.transifex.com/projects/p/xbmc-addons/language/mt/)\n" -"Language: mt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Fowlder" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Mhux attiv" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Bażiku" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.my_mm/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.my_mm/strings.po deleted file mode 100644 index fcbf6fa33..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.my_mm/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Burmese (http://www.transifex.com/projects/p/xbmc-addons/language/my/)\n" -"Language: my\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Screensaver သည်ပုံများကို slideshow အဖြစ်ပြသပေးသည်။" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Slideshow ပုံများ၏မူလရင်းမြစ်" - -msgctxt "#30001" -msgid "Folder" -msgstr "ဖိုလ်ဒါ" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "ဗွီဒီယို Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Music Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "ပုံဖိုလ်ဒါ" - -msgctxt "#30005" -msgid "Dim level" -msgstr "မှေးမှိန်စေသော အမှတ်" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effect" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "ပုံတစ်ပုံကိုပြရမည့်စက္ကန့်" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "ပုံအမည်ကိုဖော်ပြမည်" - -msgctxt "#30013" -msgid "Disabled" -msgstr "ပိတ်ထားမည်" - -msgctxt "#30014" -msgid "Use filename" -msgstr "ဖိုင်အမည်ကိုသုံးမည်" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "ဖိုလ်ဒါလ် အမည်ကိုသုံးမည်" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "ပုံ၏ရက်စွဲကိုပြမည်" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "အခြေခံ" - -msgctxt "#30025" -msgid "Additional" -msgstr "နောက်ထပ်" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.nb_no/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.nb_no/strings.po deleted file mode 100644 index c461d08a8..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.nb_no/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Norwegian (http://www.transifex.com/projects/p/xbmc-addons/language/no/)\n" -"Language: no\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Skjermbeskytter med lysbildefremvisning" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Denne skjermbeskytteren viser bilder med forskjellige overgangseffekter. Den kan konfigureres til å vise fanart fra musikk- eller videobiblioteket ditt, eller en mappe med bilder." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Kilde for bilder" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mappe" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Musikk Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Bilde-mappe" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Dim nivå" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Skli" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Crossfade" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Pan og zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Antall sekunder hvert bilde vises" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Forstørr bilder til fullskjerm" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Vis bildetittel" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Deaktivert" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Bruk filnavn" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Bruk mappenavn" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Vis bilder i tilfeldig rekkefølge" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Vis bildedato" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Vis flere bildetags" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Vis musikkinfo under audioavspilling" - -msgctxt "#30024" -msgid "Basic" -msgstr "Grunnleggende" - -msgctxt "#30025" -msgid "Additional" -msgstr "Ytterligere" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.nl_nl/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.nl_nl/strings.po deleted file mode 100644 index 12ed6d815..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.nl_nl/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-06-07 12:14+0000\n" -"Last-Translator: Pander \n" -"Language-Team: Dutch \n" -"Language: nl_nl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Schermbeveiliging die een diavoorstelling toont" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "De diavoorstellingsschermbeveiliging zal een diavoorstelling tonen met verschillende overgangseffecten. Je kunt een muziek- of videofanart uit je bibliotheek tonen of zelf een map opgeven die afbeeldingen bevat." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Locatie van diavoorstelling afbeeldingen" - -msgctxt "#30001" -msgid "Folder" -msgstr "Map" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Videofanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Muziekfanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Afbeeldingenmap" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Dimveau" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effect" - -msgctxt "#30007" -msgid "Slide" -msgstr "Dia" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Vloeiende overgang" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Draaien en zoomen" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Aantal seconden om elk plaatje te tonen" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "schaal foto's naar volledig scherm" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Weergeven foto naam" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Uitgeschakeld" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Gebruik bestandsnaam" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Gebruik mapnaam" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Toon afbeeldingen in willekeurige volgorde" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Gebruik volledig pad" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Gebruik map- en bestandsnaam" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Toon afbeeldingsdatum" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Toon extra afbeelding tags" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Toon muziekinformatie tijdens het afspelen" - -msgctxt "#30024" -msgid "Basic" -msgstr "Basis" - -msgctxt "#30025" -msgid "Additional" -msgstr "Extra" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Hervat diavoorstelling vanaf laatste positie" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Toon achtergrondafbeelding" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.pl_pl/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.pl_pl/strings.po deleted file mode 100644 index d85c1e22e..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.pl_pl/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-06-18 22:14+0000\n" -"Last-Translator: Marek Adamski \n" -"Language-Team: Polish \n" -"Language: pl_pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.13\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Wygaszacz ekranu wyświetlający pokaz slajdów" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Ten wygaszacz ekranu wyświetla pokaz slajdów z różnymi efektami przejścia. Można go skonfigurować tak, aby wyświetlał fototapety filmów, muzyki lub obrazy z niestandardowego folderu" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Źródło obrazów dla pokazu slajdów" - -msgctxt "#30001" -msgid "Folder" -msgstr "Folder" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fototapeta wideo" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fototapeta muzyki" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Folder obrazów" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Poziom przyciemnienia" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Przesuwania" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Przejścia" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Efekt Kena Burnsa" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Liczba sekund wyświetlania każdego obrazu" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Dopasowuj obrazy do pełnego ekranu" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Wyświetlaj nazwę obrazu" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Nieaktywny" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Używaj nazwy pliku" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Używaj nazwy folderu" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Wyświetlaj obrazy w losowej kolejności" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Używaj pełnej ścieżki" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Używaj folderu i nazwy pliku" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Wyświetlaj datę obrazu" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Wyświetlaj dodatkowe znaczniki obrazu" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Wyświetlaj informacje o odtwarzanej muzyce" - -msgctxt "#30024" -msgid "Basic" -msgstr "Podstawowe" - -msgctxt "#30025" -msgid "Additional" -msgstr "Dodatkowe" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Wznów pokaz slajdów z ostatniej pozycji" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Pokazuj obraz tła" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "Używaj nakładki winiety" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.pt_br/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.pt_br/strings.po deleted file mode 100644 index 374754a34..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.pt_br/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/xbmc-addons/language/pt_BR/)\n" -"Language: pt_BR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Proteção de tela que mostra uma apresentação de fotografias" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "O screensaver Slideshow irá mostrar-lhe uma apresentação de slides de suas fotografias usando diferentes efeitos de transição. Ele pode ser configurado para visualizar fanarts de sua biblioteca de músicas ou de vídeo, ou ainda utilizar uma pasta personalizada que contenha imagens" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Fonte de imagens para o slideshow" - -msgctxt "#30001" -msgid "Folder" -msgstr "Pasta" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart de Vídeo" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart de Música" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Pasta com Imagens" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nível de escurecimento" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efeito" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Crossfade" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Pan e zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Total de segundos para mostrar cada imagem" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Escalonar imagens em tela cheia" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Mostrar nome da imagem" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Desabilitado" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Usar Nome do Arquivo" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Usar Nome da Pasta" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Apresentar imagens em ordem aleatória" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Usar pasta-e nome do arquivo" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Mostrar data fotografia" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Mostrar tags adicionais fotografia" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Mostrar info de música durante reprodução de áudio" - -msgctxt "#30024" -msgid "Basic" -msgstr "Básico" - -msgctxt "#30025" -msgid "Additional" -msgstr "Adicional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Mostrar imagem de fundo" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.pt_pt/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.pt_pt/strings.po deleted file mode 100644 index 0f8b7585f..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.pt_pt/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Portuguese (http://www.transifex.com/projects/p/xbmc-addons/language/pt/)\n" -"Language: pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Protecção de ecrã que mostra uma apresentação de slides" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "O protector de ecrã de slides irá mostrar-lhe imagens usando vários efeitos de transição. Pode ser configurada para mostrar as imagens de Fanart da sua biblioteca de música ou de vídeo, e também pode mostrar as imagens de uma pasta à sua escolha." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Origem das imagens de Slides" - -msgctxt "#30001" -msgid "Folder" -msgstr "Pasta" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Fanart de Vídeo" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Fanart de Música" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Pasta das imagens" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nível de esvanecimento" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efeito" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Sobreposição na transição" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Movimento e Ampliação" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Segundos a exibir cada imagem" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Graduar imagens para ecrã cheio" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Exibir nome da imagem" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Desligado" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Usar nome do ficheiro" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Usar nome da pasta" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Exibir imagens numa ordem aleatória" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Usar nome do ficheiro e da pasta" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Exibir data da imagem" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Exibir etiquetas adicionais da imagem" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Exibir info da música durante reprodução" - -msgctxt "#30024" -msgid "Basic" -msgstr "Básico" - -msgctxt "#30025" -msgid "Additional" -msgstr "Adicional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.ro_ro/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.ro_ro/strings.po deleted file mode 100644 index 3466dfb6b..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.ro_ro/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-07-22 14:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Romanian \n" -"Language: ro_ro\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Protector ecran care afișează o diaporamă de imagini" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Protector ecran de tip diaporamă care va afișa imagini folosind diferite efecte de tranziție. Poate fi configurat să afișeze imagini creații artistice din mediateca audio sau video sau dintr-un dosar personalizat." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Sursă imagini diaporamă" - -msgctxt "#30001" -msgid "Folder" -msgstr "Dosar" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Creații artistice video" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Creații artistice muzică" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Dosar imagini" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nivel întunecare" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efect" - -msgctxt "#30007" -msgid "Slide" -msgstr "Glisează" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Suprapunere" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Deplasare şi mărire" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Câte secunde se afişează fiecare imagine" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Imagini afișate pe tot ecranul" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Afișare nume imagini" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Dezactivat" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Utilizează nume fișier" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Utilizează nume director" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Arată imaginile în ordine aleatoare" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Folosește dosar- și nume fișier" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Arata data imaginii" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Arata informații adiționale ale imaginii" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Arată informații despre muzică în timpul redării audio" - -msgctxt "#30024" -msgid "Basic" -msgstr "De bază" - -msgctxt "#30025" -msgid "Additional" -msgstr "Adițional" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.ru_ru/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.ru_ru/strings.po deleted file mode 100644 index 929cd1184..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.ru_ru/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Russian (http://www.transifex.com/projects/p/xbmc-addons/language/ru/)\n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Заставка, показывающая слайд-шоу из изображений" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Эта заставка показывается слайд-шоу из изображений, используя различные эффекты переходов. Заставку можно настроить для показ фанарта для музыки и видео из вашей библиотеки мультимедиа или изображениям из заданной папки." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Источник изображений для слайд-шоу" - -msgctxt "#30001" -msgid "Folder" -msgstr "Папка" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Фанарт видео" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Фанарт музыки" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Папка изображений" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Уровень затемнения" - -msgctxt "#30006" -msgid "Effect" -msgstr "Эффект" - -msgctxt "#30007" -msgid "Slide" -msgstr "Слайды" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Затухание" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Панорамирование и масштабирование" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Сколько секунд отображать каждый слайд" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Растянуть изображение в полный экран" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Показывать имя изображения" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Откл." - -msgctxt "#30014" -msgid "Use filename" -msgstr "Использовать имя файла" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Использовать имя папки" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Показывать изображения в случайном порядке" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Показывать дату изображения" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Показывать доролнительные данные изображения" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Отображение информации о музыке во время воспроизведения аудио" - -msgctxt "#30024" -msgid "Basic" -msgstr "Базовый" - -msgctxt "#30025" -msgid "Additional" -msgstr "Дополнительно" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.sk_sk/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.sk_sk/strings.po deleted file mode 100644 index 71c7dfd50..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.sk_sk/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2023-03-04 09:16+0000\n" -"Last-Translator: Patrik Špaňo \n" -"Language-Team: Slovak \n" -"Language: sk_sk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.15.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Šetrič obrazovky zobrazujúci prezentáciu obrázkov" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Šetrič obrazovky Prezentácia vám zobrazí prezentáciu obrázkov s použitím rôznych prechodových efektov. Môže byť nastavený na zobrazovanie vašej knižnice hudby alebo video fanartov, alebo vlastného priečinku s obrázkami" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Zdroj obrázkov prezentácie" - -msgctxt "#30001" -msgid "Folder" -msgstr "Priečinok" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Hudobný Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Priečinok obrázkov" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Úroveň zatemnenia" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Diapozitívy" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Prelínanie" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Postupné približovanie" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Počet sekúnd, počas ktorých bude zobrazený obrázok" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Zmenšiť obrázky na celú obrazovku" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Zobraziť názov obrázku" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Zakázaný" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Použiť názov súboru" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Použiť názov priečinku" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Zobrazovať obrázky v náhodnom poradí" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Zobraziť dátum obrázku" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Zobraziť dodatočné značky obrázkov" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Zobraziť informácie o hudbe počas prehrávania audia" - -msgctxt "#30024" -msgid "Basic" -msgstr "Základné" - -msgctxt "#30025" -msgid "Additional" -msgstr "Dodatočné" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.sl_si/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.sl_si/strings.po deleted file mode 100644 index 527ed81cd..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.sl_si/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Slovenian (http://www.transifex.com/projects/p/xbmc-addons/language/sl/)\n" -"Language: sl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Ohranjevalnik zaslona, ki prikazuje diaprojekcijo slik" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Predvajalnik slik prikaže diaprojekcijo slik z uporabo različnih učinkov prehoda. To je mogoče nastaviti tako, da se prikažejo ozadja knjižnice glasbe ali videa alislike iz izbrane mape." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Vir slik za projekcijo" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mapa" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Grafike filmov" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Grafike glasbe" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Mapa s slikami" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nivo zatemnitve" - -msgctxt "#30006" -msgid "Effect" -msgstr "Učinek" - -msgctxt "#30007" -msgid "Slide" -msgstr "Drsenje" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Prelivanje" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Premik in povečava" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Čas prikaza posamezne slike" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Spremeni velikost slik v celozaslonskem načinu" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Prikaži ime slike" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Onemogočeno" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Uporabi ime datoteke" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Uporabi ime mape" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Prikaži slike v naključnem zaporedju" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Uporabi ime mape in datoteke" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Prikaži datum slike" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Prikaži dodatne informacije o sliki" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Prikaži informacije o glasbi med njenim predvajanjem" - -msgctxt "#30024" -msgid "Basic" -msgstr "Osnovno" - -msgctxt "#30025" -msgid "Additional" -msgstr "Dodatno" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.sq_al/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.sq_al/strings.po deleted file mode 100644 index 97eb39f9d..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.sq_al/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Albanian (http://www.transifex.com/projects/p/xbmc-addons/language/sq/)\n" -"Language: sq\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Ruajtës ekrani, që paraqet një shfaqje në seri ‘slideshow’ të imazheve" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Ruajtësi i ekranit ‘Slideshow’ do t'ju paraqesë një shfaqje në seri të imazheve, duke përdorur efekte të ndryshme tranzicioni. Mund të konfigurohet që të shfaqë sfonde të koleksiont të muzikës apo vidjove tuaja, ose imazhe prej një dosjeje të caktuar" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Burimi i imazheve të shfaqjes në seri 'slideshow'" - -msgctxt "#30001" -msgid "Folder" -msgstr "Dosje" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Sfonde për Vidjot" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Sfonde për Muzikën" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Dosja e Imazheve" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Niveli i errësimit" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effekti" - -msgctxt "#30007" -msgid "Slide" -msgstr "Slide" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Crossfade" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Pan dhe zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Koha në sekonda për të treguar çdo imazh" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Shkallëzo imazhet në ekran të plotë" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Trego emrin e imazhit" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Deaktivuar" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Përdor emrin e skedës" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Përdor emrin e dosjes" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Trego imazhe në një rend të rastësishëm" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Trego datën e fotografisë" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Trego tags të tjera shtuëse" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Trego informacionet e muzikës gjatë ridëgjimit" - -msgctxt "#30024" -msgid "Basic" -msgstr "Themelor" - -msgctxt "#30025" -msgid "Additional" -msgstr "Plotsues" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.sr_rs/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.sr_rs/strings.po deleted file mode 100644 index d3f880d41..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.sr_rs/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Serbian (Cyrillic) (http://www.transifex.com/projects/p/xbmc-addons/language/sr_RS/)\n" -"Language: sr_RS\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Фасцикле" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Ниво затамљења" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Онемогућено" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Основно" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.sr_rs@latin/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.sr_rs@latin/strings.po deleted file mode 100644 index e093ec0f9..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.sr_rs@latin/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Serbian (http://www.transifex.com/projects/p/xbmc-addons/language/sr/)\n" -"Language: sr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Fascikle" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Onemogućeno" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "Osnovno" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.sv_se/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.sv_se/strings.po deleted file mode 100644 index ccb62d406..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.sv_se/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2023-10-24 13:11+0000\n" -"Last-Translator: Robert Bylin \n" -"Language-Team: Swedish \n" -"Language: sv_se\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.0.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "En skärmsläckare som visar ett bildspel" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Bildspel är en skärmsläckare som visar ett bildspel med olika övergångseffekter. Den kan ställas in för att visa din musik- eller video-fanart från biblioteket eller en utvald mapp med bilder" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Bildspelskälla" - -msgctxt "#30001" -msgid "Folder" -msgstr "Mapp" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Videofanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Musikfanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Bildmapp" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Nedtoningsnivå" - -msgctxt "#30006" -msgid "Effect" -msgstr "Effekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Bildspel" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Övertoning" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Panorera och zooma" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Antal sekunder att visa varje bild" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Skala bilden till helskärm" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Visa bildnamnet" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Inaktiverad" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Använd filnamnet" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Använd mappnamnet" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Visa bilder i slumpmässig ordning" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Använd mapp- och filnamn" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Visa bilddatum" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Visa ytterligare bildtaggar" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Visa musikinfo under uppspelning" - -msgctxt "#30024" -msgid "Basic" -msgstr "Grundläggande" - -msgctxt "#30025" -msgid "Additional" -msgstr "Ytterligare" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.ta_in/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.ta_in/strings.po deleted file mode 100644 index b37942922..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.ta_in/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-07-22 14:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Tamil (India) \n" -"Language: ta_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "படகாட்சி திரைகாப்பன்" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "படகாட்சி திரைகாப்பன் பல்வேறு படங்களை பல மாற்ற விளைவுகளை பயன்படுத்தி படகாட்சி செய்யும். இது உங்கள் நூலகங்கள் இசை அல்லது வீடியோ விசிறிபடம் அல்லது படக்கொப்புரை படங்களை காட்சியில் காண்பிக்குமாறு செய்யமுடியும்." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "படக்காட்சி படங்களின் மூலம்" - -msgctxt "#30001" -msgid "Folder" -msgstr "கோப்புறை" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "நிகழ்பட விசிறிபடம்" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "இசை விசிறிபடம்" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "பட கோப்புறை" - -msgctxt "#30005" -msgid "Dim level" -msgstr "மங்கு நிலை" - -msgctxt "#30006" -msgid "Effect" -msgstr "விளைவு" - -msgctxt "#30007" -msgid "Slide" -msgstr "சறுக்கு" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "குறுக்குமங்கு" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "இடவல நகர்வு மற்றும் பெரிதாக்கு" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "அடுத்து படம் காண்பிக்க இத்தனை நொடிகள்" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "படங்களை முழுத்திரை அளவுக்கு மாற்று" - -msgctxt "#30012" -msgid "Display image name" -msgstr "பட பெயரை காட்டு" - -msgctxt "#30013" -msgid "Disabled" -msgstr "முடக்கப்பட்டன" - -msgctxt "#30014" -msgid "Use filename" -msgstr "கொப்புபெயரி உபயோகி" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "கோப்புறை பெயரை உபயோகி" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "சீரற்ற வரிசையில் படங்களை காண்பிக்க" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "பட தேதியை காட்டு" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "கூடுதல் படத்தை குறிச்சொற்களை காட்டு" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "ஆடியோ பின்னணி போது இசை தகவல் காட்டு" - -msgctxt "#30024" -msgid "Basic" -msgstr "அடிப்படை" - -msgctxt "#30025" -msgid "Additional" -msgstr "கூடுதலான" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.tg_tj/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.tg_tj/strings.po deleted file mode 100644 index 5c3a0d6ec..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.tg_tj/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: Kodi add-ons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: tg_tj\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.th_th/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.th_th/strings.po deleted file mode 100644 index 65043777f..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.th_th/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Thai (http://www.transifex.com/projects/p/xbmc-addons/language/th/)\n" -"Language: th\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "โฟลเดอร์" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "ระดับการหรี่หน้าจอ" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "เลื่อน" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "ปิดการใช้งาน" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "เบื้องต้น" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.tr_tr/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.tr_tr/strings.po deleted file mode 100644 index c94660c60..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.tr_tr/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Turkish (http://www.transifex.com/projects/p/xbmc-addons/language/tr/)\n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Resim slayt şovu gösteren ekran koruyucu" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Slideshow ekran koruyucu size farklı geçiş efektleriyle resim gösterisi yapar. Müzik kütüphanenizden veya video fanart yada özel bir klasördeki resimlerden seçilebilir." - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Slayt gösterisi resimleri kaynağı" - -msgctxt "#30001" -msgid "Folder" -msgstr "Dizin" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Müzik Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Resim Klasörü" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Karatma düzeyi" - -msgctxt "#30006" -msgid "Effect" -msgstr "Efekt" - -msgctxt "#30007" -msgid "Slide" -msgstr "Kaydır" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Çapraz geçiş" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Kaydır ve yakınlaştır" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Her resim için görüntüleme zamanı miktarı" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Resimleri tam ekrana ölçeklendir" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Resim ismini göster" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Devre dışı" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Dosya ismini kullan" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Dizin ismini kullan" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Resimleri rastgele sırada göster" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "Klasör ve dosya adı kullan" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Fotoğrafın tarihini göster" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Diğer resim etiketlerini göster" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Ses çalma sırasında müzik bilgisini göster" - -msgctxt "#30024" -msgid "Basic" -msgstr "Temel Bilgiler" - -msgctxt "#30025" -msgid "Additional" -msgstr "Ek" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Arka plan resmini görüntüle" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.uk_ua/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.uk_ua/strings.po deleted file mode 100644 index fc966db56..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.uk_ua/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-05-11 22:14+0000\n" -"Last-Translator: A. \n" -"Language-Team: Ukrainian \n" -"Language: uk_ua\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.12.1\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Заставка, що відображує слайд-шоу зі зображень" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Заставка \"Слайд-шоу\" показує зображення по черзі, використовуючи різноманітні ефекти переходу. Заставка може бути налаштована на показ зображень з різних джерел: обкладинок відео фільмів, обкладинок музичних альбомів або будь-яких фото із вказаної користувачем теки" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Джерело зображень для слайдшоу" - -msgctxt "#30001" -msgid "Folder" -msgstr "Папка" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Обкладинки відео фільмів" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Обкладинки музичних альбомів" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Папка із зображеннями" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Рівень затемнення" - -msgctxt "#30006" -msgid "Effect" -msgstr "Ефект" - -msgctxt "#30007" -msgid "Slide" -msgstr "Слайд" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Кросфейд" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Панорамування та масштабування" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Кількість секунд для показу кожного малюнку" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Розширити на весь екран" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Показувати назву малюнка" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Вимкн." - -msgctxt "#30014" -msgid "Use filename" -msgstr "Використати назву файлу" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Використовувати назву теки" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Показувати малюнки у випадковому порядку" - -msgctxt "#30017" -msgid "Use full path" -msgstr "Застосувати повний шлях" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Показати дані малюнка" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Показати додаткові мітки малюнка" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Показувати інформацію про малюнок під час програвання аудіо" - -msgctxt "#30024" -msgid "Basic" -msgstr "Базовий" - -msgctxt "#30025" -msgid "Additional" -msgstr "Додатково" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "Відновити слайд-шоу з останньої позиції" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "Показувати зображення тла" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.uz_uz/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.uz_uz/strings.po deleted file mode 100644 index a3b1f4c92..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.uz_uz/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Uzbek (http://www.transifex.com/projects/p/xbmc-addons/language/uz/)\n" -"Language: uz\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "" - -msgctxt "#30001" -msgid "Folder" -msgstr "Jild" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "" - -msgctxt "#30005" -msgid "Dim level" -msgstr "" - -msgctxt "#30006" -msgid "Effect" -msgstr "" - -msgctxt "#30007" -msgid "Slide" -msgstr "" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "" - -msgctxt "#30012" -msgid "Display image name" -msgstr "" - -msgctxt "#30013" -msgid "Disabled" -msgstr "" - -msgctxt "#30014" -msgid "Use filename" -msgstr "" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "" - -msgctxt "#30024" -msgid "Basic" -msgstr "" - -msgctxt "#30025" -msgid "Additional" -msgstr "" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.vi_vn/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.vi_vn/strings.po deleted file mode 100644 index 48619d46f..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.vi_vn/strings.po +++ /dev/null @@ -1,136 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Kodi Translation Team\n" -"Language-Team: Vietnamese (http://www.transifex.com/projects/p/xbmc-addons/language/vi/)\n" -"Language: vi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "Trình bảo vệ màn hình giống như một trình chiếu ảnh" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "Trình bảo vệ màn hình Slideshow sẽ giúp bạn trình chiếu bộ sưu tập ảnh với các hiệu ứng chuyển đổi đẹp mắt. Bạn có thể tuỳ chỉnh để hiện thông tin về bài hát, video, fanart hoặc một thư mục chứa ảnh bất kì" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "Nguồn ảnh trình chiếu" - -msgctxt "#30001" -msgid "Folder" -msgstr "Thư mục" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "Video Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "Music Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "Thư mục ảnh" - -msgctxt "#30005" -msgid "Dim level" -msgstr "Độ mờ" - -msgctxt "#30006" -msgid "Effect" -msgstr "Hiệu ứng" - -msgctxt "#30007" -msgid "Slide" -msgstr "Ảnh" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "Đan xen dần" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "Di chuyển và zoom" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "Số giây chờ hiển thị mỗi ảnh" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "Giãn hình toàn màn hình" - -msgctxt "#30012" -msgid "Display image name" -msgstr "Hiện tên ảnh" - -msgctxt "#30013" -msgid "Disabled" -msgstr "Đã tắt" - -msgctxt "#30014" -msgid "Use filename" -msgstr "Sử dụng file" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "Sử dụng thư mục" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "Hiện ảnh theo thứ tự ngẫu nhiên" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "Hiện ngày tạo ảnh" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "Hiện thêm các thẻ khác" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "Hiện thông tin bài hát trong lúc nghe" - -msgctxt "#30024" -msgid "Basic" -msgstr "Cơ bản" - -msgctxt "#30025" -msgid "Additional" -msgstr "Thêm" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.zh_cn/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.zh_cn/strings.po deleted file mode 100644 index 31357b541..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.zh_cn/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2022-07-19 09:14+0000\n" -"Last-Translator: taxigps \n" -"Language-Team: Chinese (China) \n" -"Language: zh_cn\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.13\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "幻灯片屏幕保护程序" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "幻灯片屏保将使用各种过渡效果以幻灯片形式显示您的图片。你可以设置它显示音乐或视频资料库同人画,或某个文件夹中的图片" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "幻灯片图片来源" - -msgctxt "#30001" -msgid "Folder" -msgstr "文件夹" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "视频同人画" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "音乐同人画" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "图片文件夹" - -msgctxt "#30005" -msgid "Dim level" -msgstr "变暗级别" - -msgctxt "#30006" -msgid "Effect" -msgstr "特效" - -msgctxt "#30007" -msgid "Slide" -msgstr "幻灯片" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "淡入淡出" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "平移缩放" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "图片显示时间" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "图片缩放为全屏" - -msgctxt "#30012" -msgid "Display image name" -msgstr "显示图片名" - -msgctxt "#30013" -msgid "Disabled" -msgstr "禁用" - -msgctxt "#30014" -msgid "Use filename" -msgstr "使用文件名" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "使用文件夹名" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "以随机顺序显示图片" - -msgctxt "#30017" -msgid "Use full path" -msgstr "使用完整路径" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "使用文件夹和文件名" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "显示图片日期" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "显示附加图片标签" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "在音频播放时显示音乐信息" - -msgctxt "#30024" -msgid "Basic" -msgstr "基本信息" - -msgctxt "#30025" -msgid "Additional" -msgstr "附加的" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "从最后位置恢复幻灯片" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "显示背景图片" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "使用渐晕覆盖" diff --git a/screensaver.picture.slideshow/resources/language/resource.language.zh_tw/strings.po b/screensaver.picture.slideshow/resources/language/resource.language.zh_tw/strings.po deleted file mode 100644 index 043c01dd6..000000000 --- a/screensaver.picture.slideshow/resources/language/resource.language.zh_tw/strings.po +++ /dev/null @@ -1,137 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Picture Slideshow Screensaver -# Addon id: screensaver.picture.slideshow -# Addon Provider: Team-Kodi -msgid "" -msgstr "" -"Project-Id-Version: XBMC Addons\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n" -"PO-Revision-Date: 2021-11-09 11:30+0000\n" -"Last-Translator: JuenTingShie \n" -"Language-Team: Chinese (Taiwan) \n" -"Language: zh_tw\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8.1\n" - -msgctxt "Addon Summary" -msgid "Screensaver that displays an image slideshow" -msgstr "顯示圖片幻燈秀的螢幕保護程式" - -msgctxt "Addon Description" -msgid "The Slideshow screensaver will show you a slide show of images using various transition effects. It can be configured to show your libraries music or video fanart, or a custom folder of images" -msgstr "幻燈片屏幕保護程序可以顯示使用各種過場效果的幻燈片播放。它可以被配置為顯示您的圖書館音樂模式或視頻圖庫,或自行定義的文件夾中的圖像" - -msgctxt "#30000" -msgid "Source of slideshow images" -msgstr "幻燈秀圖片來源" - -msgctxt "#30001" -msgid "Folder" -msgstr "資料夾" - -msgctxt "#30002" -msgid "Video Fanart" -msgstr "視訊 Fanart" - -msgctxt "#30003" -msgid "Music Fanart" -msgstr "音片 Fanart" - -msgctxt "#30004" -msgid "Image Folder" -msgstr "圖片資料夾" - -msgctxt "#30005" -msgid "Dim level" -msgstr "暗化等級" - -msgctxt "#30006" -msgid "Effect" -msgstr "效果" - -msgctxt "#30007" -msgid "Slide" -msgstr "幻燈片" - -msgctxt "#30008" -msgid "Crossfade" -msgstr "淡入淡出" - -msgctxt "#30009" -msgid "Pan and zoom" -msgstr "平移和縮放" - -msgctxt "#30010" -msgid "Amount of seconds to display each image" -msgstr "顯示每張圖片的秒數" - -msgctxt "#30011" -msgid "Scale images fullscreen" -msgstr "等比例圖片放大至全螢幕" - -msgctxt "#30012" -msgid "Display image name" -msgstr "顯示圖片名稱" - -msgctxt "#30013" -msgid "Disabled" -msgstr "關閉" - -msgctxt "#30014" -msgid "Use filename" -msgstr "使用檔案名稱" - -msgctxt "#30015" -msgid "Use foldername" -msgstr "使用資料夾名稱" - -msgctxt "#30016" -msgid "Display images in random order" -msgstr "以隨機順序顯示圖片" - -msgctxt "#30017" -msgid "Use full path" -msgstr "" - -# empty string with id 30017 -msgctxt "#30018" -msgid "Use folder- and filename" -msgstr "" - -# empty strings from id 30019 to 30020 -msgctxt "#30021" -msgid "Display picture date" -msgstr "顯示照片日期" - -msgctxt "#30022" -msgid "Display additional picture tags" -msgstr "顯示額外的照片標籤" - -msgctxt "#30023" -msgid "Display music info during audio playback" -msgstr "在音頻撥放時顯示音樂資訊" - -msgctxt "#30024" -msgid "Basic" -msgstr "基本" - -msgctxt "#30025" -msgid "Additional" -msgstr "額外的" - -msgctxt "#30026" -msgid "Resume slideshow from last position" -msgstr "" - -# empty strings from id 30027 to 30028 -msgctxt "#30029" -msgid "Display background picture" -msgstr "" - -msgctxt "#30030" -msgid "Use vignette overlay" -msgstr "" diff --git a/screensaver.picture.slideshow/resources/settings.xml b/screensaver.picture.slideshow/resources/settings.xml deleted file mode 100644 index b1ff7e1b7..000000000 --- a/screensaver.picture.slideshow/resources/settings.xml +++ /dev/null @@ -1,159 +0,0 @@ - - -
- - - - 0 - 0 - - - - - - - - - - - 0 - - - false - true - - pictures - - - - - 2 - - - - 30001 - - - - - - 0 - 10 - - - 2 - 1 - 100 - - - - 0 - 100 - - false - - - 0 - 1 - 100 - - - - 0 - 2 - - - - - - - - - - - - 0 - false - - - - - - - - 0 - true - - - - 0 - true - - - - 0 - false - - - false - - - - - - - - 0 - true - - - false - - - - - - 0 - false - - - false - - - - - - - - 0 - 0 - - - - - - - - - - - - - 0 - false - - - - 0 - false - - - - 0 - false - - - - -
-
diff --git a/screensaver.picture.slideshow/resources/skins/default/1080i/script-python-slideshow.xml b/screensaver.picture.slideshow/resources/skins/default/1080i/script-python-slideshow.xml deleted file mode 100644 index bcd29a2cc..000000000 --- a/screensaver.picture.slideshow/resources/skins/default/1080i/script-python-slideshow.xml +++ /dev/null @@ -1,315 +0,0 @@ - - - 6 - - - 0 - 0 - 1920 - 1080 - screensaver-black.png - WindowOpen - - - - - - - String.IsEqual(Window.Property(SlideView.Background),show) - - - - - - - - - - 0 - 0 - 1920 - 1080 - - scale - 0 - - - - - - - - - - - - 0 - 0 - 1920 - 1080 - - scale - 0 - - - - Conditional - 0 - 0 - 1920 - 1080 - screensaver-black.png - - - - - - - - - - - - 0 - 0 - 1920 - 1080 - - keep - 0 - - - - - - - - - - - - - - - - - - 0 - 0 - 1920 - 1080 - - keep - 0 - - - - - - - - - - - - - - - - - - 0 - 0 - 1920 - 1080 - - scale - 0 - - - - - - - - - - - - - - - - - - 0 - 0 - 1920 - 1080 - - scale - 0 - - - - - - - - - - 0 - 250 - auto - auto - overlayfade.png - Conditional - String.IsEqual(Window.Property(SlideView.Overlay),show) - - - 1875 - 992 - 900 - 30 - font14 - right - F0FFFFFF - F0000000 - - - 1875 - 1030 - 900 - 30 - font13 - right - C0FFFFFF - F0000000 - - - 45 - 925 - 900 - 135 - font13 - left - C0FFFFFF - C0000000 - ![Player.HasAudio + String.IsEqual(Window.Property(SlideView.Music),show)] - - - 30 - 862 - Conditional - Player.HasAudio + String.IsEqual(Window.Property(SlideView.Music),show) - - 0 - -7 - 210 - 210 - $INFO[MusicPlayer.Cover] - scale - - - 240 - 60 - 900 - 38 - left - font13 - - FFFFFFFF - FF000000 - - - 240 - 95 - 900 - 38 - left - font13 - - FFFFFFFF - FF000000 - - - 240 - 130 - 900 - 38 - left - font13 - - FFFFFFFF - FF000000 - - - 240 - 160 - - 0 - 12 - 150 - 30 - font13 - left - center - - FFFFFFFF - FF000000 - - - Progressbar - 128 - 18 - 300 - 21 - Player.Progress - screensaver-progress.png - screensaver-progress.png - - - - - - 555 - 12 - 150 - 30 - font13 - right - center - - FFFFFFFF - FF000000 - - - - - - 729 - 309 - 461 - 461 - keep - 0 - screensaver-splash.png - Conditional - - - - - - - !String.IsEqual(Window.Property(SlideView.Splash),hide) - - - 0 - 0 - 1920 - 1080 - screensaver-black.png - $INFO[Window.Property(SlideView.Dim)] - - - diff --git a/screensaver.picture.slideshow/resources/skins/default/media/overlayfade.png b/screensaver.picture.slideshow/resources/skins/default/media/overlayfade.png deleted file mode 100644 index 6a0b5b3b2b3b6e94eb9eb792f130cc8f97d492a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0t^gH3>+*#mf~iW2q4wv>EaktaqI1+i@XOEc$hCP zdG$~GFq^KBg2SG=XuIbbF7KyLyx;hI{X+W>=k7Bw7AhX{P@e0#m5o>GmUPFWTQkp@ zOk(dp+I)S96cbaDIm=`LA18yC8x?HCTH^VbfI^&2?5ipt96a&Y-Rkm8m&^+b9G$D1 sjpt^n@Cyhm&pDxS`n-q$2uKL6IGM)&DK>Yn3eZ&yp00i_>zopr0PBH82><{9 diff --git a/screensaver.picture.slideshow/resources/skins/default/media/screensaver-black.png b/screensaver.picture.slideshow/resources/skins/default/media/screensaver-black.png deleted file mode 100644 index fe4043ecf564f292eab0a2ee3537950c0c576e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab7}%9#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmPiryQRK!_<_JDL^3}PZ!4!j_b(@ a3bH_+2?OKu+KqF7ECx?kKbLh*2~7Z|OCGNP diff --git a/screensaver.picture.slideshow/resources/skins/default/media/screensaver-progress.png b/screensaver.picture.slideshow/resources/skins/default/media/screensaver-progress.png deleted file mode 100644 index 27cfd491ac96c102765c0c840c16a1bf23d030d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^EFjDQBAI`LeFahq$sR$z3=CCj3=9n|3=F@3LJcn% z7)lKo7+xhXFj&oCU=S~uvn$XBD8ZEE?e4Eal|aXtCZ{R0qi&Oo~u7(8A5 KT-G@yGywqFv@g>D diff --git a/screensaver.picture.slideshow/resources/skins/default/media/screensaver-splash.png b/screensaver.picture.slideshow/resources/skins/default/media/screensaver-splash.png deleted file mode 100644 index f96605cfdef527bccff63a31996302c4c0d08a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9073 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 g=foe5{-ysWBj3xi - - - - - - - executable - - - scrapes live sport event links from Telegram and seamlessly opens them in the Acestream player - Tired of the endless hunt for live sports event streams? "Are Ace" simplifies the process by scanning Telegram channels and groups known for sharing sports event links, collecting them for you. With an easy integration to the Acestream media player, it ensures you have quick access to high-quality, buffer-free sports event streams. Stay updated effortlessly, and enjoy a user-friendly interface for a seamless sports viewing experience. Say goodbye to the hassle of link searching, and say hello to the convenience of "Are Ace". - MIT - android - https://github.com/pustovitDmytro/areace - dipustovit@gmail.com - - resources/icon.png - resources/fanart.jpg - - - diff --git a/script.areace/resources/data_loader.py b/script.areace/resources/data_loader.py deleted file mode 100644 index 08120a3b6..000000000 --- a/script.areace/resources/data_loader.py +++ /dev/null @@ -1,18 +0,0 @@ -import xbmcaddon -from resources.telegram import fetch - -ADDON = xbmcaddon.Addon() - -def load_telegram(settings): - enabled = settings.getBool('telegram.isEnabled') - if (not enabled): return [] - opts = { - 'token': settings.getString('telegram.token'), - 'offset': settings.getInt('telegram.offset') - } - return fetch(opts) - - -def load_data(): - settings = ADDON.getSettings() - return load_telegram(settings) \ No newline at end of file diff --git a/script.areace/resources/fanart.jpg b/script.areace/resources/fanart.jpg deleted file mode 100644 index 9053d63af2f34e3cabbf108df46a61ba68314edc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446907 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

9F}lE6aZrP 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

(jlc_lS*RR4 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�JPrjm)8pp4#qgT+o;cUKON?-QTGy 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≫hoyo7Za$zwY(sK*3s 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 common caching API for Kodi add-ons. - A common caching API for Kodi add-ons. - - diff --git a/script.common.plugin.cache/changelog.txt b/script.common.plugin.cache/changelog.txt deleted file mode 100644 index addb4054c..000000000 --- a/script.common.plugin.cache/changelog.txt +++ /dev/null @@ -1,75 +0,0 @@ -Version 2.6.2 -[fix] use xbmcvfs.translatePath when available, xbmc.translatePath deprecated(Matrix) and removed(Nexus) |contrib: Gujal00| - -[B]Version 2.6.1[/B] -[fix] shutdown taking longer than 5 seconds -[fix] ignore encoding issues for socket data - -[B]Version 2.6.0[/B] -- Kodi 19 / Python 3 ready -- convert strings.xml to strings.po -- use new language paths ie. ../resource.language.en_gb -- refactor -- housekeeping -- replace icon to resolve transparency issue - -[B]Version 2.5.10[/B] -- Fix self usage in non instance methods - -[B]Version 2.5.9[/B] -- Fix plugin loading on windows uwp -- Replace print with xbmc.log -- Replace except Exception , e with except Exception as e (python3) -- Replace iterkeys with keys (python3) - -[B]Version 2.5.8[/B] -- Fix plugin loading on windows - -[B]Version 2.5.7[/B] -- fixed platform check - -[B]Version 2.5.6[/B] -- fixed common cache not starting on ios/tvos when socket path is to long by using AF_INET instead of AF_POSIX - -[B]Version 2.5.5[/B] -- Fix ascii error with non UTF-8 characters on print statement - -[B]Version 1.5.2[/B] -- Fixed: Dharma error with sqlite. [mswiege] -- User selectable port on windows -- Notification of port/socket collision. - -[B]Version 1.5.1[/B] -- Fixed: Move position of socket and database file back - -[B]Version 1.5.0[/B] -- Changed: Move position of socket and database file - -[B]Version 1.4.0[/B] -- Fixed: edge case where unicode input values would cause cache to crash -- Fixed: Only bind to 127.0.0.1 on windows - -[B]Version 1.3.0[/B] -- Minor fixes - -[B]Version 1.2.0[/B] -- Minor fixes - -[B]Version 1.1.0[/B] -- Minor fixes - -[B]Version 1.0.0[/B] -- Minor fixes - -[B]Version 0.9.2[/B] -- Don't autodetect instancemode -- Set timeout of instancemode in settings - -[B]Version 0.9.1[/B] -- Update interface - -[B]Version 0.9.0[/B] -- Better stability - -[B]Version 0.8.0[/B] -- Initial public test run. diff --git a/script.common.plugin.cache/icon.png b/script.common.plugin.cache/icon.png deleted file mode 100644 index ea42296fd125a1b266d6c55ecba3de2f8987f862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59226 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�ml8 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 diff --git a/script.common.plugin.cache/resources/language/resource.language.en_gb/strings.po b/script.common.plugin.cache/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index 6c7311db5..000000000 --- a/script.common.plugin.cache/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -# XBMC Media Center language file -# Addon Name: Common plugin cache -# Addon id: script.common.plugin.cache -# Addon version: 2.6.0 -# Addon Provider: TheCollective -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: 2019-11-17 15:37+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgctxt "Addon Summary" -msgid "A common caching API for Kodi add-ons." -msgstr "" - -msgctxt "Addon Description" -msgid "A common caching API for Kodi add-ons." -msgstr "" - -msgctxt "#32001" -msgid "General" -msgstr "" - -msgctxt "#32002" -msgid "Debug" -msgstr "" - -msgctxt "#32003" -msgid "Start with Kodi" -msgstr "" - -msgctxt "#32004" -msgid "Timeout in seconds" -msgstr "" - -msgctxt "#32005" -msgid "Listen on Port (Windows only)" -msgstr "" - -msgctxt "#32100" -msgid "Error" -msgstr "" - -msgctxt "#32200" -msgid "Failed to start script.common.plugin.cache" -msgstr "" diff --git a/script.common.plugin.cache/resources/lib/__init__.py b/script.common.plugin.cache/resources/lib/__init__.py deleted file mode 100644 index 9608ed11a..000000000 --- a/script.common.plugin.cache/resources/lib/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2019 anxdpanic - - This file is part of script.common.plugin.cache - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only.txt for more information. -""" - -__all__ = ['entry_point', 'service', 'storage_server'] diff --git a/script.common.plugin.cache/resources/lib/entry_point.py b/script.common.plugin.cache/resources/lib/entry_point.py deleted file mode 100644 index cfd3459a3..000000000 --- a/script.common.plugin.cache/resources/lib/entry_point.py +++ /dev/null @@ -1,16 +0,0 @@ -""" - Cache service for Kodi - Version 0.8 - - Copyright (C) 2010-2011 Tobias Ussing And Henrik Mosgaard Jensen - Copyright (C) 2019 anxdpanic - - This file is part of script.common.plugin.cache - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only.txt for more information. -""" - -import service - -service.run() diff --git a/script.common.plugin.cache/resources/lib/service.py b/script.common.plugin.cache/resources/lib/service.py deleted file mode 100644 index 25474685c..000000000 --- a/script.common.plugin.cache/resources/lib/service.py +++ /dev/null @@ -1,68 +0,0 @@ -""" - Cache service for Kodi - Version 0.8 - - Copyright (C) 2010-2011 Tobias Ussing And Henrik Mosgaard Jensen - Copyright (C) 2019 anxdpanic - - This file is part of script.common.plugin.cache - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only.txt for more information. -""" - -import os -import sys -import threading - -import xbmc -import xbmcaddon -import xbmcgui -import xbmcvfs - -settings = xbmcaddon.Addon(id='script.common.plugin.cache') - - -def run(): - if settings.getSetting("autostart") == "true": - sleep_time = 10 - server_thread = None - - monitor = xbmc.Monitor() - while not monitor.abortRequested(): - if not server_thread: - server_thread = ServerThread() - - if monitor.waitForAbort(sleep_time): - break - - if server_thread: - server_thread.abort() - server_thread.join() - - -class ServerThread(threading.Thread): - def __init__(self): - super(ServerThread, self).__init__() - - self.server = None - - self.daemon = True - self.start() - - def run(self): - addon_path = settings.getAddonInfo('path') - if isinstance(addon_path, bytes): - addon_path = addon_path.decode('utf-8') - - sys.path = [os.path.join(addon_path, "resources", "lib", "storage_server")] + sys.path - - from storage_server import StorageServer - self.server = StorageServer.StorageServer(False) - - xbmc.log("[%s] Service loaded, starting server ..." % self.server.plugin, xbmc.LOGDEBUG) - - self.server.run() - - def abort(self): - self.server.force_abort = True diff --git a/script.common.plugin.cache/resources/lib/storage_server/StorageServer.py b/script.common.plugin.cache/resources/lib/storage_server/StorageServer.py deleted file mode 100644 index 9f6858395..000000000 --- a/script.common.plugin.cache/resources/lib/storage_server/StorageServer.py +++ /dev/null @@ -1,821 +0,0 @@ -""" - Cache service for Kodi - Version 0.8 - - Copyright (C) 2010-2011 Tobias Ussing And Henrik Mosgaard Jensen - Copyright (C) 2019 anxdpanic - - This file is part of script.common.plugin.cache - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only.txt for more information. -""" - -from contextlib import closing -import hashlib -import inspect -import os -import socket -import string -import sys -import time - -import xbmc - -sqlite3 = None -sqlite = None - -try: - import sqlite3 -except ImportError: - sqlite3 = None - try: - import sqlite - except ImportError: - sqlite = None - - -class StorageServer: - def __init__(self, table=None, timeout=24, instance=False): - if hasattr(sys.modules["__main__"], "xbmc"): - self.xbmc = sys.modules["__main__"].xbmc - else: - import xbmc - self.xbmc = xbmc - - if hasattr(sys.modules["__main__"], "xbmcvfs"): - self.xbmcvfs = sys.modules["__main__"].xbmcvfs - else: - import xbmcvfs - self.xbmcvfs = xbmcvfs - - if hasattr(sys.modules["__main__"], "xbmcaddon"): - self.xbmcaddon = sys.modules["__main__"].xbmcaddon - else: - import xbmcaddon - self.xbmcaddon = xbmcaddon - - if hasattr(sys.modules["__main__"], "xbmcgui"): - self.xbmcgui = sys.modules["__main__"].xbmcgui - else: - import xbmcgui - self.xbmcgui = xbmcgui - - if hasattr(self.xbmcvfs, "translatePath"): - self.translate_path = self.xbmcvfs.translatePath - else: - self.translate_path = self.xbmc.translatePath - - self.instance = instance - self._sock = None - self.die = False - self.force_abort = False - - self.settings = self.xbmcaddon.Addon(id='script.common.plugin.cache') - self.language = self.settings.getLocalizedString - - self.dbg = self.settings.getSetting("debug") == "true" - - self.version = to_unicode(self.settings.getAddonInfo('version')) - self.plugin = u"StorageClient-" + self.version - - self.path = to_unicode(self.translate_path('special://temp/')) - if not self.xbmcvfs.exists(self.path): - self._log(u"Making path structure: " + self.path) - self.xbmcvfs.mkdir(self.path) - self.path = os.path.join(self.path, 'commoncache.db') - - self.socket = "" - self.clientsocket = False - self.sql2 = True if sqlite else False - self.sql3 = True if sqlite3 else False - - self.daemon_start_time = time.time() - if self.instance: - self.idle = int(self.settings.getSetting("timeout")) - else: - self.idle = 3 - - self.platform = sys.platform - self.network_buffer_size = 4096 - - if isinstance(table, str) and len(table) > 0: - self.table = ''.join(c for c in table if c in "%s%s" % - (string.ascii_letters, string.digits)) - self._log("Setting table to : %s" % self.table) - elif table is False: - self._log("No table defined") - - self.timeout = float(timeout) * 3600 - - def _startDB(self): - try: - if self.sql3: - self._log("sql3 - " + self.path) - self.conn = sqlite3.connect(self.path, check_same_thread=False) - elif self.sql2: - self._log("sql2 - " + self.path) - self.conn = sqlite.connect(self.path) - else: - self._log("Error, no sql found") - return False - - self.curs = self.conn.cursor() - return True - except Exception as e: - self._log("Exception: " + repr(e)) - self.xbmcvfs.delete(self.path) - return False - - def _aborting(self): - if self.force_abort: - if self._sock: - self._sock.close() - return True - - if self.instance: - if self.die: - return True - else: - return self.xbmc.Monitor().abortRequested() - return False - - def _usePosixSockets(self): - if (self.platform in ["win32", 'win10'] or - xbmc.getCondVisibility('system.platform.android') or - xbmc.getCondVisibility('system.platform.ios') or - xbmc.getCondVisibility('system.platform.tvos')): - return False - else: - return True - - def _sock_init(self, check_stale=False): - if not self.socket or check_stale: - self._log("Checking") - - if self._usePosixSockets(): - self._log("POSIX") - self.socket = os.path.join(to_unicode(self.translate_path('special://temp/')), - 'commoncache.socket') - if self.xbmcvfs.exists(self.socket) and check_stale: - self._log("Deleting stale socket file : " + self.socket) - self.xbmcvfs.delete(self.socket) - else: - self._log("Non-POSIX") - port = self.settings.getSetting("port") - self.socket = ("127.0.0.1", int(port)) - - self._log("Done: " + repr(self.socket)) - - def _recieveData(self): - data = self._recv(self.clientsocket) - self._log("received data: " + data) - - try: - data = eval(data) - except: - self._log("Couldn't evaluate message : " + repr(data)) - data = {"action": "stop"} - - self._log("Done, got data: " + str(len(data)) + " - " + str(repr(data))[0:50]) - return data - - def _runCommand(self, data): - res = "" - if data["action"] == "get": - res = self._sqlGet(data["table"], data["name"]) - elif data["action"] == "get_multi": - res = self._sqlGetMulti(data["table"], data["name"], data["items"]) - elif data["action"] == "set_multi": - res = self._sqlSetMulti(data["table"], data["name"], data["data"]) - elif data["action"] == "set": - res = self._sqlSet(data["table"], data["name"], data["data"]) - elif data["action"] == "del": - res = self._sqlDel(data["table"], data["name"]) - elif data["action"] == "lock": - res = self._lock(data["table"], data["name"]) - elif data["action"] == "unlock": - res = self._unlock(data["table"], data["name"]) - - if len(res) > 0: - self._log("Got response: " + str(len(res)) + " - " + str(repr(res))[0:50]) - self._send(self.clientsocket, repr(res)) - - self._log("Done") - - def _showMessage(self, heading, message): - self._log(repr(type(heading)) + " - " + repr(type(message))) - icon = self.settings.getAddonInfo('icon') - self.xbmcgui.Dialog().notification(heading, message, icon, 10000, sound=False) - - def run(self): - self.plugin = "StorageServer-" + self.version - self._sock_init(True) - - if not self._startDB(): - self._startDB() - - if self._usePosixSockets(): - self._sock = socket.socket(socket.AF_UNIX) - else: - self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - with closing(self._sock) as open_socket: - try: - open_socket.bind(self.socket) - except Exception as e: - self._log("Exception: " + repr(e)) - self._showMessage(self.language(32100), self.language(32200)) - - return False - - open_socket.listen(1) - open_socket.setblocking(0) - - idle_since = time.time() - waiting = 0 - while not self._aborting(): - if waiting == 0: - self._log("accepting") - waiting = 1 - try: - (self.clientsocket, address) = open_socket.accept() - if waiting == 2: - self._log("Waking up, slept for %s seconds." % int(time.time() - idle_since)) - waiting = 0 - except socket.error as e: - if e.errno == 11 or e.errno == 10035 or e.errno == 35: - # There has to be a better way to accomplish this. - if idle_since + self.idle < time.time(): - if self.instance: - self.die = True - if waiting == 1: - self._log("Idle for %s seconds. Going to sleep. zzzzzzzz " % self.idle) - time.sleep(0.5) - waiting = 2 - continue - self._log("EXCEPTION : " + repr(e)) - except: - pass - - if waiting: - self._log("Continue : " + repr(waiting)) - continue - - data = self._recieveData() - self._runCommand(data) - idle_since = time.time() - - self._log("Done") - - self._log("Closing down") - # self.conn.close() - - if self._usePosixSockets(): - if self.xbmcvfs.exists(self.socket): - self._log("Deleting socket file") - self.xbmcvfs.delete(self.socket) - self.xbmc.log(self.plugin + " Closed down") - - def _recv(self, sock): - data = " " - idle = True - - i = 0 - start = time.time() - recv_buffer = "" - while data[len(data) - 2:] != "\r\n" or not idle: - try: - if idle: - recv_buffer = sock.recv(self.network_buffer_size) - idle = False - i += 1 - recv_buffer = recv_buffer.decode('utf-8', 'ignore') - self._log(u"got data : " + str(i) + u" - " + repr(idle) + u" - " + - str(len(data)) + u" + " + str(len(recv_buffer)) + u" | " + - repr(recv_buffer)[len(recv_buffer) - 5:]) - data += recv_buffer - start = time.time() - elif not idle: - if data[len(data) - 2:] == "\r\n": - content = "COMPLETE\r\n" + (" " * (15 - len("COMPLETE\r\n"))) - content = content.encode('utf-8', 'ignore') - sock.send(content) - idle = True - self._log(u"sent COMPLETE " + str(i)) - elif len(recv_buffer) > 0: - content = "ACK\r\n" + (" " * (15 - len("ACK\r\n"))) - content = content.encode('utf-8', 'ignore') - sock.send(content) - idle = True - self._log(u"sent ACK " + str(i)) - self._log(u"status " + repr(not idle) + u" - " + - repr(data[len(data) - 2:] != u"\r\n")) - - except socket.error as e: - if e.errno not in [10035, 35]: - self._log(u"Except error " + repr(e)) - - if e.errno in [22]: # We can't fix this. - return "" - - if start + 10 < time.time(): - self._log(u"over time") - break - - self._log(u"done") - return data.strip() - - def _send(self, sock, data): - idle = True - status = "" - result = "" - self._log(str(len(data)) + u" - " + repr(data)[0:20]) - i = 0 - start = time.time() - while len(data) > 0 or not idle: - send_buffer = " " - try: - if idle: - if len(data) > self.network_buffer_size: - send_buffer = data[:self.network_buffer_size] - else: - send_buffer = data + "\r\n" - send_buffer = send_buffer.encode('utf-8', 'ignore') - result = sock.send(send_buffer) - i += 1 - idle = False - start = time.time() - elif not idle: - status = "" - while status.find("COMPLETE\r\n") == -1 and status.find("ACK\r\n") == -1: - status = sock.recv(15) - status = status.decode('utf-8', 'ignore') - i -= 1 - - idle = True - if len(data) > self.network_buffer_size: - data = data[self.network_buffer_size:] - else: - data = "" - - self._log(u"Got response " + str(i) + u" - " + str(result) + u" == " + - str(len(send_buffer)) + u" | " + str(len(data)) + u" - " + - repr(send_buffer)[len(send_buffer) - 5:]) - - except socket.error as e: - self._log(u"Except error " + repr(e)) - if e.errno != 10035 and e.errno != 35 and e.errno != 107 and e.errno != 32: - self._log(u"Except error " + repr(e)) - if start + 10 < time.time(): - self._log(u"Over time") - break - self._log(u"Done") - return status.find(u"COMPLETE\r\n") > -1 - - def _lock(self, table, name): # This is NOT atomic - self._log(name) - locked = True - curlock = self._sqlGet(table, name) - if curlock.strip(): - if float(curlock) < self.daemon_start_time: - self._log(u"removing stale lock.") - self._sqlExecute("DELETE FROM " + table + " WHERE name = %s", (name,)) - self.conn.commit() - locked = False - else: - locked = False - - if not locked: - self._sqlExecute("INSERT INTO " + table + " VALUES ( %s , %s )", (name, time.time())) - self.conn.commit() - self._log(u"locked: " + to_unicode(name)) - - return "true" - - self._log(u"failed for : " + to_unicode(name)) - return "false" - - def _unlock(self, table, name): - self._log(name) - - self._checkTable(table) - self._sqlExecute("DELETE FROM " + table + " WHERE name = %s", (name,)) - - self.conn.commit() - self._log(u"done") - return "true" - - def _sqlSetMulti(self, table, pre, inp_data): - self._log(pre) - self._checkTable(table) - for name in inp_data: - if self._sqlGet(table, pre + name).strip(): - self._log(u"Update : " + pre + to_unicode(name)) - self._sqlExecute("UPDATE " + table + " SET data = %s WHERE name = %s", - (inp_data[name], pre + name)) - else: - self._log(u"Insert : " + pre + to_unicode(name)) - self._sqlExecute("INSERT INTO " + table + " VALUES ( %s , %s )", - (pre + name, inp_data[name])) - - self.conn.commit() - self._log(u"Done") - return "" - - def _sqlGetMulti(self, table, pre, items): - self._log(pre) - - self._checkTable(table) - ret_val = [] - for name in items: - self._log(pre + name) - self._sqlExecute("SELECT data FROM " + table + " WHERE name = %s", (pre + name)) - - result = "" - for row in self.curs: - self._log(u"Adding : " + str(repr(row[0]))[0:20]) - result = row[0] - ret_val += [result] - - self._log(u"Returning : " + repr(ret_val)) - return ret_val - - def _sqlSet(self, table, name, data): - self._log(name + str(repr(data))[0:20]) - - self._checkTable(table) - if self._sqlGet(table, name).strip(): - self._log(u"Update : " + to_unicode(data)) - self._sqlExecute("UPDATE " + table + " SET data = %s WHERE name = %s", (data, name)) - else: - self._log(u"Insert : " + to_unicode(data)) - self._sqlExecute("INSERT INTO " + table + " VALUES ( %s , %s )", (name, data)) - - self.conn.commit() - self._log(u"Done") - return "" - - def _sqlDel(self, table, name): - self._log(name + u" - " + table) - - self._checkTable(table) - - self._sqlExecute("DELETE FROM " + table + " WHERE name LIKE %s", name) - self.conn.commit() - self._log(u"done") - return "true" - - def _sqlGet(self, table, name): - self._log(name + u" - " + table) - - self._checkTable(table) - self._sqlExecute("SELECT data FROM " + table + " WHERE name = %s", name) - - for row in self.curs: - self._log(u"Returning : " + str(repr(row[0]))[0:20]) - return row[0] - - self._log(u"Returning empty") - return " " - - def _sqlExecute(self, sql, data): - try: - self._log(repr(sql) + u" - " + repr(data)) - if self.sql2: - self.curs.execute(sql, data) - elif self.sql3: - sql = sql.replace("%s", "?") - if isinstance(data, tuple): - self.curs.execute(sql, data) - else: - self.curs.execute(sql, (data,)) - except sqlite3.DatabaseError as e: - if (self.xbmcvfs.exists(self.path) and - (str(e).find("file is encrypted") > -1 or str(e).find("not a database") > -1)): - self._log(u"Deleting broken database file") - self.xbmcvfs.delete(self.path) - self._startDB() - else: - self._log(u"Database error, but database NOT deleted: " + repr(e)) - except: - self._log(u"Uncaught exception") - - def _checkTable(self, table): - try: - self.curs.execute("create table " + table + " (name text unique, data text)") - self.conn.commit() - self._log(u"Created new table") - except: - self._log(u"Passed") - pass - - def _evaluate(self, data): - try: - data = eval(data) # Test json.loads vs eval - return data - except: - self._log(u"Couldn't evaluate message : " + repr(data)) - return "" - - def _generateKey(self, funct, *args): - name = repr(funct) - if name.find(" of ") > -1: - name = name[name.find("method") + 7:name.find(" of ")] - elif name.find(" at ") > -1: - name = name[name.find("function") + 9:name.find(" at ")] - - keyhash = hashlib.md5() - for params in args: - if isinstance(params, dict): - for key in sorted(params.keys()): - if key not in ["new_results_function"]: - val = params[key] - if not isinstance(val, str): - val = str(val) - if isinstance(key, str): - key = key.encode('utf-8') - if isinstance(val, str): - val = val.encode('utf-8') - key_val_pair = b"'%s'='%s'" % (key, val) - keyhash.update(key_val_pair) - elif isinstance(params, list): - hash_list = [] - for el in params: - if not isinstance(el, str): - el = str(el) - if isinstance(el, str): - el = el.encode('utf-8') - hash_list.append(el) - keyhash.update(b",".join([b"%s" % el for el in hash_list])) - else: - if not isinstance(params, str): - params = str(params) - if isinstance(params, str): - params = params.encode('utf-8') - keyhash.update(params) - - name += "|" + keyhash.hexdigest() + "|" - - self._log(u"Done: " + repr(name)) - return name - - def _getCache(self, name, cache): - if name in cache: - if "timeout" not in cache[name]: - cache[name]["timeout"] = 3600 - - if cache[name]["timestamp"] > time.time() - (cache[name]["timeout"]): - self._log(u"Done, found cache : " + to_unicode(name)) - return cache[name]["res"] - else: - self._log(u"Deleting old cache : " + to_unicode(name)) - del (cache[name]) - - self._log(u"Done") - return False - - def _setCache(self, cache, name, ret_val): - if len(ret_val) > 0: - if not isinstance(cache, dict): - cache = {} - cache[name] = {"timestamp": time.time(), - "timeout": self.timeout, - "res": ret_val} - self._log(u"Saving cache: " + name + str(repr(cache[name]["res"]))[0:50]) - self.set("cache" + name, repr(cache)) - self._log(u"Done") - return ret_val - - # EXTERNAL FUNCTIONS - soccon = False - table = False - - def cacheFunction(self, funct=False, *args): - self._log(u"function : " + repr(funct) + u" - table_name: " + repr(self.table)) - if funct and self.table: - name = self._generateKey(funct, *args) - cache = self.get("cache" + name) - - if cache.strip() == "": - cache = {} - else: - cache = self._evaluate(cache) - - ret_val = self._getCache(name, cache) - - if not ret_val: - self._log(u"Running: " + to_unicode(name)) - ret_val = funct(*args) - self._setCache(cache, name, ret_val) - - if ret_val: - self._log(u"Returning result: " + str(len(ret_val))) - self._log(ret_val) - return ret_val - else: - self._log(u"Returning []. Got result: " + repr(ret_val)) - return [] - - self._log(u"Error") - return [] - - def cacheDelete(self, name): - self._log(name) - if self._connect() and self.table: - temp = repr({"action": "del", "table": self.table, "name": "cache" + name}) - self._send(self.soccon, temp) - res = self._recv(self.soccon) - self._log(u"GOT " + repr(res)) - - def cacheClean(self, empty=False): - if self.table: - cache = self.get("cache" + self.table) - - try: - cache = self._evaluate(cache) - except: - self._log(u"Couldn't evaluate message : " + repr(cache)) - - self._log(u"Cache : " + repr(cache)) - if cache: - new_cache = {} - for item in cache: - if (cache[item]["timestamp"] > (time.time() - 3600)) and not empty: - new_cache[item] = cache[item] - else: - self._log(u"Deleting: " + to_unicode(item)) - - self.set("cache", repr(new_cache)) - return True - - return False - - def lock(self, name): - self._log(name) - self._log(self.table) - - if self._connect() and self.table: - data = repr({"action": "lock", "table": self.table, "name": name}) - self._send(self.soccon, data) - res = self._recv(self.soccon) - if res: - res = self._evaluate(res) - - if res == "true": - self._log(u"Done : " + res.strip()) - return True - - self._log(u"Failed") - return False - - def unlock(self, name): - self._log(name) - - if self._connect() and self.table: - data = repr({"action": "unlock", "table": self.table, "name": name}) - self._send(self.soccon, data) - res = self._recv(self.soccon) - if res: - res = self._evaluate(res) - - if res == "true": - self._log(u"Done: " + res.strip()) - return True - - self._log(u"Failed") - return False - - def _connect(self): - self._sock_init() - - if self._usePosixSockets(): - self.soccon = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - else: - self.soccon = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - connected = False - try: - self.soccon.connect(self.socket) - connected = True - except socket.error as e: - if e.errno in [111]: - self._log(u"StorageServer isn't running") - else: - self._log(u"Exception: " + repr(e)) - self._log(u"Exception: " + repr(self.socket)) - - return connected - - def setMulti(self, name, data): - self._log(name) - if self._connect() and self.table: - temp = repr({"action": "set_multi", "table": self.table, "name": name, "data": data}) - res = self._send(self.soccon, temp) - self._log(u"GOT " + repr(res)) - - def getMulti(self, name, items): - self._log(name) - if self._connect() and self.table: - self._send(self.soccon, repr( - { - "action": "get_multi", - "table": self.table, - "name": name, - "items": items - } - )) - self._log(u"Receive") - res = self._recv(self.soccon) - - self._log(u"res : " + str(len(res))) - if res: - res = self._evaluate(res) - - if res == " ": # We return " " as nothing. - return "" - else: - return res - - return "" - - def delete(self, name): - self._log(name) - if self._connect() and self.table: - temp = repr({"action": "del", "table": self.table, "name": name}) - self._send(self.soccon, temp) - res = self._recv(self.soccon) - self._log(u"GOT " + repr(res)) - - def set(self, name, data): - self._log(name) - if self._connect() and self.table: - temp = repr({"action": "set", "table": self.table, "name": name, "data": data}) - res = self._send(self.soccon, temp) - self._log(u"GOT " + repr(res)) - - def get(self, name): - self._log(name) - if self._connect() and self.table: - self._send(self.soccon, repr({"action": "get", "table": self.table, "name": name})) - self._log(u"Receive") - res = self._recv(self.soccon) - - self._log(u"res : " + str(len(res))) - if res: - res = self._evaluate(res) - return res.strip() # We return " " as nothing. Strip it out. - - return "" - - def setCacheTimeout(self, timeout): - self.timeout = float(timeout) * 3600 - - def _log(self, description): - if self.dbg: - try: - self.xbmc.log(u"[%s] %s : '%s'" % - (self.plugin, repr(inspect.stack()[1][3]), description), - self.xbmc.LOGDEBUG) - except: - self.xbmc.log(u"[%s] %s : '%s'" % - (self.plugin, repr(inspect.stack()[1][3]), - repr(description)), self.xbmc.LOGDEBUG) - - -def to_unicode(text): - if isinstance(text, bytes): - return text.decode('utf-8') - return text - - -# Check if this module should be run in instance mode or not. -__workersByName = {} - - -def run_async(func, *args, **kwargs): - from threading import Thread - worker = Thread(target=func, args=args, kwargs=kwargs) - __workersByName[worker.getName()] = worker - worker.start() - return worker - - -def checkInstanceMode(): - if hasattr(sys.modules["__main__"], "xbmcaddon"): - xbmcaddon = sys.modules["__main__"].xbmcaddon - else: - import xbmcaddon - - settings = xbmcaddon.Addon(id='script.common.plugin.cache') - if settings.getSetting("autostart") == "false": - s = StorageServer(table=False, instance=True) - xbmc.log("[%s] Module loaded (instance only), starting server ..." % s.plugin, - xbmc.LOGDEBUG) - run_async(s.run) - return True - else: - return False - - -_ = checkInstanceMode() diff --git a/script.common.plugin.cache/resources/lib/storage_server/__init__.py b/script.common.plugin.cache/resources/lib/storage_server/__init__.py deleted file mode 100644 index 38cc3650b..000000000 --- a/script.common.plugin.cache/resources/lib/storage_server/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2019 anxdpanic - - This file is part of script.common.plugin.cache - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only.txt for more information. -""" - -__all__ = ['StorageServer', 'storageserverdummy'] diff --git a/script.common.plugin.cache/resources/lib/storage_server/storageserverdummy.py b/script.common.plugin.cache/resources/lib/storage_server/storageserverdummy.py deleted file mode 100644 index 77c5818ec..000000000 --- a/script.common.plugin.cache/resources/lib/storage_server/storageserverdummy.py +++ /dev/null @@ -1,40 +0,0 @@ -""" - StorageServer override - Version: 1.0 - - Copyright (C) 2010-2011 Tobias Ussing And Henrik Mosgaard Jensen - Copyright (C) 2019 anxdpanic - - This file is part of script.common.plugin.cache - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only.txt for more information. -""" - - -class StorageServer: - def __init__(self, table, timeout=24): - pass - - def cacheFunction(self, funct=False, *args): - if funct: - return funct(*args) - return [] - - def set(self, name, data): - return "" - - def get(self, name): - return "" - - def setMulti(self, name, data): - return "" - - def getMulti(self, name, items): - return "" - - def lock(self, name): - return False - - def unlock(self, name): - return False diff --git a/script.common.plugin.cache/resources/settings.xml b/script.common.plugin.cache/resources/settings.xml deleted file mode 100644 index 6865ba1f8..000000000 --- a/script.common.plugin.cache/resources/settings.xml +++ /dev/null @@ -1,38 +0,0 @@ - - -
- - - - 0 - false - - - - 0 - true - - - - 0 - 59994 - - 32005 - - - - 0 - 15 - - - true - - - - 32004 - - - - -
-
diff --git a/script.copacetic.helper/LICENSE.txt b/script.copacetic.helper/LICENSE.txt deleted file mode 100644 index 61d18602b..000000000 --- a/script.copacetic.helper/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ -GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. \ No newline at end of file diff --git a/script.copacetic.helper/README.md b/script.copacetic.helper/README.md deleted file mode 100644 index e9fac0fa1..000000000 --- a/script.copacetic.helper/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Copacetic Helper [![License](https://img.shields.io/badge/License-GPLv3-blue)](https://github.com/realcopacetic/script.copacetic.helper/blob/main/LICENSE.txt) - -All code contained in this project is licensed under GPL 3.0. - -### Credit ---- -* __sualfred__ for [script.embuary.helper](https://github.com/sualfred/script.embuary.helper), which served as the basis for several parts of this addon. The script and service sections are completely rewritten/modified, but some of the code and structure of the plugin section remains a very simplified version of Sualfred's work. Credit included in each file where code remains. - -* __Dodi Achmad on Unsplash__ for image used in addon [fanart.jpg](https://unsplash.com/photos/3qaojaP-6cE). Free for use under Unsplash licence. - -### Special thanks ---- -* __jurialmunkey__ for all the best-practice code examples from [plugin.video.themoviedb.helper](https://github.com/jurialmunkey/plugin.video.themoviedb.helper) and forum support. - -### Changelog - -**1.0.8** -- Push dbid of corresponding cropped clearlogo to window prop for comparison so cropped clearlogos only show on correct listitems. - -**1.0.7** -- Add tvguide to SlideShowMonitor() whitelist - -**1.0.6** -- Moved director/writer/studio/genre splitting to monitoring service - -**1.0.5** -- Added script for easily re-ordering widgets in Copacetic settings screen - -**1.0.4** -- Return dominant colour for home widgets when clearlogo cropper is active -- Added fanart multiart to backgtround slideshows - -**1.0.3** -- Updated fanart. - -**1.0.2** -- Fixes for errors flagged by Kodi Addon Checker workflow during submission process. - -**1.0.1** -- Fix for an error when the label passessd to the function clean_filename() was not escaped properly. Now to avoid the issue, by default, if no label is provided, the function will pull the listitem label directly using xbmc.getInfoLabel('ListItem.Label') - -**1.0.0** -- Initial release. \ No newline at end of file diff --git a/script.copacetic.helper/addon.xml b/script.copacetic.helper/addon.xml deleted file mode 100644 index 5af3e408f..000000000 --- a/script.copacetic.helper/addon.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - video - - - executable - - - - all - GPL-3.0-or-later - - resources/icon.png - resources/fanart.jpg - - Extend the power of Copacetic - Helper script for the skin Copacetic. - - diff --git a/script.copacetic.helper/plugin.py b/script.copacetic.helper/plugin.py deleted file mode 100644 index 6a94d4679..000000000 --- a/script.copacetic.helper/plugin.py +++ /dev/null @@ -1,6 +0,0 @@ -# author: realcopacetic, sualfred - -from resources.lib.plugin.main import Main - -if __name__ == '__main__': - Main() diff --git a/script.copacetic.helper/resources/fanart.jpg b/script.copacetic.helper/resources/fanart.jpg deleted file mode 100644 index 87cb056562a7cb53e2c436ef047d074df5e8dfc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 583161 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

R9@RB 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

)>RDbZ6)9l~dlnW))_G|J*tZKMy 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 z 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�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

DtUu2 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%0DvIj*#Q%_G4(Mh(qSThZ>CU# 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 `YYK5h7OaK%4J@KgB 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 Hb6Ee`@{h_D diff --git a/script.copacetic.helper/resources/icon.png b/script.copacetic.helper/resources/icon.png deleted file mode 100644 index 90863a45e2b4d75737e38b39ae51a28c1b6fa4fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25327 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 HTSoi`!*vNV diff --git a/script.copacetic.helper/resources/language/resource.language.en_gb/strings.po b/script.copacetic.helper/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index 381d905f6..000000000 --- a/script.copacetic.helper/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,114 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Copacetic Helper -# Addon id: script.copacetic.helper -# Addon Provider: realcopacetic -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - - - - -######################################################################################################### -#: Contents - -#: SETTINGS 320XX -#: SERVICE 322XX -#: SCRIPT 324XX -#: PLUGIN 326XX - - - - -######################################################################################################### - -#: SETTINGS 320XX - -######################################################################################################### - -#: /resources/settings.xml -msgctxt "#32000" -msgid "Copacetic" -msgstr "" - -#: /resources/settings.xml -msgctxt "#32001" -msgid "General" -msgstr "" - -#: /resources/settings.xml -msgctxt "#32002" -msgid "Debug" -msgstr "" - -#: /resources/settings.xml -msgctxt "#32003" -msgid "Enable logging" -msgstr "" - -#: /resources/settings.xml -msgctxt "#32004" -msgid "- Include json call/response logging" -msgstr "" - - - - -######################################################################################################### - -#: SERVICE 322XX - -######################################################################################################### - -#: /resources/settings.xml -msgctxt "#32201" -msgid "Cropped cache cleared" -msgstr "" - -#: /resources/settings.xml -msgctxt "#32202" -msgid "saved" -msgstr "" - -#: /resources/settings.xml -msgctxt "#32203" -msgid "setting changed" -msgstr "" - -#: /resources/settings.xml -msgctxt "#32204" -msgid "settings changed" -msgstr "" - - - - -######################################################################################################### - -#: PLUGIN 326XX - -######################################################################################################### - -#: /resources/lib/content.py -msgctxt "#32600" -msgid "Next up" -msgstr "" - -#: /resources/lib/content.py -msgctxt "#32601" -msgid "Continue watching" -msgstr "" - -#: /resources/lib/content.py -msgctxt "#32602" -msgid "Director credits" -msgstr "" - -#: /resources/lib/content.py -msgctxt "#32603" -msgid "Actor credits" -msgstr "" diff --git a/script.copacetic.helper/resources/lib/plugin/content.py b/script.copacetic.helper/resources/lib/plugin/content.py deleted file mode 100644 index d513dc1da..000000000 --- a/script.copacetic.helper/resources/lib/plugin/content.py +++ /dev/null @@ -1,269 +0,0 @@ -# author: realcopacetic, sualfred - -from resources.lib.plugin.json_map import JSON_MAP -from resources.lib.plugin.library import * -from resources.lib.utilities import (ADDON, infolabel, json_call, log, - set_plugincontent) - - -class PluginContent(object): - def __init__(self, params, li): - self.dbtitle = params.get('title') - self.dbtype = params.get('type') - self.limit = params.get('limit') - self.label = params.get('label') - self.exclude_key = params.get('exclude_key') - self.exclude_value = params.get('exclude_value') - self.li = li - - if not self.exclude_key: - self.exclude_key = 'title' - - if self.limit: - self.limit = int(self.limit) - - if self.dbtype: - if self.dbtype in ['movie', 'tvshow', 'season', 'episode', 'musicvideo']: - library = 'Video' - else: - library = 'Audio' - - self.method_details = f'{library}Library.Get{self.dbtype}Details' - self.method_item = f'{library}Library.Get{self.dbtype}s' - self.param = f'{self.dbtype}id' - self.key_details = f'{self.dbtype}details' - self.key_items = f'{self.dbtype}s' - self.properties = JSON_MAP.get(f'{self.dbtype}_properties') - - self.sort_lastplayed = {'order': 'descending', 'method': 'lastplayed'} - self.sort_recent = {'order': 'descending', 'method': 'dateadded'} - self.sort_year = {'order': 'descending', 'method': 'year'} - self.sort_random = {'method': 'random'} - - self.filter_unwatched = {'field': 'playcount', - 'operator': 'lessthan', 'value': '1'} - self.filter_watched = {'field': 'playcount', - 'operator': 'greaterthan', 'value': '0'} - self.filter_unwatched_episodes = { - 'field': 'numwatched', 'operator': 'lessthan', 'value': ['1']} - self.filter_watched_episodes = { - 'field': 'numwatched', 'operator': 'greaterthan', 'value': ['0']} - self.filter_no_specials = {'field': 'season', - 'operator': 'greaterthan', 'value': '0'} - self.filter_inprogress = { - 'field': 'inprogress', 'operator': 'true', 'value': ''} - self.filter_not_inprogress = { - 'field': 'inprogress', 'operator': 'false', 'value': ''} - self.filter_title = {'field': 'title', - 'operator': 'is', 'value': self.dbtitle} - self.filter_director = {'field': 'director', - 'operator': 'is', 'value': self.label} - self.filter_actor = {'field': 'actor', - 'operator': 'is', 'value': self.label} - if self.exclude_value: - self.filter_exclude = {'field': self.exclude_key, - 'operator': 'isnot', 'value': self.exclude_value} - - def in_progress(self): - filters = [self.filter_inprogress] - - if self.dbtype != 'tvshow': - json_query = json_call('VideoLibrary.GetMovies', - properties=JSON_MAP['movie_properties'], - sort=self.sort_lastplayed, - query_filter={'and': filters}, - parent='in_progress' - ) - try: - json_query = json_query['result']['movies'] - except Exception: - log('Widget in_progress: No movies found.') - else: - add_items(self.li, json_query, type='movie') - - if self.dbtype != 'movie': - json_query = json_call('VideoLibrary.GetEpisodes', - properties=JSON_MAP['episode_properties'], - sort=self.sort_lastplayed, - query_filter={'and': filters}, - parent='in_progress' - ) - try: - json_query = json_query['result']['episodes'] - except Exception: - log('Widget in_progress: No episodes found.') - else: - for episode in json_query: - tvshowid = episode.get('tvshowid') - tvshow_json_query = json_call( - 'VideoLibrary.GetTVShowDetails', - params={'tvshowid': tvshowid}, - properties=['studio', 'mpaa'], - parent='in_progress' - ) - try: - tvshow_json_query = tvshow_json_query['result']['tvshowdetails'] - except Exception: - log(f'Widget in_progress: Parent tv show not found --> {tvshowid}') - else: - episode['studio'] = tvshow_json_query.get('studio') - episode['mpaa'] = tvshow_json_query.get('mpaa') - add_items(self.li, json_query, type='episode') - set_plugincontent(content='movies', - category=ADDON.getLocalizedString(32601)) - - def next_up(self): - filters = [self.filter_inprogress] - - json_query = json_call('VideoLibrary.GetTVShows', - properties=['title', 'lastplayed', - 'studio', 'mpaa'], - sort=self.sort_lastplayed, limit=25, - query_filter={'and': filters}, - parent='next_up' - ) - - try: - json_query = json_query['result']['tvshows'] - except Exception: - log('Widget next_up: No TV shows found') - return - - for episode in json_query: - use_last_played_season = True - studio = episode.get('studio', '') - mpaa = episode.get('mpaa', '') - last_played_query = json_call('VideoLibrary.GetEpisodes', - properties=['seasonid', 'season'], - sort={'order': 'descending', 'method': 'lastplayed'}, limit=1, - query_filter={'and': [ - {'or': [self.filter_inprogress, self.filter_watched]}, self.filter_no_specials]}, - params={'tvshowid': int( - episode['tvshowid'])}, - parent='next_up' - ) - - if last_played_query['result']['limits']['total'] < 1: - use_last_played_season = False - - ''' Return the next episode of last played season''' - if use_last_played_season: - episode_query = json_call('VideoLibrary.GetEpisodes', - properties=JSON_MAP['episode_properties'], - sort={'order': 'ascending', 'method': 'episode'}, limit=1, - query_filter={'and': [self.filter_unwatched, {'field': 'season', 'operator': 'is', 'value': str( - last_played_query['result']['episodes'][0].get('season'))}]}, - params={'tvshowid': int( - episode['tvshowid'])}, - parent='next_up' - ) - - if episode_query['result']['limits']['total'] < 1: - use_last_played_season = False - - ''' If no episode is left of the last played season, fall back to the very first unwatched episode''' - if not use_last_played_season: - episode_query = json_call('VideoLibrary.GetEpisodes', - properties=JSON_MAP['episode_properties'], - sort={'order': 'ascending', 'method': 'episode'}, limit=1, - query_filter={ - 'and': [self.filter_unwatched, self.filter_no_specials]}, - params={'tvshowid': int( - episode['tvshowid'])}, - parent='next_up' - ) - - try: - episode_details = episode_query['result']['episodes'] - except Exception: - log( - f"Widget next_up: No next episodes found for {episode['title']}") - else: - ''' Add tv show studio and mpaa to episode dictionary ''' - episode_details[0]['studio'] = studio - episode_details[0]['mpaa'] = mpaa - add_items(self.li, episode_details, type='episode') - set_plugincontent(content='episodes', - category=ADDON.getLocalizedString(32600)) - - def director_credits(self): - filters = [self.filter_director] - if self.filter_exclude: - filters.append(self.filter_exclude) - - json_query = json_call('VideoLibrary.GetMovies', - properties=JSON_MAP['movie_properties'], - sort=self.sort_year, - query_filter={'and': filters}, - parent='director_credits' - ) - - try: - json_query = json_query['result']['movies'] - except Exception: - log('Widget director_credits: No movies found.') - else: - add_items(self.li, json_query, type='movie') - - json_query = json_call('VideoLibrary.GetMusicVideos', - properties=JSON_MAP['musicvideo_properties'], - sort=self.sort_year, - query_filter={'and': filters}, - parent='director_credits' - ) - - try: - json_query = json_query['result']['musicvideos'] - except Exception: - log('Widget director_credits: No music videos found.') - else: - add_items(self.li, json_query, type='musicvideo') - - set_plugincontent(content='videos', - category=ADDON.getLocalizedString(32602)) - - def actor_credits(self): - filters = [self.filter_actor] - current_item = infolabel('ListItem.Label') - - movies_json_query = json_call('VideoLibrary.GetMovies', - properties=JSON_MAP['movie_properties'], - sort=self.sort_year, - query_filter={'and': filters}, - parent='actor_credits' - ) - - tvshows_json_query = json_call('VideoLibrary.GetTVShows', - properties=JSON_MAP['tvshow_properties'], - sort=self.sort_year, - query_filter={'and': filters}, - parent='actor_credits' - ) - - total_items = int(movies_json_query['result']['limits']['total']) + int( - tvshows_json_query['result']['limits']['total']) - - try: - movies_json_query = movies_json_query['result']['movies'] - except Exception: - log(f'Widget actor_credits: No movies found for {self.label}.') - else: - dict_to_remove = next( - (item for item in movies_json_query if item['label'] == current_item), None) - movies_json_query.remove( - dict_to_remove) if dict_to_remove is not None and total_items > 1 else None - add_items(self.li, movies_json_query, type='movie') - - try: - tvshows_json_query = tvshows_json_query['result']['tvshows'] - except Exception: - log(f'Widget actor_credits: No tv shows found for {self.label}.') - else: - dict_to_remove = next( - (item for item in tvshows_json_query if item['label'] == current_item), None) - tvshows_json_query.remove( - dict_to_remove) if dict_to_remove is not None and total_items > 1 else None - add_items(self.li, tvshows_json_query, type='tvshow') - - set_plugincontent(content='videos', - category=ADDON.getLocalizedString(32603)) diff --git a/script.copacetic.helper/resources/lib/plugin/json_map.py b/script.copacetic.helper/resources/lib/plugin/json_map.py deleted file mode 100644 index df11cc8b7..000000000 --- a/script.copacetic.helper/resources/lib/plugin/json_map.py +++ /dev/null @@ -1,256 +0,0 @@ -# author: realcopacetic, sualfred - -JSON_MAP = { - 'movie_properties': [ - "title", - #"genre", - "year", - #"rating", - #"director", - "trailer", - #"tagline", - #"plot", - #"plotoutline", - #"originaltitle", - "lastplayed", - "playcount", - #"writer", - "studio", - "mpaa", - #"cast", - #"country", - #"imdbnumber", - "runtime", - #"set", - #"showlink", - "streamdetails", - #"top250", - #"votes", - #"fanart", - #"thumbnail", - "file", - #"sorttitle", - "resume", - #"setid", - #"dateadded", - #"tag", - "art" - #"userrating", - #"ratings", - #"premiered", - #"uniqueid" - ], - - 'episode_properties': [ - "title", - #"plot", - #"votes", - #"rating", - #"writer", - "firstaired", - "playcount", - "runtime", - #"director", - #"productioncode", - "season", - "episode", - #"originaltitle", - "showtitle", - #"cast", - "streamdetails", - "lastplayed", - #"fanart", - #"thumbnail", - "file", - "resume", - "tvshowid", - #"dateadded", - #"uniqueid", - "art" - #"specialsortseason", - #"specialsortepisode", - #"userrating", - #"seasonid", - #"ratings" - ], - - 'tvshow_properties': [ - "title", - #"genre", - "year", - #"rating", - #"plot", - "studio", - "mpaa", - #"cast", - #"playcount", - "episode", - #"imdbnumber", - #"premiered", - #"votes", - "lastplayed", - #"fanart", - #"thumbnail", - "file", - #"originaltitle", - #"sorttitle", - #"episodeguide", - "season", - "watchedepisodes", - #"dateadded", - #"tag", - "art" - #"userrating", - #"ratings", - #"runtime", - #"uniqueid" - ], - - 'musicvideo_properties': [ - "title", - "playcount", - "runtime", - #"director", - "studio", - "year", - #"plot", - #"album", - "artist", - #"genre", - #"track", - "streamdetails", - "lastplayed", - #"fanart", - #"thumbnail", - "file", - "resume", - #"dateadded", - #"tag", - "art" - #"rating", - #"userrating", - #"premiered" - ], - - 'season_properties': [ - "season", - "showtitle", - "playcount", - "episode", - "fanart", - "thumbnail", - "tvshowid", - "watchedepisodes", - "art", - "userrating", - "title" - ], - - 'artist_properties': [ - 'instrument', - 'style', - 'mood', - 'born', - 'formed', - 'description', - 'genre', - 'died', - 'disbanded', - 'yearsactive', - 'musicbrainzartistid', - 'fanart', - 'thumbnail', - 'compilationartist', - 'dateadded', - 'roles', - 'songgenres', - 'isalbumartist' - ], - - 'playlist_properties': [ - 'title', - 'artist', - 'albumartist', - 'genre', - 'year', - 'rating', - 'album', - 'track', - 'duration', - 'comment', - 'lyrics', - 'musicbrainztrackid', - 'musicbrainzartistid', - 'musicbrainzalbumid', - 'musicbrainzalbumartistid', - 'playcount', - 'fanart', - 'director', - 'trailer', - 'tagline', - 'plot', - 'plotoutline', - 'originaltitle', - 'lastplayed', - 'writer', - 'studio', - 'mpaa', - 'cast', - 'country', - 'imdbnumber', - 'premiered', - 'productioncode', - 'runtime', - 'set', - 'showlink', - 'streamdetails', - 'top250', - 'votes', - 'firstaired', - 'season', - 'episode', - 'showtitle', - 'thumbnail', - 'file', - 'resume', - 'artistid', - 'albumid', - 'tvshowid', - 'setid', - 'watchedepisodes', - 'disc', - 'tag', - 'art', - 'genreid', - 'displayartist', - 'albumartistid', - 'description', - 'theme', - 'mood', - 'style', - 'albumlabel', - 'sorttitle', - 'episodeguide', - 'uniqueid', - 'dateadded', - 'channel', - 'channeltype', - 'hidden', - 'locked', - 'channelnumber', - 'starttime', - 'endtime', - 'specialsortseason', - 'specialsortepisode', - 'compilation', - 'releasetype', - 'albumreleasetype', - 'contributors', - 'displaycomposer', - 'displayconductor', - 'displayorchestra', - 'displaylyricist', - 'userrating' - ] - -} diff --git a/script.copacetic.helper/resources/lib/plugin/library.py b/script.copacetic.helper/resources/lib/plugin/library.py deleted file mode 100644 index 5ba45a098..000000000 --- a/script.copacetic.helper/resources/lib/plugin/library.py +++ /dev/null @@ -1,147 +0,0 @@ -# author: realcopacetic, sualfred - -import xbmc -from xbmcgui import ListItem - - -def add_items(li, json_query, type): - for item in json_query: - if type == 'movie': - set_movie(li, item) - elif type == 'tvshow': - set_tvshow(li, item) - elif type == 'episode': - set_episode(li, item) - elif type == 'musicvideo': - set_musicvideo(li, item) - - -def set_movie(li, item): - li_item = ListItem(item['title'], offscreen=True) - videoInfoTag = li_item.getVideoInfoTag() - videoInfoTag.setDbId(item['movieid']) - videoInfoTag.setDuration(item['runtime']) - videoInfoTag.setLastPlayed(item['lastplayed']) - videoInfoTag.setMediaType('movie') - videoInfoTag.setPlaycount(item['playcount']) - videoInfoTag.setResumePoint( - item['resume']['position'], item['resume']['total'] - ) - videoInfoTag.setTitle(item['title']) - videoInfoTag.setTrailer(item['trailer']) - videoInfoTag.setYear(item['year']) - videoInfoTag.setStudios(item['studio']) - videoInfoTag.setMpaa(item['mpaa']) - for key, value in iter(list(item['streamdetails'].items())): - for stream in value: - if 'video' in key: - videostream = xbmc.VideoStreamDetail(**stream) - videoInfoTag.addVideoStream(videostream) - elif 'audio' in key: - audiostreamlist = list(stream.values()) - audiostream = xbmc.AudioStreamDetail(*audiostreamlist) - videoInfoTag.addAudioStream(audiostream) - - li_item.setArt(item['art']) - li_item.setArt({'icon': 'DefaultMovies.png'}) - li.append((item['file'], li_item, False)) - - -def set_tvshow(li, item): - season = item['season'] - episode = int(item['episode']) - watchedepisodes = int(item['watchedepisodes']) - li_item = ListItem(item['title'], offscreen=True) - videoInfoTag = li_item.getVideoInfoTag() - videoInfoTag.setDbId(item['tvshowid']) - videoInfoTag.setLastPlayed(item['lastplayed']) - videoInfoTag.setMediaType('tvshow') - videoInfoTag.setTitle(item['title']) - videoInfoTag.setYear(item['year']) - videoInfoTag.setStudios(item['studio']) - videoInfoTag.setMpaa(item['mpaa']) - if episode > 0 and watchedepisodes > 0: - watchedepisodepercent = int(((watchedepisodes / episode) * 100)) - else: - watchedepisodepercent = 0 - - if episode > watchedepisodes: - unwatchedepisodes = int(episode - watchedepisodes) - else: - unwatchedepisodes = 0 - - li_item.setProperty('totalseasons', str(season)) - li_item.setProperty('totalepisodes', str(episode)) - li_item.setProperty('watchedepisodes', str(watchedepisodes)) - li_item.setProperty('unwatchedepisodes', str(unwatchedepisodes)) - li_item.setProperty('watchedepisodepercent', str(watchedepisodepercent)) - li_item.setArt(item['art']) - li_item.setArt({'icon': 'DefaultTVShows.png'}) - li.append((item['file'], li_item, True)) - - -def set_episode(li, item): - if item['episode'] < 10: - episode_number = f"0{item['episode']}" - else: - episode_number = item['episode'] - label = f"{item['season']}x{episode_number}" - li_item = ListItem(label, offscreen=True) - videoInfoTag = li_item.getVideoInfoTag() - videoInfoTag.setDbId(item['episodeid']) - videoInfoTag.setDuration(item['runtime']) - videoInfoTag.setEpisode(item['episode']) - videoInfoTag.setLastPlayed(item['lastplayed']) - videoInfoTag.setMediaType('episode') - videoInfoTag.setPlaycount(item['playcount']) - videoInfoTag.setPremiered(item['firstaired']) - videoInfoTag.setResumePoint( - item['resume']['position'], item['resume']['total'] - ) - videoInfoTag.setSeason(item['season']) - videoInfoTag.setTitle(item['title']) - videoInfoTag.setTvShowTitle(item['showtitle']) - videoInfoTag.setStudios(item['studio']) - videoInfoTag.setMpaa(item['mpaa']) - for key, value in iter(list(item['streamdetails'].items())): - for stream in value: - if 'video' in key: - videostream = xbmc.VideoStreamDetail(**stream) - videoInfoTag.addVideoStream(videostream) - elif 'audio' in key: - audiostreamlist = list(stream.values()) - audiostream = xbmc.AudioStreamDetail(*audiostreamlist) - videoInfoTag.addAudioStream(audiostream) - - li_item.setArt(item['art']) - li_item.setArt({'icon': 'DefaultTVShows.png'}) - li.append((item['file'], li_item, False)) - - -def set_musicvideo(li, item): - li_item = ListItem(item['title'], offscreen=True) - videoInfoTag = li_item.getVideoInfoTag() - videoInfoTag.setArtists(item['artist']) - videoInfoTag.setDbId(item['musicvideoid']) - videoInfoTag.setDuration(item['runtime']) - videoInfoTag.setLastPlayed(item['lastplayed']) - videoInfoTag.setMediaType('musicvideo') - videoInfoTag.setResumePoint( - item['resume']['position'], item['resume']['total'] - ) - videoInfoTag.setPlaycount(item['playcount']) - videoInfoTag.setTitle(item['title']) - videoInfoTag.setYear(item['year']) - for key, value in iter(list(item['streamdetails'].items())): - for stream in value: - if 'video' in key: - videostream = xbmc.VideoStreamDetail(**stream) - videoInfoTag.addVideoStream(videostream) - elif 'audio' in key: - audiostreamlist = list(stream.values()) - audiostream = xbmc.AudioStreamDetail(*audiostreamlist) - videoInfoTag.addAudioStream(audiostream) - - li_item.setArt(item['art']) - li_item.setArt({'icon': 'DefaultVideo.png'}) - li.append((item['file'], li_item, False)) diff --git a/script.copacetic.helper/resources/lib/plugin/listing.py b/script.copacetic.helper/resources/lib/plugin/listing.py deleted file mode 100644 index 33112fd2a..000000000 --- a/script.copacetic.helper/resources/lib/plugin/listing.py +++ /dev/null @@ -1,47 +0,0 @@ -# author: realcopacetic, sualfred - -import sys -from urllib.parse import urlencode - -import xbmcgui - -from resources.lib.utilities import ADDON, ADDON_ID, set_plugincontent - -LISTING = { - 'mixed': [ - {'name': ADDON.getLocalizedString(32601), 'info': 'in_progress'} - ], - 'tvshow': [ - {'name': ADDON.getLocalizedString(32600), 'info': 'next_up'} - ] -} - - -class PluginListing(object): - def __init__(self, params, li): - self.li = li - self.list_widgets() - - def list_widgets(self): - for category, widgets in list(LISTING.items()): - for item in widgets: - url = self._encode_url(info=item.get('info'), type=category) - self.plugin_category = item['name'] - self._add_item(item['name'], url) - - def _encode_url(self, **kwargs): - empty_keys = [key for key, value in list( - kwargs.items()) if not value or value is None] - for key in empty_keys: - del kwargs[key] - return '{0}?{1}'.format(sys.argv[0], urlencode(kwargs)) - - def _add_item(self, label, url): - icon = 'special://home/addons/' + ADDON_ID + '/resources/icon.png' - li_item = xbmcgui.ListItem(label=label, offscreen=True) - videoInfoTag = li_item.getVideoInfoTag() - videoInfoTag.setTitle(label) - videoInfoTag.setMediaType('video') - li_item.setArt({'icon': 'DefaultAddonVideo.png', 'thumb': icon}) - self.li.append((url, li_item, True)) - set_plugincontent(content='', category=self.plugin_category) diff --git a/script.copacetic.helper/resources/lib/plugin/main.py b/script.copacetic.helper/resources/lib/plugin/main.py deleted file mode 100644 index 9dd5dd913..000000000 --- a/script.copacetic.helper/resources/lib/plugin/main.py +++ /dev/null @@ -1,58 +0,0 @@ -# author: realcopacetic, sualfred - -import urllib.parse as urllib - -import xbmcplugin - -from resources.lib.plugin.content import * -from resources.lib.utilities import sys -from resources.lib.plugin.listing import PluginListing - - -class Main: - def __init__(self): - self._parse_argv() - self.info = self.params.get('info') - self.action = self.params.get('action') - if self.info: - self.getinfos() - elif self.action: - self.actions() - else: - self.listing() - - def _parse_argv(self): - path = sys.argv[2] - - try: - args = path[1:] - self.params = dict(urllib.parse_qsl(args)) - - ''' Workaround to get the correct values for titles with special characters - ''' - if ('title=\'\"' and '\"\'') in args: - start_pos = args.find('title=\'\"') - end_pos = args.find('\"\'') - clean_title = args[start_pos+8:end_pos] - self.params['title'] = clean_title - - except Exception: - self.params = {} - - def getinfos(self): - li = list() - plugin = PluginContent(self.params, li) - self._execute(plugin, self.info) - self._additems(li) - - def listing(self): - li = list() - PluginListing(self.params,li) - self._additems(li) - - def _execute(self, plugin, action): - getattr(plugin, action.lower())() - - def _additems(self, li): - xbmcplugin.addDirectoryItems(int(sys.argv[1]), li) - xbmcplugin.endOfDirectory(handle=int(sys.argv[1])) \ No newline at end of file diff --git a/script.copacetic.helper/resources/lib/script/actions.py b/script.copacetic.helper/resources/lib/script/actions.py deleted file mode 100644 index c76151d55..000000000 --- a/script.copacetic.helper/resources/lib/script/actions.py +++ /dev/null @@ -1,344 +0,0 @@ -# author: realcopacetic - -from resources.lib.service.art import ImageEditor -from resources.lib.utilities import (DIALOG, clear_playlists, condition, - infolabel, json_call, log_and_execute, - skin_string, window_property, xbmc) - - -def clean_filename(label=False, **kwargs): - json_response = json_call('Settings.GetSettingValue', - params={'setting': 'filelists.showextensions'}, - parent='clean_filename' - ) - - subtraction = 1 if json_response['result']['value'] is True else 0 - if not label: - label = infolabel('$INFO[ListItem.Label]') - count = label.count('.') - subtraction - label = label.replace('.', ' ', count).replace('_', ' ').strip() - - window_property('Return_Label', set=label) - - -def dialog_yesno(heading, message, **kwargs): - yes_actions = kwargs.get('yes_actions', '').split('|') - no_actions = kwargs.get('no_actions', 'Null').split('|') - - if DIALOG.yesno(heading, message): - for action in yes_actions: - log_and_execute(action) - else: - for action in no_actions: - log_and_execute(action) - - -def hex_contrast_check(**kwargs): - image = ImageEditor() - hex = kwargs.get('hex', '') - - if hex: - r = int(hex[2:-4], 16) - g = int(hex[4:-2], 16) - b = int(hex[6:], 16) - rgb = (r, g, b) - luminosity = image.return_luminosity(rgb) - best_contrast = 'dark' if luminosity > 0.179 else 'light' - - xbmc.executebuiltin( - f'Skin.SetString(Accent_Color_Contrast,{best_contrast})') - - -def play_album(**kwargs): - clear_playlists() - - dbid = int(kwargs.get('id', False)) - if dbid: - json_call('Player.Open', - item={'albumid': dbid}, - options={'shuffled': False}, - parent='play_album' - ) - - -def play_album_from_track(**kwargs): - clear_playlists() - - dbid = int(kwargs.get('id', False)) - track = int(kwargs.get('track', False)) - 1 - - if dbid: - json_response = json_call('AudioLibrary.GetSongDetails', - params={'properties': [ - 'albumid'], 'songid': dbid}, - parent='play_album_from_track' - ) - - if json_response['result'].get('songdetails', None): - albumid = json_response['result']['songdetails']['albumid'] - - json_call('Player.Open', - item={'albumid': albumid}, - options={'shuffled': False}, - parent='play_album_from_track' - ) - - if track > 0: - json_call('Player.GoTo', params={'playerid': 0, 'to': track}) - - -def play_items(id, **kwargs): - clear_playlists() - - method = kwargs.get('method', '') - shuffled = True if method == 'shuffle' else False - playlistid = 0 if kwargs.get('type', '') == 'music' else 1 - - if method == 'from_here': - method = f'Container({id}).ListItemNoWrap' - else: - method = f'Container({id}).ListItemAbsolute' - - for count in range(int(xbmc.getInfoLabel(f'Container({id}).NumItems'))): - - if xbmc.getCondVisibility(f'String.IsEqual({method}({count}).DBType,movie)'): - media_type = 'movie' - elif xbmc.getCondVisibility(f'String.IsEqual({method}({count}).DBType,episode)'): - media_type = 'episode' - elif xbmc.getCondVisibility(f'String.IsEqual({method}({count}).DBType,song)'): - media_type = 'song' - elif xbmc.getCondVisibility(f'String.IsEqual({method}({count}).DBType,musicvideo)'): - media_type = 'musicvideo' - - dbid = int(xbmc.getInfoLabel(f'{method}({count}).DBID')) - url = xbmc.getInfoLabel(f'{method}({count}).Filenameandpath') - - if media_type and dbid: - json_call('Playlist.Add', - item={f'{media_type}id': dbid}, - params={'playlistid': playlistid}, - parent='play_items' - ) - elif url: - json_call('Playlist.Add', - item={'file': url}, - params={'playlistid': playlistid}, - parent='play_items' - ) - - json_call('Playlist.GetItems', - params={'playlistid': playlistid}, - parent='play_items' - ) - - json_call('Player.Open', - item={'playlistid': playlistid, 'position': 0}, - options={'shuffled': shuffled}, - parent='play_items' - ) - - -def play_radio(**kwargs): - import random - clear_playlists() - - dbid = int(kwargs.get('id', xbmc.getInfoLabel('ListItem.DBID'))) - - json_response = json_call('AudioLibrary.GetSongDetails', - params={'properties': ['genre'], 'songid': dbid}, - parent='play_radio' - ) - - if json_response['result']['songdetails'].get('genre', None): - genre = json_response['result']['songdetails']['genre'] - genre = random.choice(genre) - - if genre: - json_call('Playlist.Add', - item={'songid': dbid}, - params={'playlistid': 0}, - parent='play_radio' - ) - - json_response = json_call('AudioLibrary.GetSongs', - params={'properties': ['genre']}, - sort={'method': 'random'}, - limit=24, - query_filter={'genre': genre}, - parent='play_radio' - ) - - for count in json_response['result']['songs']: - if count.get('songid', None): - songid = int(count['songid']) - - json_call('Playlist.Add', - item={'songid': songid}, - params={'playlistid': 0}, - parent='play_radio' - ) - - json_call('Playlist.GetItems', - params={'playlistid': 0}, - parent='play_radio' - ) - - json_call('Player.Open', - item={'playlistid': 0, 'position': 0}, - parent='play_radio' - ) - - -def rate_song(**kwargs): - dbid = int(kwargs.get('id', xbmc.getInfoLabel('ListItem.DBID'))) - rating_threshold = int(kwargs.get('rating', xbmc.getInfoLabel( - 'Skin.String(Music_Rating_Like_Threshold)'))) - - json_call('AudioLibrary.SetSongDetails', - params={'songid': dbid, 'userrating': rating_threshold}, - parent='rate_song' - ) - - player = xbmc.Player() - player_dbid = int(xbmc.getInfoLabel('MusicPlayer.DBID') - ) if player.isPlayingAudio() else None - - if dbid == player_dbid: - if rating_threshold != 0: - window_property('MusicPlayer_UserRating', set=rating_threshold) - else: - window_property('MusicPlayer_UserRating', clear=True) - ''' - player_path = player.getPlayingFile() - item = xbmcgui.ListItem(path=player_path) - musicInfoTag = item.getMusicInfoTag() - musicInfoTag.setUserRating(rating_threshold) - player.updateInfoTag(item) - ''' - - -def shuffle_artist(**kwargs): - clear_playlists() - - dbid = int(kwargs.get('id', False)) - json_call('Player.Open', - item={'artistid': dbid}, - options={'shuffled': True}, - parent='shuffle_artist') - - -def widget_move(posa, posb, **kwargs): - tempa_name = '' - tempa_target = '' - tempa_sortmethod = '' - tempa_sortorder = '' - tempa_path = '' - tempa_limit = '' - tempa_thumb = False, - tempb_name = '' - tempb_target = '' - tempb_sortmethod = '' - tempb_sortorder = '' - tempb_path = '' - tempb_limit = '' - tempb_thumb = False - - tempa_view = infolabel(f'Skin.String(Widget{posa}_View)') - tempa_display = infolabel(f'Skin.String(Widget{posa}_Display)') - tempb_view = infolabel(f'Skin.String(Widget{posb}_View)') - tempb_display = infolabel(f'Skin.String(Widget{posb}_Display)') - - if condition(f'Skin.HasSetting(Widget{posa}_Content_Disabled)'): - tempa_content = 'Disabled' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_InProgress)'): - tempa_content = 'InProgress' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_NextUp)'): - tempa_content = 'NextUp' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_LatestMovies)'): - tempa_content = 'LatestMovies' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_LatestTVShows)'): - tempa_content = 'LatestTVShows' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_RandomMovies)'): - tempa_content = 'RandomMovies' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_RandomTVShows)'): - tempa_content = 'RandomTVShows' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_LatestAlbums)'): - tempa_content = 'LatestAlbums' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_RecentAlbums)'): - tempa_content = 'RecentAlbums' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_RandomAlbums)'): - tempa_content = 'RandomAlbums' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_LikedSongs)'): - tempa_content = 'LikedSongs' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_Favourites)'): - tempa_content = 'Favourites' - elif condition(f'Skin.HasSetting(Widget{posa}_Content_Custom)'): - tempa_content = 'Custom' - tempa_name = infolabel(f'Skin.String(Widget{posa}_Custom_Name)') - tempa_target = infolabel(f'Skin.String(Widget{posa}_Custom_Target)') - tempa_sortmethod = infolabel(f'Skin.String(Widget{posa}_Custom_SortMethod)') - tempa_sortorder = infolabel(f'Skin.String(Widget{posa}_Custom_SortOrder)') - tempa_path = infolabel(f'Skin.String(Widget{posa}_Custom_Path)') - tempa_limit = infolabel(f'Skin.String(Widget{posa}_Custom_Limit)') - tempa_thumb = True if condition(f'Skin.HasSetting(Widget{posa}_Episode_Thumbs)') else False - - if condition(f'Skin.HasSetting(Widget{posb}_Content_Disabled)'): - tempb_content = 'Disabled' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_InProgress)'): - tempb_content = 'InProgress' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_NextUp)'): - tempb_content = 'NextUp' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_LatestMovies)'): - tempb_content = 'LatestMovies' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_LatestTVShows)'): - tempb_content = 'LatestTVShows' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_RandomMovies)'): - tempb_content = 'RandomMovies' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_RandomTVShows)'): - tempb_content = 'RandomTVShows' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_LatestAlbums)'): - tempb_content = 'LatestAlbums' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_RecentAlbums)'): - tempb_content = 'RecentAlbums' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_RandomAlbums)'): - tempb_content = 'RandomAlbums' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_LikedSongs)'): - tempb_content = 'LikedSongs' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_Favourites)'): - tempb_content = 'Favourites' - elif condition(f'Skin.HasSetting(Widget{posb}_Content_Custom)'): - tempb_content = 'Custom' - tempb_name = infolabel(f'Skin.String(Widget{posb}_Custom_Name)') - tempb_target = infolabel(f'Skin.String(Widget{posb}_Custom_Target)') - tempb_sortmethod = infolabel(f'Skin.String(Widget{posb}_Custom_SortMethod)') - tempb_sortorder = infolabel(f'Skin.String(Widget{posb}_Custom_SortOrder)') - tempb_path = infolabel(f'Skin.String(Widget{posb}_Custom_Path)') - tempb_limit = infolabel(f'Skin.String(Widget{posb}_Custom_Limit)') - tempb_thumb = True if condition(f'Skin.HasSetting(Widget{posb}_Episode_Thumbs)') else False - - xbmc.executebuiltin(f'Skin.ToggleSetting(Widget{posa}_Content_{tempa_content})') - xbmc.executebuiltin(f'Skin.SetBool(Widget{posa}_Content_{tempb_content})') - xbmc.executebuiltin(f'Skin.ToggleSetting(Widget{posb}_Content_{tempb_content})') - xbmc.executebuiltin(f'Skin.SetBool(Widget{posb}_Content_{tempa_content})') - skin_string(f'Widget{posb}_View', set=tempa_view) - skin_string(f'Widget{posa}_View', set=tempb_view) - skin_string(f'Widget{posb}_Display', set=tempa_display) - skin_string(f'Widget{posa}_Display', set=tempb_display) - skin_string(f'Widget{posb}_Custom_Name', set=tempa_name) - skin_string(f'Widget{posa}_Custom_Name', set=tempb_name) - skin_string(f'Widget{posb}_Custom_Target', set=tempa_target) - skin_string(f'Widget{posa}_Custom_Target', set=tempb_target) - skin_string(f'Widget{posb}_Custom_SortMethod', set=tempa_sortmethod) - skin_string(f'Widget{posa}_Custom_SortMethod', set=tempb_sortmethod) - skin_string(f'Widget{posb}_Custom_SortOrder', set=tempa_sortorder) - skin_string(f'Widget{posa}_Custom_SortOrder', set=tempb_sortorder) - skin_string(f'Widget{posb}_Custom_Path', set=tempa_path) - skin_string(f'Widget{posa}_Custom_Path', set=tempb_path) - skin_string(f'Widget{posb}_Custom_Limit', set=tempa_limit) - skin_string(f'Widget{posa}_Custom_Limit', set=tempb_limit) - if tempa_thumb and not tempb_thumb: - xbmc.executebuiltin(f'Skin.ToggleSetting(Widget{posa}_Episode_Thumbs)') - xbmc.executebuiltin(f'Skin.SetBool(Widget{posb}_Episode_Thumbs)') - elif tempb_thumb and not tempa_thumb: - xbmc.executebuiltin(f'Skin.ToggleSetting(Widget{posb}_Episode_Thumbs)') - xbmc.executebuiltin(f'Skin.SetBool(Widget{posa}_Episode_Thumbs)') diff --git a/script.copacetic.helper/resources/lib/service/art.py b/script.copacetic.helper/resources/lib/service/art.py deleted file mode 100644 index e79d14c6e..000000000 --- a/script.copacetic.helper/resources/lib/service/art.py +++ /dev/null @@ -1,300 +0,0 @@ -# author: realcopacetic - -import hashlib -import random -import urllib.parse as urllib -import xml.etree.ElementTree as ET - -from PIL import Image - -from resources.lib.utilities import (CROPPED_FOLDERPATH, LOOKUP_XML, - TEMP_FOLDERPATH, infolabel, json_call, - log, os, validate_path, - window_property, xbmc, xbmcvfs) - - -class ImageEditor(): - def __init__(self): - self.clearlogo_bbox = (600, 240) - self.cropped_folder = CROPPED_FOLDERPATH - self.temp_folder = TEMP_FOLDERPATH - self.lookup = LOOKUP_XML - - def clearlogo_cropper(self, url=False, type='clearlogo', source='ListItem', return_color=False, reporting=window_property, reporting_key=None): - # establish clearlogo urls - if url: - clearlogos = {type: url} - else: - clearlogos = { - 'clearlogo': False, - 'clearlogo-alt': False, - 'clearlogo-billboard': False - } - if source == 'ListItem' or source == 'VideoPlayer': - path = source - else: - path = f'Container({source}).ListItem' - for key in clearlogos: - url = xbmc.getInfoLabel(f'{path}.Art({key})') - if url: - clearlogos[key] = url - # lookup urls in table or run _crop_image() and write values to table - lookup_tree = ET.parse(self.lookup) - root = lookup_tree.getroot() - for key, value in list(clearlogos.items()): - self.id = xbmc.getInfoLabel(f'{path}.dbid') - self.destination, self.height, self.color, self.luminosity = False, False, False, False - name = reporting_key or key - if value: - for node in root.find('clearlogos'): - if value in node.attrib['name'] and validate_path(node.find('path').text): - self.destination = node.find('path').text - self.height = node.find('height').text - self.color = node.find('color').text - self.luminosity = node.find('luminosity').text - break - else: - self._crop_image(value) - clearlogo = ET.SubElement( - root.find('clearlogos'), 'clearlogo') - clearlogo.attrib['name'] = value - path = ET.SubElement(clearlogo, 'path') - path.text = self.destination - height = ET.SubElement(clearlogo, 'height') - height.text = str(self.height) - color = ET.SubElement(clearlogo, 'color') - color.text = self.color - luminosity = ET.SubElement(clearlogo, 'luminosity') - luminosity.text = str(self.luminosity) - lookup_tree.write(self.lookup, encoding="utf-8") - reporting(key=f'{name}_cropped', set=self.destination) - reporting(key=f'{name}_cropped-id', set=self.id) - reporting(key=f'{name}_cropped-height', set=self.height) - if return_color: - reporting(key=f'{name}_cropped-color', set=self.color) - reporting(key=f'{name}_cropped-luminosity', - set=self.luminosity) - - def return_luminosity(self, rgb): - # Credit to Mark Ransom for luminosity calculation - # https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color - new_rgb = () - for channel in rgb: - c = channel / 255.0 - if c <= 0.04045: - output = c / 12.92 - else: - output = pow(((c + 0.055) / 1.055), 2.4) - new_rgb += (output,) - r, g, b = new_rgb - luminosity = 0.2126 * r + 0.7152 * g + 0.0722 * b - return luminosity - - def _crop_image(self, url): - filename = f'{hashlib.md5(url.encode()).hexdigest()}.png' - self.destination = os.path.join(self.cropped_folder, filename) - # If crop exists, open to get height and color - if validate_path(self.destination): - image = self._open_image(self.destination) - self._image_functions(image) - # else get image url, open and crop, then get height and color - else: - url = self._return_image_path(url, '.png') - try: - image = self._open_image(url) - except Exception as error: - log( - f'ImageEditor: Error - could not open cached image --> {error}', force=True) - else: - if image.mode == 'LA': # Convert if mode == 'LA' - converted_image = Image.new("RGBA", image.size) - converted_image.paste(image) - image = converted_image - image = image.crop(image.convert('RGBa').getbbox()) - with xbmcvfs.File(self.destination, 'wb') as f: - image.save(f, 'PNG') - self._image_functions(image) - log( - f'ImageEditor: Image cropped and saved: {url} --> {self.destination}') - if self.temp_folder in url: # If temp file created, delete it now - xbmcvfs.delete(url) - log(f'ImageEditor: Temporary file deleted --> {url}') - - def _return_image_path(self, source, suffix): - # Use source URL to generate cached url. If cached url doesn't exist, return source url - cleaned_source = self.url_decode_path(source) - cached_thumb = xbmc.getCacheThumbName( - cleaned_source).replace('.tbn', '') - cached_url = os.path.join( - 'special://profile/Thumbnails/', f'{cached_thumb[0]}/', cached_thumb + suffix) - if validate_path(cached_url): - return cached_url - else: - # Create temp file to avoid access issues to direct source - filename = f'{hashlib.md5(cleaned_source.encode()).hexdigest()}.png' - destination = os.path.join(self.temp_folder, filename) - if not validate_path(destination): - xbmcvfs.copy(cleaned_source, destination) - log(f'ImageEditor: Temporary file created --> {destination}') - return destination - - def url_decode_path(self, path): - path = path[:-1] if path.endswith('/') else path - path = urllib.unquote(path.replace('image://', '')) - return path - - def _open_image(self, url): - image = Image.open(xbmcvfs.translatePath(url)) - return image - - def _image_functions(self, image): - self.height = self._return_scaled_height(image) - self.color, self.luminosity = self._return_dominant_color(image) - image.close() - - def _return_scaled_height(self, image): - image.thumbnail(self.clearlogo_bbox) - size = image.size - height = size[1] - return height - - def _return_dominant_color(self, image): - width, height = 75, 30 - image.thumbnail((width, height)) - # Remove transparent pixels - pixeldata = image.getcolors(width * height) - sorted_pixeldata = sorted(pixeldata, key=lambda t: t[0], reverse=True) - opaque_pixeldata = [ - pixeldata for pixeldata in sorted_pixeldata if pixeldata[-1][-1] > 64] - opaque_pixels = [] - for position, pixeldata in enumerate(opaque_pixeldata): - for count in range(pixeldata[0]): - opaque_pixels.append(pixeldata[1]) - # Reduce colors to palette - paletted = Image.new('RGBA', (len(opaque_pixels), 1)) - paletted.putdata(opaque_pixels) - paletted = paletted.convert( - 'P', palette=Image.ADAPTIVE, colors=16) - # Find color that occurs most often - palette = paletted.getpalette() - color_counts = sorted(paletted.getcolors(), reverse=True) - try: - palette_index = color_counts[0][1] - except IndexError as error: - log(f'ImageEditor: Error - could not calculate dominant colour for {infolabel("ListItem.Label")} --> {error}', force=True) - return (False, False) - else: - # Convert to rgb and calculate luminosity - dominant = palette[palette_index*3:palette_index*3+3] - luminosity = self.return_luminosity(dominant) - luminosity = int(luminosity * 1000) - dominant = self._rgb_to_hex(dominant) - return (dominant, luminosity) - - def _rgb_to_hex(self, rgb): - red, green, blue = rgb - hex = 'ff%02x%02x%02x' % (red, green, blue) - return hex - - def _return_average_color(self, image): - h = image.histogram() - # split into red, green, blue - r = h[0:256] - g = h[256:256*2] - b = h[256*2: 256*3] - # perform the weighted average of each channel: - # the *index* is the channel value, and the *value* is its weight - return ( - sum(i*w for i, w in enumerate(r)) / sum(r), - sum(i*w for i, w in enumerate(g)) / sum(g), - sum(i*w for i, w in enumerate(b)) / sum(b) - ) - - -class SlideshowMonitor: - def __init__(self): - self.refresh_count = self.refresh_interval = self._get_refresh_interval() - self.fetch_count = self.fetch_interval = self.refresh_interval * 30 - - def background_slideshow(self): - # Check if refresh interval has been adjusted in skin settings - if self.refresh_interval != self._get_refresh_interval(): - self.refresh_count = self.refresh_interval = self._get_refresh_interval() - self.fetch_count = self.fetch_interval = self.refresh_interval * 30 - # Fech art every 30 x refresh interval - if self.fetch_count >= self.fetch_interval: - log('Monitor fetching background art') - self.art = self._get_art() - self.fetch_interval = len(self.art) if (len(self.art) < 30) else self.fetch_interval - self.fetch_count = 0 - else: - self.fetch_count += 1 - # Set art every refresh interval - if self.refresh_count >= self.refresh_interval: - if self.art.get('all'): - self._set_art('Background_Global', self.art['all']) - if self.art.get('movies'): - self._set_art('Background_Movies', self.art['movies']) - if self.art.get('tvshows'): - self._set_art('Background_TVShows', self.art['tvshows']) - if self.art.get('videos'): - self._set_art('Background_Videos', self.art['videos']) - if self.art.get('artists'): - self._set_art('Background_Artists', self.art['artists']) - self.refresh_count = 0 - else: - self.refresh_count += 1 - - def _get_refresh_interval(self): - try: - self.refresh_interval = int( - infolabel('Skin.String(Background_Interval)') - ) - except ValueError: - self.refresh_interval = 10 - return self.refresh_interval - - def _get_art(self): - self.art = {} - self.art['movies'] = [] - self.art['tvshows'] = [] - self.art['artists'] = [] - self.art['musicvideos'] = [] - self.art['videos'] = [] - self.art['all'] = [] - for item in ['movies', 'tvshows', 'artists', 'musicvideos']: - dbtype = 'Video' if item != 'artists' else 'Audio' - query = json_call(f'{dbtype}Library.Get{item}', properties=['art'], sort={ - 'method': 'random'}, limit=40, parent='get_art') - try: - for result in query['result'][item]: - if result['art'].get('fanart'): - data = {'title': result.get('label', '')} - data.update(result['art']) - self.art[item].append(data) - except KeyError: - pass - self.art['videos'] = self.art['movies'] + self.art['tvshows'] - for list in self.art: - if self.art[list]: - self.art['all'] = self.art['all'] + self.art[list] - return self.art - - def _set_art(self, key, items): - art = random.choice(items) - # fanart = self._url_decode_path(art.get('fanart')) - fanarts = {key: value for (key, value) in art.items() if 'fanart' in key} - fanart = random.choice(list(fanarts.values())) - fanart = self._url_decode_path(fanart) - window_property(f'{key}_Fanart', set=fanart) - # clearlogo if present otherwise clear - clearlogo = art.get('clearlogo', False) - if clearlogo: - clearlogo = self._url_decode_path(clearlogo) - window_property(f'{key}_Clearlogo', set=clearlogo) - - def _url_decode_path(self, path): - path = path[:-1] if path.endswith('/') else path - path = path.replace('image://', '') - path = urllib.unquote(path.replace('image://', '')) - return path diff --git a/script.copacetic.helper/resources/lib/service/monitor.py b/script.copacetic.helper/resources/lib/service/monitor.py deleted file mode 100644 index 685920755..000000000 --- a/script.copacetic.helper/resources/lib/service/monitor.py +++ /dev/null @@ -1,256 +0,0 @@ -# author: realcopacetic - -import xml.etree.ElementTree as ET - -import xbmc - -from resources.lib.service.art import ImageEditor, SlideshowMonitor -from resources.lib.service.player import PlayerMonitor -from resources.lib.service.settings import SettingsMonitor -from resources.lib.utilities import (CROPPED_FOLDERPATH, LOOKUP_XML, - TEMP_FOLDERPATH, condition, create_dir, - get_cache_size, infolabel, log, - log_and_execute, split, - split_random_return, validate_path, - window_property) - -XMLSTR = ''' - - - -''' - - -class Monitor(xbmc.Monitor): - def __init__(self): - # Poller - self.start = True - self.idle = False - self.check_settings, self.check_cache = True, True - self.position, self.dbid, self.dbtype = False, False, False - # Setup - self.cropped_folder = CROPPED_FOLDERPATH - self.temp_folder = TEMP_FOLDERPATH - self.lookup = LOOKUP_XML - # Monitors - self.player_monitor = None - self.settings_monitor = SettingsMonitor() - self.art_monitor = SlideshowMonitor() - self._clearlogo_cropper = ImageEditor().clearlogo_cropper - # Run - self._create_dirs() - self._on_start() - - def _create_dirs(self): - if not validate_path(self.cropped_folder): - create_dir(self.cropped_folder) - if not validate_path(self.temp_folder): - create_dir(self.temp_folder) - if not validate_path(self.lookup): - root = ET.fromstring(XMLSTR) - ET.ElementTree(root).write( - self.lookup, xml_declaration=True, encoding="utf-8") - - def _on_start(self): - if self.start: - log('Monitor started', force=True) - self.start = False - self.player_monitor = PlayerMonitor() - else: - log('Monitor resumed', force=True) if self._conditions_met() else None - while not self.abortRequested() and self._conditions_met(): - self.poller() - self._on_stop() - - def _conditions_met(self): - return ( - self._get_skindir() and not self.idle and - ( - condition('!Skin.HasSetting(Background_Disabled)') or - condition('Skin.HasSetting(Crop_Clearlogos)') - ) - ) - - def _get_skindir(self): - skindir = xbmc.getSkinDir() - if 'skin.copacetic' in skindir: - return True - - def _get_info(self): - split_random_return( - infolabel('ListItem.Director'), name='RandomDirector') - split_random_return( - infolabel('ListItem.Genre'), name='RandomGenre') - split(infolabel('ListItem.Writer'), name='WriterSplit') - split(infolabel('ListItem.Studio'), name='StudioSplit') - - def poller(self): - # video playing fullscreen - if condition( - 'VideoPlayer.IsFullscreen' - ): - self.waitForAbort(1) - - # info screen visible and main menu selected - elif condition( - '[Window.Is(movieinformation) | ' - 'Window.Is(musicinformation) | ' - 'Window.Is(songinformation)] + ![' - 'Control.HasFocus(3201) | ' - 'Control.HasFocus(3202) | ' - 'Control.HasFocus(3203) | ' - 'Control.HasFocus(3204) | ' - 'Control.HasFocus(3205) | ' - 'Control.HasFocus(3206) | ' - 'Control.HasFocus(3207) | ' - 'Control.HasFocus(3208) | ' - 'Control.HasFocus(3209)]' - ): - self._on_scroll(crop=False, return_color=False, get_info=True) - self.waitForAbort(0.2) - - # secondary list has focus and clearlogo view visible - elif condition( - 'Skin.HasSetting(Crop_Clearlogos) + ' - 'Control.HasFocus(3100) + [' - 'Control.IsVisible(501) | Control.IsVisible(502) | Control.IsVisible(504)]' - ): - self._on_scroll(key='3100', return_color=False) - self.waitForAbort(0.2) - - # clearlogo view visible - elif condition( - 'Skin.HasSetting(Crop_Clearlogos) + [' - 'Control.IsVisible(501) | ' - 'Control.IsVisible(502) | ' - 'Control.IsVisible(504)]' - ): - self._on_scroll() - self.waitForAbort(0.2) - - # home widgets has clearlogo visible - elif condition( - 'Window.Is(home) + ' - 'Skin.HasSetting(Crop_Clearlogos) + [' - 'Control.HasFocus(3201) | ' - 'Control.HasFocus(3202) | ' - 'Control.HasFocus(3203) | ' - 'Control.HasFocus(3204) | ' - 'Control.HasFocus(3205) | ' - 'Control.HasFocus(3206) | ' - 'Control.HasFocus(3207) | ' - 'Control.HasFocus(3208) | ' - 'Control.HasFocus(3209)]' - ): - widget = infolabel('System.CurrentControlID') - self._on_scroll(key=widget) - self.waitForAbort(0.2) - - # slideshow window is visible run SlideshowMonitor() - elif condition( - '!Skin.HasSetting(Background_Disabled) + [' - 'Window.IsVisible(home) | ' - 'Window.IsVisible(settings) | ' - 'Window.IsVisible(skinsettings) | ' - 'Window.IsVisible(appearancesettings) | ' - 'Window.IsVisible(mediasettings) | ' - 'Window.IsVisible(playersettings) | ' - 'Window.IsVisible(servicesettings) | ' - 'Window.IsVisible(systemsettings) | ' - 'Window.IsVisible(pvrsettings) | ' - 'Window.IsVisible(gamesettings) | ' - 'Window.IsVisible(profiles) | ' - 'Window.IsVisible(systeminfo) | ' - 'Window.IsVisible(filemanager) | ' - 'Window.IsVisible(addonsettings) + !String.IsEmpty(ListItem.Art(fanart)) | ' - 'Window.IsVisible(addonbrowser) + !Container.Content(addons) | ' - 'Window.IsVisible(mediasource) | ' - 'Window.IsVisible(smartplaylisteditor) | ' - 'Window.IsVisible(musicplaylisteditor) | ' - 'Window.IsVisible(mediasource) | ' - 'Window.IsVisible(tvguide) | ' - 'Container.Content(genres) | ' - 'Container.Content(years) | ' - 'Container.Content(playlists) | ' - 'Container.Content(sources) | ' - 'Container.Content(studios) | ' - 'Container.Content(directors) | ' - 'Container.Content(tags) | ' - 'Container.Content(countries) | ' - 'Container.Content(roles) | ' - 'Container.Content() + [Window.Is(videos) | Window.Is(music)]]' - ): - self.art_monitor.background_slideshow() - self._on_skinsettings() - self._on_recommendedsettings() - self.waitForAbort(1) - - # else wait for next poll - else: - self.check_cache = True - self.check_settings = True - self.waitForAbort(1) - - def _on_scroll(self, key='ListItem', crop=True, return_color=True, get_info=False): - path, current_item, current_dbid, current_dbtype = self._current_item( - key) - if ( - current_item != self.position or - current_dbid != self.dbid or - current_dbtype != self.dbtype - ) and not self._container_scrolling(key): - if crop: - self._clearlogo_cropper( - source=key, return_color=return_color, reporting=window_property) - if get_info: - self._get_info() - self.position = current_item - self.dbid = current_dbid - self.dbtype = current_dbtype - - def _on_skinsettings(self): - if condition('Window.Is(skinsettings)') and self.check_cache: - get_cache_size() - self.check_cache = False - elif condition('!Window.Is(skinsettings)'): - self.check_cach = True - - def _on_recommendedsettings(self): - if condition('Window.Is(skinsettings)') and self.check_settings: - self.settings_monitor.get_default() - self.check_settings = False - elif not condition('Window.Is(skinsettings)'): - self.check_settings = True - if condition('Skin.HasSetting(run_set_default)'): - self.settings_monitor.set_default() - self.check_settings = True - log_and_execute('Skin.ToggleSetting(run_set_default)') - - def _on_stop(self): - log(f'Monitor idle', force=True) - while not self.abortRequested() and not self._conditions_met(): - self.waitForAbort(2) - if not self.abortRequested(): - self._on_start() - else: - del self.player_monitor - del self.settings_monitor - del self.art_monitor - log(f'Monitor stopped', force=True) - - def _current_item(self, key='ListItem'): - container = 'Container' if key == 'ListItem' else f'Container({key})' - item = infolabel(f'{container}.CurrentItem') - dbid = infolabel(f'{container}.ListItem.DBID') - dbtype = infolabel(f'{container}.ListItem.DBType') - return (container, item, dbid, dbtype) - - def _container_scrolling(self, key='ListItem'): - container = 'Container' if key == 'ListItem' else f'Container({key})' - return condition(f'{container}.Scrolling') - - def onScreensaverActivated(self): - self.idle = True - - def onScreensaverDeactivated(self): - self.idle = False diff --git a/script.copacetic.helper/resources/lib/service/player.py b/script.copacetic.helper/resources/lib/service/player.py deleted file mode 100644 index 0775b2a8a..000000000 --- a/script.copacetic.helper/resources/lib/service/player.py +++ /dev/null @@ -1,41 +0,0 @@ -# author: realcopacetic - -from xbmc import Player - -from resources.lib.script.actions import clean_filename -from resources.lib.service.art import ImageEditor -from resources.lib.utilities import condition, window_property - - -class PlayerMonitor(Player): - def __init__(self): - Player.__init__(self) - self.clearlogo_cropper = ImageEditor().clearlogo_cropper - - def onAVStarted(self): - if self.isPlayingVideo() and condition('String.IsEmpty(Window(home).Property(Trailer_Autoplay))'): - # Crop clearlogo for use on fullscreen info or pause - self.clearlogo_cropper(source='VideoPlayer', - reporting=window_property) - - # Clean filename - item = self.getPlayingItem() - label = item.getLabel() - if label: - clean_filename(label=label) - else: - window_property('Return_Label', clear=True) - - # Get user rating on music playback - if self.isPlayingAudio(): - tag = self.getMusicInfoTag() - user_rating = tag.getUserRating() - album_artist = tag.getAlbumArtist() - window_property('MusicPlayer_UserRating', set=user_rating) - window_property('MusicPlayer_AlbumArtist', set=album_artist) - - def onPlayBackStopped(self): - # Clean properties - window_property('MusicPlayer_UserRating', clear=True) - window_property('MusicPlayer_AlbumArtist', clear=True) - window_property('Return_Label', clear=True) diff --git a/script.copacetic.helper/resources/lib/service/settings.py b/script.copacetic.helper/resources/lib/service/settings.py deleted file mode 100644 index 450772501..000000000 --- a/script.copacetic.helper/resources/lib/service/settings.py +++ /dev/null @@ -1,84 +0,0 @@ -# author: realcopacetic - -from resources.lib.utilities import (ADDON, ADDON_ID, DIALOG, condition, - json_call, log, window_property) - - -class SettingsMonitor: - def __init__(self): - self.settings = { - 'filelists.showparentdiritems': False, - 'videolibrary.showallitems': False, - 'videolibrary.groupmoviesets': True, - 'videolibrary.flattentvshows': 1, - 'videolibrary.showemptytvshows': False, - 'videolibrary.tvshowsselectfirstunwatcheditem': 2, - 'videolibrary.tvshowsincludeallseasonsandspecials': 3, - 'videolibrary.artworklevel': 2, - 'videolibrary.movieartwhitelist': ['keyart', 'square', 'clearlogo', 'clearlogo-alt', 'clearlogo-billboard'], - 'videolibrary.tvshowartwhitelist': ['keyart', 'square', 'clearlogo', 'clearlogo-alt', 'clearlogo-billboard'], - 'musiclibrary.showallitems': False, - 'musiclibrary.showcompilationartists': False, - 'pictures.generatethumbs': True, - 'musicplayer.visualisation': 'visualization.waveform' - } - self.settings_to_change = {} - - def get_default(self, **kwargs): - self.settings_to_change.clear() - window_property('Settings_To_Change') - cats = { - 'general': False, - 'videolibrary': False, - 'musiclibrary': False, - 'pictures': False, - 'musicplayer': False - } - for item in list(self.settings.items()): - window_property(key=item[0]) - category = item[0].split('.')[0] - json_response = json_call('Settings.GetSettingValue', - params={'setting': item[0]}, - parent='get_settings' - ) - try: - value = json_response['result']['value'] - - except KeyError: - value = 'None' - if value != item[1]: - if ( - (isinstance(value, int) and value == 0) or - (isinstance(value, bool) and value == False) - ): - value = '0' - elif ( - (isinstance(value, list) and value == []) or - (isinstance(value, str) and value == '') - ): - value = 'None' - cats.update({category: True}) - self.settings_to_change.update({item[0]: item[1]}) - if isinstance(value, list): - window_property(key=item[0], set=', '.join(value)) - else: - window_property(key=item[0], set=value) - cat_count = sum(value for value in list(cats.values())) - item_count = cat_count + len(self.settings_to_change) - window_property('Settings_To_Change', set=item_count) - - def set_default(self, **kwargs): - count = 0 - for item in list(self.settings_to_change.items()): - if condition(f'Skin.HasSetting({item[0]})'): - json_call('Settings.SetSettingValue', - params={'setting': item[0], 'value': item[1]}, - parent='set_settings' - ) - count += 1 - if count == 1: - string = ADDON.getLocalizedString(32203) - else: - string = ADDON.getLocalizedString(32204) - string = f'{count} ' + string + '.' - DIALOG.notification(ADDON_ID, string) diff --git a/script.copacetic.helper/resources/lib/utilities.py b/script.copacetic.helper/resources/lib/utilities.py deleted file mode 100644 index 84d5df255..000000000 --- a/script.copacetic.helper/resources/lib/utilities.py +++ /dev/null @@ -1,243 +0,0 @@ -# author: realcopacetic - - -import json -import os -import sys -import urllib.parse as urllib - -import xbmc -import xbmcvfs -from xbmcaddon import Addon -from xbmcgui import Dialog, Window -from xbmcplugin import (SORT_METHOD_LASTPLAYED, addSortMethod, setContent, - setPluginCategory) - -ADDON = Addon() -ADDON_ID = ADDON.getAddonInfo('id') -ADDONDATA = 'special://profile/addon_data/script.copacetic.helper/' -ADDONDATA = xbmcvfs.validatePath( - xbmcvfs.translatePath(ADDONDATA)) -CROPPED_FOLDERPATH = os.path.join(ADDONDATA, 'crop/') -TEMP_FOLDERPATH = os.path.join(ADDONDATA, 'temp/') -LOOKUP_XML = os.path.join(ADDONDATA, '_lookup.xml') - -DEBUG = xbmc.LOGDEBUG -INFO = xbmc.LOGINFO -WARNING = xbmc.LOGWARNING -ERROR = xbmc.LOGERROR - -DIALOG = Dialog() -VIDEOPLAYLIST = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) -MUSICPLAYLIST = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) - - -def clear_playlists(): - log('Clear playlists') - VIDEOPLAYLIST.clear() - MUSICPLAYLIST.clear() - MUSICPLAYLIST.unshuffle() - - -def condition(condition): - return xbmc.getCondVisibility(condition) - - -def get_folder_size(source=CROPPED_FOLDERPATH): - bytes = 0 - if xbmcvfs.exists(source): - dirs, files = xbmcvfs.listdir(source) - for filename in files: - path = os.path.join(source, filename) - item = xbmcvfs.File(path) - size = item.size() - bytes += size - item.close() - return bytes - - -def get_cache_size(precision=1): - temp_size, crop_size = 0, 0 - if xbmcvfs.exists(TEMP_FOLDERPATH): - temp_size = get_folder_size(source=TEMP_FOLDERPATH) - if xbmcvfs.exists(CROPPED_FOLDERPATH): - crop_size = get_folder_size(source=CROPPED_FOLDERPATH) - size = temp_size + crop_size - ''' Credit Doug Latornell for bitshift method - https://code.activestate.com/recipes/577081-humanized-representation-of-a-number-of-bytes/ - ''' - abbrevs = ( - (1 << 30, 'GB'), - (1 << 20, 'MB'), - (1 << 10, 'KB'), - (1, 'bytes') - ) - for factor, suffix in abbrevs: - if size >= factor: - break - readable = '%.*f %s' % (precision, size / factor, - suffix) if size > 0 else '0.0 bytes' - window_property('Addon_Data_Folder_Size', set=readable) - return readable - - -def validate_path(path): - return xbmcvfs.exists(path) - - -def create_dir(path): - try: # Try makedir to avoid race conditions - xbmcvfs.mkdirs(path) - except FileExistsError: - return - - -def clear_cache(**kwargs): - import xml.etree.ElementTree as ET - - # remove temp and crop folders - readable_size = get_cache_size() - if xbmcvfs.exists(TEMP_FOLDERPATH): - xbmcvfs.rmdir(TEMP_FOLDERPATH, force=True) - create_dir(TEMP_FOLDERPATH) - if xbmcvfs.exists(CROPPED_FOLDERPATH): - xbmcvfs.rmdir(CROPPED_FOLDERPATH, force=True) - create_dir(CROPPED_FOLDERPATH) - log(f'Clearlogo cache cleared by user. {readable_size} saved.') - string = ADDON.getLocalizedString( - 32201) + f', {readable_size} ' + ADDON.getLocalizedString(32202) + '.' - DIALOG.notification(ADDON_ID, string) - # Update cache label - get_cache_size() - # Remove old clearlogos from lookup table - lookup_tree = ET.parse(LOOKUP_XML) - root = lookup_tree.getroot() - del root[0] - ET.SubElement(root, 'clearlogos') - lookup_tree.write(LOOKUP_XML, encoding="utf-8") - - -def get_joined_items(item): - if len(item) > 0 and item is not None: - item = ' / '.join(item) - else: - item = '' - return item - - -def infolabel(infolabel): - return xbmc.getInfoLabel(infolabel) - - -def json_call(method, properties=None, sort=None, query_filter=None, limit=None, params=None, item=None, options=None, limits=None, parent=None, debug=False): - json_string = {'jsonrpc': '2.0', 'id': 1, 'method': method, 'params': {}} - - if properties is not None: - json_string['params']['properties'] = properties - if limit is not None: - json_string['params']['limits'] = {'start': 0, 'end': int(limit)} - if sort is not None: - json_string['params']['sort'] = sort - if query_filter is not None: - json_string['params']['filter'] = query_filter - if options is not None: - json_string['params']['options'] = options - if limits is not None: - json_string['params']['limits'] = limits - if item is not None: - json_string['params']['item'] = item - if params is not None: - json_string['params'].update(params) - - jsonrpc_call = json.dumps(json_string) - result = xbmc.executeJSONRPC(jsonrpc_call) - result = json.loads(result) - - if (ADDON.getSettingBool('json_logging') or debug): - log(f'JSON call for function {parent} ' + - pretty_print(json_string), force=debug) - log(f'JSON result for function {parent} ' + - pretty_print(result), force=debug) - return result - - -def pretty_print(string): - return json.dumps(string, sort_keys=True, indent=4, separators=(',', ': ')) - - -def log(message, loglevel=DEBUG, force=False): - if (ADDON.getSettingBool('debug_logging') or force) and loglevel not in [WARNING, ERROR]: - loglevel = INFO - xbmc.log(f'{ADDON_ID} --> {message}', loglevel) - - -def log_and_execute(action): - log(f'Execute: {action}', DEBUG) - xbmc.executebuiltin(action) - - -def return_label(property=True, **kwargs): - - label = kwargs.get('label', xbmc.getInfoLabel('ListItem.Label')) - find = kwargs.get('find', '.') - replace = kwargs.get('replace', ' ') - - count = label.count(find) - label = label.replace(urllib.unquote(find), - urllib.unquote(replace), - count) - if property: - window_property('Return_Label', set=label) - else: - return label - - -def set_plugincontent(content=None, category=None): - if category: - setPluginCategory(int(sys.argv[1]), category) - if content: - setContent(int(sys.argv[1]), content) - if category == ADDON.getLocalizedString(32601): - addSortMethod(int(sys.argv[1]), SORT_METHOD_LASTPLAYED) - - -def skin_string(key, set=False, clear=False, debug=False): - if set: - xbmc.executebuiltin(f'Skin.SetString({key}, {set})') - log(f'Skin string: Set, {key}, {set}', force=debug) - else: - xbmc.executebuiltin(f"Skin.SetString({key},)") - log(f'Skin string: Clear, {key}', force=debug) - - -def split(string, **kwargs): - separator = kwargs.get('separator', ' / ') - name = kwargs.get('name', 'Split') - - for count, value in enumerate(string.split(separator)): - window_property(f'{name}.{count}', set=value) - - -def split_random_return(string, **kwargs): - import random - - separator = kwargs.get('separator', ' / ') - name = kwargs.get('name', 'SplitRandomReturn') - string = random.choice(string.split(separator)) - random = random.choice(string.split(' & ')) - random = return_label(label=random, find='-', replace=' ', - property=False) if random != 'Sci-Fi' else random - random = random.strip() - - window_property(name, set=random) - return random - - -def window_property(key, set=False, clear=False, window_id=10000, debug=False): - window = Window(window_id) - if set: - window.setProperty(key, f'{set}') - log(f'Window property: Set, {window_id}, {key}, {set}', force=debug) - else: - window.clearProperty(key) - log(f'Window property: Clear, {window_id}, {key}', force=debug) diff --git a/script.copacetic.helper/resources/settings.xml b/script.copacetic.helper/resources/settings.xml deleted file mode 100644 index 3d576ea43..000000000 --- a/script.copacetic.helper/resources/settings.xml +++ /dev/null @@ -1,22 +0,0 @@ - - -

- - - - 0 - false - - - - 0 - false - - - true - - - - -
- \ No newline at end of file diff --git a/script.copacetic.helper/script.py b/script.copacetic.helper/script.py deleted file mode 100644 index b37040722..000000000 --- a/script.copacetic.helper/script.py +++ /dev/null @@ -1,18 +0,0 @@ -# author: realcopacetic - -from resources.lib.script.actions import * -from resources.lib.utilities import clear_cache, sys - - -class Main: - def __init__(self, *args): - try: - self.params = dict(arg.split('=', 1) for arg in args) - except: - self.params = {} - function = eval(self.params['action']) - function(**self.params) - - -if __name__ == '__main__': - Main(*sys.argv[1:]) diff --git a/script.copacetic.helper/service.py b/script.copacetic.helper/service.py deleted file mode 100644 index b3eb56ff4..000000000 --- a/script.copacetic.helper/service.py +++ /dev/null @@ -1,6 +0,0 @@ -# author: realcopacetic - -from resources.lib.service.monitor import Monitor - -if __name__ == "__main__": - Monitor() diff --git a/script.module.dropbox_auth/LICENSE.txt b/script.module.dropbox_auth/LICENSE.txt deleted file mode 100644 index aeba2b6e9..000000000 --- a/script.module.dropbox_auth/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2016-2020 Moritz Schappler - - 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. diff --git a/script.module.dropbox_auth/addon.xml b/script.module.dropbox_auth/addon.xml deleted file mode 100644 index 11d5e6b88..000000000 --- a/script.module.dropbox_auth/addon.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - Dropbox Auth API - Provide Dropbox Authentification - all - MIT - https://github.com/SchapplM/xbmc-addon-dropboxauth - - diff --git a/script.module.dropbox_auth/authenticate.py b/script.module.dropbox_auth/authenticate.py deleted file mode 100644 index f9e3c4f3a..000000000 --- a/script.module.dropbox_auth/authenticate.py +++ /dev/null @@ -1,121 +0,0 @@ -# This script should be called in the settings dialog of other addons that use the dropbox API. -# example (from settings.xml): -# -# -# This script authorizes with dropbox by using the given App key (has to be requested at dropbox) and the app secret. -# The registration token will be written back to the settings of the calling addon (with given id and settings name) - -import xbmc, xbmcgui, xbmcaddon, xbmcvfs -import os, sys -from dropbox import DropboxOAuth2FlowNoRedirect - -# PIL needed for QR code generation (source code from qr-code.py from service.linuxwhatelse.notify) -''' -The QR-Code module used need the PIL (Python Image Library) to draw -the image. On some platforms (like android) PIL isn't available so -we check for the availability of this module and in case it is not -available we show a notification informing the user about it -''' -try: - import PIL - PIL_AVAILABLE = True -except ImportError: - PIL_AVAILABLE = False -import qrcode - -import resources.utils as utils - - -# parse input arguments -if len(sys.argv) == 5:# - ADDON_TARGET_ID = sys.argv[1] # id of the calling addon - SETTINGNAME_TARGET = sys.argv[2] # name of the settings field where the output is written to - DROPBOX_APP_KEY = sys.argv[3] - DROPBOX_APP_SECRET = sys.argv[4] -else: - utils.log('expecting 5 input arguments for Target Addon Id, Setting Name, Dropbox App key and secret. Received %d:' % len(sys.argv), xbmc.LOGERROR) - utils.log(str(sys.argv), xbmc.LOGINFO) - utils.showNotification(utils.getString(32102), utils.getString(32202)) - sys.exit(1) - - -# Define a class for the Dialog to show the URL -class MyClass(xbmcgui.WindowDialog): - # Opening a xbmcgui.Window does not work, since the open settings dialog prevents this (http://forum.kodi.tv/showthread.php?tid=262100&pid=2263074#pid2263074) - # Use xbmcgui.WindowDiaolog to be able to show the QR-code image - def __init__(self, authorize_url): - - # save window resolution to arrange the text fields an QR code - screenx = self.getWidth() - screeny = self.getHeight() - utils.log('Screen resolution: %dx%d' % (screenx, screeny), xbmc.LOGDEBUG) - # Show Dialog with Dropbox Authorization URL - - res_qr_code = [0,0] # resolution of the QR-code image. - # Show QR-Code Dropbox Authorization URL (source code from qr-code.py from service.linuxwhatelse.notify) - if PIL_AVAILABLE: - tmp_dir = os.path.join(utils.data_dir()) # tmp_dir has to exist - tmp_file = os.path.join(tmp_dir, 'dropbox-auth-qr-code.png') - # Create the QR-code image and save it to temp direcotry - qr = qrcode.main.QRCode(box_size=40, border=2) - qr.add_data(authorize_url) - qr.make(fit=True) - img = qr.make_image() - img.save(tmp_file) - # Show the QR-Code in Kodi - # http://www.programcreek.com/python/example/84322/xbmcgui.getCurrentWindowId - utils.log('Add control image with %dx%d at (%d,%d)' % (screeny/2, screeny/2, 100, 100), xbmc.LOGDEBUG) - res_qr_code = [int(screeny/4), int(screeny/4)] # TODO: the image is displayed bigger than the desired size. Find out why. - image = xbmcgui.ControlImage(100, 100, res_qr_code[0], res_qr_code[1], tmp_file) - self.addControl(image) - else: - # The PIL module isn't available so we inform the user about it - utils.showNotification(utils.getString(32102), utils.getString(32201)) - - # Print the Information text below the QR code - self.addControl(xbmcgui.ControlLabel(x=100, y=(100+res_qr_code[1]+ 50), width=screenx, height=25, label=utils.getString(32704), textColor='0xFFFFFFFF')) - self.addControl(xbmcgui.ControlLabel(x=100, y=(100+res_qr_code[1]+100), width=screenx, height=25, label=authorize_url, textColor='0xFFFFFFFF')) - self.addControl(xbmcgui.ControlLabel(x=100, y=(100+res_qr_code[1]+150), width=screenx, height=25, label=utils.getString(32705), textColor='0xFFFFFFFF')) - - # Also print the text to the log file for manual use - utils.log('Open the following URL: %s' % authorize_url) - - # this shows the window on the screen - self.show() - - def onAction(self, action): - # the window will be closed with any key - self.close() - - -utils.log('Starting Dropbox authentification with key %s and secret %s' % (DROPBOX_APP_KEY, DROPBOX_APP_SECRET), xbmc.LOGDEBUG) -# start dropbox authentification -flow = DropboxOAuth2FlowNoRedirect(DROPBOX_APP_KEY, DROPBOX_APP_SECRET) -authorize_url = flow.start() -# display URL -mydisplay = MyClass(authorize_url) -mydisplay.doModal() -del mydisplay - -# Open dialog to input the confirmation code. -dialog = xbmcgui.Dialog() -code = dialog.input(utils.getString(32703), type=xbmcgui.INPUT_ALPHANUM).strip() - -if code == '': - # empty code, aborted - utils.log('Entered an empty authorization code. Abort.', xbmc.LOGDEBUG) - sys.exit(0); - -# finish authentification by sending the code to dropbox -try: - token = flow.finish(code).access_token -except Exception as e: - dialog.ok(utils.getString(32103), utils.getString(32706)+": " + str(e)) - sys.exit(1); - -# positive notification -utils.showNotification(utils.getString(32103), utils.getString(32707)) - -# return the token to the calling script. That means writing the token in the pre-defined settings field -__Addon_Target = xbmcaddon.Addon(ADDON_TARGET_ID) -__Addon_Target.setSetting(SETTINGNAME_TARGET,token) diff --git a/script.module.dropbox_auth/resources/language/resource.language.de_de/strings.po b/script.module.dropbox_auth/resources/language/resource.language.de_de/strings.po deleted file mode 100644 index 444a43b09..000000000 --- a/script.module.dropbox_auth/resources/language/resource.language.de_de/strings.po +++ /dev/null @@ -1,58 +0,0 @@ -# XBMC Media Center language file -# Addon Name: Dropbox Auth -# Addon id: script.module.dropbox_auth -# Addon version: 1.0.0 -# Addon Provider: schapplm -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" -"POT-Creation-Date: 2017-11-20 22:00+0400\n" -"PO-Revision-Date: 2017-11-20 22:00+0400\n" -"Last-Translator: Moritz Schappler \n" -"Language-Team: LANGUAGE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgctxt "32101" -msgid "Dropbox" -msgstr "Dropbox" - -msgctxt "32102" -msgid "Dropbox: Error" -msgstr "Dropbox: Fehler" - -msgctxt "32103" -msgid "Dropbox: Setup" -msgstr "Dropbox: Konfiguration" - -msgctxt "32201" -msgid "Python Image Library for QR code not available" -msgstr "Python Image Library für QR-Code-Erzeugung nicht verfügbar" - -msgctxt "32202" -msgid "Wrong input arguments" -msgstr "Falsche Anzahl an Eingabeargumenten" - -msgctxt "32703" -msgid "Dropbox authorization Code" -msgstr "Dropbox Bestätigungscode" - -msgctxt "32704" -msgid "Open the following URL by scanning the QR-Code or by typing it manually" -msgstr "Öffnen Sie die folgende URL durch Scannen des QR-Codes oder abtippen" - -msgctxt "32705" -msgid "Press any key to close the QR-Code and continue to enter your the authorization code" -msgstr "Drücken Sie eine beliebige Taste zum Schließen dieses Fensters und anschließender Eingabe des Bestätigungscodes" - -msgctxt "32706" -msgid "Unable to authorize with Dropbox" -msgstr "Autorisierung mit Dropbox nicht möglich" - -msgctxt "32707" -msgid "Dropbox successfully authorized" -msgstr "Autorisierung mit Dropbox erfolgreich abgeschlossen" diff --git a/script.module.dropbox_auth/resources/language/resource.language.en_gb/strings.po b/script.module.dropbox_auth/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index f0c075dec..000000000 --- a/script.module.dropbox_auth/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,58 +0,0 @@ -# XBMC Media Center language file -# Addon Name: Dropbox Auth -# Addon id: script.module.dropbox_auth -# Addon version: 1.0.0 -# Addon Provider: schapplm -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: http://trac.xbmc.org/\n" -"POT-Creation-Date: 2017-11-20 22:00+0400\n" -"PO-Revision-Date: 2017-11-20 22:00+0400\n" -"Last-Translator: FULL NAME \n" -"Language-Team: English\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgctxt "#32101" -msgid "Dropbox" -msgstr "" - -msgctxt "#32102" -msgid "Dropbox: Error" -msgstr "" - -msgctxt "#32103" -msgid "Dropbox: Setup" -msgstr "" - -msgctxt "#32201" -msgid "Python Image Library for QR code not available" -msgstr "" - -msgctxt "#32202" -msgid "Wrong input arguments" -msgstr "" - -msgctxt "#32703" -msgid "Dropbox authorization Code" -msgstr "" - -msgctxt "#32704" -msgid "Open the following URL by scanning the QR-Code or by typing it manually" -msgstr "" - -msgctxt "#32705" -msgid "Press any key to close the QR-Code and continue to enter your the authorization code" -msgstr "" - -msgctxt "#32706" -msgid "Unable to authorize with Dropbox" -msgstr "" - -msgctxt "#32707" -msgid "Dropbox successfully authorized" -msgstr "" diff --git a/script.module.dropbox_auth/resources/utils.py b/script.module.dropbox_auth/resources/utils.py deleted file mode 100644 index 03f82e057..000000000 --- a/script.module.dropbox_auth/resources/utils.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -This file contains additional utility functions -""" -import xbmc, xbmcgui, xbmcvfs, xbmcaddon -import os -import sys - -__addon_id__= u'script.module.dropbox_auth' -__Addon = xbmcaddon.Addon(__addon_id__) - - -def data_dir(): - """"get user data directory of this addon. - according to http://wiki.xbmc.org/index.php?title=Add-on_Rules#Requirements_for_scripts_and_plugins - """ - __datapath__ = xbmcvfs.translatePath( __Addon.getAddonInfo('profile') ) - if not xbmcvfs.exists(__datapath__): - xbmcvfs.mkdir(__datapath__) - return __datapath__ - -def addon_dir(): - """"get source directory of this addon. - according to http://wiki.xbmc.org/index.php?title=Add-on_Rules#Requirements_for_scripts_and_plugins - """ - return __Addon.getAddonInfo('path') - -def log(message,loglevel=xbmc.LOGDEBUG): - """"save message to kodi.log. - - Args: - message: has to be unicode, http://wiki.xbmc.org/index.php?title=Add-on_unicode_paths#Logging - loglevel: xbmc.LOGDEBUG, xbmc.LOGINFO, xbmc.LOGWARNING, xbmc.LOGERROR, xbmc.LOGFATAL - """ - xbmc.log(__addon_id__ + u": " + message, level=loglevel) - - -def showNotification(title,message, showtime=4000): - """Show Notification - - Args: - title: has to be unicode - message: has to be unicode - time: Time that the message is beeing displayed - """ - __addoniconpath__ = os.path.join(addon_dir(), "icon.png") - log(u'Notification. %s: %s' % (title, message)) - xbmcgui.Dialog().notification(title, message, __addoniconpath__, showtime) - - -def getString(string_id): - # return a localized string from resources/language/*.po - # The returned string is unicode - return __Addon.getLocalizedString(string_id) diff --git a/script.module.infotagger/README.md b/script.module.infotagger/README.md deleted file mode 100644 index 3ee0e00ee..000000000 --- a/script.module.infotagger/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# script.module.infotagger -The InfoTagger module is a wrapper for new Nexus InfoTagVideo ListItem methods to maintain backwards compatibility with old ListItem.setInfo() style methods - - -Usage - -Import as a dependency in `addon.xml` -```xml - - - - ``` - -When making your ListItem - - ```python - from infotagger.listitem import ListItemInfoTag - -# Make your listitem as normal -li = xbmcgui.ListItem() - -# Pass listitem to the infotagger module and specify tag type -info_tag = ListItemInfoTag(li, 'video') - -# li.setInfo(infolabels) -info_tag.set_info(infolabels) - -# li.setUniqueIDs(unique_ids) -info_tag.set_unique_ids(unique_ids) - -# li.setCast(cast) -info_tag.set_cast(cast) - -# li.addStreamInfo('video', videostream_values) -info_tag.add_stream_info('video', videostream_values) - ``` - - -Optional alternative for setting all video/audio/subtitle streams using a single dictionary (e.g. as returned by JSON RPC). - -```python -""" -stream_details = { - 'video': [{videostream_1_values}, {videostream_2_values} ...], - 'audio': [{audiostream_1_values}, {audiostream_2_values} ...], - 'subtitle': [{subtitlestream_1_values}, {subtitlestream_2_values} ...]} -""" -info_tag.set_stream_details(stream_details) -``` - diff --git a/script.module.infotagger/addon.xml b/script.module.infotagger/addon.xml deleted file mode 100644 index 269723139..000000000 --- a/script.module.infotagger/addon.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - all - Python wrapper for setInfo on Nexus InfoTags - Python wrapper for setInfo on Nexus InfoTags - GPL-3.0-or-later - https://github.com/jurialmunkey/script.module.infotagger - https://github.com/jurialmunkey/script.module.infotagger - - icon.png - - - - diff --git a/script.module.infotagger/icon.png b/script.module.infotagger/icon.png deleted file mode 100644 index 3f5773545f41dad97c2f1d7e4ffd73f08e82f5a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19185 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
UN)4e{J) z7pyr-+mkNu@_R{rLw+Vgc}cmMXBFtQ@`p8Ll7wG`&@__?(S_ytu;GP#4z1s+ex)9C zbwSvV8_#6TA)2F|U3o=RG)Ye4{kc$CpgWPwM#Iu4RFZ;b^?j_&l;Z*HIwlv_M3(p% z>JKPeUbe!qchuIF3wP?{Tzl}IZ};Fn=W0(?c|l1Xr#p}ZE|~79NYsd{4k&B*Un6_I zec&t2xeoF=leS%_vi(RPDNpv9lI_i}pIHeJ?44PxW||z z-S^AgeL4_e;eP0mrpF<|2mL7)v=$Aj8$Wsrr^{RwAaLF81EK%IDl6Gky%-cL)DsmG zf{Vz8Od86DH;=!El;cZKRl1!^k9ME$Od~&Q+7_6yHM4sA&S@*Mbbt3%R%3EO4LwZ|r5fogEwA za!1Axi5OjDV^oX3$&=+ehz->Ug@OHthL9p%vD>~*>Xdw;Fv=Dqe!NHodw|Vw_v6j? zI-dJZ%@GKqJo`NN{=1T0gQ>eMgf~=pR$+V{)9tw)pNI}7OmDC;OC^4zxU`EAbtunc z|IVYvX_w|Dl6OKz@hziBOHVl$ht$&Fq**Nuaf+~4DkZH=x{W%0ZPZ%H6W!pBs%!6y z2q&t}74MUCVF7IaICd}XeuLiS5--vb+4@H&h z>p2mQ0=B7%`=Ip6P=M4Re+Zqo?9H z=PP0r@`hwn zs&)AcPm+8e3B|9HXeb&qD>D2r4Je#%YB*ROa4Mokfr0_(qzZ>i8bT_h8toL)N`t6e zYBVf3?-jPQ8UD1=U=>pQ461Ma%J)GSh5o?D8YV9n=nvW!qt$Fng$@ z9{%-%WaE^91C58msHv7XC8`LW<#Wfq^6T{IfEuKOW{vT{osR ztZ<1xa*Pi@??g~b5!n25l_W)Pc`|OQ*$T#pVuSQw21rr&|2e*lm+j9xz9B?&-*_K) z6AB7SFo!Jk9@NMD7Hg0|m5!vWp5wF=Ms&btPB zwU|v@dA(>?`X?sinVv|cl3N(5LApcWuVXwEQ+NT(z0=4V<6WFr(lF?E4nEg{_jhRL zBkiOI${5T#DF*Ss&TZ5v(~AerEjk3CI6foBrhAyHYx@^r{l#k&og<_8)^{eRJ|0#* zDW=@D%$zw4HwtkhvV1U&5kJb{$Z~JXsR+M{M3|PLexyTpH+zCmRajINyGP+(`!%4n z)3zl*VTs^RaZJ>!JCt7edhsu((+Yu`XB`BGN#_qBjT+Q=D3e-nux5Ad(>|%cIKwHd_2T?bw1sg`oO*F(%|&vHH2U* zfL7@fBEzIeVLLI$R4tj8>rZ95^$6^0#-Q&87DZvjal}R)B<3rS%U3^9Mdi{FOWW^I z6Vi7s9?JhMLxojw1>!mDNR@K#Qs!jhUH)XTv;0SqH(WRVSC{S;VMCl^yFwOzT|+tf zUB*p*AZ=;}AB_c#>s~@q?s->p#@}@RAPjuCd;1ZQC9!`R(jL0-4`Z(=_cCRglMzxz zDVw=%`UH)YB8w8r(0^S>1muVf7**7gp}T3*nAm82!oLvxsZ~J(t33kM;6@HbEcoM0 z0Z~60xoW;K5`mc=&+L}OD(p2HONm7kIzfQ>Ayz#R^~dVY;6%=^e;{y?A?mp?p8~jw zU%mcpy%Qr!-7dRboeiIE)%EI&X+PSf+D97=O>Q$K6umu@@Em0dgv!*4f{YckWp}dN zD~sYj!lfV1?#!yC&h)=B6il|K@P!}<&fk3m^j9R2- z?Go}v6QkX5Swmd!h+yIIddmI!&ojnF8*9Yywkq>8{53U{K?+ne(6ym{nhFccO9~7B zpYk;jt&=?>c_lgp2)p%^ax!uJoiJ_x%ENW|@23F?b_~Ihu4X?iQKOouucv}N8w?%Fi<@2`ueS6w!;pgDk=j@4qN=SN|rm>e&rvR z;4006ifP_k6kiw1cSDYeodNntNR(tkVrYiSU&uZei3J6|KJ4Xr5Dw#)WJu69{Afp) zj*Jtvj_~ZevXuC%K$4vn52jJi;$9yX@c??L(b9`#!RZ|Kgdavtb3xA%Qk9lHv!JdkOy2aeey2K-y5At@;>=vGb16C|J zrse4LD0O)GiFab}7(uteF3qdWMgmk7;J-EnEwu2{bw8~Z}R^>>;Kn?V0Ql->wD|CD8hPs@LbOr zJ5H&nadx-rHh)(*-x``oeD>)60rMRil3r@W&of}k@Dw#!tijCtaMFp-V?v66K?;H7 z2e&PH)b)fB?K|8bZf@onr+KKhxLvN1LIVR&LJNy7J+2 zJowuI3r-rH?KV-JdC$e}*~y8`-pIe>hR49qZf@pz z_l{^y00vAXYO>Msr)~GLaX-u!YC|(KGbb~I5gM8n%D&1-N(LgMpr|M+ zlKXa$>gnk<9mDj8-Qp`9x2xN8&3c=R z{(%8nI^ZSkDi-tA1=B9ImMa+>8wSWIzzQ}vN$k|>EPCI*k^h4GALq<_0-wbsUG&`X zcsb<{v;YL6-M!l3Yo4-wwsNUvVL|tw2kV1&c1(DmX0y&NE{e~Nf6!~0-CgWD9i}6K zQ3YV|IPJ2R-L8qcyF@;;ujr+wrXr)GkCzvfPVztBVu*^1D@i~+JEO@VX1`NXO2YYX zyK?vG7#U|Q>y`^uOEjm8~5OfVhySo!P&!G+%8>+_YbQBaae*T2z zy}H3BMD&J0+KI`&Om|k**sk}8Egi+tYh6q#$*FNye*}Bx4X>)HStw58rVV!3G0Wn3 zhWj~l?HlsTu;q2zsa}H5kH=mF4{Q8x!xW3RFJ2I4aMXOOS!kvPSX}Q}$}dpL-C4R`js{T#3gW%*wszX)6;tfUv;X z-QBH#_j08c<*+ykTEdw{$s(hEV20(tS@GJf$&Q`q3qga_s4B|@V*(k`<(V$ zA)-XoDZFlR*eImHa)(Dv$Exb;@k_POcRp}vZy-FpyqBvm%&bO(cnwW6Z8)cB>|yIa zp}?03HPlV=bzOHw9S>$B`#rr;(kVzGHG9)FMay2#ypDU5fx-Ok*bsX z88!Ru)=XkvS9v@EZ1D$#!~i}I*L}U`J8IxMJWvpPpO)TI#=j%aL&vUN-KI~?E@x+F zYY-?>(4+B>@mkuc-h(SXCi|UK+)kX9Rb(Euo*SeY8j|=E1lyMLBRAK(1Y>1+d4V4< z*g&T5?vj8-e@i-r%Q5IbD@=^a&K6E&*=4X?0O#ptj{osP5CrJxbsCj{tG`AZg;gLx zEU#cxrBjoT2mq$|(ji2Df505PrBlCy_Kup`e7@TB?E1Q{?`nG_tqe!+;WswaDiUP0 zdiFl7Q3ywMsBOzj&vdWldcIiK8=(aC#gVpc9=-=r$uvs2c|9oL;NZMQ6aYJ*yn*}L zWNQ$i+Mo|BHa1p)^gmWo0KUw=>@GFJa~^V5w4;FOy}xQm^hG}ym$CM{#Ij%c68zA8 z>+{!^@rjAciwU_8OiWR}$Y7TzjfS3E?E*(^ck((Dd0c{0UH2q)Y`bv?)!VyIkRbv! zc6Rox`~T*E+rN#4fdX+O*9iE#>(ejXnBTv}|8wqS`eyXJvbc}xm8j)Xvp+&`1&AQ+ zJ!0Ybrq`dn3ks<54VK;}Bs8vvakDxfeb}2S`n|ZgxL4B}h)tzFX{#XU**Y*;0u1XN z+<1S~g!AT&QQcu%>lZ;^IEdu?_YBi87<}1od9q_Sr|X;l{wZub4#j_3%DkUF*I`MDPaDruOBA6P(3}Eh2;iLl?X%0N(yj;98B! zhk?w_&Q%#7Ha_}1xT8aZ{T`itvKui#hVt%Q$N3-6{m&QvUoMc@;v>9PY)n@3Fm1lG;CEHE1lPL?h;mFSi>l$BA*wTiEd)sL9&u4smJSILq zpRx6(>UqG>NQ2kYd7A6?(zS)6pYOUq%k1@E)!y+v z$bxqo5^znkNs#lo7#A8H_r+FLlB`=Lz3LCy;Nak<9#Q`77FaDc7MRbJ-hmuh_FKK} zdfz7%6Ls~hqy4H8o|5~cmO5QrFC_p$f`Wr5w5(eSB4>2hZF+ka7PJ8FoEczjE5=Rr zl3j*}p{4@|#)5*9GW%!%9)W${v-Rvu3ZKutesRgtiwgl3)?~U^1D|{A8r>xXWExh7 z9eIz7G5?^zz^!aJ0f@jO96bEA%N#%iZ2f%0p5NoTk1O}>>pXz76sV05qq`N8Q&6y4 zA1!iCxxF0QK|ECW%cG@%y-m%!u!yuYJ>TP%Q8Hl`*NYu7S`>bM{vr2OD1ScP63v=% z5SZzx8NmGZ7)#xfrv@(e7wQzQEXT9CH+Sd0U#jbKJB$L5?69*wRb#I92sWL=7UUaw zegy>uRYq)V?1|NTR;NKc$DPrPu>t+bdM#J3$T+kl(TnnkV{kEFGwJh0en_#mXMrGXt~_1 zfrNzgS(+yutiRCtSQnqkAONi7s|t!whOoccX5kdN$09sBUi$Tl-XIdHH^jRU3B9&e z$0I#-eobxrTHlk=+S)pJTTVu1iXxn^aB>p6XC;NtUQ9eHy2fG7xY2YCRwji@MORn% zP07e~8FAtMDgDQf^1N$nEHgGgOEbG5Wx+tKc%6uvH7DP zn(JxKZ&t%SWq|(wtQod6H?!DnNXUKxF=0~Yn6HICwGM176N^om!?Xjl`)WHBAUB1M ztr&ba^0a({`85A6wFE*8X9lP>Hu^I^(4GHTq&av4^!vy!b^dMB88;$6&FmAynQ>j zdOy+ZVjsNC>v<60eV)o`-?QejKOyzagOJ;E@hsgyGzALGb(LL6SeQPQz4_G<7kx=F zwIoQFb>ElQ*1iRATTT!1`5qf&=V|ejg@ z7(aZdBL6v?2PLDco7#Oo{ucA)$?laEJwTJJUv9*zk7JRtvDNmp{nk3Y!3WME z08^C>Lnx&QJvl8n0_Z1=#mjRF2FAuSTyi!xHZ8(`8tms@vjHBxN+X-br?bxk1qD^( z`0yfx0}LsOvGLFEECHNu)>S7#mD-$$kH> zUgKpx!;sr!IFiaMMFs=5GmMJ$UCp$MSs|>t7C%&+G7Bt(g;)&b2PN&NPh**oRm+e0 z`9TWjX6DfGadBc~otu{P^%=th!||V#nw*YvF*~p!ETu%;&eL3krNHv=X!z=zE1J{e zA}2dzS+AL178^ikiZoiGpI4ZMJ~;|o-rTIMRcn#s{h!quNJ@DZ`oSGdRr#aB3)c*6 zY;4f@Q+We(dh36#OV3I@IXPK*C(2dTvp1C5-_Fjgd6$tiez}ayK0HGHpF$8h$Z9fJIVKj?w+GIblj8Cg zXcb_WpzrBTkiOgvw>c)Uu?{E2#)@V@zwCt7ariv|E$Zt$@VUlSnj4WC)YB4uF_0SZg0EipWRbI_3Fzsn@o(_C`$@)7ej z!3F>Gw#2u!ADUXwH+Of19`{$Q!=0qytV6t`Io)cn;vhuaPQ|Ck)c<2-hL6u*&ewO>}v`%}w_)FhN2Y#c?v6*RLmCZv6;h|0V{P)zx*J1)HOF;;X4D zDw_RXS5)eiij9qno0j*BJ8lD7QTI6;GfUO?<>2n_{~AKU<7jPSd>r4R?epi)bg6Z@ zr9mH<@#rv6a2e;f*QVZ+|55fF~zoesemwLe0o=Zb!JI(_=|X2gw*I&Z#BLrI+CIfahy7$7Smj`*(MsK6aw5f$l6c>^E~-y&SQbtzP5wKSPC zU|2KEzFR73Ha%E*{h~t5H*;nvgo`RGXA^rJd~$Jd(P);ov%3`j^g@x>F2B3E?Uy!D zO>yZ-OIJ5KA6t!afwMfK{_17bW;4S&j+&)pS`dlx4$6UJLNs{aRQEL`QBhGYcq;6m+`V0LIeeGc~jVYKTL^uO2>_P*S(zDis+S`G!$TQ8BZu^{#NfjYLkeVh@@J z@ZC@%=G?nH*nj_AuM&(m*7Y?!pc(_=4@RQN1suaDsXy@Z>kTEb*O@i=5yP5H^{XT@ zxl}f{w9q%Zg^hDtx0T2wv74Xg4$aqjwfR766@rxng_C5a^1A(93fgiM4=1kK-JYwq z^&J|ZdG{`7IwL-uL{1_7SL_ukysy!at3;(znj z?UI9lHy}GXKn|F4yWgKFbG})Rizv?lnwRxT?sAKpMzbsi2FB(7jNIehWzkG4plzm` z{VMJa5N-hV&06DUGTyZZVx#dRj!+OoDX3qii0CdJT`Ps3|gz+^P^pk=hN-B7-KlA`83DFC#@D&$IukWV_|i* zG69=~$;G2q#Wy%Tx|d{QZ0Ys{sG%7Mk)f5=Bpw%$qPSdIoURx7d^aZ)0LV#7O1?m2 zy42@T_T_4m4RNixI_osm65UQ*pl7s?9nKr-NO{|b&Q|Z=lT5SE6S;s?tLt&d>d&VN zxZVq;F4m-KOBWzODZ_LIrMY-YmF0OM1}&OSBut z$rA6uQ7Hhl1~_h`4Vk#9X`aJsyI_fWh0yIKUTFi@e(R&^%TI|)ZaP*?w*W-^Nz=6G z=;#{PA$)p0*-)=`g$7YEQ8jr~8`0BKUsg&!T>!I@k&q(O($auG@bK^`1JMvDAt1og zP*aP)efyTn{U)GQ`_?dJIjgC#)#J{jE8rhs4hlfoczAp?{J%&Zm|JA-t3fyt6W}NdFhQyozrEzq6)F_pF_fkrCy&JM6TPKUOn*UG!Vm zwLtf=Hk^cC7Gp5kG}#l_uJ8agx6pECrYDr(az{U0>q+$FViFC=Y%7FH(sF-WEhRf={}A|a56mpz%Igtxlw zw5&5*>k0&RFE~2}!A%X6M{oc|1h8(ualdrph}Z4nO3Rwt5rN%uK}_}b{^{|KRUH!l z$sg}?Q}57ecUWOF+>%h2FX_ic|!Y%x%Fz#9Z-~-`CzYDJ$z^9%l!p4 z>*fjx_GO!v3D2v509BQzR*?4DR#d&)+W4OCS6FS=y382=sGOdjj?Gr+Uxv%^sqRm| zlC9D){`wJ*<@*UKD7VOiGj^NTiw#-DeR_I&nIpYUZSh#G2H1fb^ZgZLcTgxOIj7UC z7ie+2X1mt`g$pKTX2-QIB;ba7Yu&-fh=}q)O~}m3+B`h8bc&2;vrKGmPE^qnOJcLE ztamd2CeU%&jP2Qtrj|21)*bLut*ym)hJq=LC@ZsOm4lz3e^_fX8545c`9e$wiV(4> zsioD`ESnn}`5+JirdbO+f_SSX)P6H-pg7(vC?nwvDeY zxa@Qwc-o)xJM2U(dtCD#&Nfu_8#bfC%Oo&~W{HI=gN=VDIh4pckuB+Lc7JuK!Y8ED zc)(oLKhFX&Ff?RU*SIKAX3WUX|BGh@s1VNTaar=Bc9MnpFopd~38-p?h{Hy}y6v&{ zN>%AMISZu-vyt=+sFZB(?wX=fRT=XaBakF+jxJaZp4XQy?2opl9JO5QULLRL9UUF@ zcz?9tl72ju^Ri2rAf|FD2T*`g1zcHuE+jw0(sn4GsPF4litATM!Ter-TEU5WB%i+-oO|F_i z4l+55DVWmz`EK_jf!TGfFYjV2$vS~|X=kP^&6D3XrqgOhgYfY-o;dNc{0Y?f@{5ZH zH+JO+mb_Lx9@Z%!=><$gxXZx7>y}-Er94^}te>mqvK|0H-n+$pGCDm2xI7P6_am1P`R;muo5gT6cPK~DlZm-1COO&S>bg{?an^vlZqdE!R8}*}>3F%Mt>q@Fdw>yW zvnA@brUGPuZ-o-D4}Y!Ow*c<^!}I1JFfkfFON5sXU_>gkvBZXYKn`U%p9An_DoY$= z-2p_JHw@Y)m#(!|3%O_nY|4!Si#x9kM;B*iEV8?>sTFHV#@$xpMqh)} zpQQ4AZ?+-}8U{vZt!l~rTm}@QKFN}R{TF|~^r*R))%Lt}pku17ovakoQU0}a@F*;t zn77b!!I=hR*8_5Sz4hMkQC<>f2n37br58Y{%4jHLA}}z}k->bT9B8Q-`#oWfFH-<# z>~N)R<-j>~%oz@F4*A??%tTi6TrKN{xp#bOAQ=xncUUi~Z#xq4r)Fk}hvVmg=(+pa zIl$I-X($&Pt5zavZplhOz}t0_d93OOKly zCM(bWE&XMl@aTl{Wrrdn)odU3ty`aRhxfTWwnB!JIrWpRrV3*_EoTzmSxA1oZ*A(w z<_EeG0^qCD1xlty&U^|Ak+RPX($5vZxHC-!3nNr=5X$p@$FM@jeJNat2|i@>_-fdQ zizF(CX|uV?Uorz+6B{+k199|3R!zeP8+}Ue>F8KwlT@QXB|~NuWQ-7gH&<7)W|T=E zws;m(IvSe%>pQ^lE!lK*wzFYk#5_@xG;b?)=YUVk+|MA8Tcm1t}< zLwI9r%P3h^x>1xRr+L^zfaUtK#zg}c2PZ+M&U$6|YwbR=bZ46BI|ZO1 zzyi64$&HZ^2Pel$r-|!u8wmx2If?BMl2eL|GQ@};=D9stU~gRIbptfOmbn$VL}l0u zK%E0#b?#TEtVVoE`t7*6yj!@pu%f%*2$$;!krpOLgqUOkr}Ee}uyvlfoYC8ErfzcU zOgjpD3TGbA#xgK6+Ol2_C*gGOvS=)oAt1;pE}HdgsYL;S(~eKCb@2c_-*_bTbr3dl zNw?Mf!Lb_9<%}j+5MW*gR#cLUuW_^n_=(|J#|ya!35}4Wy*TQd9Zt&n!9trJE`#<* z?q!HJHY=}u5m5IE&!5}4o$T!=fB;crd5@0V(|1v%9B4l`a1MC#d6$@SRnbg8yp zS-!EivMRkgnA6&H?+qhi-?!HW6LF^d17z|& zH}}GUtu4sKei%(bKDJD`DX$ZpAj)%39$TH8PN2H?#~fPvUXJGd`&8YlJO;3ggv_5s1L$PEe+4fgold%$(`fZ&L7vyJwvvZ3gRpSA0Un?-=_WfxCg}% zY7*UhlP8x}>gb&exRhF>!05AYk=fC{IorIks%qS{^{hY#n4VM|!~LMemly_}#!=(? z=#Q2oUS}J9n%jD9p1vA0ZPf`m-TZ;sK52zkEC14X?dTklS! z4JfIP_xx#!AJL12@12Y&AXHkT*~b!gmBVTL)`WZwC6c&*@>4*^25|y&)9`@T)9sm< zsq1amdbsIq`B$Uup8I3QEeICGd*$w*KS>CbKomSWz6iv|M%XVt98$0EZi09r){mh0V)j9;WSaMSQNQ`4!_lPVkcUUCwXf}rmq%f_ss7S3e<=X&0I-Gn zDhHZ!KY<35U^m-`+wHW_5}!p)0`=V4_h_GWMqB@?I+H318_VJi#e(-m!OT`9dJ^lG4)3?(WT$FWC4cb-wXB zA%j~_2ZH|4(OGc=O3P8BR2IKe!vPcWgy7U>pfHGvQPI(tU>@d&jn=dx&=C2i8uJ-^ z7;j1)&)ZE{2!hdk7(XlP)Y*FTkrwaSUy2^|Z{!ran12-kFTv+DtL{9~13(TyyO*Mi z|GqXWmOr^C};;;DRvEN!!et-QQ4GkQ!Q~#S(P7v9^}cupM>@!GZ@u_D?y6Y@dKy6^Y z!agsKQ7_}SUP4iyQtlpx*F#q8{gE3Gtnjz@C-TC#TF;o^#2^r}TK#R=s#lx9HhJiW z3ko06d#WFw3Y7ASbv=Q?|DKVt%^_LF@3r4KAc-?da{MI?_S=Q^H{*Z3VBk?lK|25~ zDcHQK7B|LF>SK`ILEnc04LW7}%8CVSJ4o8oyGN&hv-a#taKYNq7R@}!0U8rHcT5#R z4Mat6P50Z)&s9yG{V+l8t$r9JMr?l;!T>|5PK~CLLl+Vf3h@wVXLUad_lie*0_8C+ zG<*(kA2QH*z-@Dqu2EI__pij|-kh(GE#^|ABlDBCyuAE&zni#>Yxeoc$rl3w+-l1O zwyNEt(r@XEV4}e~O-?#o35!dh3ql>aTTnz?oWQF#7bd;mDUncLa&Nu{<=6hVT8mE@ z{+9FA8S? zPL#m`B_gO0n_Z;I{f_75I~b!FCcB=f?iLdMbV%5j%H_B>o4!xN@x}XbpfSi2Ft*b6 zi$zE0?QsFn$rb?`l0e-AFHcxV$l;JxjeF74$j~SO5Yot^4umqH~b`_VL7D{@&;=tD0*F#7j&r;84f_(w$YMC*fpGc*wnm@b3BH^Ds$gFYP zS8chSUbxh?PUG_k!GU!C`7;UHIBr?pb+vxi0OjFy8z>H&8(UnHPEf|3A0V?Lo`OHn zi5itBnni=(?15&c&O_rDwz1^a{;cL&SacP8*Hb3tbzeJOCr47X3l=$N&;q&*Se_0* z)8N-mzbTIA+jHCyegrtU0vBG!o;GxTVCE6-MJJHZ6N`anm>_d~@b9|^bi8gC$b~Fx zd#^4v^)}f~wQ8+u?u|n}y@mS7&aMW)Vr`%6hwyipYEp(H7Z)t&mBb3y#IPU2%_AZs z|Jf`6bZk-?N2gJ!9o?H1Hk&m2uhV}h*T1WG=23_My95+{o>ec{JGNbXwwq5|E_Ub0-FRix(&|&KuihTmkkT@|L++cVx3|-`dGoLsz#H zRLTDwrCE1PQ4A)Q5OI7T&E04B$Q-RSlyW?pESPs;W@3&tz(Vx!@L<)yb115FIi92q z3JGCp>MYxp3~s62KOoG(c)@hpt=bL!#hED-cYq)dHu4^V*al>0h2Y=EpeKmf>%q24 zyz~C*c&7G{``~G=(P`JrskiYesfJDG`E`>L&vkhi1#AB zd!gynZy)FnB1OJ&;B$l0+zLz{m2l9IFBM%~BL2&5B!CG5mAU`G8BpwTx8v6HB>an9 zz`BRx`DD(whFJ;dKs%lsxUvrzc|+t;p!f~ol%b?z70>R8ia7Ki0J5Zm#(=679k0hr z*Yi-(z2z3IngLKH-+V6N8kbZ7q32GJKy9UC2;6%~bbdw>6dgF}66 zY^-hf^%hV)?oK+x9TxqL=l3bd$^YC`nFb>y5iM9xo848L_ROHhU2xp21vAnzF)4of z^eKvxot^#iU{1-p>9u|Jt+g<{nSKZ4vz|0w9-hfMIcxv#g}|K2f1OvJ)9YoDg3rkDQLT1#{5|6{sEpPp!*t*V#?^ugL& z;ng|elYrxq$9g1_CmY#Uf6H0S(qKGwS72Xvw=%;Hi#WywjuuY672aoR9ysp(d~UZD zaE0B`)4(N2*}(C8V5Qu4IOdOPCU7(&?ecBu7xTBjoXpyMaKY+zGEuLMZr;54>+{?4 z7oX4DoA187MI{BeOu?)CPGP&>ye<1Ct5)Y;*WACk^V$8I?+Oc<{23TluZ`U7cDRjq zGH@p8@cY;H|G(!AcDG{jukY`d&zK=$ntv|_*kS=LI}QN0o`4}z`s|FPtW}8z za1HP43C<6X9Xlpff9~|@%fRYWI>q|r$&u$zE985p_1vBXutk=2(kU)}8GH>5Y zwdB9kcD%cLbz!ZwZ0Z~4=}*NZMSXAc16QU=psX_jRxD@(uq2B#fQ%rpe28c@j6kzM zL&LyPdx{xMKqC}@n1Kom7N9W>AhW2%XaJct!~%`|d;Lx4^}DZEo#_X;-qY33Wt~$( F69BmbDD40M diff --git a/script.module.infotagger/resources/modules/infotagger/listitem.py b/script.module.infotagger/resources/modules/infotagger/listitem.py deleted file mode 100644 index 8adee8f2b..000000000 --- a/script.module.infotagger/resources/modules/infotagger/listitem.py +++ /dev/null @@ -1,262 +0,0 @@ -# -*- coding: utf-8 -*- -# Module: default -# Author: jurialmunkey -# License: GPL v.3 https://www.gnu.org/copyleft/gpl.html -from xbmc import Actor, VideoStreamDetail, AudioStreamDetail, SubtitleStreamDetail, LOGINFO -from xbmc import log as kodi_log - - -def set_info_tag( - listitem, infolabels: dict, - tag_type: str = 'video', type_check: bool = False, - old_method_keys: tuple = ('size', 'count', 'date', )): - - if old_method_keys: - il = {k: infolabels[k] for k in old_method_keys if k in infolabels} - listitem.setInfo(tag_type, il) - - info_tag = ListItemInfoTag(listitem, tag_type, type_check) - info_tag.set_info(infolabels) - return info_tag - - -def ListItemInfoTag(listitem, tag_type: str = 'video', type_check=False): - """ - Pass xbmcgui.ListItem() to listitem with tag_type to the library type normally in li.setInfo(type=) - Optional set type_check= - - False: (default) - - Slightly increases performance by avoiding additional internal type checks - - Relys on Kodi Python API raising a TypeError to determine when to force type conversion - - Kodi creates EXCEPTION log spam when infolabels require type conversion - - True: - - Slightly descreases performance by requiring additional internal type checks - - Uses internal isinstance type check to determine when to force type conversion - - Prevents Kodi EXCEPTION log spam when infolabels require type conversion - """ - factory_routes = { - 'video': _ListItemInfoTagVideo, - 'music': _ListItemInfoTagMusic, - 'game': _ListItemInfoTagGame - } - - return factory_routes[tag_type](listitem, type_check=type_check) - - -class _ListItemInfoTag(): - def __init__(self, listitem, type_check=False): - self._listitem = listitem - self._info_tag = getattr(self._listitem, self._tag_gttr)() - self._type_chk = type_check - - def set_info(self, infolabels: dict): - """ Wrapper for compatibility with Matrix ListItem.setInfo() method """ - for k, v in infolabels.items(): - if v is None: - continue - - try: - _tag_attr = self._tag_attr[k] - - except KeyError: - log_msg = f'[script.module.infotagger] set_info:\nKeyError: {k}' - kodi_log(log_msg, level=LOGINFO) - continue - - try: - func = getattr(self._info_tag, _tag_attr['attr']) - if self._type_chk and not isinstance(v, _tag_attr['classinfo']): - raise TypeError - func(v) - - except KeyError: - if _tag_attr.get('skip'): - continue - - if 'route' in _tag_attr: - getattr(self, _tag_attr['route'])(v, infolabels) - continue - - log_msg = _tag_attr.get('log_msg') or '' - log_msg = f'[script.module.infotagger] set_info:\nKeyError: {log_msg}' - kodi_log(log_msg, level=LOGINFO) - continue - - except TypeError: - func(_tag_attr['convert'](v)) # Attempt to force conversion to correct type - - -class _ListItemInfoTagVideo(_ListItemInfoTag): - _tag_gttr = 'getVideoInfoTag' - _tag_attr = { - 'size': {'skip': True}, # Currently no infoTag setter for this property - 'count': {'skip': True}, # Currently no infoTag setter for this property - 'date': {'attr': 'setDateAdded', 'convert': str, 'classinfo': str}, # Unsure if this is the correct place to route this generic value - 'genre': {'attr': 'setGenres', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'country': {'attr': 'setCountries', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'year': {'attr': 'setYear', 'convert': int, 'classinfo': int}, - 'episode': {'attr': 'setEpisode', 'convert': int, 'classinfo': int}, - 'season': {'attr': 'setSeason', 'convert': int, 'classinfo': int}, - 'sortepisode': {'attr': 'setSortEpisode', 'convert': int, 'classinfo': int}, - 'sortseason': {'attr': 'setSortSeason', 'convert': int, 'classinfo': int}, - 'episodeguide': {'attr': 'setEpisodeGuide', 'convert': str, 'classinfo': str}, - 'showlink': {'attr': 'setShowLinks', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'top250': {'attr': 'setTop250', 'convert': int, 'classinfo': int}, - 'setid': {'attr': 'setSetId', 'convert': int, 'classinfo': int}, - 'tracknumber': {'attr': 'setTrackNumber', 'convert': int, 'classinfo': int}, - 'rating': {'attr': 'setRating', 'convert': float, 'classinfo': float}, - 'userrating': {'attr': 'setUserRating', 'convert': int, 'classinfo': int}, - 'watched': {'skip': True}, # Evaluated internally in Nexus based on playcount so skip - 'playcount': {'attr': 'setPlaycount', 'convert': int, 'classinfo': int}, - 'overlay': {'skip': True}, # Evaluated internally in Nexus based on playcount so skip - 'cast': {'route': 'set_info_cast'}, - 'castandrole': {'route': 'set_info_cast'}, - 'director': {'attr': 'setDirectors', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'mpaa': {'attr': 'setMpaa', 'convert': str, 'classinfo': str}, - 'plot': {'attr': 'setPlot', 'convert': str, 'classinfo': str}, - 'plotoutline': {'attr': 'setPlotOutline', 'convert': str, 'classinfo': str}, - 'title': {'attr': 'setTitle', 'convert': str, 'classinfo': str}, - 'originaltitle': {'attr': 'setOriginalTitle', 'convert': str, 'classinfo': str}, - 'sorttitle': {'attr': 'setSortTitle', 'convert': str, 'classinfo': str}, - 'duration': {'attr': 'setDuration', 'convert': int, 'classinfo': int}, - 'studio': {'attr': 'setStudios', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'tagline': {'attr': 'setTagLine', 'convert': str, 'classinfo': str}, - 'writer': {'attr': 'setWriters', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'tvshowtitle': {'attr': 'setTvShowTitle', 'convert': str, 'classinfo': str}, - 'premiered': {'attr': 'setPremiered', 'convert': str, 'classinfo': str}, - 'status': {'attr': 'setTvShowStatus', 'convert': str, 'classinfo': str}, - 'set': {'attr': 'setSet', 'convert': str, 'classinfo': str}, - 'setoverview': {'attr': 'setSetOverview', 'convert': str, 'classinfo': str}, - 'tag': {'attr': 'setTags', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'imdbnumber': {'attr': 'setIMDBNumber', 'convert': str, 'classinfo': str}, - 'code': {'attr': 'setProductionCode', 'convert': str, 'classinfo': str}, - 'aired': {'attr': 'setFirstAired', 'convert': str, 'classinfo': str}, - 'credits': {'attr': 'setWriters', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'lastplayed': {'attr': 'setLastPlayed', 'convert': str, 'classinfo': str}, - 'album': {'attr': 'setAlbum', 'convert': str, 'classinfo': str}, - 'artist': {'attr': 'setArtists', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'votes': {'attr': 'setVotes', 'convert': int, 'classinfo': int}, - 'path': {'attr': 'setPath', 'convert': str, 'classinfo': str}, - 'trailer': {'attr': 'setTrailer', 'convert': str, 'classinfo': str}, - 'dateadded': {'attr': 'setDateAdded', 'convert': str, 'classinfo': str}, - 'mediatype': {'attr': 'setMediaType', 'convert': str, 'classinfo': str}, - 'dbid': {'attr': 'setDbId', 'convert': int, 'classinfo': int}, - } - - def set_info_cast(self, cast: list, *args, **kwargs): - """ Wrapper to convert cast and castandrole from ListItem.setInfo() to InfoTagVideo.setCast() """ - def _set_cast_member(x, i): - if not isinstance(i, tuple): - i = (i, '',) - return {'name': f'{i[0]}', 'role': f'{i[1]}', 'order': x, 'thumbnail': ''} - - self._info_tag.setCast([Actor(**_set_cast_member(x, i)) for x, i in enumerate(cast, start=1)]) - - def set_cast(self, cast: list): - """ Wrapper for compatibility with Matrix ListItem.setCast() method """ - self._info_tag.setCast([Actor(**i) for i in cast]) - - def set_stream_details(self, stream_details: dict): - """ Wrapper for compatibility with multiple ListItem.addStreamInfo() methods in one call """ - if not stream_details: - return - - try: - for i in stream_details['video']: - try: - self._info_tag.addVideoStream(VideoStreamDetail(**i)) - except TypeError: - # TEMP BANDAID workaround for inconsistent key names prior to Nexus Beta changes - i['hdrType'] = i.pop('hdrtype', '') - i['stereoMode'] = i.pop('stereomode', '') - self._info_tag.addVideoStream(VideoStreamDetail(**i)) - except (KeyError, TypeError): - pass - - try: - for i in stream_details['audio']: - self._info_tag.addAudioStream(AudioStreamDetail(**i)) - except (KeyError, TypeError): - pass - - try: - for i in stream_details['subtitle']: - self._info_tag.addSubtitleStream(SubtitleStreamDetail(**i)) - except (KeyError, TypeError): - pass - - def add_stream_info(self, stream_type, stream_values): - """ Wrapper for compatibility with Matrix ListItem.addStreamInfo() method """ - stream_details = {'video': [], 'audio': [], 'subtitle': []} - stream_details[stream_type] = [stream_values] - self.set_stream_details(stream_details) - - def set_resume_point(self, infoproperties: dict, resume_key='ResumeTime', total_key='TotalTime', pop_keys=True): - """ Wrapper to get/pop resumetime and totaltime properties for InfoTagVideo.setResumePoint() """ - getter_func = infoproperties.pop if pop_keys else infoproperties.get - resume_time = getter_func(resume_key, None) - total_time = getter_func(total_key, None) - if resume_time and total_time: - self._info_tag.setResumePoint(resume_time, total_time) - elif resume_time: - self._info_tag.setResumePoint(resume_time) - return infoproperties - - def set_unique_ids(self, unique_ids: dict, default_id: str = None): - """ Wrapper for compatibility with Matrix ListItem.setUniqueIDs() method """ - self._info_tag.setUniqueIDs({k: f'{v}' for k, v in unique_ids.items()}, default_id) - - -class _ListItemInfoTagMusic(_ListItemInfoTag): - _tag_gttr = 'getMusicInfoTag' - _tag_attr = { - 'size': {'skip': True}, # Currently no infoTag setter for this property - 'count': {'skip': True}, # Currently no infoTag setter for this property - 'date': {'skip': True}, # Currently no infoTag setter for this property - 'tracknumber': {'attr': 'setTrack', 'convert': int, 'classinfo': int}, - 'discnumber': {'attr': 'setDisc', 'convert': int, 'classinfo': int}, - 'duration': {'attr': 'setDuration', 'convert': int, 'classinfo': int}, - 'year': {'attr': 'setYear', 'convert': int, 'classinfo': int}, - 'genre': {'attr': 'setGenres', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'album': {'attr': 'setAlbum', 'convert': str, 'classinfo': str}, - 'artist': {'attr': 'setArtist', 'convert': str, 'classinfo': str}, - 'title': {'attr': 'setTitle', 'convert': str, 'classinfo': str}, - 'rating': {'attr': 'setRating', 'convert': float, 'classinfo': float}, - 'userrating': {'attr': 'setUserRating', 'convert': int, 'classinfo': int}, - 'lyrics': {'attr': 'setLyrics', 'convert': str, 'classinfo': str}, - 'playcount': {'attr': 'setPlayCount', 'convert': int, 'classinfo': int}, - 'lastplayed': {'attr': 'setLastPlayed', 'convert': str, 'classinfo': str}, - 'mediatype': {'attr': 'setMediaType', 'convert': str, 'classinfo': str}, - 'dbid': {'route': 'set_info_music_dbid'}, - 'listeners': {'attr': 'setListeners', 'convert': int, 'classinfo': int}, - 'musicbrainztrackid': {'attr': 'setMusicBrainzTrackID', 'convert': str, 'classinfo': str}, - 'musicbrainzartistid': {'attr': 'setMusicBrainzArtistID', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'musicbrainzalbumid': {'attr': 'setMusicBrainzAlbumID', 'convert': str, 'classinfo': str}, - 'musicbrainzalbumartistid': {'attr': 'setMusicBrainzAlbumArtistID', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'comment': {'attr': 'setComment', 'convert': str, 'classinfo': str}, - 'albumartist': {'attr': 'setAlbumArtist', 'convert': str, 'classinfo': str}, # Not listed in setInfo docs but included for forward compatibility - } - - def set_info_music_dbid(self, dbid: int, infolabels: dict, *args, **kwargs): - """ Wrapper for InfoTagMusic.setDbId to retrieve mediatype """ - try: - mediatype = infolabels['mediatype'] - self._info_tag.setDbId(int(dbid), mediatype) - except (KeyError, TypeError): - return - - -class _ListItemInfoTagGame(_ListItemInfoTag): - _tag_gttr = 'getGameInfoTag' - _tag_attr = { - 'size': {'skip': True}, # Currently no infoTag setter for this property - 'count': {'skip': True}, # Currently no infoTag setter for this property - 'date': {'skip': True}, # Currently no infoTag setter for this property - 'title': {'attr': 'setTitle', 'convert': str, 'classinfo': str}, - 'platform': {'attr': 'setPlatform', 'convert': str, 'classinfo': str}, - 'genres': {'attr': 'setGenres', 'convert': lambda x: [x], 'classinfo': (list, tuple)}, - 'publisher': {'attr': 'setPublisher', 'convert': str, 'classinfo': str}, - 'developer': {'attr': 'setDeveloper', 'convert': str, 'classinfo': str}, - 'overview': {'attr': 'setOverview', 'convert': str, 'classinfo': str}, - 'year': {'attr': 'setYear', 'convert': int, 'classinfo': int}, - 'gameclient': {'attr': 'setGameClient', 'convert': str, 'classinfo': str}, - } diff --git a/script.module.jurialmunkey/addon.xml b/script.module.jurialmunkey/addon.xml deleted file mode 100644 index fd72c259e..000000000 --- a/script.module.jurialmunkey/addon.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - Common code required by TMDbHelper and other related jurialmunkey add-ons - GPL-3.0-or-later - https://github.com/jurialmunkey/script.module.jurialmunkey - - icon.png - - - diff --git a/script.module.jurialmunkey/icon.png b/script.module.jurialmunkey/icon.png deleted file mode 100644 index 283ed67c15365c85dba39caeb46990bc3d75177f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21434 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 diff --git a/script.module.jurialmunkey/resources/language/resource.language.en_gb/strings.po b/script.module.jurialmunkey/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index fde5e2f7b..000000000 --- a/script.module.jurialmunkey/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,27 +0,0 @@ -# XBMC Media Center language file -# Addon Name: TheMovieDb Helper -# Addon id: plugin.video.themoviedb.helper -# Addon Provider: jurialmunkey -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: 2014-10-26 17:05+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#: /request.py -msgctxt "#32001" -msgid "Suppressing retries for {} seconds" -msgstr "" - -#: /request.py -msgctxt "#32002" -msgid "ConnectionError: {}" -msgstr "" \ No newline at end of file diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/bcache.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/bcache.py deleted file mode 100644 index 92d975586..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/bcache.py +++ /dev/null @@ -1,89 +0,0 @@ -from jurialmunkey.plugin import format_name -from jurialmunkey.futils import get_filecache_name -from jurialmunkey.logger import kodi_try_except_internal_traceback -import jurialmunkey.scache - - -class BasicCache(): - _simplecache = jurialmunkey.scache.SimpleCache - - def __init__(self, filename=None): - self._filename = filename - self._cache = None - - @staticmethod - def kodi_traceback(exc, log_msg): - from xbmc import getLocalizedString - from jurialmunkey.logger import Logger - Logger( - log_name='[script.module.jurialmunkey]\n', - notification_head=f'Module {getLocalizedString(257)}', - notification_text=getLocalizedString(2104)).kodi_traceback(exc, log_msg) - - @kodi_try_except_internal_traceback('lib.addon.cache ret_cache') - def ret_cache(self): - if not self._cache: - self._cache = self._simplecache(filename=self._filename) - return self._cache - - @kodi_try_except_internal_traceback('lib.addon.cache get_cache') - def get_cache(self, cache_name): - self.ret_cache() - cache_name = get_filecache_name(cache_name or '') - return self._cache.get(cache_name) - - @kodi_try_except_internal_traceback('lib.addon.cache set_cache') - def set_cache(self, my_object, cache_name, cache_days=14, force=False, fallback=None): - """ set object to cache via thread """ - self._set_cache(my_object, cache_name, cache_days, force, fallback) - return my_object - - def _set_cache(self, my_object, cache_name, cache_days=14, force=False, fallback=None): - """ set object to cache """ - self.ret_cache() - cache_name = get_filecache_name(cache_name or '') - if force and (not my_object or not cache_name or not cache_days): - my_object = my_object or fallback - cache_days = force if isinstance(force, int) else cache_days - self._cache.set(cache_name, my_object, cache_days=cache_days) - - @kodi_try_except_internal_traceback('lib.addon.cache del_cache') - def del_cache(self, cache_name): - self.ret_cache() - cache_name = get_filecache_name(cache_name or '') - self._cache.set(cache_name, None, cache_days=0) - - @kodi_try_except_internal_traceback('lib.addon.cache use_cache') - def use_cache( - self, func, *args, - cache_days=14, cache_name='', cache_only=False, cache_force=False, cache_strip=[], cache_fallback=False, - cache_refresh=False, cache_combine_name=False, headers=None, - **kwargs): - """ - Simplecache takes func with args and kwargs - Returns the cached item if it exists otherwise does the function - """ - if not cache_name or cache_combine_name: - cache_name = format_name(cache_name, *args, **kwargs) - for k, v in cache_strip: - cache_name = cache_name.replace(k, v) - my_cache = self.get_cache(cache_name) if not cache_refresh else None - if my_cache: - return my_cache - if not cache_only: - if headers: - kwargs['headers'] = headers - my_object = func(*args, **kwargs) - return self.set_cache(my_object, cache_name, cache_days, force=cache_force, fallback=cache_fallback) - - -def use_simple_cache(cache_days=None): - def decorator(func): - def wrapper(self, *args, **kwargs): - kwargs['cache_days'] = cache_days or kwargs.get('cache_days', None) - kwargs['cache_combine_name'] = True - kwargs['cache_name'] = f'{func.__name__}.' - kwargs['cache_name'] = f'{self.__class__.__name__}.{kwargs["cache_name"]}' - return self._cache.use_cache(func, self, *args, **kwargs) - return wrapper - return decorator diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/dialog.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/dialog.py deleted file mode 100644 index a220e3177..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/dialog.py +++ /dev/null @@ -1,73 +0,0 @@ -import xbmcgui -from xbmc import executebuiltin - - -class ProgressDialog(object): - """ ContextManager for DialogProgressBG use in with statement """ - - def __init__(self, title='', message='', total=100, logging=1): - self.logging = logging - self._create(title, message, total) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - - @staticmethod - def kodi_log(msg, level=0): - from jurialmunkey.logger import Logger - Logger('[script.module.jurialmunkey]\n').kodi_log(msg, level) - - def _create(self, title='', message='', total=100): - self._pd = xbmcgui.DialogProgressBG() - self._pd.create(title, message) - self._count = 0 - self._total = total - self._title = title - self.kodi_log([self._title, ' - 00 ', message], self.logging) - return self._pd - - def update(self, message='', count=1, total=None): - if not self._pd: - return - if total: # Reset counter if given new total - self._count = count - self._total = total - self._count += count - self._progr = (((self._count) * 100) // self._total) - self._pd.update(self._progr, message=message) if message else self._pd.update(self._progr) - self.kodi_log([self._title, ' - ', self._progr, ' ', message], self.logging) - return self._progr - - def close(self): - if not self._pd: - return - self.kodi_log([self._title, ' - Done!'], self.logging) - self._pd.close() - - -class BusyDialog(): - def __init__(self, is_enabled=True): - """ ContextManager for DialogBusy in with statement """ - if is_enabled: - executebuiltin('ActivateWindow(busydialognocancel)') - self.is_enabled = is_enabled - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_traceback): - if not self.is_enabled: - return - executebuiltin('Dialog.Close(busydialognocancel)') - - -def busy_decorator(func): - def wrapper(*args, **kwargs): - """ Decorator for wrappingBusyDialog around a function """ - with BusyDialog(): - response = func(*args, **kwargs) - return response - return wrapper diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/futils.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/futils.py deleted file mode 100644 index 4cbed1a78..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/futils.py +++ /dev/null @@ -1,113 +0,0 @@ -# -*- coding: utf-8 -*- -# Module: default -# Author: jurialmunkey -# License: GPL v.3 https://www.gnu.org/copyleft/gpl.html -import xbmc -import xbmcvfs - -ADDONDATA = 'special://profile/addon_data/script.module.jurialmunkey/' -ALPHANUM_CHARS = "-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -INVALID_FILECHARS = "\\/\"\'<>:|?*" - - -class FileUtils(): - addondata = ADDONDATA - - def get_write_path(self, folder, join_addon_data=True, make_dir=True): - if join_addon_data: - folder = f'{self.addondata}{folder}/' - main_dir = xbmcvfs.validatePath(xbmcvfs.translatePath(folder)) - if make_dir and not xbmcvfs.exists(main_dir): - try: # Try makedir to avoid race conditions - xbmcvfs.mkdirs(main_dir) - except FileExistsError: - pass - return main_dir - - def get_file_path(self, folder, filename, join_addon_data=True, make_dir=True): - return validate_join(self.get_write_path(folder, join_addon_data, make_dir), filename) - - -def json_loads(obj): - import json - - def json_int_keys(ordered_pairs): - result = {} - for key, value in ordered_pairs: - try: - key = int(key) - except ValueError: - pass - result[key] = value - return result - try: - return json.loads(obj, object_pairs_hook=json_int_keys) - except json.JSONDecodeError: - return - - -def json_dumps(obj, separators=(',', ':')): - from json import dumps - return dumps(obj, separators=separators) - - -def validate_join(folder, filename): - path = '/'.join([folder, filename]) - return xbmcvfs.validatePath(xbmcvfs.translatePath(path)) - - -def validify_filename(filename, alphanum=False): - import unicodedata - filename = unicodedata.normalize('NFD', filename) - filename = u''.join([c for c in filename if (not alphanum or c in ALPHANUM_CHARS) and c not in INVALID_FILECHARS]) - return filename.strip('.') - - -def get_filecache_name(cache_name, alphanum=False): - cache_name = cache_name or '' - cache_name = cache_name.replace('\\', '_').replace('/', '_').replace('.', '_').replace('?', '_').replace('&', '_').replace('=', '_').replace('__', '_') - return validify_filename(cache_name, alphanum=alphanum).rstrip('_') - - -def make_hash(content): - import hashlib - return hashlib.md5(content.encode('utf-8')).hexdigest() - - -def check_hash(hashname, hashvalue=None): - last_version = xbmc.getInfoLabel('Skin.String({})'.format(hashname)) - if not last_version: - return hashvalue - if hashvalue != last_version: - return hashvalue - - -def load_filecontent(filename=None): - try: - vfs_file = xbmcvfs.File(filename) - content = vfs_file.read() - finally: - vfs_file.close() - return content - - -def write_file(filepath=None, content=None): - if not filepath: - return - f = xbmcvfs.File(filepath, 'w') - f.write(content) - f.close() - - -def write_skinfile(filename=None, folders=None, content=None, hashvalue=None, hashname=None, checksum=None): - if not filename or not folders or not content: - return - - for folder in folders: - write_file(filepath='special://skin/{}/{}'.format(folder, filename), content=content) - - if hashvalue and hashname: - xbmc.executebuiltin('Skin.SetString({},{})'.format(hashname, hashvalue)) - - if checksum: - xbmc.executebuiltin('Skin.SetString({},{})'.format(checksum, make_hash(content))) diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/logger.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/logger.py deleted file mode 100644 index c4b03019d..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/logger.py +++ /dev/null @@ -1,150 +0,0 @@ -import xbmc -from timeit import default_timer as timer - - -def kodi_try_except_internal_traceback(log_msg, exception_type=Exception): - """ Decorator to catch exceptions and notify error for uninterruptable services """ - def decorator(func): - def wrapper(self, *args, **kwargs): - try: - return func(self, *args, **kwargs) - except exception_type as exc: - self.kodi_traceback(exc, log_msg) - return wrapper - return decorator - - -class Logger(): - def __init__( - self, - log_name: str = '', - notification_head: str = '', - notification_text: str = '', - debug_logging: bool = False): - self._addon_logname = log_name - self._debug_logging = debug_logging - self._notification_head = notification_head - self._notification_text = notification_text - - def kodi_log(self, value, level=0): - try: - if isinstance(value, list): - value = ''.join(map(str, value)) - if isinstance(value, bytes): - value = value.decode('utf-8') - logvalue = f'{self._addon_logname}{value}' - if level == 2 and self._debug_logging: - xbmc.log(logvalue, level=xbmc.LOGINFO) - elif level == 1: - xbmc.log(logvalue, level=xbmc.LOGINFO) - else: - xbmc.log(logvalue, level=xbmc.LOGDEBUG) - except Exception as exc: - xbmc.log(f'Logging Error: {exc}', level=xbmc.LOGINFO) - - def kodi_traceback(self, exception, log_msg=None, log_level=1, notification=True): - """ Method for logging caught exceptions and notifying user """ - if notification: - from xbmcgui import Dialog - Dialog().notification(self._notification_head, self._notification_text) - msg = f'Error Type: {type(exception).__name__}\nError Contents: {exception.args!r}' - msg = [log_msg, '\n', msg, '\n'] if log_msg else [msg, '\n'] - try: - import traceback - self.kodi_log(msg + traceback.format_tb(exception.__traceback__), log_level) - except Exception as exc: - self.kodi_log(f'ERROR WITH TRACEBACK!\n{exc}\n{msg}', log_level) - - def kodi_try_except(self, log_msg, exception_type=Exception): - """ Decorator to catch exceptions and notify error for uninterruptable services """ - def decorator(func): - def wrapper(*args, **kwargs): - try: - return func(*args, **kwargs) - except exception_type as exc: - self.kodi_traceback(exc, log_msg) - return wrapper - return decorator - - def log_timer_report(self, timer_lists, paramstring): - _threaded = [ - 'item_api', 'item_tmdb', 'item_ftv', 'item_map', 'item_cache', - 'item_set', 'item_get', 'item_getx', 'item_non', 'item_nonx', 'item_art', - 'item_abc', 'item_xyz'] - total_log = timer_lists.pop('total', 0) - timer_log = ['DIRECTORY TIMER REPORT\n', paramstring, '\n'] - timer_log.append('------------------------------\n') - for k, v in timer_lists.items(): - if k in _threaded: - avg_time = f'{sum(v) / len(v):7.3f} sec avg | {max(v):7.3f} sec max | {len(v):3}' if v else ' None' - timer_log.append(f' - {k:12s}: {avg_time}\n') - elif k[:4] == 'item': - avg_time = f'{sum(v) / len(v):7.3f} sec avg | {sum(v):7.3f} sec all | {len(v):3}' if v else ' None' - timer_log.append(f' - {k:12s}: {avg_time}\n') - else: - tot_time = f'{sum(v) / len(v):7.3f} sec' if v else ' None' - timer_log.append(f'{k:15s}: {tot_time}\n') - timer_log.append('------------------------------\n') - tot_time = f'{sum(total_log) / len(total_log):7.3f} sec' if total_log else ' None' - timer_log.append(f'{"Total":15s}: {tot_time}\n') - for k, v in timer_lists.items(): - if v and k in _threaded: - timer_log.append(f'\n{k}:\n{" ".join([f"{i:.3f} " for i in v])}\n') - self.kodi_log(timer_log, 1) - - -class TryExceptLog(): - def __init__(self, exc_types=[Exception], log_msg=None, log_level=1, kodi_log=None): - """ ContextManager to allow exception passing and log """ - self.log_msg = log_msg - self.exc_types = exc_types - self.log_level = log_level - self.kodi_log = kodi_log or Logger().kodi_log - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_traceback): - if exc_type and exc_type not in self.exc_types: - return - if self.log_level: - self.kodi_log(f'{self.log_msg or "ERROR PASSED"}: {exc_type}', self.log_level) - return True - - -class TimerList(): - def __init__(self, dict_obj, list_name, log_threshold=0.001, logging=True): - """ ContextManager for timing code blocks and storing in a list """ - self.list_obj = dict_obj.setdefault(list_name, []) - self.log_threshold = log_threshold - self.timer_a = timer() if logging else None - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_traceback): - if not self.timer_a: - return - timer_z = timer() - total_time = timer_z - self.timer_a - if total_time > self.log_threshold: - self.list_obj.append(total_time) - - -class TimerFunc(): - def __init__(self, timer_name, log_threshold=0.05, inline=False, kodi_log=None): - """ ContextManager for timing code blocks and outputing to log """ - self.inline = ' ' if inline else '\n' - self.timer_name = timer_name - self.log_threshold = log_threshold - self.kodi_log = kodi_log or Logger().kodi_log - self.timer_a = timer() - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_traceback): - timer_z = timer() - total_time = timer_z - self.timer_a - if total_time > self.log_threshold: - self.kodi_log(f'{self.timer_name}{self.inline}{total_time:.3f} sec', 1) diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/parser.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/parser.py deleted file mode 100644 index f8ab3d3fd..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/parser.py +++ /dev/null @@ -1,188 +0,0 @@ -def try_int(string, base=None, fallback=0): - '''helper to parse int from string without erroring on empty or misformed string''' - try: - return int(string, base) if base else int(string) - except Exception: - return fallback - - -def try_float(string): - '''helper to parse float from string without erroring on empty or misformed string''' - try: - return float(string or 0) - except Exception: - return 0 - - -def try_str(value): - '''helper to stringify value''' - try: - return f'{value}' - except Exception: - return '' - - -def try_type(value, output=None): - if output == int: - return try_int(value) - if output == str: - return try_str(value) - if output == float: - return try_float(value) - - -def partition_list(iterable, pred): - """Use a predicate to partition entries into false entries and true entries - partition(range(10), is_odd) --> 0 2 4 6 8 and 1 3 5 7 9 - """ - from itertools import tee, filterfalse - t1, t2 = tee(iterable) - return filterfalse(pred, t1), filter(pred, t2) - - -def parse_paramstring(paramstring): - """ helper to assist to standardise urllib parsing """ - from urllib.parse import unquote_plus - from unicodedata import normalize - params = dict() - paramstring = paramstring.replace('&', '&') # Just in case xml string - for param in paramstring.split('&'): - if '=' not in param: - continue - k, v = param.split('=') - params[unquote_plus(k)] = normalize('NFKD', unquote_plus(v)).strip('\'').strip('"') # Normalize and decompose combined utf-8 forms such as Arabic and strip out quotes - return params - - -def get_between_strings(string, startswith='', endswith=''): - import re - exp = startswith + '(.+?)' + endswith - try: - return re.search(exp, string).group(1) - except AttributeError: - return '' - - -def reconfigure_legacy_params(**kwargs): - if 'type' in kwargs: - kwargs['tmdb_type'] = kwargs.pop('type') - # if kwargs.get('tmdb_type') in ['season', 'episode']: - # kwargs['tmdb_type'] = 'tv' - return kwargs - - -def dict_to_list(items, key): - items = items or [] - return [i[key] for i in items if i.get(key)] - - -def merge_two_dicts(x, y, reverse=False, deep=False): - xx = y or {} if reverse else x or {} - yy = x or {} if reverse else y or {} - z = xx.copy() # start with x's keys and values - if not deep: # modifies z with y's keys and values - z.update(yy) - return z - for k, v in yy.items(): - if isinstance(v, dict): - merge_two_dicts(z.setdefault(k, {}), v, reverse=reverse, deep=True) - elif v: - z[k] = v - return z - - -def merge_dicts(org, upd, skipempty=False): - source = org.copy() - for k, v in upd.items(): - if not k: - continue - if skipempty and not v: - continue - if isinstance(v, dict): - if not isinstance(source.get(k), dict): - source[k] = {} - source[k] = merge_dicts(source.get(k), v, skipempty=skipempty) - continue - source[k] = v - return source - - -def merge_two_items(base_item, item): - item = item or {} - base_item = base_item or {} - item['stream_details'] = merge_two_dicts(base_item.get('stream_details', {}), item.get('stream_details', {})) - item['params'] = merge_two_dicts(base_item.get('params', {}), item.get('params', {})) - item['infolabels'] = merge_two_dicts(base_item.get('infolabels', {}), item.get('infolabels', {})) - item['infoproperties'] = merge_two_dicts(base_item.get('infoproperties', {}), item.get('infoproperties', {})) - item['art'] = merge_two_dicts(base_item.get('art', {}), item.get('art', {})) - item['unique_ids'] = merge_two_dicts(base_item.get('unique_ids', {}), item.get('unique_ids', {})) - item['cast'] = item.get('cast') or base_item.get('cast') or [] - return item - - -def del_empty_keys(d, values: list = None): - values = values or [] - values += [None, ''] - return {k: v for k, v in d.items() if v not in values} - - -def find_dict_in_list(list_of_dicts, key, value): - """ Returns list of indexes for list of dictionaries where d.get(key) == value """ - return [list_index for list_index, dic in enumerate(list_of_dicts) if dic.get(key) == value] - - -def find_dict_list_index(list_of_dicts, key, value, default=None): - """ Returns first index for list of dictionaries where d.get(ket) == value """ - return next((list_index for list_index, dic in enumerate(list_of_dicts) if dic[key] == value), default) - - -def get_params(item, tmdb_type, tmdb_id=None, params=None, definition=None, base_tmdb_type=None, iso_country=None): - params = params or {} - tmdb_id = tmdb_id or item.get('id') - if params == -1: - return {} - definition = definition or {'info': 'details', 'tmdb_type': '{tmdb_type}', 'tmdb_id': '{tmdb_id}'} - for k, v in definition.items(): - params[k] = v.format(tmdb_type=tmdb_type, tmdb_id=tmdb_id, base_tmdb_type=base_tmdb_type, iso_country=iso_country, **item) - return del_empty_keys(params) - - -def load_in_data(byt, msk): - lmas = len(msk) - outp = bytes(c ^ msk[i % lmas] for i, c in enumerate(byt)) - return outp - - -def split_items(items, separator='/'): - if items and isinstance(items, str): - return items.split(f' {separator} ') - if not isinstance(items, list): - return [items] - return items - - -class EncodeURL(): - def __init__(self, plugin_path): - self._pluginpath = plugin_path - - def encode_url(self, path=None, **kwargs): - from urllib.parse import urlencode - path = path or self._pluginpath - paramstring = f'?{urlencode(kwargs)}' if kwargs else '' - return f'{path}{paramstring}' - - -class IterProps(): - def __init__(self, max_props: int = 10): - self._max_props = max_props - - def iter_props(self, items, property_name, infoproperties=None, func=None, **kwargs): - infoproperties = infoproperties or {} - if not items or not isinstance(items, list): - return infoproperties - for x, i in enumerate(items, start=1): - for k, v in kwargs.items(): - infoproperties[f'{property_name}.{x}.{k}'] = func(i.get(v)) if func else i.get(v) - if x >= self._max_props: - break - return infoproperties diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/plugin.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/plugin.py deleted file mode 100644 index afe8b67d0..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/plugin.py +++ /dev/null @@ -1,58 +0,0 @@ -import xbmc -from xbmcaddon import Addon as KodiAddon - - -class KodiPlugin(): - def __init__(self, addon_id): - self._addon_id = addon_id - self._addon = KodiAddon(addon_id) - self._addon_name = self._addon.getAddonInfo('name') - self._addon_path = self._addon.getAddonInfo('path') - self._addon_getsettingroute = { - 'bool': self._addon.getSettingBool, - 'int': self._addon.getSettingInt, - 'str': self._addon.getSettingString} - self._addon_setsettingroute = { - 'bool': self._addon.setSettingBool, - 'int': self._addon.setSettingInt, - 'str': self._addon.setSettingString} - - def get_setting(self, setting, mode='bool'): - return self._addon_getsettingroute[mode](setting) - - def set_setting(self, setting, data, mode='bool'): - return self._addon_setsettingroute[mode](setting, data) - - def get_localized(self, localize_int=0): - if localize_int < 30000 or localize_int >= 33000: - return xbmc.getLocalizedString(localize_int) - return self._addon.getLocalizedString(localize_int) - - -def format_name(cache_name, *args, **kwargs): - # Define a type whitelist to avoiding adding non-basic types like classes to cache name - permitted_types = (int, float, str, bool, bytes) - for arg in args: - if not isinstance(arg, permitted_types): - continue - cache_name = f'{cache_name}/{arg}' if cache_name else f'{arg}' - for key, value in sorted(kwargs.items()): - if not isinstance(value, permitted_types): - continue - cache_name = f'{cache_name}&{key}={value}' if cache_name else f'{key}={value}' - return cache_name - - -def format_folderpath(path, content='videos', affix='return', info=None, play='PlayMedia'): - if not path: - return - if info == 'play': - return f'{play}({path})' - if xbmc.getCondVisibility("Window.IsMedia") and xbmc.getInfoLabel("System.CurrentWindow").lower() == content: - return f'Container.Update({path})' - return f'ActivateWindow({content},{path},{affix})' - - -def set_kwargattr(obj, kwargs): - for k, v in kwargs.items(): - setattr(obj, k, v) diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/reqapi.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/reqapi.py deleted file mode 100644 index 74c774f32..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/reqapi.py +++ /dev/null @@ -1,264 +0,0 @@ -from xbmc import getCondVisibility -from xbmcgui import Dialog - -from jurialmunkey.parser import try_int -from jurialmunkey.window import get_property -from jurialmunkey.tmdate import get_timestamp, set_timestamp -from jurialmunkey.plugin import KodiPlugin -from jurialmunkey.bcache import BasicCache - -KODIPLUGIN = KodiPlugin('script.module.jurialmunkey') -get_localized = KODIPLUGIN.get_localized - -CACHE_SHORT, CACHE_MEDIUM, CACHE_LONG, CACHE_EXTENDED = 1, 7, 14, 90 - - -""" Lazyimports -from copy import copy -from json import dumps -import requests -""" - - -def translate_xml(request): - """ MiniDOM alternative to ElementTree parsing of XML to dictionary """ - - def dictify(r, root=True, parent_dict=None): - if root: - - r = r.firstChild - return {r.tagName: dictify(r, False)} - - if parent_dict is None: - parent_dict = {} - - for c in r.childNodes: - if c.nodeType == c.TEXT_NODE: - parent_dict['_text'] = c.nodeValue - continue - - child_list = parent_dict.setdefault(c.tagName, []) - child_dict = {k: v for k, v in c.attributes.items()} if c.attributes else {} - child_list.append(child_dict) - - if c.childNodes: - dictify(c, False, child_dict) - - return parent_dict - - if not request: - return - - from xml.dom.minidom import parseString - from xml.parsers.expat import ExpatError - try: - return dictify(parseString(request.text)) - except ExpatError: - return - - -def json_loads(obj): - from json import loads - return loads(obj) - - -class RequestAPI(object): - error_notification = None - _basiccache = BasicCache - - def __init__(self, req_api_url=None, req_api_key=None, req_api_name=None, timeout=None, error_notification=None): - self.req_api_url = req_api_url or '' - self.req_api_key = req_api_key or '' - self.req_api_name = req_api_name or '' - self.req_timeout_err_prop = f'TimeOutError.{self.req_api_name}' - self.req_timeout_err = 0 # Only check last timeout on timeout since we only want to suppress when multiple - self.req_connect_err_prop = f'ConnectionError.{self.req_api_name}' - self.req_connect_err = get_property(self.req_connect_err_prop, is_type=float) or 0 - self.req_500_err_prop = f'500Error.{self.req_api_name}' - self.req_500_err = get_property(self.req_500_err_prop) - self.req_500_err = json_loads(self.req_500_err) if self.req_500_err else {} - self.req_strip = [(self.req_api_url, self.req_api_name), (self.req_api_key, ''), ('is_xml=False', ''), ('is_xml=True', '')] - self.headers = None - self.timeout = timeout or 15 - self._cache = self._basiccache(filename=f'{req_api_name or "requests"}.db') - self._error_notification = error_notification or self.error_notification - self.translate_xml = translate_xml - - @staticmethod - def kodi_log(msg, level=0): - from jurialmunkey.logger import Logger - Logger('[script.module.jurialmunkey]\n').kodi_log(msg, level) - - def do_error_notification(self, log_msg, note_head, note_body): - self.kodi_log(log_msg, 1) - if not self._error_notification: - return - Dialog().notification(note_head, note_body) - - def get_api_request_json(self, request=None, postdata=None, headers=None, is_xml=False, method=None): - request = self.get_api_request(request=request, postdata=postdata, headers=headers, method=method) - if not request: - return {} - response = self.translate_xml(request) if is_xml else request.json() - request.close() - return response - - def nointernet_err(self, err, log_time=900): - # Check Kodi internet status to confirm network is down - if getCondVisibility("System.InternetState"): - return - - # Get the last error timestamp - err_prop = f'NoInternetError.{self.req_api_name}' - last_err = get_property(err_prop, is_type=float) or 0 - - # Only log error and notify user if it hasn't happened in last {log_time} seconds to avoid log/gui spam - if not get_timestamp(last_err): - self.do_error_notification( - f'ConnectionError: {get_localized(13297)}\n{err}\nSuppressing retries.', - get_localized(32002).format(self.req_api_name), get_localized(13297)) - - # Update our last error timestamp and return it - return get_property(err_prop, set_timestamp(log_time)) - - def connection_error(self, err, wait_time=30, msg_affix='', check_status=False): - self.req_connect_err = set_timestamp(wait_time) - get_property(self.req_connect_err_prop, self.req_connect_err) - - if check_status and self.nointernet_err(err): - return - - self.do_error_notification( - f'ConnectionError: {msg_affix} {err}\nSuppressing retries for {wait_time} seconds', - get_localized(32002).format(' '.join([self.req_api_name, msg_affix])), - get_localized(32001).format(f'{wait_time}')) - - def fivehundred_error(self, request, wait_time=60): - from json import dumps - self.req_500_err[request] = set_timestamp(wait_time) - get_property(self.req_500_err_prop, dumps(self.req_500_err)) - self.do_error_notification( - f'ConnectionError: {dumps(self.req_500_err)}\nSuppressing retries for {wait_time} seconds', - get_localized(32002).format(self.req_api_name), - get_localized(32001).format(f'{wait_time}')) - - def timeout_error(self, err): - """ Log timeout error - If two timeouts occur in x3 the timeout limit then set connection error - e.g. if timeout limit is 10s then two timeouts within 30s trigger connection error - """ - self.kodi_log(f'ConnectionTimeOut: {err}', 1) - self.req_timeout_err = self.req_timeout_err or get_property(self.req_timeout_err_prop, is_type=float) or 0 - if get_timestamp(self.req_timeout_err): - self.connection_error(err, msg_affix='timeout') - self.req_timeout_err = set_timestamp(self.timeout * 3) - get_property(self.req_timeout_err_prop, self.req_timeout_err) - - def get_simple_api_request(self, request=None, postdata=None, headers=None, method=None): - import requests - try: - if method == 'delete': - return requests.delete(request, headers=headers, timeout=self.timeout) - if method == 'put': - return requests.put(request, data=postdata, headers=headers, timeout=self.timeout) - if method == 'json': - return requests.post(request, json=postdata, headers=headers, timeout=self.timeout) - if postdata or method == 'post': # If pass postdata assume we want to post - return requests.post(request, data=postdata, headers=headers, timeout=self.timeout) - return requests.get(request, headers=headers, timeout=self.timeout) - except requests.exceptions.ConnectionError as errc: - self.connection_error(errc, check_status=True) - except requests.exceptions.Timeout as errt: - self.timeout_error(errt) - except Exception as err: - self.kodi_log(f'RequestError: {err}', 1) - - def get_api_request(self, request=None, postdata=None, headers=None, method=None): - """ - Make the request to the API by passing a url request string - """ - # Connection error in last minute for this api so don't keep trying - if get_timestamp(self.req_connect_err): - return - if get_timestamp(self.req_500_err.get(request)): - return - - # Get response - response = self.get_simple_api_request(request, postdata, headers, method) - if response is None or not response.status_code: - return - - # Some error checking - if not response.status_code == 200 and try_int(response.status_code) >= 400: # Error Checking - # 500 code is server error which usually indicates Trakt is down - # In this case let's set a connection error and suppress retries for a minute - if response.status_code == 500: - self.fivehundred_error(request) - # 503 code is server error which usually indicates Trakt has database maintenance - # In this case let's set a connection error and suppress retries for five minutes - elif response.status_code == 503: - self.connection_error(503, wait_time=300) - # 429 is too many requests code so suppress retries for a minute - elif response.status_code == 429: - self.connection_error(429) - # Don't write 400 Bad Request error to log - # 401 == OAuth / API key required - elif try_int(response.status_code) > 400: - log_level = 2 if try_int(response.status_code) in [404] else 1 - self.kodi_log([ - f'HTTP Error Code: {response.status_code}', - f'\nRequest: {request.replace(self.req_api_key, "") if request else None}', - f'\nPostdata: {postdata}' if postdata else '', - f'\nHeaders: {headers}' if headers else '', - f'\nResponse: {response}' if response else ''], log_level) - return - - # Return our response - return response - - def get_request_url(self, *args, **kwargs): - """ - Creates a url request string: - https://api.themoviedb.org/3/arg1/arg2?api_key=foo&kwparamkey=kwparamvalue - """ - url = '/'.join((self.req_api_url, '/'.join(map(str, (i for i in args if i is not None))))) - sep = '&' if '?' in url else '?' - if self.req_api_key: - url = sep.join((url, self.req_api_key)) - sep = '&' - if not kwargs: - return url - kws = '&'.join((f'{k}={v}' for k, v in kwargs.items() if v is not None)) - return sep.join((url, kws)) if kws else url - - def get_request_sc(self, *args, **kwargs): - """ Get API request using the short cache """ - kwargs['cache_days'] = CACHE_SHORT - return self.get_request(*args, **kwargs) - - def get_request_lc(self, *args, **kwargs): - """ Get API request using the long cache """ - kwargs['cache_days'] = CACHE_LONG - return self.get_request(*args, **kwargs) - - def get_request( - self, *args, - cache_days=0, cache_name='', cache_only=False, cache_force=False, cache_fallback=False, cache_refresh=False, - cache_combine_name=False, cache_strip=[], headers=None, postdata=None, is_xml=False, - **kwargs): - """ Get API request from cache (or online if no cached version) """ - cache_strip = self.req_strip + cache_strip - request_url = self.get_request_url(*args, **kwargs) - return self._cache.use_cache( - self.get_api_request_json, request_url, - headers=headers or self.headers, # Optional override to default headers. - postdata=postdata, # Postdata if need to POST to a RESTful API. - is_xml=is_xml, # Response needs translating from XML to dict - cache_refresh=cache_refresh, # Ignore cached timestamps and retrieve new object. - cache_days=cache_days, # Number of days to cache retrieved object if not already in cache. - cache_name=cache_name, # Affix to standard cache name. - cache_only=cache_only, # Only retrieve object from cache. - cache_force=cache_force, # Force retrieved object to be saved in cache. Use int to specify cache_days for fallback object. - cache_fallback=cache_fallback, # Object to force cache if no object retrieved. - cache_combine_name=cache_combine_name, # Combine given cache_name with auto naming via args/kwargs - cache_strip=cache_strip) # Strip out api key and url from cache name diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/scache.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/scache.py deleted file mode 100644 index 76ac1d33a..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/scache.py +++ /dev/null @@ -1,285 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -import zlib -import xbmcvfs -from xbmcgui import Window -from xbmc import Monitor, sleep -from contextlib import contextmanager -from jurialmunkey.tmdate import set_timestamp -from jurialmunkey.futils import FileUtils -from jurialmunkey.futils import json_loads as data_loads -from json import dumps as data_dumps -import sqlite3 - - -FILEUTILS = FileUtils() - - -DATABASE_NAME = 'database_v6' -TIME_MINUTES = 60 -TIME_HOURS = 60 * TIME_MINUTES -TIME_DAYS = 24 * TIME_HOURS - - -class SimpleCache(object): - '''simple stateless caching system for Kodi''' - _exit = False - _auto_clean_interval = 4 * TIME_HOURS - _win = None - _busy_tasks = [] - _database = None - _memcache = False - _basefolder = '' - _fileutils = FILEUTILS - - def __init__(self, folder=None, filename=None): - '''Initialize our caching class''' - folder = folder or DATABASE_NAME - basefolder = f'{self._basefolder}{folder}' - filename = filename or 'defaultcache.db' - self._win = Window(10000) - self._monitor = Monitor() - self._db_file = self._fileutils.get_file_path(basefolder, filename, join_addon_data=basefolder == folder) - self._sc_name = f'{folder}_{filename}_simplecache' - self._queue = [] - self._re_use_con = True - self._connection = None - self.check_cleanup() - self.kodi_log("CACHE: Initialized") - - @staticmethod - def kodi_log(msg, level=0): - from jurialmunkey.logger import Logger - Logger('[script.module.jurialmunkey]\n').kodi_log(msg, level) - - def close(self): - '''tell any tasks to stop immediately (as we can be called multithreaded) and cleanup objects''' - self._exit = True - # wait for all tasks to complete - while self._busy_tasks and not self._monitor.abortRequested(): - sleep(25) - self.kodi_log(f'CACHE: Closed {self._sc_name}', 2) - - def __del__(self): - '''make sure close is called''' - if self._queue: - self.kodi_log(f'CACHE: Write {len(self._queue)} Items in Queue\n{self._sc_name}', 2) - for i in self._queue: - self._set_db_cache(*i) - self._queue = [] - self.close() - - @contextmanager - def busy_tasks(self, task_name): - self._busy_tasks.append(task_name) - try: - yield - finally: - self._busy_tasks.remove(task_name) - - def get(self, endpoint): - ''' - get object from cache and return the results - endpoint: the (unique) name of the cache object as reference - ''' - cur_time = set_timestamp(0, True) - result = self._get_mem_cache(endpoint, cur_time) # Try from memory first - return result or self._get_db_cache(endpoint, cur_time) # Fallback to checking database if not in memory - - def set(self, endpoint, data, cache_days=30): - """ set data in cache """ - with self.busy_tasks(f'set.{endpoint}'): - expires = set_timestamp(cache_days * TIME_DAYS, True) - data = data_dumps(data, separators=(',', ':')) - self._set_mem_cache(endpoint, expires, data) - self._set_db_cache(endpoint, expires, data) - - def check_cleanup(self): - '''check if cleanup is needed - public method, may be called by calling addon''' - cur_time = set_timestamp(0, True) - lastexecuted = self._win.getProperty(f'{self._sc_name}.clean.lastexecuted') - if not lastexecuted: - self._win.setProperty(f'{self._sc_name}.clean.lastexecuted', str(cur_time - self._auto_clean_interval + 600)) - elif (int(lastexecuted) + self._auto_clean_interval) < cur_time: - self._do_cleanup() - - def _get_mem_cache(self, endpoint, cur_time): - ''' - get cache data from memory cache - we use window properties because we need to be stateless - ''' - if not self._memcache: - return - - # Check expiration time - expr_endpoint = f'{self._sc_name}_expr_{endpoint}' - expr_propdata = self._win.getProperty(expr_endpoint) - if not expr_propdata or int(expr_propdata) <= cur_time: - return - - # Retrieve data - data_endpoint = f'{self._sc_name}_data_{endpoint}' - data_propdata = self._win.getProperty(data_endpoint) - if not data_propdata: - return - - return data_loads(data_propdata) - - def _set_mem_cache(self, endpoint, expires, data): - ''' - window property cache as alternative for memory cache - usefull for (stateless) plugins - ''' - if not self._memcache: - return - expr_endpoint = f'{self._sc_name}_expr_{endpoint}' - data_endpoint = f'{self._sc_name}_data_{endpoint}' - self._win.setProperty(expr_endpoint, str(expires)) - self._win.setProperty(data_endpoint, data) - - def _get_db_cache(self, endpoint, cur_time): - '''get cache data from sqllite _database''' - result = None - query = "SELECT expires, data, checksum FROM simplecache WHERE id = ? LIMIT 1" - cache_data = self._execute_sql(query, (endpoint,)) - if not cache_data: - return - cache_data = cache_data.fetchone() - if not cache_data or int(cache_data[0]) <= cur_time: - return - try: - data = str(zlib.decompress(cache_data[1]), 'utf-8') - except TypeError: - data = cache_data[1] - self._set_mem_cache(endpoint, cache_data[0], data) - result = data_loads(data) - return result - - def _set_db_cache(self, endpoint, expires, data): - ''' store cache data in _database ''' - query = "INSERT OR REPLACE INTO simplecache( id, expires, data, checksum) VALUES (?, ?, ?, ?)" - data = zlib.compress(bytes(data, 'utf-8')) - self._execute_sql(query, (endpoint, expires, data, 0)) - - def _do_delete(self): - '''perform cleanup task''' - if self._exit or self._monitor.abortRequested(): - return - - with self.busy_tasks(__name__): - cur_time = set_timestamp(0, True) - self.kodi_log(f'CACHE: Deleting {self._sc_name}...') - - self._win.setProperty(f'{self._sc_name}.cleanbusy', "busy") - - query = 'DELETE FROM simplecache' - self._execute_sql(query) - self._execute_sql("VACUUM") - - # Washup - self._win.setProperty(f'{self._sc_name}.clean.lastexecuted', str(cur_time)) - self._win.clearProperty(f'{self._sc_name}.cleanbusy') - self.kodi_log(f'CACHE: Delete {self._sc_name} done') - - def _do_cleanup(self, force=False): - '''perform cleanup task''' - if self._exit or self._monitor.abortRequested(): - return - - with self.busy_tasks(__name__): - cur_time = set_timestamp(0, True) - self.kodi_log(f"CACHE: Running cleanup...\n{self._sc_name}", 1) - if self._win.getProperty(f'{self._sc_name}.cleanbusy'): - return - self._win.setProperty(f'{self._sc_name}.cleanbusy', "busy") - - query = "SELECT id, expires FROM simplecache" - for cache_data in self._execute_sql(query).fetchall(): - cache_id = cache_data[0] - cache_expires = cache_data[1] - if self._exit or self._monitor.abortRequested(): - return - # always cleanup all memory objects on each interval - self._win.clearProperty(cache_id) - # clean up db cache object only if expired - if force or int(cache_expires) < cur_time: - query = 'DELETE FROM simplecache WHERE id = ?' - self._execute_sql(query, (cache_id,)) - self.kodi_log(f'CACHE: delete from db {cache_id}') - - # compact db - self._execute_sql("VACUUM") - - # Washup - self._win.setProperty(f'{self._sc_name}.clean.lastexecuted', str(cur_time)) - self._win.clearProperty(f'{self._sc_name}.cleanbusy') - self.kodi_log(f"CACHE: Cleanup complete...\n{self._sc_name}", 1) - - def _set_pragmas(self, connection): - if not self._connection: - connection.execute("PRAGMA synchronous=NORMAL") - connection.execute("PRAGMA journal_mode=WAL") - if self._re_use_con: - self._connection = connection - return connection - - def _get_database(self, attempts=2): - '''get reference to our sqllite _database - performs basic integrity check''' - try: - connection = self._connection or sqlite3.connect(self._db_file, timeout=5, isolation_level=None, check_same_thread=not self._re_use_con) - connection.execute('SELECT * FROM simplecache LIMIT 1') - return self._set_pragmas(connection) - except Exception: - # our _database is corrupt or doesn't exist yet, we simply try to recreate it - if xbmcvfs.exists(self._db_file): - self.kodi_log(f'CACHE: Deleting Corrupt File: {self._db_file}...', 1) - xbmcvfs.delete(self._db_file) - try: - self.kodi_log(f'CACHE: Initialising: {self._db_file}...', 1) - connection = self._connection or sqlite3.connect(self._db_file, timeout=5, isolation_level=None, check_same_thread=not self._re_use_con) - connection.execute( - """CREATE TABLE IF NOT EXISTS simplecache( - id TEXT UNIQUE, expires INTEGER, data TEXT, checksum INTEGER)""") - connection.execute("CREATE INDEX idx ON simplecache(id)") - return self._set_pragmas(connection) - except Exception as error: - self.kodi_log(f'CACHE: Exception while initializing _database: {error} ({attempts})', 1) - if attempts < 1: - return - attempts -= 1 - self._monitor.waitForAbort(1) - return self._get_database(attempts) - - def _execute_sql(self, query, data=None): - '''little wrapper around execute and executemany to just retry a db command if db is locked''' - retries = 10 - result = None - error = '' - # always use new db object because we need to be sure that data is available for other simplecache instances - with self._get_database() as _database: - while retries > 0 and not self._monitor.abortRequested(): - if self._exit: - return None - try: - if isinstance(data, list): - result = _database.executemany(query, data) - elif data: - result = _database.execute(query, data) - else: - result = _database.execute(query) - return result - except sqlite3.OperationalError as err: - error = err - try: - if "database is locked" == f'{error}': - self.kodi_log("CACHE: Locked: Retrying DB commit...", 1) - retries -= 1 - self._monitor.waitForAbort(0.5) - else: - break - except TypeError: - break - except Exception: - break - self.kodi_log(f'CACHE: _database ERROR ! -- {error}', 1) - return None diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/thread.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/thread.py deleted file mode 100644 index 7cd7ac9c0..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/thread.py +++ /dev/null @@ -1,54 +0,0 @@ -from xbmc import Monitor -from threading import Thread - - -class ParallelThread(): - thread_max = 0 # 0 is unlimited - - def __init__(self, items, func, *args, **kwargs): - """ ContextManager for running parallel threads alongside another function - with ParallelThread(items, func, *args, **kwargs) as pt: - pass - item_queue = pt.queue - item_queue[x] # to get returned items - """ - self._mon = Monitor() - thread_max = self.thread_max or len(items) - self.queue = [None] * len(items) - self._pool = [None] * thread_max - self._exit = False - for x, i in enumerate(items): - n = x - while n >= thread_max and not self._mon.abortRequested(): # Hit our thread limit so look for a spare spot in the queue - for y, j in enumerate(self._pool): - if j.is_alive(): - continue - n = y - break - if n >= thread_max: - self._mon.waitForAbort(0.025) - try: - self._pool[n] = Thread(target=self._threadwrapper, args=[x, i, func, *args], kwargs=kwargs) - self._pool[n].start() - except IndexError: - self.kodi_log(f'ParallelThread: INDEX {n} OUT OF RANGE {thread_max}', 1) - - def _threadwrapper(self, x, i, func, *args, **kwargs): - self.queue[x] = func(i, *args, **kwargs) - - @staticmethod - def kodi_log(msg, level=0): - from jurialmunkey.logger import Logger - Logger('[script.module.jurialmunkey]\n').kodi_log(msg, level) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_traceback): - for i in self._pool: - if self._exit or self._mon.abortRequested(): - break - try: - i.join() - except AttributeError: # is None - pass diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/tmdate.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/tmdate.py deleted file mode 100644 index e5b414687..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/tmdate.py +++ /dev/null @@ -1,19 +0,0 @@ -import time - - -def get_timestamp(timestamp=None, set_int=False): - if not timestamp: - return - now = time.time() - tmp = timestamp - if set_int: - now = int(now) - tmp = int(tmp) - if now > tmp: - return - return timestamp - - -def set_timestamp(wait_time=60, set_int=False): - timestamp = time.time() + wait_time - return int(timestamp) if set_int else timestamp diff --git a/script.module.jurialmunkey/resources/modules/jurialmunkey/window.py b/script.module.jurialmunkey/resources/modules/jurialmunkey/window.py deleted file mode 100644 index 0e463ca91..000000000 --- a/script.module.jurialmunkey/resources/modules/jurialmunkey/window.py +++ /dev/null @@ -1,136 +0,0 @@ -from xbmc import Monitor, executebuiltin, getCondVisibility, getInfoLabel -from xbmcgui import Window, getCurrentWindowId, getCurrentWindowDialogId -from jurialmunkey.parser import try_type, try_int - - -DIALOG_ID_EXCLUDELIST = (9999, None) - - -def get_current_window(get_dialog=True): - dialog = getCurrentWindowDialogId() if get_dialog else None - return dialog if dialog not in DIALOG_ID_EXCLUDELIST else getCurrentWindowId() - - -def get_property(name, set_property=None, clear_property=False, window_id=None, prefix=None, is_type=None): - if prefix != -1: - prefix = prefix or 'TMDbHelper' - name = f'{prefix}.{name}' - if window_id == 'current': - window_id = get_current_window() - window = Window(window_id or 10000) # Fallback to home window id=10000 - ret_property = set_property or window.getProperty(name) - if clear_property: - window.clearProperty(name) - if set_property is not None: - window.setProperty(name, f'{set_property}') - return try_type(ret_property, is_type or str) - - -def _property_is_value(name, value): - if not value and not get_property(name): - return True - if value and get_property(name) == value: - return True - return False - - -def wait_for_property(name, value=None, set_property=False, poll=1, timeout=10): - """ - Waits until property matches value. None value waits for property to be cleared. - Will set property to value if set_property flag is set. None value clears property. - Returns True when successful. - """ - xbmc_monitor = Monitor() - if set_property: - get_property(name, value) if value else get_property(name, clear_property=True) - while ( - not xbmc_monitor.abortRequested() and timeout > 0 - and not _property_is_value(name, value)): - xbmc_monitor.waitForAbort(poll) - timeout -= poll - del xbmc_monitor - if timeout > 0: - return True - - -def is_visible(window_id): - return getCondVisibility(f'Window.IsVisible({window_id})') - - -def close(window_id): - return executebuiltin(f'Dialog.Close({window_id})') - - -def activate(window_id): - return executebuiltin(f'ActivateWindow({window_id})') - - -def _is_base_active(window_id): - if window_id and not is_visible(window_id): - return False - return True - - -def _is_updating(container_id): - is_updating = getCondVisibility(f"Container({container_id}).IsUpdating") - is_numitems = try_int(getInfoLabel(f"Container({container_id}).NumItems")) - if is_updating or not is_numitems: - return True - - -def _is_inactive(window_id, invert=False): - if is_visible(window_id): - return True if invert else False - return True if not invert else False - - -def wait_until_active(window_id, instance_id=None, poll=1, timeout=30, invert=False): - """ - Wait for window ID to open (or to close if invert set to True). Returns window_id if successful. - Pass instance_id if there is also a base window that needs to be open underneath - """ - xbmc_monitor = Monitor() - while ( - not xbmc_monitor.abortRequested() and timeout > 0 - and _is_inactive(window_id, invert) - and _is_base_active(instance_id)): - xbmc_monitor.waitForAbort(poll) - timeout -= poll - del xbmc_monitor - if timeout > 0 and _is_base_active(instance_id): - return window_id - - -def wait_until_updated(container_id=9999, instance_id=None, poll=1, timeout=60): - """ - Wait for container to update. Returns container_id if successful - Pass instance_id if there is also a base window that needs to be open underneath - """ - xbmc_monitor = Monitor() - while ( - not xbmc_monitor.abortRequested() and timeout > 0 - and _is_updating(container_id) - and _is_base_active(instance_id)): - xbmc_monitor.waitForAbort(poll) - timeout -= poll - del xbmc_monitor - if timeout > 0 and _is_base_active(instance_id): - return container_id - - -class WindowProperty(): - def __init__(self, *args): - """ ContextManager for setting a WindowProperty over duration """ - self.property_pairs = args - - for k, v in self.property_pairs: - if not k or not v: - continue - get_property(k, set_property=v) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_traceback): - for k, v in self.property_pairs: - get_property(k, clear_property=True) diff --git a/script.module.protobuf/.gitignore b/script.module.protobuf/.gitignore deleted file mode 100644 index f23b89082..000000000 --- a/script.module.protobuf/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -__pycache__ -*.egg-info/ -*.dist-info/ -*.so -.task/ -.idea/ diff --git a/script.module.protobuf/LICENSE b/script.module.protobuf/LICENSE deleted file mode 100644 index f028c8232..000000000 --- a/script.module.protobuf/LICENSE +++ /dev/null @@ -1,42 +0,0 @@ -This license applies to all parts of Protocol Buffers except the following: - - - Atomicops support for generic gcc, located in - src/google/protobuf/stubs/atomicops_internals_generic_gcc.h. - This file is copyrighted by Red Hat Inc. - - - Atomicops support for AIX/POWER, located in - src/google/protobuf/stubs/atomicops_internals_power.h. - This file is copyrighted by Bloomberg Finance LP. - -Copyright 2014, Google Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Code generated by the Protocol Buffer compiler is owned by the owner -of the input file used when generating it. This code is not -standalone and requires a support library to be linked with it. This -support library is itself covered by the above license. diff --git a/script.module.protobuf/README.md b/script.module.protobuf/README.md deleted file mode 100644 index 67d2da147..000000000 --- a/script.module.protobuf/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# script.module.protobuf - -Kodi package of the Google Protobuf library. - -For more information view the Protobuf documentation at: https://developers.google.com/protocol-buffers/ -Or the source at: https://github.com/google/protobuf - -In case any issues are found, feel free to open an issue or pull request at -https://github.com/sanzoghenzo/kodi-protobuf diff --git a/script.module.protobuf/Taskfile.yml b/script.module.protobuf/Taskfile.yml deleted file mode 100644 index b51588d5d..000000000 --- a/script.module.protobuf/Taskfile.yml +++ /dev/null @@ -1,57 +0,0 @@ -version: "3" - -vars: - # TODO: read name and version from addon.xml - PACKAGE_NAME: protobuf - VERSION: 4.23.2 - DIST_PATH: "resources/lib" - -tasks: - install:package: - label: 'install:{{.PACKAGE_NAME}}' - vars: - PACKAGE_NAME: '{{.PACKAGE_NAME}}' - COMMAND_NAME: '{{default .PACKAGE_NAME .COMMAND_NAME}}' - cmds: - - "pip install {{.PACKAGE_NAME}}" - status: - - 'command -v {{.COMMAND_NAME}}' - - install:addon-check: - cmds: - - task: install:package - vars: - PACKAGE_NAME: kodi-addon-checker - - clean: - cmds: - - "rm -rf {{.DIST_PATH}}" - - download: - cmds: - - "mkdir -p {{.DIST_PATH}}" - - "pip install --ignore-installed --target {{.DIST_PATH}} {{.PACKAGE_NAME}}=={{.VERSION}}" - generates: - - "{{.DIST_PATH}}/**/*.py" - - fix-mode: - cmds: - - "find {{.DIST_PATH}} -type f -print0 | xargs -0 chmod 644" - - dist: - deps: - - download - - fix-mode - cmds: - - "touch {{.DIST_PATH}}/google/__init__.py" - - "rm -rf {{.DIST_PATH}}/*.dist-info" - - lint: - deps: - - install:addon-check - cmds: - - kodi-addon-checker . --branch nexus - - default: - - task: dist - - task: lint diff --git a/script.module.protobuf/addon.xml b/script.module.protobuf/addon.xml deleted file mode 100644 index c13d2b829..000000000 --- a/script.module.protobuf/addon.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data. - Packed for KODI/XBMC from https://github.com/google/protobuf - https://github.com/google/protobuf/blob/master/LICENSE - all - https://protobuf.dev - https://github.com/sanzoghenzo/kodi-protobuf - andrea.ghensi@gmail.com - - resources/icon.png - - - diff --git a/script.module.protobuf/resources/icon.png b/script.module.protobuf/resources/icon.png deleted file mode 100644 index ca4c53adbfa8d06d0e282d45f9cad195e89d571e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7237 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 diff --git a/script.module.protobuf/resources/lib/google/protobuf/__init__.py b/script.module.protobuf/resources/lib/google/protobuf/__init__.py deleted file mode 100644 index 9b6e1737b..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/__init__.py +++ /dev/null @@ -1,33 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# Copyright 2007 Google Inc. All Rights Reserved. - -__version__ = '4.23.2' diff --git a/script.module.protobuf/resources/lib/google/protobuf/any_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/any_pb2.py deleted file mode 100644 index b0bfaf635..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/any_pb2.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/any.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19google/protobuf/any.proto\x12\x0fgoogle.protobuf\"6\n\x03\x41ny\x12\x19\n\x08type_url\x18\x01 \x01(\tR\x07typeUrl\x12\x14\n\x05value\x18\x02 \x01(\x0cR\x05valueBv\n\x13\x63om.google.protobufB\x08\x41nyProtoP\x01Z,google.golang.org/protobuf/types/known/anypb\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.any_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\010AnyProtoP\001Z,google.golang.org/protobuf/types/known/anypb\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_ANY']._serialized_start=46 - _globals['_ANY']._serialized_end=100 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/api_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/api_pb2.py deleted file mode 100644 index 4276c9422..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/api_pb2.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/api.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.protobuf import source_context_pb2 as google_dot_protobuf_dot_source__context__pb2 -from google.protobuf import type_pb2 as google_dot_protobuf_dot_type__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19google/protobuf/api.proto\x12\x0fgoogle.protobuf\x1a$google/protobuf/source_context.proto\x1a\x1agoogle/protobuf/type.proto\"\xc1\x02\n\x03\x41pi\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x31\n\x07methods\x18\x02 \x03(\x0b\x32\x17.google.protobuf.MethodR\x07methods\x12\x31\n\x07options\x18\x03 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12\x18\n\x07version\x18\x04 \x01(\tR\x07version\x12\x45\n\x0esource_context\x18\x05 \x01(\x0b\x32\x1e.google.protobuf.SourceContextR\rsourceContext\x12.\n\x06mixins\x18\x06 \x03(\x0b\x32\x16.google.protobuf.MixinR\x06mixins\x12/\n\x06syntax\x18\x07 \x01(\x0e\x32\x17.google.protobuf.SyntaxR\x06syntax\"\xb2\x02\n\x06Method\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12(\n\x10request_type_url\x18\x02 \x01(\tR\x0erequestTypeUrl\x12+\n\x11request_streaming\x18\x03 \x01(\x08R\x10requestStreaming\x12*\n\x11response_type_url\x18\x04 \x01(\tR\x0fresponseTypeUrl\x12-\n\x12response_streaming\x18\x05 \x01(\x08R\x11responseStreaming\x12\x31\n\x07options\x18\x06 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12/\n\x06syntax\x18\x07 \x01(\x0e\x32\x17.google.protobuf.SyntaxR\x06syntax\"/\n\x05Mixin\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n\x04root\x18\x02 \x01(\tR\x04rootBv\n\x13\x63om.google.protobufB\x08\x41piProtoP\x01Z,google.golang.org/protobuf/types/known/apipb\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.api_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\010ApiProtoP\001Z,google.golang.org/protobuf/types/known/apipb\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_API']._serialized_start=113 - _globals['_API']._serialized_end=434 - _globals['_METHOD']._serialized_start=437 - _globals['_METHOD']._serialized_end=743 - _globals['_MIXIN']._serialized_start=745 - _globals['_MIXIN']._serialized_end=792 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/compiler/__init__.py b/script.module.protobuf/resources/lib/google/protobuf/compiler/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/script.module.protobuf/resources/lib/google/protobuf/compiler/plugin_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/compiler/plugin_pb2.py deleted file mode 100644 index 3e3a36de6..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/compiler/plugin_pb2.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/compiler/plugin.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%google/protobuf/compiler/plugin.proto\x12\x18google.protobuf.compiler\x1a google/protobuf/descriptor.proto\"c\n\x07Version\x12\x14\n\x05major\x18\x01 \x01(\x05R\x05major\x12\x14\n\x05minor\x18\x02 \x01(\x05R\x05minor\x12\x14\n\x05patch\x18\x03 \x01(\x05R\x05patch\x12\x16\n\x06suffix\x18\x04 \x01(\tR\x06suffix\"\xf1\x01\n\x14\x43odeGeneratorRequest\x12(\n\x10\x66ile_to_generate\x18\x01 \x03(\tR\x0e\x66ileToGenerate\x12\x1c\n\tparameter\x18\x02 \x01(\tR\tparameter\x12\x43\n\nproto_file\x18\x0f \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\tprotoFile\x12L\n\x10\x63ompiler_version\x18\x03 \x01(\x0b\x32!.google.protobuf.compiler.VersionR\x0f\x63ompilerVersion\"\x94\x03\n\x15\x43odeGeneratorResponse\x12\x14\n\x05\x65rror\x18\x01 \x01(\tR\x05\x65rror\x12-\n\x12supported_features\x18\x02 \x01(\x04R\x11supportedFeatures\x12H\n\x04\x66ile\x18\x0f \x03(\x0b\x32\x34.google.protobuf.compiler.CodeGeneratorResponse.FileR\x04\x66ile\x1a\xb1\x01\n\x04\x46ile\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\'\n\x0finsertion_point\x18\x02 \x01(\tR\x0einsertionPoint\x12\x18\n\x07\x63ontent\x18\x0f \x01(\tR\x07\x63ontent\x12R\n\x13generated_code_info\x18\x10 \x01(\x0b\x32\".google.protobuf.GeneratedCodeInfoR\x11generatedCodeInfo\"8\n\x07\x46\x65\x61ture\x12\x10\n\x0c\x46\x45\x41TURE_NONE\x10\x00\x12\x1b\n\x17\x46\x45\x41TURE_PROTO3_OPTIONAL\x10\x01\x42r\n\x1c\x63om.google.protobuf.compilerB\x0cPluginProtosZ)google.golang.org/protobuf/types/pluginpb\xaa\x02\x18Google.Protobuf.Compiler') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.compiler.plugin_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\034com.google.protobuf.compilerB\014PluginProtosZ)google.golang.org/protobuf/types/pluginpb\252\002\030Google.Protobuf.Compiler' - _globals['_VERSION']._serialized_start=101 - _globals['_VERSION']._serialized_end=200 - _globals['_CODEGENERATORREQUEST']._serialized_start=203 - _globals['_CODEGENERATORREQUEST']._serialized_end=444 - _globals['_CODEGENERATORRESPONSE']._serialized_start=447 - _globals['_CODEGENERATORRESPONSE']._serialized_end=851 - _globals['_CODEGENERATORRESPONSE_FILE']._serialized_start=616 - _globals['_CODEGENERATORRESPONSE_FILE']._serialized_end=793 - _globals['_CODEGENERATORRESPONSE_FEATURE']._serialized_start=795 - _globals['_CODEGENERATORRESPONSE_FEATURE']._serialized_end=851 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/descriptor.py b/script.module.protobuf/resources/lib/google/protobuf/descriptor.py deleted file mode 100644 index fcb87cab5..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/descriptor.py +++ /dev/null @@ -1,1266 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Descriptors essentially contain exactly the information found in a .proto -file, in types that make this information accessible in Python. -""" - -__author__ = 'robinson@google.com (Will Robinson)' - -import threading -import warnings - -from google.protobuf.internal import api_implementation - -_USE_C_DESCRIPTORS = False -if api_implementation.Type() != 'python': - # Used by MakeDescriptor in cpp mode - import binascii - import os - # pylint: disable=protected-access - _message = api_implementation._c_module - # TODO(jieluo): Remove this import after fix api_implementation - if _message is None: - from google.protobuf.pyext import _message - _USE_C_DESCRIPTORS = True - - -class Error(Exception): - """Base error for this module.""" - - -class TypeTransformationError(Error): - """Error transforming between python proto type and corresponding C++ type.""" - - -if _USE_C_DESCRIPTORS: - # This metaclass allows to override the behavior of code like - # isinstance(my_descriptor, FieldDescriptor) - # and make it return True when the descriptor is an instance of the extension - # type written in C++. - class DescriptorMetaclass(type): - - def __instancecheck__(cls, obj): - if super(DescriptorMetaclass, cls).__instancecheck__(obj): - return True - if isinstance(obj, cls._C_DESCRIPTOR_CLASS): - return True - return False -else: - # The standard metaclass; nothing changes. - DescriptorMetaclass = type - - -class _Lock(object): - """Wrapper class of threading.Lock(), which is allowed by 'with'.""" - - def __new__(cls): - self = object.__new__(cls) - self._lock = threading.Lock() # pylint: disable=protected-access - return self - - def __enter__(self): - self._lock.acquire() - - def __exit__(self, exc_type, exc_value, exc_tb): - self._lock.release() - - -_lock = threading.Lock() - - -def _Deprecated(name): - if _Deprecated.count > 0: - _Deprecated.count -= 1 - warnings.warn( - 'Call to deprecated create function %s(). Note: Create unlinked ' - 'descriptors is going to go away. Please use get/find descriptors from ' - 'generated code or query the descriptor_pool.' - % name, - category=DeprecationWarning, stacklevel=3) - - -# Deprecated warnings will print 100 times at most which should be enough for -# users to notice and do not cause timeout. -_Deprecated.count = 100 - - -_internal_create_key = object() - - -class DescriptorBase(metaclass=DescriptorMetaclass): - - """Descriptors base class. - - This class is the base of all descriptor classes. It provides common options - related functionality. - - Attributes: - has_options: True if the descriptor has non-default options. Usually it - is not necessary to read this -- just call GetOptions() which will - happily return the default instance. However, it's sometimes useful - for efficiency, and also useful inside the protobuf implementation to - avoid some bootstrapping issues. - """ - - if _USE_C_DESCRIPTORS: - # The class, or tuple of classes, that are considered as "virtual - # subclasses" of this descriptor class. - _C_DESCRIPTOR_CLASS = () - - def __init__(self, options, serialized_options, options_class_name): - """Initialize the descriptor given its options message and the name of the - class of the options message. The name of the class is required in case - the options message is None and has to be created. - """ - self._options = options - self._options_class_name = options_class_name - self._serialized_options = serialized_options - - # Does this descriptor have non-default options? - self.has_options = (options is not None) or (serialized_options is not None) - - def _SetOptions(self, options, options_class_name): - """Sets the descriptor's options - - This function is used in generated proto2 files to update descriptor - options. It must not be used outside proto2. - """ - self._options = options - self._options_class_name = options_class_name - - # Does this descriptor have non-default options? - self.has_options = options is not None - - def GetOptions(self): - """Retrieves descriptor options. - - This method returns the options set or creates the default options for the - descriptor. - """ - if self._options: - return self._options - - from google.protobuf import descriptor_pb2 - try: - options_class = getattr(descriptor_pb2, - self._options_class_name) - except AttributeError: - raise RuntimeError('Unknown options class name %s!' % - (self._options_class_name)) - - with _lock: - if self._serialized_options is None: - self._options = options_class() - else: - self._options = _ParseOptions(options_class(), - self._serialized_options) - - return self._options - - -class _NestedDescriptorBase(DescriptorBase): - """Common class for descriptors that can be nested.""" - - def __init__(self, options, options_class_name, name, full_name, - file, containing_type, serialized_start=None, - serialized_end=None, serialized_options=None): - """Constructor. - - Args: - options: Protocol message options or None - to use default message options. - options_class_name (str): The class name of the above options. - name (str): Name of this protocol message type. - full_name (str): Fully-qualified name of this protocol message type, - which will include protocol "package" name and the name of any - enclosing types. - file (FileDescriptor): Reference to file info. - containing_type: if provided, this is a nested descriptor, with this - descriptor as parent, otherwise None. - serialized_start: The start index (inclusive) in block in the - file.serialized_pb that describes this descriptor. - serialized_end: The end index (exclusive) in block in the - file.serialized_pb that describes this descriptor. - serialized_options: Protocol message serialized options or None. - """ - super(_NestedDescriptorBase, self).__init__( - options, serialized_options, options_class_name) - - self.name = name - # TODO(falk): Add function to calculate full_name instead of having it in - # memory? - self.full_name = full_name - self.file = file - self.containing_type = containing_type - - self._serialized_start = serialized_start - self._serialized_end = serialized_end - - def CopyToProto(self, proto): - """Copies this to the matching proto in descriptor_pb2. - - Args: - proto: An empty proto instance from descriptor_pb2. - - Raises: - Error: If self couldn't be serialized, due to to few constructor - arguments. - """ - if (self.file is not None and - self._serialized_start is not None and - self._serialized_end is not None): - proto.ParseFromString(self.file.serialized_pb[ - self._serialized_start:self._serialized_end]) - else: - raise Error('Descriptor does not contain serialization.') - - -class Descriptor(_NestedDescriptorBase): - - """Descriptor for a protocol message type. - - Attributes: - name (str): Name of this protocol message type. - full_name (str): Fully-qualified name of this protocol message type, - which will include protocol "package" name and the name of any - enclosing types. - containing_type (Descriptor): Reference to the descriptor of the type - containing us, or None if this is top-level. - fields (list[FieldDescriptor]): Field descriptors for all fields in - this type. - fields_by_number (dict(int, FieldDescriptor)): Same - :class:`FieldDescriptor` objects as in :attr:`fields`, but indexed - by "number" attribute in each FieldDescriptor. - fields_by_name (dict(str, FieldDescriptor)): Same - :class:`FieldDescriptor` objects as in :attr:`fields`, but indexed by - "name" attribute in each :class:`FieldDescriptor`. - nested_types (list[Descriptor]): Descriptor references - for all protocol message types nested within this one. - nested_types_by_name (dict(str, Descriptor)): Same Descriptor - objects as in :attr:`nested_types`, but indexed by "name" attribute - in each Descriptor. - enum_types (list[EnumDescriptor]): :class:`EnumDescriptor` references - for all enums contained within this type. - enum_types_by_name (dict(str, EnumDescriptor)): Same - :class:`EnumDescriptor` objects as in :attr:`enum_types`, but - indexed by "name" attribute in each EnumDescriptor. - enum_values_by_name (dict(str, EnumValueDescriptor)): Dict mapping - from enum value name to :class:`EnumValueDescriptor` for that value. - extensions (list[FieldDescriptor]): All extensions defined directly - within this message type (NOT within a nested type). - extensions_by_name (dict(str, FieldDescriptor)): Same FieldDescriptor - objects as :attr:`extensions`, but indexed by "name" attribute of each - FieldDescriptor. - is_extendable (bool): Does this type define any extension ranges? - oneofs (list[OneofDescriptor]): The list of descriptors for oneof fields - in this message. - oneofs_by_name (dict(str, OneofDescriptor)): Same objects as in - :attr:`oneofs`, but indexed by "name" attribute. - file (FileDescriptor): Reference to file descriptor. - - """ - - if _USE_C_DESCRIPTORS: - _C_DESCRIPTOR_CLASS = _message.Descriptor - - def __new__( - cls, - name=None, - full_name=None, - filename=None, - containing_type=None, - fields=None, - nested_types=None, - enum_types=None, - extensions=None, - options=None, - serialized_options=None, - is_extendable=True, - extension_ranges=None, - oneofs=None, - file=None, # pylint: disable=redefined-builtin - serialized_start=None, - serialized_end=None, - syntax=None, - create_key=None): - _message.Message._CheckCalledFromGeneratedFile() - return _message.default_pool.FindMessageTypeByName(full_name) - - # NOTE(tmarek): The file argument redefining a builtin is nothing we can - # fix right now since we don't know how many clients already rely on the - # name of the argument. - def __init__(self, name, full_name, filename, containing_type, fields, - nested_types, enum_types, extensions, options=None, - serialized_options=None, - is_extendable=True, extension_ranges=None, oneofs=None, - file=None, serialized_start=None, serialized_end=None, # pylint: disable=redefined-builtin - syntax=None, create_key=None): - """Arguments to __init__() are as described in the description - of Descriptor fields above. - - Note that filename is an obsolete argument, that is not used anymore. - Please use file.name to access this as an attribute. - """ - if create_key is not _internal_create_key: - _Deprecated('Descriptor') - - super(Descriptor, self).__init__( - options, 'MessageOptions', name, full_name, file, - containing_type, serialized_start=serialized_start, - serialized_end=serialized_end, serialized_options=serialized_options) - - # We have fields in addition to fields_by_name and fields_by_number, - # so that: - # 1. Clients can index fields by "order in which they're listed." - # 2. Clients can easily iterate over all fields with the terse - # syntax: for f in descriptor.fields: ... - self.fields = fields - for field in self.fields: - field.containing_type = self - self.fields_by_number = dict((f.number, f) for f in fields) - self.fields_by_name = dict((f.name, f) for f in fields) - self._fields_by_camelcase_name = None - - self.nested_types = nested_types - for nested_type in nested_types: - nested_type.containing_type = self - self.nested_types_by_name = dict((t.name, t) for t in nested_types) - - self.enum_types = enum_types - for enum_type in self.enum_types: - enum_type.containing_type = self - self.enum_types_by_name = dict((t.name, t) for t in enum_types) - self.enum_values_by_name = dict( - (v.name, v) for t in enum_types for v in t.values) - - self.extensions = extensions - for extension in self.extensions: - extension.extension_scope = self - self.extensions_by_name = dict((f.name, f) for f in extensions) - self.is_extendable = is_extendable - self.extension_ranges = extension_ranges - self.oneofs = oneofs if oneofs is not None else [] - self.oneofs_by_name = dict((o.name, o) for o in self.oneofs) - for oneof in self.oneofs: - oneof.containing_type = self - self.syntax = syntax or "proto2" - - @property - def fields_by_camelcase_name(self): - """Same FieldDescriptor objects as in :attr:`fields`, but indexed by - :attr:`FieldDescriptor.camelcase_name`. - """ - if self._fields_by_camelcase_name is None: - self._fields_by_camelcase_name = dict( - (f.camelcase_name, f) for f in self.fields) - return self._fields_by_camelcase_name - - def EnumValueName(self, enum, value): - """Returns the string name of an enum value. - - This is just a small helper method to simplify a common operation. - - Args: - enum: string name of the Enum. - value: int, value of the enum. - - Returns: - string name of the enum value. - - Raises: - KeyError if either the Enum doesn't exist or the value is not a valid - value for the enum. - """ - return self.enum_types_by_name[enum].values_by_number[value].name - - def CopyToProto(self, proto): - """Copies this to a descriptor_pb2.DescriptorProto. - - Args: - proto: An empty descriptor_pb2.DescriptorProto. - """ - # This function is overridden to give a better doc comment. - super(Descriptor, self).CopyToProto(proto) - - -# TODO(robinson): We should have aggressive checking here, -# for example: -# * If you specify a repeated field, you should not be allowed -# to specify a default value. -# * [Other examples here as needed]. -# -# TODO(robinson): for this and other *Descriptor classes, we -# might also want to lock things down aggressively (e.g., -# prevent clients from setting the attributes). Having -# stronger invariants here in general will reduce the number -# of runtime checks we must do in reflection.py... -class FieldDescriptor(DescriptorBase): - - """Descriptor for a single field in a .proto file. - - Attributes: - name (str): Name of this field, exactly as it appears in .proto. - full_name (str): Name of this field, including containing scope. This is - particularly relevant for extensions. - index (int): Dense, 0-indexed index giving the order that this - field textually appears within its message in the .proto file. - number (int): Tag number declared for this field in the .proto file. - - type (int): (One of the TYPE_* constants below) Declared type. - cpp_type (int): (One of the CPPTYPE_* constants below) C++ type used to - represent this field. - - label (int): (One of the LABEL_* constants below) Tells whether this - field is optional, required, or repeated. - has_default_value (bool): True if this field has a default value defined, - otherwise false. - default_value (Varies): Default value of this field. Only - meaningful for non-repeated scalar fields. Repeated fields - should always set this to [], and non-repeated composite - fields should always set this to None. - - containing_type (Descriptor): Descriptor of the protocol message - type that contains this field. Set by the Descriptor constructor - if we're passed into one. - Somewhat confusingly, for extension fields, this is the - descriptor of the EXTENDED message, not the descriptor - of the message containing this field. (See is_extension and - extension_scope below). - message_type (Descriptor): If a composite field, a descriptor - of the message type contained in this field. Otherwise, this is None. - enum_type (EnumDescriptor): If this field contains an enum, a - descriptor of that enum. Otherwise, this is None. - - is_extension: True iff this describes an extension field. - extension_scope (Descriptor): Only meaningful if is_extension is True. - Gives the message that immediately contains this extension field. - Will be None iff we're a top-level (file-level) extension field. - - options (descriptor_pb2.FieldOptions): Protocol message field options or - None to use default field options. - - containing_oneof (OneofDescriptor): If the field is a member of a oneof - union, contains its descriptor. Otherwise, None. - - file (FileDescriptor): Reference to file descriptor. - """ - - # Must be consistent with C++ FieldDescriptor::Type enum in - # descriptor.h. - # - # TODO(robinson): Find a way to eliminate this repetition. - TYPE_DOUBLE = 1 - TYPE_FLOAT = 2 - TYPE_INT64 = 3 - TYPE_UINT64 = 4 - TYPE_INT32 = 5 - TYPE_FIXED64 = 6 - TYPE_FIXED32 = 7 - TYPE_BOOL = 8 - TYPE_STRING = 9 - TYPE_GROUP = 10 - TYPE_MESSAGE = 11 - TYPE_BYTES = 12 - TYPE_UINT32 = 13 - TYPE_ENUM = 14 - TYPE_SFIXED32 = 15 - TYPE_SFIXED64 = 16 - TYPE_SINT32 = 17 - TYPE_SINT64 = 18 - MAX_TYPE = 18 - - # Must be consistent with C++ FieldDescriptor::CppType enum in - # descriptor.h. - # - # TODO(robinson): Find a way to eliminate this repetition. - CPPTYPE_INT32 = 1 - CPPTYPE_INT64 = 2 - CPPTYPE_UINT32 = 3 - CPPTYPE_UINT64 = 4 - CPPTYPE_DOUBLE = 5 - CPPTYPE_FLOAT = 6 - CPPTYPE_BOOL = 7 - CPPTYPE_ENUM = 8 - CPPTYPE_STRING = 9 - CPPTYPE_MESSAGE = 10 - MAX_CPPTYPE = 10 - - _PYTHON_TO_CPP_PROTO_TYPE_MAP = { - TYPE_DOUBLE: CPPTYPE_DOUBLE, - TYPE_FLOAT: CPPTYPE_FLOAT, - TYPE_ENUM: CPPTYPE_ENUM, - TYPE_INT64: CPPTYPE_INT64, - TYPE_SINT64: CPPTYPE_INT64, - TYPE_SFIXED64: CPPTYPE_INT64, - TYPE_UINT64: CPPTYPE_UINT64, - TYPE_FIXED64: CPPTYPE_UINT64, - TYPE_INT32: CPPTYPE_INT32, - TYPE_SFIXED32: CPPTYPE_INT32, - TYPE_SINT32: CPPTYPE_INT32, - TYPE_UINT32: CPPTYPE_UINT32, - TYPE_FIXED32: CPPTYPE_UINT32, - TYPE_BYTES: CPPTYPE_STRING, - TYPE_STRING: CPPTYPE_STRING, - TYPE_BOOL: CPPTYPE_BOOL, - TYPE_MESSAGE: CPPTYPE_MESSAGE, - TYPE_GROUP: CPPTYPE_MESSAGE - } - - # Must be consistent with C++ FieldDescriptor::Label enum in - # descriptor.h. - # - # TODO(robinson): Find a way to eliminate this repetition. - LABEL_OPTIONAL = 1 - LABEL_REQUIRED = 2 - LABEL_REPEATED = 3 - MAX_LABEL = 3 - - # Must be consistent with C++ constants kMaxNumber, kFirstReservedNumber, - # and kLastReservedNumber in descriptor.h - MAX_FIELD_NUMBER = (1 << 29) - 1 - FIRST_RESERVED_FIELD_NUMBER = 19000 - LAST_RESERVED_FIELD_NUMBER = 19999 - - if _USE_C_DESCRIPTORS: - _C_DESCRIPTOR_CLASS = _message.FieldDescriptor - - def __new__(cls, name, full_name, index, number, type, cpp_type, label, - default_value, message_type, enum_type, containing_type, - is_extension, extension_scope, options=None, - serialized_options=None, - has_default_value=True, containing_oneof=None, json_name=None, - file=None, create_key=None): # pylint: disable=redefined-builtin - _message.Message._CheckCalledFromGeneratedFile() - if is_extension: - return _message.default_pool.FindExtensionByName(full_name) - else: - return _message.default_pool.FindFieldByName(full_name) - - def __init__(self, name, full_name, index, number, type, cpp_type, label, - default_value, message_type, enum_type, containing_type, - is_extension, extension_scope, options=None, - serialized_options=None, - has_default_value=True, containing_oneof=None, json_name=None, - file=None, create_key=None): # pylint: disable=redefined-builtin - """The arguments are as described in the description of FieldDescriptor - attributes above. - - Note that containing_type may be None, and may be set later if necessary - (to deal with circular references between message types, for example). - Likewise for extension_scope. - """ - if create_key is not _internal_create_key: - _Deprecated('FieldDescriptor') - - super(FieldDescriptor, self).__init__( - options, serialized_options, 'FieldOptions') - self.name = name - self.full_name = full_name - self.file = file - self._camelcase_name = None - if json_name is None: - self.json_name = _ToJsonName(name) - else: - self.json_name = json_name - self.index = index - self.number = number - self.type = type - self.cpp_type = cpp_type - self.label = label - self.has_default_value = has_default_value - self.default_value = default_value - self.containing_type = containing_type - self.message_type = message_type - self.enum_type = enum_type - self.is_extension = is_extension - self.extension_scope = extension_scope - self.containing_oneof = containing_oneof - if api_implementation.Type() == 'python': - self._cdescriptor = None - else: - if is_extension: - self._cdescriptor = _message.default_pool.FindExtensionByName(full_name) - else: - self._cdescriptor = _message.default_pool.FindFieldByName(full_name) - - @property - def camelcase_name(self): - """Camelcase name of this field. - - Returns: - str: the name in CamelCase. - """ - if self._camelcase_name is None: - self._camelcase_name = _ToCamelCase(self.name) - return self._camelcase_name - - @property - def has_presence(self): - """Whether the field distinguishes between unpopulated and default values. - - Raises: - RuntimeError: singular field that is not linked with message nor file. - """ - if self.label == FieldDescriptor.LABEL_REPEATED: - return False - if (self.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE or - self.containing_oneof): - return True - # self.containing_type is used here instead of self.file for legacy - # compatibility. FieldDescriptor.file was added in cl/153110619 - # Some old/generated code didn't link file to FieldDescriptor. - # TODO(jieluo): remove syntax usage b/240619313 - return self.containing_type.syntax == 'proto2' - - @property - def is_packed(self): - """Returns if the field is packed.""" - if self.label != FieldDescriptor.LABEL_REPEATED: - return False - field_type = self.type - if (field_type == FieldDescriptor.TYPE_STRING or - field_type == FieldDescriptor.TYPE_GROUP or - field_type == FieldDescriptor.TYPE_MESSAGE or - field_type == FieldDescriptor.TYPE_BYTES): - return False - if self.containing_type.syntax == 'proto2': - return self.has_options and self.GetOptions().packed - else: - return (not self.has_options or - not self.GetOptions().HasField('packed') or - self.GetOptions().packed) - - @staticmethod - def ProtoTypeToCppProtoType(proto_type): - """Converts from a Python proto type to a C++ Proto Type. - - The Python ProtocolBuffer classes specify both the 'Python' datatype and the - 'C++' datatype - and they're not the same. This helper method should - translate from one to another. - - Args: - proto_type: the Python proto type (descriptor.FieldDescriptor.TYPE_*) - Returns: - int: descriptor.FieldDescriptor.CPPTYPE_*, the C++ type. - Raises: - TypeTransformationError: when the Python proto type isn't known. - """ - try: - return FieldDescriptor._PYTHON_TO_CPP_PROTO_TYPE_MAP[proto_type] - except KeyError: - raise TypeTransformationError('Unknown proto_type: %s' % proto_type) - - -class EnumDescriptor(_NestedDescriptorBase): - - """Descriptor for an enum defined in a .proto file. - - Attributes: - name (str): Name of the enum type. - full_name (str): Full name of the type, including package name - and any enclosing type(s). - - values (list[EnumValueDescriptor]): List of the values - in this enum. - values_by_name (dict(str, EnumValueDescriptor)): Same as :attr:`values`, - but indexed by the "name" field of each EnumValueDescriptor. - values_by_number (dict(int, EnumValueDescriptor)): Same as :attr:`values`, - but indexed by the "number" field of each EnumValueDescriptor. - containing_type (Descriptor): Descriptor of the immediate containing - type of this enum, or None if this is an enum defined at the - top level in a .proto file. Set by Descriptor's constructor - if we're passed into one. - file (FileDescriptor): Reference to file descriptor. - options (descriptor_pb2.EnumOptions): Enum options message or - None to use default enum options. - """ - - if _USE_C_DESCRIPTORS: - _C_DESCRIPTOR_CLASS = _message.EnumDescriptor - - def __new__(cls, name, full_name, filename, values, - containing_type=None, options=None, - serialized_options=None, file=None, # pylint: disable=redefined-builtin - serialized_start=None, serialized_end=None, create_key=None): - _message.Message._CheckCalledFromGeneratedFile() - return _message.default_pool.FindEnumTypeByName(full_name) - - def __init__(self, name, full_name, filename, values, - containing_type=None, options=None, - serialized_options=None, file=None, # pylint: disable=redefined-builtin - serialized_start=None, serialized_end=None, create_key=None): - """Arguments are as described in the attribute description above. - - Note that filename is an obsolete argument, that is not used anymore. - Please use file.name to access this as an attribute. - """ - if create_key is not _internal_create_key: - _Deprecated('EnumDescriptor') - - super(EnumDescriptor, self).__init__( - options, 'EnumOptions', name, full_name, file, - containing_type, serialized_start=serialized_start, - serialized_end=serialized_end, serialized_options=serialized_options) - - self.values = values - for value in self.values: - value.type = self - self.values_by_name = dict((v.name, v) for v in values) - # Values are reversed to ensure that the first alias is retained. - self.values_by_number = dict((v.number, v) for v in reversed(values)) - - @property - def is_closed(self): - """Returns true whether this is a "closed" enum. - - This means that it: - - Has a fixed set of values, rather than being equivalent to an int32. - - Encountering values not in this set causes them to be treated as unknown - fields. - - The first value (i.e., the default) may be nonzero. - - WARNING: Some runtimes currently have a quirk where non-closed enums are - treated as closed when used as the type of fields defined in a - `syntax = proto2;` file. This quirk is not present in all runtimes; as of - writing, we know that: - - - C++, Java, and C++-based Python share this quirk. - - UPB and UPB-based Python do not. - - PHP and Ruby treat all enums as open regardless of declaration. - - Care should be taken when using this function to respect the target - runtime's enum handling quirks. - """ - return self.file.syntax == 'proto2' - - def CopyToProto(self, proto): - """Copies this to a descriptor_pb2.EnumDescriptorProto. - - Args: - proto (descriptor_pb2.EnumDescriptorProto): An empty descriptor proto. - """ - # This function is overridden to give a better doc comment. - super(EnumDescriptor, self).CopyToProto(proto) - - -class EnumValueDescriptor(DescriptorBase): - - """Descriptor for a single value within an enum. - - Attributes: - name (str): Name of this value. - index (int): Dense, 0-indexed index giving the order that this - value appears textually within its enum in the .proto file. - number (int): Actual number assigned to this enum value. - type (EnumDescriptor): :class:`EnumDescriptor` to which this value - belongs. Set by :class:`EnumDescriptor`'s constructor if we're - passed into one. - options (descriptor_pb2.EnumValueOptions): Enum value options message or - None to use default enum value options options. - """ - - if _USE_C_DESCRIPTORS: - _C_DESCRIPTOR_CLASS = _message.EnumValueDescriptor - - def __new__(cls, name, index, number, - type=None, # pylint: disable=redefined-builtin - options=None, serialized_options=None, create_key=None): - _message.Message._CheckCalledFromGeneratedFile() - # There is no way we can build a complete EnumValueDescriptor with the - # given parameters (the name of the Enum is not known, for example). - # Fortunately generated files just pass it to the EnumDescriptor() - # constructor, which will ignore it, so returning None is good enough. - return None - - def __init__(self, name, index, number, - type=None, # pylint: disable=redefined-builtin - options=None, serialized_options=None, create_key=None): - """Arguments are as described in the attribute description above.""" - if create_key is not _internal_create_key: - _Deprecated('EnumValueDescriptor') - - super(EnumValueDescriptor, self).__init__( - options, serialized_options, 'EnumValueOptions') - self.name = name - self.index = index - self.number = number - self.type = type - - -class OneofDescriptor(DescriptorBase): - """Descriptor for a oneof field. - - Attributes: - name (str): Name of the oneof field. - full_name (str): Full name of the oneof field, including package name. - index (int): 0-based index giving the order of the oneof field inside - its containing type. - containing_type (Descriptor): :class:`Descriptor` of the protocol message - type that contains this field. Set by the :class:`Descriptor` constructor - if we're passed into one. - fields (list[FieldDescriptor]): The list of field descriptors this - oneof can contain. - """ - - if _USE_C_DESCRIPTORS: - _C_DESCRIPTOR_CLASS = _message.OneofDescriptor - - def __new__( - cls, name, full_name, index, containing_type, fields, options=None, - serialized_options=None, create_key=None): - _message.Message._CheckCalledFromGeneratedFile() - return _message.default_pool.FindOneofByName(full_name) - - def __init__( - self, name, full_name, index, containing_type, fields, options=None, - serialized_options=None, create_key=None): - """Arguments are as described in the attribute description above.""" - if create_key is not _internal_create_key: - _Deprecated('OneofDescriptor') - - super(OneofDescriptor, self).__init__( - options, serialized_options, 'OneofOptions') - self.name = name - self.full_name = full_name - self.index = index - self.containing_type = containing_type - self.fields = fields - - -class ServiceDescriptor(_NestedDescriptorBase): - - """Descriptor for a service. - - Attributes: - name (str): Name of the service. - full_name (str): Full name of the service, including package name. - index (int): 0-indexed index giving the order that this services - definition appears within the .proto file. - methods (list[MethodDescriptor]): List of methods provided by this - service. - methods_by_name (dict(str, MethodDescriptor)): Same - :class:`MethodDescriptor` objects as in :attr:`methods_by_name`, but - indexed by "name" attribute in each :class:`MethodDescriptor`. - options (descriptor_pb2.ServiceOptions): Service options message or - None to use default service options. - file (FileDescriptor): Reference to file info. - """ - - if _USE_C_DESCRIPTORS: - _C_DESCRIPTOR_CLASS = _message.ServiceDescriptor - - def __new__( - cls, - name=None, - full_name=None, - index=None, - methods=None, - options=None, - serialized_options=None, - file=None, # pylint: disable=redefined-builtin - serialized_start=None, - serialized_end=None, - create_key=None): - _message.Message._CheckCalledFromGeneratedFile() # pylint: disable=protected-access - return _message.default_pool.FindServiceByName(full_name) - - def __init__(self, name, full_name, index, methods, options=None, - serialized_options=None, file=None, # pylint: disable=redefined-builtin - serialized_start=None, serialized_end=None, create_key=None): - if create_key is not _internal_create_key: - _Deprecated('ServiceDescriptor') - - super(ServiceDescriptor, self).__init__( - options, 'ServiceOptions', name, full_name, file, - None, serialized_start=serialized_start, - serialized_end=serialized_end, serialized_options=serialized_options) - self.index = index - self.methods = methods - self.methods_by_name = dict((m.name, m) for m in methods) - # Set the containing service for each method in this service. - for method in self.methods: - method.containing_service = self - - def FindMethodByName(self, name): - """Searches for the specified method, and returns its descriptor. - - Args: - name (str): Name of the method. - - Returns: - MethodDescriptor: The descriptor for the requested method. - - Raises: - KeyError: if the method cannot be found in the service. - """ - return self.methods_by_name[name] - - def CopyToProto(self, proto): - """Copies this to a descriptor_pb2.ServiceDescriptorProto. - - Args: - proto (descriptor_pb2.ServiceDescriptorProto): An empty descriptor proto. - """ - # This function is overridden to give a better doc comment. - super(ServiceDescriptor, self).CopyToProto(proto) - - -class MethodDescriptor(DescriptorBase): - - """Descriptor for a method in a service. - - Attributes: - name (str): Name of the method within the service. - full_name (str): Full name of method. - index (int): 0-indexed index of the method inside the service. - containing_service (ServiceDescriptor): The service that contains this - method. - input_type (Descriptor): The descriptor of the message that this method - accepts. - output_type (Descriptor): The descriptor of the message that this method - returns. - client_streaming (bool): Whether this method uses client streaming. - server_streaming (bool): Whether this method uses server streaming. - options (descriptor_pb2.MethodOptions or None): Method options message, or - None to use default method options. - """ - - if _USE_C_DESCRIPTORS: - _C_DESCRIPTOR_CLASS = _message.MethodDescriptor - - def __new__(cls, - name, - full_name, - index, - containing_service, - input_type, - output_type, - client_streaming=False, - server_streaming=False, - options=None, - serialized_options=None, - create_key=None): - _message.Message._CheckCalledFromGeneratedFile() # pylint: disable=protected-access - return _message.default_pool.FindMethodByName(full_name) - - def __init__(self, - name, - full_name, - index, - containing_service, - input_type, - output_type, - client_streaming=False, - server_streaming=False, - options=None, - serialized_options=None, - create_key=None): - """The arguments are as described in the description of MethodDescriptor - attributes above. - - Note that containing_service may be None, and may be set later if necessary. - """ - if create_key is not _internal_create_key: - _Deprecated('MethodDescriptor') - - super(MethodDescriptor, self).__init__( - options, serialized_options, 'MethodOptions') - self.name = name - self.full_name = full_name - self.index = index - self.containing_service = containing_service - self.input_type = input_type - self.output_type = output_type - self.client_streaming = client_streaming - self.server_streaming = server_streaming - - def CopyToProto(self, proto): - """Copies this to a descriptor_pb2.MethodDescriptorProto. - - Args: - proto (descriptor_pb2.MethodDescriptorProto): An empty descriptor proto. - - Raises: - Error: If self couldn't be serialized, due to too few constructor - arguments. - """ - if self.containing_service is not None: - from google.protobuf import descriptor_pb2 - service_proto = descriptor_pb2.ServiceDescriptorProto() - self.containing_service.CopyToProto(service_proto) - proto.CopyFrom(service_proto.method[self.index]) - else: - raise Error('Descriptor does not contain a service.') - - -class FileDescriptor(DescriptorBase): - """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto. - - Note that :attr:`enum_types_by_name`, :attr:`extensions_by_name`, and - :attr:`dependencies` fields are only set by the - :py:mod:`google.protobuf.message_factory` module, and not by the generated - proto code. - - Attributes: - name (str): Name of file, relative to root of source tree. - package (str): Name of the package - syntax (str): string indicating syntax of the file (can be "proto2" or - "proto3") - serialized_pb (bytes): Byte string of serialized - :class:`descriptor_pb2.FileDescriptorProto`. - dependencies (list[FileDescriptor]): List of other :class:`FileDescriptor` - objects this :class:`FileDescriptor` depends on. - public_dependencies (list[FileDescriptor]): A subset of - :attr:`dependencies`, which were declared as "public". - message_types_by_name (dict(str, Descriptor)): Mapping from message names - to their :class:`Descriptor`. - enum_types_by_name (dict(str, EnumDescriptor)): Mapping from enum names to - their :class:`EnumDescriptor`. - extensions_by_name (dict(str, FieldDescriptor)): Mapping from extension - names declared at file scope to their :class:`FieldDescriptor`. - services_by_name (dict(str, ServiceDescriptor)): Mapping from services' - names to their :class:`ServiceDescriptor`. - pool (DescriptorPool): The pool this descriptor belongs to. When not - passed to the constructor, the global default pool is used. - """ - - if _USE_C_DESCRIPTORS: - _C_DESCRIPTOR_CLASS = _message.FileDescriptor - - def __new__(cls, name, package, options=None, - serialized_options=None, serialized_pb=None, - dependencies=None, public_dependencies=None, - syntax=None, pool=None, create_key=None): - # FileDescriptor() is called from various places, not only from generated - # files, to register dynamic proto files and messages. - # pylint: disable=g-explicit-bool-comparison - if serialized_pb: - return _message.default_pool.AddSerializedFile(serialized_pb) - else: - return super(FileDescriptor, cls).__new__(cls) - - def __init__(self, name, package, options=None, - serialized_options=None, serialized_pb=None, - dependencies=None, public_dependencies=None, - syntax=None, pool=None, create_key=None): - """Constructor.""" - if create_key is not _internal_create_key: - _Deprecated('FileDescriptor') - - super(FileDescriptor, self).__init__( - options, serialized_options, 'FileOptions') - - if pool is None: - from google.protobuf import descriptor_pool - pool = descriptor_pool.Default() - self.pool = pool - self.message_types_by_name = {} - self.name = name - self.package = package - self.syntax = syntax or "proto2" - self.serialized_pb = serialized_pb - - self.enum_types_by_name = {} - self.extensions_by_name = {} - self.services_by_name = {} - self.dependencies = (dependencies or []) - self.public_dependencies = (public_dependencies or []) - - def CopyToProto(self, proto): - """Copies this to a descriptor_pb2.FileDescriptorProto. - - Args: - proto: An empty descriptor_pb2.FileDescriptorProto. - """ - proto.ParseFromString(self.serialized_pb) - - -def _ParseOptions(message, string): - """Parses serialized options. - - This helper function is used to parse serialized options in generated - proto2 files. It must not be used outside proto2. - """ - message.ParseFromString(string) - return message - - -def _ToCamelCase(name): - """Converts name to camel-case and returns it.""" - capitalize_next = False - result = [] - - for c in name: - if c == '_': - if result: - capitalize_next = True - elif capitalize_next: - result.append(c.upper()) - capitalize_next = False - else: - result += c - - # Lower-case the first letter. - if result and result[0].isupper(): - result[0] = result[0].lower() - return ''.join(result) - - -def _OptionsOrNone(descriptor_proto): - """Returns the value of the field `options`, or None if it is not set.""" - if descriptor_proto.HasField('options'): - return descriptor_proto.options - else: - return None - - -def _ToJsonName(name): - """Converts name to Json name and returns it.""" - capitalize_next = False - result = [] - - for c in name: - if c == '_': - capitalize_next = True - elif capitalize_next: - result.append(c.upper()) - capitalize_next = False - else: - result += c - - return ''.join(result) - - -def MakeDescriptor(desc_proto, package='', build_file_if_cpp=True, - syntax=None): - """Make a protobuf Descriptor given a DescriptorProto protobuf. - - Handles nested descriptors. Note that this is limited to the scope of defining - a message inside of another message. Composite fields can currently only be - resolved if the message is defined in the same scope as the field. - - Args: - desc_proto: The descriptor_pb2.DescriptorProto protobuf message. - package: Optional package name for the new message Descriptor (string). - build_file_if_cpp: Update the C++ descriptor pool if api matches. - Set to False on recursion, so no duplicates are created. - syntax: The syntax/semantics that should be used. Set to "proto3" to get - proto3 field presence semantics. - Returns: - A Descriptor for protobuf messages. - """ - if api_implementation.Type() != 'python' and build_file_if_cpp: - # The C++ implementation requires all descriptors to be backed by the same - # definition in the C++ descriptor pool. To do this, we build a - # FileDescriptorProto with the same definition as this descriptor and build - # it into the pool. - from google.protobuf import descriptor_pb2 - file_descriptor_proto = descriptor_pb2.FileDescriptorProto() - file_descriptor_proto.message_type.add().MergeFrom(desc_proto) - - # Generate a random name for this proto file to prevent conflicts with any - # imported ones. We need to specify a file name so the descriptor pool - # accepts our FileDescriptorProto, but it is not important what that file - # name is actually set to. - proto_name = binascii.hexlify(os.urandom(16)).decode('ascii') - - if package: - file_descriptor_proto.name = os.path.join(package.replace('.', '/'), - proto_name + '.proto') - file_descriptor_proto.package = package - else: - file_descriptor_proto.name = proto_name + '.proto' - - _message.default_pool.Add(file_descriptor_proto) - result = _message.default_pool.FindFileByName(file_descriptor_proto.name) - - if _USE_C_DESCRIPTORS: - return result.message_types_by_name[desc_proto.name] - - full_message_name = [desc_proto.name] - if package: full_message_name.insert(0, package) - - # Create Descriptors for enum types - enum_types = {} - for enum_proto in desc_proto.enum_type: - full_name = '.'.join(full_message_name + [enum_proto.name]) - enum_desc = EnumDescriptor( - enum_proto.name, full_name, None, [ - EnumValueDescriptor(enum_val.name, ii, enum_val.number, - create_key=_internal_create_key) - for ii, enum_val in enumerate(enum_proto.value)], - create_key=_internal_create_key) - enum_types[full_name] = enum_desc - - # Create Descriptors for nested types - nested_types = {} - for nested_proto in desc_proto.nested_type: - full_name = '.'.join(full_message_name + [nested_proto.name]) - # Nested types are just those defined inside of the message, not all types - # used by fields in the message, so no loops are possible here. - nested_desc = MakeDescriptor(nested_proto, - package='.'.join(full_message_name), - build_file_if_cpp=False, - syntax=syntax) - nested_types[full_name] = nested_desc - - fields = [] - for field_proto in desc_proto.field: - full_name = '.'.join(full_message_name + [field_proto.name]) - enum_desc = None - nested_desc = None - if field_proto.json_name: - json_name = field_proto.json_name - else: - json_name = None - if field_proto.HasField('type_name'): - type_name = field_proto.type_name - full_type_name = '.'.join(full_message_name + - [type_name[type_name.rfind('.')+1:]]) - if full_type_name in nested_types: - nested_desc = nested_types[full_type_name] - elif full_type_name in enum_types: - enum_desc = enum_types[full_type_name] - # Else type_name references a non-local type, which isn't implemented - field = FieldDescriptor( - field_proto.name, full_name, field_proto.number - 1, - field_proto.number, field_proto.type, - FieldDescriptor.ProtoTypeToCppProtoType(field_proto.type), - field_proto.label, None, nested_desc, enum_desc, None, False, None, - options=_OptionsOrNone(field_proto), has_default_value=False, - json_name=json_name, create_key=_internal_create_key) - fields.append(field) - - desc_name = '.'.join(full_message_name) - return Descriptor(desc_proto.name, desc_name, None, None, fields, - list(nested_types.values()), list(enum_types.values()), [], - options=_OptionsOrNone(desc_proto), - create_key=_internal_create_key) diff --git a/script.module.protobuf/resources/lib/google/protobuf/descriptor_database.py b/script.module.protobuf/resources/lib/google/protobuf/descriptor_database.py deleted file mode 100644 index 073eddc71..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/descriptor_database.py +++ /dev/null @@ -1,177 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Provides a container for DescriptorProtos.""" - -__author__ = 'matthewtoia@google.com (Matt Toia)' - -import warnings - - -class Error(Exception): - pass - - -class DescriptorDatabaseConflictingDefinitionError(Error): - """Raised when a proto is added with the same name & different descriptor.""" - - -class DescriptorDatabase(object): - """A container accepting FileDescriptorProtos and maps DescriptorProtos.""" - - def __init__(self): - self._file_desc_protos_by_file = {} - self._file_desc_protos_by_symbol = {} - - def Add(self, file_desc_proto): - """Adds the FileDescriptorProto and its types to this database. - - Args: - file_desc_proto: The FileDescriptorProto to add. - Raises: - DescriptorDatabaseConflictingDefinitionError: if an attempt is made to - add a proto with the same name but different definition than an - existing proto in the database. - """ - proto_name = file_desc_proto.name - if proto_name not in self._file_desc_protos_by_file: - self._file_desc_protos_by_file[proto_name] = file_desc_proto - elif self._file_desc_protos_by_file[proto_name] != file_desc_proto: - raise DescriptorDatabaseConflictingDefinitionError( - '%s already added, but with different descriptor.' % proto_name) - else: - return - - # Add all the top-level descriptors to the index. - package = file_desc_proto.package - for message in file_desc_proto.message_type: - for name in _ExtractSymbols(message, package): - self._AddSymbol(name, file_desc_proto) - for enum in file_desc_proto.enum_type: - self._AddSymbol(('.'.join((package, enum.name))), file_desc_proto) - for enum_value in enum.value: - self._file_desc_protos_by_symbol[ - '.'.join((package, enum_value.name))] = file_desc_proto - for extension in file_desc_proto.extension: - self._AddSymbol(('.'.join((package, extension.name))), file_desc_proto) - for service in file_desc_proto.service: - self._AddSymbol(('.'.join((package, service.name))), file_desc_proto) - - def FindFileByName(self, name): - """Finds the file descriptor proto by file name. - - Typically the file name is a relative path ending to a .proto file. The - proto with the given name will have to have been added to this database - using the Add method or else an error will be raised. - - Args: - name: The file name to find. - - Returns: - The file descriptor proto matching the name. - - Raises: - KeyError if no file by the given name was added. - """ - - return self._file_desc_protos_by_file[name] - - def FindFileContainingSymbol(self, symbol): - """Finds the file descriptor proto containing the specified symbol. - - The symbol should be a fully qualified name including the file descriptor's - package and any containing messages. Some examples: - - 'some.package.name.Message' - 'some.package.name.Message.NestedEnum' - 'some.package.name.Message.some_field' - - The file descriptor proto containing the specified symbol must be added to - this database using the Add method or else an error will be raised. - - Args: - symbol: The fully qualified symbol name. - - Returns: - The file descriptor proto containing the symbol. - - Raises: - KeyError if no file contains the specified symbol. - """ - try: - return self._file_desc_protos_by_symbol[symbol] - except KeyError: - # Fields, enum values, and nested extensions are not in - # _file_desc_protos_by_symbol. Try to find the top level - # descriptor. Non-existent nested symbol under a valid top level - # descriptor can also be found. The behavior is the same with - # protobuf C++. - top_level, _, _ = symbol.rpartition('.') - try: - return self._file_desc_protos_by_symbol[top_level] - except KeyError: - # Raise the original symbol as a KeyError for better diagnostics. - raise KeyError(symbol) - - def FindFileContainingExtension(self, extendee_name, extension_number): - # TODO(jieluo): implement this API. - return None - - def FindAllExtensionNumbers(self, extendee_name): - # TODO(jieluo): implement this API. - return [] - - def _AddSymbol(self, name, file_desc_proto): - if name in self._file_desc_protos_by_symbol: - warn_msg = ('Conflict register for file "' + file_desc_proto.name + - '": ' + name + - ' is already defined in file "' + - self._file_desc_protos_by_symbol[name].name + '"') - warnings.warn(warn_msg, RuntimeWarning) - self._file_desc_protos_by_symbol[name] = file_desc_proto - - -def _ExtractSymbols(desc_proto, package): - """Pulls out all the symbols from a descriptor proto. - - Args: - desc_proto: The proto to extract symbols from. - package: The package containing the descriptor type. - - Yields: - The fully qualified name found in the descriptor. - """ - message_name = package + '.' + desc_proto.name if package else desc_proto.name - yield message_name - for nested_type in desc_proto.nested_type: - for symbol in _ExtractSymbols(nested_type, message_name): - yield symbol - for enum_type in desc_proto.enum_type: - yield '.'.join((message_name, enum_type.name)) diff --git a/script.module.protobuf/resources/lib/google/protobuf/descriptor_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/descriptor_pb2.py deleted file mode 100644 index c42e7b6d1..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/descriptor_pb2.py +++ /dev/null @@ -1,2227 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/descriptor.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR = _descriptor.FileDescriptor( - name='google/protobuf/descriptor.proto', - package='google.protobuf', - syntax='proto2', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"M\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile\"\xfe\x04\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x18\n\x07\x65\x64ition\x18\r \x01(\tR\x07\x65\x64ition\"\xb9\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xad\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12h\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDR\x0cverification\x1a\xb3\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12#\n\x0bis_repeated\x18\x04 \x01(\x08\x42\x02\x18\x01R\nisRepeated\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeated\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xe3\x02\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xa7\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07options\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\x91\t\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\x35\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseR\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12\x37\n\x14php_generic_services\x18* \x01(\x08:\x05\x66\x61lseR\x12phpGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08&\x10\'\"\xbb\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\x85\t\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x19\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseR\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12J\n\x06target\x18\x12 \x01(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeB\x02\x18\x01R\x06target\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05\"s\n\x0cOneofOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x98\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\x9e\x01\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9c\x01\n\x0eServiceOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe0\x02\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\xa7\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection' - ) -else: - DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n google/protobuf/descriptor.proto\x12\x0fgoogle.protobuf\"M\n\x11\x46ileDescriptorSet\x12\x38\n\x04\x66ile\x18\x01 \x03(\x0b\x32$.google.protobuf.FileDescriptorProtoR\x04\x66ile\"\xfe\x04\n\x13\x46ileDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x18\n\x07package\x18\x02 \x01(\tR\x07package\x12\x1e\n\ndependency\x18\x03 \x03(\tR\ndependency\x12+\n\x11public_dependency\x18\n \x03(\x05R\x10publicDependency\x12\'\n\x0fweak_dependency\x18\x0b \x03(\x05R\x0eweakDependency\x12\x43\n\x0cmessage_type\x18\x04 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\x0bmessageType\x12\x41\n\tenum_type\x18\x05 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12\x41\n\x07service\x18\x06 \x03(\x0b\x32\'.google.protobuf.ServiceDescriptorProtoR\x07service\x12\x43\n\textension\x18\x07 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x36\n\x07options\x18\x08 \x01(\x0b\x32\x1c.google.protobuf.FileOptionsR\x07options\x12I\n\x10source_code_info\x18\t \x01(\x0b\x32\x1f.google.protobuf.SourceCodeInfoR\x0esourceCodeInfo\x12\x16\n\x06syntax\x18\x0c \x01(\tR\x06syntax\x12\x18\n\x07\x65\x64ition\x18\r \x01(\tR\x07\x65\x64ition\"\xb9\x06\n\x0f\x44\x65scriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12;\n\x05\x66ield\x18\x02 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\x05\x66ield\x12\x43\n\textension\x18\x06 \x03(\x0b\x32%.google.protobuf.FieldDescriptorProtoR\textension\x12\x41\n\x0bnested_type\x18\x03 \x03(\x0b\x32 .google.protobuf.DescriptorProtoR\nnestedType\x12\x41\n\tenum_type\x18\x04 \x03(\x0b\x32$.google.protobuf.EnumDescriptorProtoR\x08\x65numType\x12X\n\x0f\x65xtension_range\x18\x05 \x03(\x0b\x32/.google.protobuf.DescriptorProto.ExtensionRangeR\x0e\x65xtensionRange\x12\x44\n\noneof_decl\x18\x08 \x03(\x0b\x32%.google.protobuf.OneofDescriptorProtoR\toneofDecl\x12\x39\n\x07options\x18\x07 \x01(\x0b\x32\x1f.google.protobuf.MessageOptionsR\x07options\x12U\n\x0ereserved_range\x18\t \x03(\x0b\x32..google.protobuf.DescriptorProto.ReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\n \x03(\tR\x0creservedName\x1az\n\x0e\x45xtensionRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\x12@\n\x07options\x18\x03 \x01(\x0b\x32&.google.protobuf.ExtensionRangeOptionsR\x07options\x1a\x37\n\rReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\xad\x04\n\x15\x45xtensionRangeOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\x12Y\n\x0b\x64\x65\x63laration\x18\x02 \x03(\x0b\x32\x32.google.protobuf.ExtensionRangeOptions.DeclarationB\x03\x88\x01\x02R\x0b\x64\x65\x63laration\x12h\n\x0cverification\x18\x03 \x01(\x0e\x32\x38.google.protobuf.ExtensionRangeOptions.VerificationState:\nUNVERIFIEDR\x0cverification\x1a\xb3\x01\n\x0b\x44\x65\x63laration\x12\x16\n\x06number\x18\x01 \x01(\x05R\x06number\x12\x1b\n\tfull_name\x18\x02 \x01(\tR\x08\x66ullName\x12\x12\n\x04type\x18\x03 \x01(\tR\x04type\x12#\n\x0bis_repeated\x18\x04 \x01(\x08\x42\x02\x18\x01R\nisRepeated\x12\x1a\n\x08reserved\x18\x05 \x01(\x08R\x08reserved\x12\x1a\n\x08repeated\x18\x06 \x01(\x08R\x08repeated\"4\n\x11VerificationState\x12\x0f\n\x0b\x44\x45\x43LARATION\x10\x00\x12\x0e\n\nUNVERIFIED\x10\x01*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xc1\x06\n\x14\x46ieldDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x41\n\x05label\x18\x04 \x01(\x0e\x32+.google.protobuf.FieldDescriptorProto.LabelR\x05label\x12>\n\x04type\x18\x05 \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.TypeR\x04type\x12\x1b\n\ttype_name\x18\x06 \x01(\tR\x08typeName\x12\x1a\n\x08\x65xtendee\x18\x02 \x01(\tR\x08\x65xtendee\x12#\n\rdefault_value\x18\x07 \x01(\tR\x0c\x64\x65\x66\x61ultValue\x12\x1f\n\x0boneof_index\x18\t \x01(\x05R\noneofIndex\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12\x37\n\x07options\x18\x08 \x01(\x0b\x32\x1d.google.protobuf.FieldOptionsR\x07options\x12\'\n\x0fproto3_optional\x18\x11 \x01(\x08R\x0eproto3Optional\"\xb6\x02\n\x04Type\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"C\n\x05Label\x12\x12\n\x0eLABEL_OPTIONAL\x10\x01\x12\x12\n\x0eLABEL_REQUIRED\x10\x02\x12\x12\n\x0eLABEL_REPEATED\x10\x03\"c\n\x14OneofDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x37\n\x07options\x18\x02 \x01(\x0b\x32\x1d.google.protobuf.OneofOptionsR\x07options\"\xe3\x02\n\x13\x45numDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12?\n\x05value\x18\x02 \x03(\x0b\x32).google.protobuf.EnumValueDescriptorProtoR\x05value\x12\x36\n\x07options\x18\x03 \x01(\x0b\x32\x1c.google.protobuf.EnumOptionsR\x07options\x12]\n\x0ereserved_range\x18\x04 \x03(\x0b\x32\x36.google.protobuf.EnumDescriptorProto.EnumReservedRangeR\rreservedRange\x12#\n\rreserved_name\x18\x05 \x03(\tR\x0creservedName\x1a;\n\x11\x45numReservedRange\x12\x14\n\x05start\x18\x01 \x01(\x05R\x05start\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05R\x03\x65nd\"\x83\x01\n\x18\x45numValueDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12;\n\x07options\x18\x03 \x01(\x0b\x32!.google.protobuf.EnumValueOptionsR\x07options\"\xa7\x01\n\x16ServiceDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12>\n\x06method\x18\x02 \x03(\x0b\x32&.google.protobuf.MethodDescriptorProtoR\x06method\x12\x39\n\x07options\x18\x03 \x01(\x0b\x32\x1f.google.protobuf.ServiceOptionsR\x07options\"\x89\x02\n\x15MethodDescriptorProto\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n\ninput_type\x18\x02 \x01(\tR\tinputType\x12\x1f\n\x0boutput_type\x18\x03 \x01(\tR\noutputType\x12\x38\n\x07options\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.MethodOptionsR\x07options\x12\x30\n\x10\x63lient_streaming\x18\x05 \x01(\x08:\x05\x66\x61lseR\x0f\x63lientStreaming\x12\x30\n\x10server_streaming\x18\x06 \x01(\x08:\x05\x66\x61lseR\x0fserverStreaming\"\x91\t\n\x0b\x46ileOptions\x12!\n\x0cjava_package\x18\x01 \x01(\tR\x0bjavaPackage\x12\x30\n\x14java_outer_classname\x18\x08 \x01(\tR\x12javaOuterClassname\x12\x35\n\x13java_multiple_files\x18\n \x01(\x08:\x05\x66\x61lseR\x11javaMultipleFiles\x12\x44\n\x1djava_generate_equals_and_hash\x18\x14 \x01(\x08\x42\x02\x18\x01R\x19javaGenerateEqualsAndHash\x12:\n\x16java_string_check_utf8\x18\x1b \x01(\x08:\x05\x66\x61lseR\x13javaStringCheckUtf8\x12S\n\x0coptimize_for\x18\t \x01(\x0e\x32).google.protobuf.FileOptions.OptimizeMode:\x05SPEEDR\x0boptimizeFor\x12\x1d\n\ngo_package\x18\x0b \x01(\tR\tgoPackage\x12\x35\n\x13\x63\x63_generic_services\x18\x10 \x01(\x08:\x05\x66\x61lseR\x11\x63\x63GenericServices\x12\x39\n\x15java_generic_services\x18\x11 \x01(\x08:\x05\x66\x61lseR\x13javaGenericServices\x12\x35\n\x13py_generic_services\x18\x12 \x01(\x08:\x05\x66\x61lseR\x11pyGenericServices\x12\x37\n\x14php_generic_services\x18* \x01(\x08:\x05\x66\x61lseR\x12phpGenericServices\x12%\n\ndeprecated\x18\x17 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12.\n\x10\x63\x63_enable_arenas\x18\x1f \x01(\x08:\x04trueR\x0e\x63\x63\x45nableArenas\x12*\n\x11objc_class_prefix\x18$ \x01(\tR\x0fobjcClassPrefix\x12)\n\x10\x63sharp_namespace\x18% \x01(\tR\x0f\x63sharpNamespace\x12!\n\x0cswift_prefix\x18\' \x01(\tR\x0bswiftPrefix\x12(\n\x10php_class_prefix\x18( \x01(\tR\x0ephpClassPrefix\x12#\n\rphp_namespace\x18) \x01(\tR\x0cphpNamespace\x12\x34\n\x16php_metadata_namespace\x18, \x01(\tR\x14phpMetadataNamespace\x12!\n\x0cruby_package\x18- \x01(\tR\x0brubyPackage\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\":\n\x0cOptimizeMode\x12\t\n\x05SPEED\x10\x01\x12\r\n\tCODE_SIZE\x10\x02\x12\x10\n\x0cLITE_RUNTIME\x10\x03*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08&\x10\'\"\xbb\x03\n\x0eMessageOptions\x12<\n\x17message_set_wire_format\x18\x01 \x01(\x08:\x05\x66\x61lseR\x14messageSetWireFormat\x12L\n\x1fno_standard_descriptor_accessor\x18\x02 \x01(\x08:\x05\x66\x61lseR\x1cnoStandardDescriptorAccessor\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x1b\n\tmap_entry\x18\x07 \x01(\x08R\x08mapEntry\x12V\n&deprecated_legacy_json_field_conflicts\x18\x0b \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05J\x04\x08\x05\x10\x06J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\t\x10\n\"\x85\t\n\x0c\x46ieldOptions\x12\x41\n\x05\x63type\x18\x01 \x01(\x0e\x32#.google.protobuf.FieldOptions.CType:\x06STRINGR\x05\x63type\x12\x16\n\x06packed\x18\x02 \x01(\x08R\x06packed\x12G\n\x06jstype\x18\x06 \x01(\x0e\x32$.google.protobuf.FieldOptions.JSType:\tJS_NORMALR\x06jstype\x12\x19\n\x04lazy\x18\x05 \x01(\x08:\x05\x66\x61lseR\x04lazy\x12.\n\x0funverified_lazy\x18\x0f \x01(\x08:\x05\x66\x61lseR\x0eunverifiedLazy\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12\x19\n\x04weak\x18\n \x01(\x08:\x05\x66\x61lseR\x04weak\x12(\n\x0c\x64\x65\x62ug_redact\x18\x10 \x01(\x08:\x05\x66\x61lseR\x0b\x64\x65\x62ugRedact\x12K\n\tretention\x18\x11 \x01(\x0e\x32-.google.protobuf.FieldOptions.OptionRetentionR\tretention\x12J\n\x06target\x18\x12 \x01(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeB\x02\x18\x01R\x06target\x12H\n\x07targets\x18\x13 \x03(\x0e\x32..google.protobuf.FieldOptions.OptionTargetTypeR\x07targets\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"/\n\x05\x43Type\x12\n\n\x06STRING\x10\x00\x12\x08\n\x04\x43ORD\x10\x01\x12\x10\n\x0cSTRING_PIECE\x10\x02\"5\n\x06JSType\x12\r\n\tJS_NORMAL\x10\x00\x12\r\n\tJS_STRING\x10\x01\x12\r\n\tJS_NUMBER\x10\x02\"U\n\x0fOptionRetention\x12\x15\n\x11RETENTION_UNKNOWN\x10\x00\x12\x15\n\x11RETENTION_RUNTIME\x10\x01\x12\x14\n\x10RETENTION_SOURCE\x10\x02\"\x8c\x02\n\x10OptionTargetType\x12\x17\n\x13TARGET_TYPE_UNKNOWN\x10\x00\x12\x14\n\x10TARGET_TYPE_FILE\x10\x01\x12\x1f\n\x1bTARGET_TYPE_EXTENSION_RANGE\x10\x02\x12\x17\n\x13TARGET_TYPE_MESSAGE\x10\x03\x12\x15\n\x11TARGET_TYPE_FIELD\x10\x04\x12\x15\n\x11TARGET_TYPE_ONEOF\x10\x05\x12\x14\n\x10TARGET_TYPE_ENUM\x10\x06\x12\x1a\n\x16TARGET_TYPE_ENUM_ENTRY\x10\x07\x12\x17\n\x13TARGET_TYPE_SERVICE\x10\x08\x12\x16\n\x12TARGET_TYPE_METHOD\x10\t*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x04\x10\x05\"s\n\x0cOneofOptions\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x98\x02\n\x0b\x45numOptions\x12\x1f\n\x0b\x61llow_alias\x18\x02 \x01(\x08R\nallowAlias\x12%\n\ndeprecated\x18\x03 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12V\n&deprecated_legacy_json_field_conflicts\x18\x06 \x01(\x08\x42\x02\x18\x01R\"deprecatedLegacyJsonFieldConflicts\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02J\x04\x08\x05\x10\x06\"\x9e\x01\n\x10\x45numValueOptions\x12%\n\ndeprecated\x18\x01 \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9c\x01\n\x0eServiceOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\xe0\x02\n\rMethodOptions\x12%\n\ndeprecated\x18! \x01(\x08:\x05\x66\x61lseR\ndeprecated\x12q\n\x11idempotency_level\x18\" \x01(\x0e\x32/.google.protobuf.MethodOptions.IdempotencyLevel:\x13IDEMPOTENCY_UNKNOWNR\x10idempotencyLevel\x12X\n\x14uninterpreted_option\x18\xe7\x07 \x03(\x0b\x32$.google.protobuf.UninterpretedOptionR\x13uninterpretedOption\"P\n\x10IdempotencyLevel\x12\x17\n\x13IDEMPOTENCY_UNKNOWN\x10\x00\x12\x13\n\x0fNO_SIDE_EFFECTS\x10\x01\x12\x0e\n\nIDEMPOTENT\x10\x02*\t\x08\xe8\x07\x10\x80\x80\x80\x80\x02\"\x9a\x03\n\x13UninterpretedOption\x12\x41\n\x04name\x18\x02 \x03(\x0b\x32-.google.protobuf.UninterpretedOption.NamePartR\x04name\x12)\n\x10identifier_value\x18\x03 \x01(\tR\x0fidentifierValue\x12,\n\x12positive_int_value\x18\x04 \x01(\x04R\x10positiveIntValue\x12,\n\x12negative_int_value\x18\x05 \x01(\x03R\x10negativeIntValue\x12!\n\x0c\x64ouble_value\x18\x06 \x01(\x01R\x0b\x64oubleValue\x12!\n\x0cstring_value\x18\x07 \x01(\x0cR\x0bstringValue\x12\'\n\x0f\x61ggregate_value\x18\x08 \x01(\tR\x0e\x61ggregateValue\x1aJ\n\x08NamePart\x12\x1b\n\tname_part\x18\x01 \x02(\tR\x08namePart\x12!\n\x0cis_extension\x18\x02 \x02(\x08R\x0bisExtension\"\xa7\x02\n\x0eSourceCodeInfo\x12\x44\n\x08location\x18\x01 \x03(\x0b\x32(.google.protobuf.SourceCodeInfo.LocationR\x08location\x1a\xce\x01\n\x08Location\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x16\n\x04span\x18\x02 \x03(\x05\x42\x02\x10\x01R\x04span\x12)\n\x10leading_comments\x18\x03 \x01(\tR\x0fleadingComments\x12+\n\x11trailing_comments\x18\x04 \x01(\tR\x10trailingComments\x12:\n\x19leading_detached_comments\x18\x06 \x03(\tR\x17leadingDetachedComments\"\xd0\x02\n\x11GeneratedCodeInfo\x12M\n\nannotation\x18\x01 \x03(\x0b\x32-.google.protobuf.GeneratedCodeInfo.AnnotationR\nannotation\x1a\xeb\x01\n\nAnnotation\x12\x16\n\x04path\x18\x01 \x03(\x05\x42\x02\x10\x01R\x04path\x12\x1f\n\x0bsource_file\x18\x02 \x01(\tR\nsourceFile\x12\x14\n\x05\x62\x65gin\x18\x03 \x01(\x05R\x05\x62\x65gin\x12\x10\n\x03\x65nd\x18\x04 \x01(\x05R\x03\x65nd\x12R\n\x08semantic\x18\x05 \x01(\x0e\x32\x36.google.protobuf.GeneratedCodeInfo.Annotation.SemanticR\x08semantic\"(\n\x08Semantic\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03SET\x10\x01\x12\t\n\x05\x41LIAS\x10\x02\x42~\n\x13\x63om.google.protobufB\x10\x44\x65scriptorProtosH\x01Z-google.golang.org/protobuf/types/descriptorpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1aGoogle.Protobuf.Reflection') - -_globals = globals() -if _descriptor._USE_C_DESCRIPTORS == False: - _EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE = _descriptor.EnumDescriptor( - name='VerificationState', - full_name='google.protobuf.ExtensionRangeOptions.VerificationState', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='DECLARATION', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='UNVERIFIED', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE) - - _FIELDDESCRIPTORPROTO_TYPE = _descriptor.EnumDescriptor( - name='Type', - full_name='google.protobuf.FieldDescriptorProto.Type', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='TYPE_DOUBLE', index=0, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_FLOAT', index=1, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_INT64', index=2, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_UINT64', index=3, number=4, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_INT32', index=4, number=5, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_FIXED64', index=5, number=6, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_FIXED32', index=6, number=7, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_BOOL', index=7, number=8, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_STRING', index=8, number=9, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_GROUP', index=9, number=10, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_MESSAGE', index=10, number=11, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_BYTES', index=11, number=12, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_UINT32', index=12, number=13, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_ENUM', index=13, number=14, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_SFIXED32', index=14, number=15, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_SFIXED64', index=15, number=16, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_SINT32', index=16, number=17, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TYPE_SINT64', index=17, number=18, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_FIELDDESCRIPTORPROTO_TYPE) - - _FIELDDESCRIPTORPROTO_LABEL = _descriptor.EnumDescriptor( - name='Label', - full_name='google.protobuf.FieldDescriptorProto.Label', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='LABEL_OPTIONAL', index=0, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='LABEL_REQUIRED', index=1, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='LABEL_REPEATED', index=2, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_FIELDDESCRIPTORPROTO_LABEL) - - _FILEOPTIONS_OPTIMIZEMODE = _descriptor.EnumDescriptor( - name='OptimizeMode', - full_name='google.protobuf.FileOptions.OptimizeMode', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='SPEED', index=0, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='CODE_SIZE', index=1, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='LITE_RUNTIME', index=2, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_FILEOPTIONS_OPTIMIZEMODE) - - _FIELDOPTIONS_CTYPE = _descriptor.EnumDescriptor( - name='CType', - full_name='google.protobuf.FieldOptions.CType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='STRING', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='CORD', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='STRING_PIECE', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_CTYPE) - - _FIELDOPTIONS_JSTYPE = _descriptor.EnumDescriptor( - name='JSType', - full_name='google.protobuf.FieldOptions.JSType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='JS_NORMAL', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='JS_STRING', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='JS_NUMBER', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_JSTYPE) - - _FIELDOPTIONS_OPTIONRETENTION = _descriptor.EnumDescriptor( - name='OptionRetention', - full_name='google.protobuf.FieldOptions.OptionRetention', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='RETENTION_UNKNOWN', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='RETENTION_RUNTIME', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='RETENTION_SOURCE', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_OPTIONRETENTION) - - _FIELDOPTIONS_OPTIONTARGETTYPE = _descriptor.EnumDescriptor( - name='OptionTargetType', - full_name='google.protobuf.FieldOptions.OptionTargetType', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_UNKNOWN', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_FILE', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_EXTENSION_RANGE', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_MESSAGE', index=3, number=3, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_FIELD', index=4, number=4, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_ONEOF', index=5, number=5, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_ENUM', index=6, number=6, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_ENUM_ENTRY', index=7, number=7, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_SERVICE', index=8, number=8, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='TARGET_TYPE_METHOD', index=9, number=9, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_FIELDOPTIONS_OPTIONTARGETTYPE) - - _METHODOPTIONS_IDEMPOTENCYLEVEL = _descriptor.EnumDescriptor( - name='IdempotencyLevel', - full_name='google.protobuf.MethodOptions.IdempotencyLevel', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='IDEMPOTENCY_UNKNOWN', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='NO_SIDE_EFFECTS', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='IDEMPOTENT', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_METHODOPTIONS_IDEMPOTENCYLEVEL) - - _GENERATEDCODEINFO_ANNOTATION_SEMANTIC = _descriptor.EnumDescriptor( - name='Semantic', - full_name='google.protobuf.GeneratedCodeInfo.Annotation.Semantic', - filename=None, - file=DESCRIPTOR, - create_key=_descriptor._internal_create_key, - values=[ - _descriptor.EnumValueDescriptor( - name='NONE', index=0, number=0, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='SET', index=1, number=1, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - _descriptor.EnumValueDescriptor( - name='ALIAS', index=2, number=2, - serialized_options=None, - type=None, - create_key=_descriptor._internal_create_key), - ], - containing_type=None, - serialized_options=None, - ) - _sym_db.RegisterEnumDescriptor(_GENERATEDCODEINFO_ANNOTATION_SEMANTIC) - - - _FILEDESCRIPTORSET = _descriptor.Descriptor( - name='FileDescriptorSet', - full_name='google.protobuf.FileDescriptorSet', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='file', full_name='google.protobuf.FileDescriptorSet.file', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='file', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _FILEDESCRIPTORPROTO = _descriptor.Descriptor( - name='FileDescriptorProto', - full_name='google.protobuf.FileDescriptorProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.FileDescriptorProto.name', index=0, - number=1, 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, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='package', full_name='google.protobuf.FileDescriptorProto.package', index=1, - number=2, 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, json_name='package', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='dependency', full_name='google.protobuf.FileDescriptorProto.dependency', index=2, - number=3, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='dependency', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='public_dependency', full_name='google.protobuf.FileDescriptorProto.public_dependency', index=3, - number=10, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='publicDependency', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='weak_dependency', full_name='google.protobuf.FileDescriptorProto.weak_dependency', index=4, - number=11, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='weakDependency', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='message_type', full_name='google.protobuf.FileDescriptorProto.message_type', index=5, - number=4, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='messageType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='enum_type', full_name='google.protobuf.FileDescriptorProto.enum_type', index=6, - number=5, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='enumType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='service', full_name='google.protobuf.FileDescriptorProto.service', index=7, - number=6, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='service', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='extension', full_name='google.protobuf.FileDescriptorProto.extension', index=8, - number=7, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='extension', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.FileDescriptorProto.options', index=9, - number=8, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='source_code_info', full_name='google.protobuf.FileDescriptorProto.source_code_info', index=10, - number=9, 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=False, extension_scope=None, - serialized_options=None, json_name='sourceCodeInfo', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='syntax', full_name='google.protobuf.FileDescriptorProto.syntax', index=11, - number=12, 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, json_name='syntax', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='edition', full_name='google.protobuf.FileDescriptorProto.edition', index=12, - number=13, 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, json_name='edition', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _DESCRIPTORPROTO_EXTENSIONRANGE = _descriptor.Descriptor( - name='ExtensionRange', - full_name='google.protobuf.DescriptorProto.ExtensionRange', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='start', full_name='google.protobuf.DescriptorProto.ExtensionRange.start', index=0, - number=1, 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, json_name='start', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end', full_name='google.protobuf.DescriptorProto.ExtensionRange.end', index=1, - number=2, 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, json_name='end', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.DescriptorProto.ExtensionRange.options', index=2, - number=3, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - _DESCRIPTORPROTO_RESERVEDRANGE = _descriptor.Descriptor( - name='ReservedRange', - full_name='google.protobuf.DescriptorProto.ReservedRange', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='start', full_name='google.protobuf.DescriptorProto.ReservedRange.start', index=0, - number=1, 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, json_name='start', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end', full_name='google.protobuf.DescriptorProto.ReservedRange.end', index=1, - number=2, 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, json_name='end', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - _DESCRIPTORPROTO = _descriptor.Descriptor( - name='DescriptorProto', - full_name='google.protobuf.DescriptorProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.DescriptorProto.name', index=0, - number=1, 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, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='field', full_name='google.protobuf.DescriptorProto.field', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='field', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='extension', full_name='google.protobuf.DescriptorProto.extension', index=2, - number=6, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='extension', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='nested_type', full_name='google.protobuf.DescriptorProto.nested_type', index=3, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='nestedType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='enum_type', full_name='google.protobuf.DescriptorProto.enum_type', index=4, - number=4, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='enumType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='extension_range', full_name='google.protobuf.DescriptorProto.extension_range', index=5, - number=5, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='extensionRange', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='oneof_decl', full_name='google.protobuf.DescriptorProto.oneof_decl', index=6, - number=8, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='oneofDecl', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.DescriptorProto.options', index=7, - number=7, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='reserved_range', full_name='google.protobuf.DescriptorProto.reserved_range', index=8, - number=9, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='reservedRange', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='reserved_name', full_name='google.protobuf.DescriptorProto.reserved_name', index=9, - number=10, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='reservedName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_DESCRIPTORPROTO_EXTENSIONRANGE, _DESCRIPTORPROTO_RESERVEDRANGE, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _EXTENSIONRANGEOPTIONS_DECLARATION = _descriptor.Descriptor( - name='Declaration', - full_name='google.protobuf.ExtensionRangeOptions.Declaration', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='number', full_name='google.protobuf.ExtensionRangeOptions.Declaration.number', index=0, - number=1, 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, json_name='number', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='full_name', full_name='google.protobuf.ExtensionRangeOptions.Declaration.full_name', index=1, - number=2, 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, json_name='fullName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='type', full_name='google.protobuf.ExtensionRangeOptions.Declaration.type', 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, json_name='type', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='is_repeated', full_name='google.protobuf.ExtensionRangeOptions.Declaration.is_repeated', index=3, - number=4, 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, json_name='isRepeated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='reserved', full_name='google.protobuf.ExtensionRangeOptions.Declaration.reserved', index=4, - number=5, 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, json_name='reserved', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='repeated', full_name='google.protobuf.ExtensionRangeOptions.Declaration.repeated', index=5, - number=6, 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, json_name='repeated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - _EXTENSIONRANGEOPTIONS = _descriptor.Descriptor( - name='ExtensionRangeOptions', - full_name='google.protobuf.ExtensionRangeOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.ExtensionRangeOptions.uninterpreted_option', index=0, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='declaration', full_name='google.protobuf.ExtensionRangeOptions.declaration', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='declaration', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='verification', full_name='google.protobuf.ExtensionRangeOptions.verification', index=2, - number=3, type=14, cpp_type=8, label=1, - has_default_value=True, default_value=1, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='verification', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_EXTENSIONRANGEOPTIONS_DECLARATION, ], - enum_types=[ - _EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE, - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _FIELDDESCRIPTORPROTO = _descriptor.Descriptor( - name='FieldDescriptorProto', - full_name='google.protobuf.FieldDescriptorProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.FieldDescriptorProto.name', index=0, - number=1, 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, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='number', full_name='google.protobuf.FieldDescriptorProto.number', index=1, - 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, json_name='number', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='label', full_name='google.protobuf.FieldDescriptorProto.label', index=2, - number=4, type=14, cpp_type=8, label=1, - 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, json_name='label', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='type', full_name='google.protobuf.FieldDescriptorProto.type', index=3, - number=5, type=14, cpp_type=8, label=1, - 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, json_name='type', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='type_name', full_name='google.protobuf.FieldDescriptorProto.type_name', index=4, - number=6, 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, json_name='typeName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='extendee', full_name='google.protobuf.FieldDescriptorProto.extendee', index=5, - number=2, 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, json_name='extendee', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='default_value', full_name='google.protobuf.FieldDescriptorProto.default_value', index=6, - number=7, 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, json_name='defaultValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='oneof_index', full_name='google.protobuf.FieldDescriptorProto.oneof_index', index=7, - number=9, 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, json_name='oneofIndex', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='json_name', full_name='google.protobuf.FieldDescriptorProto.json_name', index=8, - number=10, 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, json_name='jsonName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.FieldDescriptorProto.options', index=9, - number=8, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='proto3_optional', full_name='google.protobuf.FieldDescriptorProto.proto3_optional', index=10, - number=17, 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, json_name='proto3Optional', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _FIELDDESCRIPTORPROTO_TYPE, - _FIELDDESCRIPTORPROTO_LABEL, - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _ONEOFDESCRIPTORPROTO = _descriptor.Descriptor( - name='OneofDescriptorProto', - full_name='google.protobuf.OneofDescriptorProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.OneofDescriptorProto.name', index=0, - number=1, 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, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.OneofDescriptorProto.options', index=1, - number=2, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE = _descriptor.Descriptor( - name='EnumReservedRange', - full_name='google.protobuf.EnumDescriptorProto.EnumReservedRange', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='start', full_name='google.protobuf.EnumDescriptorProto.EnumReservedRange.start', index=0, - number=1, 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, json_name='start', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end', full_name='google.protobuf.EnumDescriptorProto.EnumReservedRange.end', index=1, - number=2, 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, json_name='end', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - _ENUMDESCRIPTORPROTO = _descriptor.Descriptor( - name='EnumDescriptorProto', - full_name='google.protobuf.EnumDescriptorProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.EnumDescriptorProto.name', index=0, - number=1, 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, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='value', full_name='google.protobuf.EnumDescriptorProto.value', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='value', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.EnumDescriptorProto.options', index=2, - number=3, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='reserved_range', full_name='google.protobuf.EnumDescriptorProto.reserved_range', index=3, - number=4, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='reservedRange', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='reserved_name', full_name='google.protobuf.EnumDescriptorProto.reserved_name', index=4, - number=5, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='reservedName', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _ENUMVALUEDESCRIPTORPROTO = _descriptor.Descriptor( - name='EnumValueDescriptorProto', - full_name='google.protobuf.EnumValueDescriptorProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.EnumValueDescriptorProto.name', index=0, - number=1, 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, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='number', full_name='google.protobuf.EnumValueDescriptorProto.number', index=1, - number=2, 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, json_name='number', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.EnumValueDescriptorProto.options', index=2, - number=3, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _SERVICEDESCRIPTORPROTO = _descriptor.Descriptor( - name='ServiceDescriptorProto', - full_name='google.protobuf.ServiceDescriptorProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.ServiceDescriptorProto.name', index=0, - number=1, 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, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='method', full_name='google.protobuf.ServiceDescriptorProto.method', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='method', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.ServiceDescriptorProto.options', index=2, - number=3, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _METHODDESCRIPTORPROTO = _descriptor.Descriptor( - name='MethodDescriptorProto', - full_name='google.protobuf.MethodDescriptorProto', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.MethodDescriptorProto.name', index=0, - number=1, 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, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='input_type', full_name='google.protobuf.MethodDescriptorProto.input_type', index=1, - number=2, 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, json_name='inputType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='output_type', full_name='google.protobuf.MethodDescriptorProto.output_type', 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, json_name='outputType', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='options', full_name='google.protobuf.MethodDescriptorProto.options', index=3, - number=4, 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=False, extension_scope=None, - serialized_options=None, json_name='options', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='client_streaming', full_name='google.protobuf.MethodDescriptorProto.client_streaming', index=4, - number=5, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='clientStreaming', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='server_streaming', full_name='google.protobuf.MethodDescriptorProto.server_streaming', index=5, - number=6, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='serverStreaming', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _FILEOPTIONS = _descriptor.Descriptor( - name='FileOptions', - full_name='google.protobuf.FileOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='java_package', full_name='google.protobuf.FileOptions.java_package', index=0, - number=1, 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, json_name='javaPackage', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='java_outer_classname', full_name='google.protobuf.FileOptions.java_outer_classname', index=1, - number=8, 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, json_name='javaOuterClassname', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='java_multiple_files', full_name='google.protobuf.FileOptions.java_multiple_files', index=2, - number=10, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='javaMultipleFiles', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='java_generate_equals_and_hash', full_name='google.protobuf.FileOptions.java_generate_equals_and_hash', index=3, - number=20, 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, json_name='javaGenerateEqualsAndHash', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='java_string_check_utf8', full_name='google.protobuf.FileOptions.java_string_check_utf8', index=4, - number=27, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='javaStringCheckUtf8', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='optimize_for', full_name='google.protobuf.FileOptions.optimize_for', index=5, - number=9, type=14, cpp_type=8, label=1, - has_default_value=True, default_value=1, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='optimizeFor', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='go_package', full_name='google.protobuf.FileOptions.go_package', index=6, - number=11, 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, json_name='goPackage', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='cc_generic_services', full_name='google.protobuf.FileOptions.cc_generic_services', index=7, - number=16, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='ccGenericServices', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='java_generic_services', full_name='google.protobuf.FileOptions.java_generic_services', index=8, - number=17, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='javaGenericServices', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='py_generic_services', full_name='google.protobuf.FileOptions.py_generic_services', index=9, - number=18, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='pyGenericServices', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='php_generic_services', full_name='google.protobuf.FileOptions.php_generic_services', index=10, - number=42, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='phpGenericServices', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='deprecated', full_name='google.protobuf.FileOptions.deprecated', index=11, - number=23, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='cc_enable_arenas', full_name='google.protobuf.FileOptions.cc_enable_arenas', index=12, - number=31, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=True, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='ccEnableArenas', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='objc_class_prefix', full_name='google.protobuf.FileOptions.objc_class_prefix', index=13, - number=36, 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, json_name='objcClassPrefix', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='csharp_namespace', full_name='google.protobuf.FileOptions.csharp_namespace', index=14, - number=37, 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, json_name='csharpNamespace', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='swift_prefix', full_name='google.protobuf.FileOptions.swift_prefix', index=15, - number=39, 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, json_name='swiftPrefix', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='php_class_prefix', full_name='google.protobuf.FileOptions.php_class_prefix', index=16, - number=40, 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, json_name='phpClassPrefix', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='php_namespace', full_name='google.protobuf.FileOptions.php_namespace', index=17, - number=41, 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, json_name='phpNamespace', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='php_metadata_namespace', full_name='google.protobuf.FileOptions.php_metadata_namespace', index=18, - number=44, 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, json_name='phpMetadataNamespace', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='ruby_package', full_name='google.protobuf.FileOptions.ruby_package', index=19, - number=45, 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, json_name='rubyPackage', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.FileOptions.uninterpreted_option', index=20, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _FILEOPTIONS_OPTIMIZEMODE, - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _MESSAGEOPTIONS = _descriptor.Descriptor( - name='MessageOptions', - full_name='google.protobuf.MessageOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='message_set_wire_format', full_name='google.protobuf.MessageOptions.message_set_wire_format', index=0, - number=1, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='messageSetWireFormat', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='no_standard_descriptor_accessor', full_name='google.protobuf.MessageOptions.no_standard_descriptor_accessor', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='noStandardDescriptorAccessor', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='deprecated', full_name='google.protobuf.MessageOptions.deprecated', index=2, - number=3, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='map_entry', full_name='google.protobuf.MessageOptions.map_entry', index=3, - number=7, 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, json_name='mapEntry', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='deprecated_legacy_json_field_conflicts', full_name='google.protobuf.MessageOptions.deprecated_legacy_json_field_conflicts', index=4, - number=11, 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, json_name='deprecatedLegacyJsonFieldConflicts', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.MessageOptions.uninterpreted_option', index=5, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _FIELDOPTIONS = _descriptor.Descriptor( - name='FieldOptions', - full_name='google.protobuf.FieldOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='ctype', full_name='google.protobuf.FieldOptions.ctype', index=0, - number=1, type=14, cpp_type=8, label=1, - has_default_value=True, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='ctype', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='packed', full_name='google.protobuf.FieldOptions.packed', 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, json_name='packed', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='jstype', full_name='google.protobuf.FieldOptions.jstype', index=2, - number=6, type=14, cpp_type=8, label=1, - has_default_value=True, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='jstype', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='lazy', full_name='google.protobuf.FieldOptions.lazy', index=3, - number=5, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='lazy', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='unverified_lazy', full_name='google.protobuf.FieldOptions.unverified_lazy', index=4, - number=15, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='unverifiedLazy', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='deprecated', full_name='google.protobuf.FieldOptions.deprecated', index=5, - number=3, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='weak', full_name='google.protobuf.FieldOptions.weak', index=6, - number=10, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='weak', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='debug_redact', full_name='google.protobuf.FieldOptions.debug_redact', index=7, - number=16, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='debugRedact', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='retention', full_name='google.protobuf.FieldOptions.retention', index=8, - number=17, type=14, cpp_type=8, 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, json_name='retention', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='target', full_name='google.protobuf.FieldOptions.target', index=9, - number=18, type=14, cpp_type=8, 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, json_name='target', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='targets', full_name='google.protobuf.FieldOptions.targets', index=10, - number=19, type=14, cpp_type=8, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='targets', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.FieldOptions.uninterpreted_option', index=11, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _FIELDOPTIONS_CTYPE, - _FIELDOPTIONS_JSTYPE, - _FIELDOPTIONS_OPTIONRETENTION, - _FIELDOPTIONS_OPTIONTARGETTYPE, - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _ONEOFOPTIONS = _descriptor.Descriptor( - name='OneofOptions', - full_name='google.protobuf.OneofOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.OneofOptions.uninterpreted_option', index=0, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _ENUMOPTIONS = _descriptor.Descriptor( - name='EnumOptions', - full_name='google.protobuf.EnumOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='allow_alias', full_name='google.protobuf.EnumOptions.allow_alias', index=0, - 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, json_name='allowAlias', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='deprecated', full_name='google.protobuf.EnumOptions.deprecated', index=1, - number=3, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='deprecated_legacy_json_field_conflicts', full_name='google.protobuf.EnumOptions.deprecated_legacy_json_field_conflicts', index=2, - number=6, 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, json_name='deprecatedLegacyJsonFieldConflicts', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.EnumOptions.uninterpreted_option', index=3, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _ENUMVALUEOPTIONS = _descriptor.Descriptor( - name='EnumValueOptions', - full_name='google.protobuf.EnumValueOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='deprecated', full_name='google.protobuf.EnumValueOptions.deprecated', index=0, - number=1, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.EnumValueOptions.uninterpreted_option', index=1, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _SERVICEOPTIONS = _descriptor.Descriptor( - name='ServiceOptions', - full_name='google.protobuf.ServiceOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='deprecated', full_name='google.protobuf.ServiceOptions.deprecated', index=0, - number=33, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.ServiceOptions.uninterpreted_option', index=1, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _METHODOPTIONS = _descriptor.Descriptor( - name='MethodOptions', - full_name='google.protobuf.MethodOptions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='deprecated', full_name='google.protobuf.MethodOptions.deprecated', index=0, - number=33, type=8, cpp_type=7, label=1, - has_default_value=True, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='deprecated', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='idempotency_level', full_name='google.protobuf.MethodOptions.idempotency_level', index=1, - number=34, type=14, cpp_type=8, label=1, - has_default_value=True, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='idempotencyLevel', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='uninterpreted_option', full_name='google.protobuf.MethodOptions.uninterpreted_option', index=2, - number=999, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='uninterpretedOption', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _METHODOPTIONS_IDEMPOTENCYLEVEL, - ], - serialized_options=None, - is_extendable=True, - syntax='proto2', - extension_ranges=[(1000, 536870912), ], - oneofs=[ - ], - ) - - - _UNINTERPRETEDOPTION_NAMEPART = _descriptor.Descriptor( - name='NamePart', - full_name='google.protobuf.UninterpretedOption.NamePart', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name_part', full_name='google.protobuf.UninterpretedOption.NamePart.name_part', index=0, - number=1, type=9, cpp_type=9, label=2, - 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, json_name='namePart', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='is_extension', full_name='google.protobuf.UninterpretedOption.NamePart.is_extension', index=1, - number=2, type=8, cpp_type=7, label=2, - 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, json_name='isExtension', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - _UNINTERPRETEDOPTION = _descriptor.Descriptor( - name='UninterpretedOption', - full_name='google.protobuf.UninterpretedOption', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='google.protobuf.UninterpretedOption.name', index=0, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='name', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='identifier_value', full_name='google.protobuf.UninterpretedOption.identifier_value', index=1, - 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, json_name='identifierValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='positive_int_value', full_name='google.protobuf.UninterpretedOption.positive_int_value', index=2, - number=4, type=4, cpp_type=4, 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, json_name='positiveIntValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='negative_int_value', full_name='google.protobuf.UninterpretedOption.negative_int_value', index=3, - number=5, type=3, cpp_type=2, 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, json_name='negativeIntValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='double_value', full_name='google.protobuf.UninterpretedOption.double_value', index=4, - number=6, type=1, cpp_type=5, label=1, - has_default_value=False, default_value=float(0), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='doubleValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='string_value', full_name='google.protobuf.UninterpretedOption.string_value', index=5, - number=7, type=12, cpp_type=9, label=1, - 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, json_name='stringValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='aggregate_value', full_name='google.protobuf.UninterpretedOption.aggregate_value', index=6, - number=8, 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, json_name='aggregateValue', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_UNINTERPRETEDOPTION_NAMEPART, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _SOURCECODEINFO_LOCATION = _descriptor.Descriptor( - name='Location', - full_name='google.protobuf.SourceCodeInfo.Location', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='path', full_name='google.protobuf.SourceCodeInfo.Location.path', index=0, - number=1, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='path', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='span', full_name='google.protobuf.SourceCodeInfo.Location.span', index=1, - number=2, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='span', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='leading_comments', full_name='google.protobuf.SourceCodeInfo.Location.leading_comments', 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, json_name='leadingComments', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='trailing_comments', full_name='google.protobuf.SourceCodeInfo.Location.trailing_comments', index=3, - number=4, 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, json_name='trailingComments', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='leading_detached_comments', full_name='google.protobuf.SourceCodeInfo.Location.leading_detached_comments', index=4, - number=6, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='leadingDetachedComments', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - _SOURCECODEINFO = _descriptor.Descriptor( - name='SourceCodeInfo', - full_name='google.protobuf.SourceCodeInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='location', full_name='google.protobuf.SourceCodeInfo.location', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='location', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_SOURCECODEINFO_LOCATION, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - - _GENERATEDCODEINFO_ANNOTATION = _descriptor.Descriptor( - name='Annotation', - full_name='google.protobuf.GeneratedCodeInfo.Annotation', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='path', full_name='google.protobuf.GeneratedCodeInfo.Annotation.path', index=0, - number=1, type=5, cpp_type=1, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='path', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='source_file', full_name='google.protobuf.GeneratedCodeInfo.Annotation.source_file', index=1, - number=2, 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, json_name='sourceFile', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='begin', full_name='google.protobuf.GeneratedCodeInfo.Annotation.begin', 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, json_name='begin', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='end', full_name='google.protobuf.GeneratedCodeInfo.Annotation.end', 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, json_name='end', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='semantic', full_name='google.protobuf.GeneratedCodeInfo.Annotation.semantic', index=4, - number=5, type=14, cpp_type=8, 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, json_name='semantic', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _GENERATEDCODEINFO_ANNOTATION_SEMANTIC, - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - _GENERATEDCODEINFO = _descriptor.Descriptor( - name='GeneratedCodeInfo', - full_name='google.protobuf.GeneratedCodeInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='annotation', full_name='google.protobuf.GeneratedCodeInfo.annotation', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, json_name='annotation', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[_GENERATEDCODEINFO_ANNOTATION, ], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto2', - extension_ranges=[], - oneofs=[ - ], - ) - - _FILEDESCRIPTORSET.fields_by_name['file'].message_type = _FILEDESCRIPTORPROTO - _FILEDESCRIPTORPROTO.fields_by_name['message_type'].message_type = _DESCRIPTORPROTO - _FILEDESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO - _FILEDESCRIPTORPROTO.fields_by_name['service'].message_type = _SERVICEDESCRIPTORPROTO - _FILEDESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO - _FILEDESCRIPTORPROTO.fields_by_name['options'].message_type = _FILEOPTIONS - _FILEDESCRIPTORPROTO.fields_by_name['source_code_info'].message_type = _SOURCECODEINFO - _DESCRIPTORPROTO_EXTENSIONRANGE.fields_by_name['options'].message_type = _EXTENSIONRANGEOPTIONS - _DESCRIPTORPROTO_EXTENSIONRANGE.containing_type = _DESCRIPTORPROTO - _DESCRIPTORPROTO_RESERVEDRANGE.containing_type = _DESCRIPTORPROTO - _DESCRIPTORPROTO.fields_by_name['field'].message_type = _FIELDDESCRIPTORPROTO - _DESCRIPTORPROTO.fields_by_name['extension'].message_type = _FIELDDESCRIPTORPROTO - _DESCRIPTORPROTO.fields_by_name['nested_type'].message_type = _DESCRIPTORPROTO - _DESCRIPTORPROTO.fields_by_name['enum_type'].message_type = _ENUMDESCRIPTORPROTO - _DESCRIPTORPROTO.fields_by_name['extension_range'].message_type = _DESCRIPTORPROTO_EXTENSIONRANGE - _DESCRIPTORPROTO.fields_by_name['oneof_decl'].message_type = _ONEOFDESCRIPTORPROTO - _DESCRIPTORPROTO.fields_by_name['options'].message_type = _MESSAGEOPTIONS - _DESCRIPTORPROTO.fields_by_name['reserved_range'].message_type = _DESCRIPTORPROTO_RESERVEDRANGE - _EXTENSIONRANGEOPTIONS_DECLARATION.containing_type = _EXTENSIONRANGEOPTIONS - _EXTENSIONRANGEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _EXTENSIONRANGEOPTIONS.fields_by_name['declaration'].message_type = _EXTENSIONRANGEOPTIONS_DECLARATION - _EXTENSIONRANGEOPTIONS.fields_by_name['verification'].enum_type = _EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE - _EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE.containing_type = _EXTENSIONRANGEOPTIONS - _FIELDDESCRIPTORPROTO.fields_by_name['label'].enum_type = _FIELDDESCRIPTORPROTO_LABEL - _FIELDDESCRIPTORPROTO.fields_by_name['type'].enum_type = _FIELDDESCRIPTORPROTO_TYPE - _FIELDDESCRIPTORPROTO.fields_by_name['options'].message_type = _FIELDOPTIONS - _FIELDDESCRIPTORPROTO_TYPE.containing_type = _FIELDDESCRIPTORPROTO - _FIELDDESCRIPTORPROTO_LABEL.containing_type = _FIELDDESCRIPTORPROTO - _ONEOFDESCRIPTORPROTO.fields_by_name['options'].message_type = _ONEOFOPTIONS - _ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE.containing_type = _ENUMDESCRIPTORPROTO - _ENUMDESCRIPTORPROTO.fields_by_name['value'].message_type = _ENUMVALUEDESCRIPTORPROTO - _ENUMDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMOPTIONS - _ENUMDESCRIPTORPROTO.fields_by_name['reserved_range'].message_type = _ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE - _ENUMVALUEDESCRIPTORPROTO.fields_by_name['options'].message_type = _ENUMVALUEOPTIONS - _SERVICEDESCRIPTORPROTO.fields_by_name['method'].message_type = _METHODDESCRIPTORPROTO - _SERVICEDESCRIPTORPROTO.fields_by_name['options'].message_type = _SERVICEOPTIONS - _METHODDESCRIPTORPROTO.fields_by_name['options'].message_type = _METHODOPTIONS - _FILEOPTIONS.fields_by_name['optimize_for'].enum_type = _FILEOPTIONS_OPTIMIZEMODE - _FILEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _FILEOPTIONS_OPTIMIZEMODE.containing_type = _FILEOPTIONS - _MESSAGEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _FIELDOPTIONS.fields_by_name['ctype'].enum_type = _FIELDOPTIONS_CTYPE - _FIELDOPTIONS.fields_by_name['jstype'].enum_type = _FIELDOPTIONS_JSTYPE - _FIELDOPTIONS.fields_by_name['retention'].enum_type = _FIELDOPTIONS_OPTIONRETENTION - _FIELDOPTIONS.fields_by_name['target'].enum_type = _FIELDOPTIONS_OPTIONTARGETTYPE - _FIELDOPTIONS.fields_by_name['targets'].enum_type = _FIELDOPTIONS_OPTIONTARGETTYPE - _FIELDOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _FIELDOPTIONS_CTYPE.containing_type = _FIELDOPTIONS - _FIELDOPTIONS_JSTYPE.containing_type = _FIELDOPTIONS - _FIELDOPTIONS_OPTIONRETENTION.containing_type = _FIELDOPTIONS - _FIELDOPTIONS_OPTIONTARGETTYPE.containing_type = _FIELDOPTIONS - _ONEOFOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _ENUMOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _ENUMVALUEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _SERVICEOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _METHODOPTIONS.fields_by_name['idempotency_level'].enum_type = _METHODOPTIONS_IDEMPOTENCYLEVEL - _METHODOPTIONS.fields_by_name['uninterpreted_option'].message_type = _UNINTERPRETEDOPTION - _METHODOPTIONS_IDEMPOTENCYLEVEL.containing_type = _METHODOPTIONS - _UNINTERPRETEDOPTION_NAMEPART.containing_type = _UNINTERPRETEDOPTION - _UNINTERPRETEDOPTION.fields_by_name['name'].message_type = _UNINTERPRETEDOPTION_NAMEPART - _SOURCECODEINFO_LOCATION.containing_type = _SOURCECODEINFO - _SOURCECODEINFO.fields_by_name['location'].message_type = _SOURCECODEINFO_LOCATION - _GENERATEDCODEINFO_ANNOTATION.fields_by_name['semantic'].enum_type = _GENERATEDCODEINFO_ANNOTATION_SEMANTIC - _GENERATEDCODEINFO_ANNOTATION.containing_type = _GENERATEDCODEINFO - _GENERATEDCODEINFO_ANNOTATION_SEMANTIC.containing_type = _GENERATEDCODEINFO_ANNOTATION - _GENERATEDCODEINFO.fields_by_name['annotation'].message_type = _GENERATEDCODEINFO_ANNOTATION - DESCRIPTOR.message_types_by_name['FileDescriptorSet'] = _FILEDESCRIPTORSET - DESCRIPTOR.message_types_by_name['FileDescriptorProto'] = _FILEDESCRIPTORPROTO - DESCRIPTOR.message_types_by_name['DescriptorProto'] = _DESCRIPTORPROTO - DESCRIPTOR.message_types_by_name['ExtensionRangeOptions'] = _EXTENSIONRANGEOPTIONS - DESCRIPTOR.message_types_by_name['FieldDescriptorProto'] = _FIELDDESCRIPTORPROTO - DESCRIPTOR.message_types_by_name['OneofDescriptorProto'] = _ONEOFDESCRIPTORPROTO - DESCRIPTOR.message_types_by_name['EnumDescriptorProto'] = _ENUMDESCRIPTORPROTO - DESCRIPTOR.message_types_by_name['EnumValueDescriptorProto'] = _ENUMVALUEDESCRIPTORPROTO - DESCRIPTOR.message_types_by_name['ServiceDescriptorProto'] = _SERVICEDESCRIPTORPROTO - DESCRIPTOR.message_types_by_name['MethodDescriptorProto'] = _METHODDESCRIPTORPROTO - DESCRIPTOR.message_types_by_name['FileOptions'] = _FILEOPTIONS - DESCRIPTOR.message_types_by_name['MessageOptions'] = _MESSAGEOPTIONS - DESCRIPTOR.message_types_by_name['FieldOptions'] = _FIELDOPTIONS - DESCRIPTOR.message_types_by_name['OneofOptions'] = _ONEOFOPTIONS - DESCRIPTOR.message_types_by_name['EnumOptions'] = _ENUMOPTIONS - DESCRIPTOR.message_types_by_name['EnumValueOptions'] = _ENUMVALUEOPTIONS - DESCRIPTOR.message_types_by_name['ServiceOptions'] = _SERVICEOPTIONS - DESCRIPTOR.message_types_by_name['MethodOptions'] = _METHODOPTIONS - DESCRIPTOR.message_types_by_name['UninterpretedOption'] = _UNINTERPRETEDOPTION - DESCRIPTOR.message_types_by_name['SourceCodeInfo'] = _SOURCECODEINFO - DESCRIPTOR.message_types_by_name['GeneratedCodeInfo'] = _GENERATEDCODEINFO - _sym_db.RegisterFileDescriptor(DESCRIPTOR) - -else: - _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.descriptor_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - _globals['_FILEDESCRIPTORSET']._serialized_start=53 - _globals['_FILEDESCRIPTORSET']._serialized_end=130 - _globals['_FILEDESCRIPTORPROTO']._serialized_start=133 - _globals['_FILEDESCRIPTORPROTO']._serialized_end=771 - _globals['_DESCRIPTORPROTO']._serialized_start=774 - _globals['_DESCRIPTORPROTO']._serialized_end=1599 - _globals['_DESCRIPTORPROTO_EXTENSIONRANGE']._serialized_start=1420 - _globals['_DESCRIPTORPROTO_EXTENSIONRANGE']._serialized_end=1542 - _globals['_DESCRIPTORPROTO_RESERVEDRANGE']._serialized_start=1544 - _globals['_DESCRIPTORPROTO_RESERVEDRANGE']._serialized_end=1599 - _globals['_EXTENSIONRANGEOPTIONS']._serialized_start=1602 - _globals['_EXTENSIONRANGEOPTIONS']._serialized_end=2159 - _globals['_EXTENSIONRANGEOPTIONS_DECLARATION']._serialized_start=1915 - _globals['_EXTENSIONRANGEOPTIONS_DECLARATION']._serialized_end=2094 - _globals['_EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE']._serialized_start=2096 - _globals['_EXTENSIONRANGEOPTIONS_VERIFICATIONSTATE']._serialized_end=2148 - _globals['_FIELDDESCRIPTORPROTO']._serialized_start=2162 - _globals['_FIELDDESCRIPTORPROTO']._serialized_end=2995 - _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_start=2616 - _globals['_FIELDDESCRIPTORPROTO_TYPE']._serialized_end=2926 - _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_start=2928 - _globals['_FIELDDESCRIPTORPROTO_LABEL']._serialized_end=2995 - _globals['_ONEOFDESCRIPTORPROTO']._serialized_start=2997 - _globals['_ONEOFDESCRIPTORPROTO']._serialized_end=3096 - _globals['_ENUMDESCRIPTORPROTO']._serialized_start=3099 - _globals['_ENUMDESCRIPTORPROTO']._serialized_end=3454 - _globals['_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE']._serialized_start=3395 - _globals['_ENUMDESCRIPTORPROTO_ENUMRESERVEDRANGE']._serialized_end=3454 - _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_start=3457 - _globals['_ENUMVALUEDESCRIPTORPROTO']._serialized_end=3588 - _globals['_SERVICEDESCRIPTORPROTO']._serialized_start=3591 - _globals['_SERVICEDESCRIPTORPROTO']._serialized_end=3758 - _globals['_METHODDESCRIPTORPROTO']._serialized_start=3761 - _globals['_METHODDESCRIPTORPROTO']._serialized_end=4026 - _globals['_FILEOPTIONS']._serialized_start=4029 - _globals['_FILEOPTIONS']._serialized_end=5198 - _globals['_FILEOPTIONS_OPTIMIZEMODE']._serialized_start=5123 - _globals['_FILEOPTIONS_OPTIMIZEMODE']._serialized_end=5181 - _globals['_MESSAGEOPTIONS']._serialized_start=5201 - _globals['_MESSAGEOPTIONS']._serialized_end=5644 - _globals['_FIELDOPTIONS']._serialized_start=5647 - _globals['_FIELDOPTIONS']._serialized_end=6804 - _globals['_FIELDOPTIONS_CTYPE']._serialized_start=6327 - _globals['_FIELDOPTIONS_CTYPE']._serialized_end=6374 - _globals['_FIELDOPTIONS_JSTYPE']._serialized_start=6376 - _globals['_FIELDOPTIONS_JSTYPE']._serialized_end=6429 - _globals['_FIELDOPTIONS_OPTIONRETENTION']._serialized_start=6431 - _globals['_FIELDOPTIONS_OPTIONRETENTION']._serialized_end=6516 - _globals['_FIELDOPTIONS_OPTIONTARGETTYPE']._serialized_start=6519 - _globals['_FIELDOPTIONS_OPTIONTARGETTYPE']._serialized_end=6787 - _globals['_ONEOFOPTIONS']._serialized_start=6806 - _globals['_ONEOFOPTIONS']._serialized_end=6921 - _globals['_ENUMOPTIONS']._serialized_start=6924 - _globals['_ENUMOPTIONS']._serialized_end=7204 - _globals['_ENUMVALUEOPTIONS']._serialized_start=7207 - _globals['_ENUMVALUEOPTIONS']._serialized_end=7365 - _globals['_SERVICEOPTIONS']._serialized_start=7368 - _globals['_SERVICEOPTIONS']._serialized_end=7524 - _globals['_METHODOPTIONS']._serialized_start=7527 - _globals['_METHODOPTIONS']._serialized_end=7879 - _globals['_METHODOPTIONS_IDEMPOTENCYLEVEL']._serialized_start=7788 - _globals['_METHODOPTIONS_IDEMPOTENCYLEVEL']._serialized_end=7868 - _globals['_UNINTERPRETEDOPTION']._serialized_start=7882 - _globals['_UNINTERPRETEDOPTION']._serialized_end=8292 - _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_start=8218 - _globals['_UNINTERPRETEDOPTION_NAMEPART']._serialized_end=8292 - _globals['_SOURCECODEINFO']._serialized_start=8295 - _globals['_SOURCECODEINFO']._serialized_end=8590 - _globals['_SOURCECODEINFO_LOCATION']._serialized_start=8384 - _globals['_SOURCECODEINFO_LOCATION']._serialized_end=8590 - _globals['_GENERATEDCODEINFO']._serialized_start=8593 - _globals['_GENERATEDCODEINFO']._serialized_end=8929 - _globals['_GENERATEDCODEINFO_ANNOTATION']._serialized_start=8694 - _globals['_GENERATEDCODEINFO_ANNOTATION']._serialized_end=8929 - _globals['_GENERATEDCODEINFO_ANNOTATION_SEMANTIC']._serialized_start=8889 - _globals['_GENERATEDCODEINFO_ANNOTATION_SEMANTIC']._serialized_end=8929 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/descriptor_pool.py b/script.module.protobuf/resources/lib/google/protobuf/descriptor_pool.py deleted file mode 100644 index 1ebf11834..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/descriptor_pool.py +++ /dev/null @@ -1,1290 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Provides DescriptorPool to use as a container for proto2 descriptors. - -The DescriptorPool is used in conjection with a DescriptorDatabase to maintain -a collection of protocol buffer descriptors for use when dynamically creating -message types at runtime. - -For most applications protocol buffers should be used via modules generated by -the protocol buffer compiler tool. This should only be used when the type of -protocol buffers used in an application or library cannot be predetermined. - -Below is a straightforward example on how to use this class:: - - pool = DescriptorPool() - file_descriptor_protos = [ ... ] - for file_descriptor_proto in file_descriptor_protos: - pool.Add(file_descriptor_proto) - my_message_descriptor = pool.FindMessageTypeByName('some.package.MessageType') - -The message descriptor can be used in conjunction with the message_factory -module in order to create a protocol buffer class that can be encoded and -decoded. - -If you want to get a Python class for the specified proto, use the -helper functions inside google.protobuf.message_factory -directly instead of this class. -""" - -__author__ = 'matthewtoia@google.com (Matt Toia)' - -import collections -import warnings - -from google.protobuf import descriptor -from google.protobuf import descriptor_database -from google.protobuf import text_encoding - - -_USE_C_DESCRIPTORS = descriptor._USE_C_DESCRIPTORS # pylint: disable=protected-access - - -def _Deprecated(func): - """Mark functions as deprecated.""" - - def NewFunc(*args, **kwargs): - warnings.warn( - 'Call to deprecated function %s(). Note: Do add unlinked descriptors ' - 'to descriptor_pool is wrong. Use Add() or AddSerializedFile() ' - 'instead.' % func.__name__, - category=DeprecationWarning) - return func(*args, **kwargs) - NewFunc.__name__ = func.__name__ - NewFunc.__doc__ = func.__doc__ - NewFunc.__dict__.update(func.__dict__) - return NewFunc - - -def _NormalizeFullyQualifiedName(name): - """Remove leading period from fully-qualified type name. - - Due to b/13860351 in descriptor_database.py, types in the root namespace are - generated with a leading period. This function removes that prefix. - - Args: - name (str): The fully-qualified symbol name. - - Returns: - str: The normalized fully-qualified symbol name. - """ - return name.lstrip('.') - - -def _OptionsOrNone(descriptor_proto): - """Returns the value of the field `options`, or None if it is not set.""" - if descriptor_proto.HasField('options'): - return descriptor_proto.options - else: - return None - - -def _IsMessageSetExtension(field): - return (field.is_extension and - field.containing_type.has_options and - field.containing_type.GetOptions().message_set_wire_format and - field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and - field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL) - - -class DescriptorPool(object): - """A collection of protobufs dynamically constructed by descriptor protos.""" - - if _USE_C_DESCRIPTORS: - - def __new__(cls, descriptor_db=None): - # pylint: disable=protected-access - return descriptor._message.DescriptorPool(descriptor_db) - - def __init__( - self, descriptor_db=None, use_deprecated_legacy_json_field_conflicts=False - ): - """Initializes a Pool of proto buffs. - - The descriptor_db argument to the constructor is provided to allow - specialized file descriptor proto lookup code to be triggered on demand. An - example would be an implementation which will read and compile a file - specified in a call to FindFileByName() and not require the call to Add() - at all. Results from this database will be cached internally here as well. - - Args: - descriptor_db: A secondary source of file descriptors. - use_deprecated_legacy_json_field_conflicts: Unused, for compatibility with - C++. - """ - - self._internal_db = descriptor_database.DescriptorDatabase() - self._descriptor_db = descriptor_db - self._descriptors = {} - self._enum_descriptors = {} - self._service_descriptors = {} - self._file_descriptors = {} - self._toplevel_extensions = {} - self._top_enum_values = {} - # We store extensions in two two-level mappings: The first key is the - # descriptor of the message being extended, the second key is the extension - # full name or its tag number. - self._extensions_by_name = collections.defaultdict(dict) - self._extensions_by_number = collections.defaultdict(dict) - - def _CheckConflictRegister(self, desc, desc_name, file_name): - """Check if the descriptor name conflicts with another of the same name. - - Args: - desc: Descriptor of a message, enum, service, extension or enum value. - desc_name (str): the full name of desc. - file_name (str): The file name of descriptor. - """ - for register, descriptor_type in [ - (self._descriptors, descriptor.Descriptor), - (self._enum_descriptors, descriptor.EnumDescriptor), - (self._service_descriptors, descriptor.ServiceDescriptor), - (self._toplevel_extensions, descriptor.FieldDescriptor), - (self._top_enum_values, descriptor.EnumValueDescriptor)]: - if desc_name in register: - old_desc = register[desc_name] - if isinstance(old_desc, descriptor.EnumValueDescriptor): - old_file = old_desc.type.file.name - else: - old_file = old_desc.file.name - - if not isinstance(desc, descriptor_type) or ( - old_file != file_name): - error_msg = ('Conflict register for file "' + file_name + - '": ' + desc_name + - ' is already defined in file "' + - old_file + '". Please fix the conflict by adding ' - 'package name on the proto file, or use different ' - 'name for the duplication.') - if isinstance(desc, descriptor.EnumValueDescriptor): - error_msg += ('\nNote: enum values appear as ' - 'siblings of the enum type instead of ' - 'children of it.') - - raise TypeError(error_msg) - - return - - def Add(self, file_desc_proto): - """Adds the FileDescriptorProto and its types to this pool. - - Args: - file_desc_proto (FileDescriptorProto): The file descriptor to add. - """ - - self._internal_db.Add(file_desc_proto) - - def AddSerializedFile(self, serialized_file_desc_proto): - """Adds the FileDescriptorProto and its types to this pool. - - Args: - serialized_file_desc_proto (bytes): A bytes string, serialization of the - :class:`FileDescriptorProto` to add. - - Returns: - FileDescriptor: Descriptor for the added file. - """ - - # pylint: disable=g-import-not-at-top - from google.protobuf import descriptor_pb2 - file_desc_proto = descriptor_pb2.FileDescriptorProto.FromString( - serialized_file_desc_proto) - file_desc = self._ConvertFileProtoToFileDescriptor(file_desc_proto) - file_desc.serialized_pb = serialized_file_desc_proto - return file_desc - - # Add Descriptor to descriptor pool is deprecated. Please use Add() - # or AddSerializedFile() to add a FileDescriptorProto instead. - @_Deprecated - def AddDescriptor(self, desc): - self._AddDescriptor(desc) - - # Never call this method. It is for internal usage only. - def _AddDescriptor(self, desc): - """Adds a Descriptor to the pool, non-recursively. - - If the Descriptor contains nested messages or enums, the caller must - explicitly register them. This method also registers the FileDescriptor - associated with the message. - - Args: - desc: A Descriptor. - """ - if not isinstance(desc, descriptor.Descriptor): - raise TypeError('Expected instance of descriptor.Descriptor.') - - self._CheckConflictRegister(desc, desc.full_name, desc.file.name) - - self._descriptors[desc.full_name] = desc - self._AddFileDescriptor(desc.file) - - # Add EnumDescriptor to descriptor pool is deprecated. Please use Add() - # or AddSerializedFile() to add a FileDescriptorProto instead. - @_Deprecated - def AddEnumDescriptor(self, enum_desc): - self._AddEnumDescriptor(enum_desc) - - # Never call this method. It is for internal usage only. - def _AddEnumDescriptor(self, enum_desc): - """Adds an EnumDescriptor to the pool. - - This method also registers the FileDescriptor associated with the enum. - - Args: - enum_desc: An EnumDescriptor. - """ - - if not isinstance(enum_desc, descriptor.EnumDescriptor): - raise TypeError('Expected instance of descriptor.EnumDescriptor.') - - file_name = enum_desc.file.name - self._CheckConflictRegister(enum_desc, enum_desc.full_name, file_name) - self._enum_descriptors[enum_desc.full_name] = enum_desc - - # Top enum values need to be indexed. - # Count the number of dots to see whether the enum is toplevel or nested - # in a message. We cannot use enum_desc.containing_type at this stage. - if enum_desc.file.package: - top_level = (enum_desc.full_name.count('.') - - enum_desc.file.package.count('.') == 1) - else: - top_level = enum_desc.full_name.count('.') == 0 - if top_level: - file_name = enum_desc.file.name - package = enum_desc.file.package - for enum_value in enum_desc.values: - full_name = _NormalizeFullyQualifiedName( - '.'.join((package, enum_value.name))) - self._CheckConflictRegister(enum_value, full_name, file_name) - self._top_enum_values[full_name] = enum_value - self._AddFileDescriptor(enum_desc.file) - - # Add ServiceDescriptor to descriptor pool is deprecated. Please use Add() - # or AddSerializedFile() to add a FileDescriptorProto instead. - @_Deprecated - def AddServiceDescriptor(self, service_desc): - self._AddServiceDescriptor(service_desc) - - # Never call this method. It is for internal usage only. - def _AddServiceDescriptor(self, service_desc): - """Adds a ServiceDescriptor to the pool. - - Args: - service_desc: A ServiceDescriptor. - """ - - if not isinstance(service_desc, descriptor.ServiceDescriptor): - raise TypeError('Expected instance of descriptor.ServiceDescriptor.') - - self._CheckConflictRegister(service_desc, service_desc.full_name, - service_desc.file.name) - self._service_descriptors[service_desc.full_name] = service_desc - - # Add ExtensionDescriptor to descriptor pool is deprecated. Please use Add() - # or AddSerializedFile() to add a FileDescriptorProto instead. - @_Deprecated - def AddExtensionDescriptor(self, extension): - self._AddExtensionDescriptor(extension) - - # Never call this method. It is for internal usage only. - def _AddExtensionDescriptor(self, extension): - """Adds a FieldDescriptor describing an extension to the pool. - - Args: - extension: A FieldDescriptor. - - Raises: - AssertionError: when another extension with the same number extends the - same message. - TypeError: when the specified extension is not a - descriptor.FieldDescriptor. - """ - if not (isinstance(extension, descriptor.FieldDescriptor) and - extension.is_extension): - raise TypeError('Expected an extension descriptor.') - - if extension.extension_scope is None: - self._CheckConflictRegister( - extension, extension.full_name, extension.file.name) - self._toplevel_extensions[extension.full_name] = extension - - try: - existing_desc = self._extensions_by_number[ - extension.containing_type][extension.number] - except KeyError: - pass - else: - if extension is not existing_desc: - raise AssertionError( - 'Extensions "%s" and "%s" both try to extend message type "%s" ' - 'with field number %d.' % - (extension.full_name, existing_desc.full_name, - extension.containing_type.full_name, extension.number)) - - self._extensions_by_number[extension.containing_type][ - extension.number] = extension - self._extensions_by_name[extension.containing_type][ - extension.full_name] = extension - - # Also register MessageSet extensions with the type name. - if _IsMessageSetExtension(extension): - self._extensions_by_name[extension.containing_type][ - extension.message_type.full_name] = extension - - @_Deprecated - def AddFileDescriptor(self, file_desc): - self._InternalAddFileDescriptor(file_desc) - - # Never call this method. It is for internal usage only. - def _InternalAddFileDescriptor(self, file_desc): - """Adds a FileDescriptor to the pool, non-recursively. - - If the FileDescriptor contains messages or enums, the caller must explicitly - register them. - - Args: - file_desc: A FileDescriptor. - """ - - self._AddFileDescriptor(file_desc) - - def _AddFileDescriptor(self, file_desc): - """Adds a FileDescriptor to the pool, non-recursively. - - If the FileDescriptor contains messages or enums, the caller must explicitly - register them. - - Args: - file_desc: A FileDescriptor. - """ - - if not isinstance(file_desc, descriptor.FileDescriptor): - raise TypeError('Expected instance of descriptor.FileDescriptor.') - self._file_descriptors[file_desc.name] = file_desc - - def FindFileByName(self, file_name): - """Gets a FileDescriptor by file name. - - Args: - file_name (str): The path to the file to get a descriptor for. - - Returns: - FileDescriptor: The descriptor for the named file. - - Raises: - KeyError: if the file cannot be found in the pool. - """ - - try: - return self._file_descriptors[file_name] - except KeyError: - pass - - try: - file_proto = self._internal_db.FindFileByName(file_name) - except KeyError as error: - if self._descriptor_db: - file_proto = self._descriptor_db.FindFileByName(file_name) - else: - raise error - if not file_proto: - raise KeyError('Cannot find a file named %s' % file_name) - return self._ConvertFileProtoToFileDescriptor(file_proto) - - def FindFileContainingSymbol(self, symbol): - """Gets the FileDescriptor for the file containing the specified symbol. - - Args: - symbol (str): The name of the symbol to search for. - - Returns: - FileDescriptor: Descriptor for the file that contains the specified - symbol. - - Raises: - KeyError: if the file cannot be found in the pool. - """ - - symbol = _NormalizeFullyQualifiedName(symbol) - try: - return self._InternalFindFileContainingSymbol(symbol) - except KeyError: - pass - - try: - # Try fallback database. Build and find again if possible. - self._FindFileContainingSymbolInDb(symbol) - return self._InternalFindFileContainingSymbol(symbol) - except KeyError: - raise KeyError('Cannot find a file containing %s' % symbol) - - def _InternalFindFileContainingSymbol(self, symbol): - """Gets the already built FileDescriptor containing the specified symbol. - - Args: - symbol (str): The name of the symbol to search for. - - Returns: - FileDescriptor: Descriptor for the file that contains the specified - symbol. - - Raises: - KeyError: if the file cannot be found in the pool. - """ - try: - return self._descriptors[symbol].file - except KeyError: - pass - - try: - return self._enum_descriptors[symbol].file - except KeyError: - pass - - try: - return self._service_descriptors[symbol].file - except KeyError: - pass - - try: - return self._top_enum_values[symbol].type.file - except KeyError: - pass - - try: - return self._toplevel_extensions[symbol].file - except KeyError: - pass - - # Try fields, enum values and nested extensions inside a message. - top_name, _, sub_name = symbol.rpartition('.') - try: - message = self.FindMessageTypeByName(top_name) - assert (sub_name in message.extensions_by_name or - sub_name in message.fields_by_name or - sub_name in message.enum_values_by_name) - return message.file - except (KeyError, AssertionError): - raise KeyError('Cannot find a file containing %s' % symbol) - - def FindMessageTypeByName(self, full_name): - """Loads the named descriptor from the pool. - - Args: - full_name (str): The full name of the descriptor to load. - - Returns: - Descriptor: The descriptor for the named type. - - Raises: - KeyError: if the message cannot be found in the pool. - """ - - full_name = _NormalizeFullyQualifiedName(full_name) - if full_name not in self._descriptors: - self._FindFileContainingSymbolInDb(full_name) - return self._descriptors[full_name] - - def FindEnumTypeByName(self, full_name): - """Loads the named enum descriptor from the pool. - - Args: - full_name (str): The full name of the enum descriptor to load. - - Returns: - EnumDescriptor: The enum descriptor for the named type. - - Raises: - KeyError: if the enum cannot be found in the pool. - """ - - full_name = _NormalizeFullyQualifiedName(full_name) - if full_name not in self._enum_descriptors: - self._FindFileContainingSymbolInDb(full_name) - return self._enum_descriptors[full_name] - - def FindFieldByName(self, full_name): - """Loads the named field descriptor from the pool. - - Args: - full_name (str): The full name of the field descriptor to load. - - Returns: - FieldDescriptor: The field descriptor for the named field. - - Raises: - KeyError: if the field cannot be found in the pool. - """ - full_name = _NormalizeFullyQualifiedName(full_name) - message_name, _, field_name = full_name.rpartition('.') - message_descriptor = self.FindMessageTypeByName(message_name) - return message_descriptor.fields_by_name[field_name] - - def FindOneofByName(self, full_name): - """Loads the named oneof descriptor from the pool. - - Args: - full_name (str): The full name of the oneof descriptor to load. - - Returns: - OneofDescriptor: The oneof descriptor for the named oneof. - - Raises: - KeyError: if the oneof cannot be found in the pool. - """ - full_name = _NormalizeFullyQualifiedName(full_name) - message_name, _, oneof_name = full_name.rpartition('.') - message_descriptor = self.FindMessageTypeByName(message_name) - return message_descriptor.oneofs_by_name[oneof_name] - - def FindExtensionByName(self, full_name): - """Loads the named extension descriptor from the pool. - - Args: - full_name (str): The full name of the extension descriptor to load. - - Returns: - FieldDescriptor: The field descriptor for the named extension. - - Raises: - KeyError: if the extension cannot be found in the pool. - """ - full_name = _NormalizeFullyQualifiedName(full_name) - try: - # The proto compiler does not give any link between the FileDescriptor - # and top-level extensions unless the FileDescriptorProto is added to - # the DescriptorDatabase, but this can impact memory usage. - # So we registered these extensions by name explicitly. - return self._toplevel_extensions[full_name] - except KeyError: - pass - message_name, _, extension_name = full_name.rpartition('.') - try: - # Most extensions are nested inside a message. - scope = self.FindMessageTypeByName(message_name) - except KeyError: - # Some extensions are defined at file scope. - scope = self._FindFileContainingSymbolInDb(full_name) - return scope.extensions_by_name[extension_name] - - def FindExtensionByNumber(self, message_descriptor, number): - """Gets the extension of the specified message with the specified number. - - Extensions have to be registered to this pool by calling :func:`Add` or - :func:`AddExtensionDescriptor`. - - Args: - message_descriptor (Descriptor): descriptor of the extended message. - number (int): Number of the extension field. - - Returns: - FieldDescriptor: The descriptor for the extension. - - Raises: - KeyError: when no extension with the given number is known for the - specified message. - """ - try: - return self._extensions_by_number[message_descriptor][number] - except KeyError: - self._TryLoadExtensionFromDB(message_descriptor, number) - return self._extensions_by_number[message_descriptor][number] - - def FindAllExtensions(self, message_descriptor): - """Gets all the known extensions of a given message. - - Extensions have to be registered to this pool by build related - :func:`Add` or :func:`AddExtensionDescriptor`. - - Args: - message_descriptor (Descriptor): Descriptor of the extended message. - - Returns: - list[FieldDescriptor]: Field descriptors describing the extensions. - """ - # Fallback to descriptor db if FindAllExtensionNumbers is provided. - if self._descriptor_db and hasattr( - self._descriptor_db, 'FindAllExtensionNumbers'): - full_name = message_descriptor.full_name - all_numbers = self._descriptor_db.FindAllExtensionNumbers(full_name) - for number in all_numbers: - if number in self._extensions_by_number[message_descriptor]: - continue - self._TryLoadExtensionFromDB(message_descriptor, number) - - return list(self._extensions_by_number[message_descriptor].values()) - - def _TryLoadExtensionFromDB(self, message_descriptor, number): - """Try to Load extensions from descriptor db. - - Args: - message_descriptor: descriptor of the extended message. - number: the extension number that needs to be loaded. - """ - if not self._descriptor_db: - return - # Only supported when FindFileContainingExtension is provided. - if not hasattr( - self._descriptor_db, 'FindFileContainingExtension'): - return - - full_name = message_descriptor.full_name - file_proto = self._descriptor_db.FindFileContainingExtension( - full_name, number) - - if file_proto is None: - return - - try: - self._ConvertFileProtoToFileDescriptor(file_proto) - except: - warn_msg = ('Unable to load proto file %s for extension number %d.' % - (file_proto.name, number)) - warnings.warn(warn_msg, RuntimeWarning) - - def FindServiceByName(self, full_name): - """Loads the named service descriptor from the pool. - - Args: - full_name (str): The full name of the service descriptor to load. - - Returns: - ServiceDescriptor: The service descriptor for the named service. - - Raises: - KeyError: if the service cannot be found in the pool. - """ - full_name = _NormalizeFullyQualifiedName(full_name) - if full_name not in self._service_descriptors: - self._FindFileContainingSymbolInDb(full_name) - return self._service_descriptors[full_name] - - def FindMethodByName(self, full_name): - """Loads the named service method descriptor from the pool. - - Args: - full_name (str): The full name of the method descriptor to load. - - Returns: - MethodDescriptor: The method descriptor for the service method. - - Raises: - KeyError: if the method cannot be found in the pool. - """ - full_name = _NormalizeFullyQualifiedName(full_name) - service_name, _, method_name = full_name.rpartition('.') - service_descriptor = self.FindServiceByName(service_name) - return service_descriptor.methods_by_name[method_name] - - def _FindFileContainingSymbolInDb(self, symbol): - """Finds the file in descriptor DB containing the specified symbol. - - Args: - symbol (str): The name of the symbol to search for. - - Returns: - FileDescriptor: The file that contains the specified symbol. - - Raises: - KeyError: if the file cannot be found in the descriptor database. - """ - try: - file_proto = self._internal_db.FindFileContainingSymbol(symbol) - except KeyError as error: - if self._descriptor_db: - file_proto = self._descriptor_db.FindFileContainingSymbol(symbol) - else: - raise error - if not file_proto: - raise KeyError('Cannot find a file containing %s' % symbol) - return self._ConvertFileProtoToFileDescriptor(file_proto) - - def _ConvertFileProtoToFileDescriptor(self, file_proto): - """Creates a FileDescriptor from a proto or returns a cached copy. - - This method also has the side effect of loading all the symbols found in - the file into the appropriate dictionaries in the pool. - - Args: - file_proto: The proto to convert. - - Returns: - A FileDescriptor matching the passed in proto. - """ - if file_proto.name not in self._file_descriptors: - built_deps = list(self._GetDeps(file_proto.dependency)) - direct_deps = [self.FindFileByName(n) for n in file_proto.dependency] - public_deps = [direct_deps[i] for i in file_proto.public_dependency] - - file_descriptor = descriptor.FileDescriptor( - pool=self, - name=file_proto.name, - package=file_proto.package, - syntax=file_proto.syntax, - options=_OptionsOrNone(file_proto), - serialized_pb=file_proto.SerializeToString(), - dependencies=direct_deps, - public_dependencies=public_deps, - # pylint: disable=protected-access - create_key=descriptor._internal_create_key) - scope = {} - - # This loop extracts all the message and enum types from all the - # dependencies of the file_proto. This is necessary to create the - # scope of available message types when defining the passed in - # file proto. - for dependency in built_deps: - scope.update(self._ExtractSymbols( - dependency.message_types_by_name.values())) - scope.update((_PrefixWithDot(enum.full_name), enum) - for enum in dependency.enum_types_by_name.values()) - - for message_type in file_proto.message_type: - message_desc = self._ConvertMessageDescriptor( - message_type, file_proto.package, file_descriptor, scope, - file_proto.syntax) - file_descriptor.message_types_by_name[message_desc.name] = ( - message_desc) - - for enum_type in file_proto.enum_type: - file_descriptor.enum_types_by_name[enum_type.name] = ( - self._ConvertEnumDescriptor(enum_type, file_proto.package, - file_descriptor, None, scope, True)) - - for index, extension_proto in enumerate(file_proto.extension): - extension_desc = self._MakeFieldDescriptor( - extension_proto, file_proto.package, index, file_descriptor, - is_extension=True) - extension_desc.containing_type = self._GetTypeFromScope( - file_descriptor.package, extension_proto.extendee, scope) - self._SetFieldType(extension_proto, extension_desc, - file_descriptor.package, scope) - file_descriptor.extensions_by_name[extension_desc.name] = ( - extension_desc) - - for desc_proto in file_proto.message_type: - self._SetAllFieldTypes(file_proto.package, desc_proto, scope) - - if file_proto.package: - desc_proto_prefix = _PrefixWithDot(file_proto.package) - else: - desc_proto_prefix = '' - - for desc_proto in file_proto.message_type: - desc = self._GetTypeFromScope( - desc_proto_prefix, desc_proto.name, scope) - file_descriptor.message_types_by_name[desc_proto.name] = desc - - for index, service_proto in enumerate(file_proto.service): - file_descriptor.services_by_name[service_proto.name] = ( - self._MakeServiceDescriptor(service_proto, index, scope, - file_proto.package, file_descriptor)) - - self._file_descriptors[file_proto.name] = file_descriptor - - # Add extensions to the pool - file_desc = self._file_descriptors[file_proto.name] - for extension in file_desc.extensions_by_name.values(): - self._AddExtensionDescriptor(extension) - for message_type in file_desc.message_types_by_name.values(): - for extension in message_type.extensions: - self._AddExtensionDescriptor(extension) - - return file_desc - - def _ConvertMessageDescriptor(self, desc_proto, package=None, file_desc=None, - scope=None, syntax=None): - """Adds the proto to the pool in the specified package. - - Args: - desc_proto: The descriptor_pb2.DescriptorProto protobuf message. - package: The package the proto should be located in. - file_desc: The file containing this message. - scope: Dict mapping short and full symbols to message and enum types. - syntax: string indicating syntax of the file ("proto2" or "proto3") - - Returns: - The added descriptor. - """ - - if package: - desc_name = '.'.join((package, desc_proto.name)) - else: - desc_name = desc_proto.name - - if file_desc is None: - file_name = None - else: - file_name = file_desc.name - - if scope is None: - scope = {} - - nested = [ - self._ConvertMessageDescriptor( - nested, desc_name, file_desc, scope, syntax) - for nested in desc_proto.nested_type] - enums = [ - self._ConvertEnumDescriptor(enum, desc_name, file_desc, None, - scope, False) - for enum in desc_proto.enum_type] - fields = [self._MakeFieldDescriptor(field, desc_name, index, file_desc) - for index, field in enumerate(desc_proto.field)] - extensions = [ - self._MakeFieldDescriptor(extension, desc_name, index, file_desc, - is_extension=True) - for index, extension in enumerate(desc_proto.extension)] - oneofs = [ - # pylint: disable=g-complex-comprehension - descriptor.OneofDescriptor( - desc.name, - '.'.join((desc_name, desc.name)), - index, - None, - [], - _OptionsOrNone(desc), - # pylint: disable=protected-access - create_key=descriptor._internal_create_key) - for index, desc in enumerate(desc_proto.oneof_decl) - ] - extension_ranges = [(r.start, r.end) for r in desc_proto.extension_range] - if extension_ranges: - is_extendable = True - else: - is_extendable = False - desc = descriptor.Descriptor( - name=desc_proto.name, - full_name=desc_name, - filename=file_name, - containing_type=None, - fields=fields, - oneofs=oneofs, - nested_types=nested, - enum_types=enums, - extensions=extensions, - options=_OptionsOrNone(desc_proto), - is_extendable=is_extendable, - extension_ranges=extension_ranges, - file=file_desc, - serialized_start=None, - serialized_end=None, - syntax=syntax, - # pylint: disable=protected-access - create_key=descriptor._internal_create_key) - for nested in desc.nested_types: - nested.containing_type = desc - for enum in desc.enum_types: - enum.containing_type = desc - for field_index, field_desc in enumerate(desc_proto.field): - if field_desc.HasField('oneof_index'): - oneof_index = field_desc.oneof_index - oneofs[oneof_index].fields.append(fields[field_index]) - fields[field_index].containing_oneof = oneofs[oneof_index] - - scope[_PrefixWithDot(desc_name)] = desc - self._CheckConflictRegister(desc, desc.full_name, desc.file.name) - self._descriptors[desc_name] = desc - return desc - - def _ConvertEnumDescriptor(self, enum_proto, package=None, file_desc=None, - containing_type=None, scope=None, top_level=False): - """Make a protobuf EnumDescriptor given an EnumDescriptorProto protobuf. - - Args: - enum_proto: The descriptor_pb2.EnumDescriptorProto protobuf message. - package: Optional package name for the new message EnumDescriptor. - file_desc: The file containing the enum descriptor. - containing_type: The type containing this enum. - scope: Scope containing available types. - top_level: If True, the enum is a top level symbol. If False, the enum - is defined inside a message. - - Returns: - The added descriptor - """ - - if package: - enum_name = '.'.join((package, enum_proto.name)) - else: - enum_name = enum_proto.name - - if file_desc is None: - file_name = None - else: - file_name = file_desc.name - - values = [self._MakeEnumValueDescriptor(value, index) - for index, value in enumerate(enum_proto.value)] - desc = descriptor.EnumDescriptor(name=enum_proto.name, - full_name=enum_name, - filename=file_name, - file=file_desc, - values=values, - containing_type=containing_type, - options=_OptionsOrNone(enum_proto), - # pylint: disable=protected-access - create_key=descriptor._internal_create_key) - scope['.%s' % enum_name] = desc - self._CheckConflictRegister(desc, desc.full_name, desc.file.name) - self._enum_descriptors[enum_name] = desc - - # Add top level enum values. - if top_level: - for value in values: - full_name = _NormalizeFullyQualifiedName( - '.'.join((package, value.name))) - self._CheckConflictRegister(value, full_name, file_name) - self._top_enum_values[full_name] = value - - return desc - - def _MakeFieldDescriptor(self, field_proto, message_name, index, - file_desc, is_extension=False): - """Creates a field descriptor from a FieldDescriptorProto. - - For message and enum type fields, this method will do a look up - in the pool for the appropriate descriptor for that type. If it - is unavailable, it will fall back to the _source function to - create it. If this type is still unavailable, construction will - fail. - - Args: - field_proto: The proto describing the field. - message_name: The name of the containing message. - index: Index of the field - file_desc: The file containing the field descriptor. - is_extension: Indication that this field is for an extension. - - Returns: - An initialized FieldDescriptor object - """ - - if message_name: - full_name = '.'.join((message_name, field_proto.name)) - else: - full_name = field_proto.name - - if field_proto.json_name: - json_name = field_proto.json_name - else: - json_name = None - - return descriptor.FieldDescriptor( - name=field_proto.name, - full_name=full_name, - index=index, - number=field_proto.number, - type=field_proto.type, - cpp_type=None, - message_type=None, - enum_type=None, - containing_type=None, - label=field_proto.label, - has_default_value=False, - default_value=None, - is_extension=is_extension, - extension_scope=None, - options=_OptionsOrNone(field_proto), - json_name=json_name, - file=file_desc, - # pylint: disable=protected-access - create_key=descriptor._internal_create_key) - - def _SetAllFieldTypes(self, package, desc_proto, scope): - """Sets all the descriptor's fields's types. - - This method also sets the containing types on any extensions. - - Args: - package: The current package of desc_proto. - desc_proto: The message descriptor to update. - scope: Enclosing scope of available types. - """ - - package = _PrefixWithDot(package) - - main_desc = self._GetTypeFromScope(package, desc_proto.name, scope) - - if package == '.': - nested_package = _PrefixWithDot(desc_proto.name) - else: - nested_package = '.'.join([package, desc_proto.name]) - - for field_proto, field_desc in zip(desc_proto.field, main_desc.fields): - self._SetFieldType(field_proto, field_desc, nested_package, scope) - - for extension_proto, extension_desc in ( - zip(desc_proto.extension, main_desc.extensions)): - extension_desc.containing_type = self._GetTypeFromScope( - nested_package, extension_proto.extendee, scope) - self._SetFieldType(extension_proto, extension_desc, nested_package, scope) - - for nested_type in desc_proto.nested_type: - self._SetAllFieldTypes(nested_package, nested_type, scope) - - def _SetFieldType(self, field_proto, field_desc, package, scope): - """Sets the field's type, cpp_type, message_type and enum_type. - - Args: - field_proto: Data about the field in proto format. - field_desc: The descriptor to modify. - package: The package the field's container is in. - scope: Enclosing scope of available types. - """ - if field_proto.type_name: - desc = self._GetTypeFromScope(package, field_proto.type_name, scope) - else: - desc = None - - if not field_proto.HasField('type'): - if isinstance(desc, descriptor.Descriptor): - field_proto.type = descriptor.FieldDescriptor.TYPE_MESSAGE - else: - field_proto.type = descriptor.FieldDescriptor.TYPE_ENUM - - field_desc.cpp_type = descriptor.FieldDescriptor.ProtoTypeToCppProtoType( - field_proto.type) - - if (field_proto.type == descriptor.FieldDescriptor.TYPE_MESSAGE - or field_proto.type == descriptor.FieldDescriptor.TYPE_GROUP): - field_desc.message_type = desc - - if field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: - field_desc.enum_type = desc - - if field_proto.label == descriptor.FieldDescriptor.LABEL_REPEATED: - field_desc.has_default_value = False - field_desc.default_value = [] - elif field_proto.HasField('default_value'): - field_desc.has_default_value = True - if (field_proto.type == descriptor.FieldDescriptor.TYPE_DOUBLE or - field_proto.type == descriptor.FieldDescriptor.TYPE_FLOAT): - field_desc.default_value = float(field_proto.default_value) - elif field_proto.type == descriptor.FieldDescriptor.TYPE_STRING: - field_desc.default_value = field_proto.default_value - elif field_proto.type == descriptor.FieldDescriptor.TYPE_BOOL: - field_desc.default_value = field_proto.default_value.lower() == 'true' - elif field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: - field_desc.default_value = field_desc.enum_type.values_by_name[ - field_proto.default_value].number - elif field_proto.type == descriptor.FieldDescriptor.TYPE_BYTES: - field_desc.default_value = text_encoding.CUnescape( - field_proto.default_value) - elif field_proto.type == descriptor.FieldDescriptor.TYPE_MESSAGE: - field_desc.default_value = None - else: - # All other types are of the "int" type. - field_desc.default_value = int(field_proto.default_value) - else: - field_desc.has_default_value = False - if (field_proto.type == descriptor.FieldDescriptor.TYPE_DOUBLE or - field_proto.type == descriptor.FieldDescriptor.TYPE_FLOAT): - field_desc.default_value = 0.0 - elif field_proto.type == descriptor.FieldDescriptor.TYPE_STRING: - field_desc.default_value = u'' - elif field_proto.type == descriptor.FieldDescriptor.TYPE_BOOL: - field_desc.default_value = False - elif field_proto.type == descriptor.FieldDescriptor.TYPE_ENUM: - field_desc.default_value = field_desc.enum_type.values[0].number - elif field_proto.type == descriptor.FieldDescriptor.TYPE_BYTES: - field_desc.default_value = b'' - elif field_proto.type == descriptor.FieldDescriptor.TYPE_MESSAGE: - field_desc.default_value = None - elif field_proto.type == descriptor.FieldDescriptor.TYPE_GROUP: - field_desc.default_value = None - else: - # All other types are of the "int" type. - field_desc.default_value = 0 - - field_desc.type = field_proto.type - - def _MakeEnumValueDescriptor(self, value_proto, index): - """Creates a enum value descriptor object from a enum value proto. - - Args: - value_proto: The proto describing the enum value. - index: The index of the enum value. - - Returns: - An initialized EnumValueDescriptor object. - """ - - return descriptor.EnumValueDescriptor( - name=value_proto.name, - index=index, - number=value_proto.number, - options=_OptionsOrNone(value_proto), - type=None, - # pylint: disable=protected-access - create_key=descriptor._internal_create_key) - - def _MakeServiceDescriptor(self, service_proto, service_index, scope, - package, file_desc): - """Make a protobuf ServiceDescriptor given a ServiceDescriptorProto. - - Args: - service_proto: The descriptor_pb2.ServiceDescriptorProto protobuf message. - service_index: The index of the service in the File. - scope: Dict mapping short and full symbols to message and enum types. - package: Optional package name for the new message EnumDescriptor. - file_desc: The file containing the service descriptor. - - Returns: - The added descriptor. - """ - - if package: - service_name = '.'.join((package, service_proto.name)) - else: - service_name = service_proto.name - - methods = [self._MakeMethodDescriptor(method_proto, service_name, package, - scope, index) - for index, method_proto in enumerate(service_proto.method)] - desc = descriptor.ServiceDescriptor( - name=service_proto.name, - full_name=service_name, - index=service_index, - methods=methods, - options=_OptionsOrNone(service_proto), - file=file_desc, - # pylint: disable=protected-access - create_key=descriptor._internal_create_key) - self._CheckConflictRegister(desc, desc.full_name, desc.file.name) - self._service_descriptors[service_name] = desc - return desc - - def _MakeMethodDescriptor(self, method_proto, service_name, package, scope, - index): - """Creates a method descriptor from a MethodDescriptorProto. - - Args: - method_proto: The proto describing the method. - service_name: The name of the containing service. - package: Optional package name to look up for types. - scope: Scope containing available types. - index: Index of the method in the service. - - Returns: - An initialized MethodDescriptor object. - """ - full_name = '.'.join((service_name, method_proto.name)) - input_type = self._GetTypeFromScope( - package, method_proto.input_type, scope) - output_type = self._GetTypeFromScope( - package, method_proto.output_type, scope) - return descriptor.MethodDescriptor( - name=method_proto.name, - full_name=full_name, - index=index, - containing_service=None, - input_type=input_type, - output_type=output_type, - client_streaming=method_proto.client_streaming, - server_streaming=method_proto.server_streaming, - options=_OptionsOrNone(method_proto), - # pylint: disable=protected-access - create_key=descriptor._internal_create_key) - - def _ExtractSymbols(self, descriptors): - """Pulls out all the symbols from descriptor protos. - - Args: - descriptors: The messages to extract descriptors from. - Yields: - A two element tuple of the type name and descriptor object. - """ - - for desc in descriptors: - yield (_PrefixWithDot(desc.full_name), desc) - for symbol in self._ExtractSymbols(desc.nested_types): - yield symbol - for enum in desc.enum_types: - yield (_PrefixWithDot(enum.full_name), enum) - - def _GetDeps(self, dependencies, visited=None): - """Recursively finds dependencies for file protos. - - Args: - dependencies: The names of the files being depended on. - visited: The names of files already found. - - Yields: - Each direct and indirect dependency. - """ - - visited = visited or set() - for dependency in dependencies: - if dependency not in visited: - visited.add(dependency) - dep_desc = self.FindFileByName(dependency) - yield dep_desc - public_files = [d.name for d in dep_desc.public_dependencies] - yield from self._GetDeps(public_files, visited) - - def _GetTypeFromScope(self, package, type_name, scope): - """Finds a given type name in the current scope. - - Args: - package: The package the proto should be located in. - type_name: The name of the type to be found in the scope. - scope: Dict mapping short and full symbols to message and enum types. - - Returns: - The descriptor for the requested type. - """ - if type_name not in scope: - components = _PrefixWithDot(package).split('.') - while components: - possible_match = '.'.join(components + [type_name]) - if possible_match in scope: - type_name = possible_match - break - else: - components.pop(-1) - return scope[type_name] - - -def _PrefixWithDot(name): - return name if name.startswith('.') else '.%s' % name - - -if _USE_C_DESCRIPTORS: - # TODO(amauryfa): This pool could be constructed from Python code, when we - # support a flag like 'use_cpp_generated_pool=True'. - # pylint: disable=protected-access - _DEFAULT = descriptor._message.default_pool -else: - _DEFAULT = DescriptorPool() - - -def Default(): - return _DEFAULT diff --git a/script.module.protobuf/resources/lib/google/protobuf/duration_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/duration_pb2.py deleted file mode 100644 index 34712622d..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/duration_pb2.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/duration.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1egoogle/protobuf/duration.proto\x12\x0fgoogle.protobuf\":\n\x08\x44uration\x12\x18\n\x07seconds\x18\x01 \x01(\x03R\x07seconds\x12\x14\n\x05nanos\x18\x02 \x01(\x05R\x05nanosB\x83\x01\n\x13\x63om.google.protobufB\rDurationProtoP\x01Z1google.golang.org/protobuf/types/known/durationpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.duration_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\rDurationProtoP\001Z1google.golang.org/protobuf/types/known/durationpb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_DURATION']._serialized_start=51 - _globals['_DURATION']._serialized_end=109 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/empty_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/empty_pb2.py deleted file mode 100644 index cbecdfe26..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/empty_pb2.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/empty.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bgoogle/protobuf/empty.proto\x12\x0fgoogle.protobuf\"\x07\n\x05\x45mptyB}\n\x13\x63om.google.protobufB\nEmptyProtoP\x01Z.google.golang.org/protobuf/types/known/emptypb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.empty_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\nEmptyProtoP\001Z.google.golang.org/protobuf/types/known/emptypb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_EMPTY']._serialized_start=48 - _globals['_EMPTY']._serialized_end=55 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/field_mask_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/field_mask_pb2.py deleted file mode 100644 index f5c1e45d4..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/field_mask_pb2.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/field_mask.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n google/protobuf/field_mask.proto\x12\x0fgoogle.protobuf\"!\n\tFieldMask\x12\x14\n\x05paths\x18\x01 \x03(\tR\x05pathsB\x85\x01\n\x13\x63om.google.protobufB\x0e\x46ieldMaskProtoP\x01Z2google.golang.org/protobuf/types/known/fieldmaskpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.field_mask_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\016FieldMaskProtoP\001Z2google.golang.org/protobuf/types/known/fieldmaskpb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_FIELDMASK']._serialized_start=53 - _globals['_FIELDMASK']._serialized_end=86 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/__init__.py b/script.module.protobuf/resources/lib/google/protobuf/internal/__init__.py deleted file mode 100644 index 7d2e571a1..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/_parameterized.py b/script.module.protobuf/resources/lib/google/protobuf/internal/_parameterized.py deleted file mode 100644 index 2f4a3b6b7..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/_parameterized.py +++ /dev/null @@ -1,443 +0,0 @@ -#! /usr/bin/env python -# -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Adds support for parameterized tests to Python's unittest TestCase class. - -A parameterized test is a method in a test case that is invoked with different -argument tuples. - -A simple example: - - class AdditionExample(_parameterized.TestCase): - @_parameterized.parameters( - (1, 2, 3), - (4, 5, 9), - (1, 1, 3)) - def testAddition(self, op1, op2, result): - self.assertEqual(result, op1 + op2) - - -Each invocation is a separate test case and properly isolated just -like a normal test method, with its own setUp/tearDown cycle. In the -example above, there are three separate testcases, one of which will -fail due to an assertion error (1 + 1 != 3). - -Parameters for individual test cases can be tuples (with positional parameters) -or dictionaries (with named parameters): - - class AdditionExample(_parameterized.TestCase): - @_parameterized.parameters( - {'op1': 1, 'op2': 2, 'result': 3}, - {'op1': 4, 'op2': 5, 'result': 9}, - ) - def testAddition(self, op1, op2, result): - self.assertEqual(result, op1 + op2) - -If a parameterized test fails, the error message will show the -original test name (which is modified internally) and the arguments -for the specific invocation, which are part of the string returned by -the shortDescription() method on test cases. - -The id method of the test, used internally by the unittest framework, -is also modified to show the arguments. To make sure that test names -stay the same across several invocations, object representations like - - >>> class Foo(object): - ... pass - >>> repr(Foo()) - '<__main__.Foo object at 0x23d8610>' - -are turned into '<__main__.Foo>'. For even more descriptive names, -especially in test logs, you can use the named_parameters decorator. In -this case, only tuples are supported, and the first parameters has to -be a string (or an object that returns an apt name when converted via -str()): - - class NamedExample(_parameterized.TestCase): - @_parameterized.named_parameters( - ('Normal', 'aa', 'aaa', True), - ('EmptyPrefix', '', 'abc', True), - ('BothEmpty', '', '', True)) - def testStartsWith(self, prefix, string, result): - self.assertEqual(result, strings.startswith(prefix)) - -Named tests also have the benefit that they can be run individually -from the command line: - - $ testmodule.py NamedExample.testStartsWithNormal - . - -------------------------------------------------------------------- - Ran 1 test in 0.000s - - OK - -Parameterized Classes -===================== -If invocation arguments are shared across test methods in a single -TestCase class, instead of decorating all test methods -individually, the class itself can be decorated: - - @_parameterized.parameters( - (1, 2, 3) - (4, 5, 9)) - class ArithmeticTest(_parameterized.TestCase): - def testAdd(self, arg1, arg2, result): - self.assertEqual(arg1 + arg2, result) - - def testSubtract(self, arg2, arg2, result): - self.assertEqual(result - arg1, arg2) - -Inputs from Iterables -===================== -If parameters should be shared across several test cases, or are dynamically -created from other sources, a single non-tuple iterable can be passed into -the decorator. This iterable will be used to obtain the test cases: - - class AdditionExample(_parameterized.TestCase): - @_parameterized.parameters( - c.op1, c.op2, c.result for c in testcases - ) - def testAddition(self, op1, op2, result): - self.assertEqual(result, op1 + op2) - - -Single-Argument Test Methods -============================ -If a test method takes only one argument, the single argument does not need to -be wrapped into a tuple: - - class NegativeNumberExample(_parameterized.TestCase): - @_parameterized.parameters( - -1, -3, -4, -5 - ) - def testIsNegative(self, arg): - self.assertTrue(IsNegative(arg)) -""" - -__author__ = 'tmarek@google.com (Torsten Marek)' - -import functools -import re -import types -import unittest -import uuid - -try: - # Since python 3 - import collections.abc as collections_abc -except ImportError: - # Won't work after python 3.8 - import collections as collections_abc - -ADDR_RE = re.compile(r'\<([a-zA-Z0-9_\-\.]+) object at 0x[a-fA-F0-9]+\>') -_SEPARATOR = uuid.uuid1().hex -_FIRST_ARG = object() -_ARGUMENT_REPR = object() - - -def _CleanRepr(obj): - return ADDR_RE.sub(r'<\1>', repr(obj)) - - -# Helper function formerly from the unittest module, removed from it in -# Python 2.7. -def _StrClass(cls): - return '%s.%s' % (cls.__module__, cls.__name__) - - -def _NonStringIterable(obj): - return (isinstance(obj, collections_abc.Iterable) and - not isinstance(obj, str)) - - -def _FormatParameterList(testcase_params): - if isinstance(testcase_params, collections_abc.Mapping): - return ', '.join('%s=%s' % (argname, _CleanRepr(value)) - for argname, value in testcase_params.items()) - elif _NonStringIterable(testcase_params): - return ', '.join(map(_CleanRepr, testcase_params)) - else: - return _FormatParameterList((testcase_params,)) - - -class _ParameterizedTestIter(object): - """Callable and iterable class for producing new test cases.""" - - def __init__(self, test_method, testcases, naming_type): - """Returns concrete test functions for a test and a list of parameters. - - The naming_type is used to determine the name of the concrete - functions as reported by the unittest framework. If naming_type is - _FIRST_ARG, the testcases must be tuples, and the first element must - have a string representation that is a valid Python identifier. - - Args: - test_method: The decorated test method. - testcases: (list of tuple/dict) A list of parameter - tuples/dicts for individual test invocations. - naming_type: The test naming type, either _NAMED or _ARGUMENT_REPR. - """ - self._test_method = test_method - self.testcases = testcases - self._naming_type = naming_type - - def __call__(self, *args, **kwargs): - raise RuntimeError('You appear to be running a parameterized test case ' - 'without having inherited from parameterized.' - 'TestCase. This is bad because none of ' - 'your test cases are actually being run.') - - def __iter__(self): - test_method = self._test_method - naming_type = self._naming_type - - def MakeBoundParamTest(testcase_params): - @functools.wraps(test_method) - def BoundParamTest(self): - if isinstance(testcase_params, collections_abc.Mapping): - test_method(self, **testcase_params) - elif _NonStringIterable(testcase_params): - test_method(self, *testcase_params) - else: - test_method(self, testcase_params) - - if naming_type is _FIRST_ARG: - # Signal the metaclass that the name of the test function is unique - # and descriptive. - BoundParamTest.__x_use_name__ = True - BoundParamTest.__name__ += str(testcase_params[0]) - testcase_params = testcase_params[1:] - elif naming_type is _ARGUMENT_REPR: - # __x_extra_id__ is used to pass naming information to the __new__ - # method of TestGeneratorMetaclass. - # The metaclass will make sure to create a unique, but nondescriptive - # name for this test. - BoundParamTest.__x_extra_id__ = '(%s)' % ( - _FormatParameterList(testcase_params),) - else: - raise RuntimeError('%s is not a valid naming type.' % (naming_type,)) - - BoundParamTest.__doc__ = '%s(%s)' % ( - BoundParamTest.__name__, _FormatParameterList(testcase_params)) - if test_method.__doc__: - BoundParamTest.__doc__ += '\n%s' % (test_method.__doc__,) - return BoundParamTest - return (MakeBoundParamTest(c) for c in self.testcases) - - -def _IsSingletonList(testcases): - """True iff testcases contains only a single non-tuple element.""" - return len(testcases) == 1 and not isinstance(testcases[0], tuple) - - -def _ModifyClass(class_object, testcases, naming_type): - assert not getattr(class_object, '_id_suffix', None), ( - 'Cannot add parameters to %s,' - ' which already has parameterized methods.' % (class_object,)) - class_object._id_suffix = id_suffix = {} - # We change the size of __dict__ while we iterate over it, - # which Python 3.x will complain about, so use copy(). - for name, obj in class_object.__dict__.copy().items(): - if (name.startswith(unittest.TestLoader.testMethodPrefix) - and isinstance(obj, types.FunctionType)): - delattr(class_object, name) - methods = {} - _UpdateClassDictForParamTestCase( - methods, id_suffix, name, - _ParameterizedTestIter(obj, testcases, naming_type)) - for name, meth in methods.items(): - setattr(class_object, name, meth) - - -def _ParameterDecorator(naming_type, testcases): - """Implementation of the parameterization decorators. - - Args: - naming_type: The naming type. - testcases: Testcase parameters. - - Returns: - A function for modifying the decorated object. - """ - def _Apply(obj): - if isinstance(obj, type): - _ModifyClass( - obj, - list(testcases) if not isinstance(testcases, collections_abc.Sequence) - else testcases, - naming_type) - return obj - else: - return _ParameterizedTestIter(obj, testcases, naming_type) - - if _IsSingletonList(testcases): - assert _NonStringIterable(testcases[0]), ( - 'Single parameter argument must be a non-string iterable') - testcases = testcases[0] - - return _Apply - - -def parameters(*testcases): # pylint: disable=invalid-name - """A decorator for creating parameterized tests. - - See the module docstring for a usage example. - Args: - *testcases: Parameters for the decorated method, either a single - iterable, or a list of tuples/dicts/objects (for tests - with only one argument). - - Returns: - A test generator to be handled by TestGeneratorMetaclass. - """ - return _ParameterDecorator(_ARGUMENT_REPR, testcases) - - -def named_parameters(*testcases): # pylint: disable=invalid-name - """A decorator for creating parameterized tests. - - See the module docstring for a usage example. The first element of - each parameter tuple should be a string and will be appended to the - name of the test method. - - Args: - *testcases: Parameters for the decorated method, either a single - iterable, or a list of tuples. - - Returns: - A test generator to be handled by TestGeneratorMetaclass. - """ - return _ParameterDecorator(_FIRST_ARG, testcases) - - -class TestGeneratorMetaclass(type): - """Metaclass for test cases with test generators. - - A test generator is an iterable in a testcase that produces callables. These - callables must be single-argument methods. These methods are injected into - the class namespace and the original iterable is removed. If the name of the - iterable conforms to the test pattern, the injected methods will be picked - up as tests by the unittest framework. - - In general, it is supposed to be used in conjunction with the - parameters decorator. - """ - - def __new__(mcs, class_name, bases, dct): - dct['_id_suffix'] = id_suffix = {} - for name, obj in dct.copy().items(): - if (name.startswith(unittest.TestLoader.testMethodPrefix) and - _NonStringIterable(obj)): - iterator = iter(obj) - dct.pop(name) - _UpdateClassDictForParamTestCase(dct, id_suffix, name, iterator) - - return type.__new__(mcs, class_name, bases, dct) - - -def _UpdateClassDictForParamTestCase(dct, id_suffix, name, iterator): - """Adds individual test cases to a dictionary. - - Args: - dct: The target dictionary. - id_suffix: The dictionary for mapping names to test IDs. - name: The original name of the test case. - iterator: The iterator generating the individual test cases. - """ - for idx, func in enumerate(iterator): - assert callable(func), 'Test generators must yield callables, got %r' % ( - func,) - if getattr(func, '__x_use_name__', False): - new_name = func.__name__ - else: - new_name = '%s%s%d' % (name, _SEPARATOR, idx) - assert new_name not in dct, ( - 'Name of parameterized test case "%s" not unique' % (new_name,)) - dct[new_name] = func - id_suffix[new_name] = getattr(func, '__x_extra_id__', '') - - -class TestCase(unittest.TestCase, metaclass=TestGeneratorMetaclass): - """Base class for test cases using the parameters decorator.""" - - def _OriginalName(self): - return self._testMethodName.split(_SEPARATOR)[0] - - def __str__(self): - return '%s (%s)' % (self._OriginalName(), _StrClass(self.__class__)) - - def id(self): # pylint: disable=invalid-name - """Returns the descriptive ID of the test. - - This is used internally by the unittesting framework to get a name - for the test to be used in reports. - - Returns: - The test id. - """ - return '%s.%s%s' % (_StrClass(self.__class__), - self._OriginalName(), - self._id_suffix.get(self._testMethodName, '')) - - -def CoopTestCase(other_base_class): - """Returns a new base class with a cooperative metaclass base. - - This enables the TestCase to be used in combination - with other base classes that have custom metaclasses, such as - mox.MoxTestBase. - - Only works with metaclasses that do not override type.__new__. - - Example: - - import google3 - import mox - - from google.protobuf.internal import _parameterized - - class ExampleTest(parameterized.CoopTestCase(mox.MoxTestBase)): - ... - - Args: - other_base_class: (class) A test case base class. - - Returns: - A new class object. - """ - metaclass = type( - 'CoopMetaclass', - (other_base_class.__metaclass__, - TestGeneratorMetaclass), {}) - return metaclass( - 'CoopTestCase', - (other_base_class, TestCase), {}) diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/api_implementation.py b/script.module.protobuf/resources/lib/google/protobuf/internal/api_implementation.py deleted file mode 100644 index 7d20bd221..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/api_implementation.py +++ /dev/null @@ -1,163 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Determine which implementation of the protobuf API is used in this process. -""" - -import importlib -import os -import sys -import warnings - - -def _ApiVersionToImplementationType(api_version): - if api_version == 2: - return 'cpp' - if api_version == 1: - raise ValueError('api_version=1 is no longer supported.') - if api_version == 0: - return 'python' - return None - - -_implementation_type = None -try: - # pylint: disable=g-import-not-at-top - from google.protobuf.internal import _api_implementation - # The compile-time constants in the _api_implementation module can be used to - # switch to a certain implementation of the Python API at build time. - _implementation_type = _ApiVersionToImplementationType( - _api_implementation.api_version) -except ImportError: - pass # Unspecified by compiler flags. - - -def _CanImport(mod_name): - try: - mod = importlib.import_module(mod_name) - # Work around a known issue in the classic bootstrap .par import hook. - if not mod: - raise ImportError(mod_name + ' import succeeded but was None') - return True - except ImportError: - return False - - -if _implementation_type is None: - if _CanImport('google._upb._message'): - _implementation_type = 'upb' - elif _CanImport('google.protobuf.pyext._message'): - _implementation_type = 'cpp' - else: - _implementation_type = 'python' - - -# This environment variable can be used to switch to a certain implementation -# of the Python API, overriding the compile-time constants in the -# _api_implementation module. Right now only 'python', 'cpp' and 'upb' are -# valid values. Any other value will raise error. -_implementation_type = os.getenv('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION', - _implementation_type) - -if _implementation_type not in ('python', 'cpp', 'upb'): - raise ValueError('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION {0} is not ' - 'supported. Please set to \'python\', \'cpp\' or ' - '\'upb\'.'.format(_implementation_type)) - -if 'PyPy' in sys.version and _implementation_type == 'cpp': - warnings.warn('PyPy does not work yet with cpp protocol buffers. ' - 'Falling back to the python implementation.') - _implementation_type = 'python' - -_c_module = None - -if _implementation_type == 'cpp': - try: - # pylint: disable=g-import-not-at-top - from google.protobuf.pyext import _message - sys.modules['google3.net.proto2.python.internal.cpp._message'] = _message - _c_module = _message - del _message - except ImportError: - # TODO(jieluo): fail back to python - warnings.warn( - 'Selected implementation cpp is not available.') - pass - -if _implementation_type == 'upb': - try: - # pylint: disable=g-import-not-at-top - from google._upb import _message - _c_module = _message - del _message - except ImportError: - warnings.warn('Selected implementation upb is not available. ' - 'Falling back to the python implementation.') - _implementation_type = 'python' - pass - -# Detect if serialization should be deterministic by default -try: - # The presence of this module in a build allows the proto implementation to - # be upgraded merely via build deps. - # - # NOTE: Merely importing this automatically enables deterministic proto - # serialization for C++ code, but we still need to export it as a boolean so - # that we can do the same for `_implementation_type == 'python'`. - # - # NOTE2: It is possible for C++ code to enable deterministic serialization by - # default _without_ affecting Python code, if the C++ implementation is not in - # use by this module. That is intended behavior, so we don't actually expose - # this boolean outside of this module. - # - # pylint: disable=g-import-not-at-top,unused-import - from google.protobuf import enable_deterministic_proto_serialization - _python_deterministic_proto_serialization = True -except ImportError: - _python_deterministic_proto_serialization = False - - -# Usage of this function is discouraged. Clients shouldn't care which -# implementation of the API is in use. Note that there is no guarantee -# that differences between APIs will be maintained. -# Please don't use this function if possible. -def Type(): - return _implementation_type - - -# See comment on 'Type' above. -# TODO(jieluo): Remove the API, it returns a constant. b/228102101 -def Version(): - return 2 - - -# For internal use only -def IsPythonDefaultSerializationDeterministic(): - return _python_deterministic_proto_serialization diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/builder.py b/script.module.protobuf/resources/lib/google/protobuf/internal/builder.py deleted file mode 100644 index 64353ee4a..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/builder.py +++ /dev/null @@ -1,130 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Builds descriptors, message classes and services for generated _pb2.py. - -This file is only called in python generated _pb2.py files. It builds -descriptors, message classes and services that users can directly use -in generated code. -""" - -__author__ = 'jieluo@google.com (Jie Luo)' - -from google.protobuf.internal import enum_type_wrapper -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database - -_sym_db = _symbol_database.Default() - - -def BuildMessageAndEnumDescriptors(file_des, module): - """Builds message and enum descriptors. - - Args: - file_des: FileDescriptor of the .proto file - module: Generated _pb2 module - """ - - def BuildNestedDescriptors(msg_des, prefix): - for (name, nested_msg) in msg_des.nested_types_by_name.items(): - module_name = prefix + name.upper() - module[module_name] = nested_msg - BuildNestedDescriptors(nested_msg, module_name + '_') - for enum_des in msg_des.enum_types: - module[prefix + enum_des.name.upper()] = enum_des - - for (name, msg_des) in file_des.message_types_by_name.items(): - module_name = '_' + name.upper() - module[module_name] = msg_des - BuildNestedDescriptors(msg_des, module_name + '_') - - -def BuildTopDescriptorsAndMessages(file_des, module_name, module): - """Builds top level descriptors and message classes. - - Args: - file_des: FileDescriptor of the .proto file - module_name: str, the name of generated _pb2 module - module: Generated _pb2 module - """ - - def BuildMessage(msg_des): - create_dict = {} - for (name, nested_msg) in msg_des.nested_types_by_name.items(): - create_dict[name] = BuildMessage(nested_msg) - create_dict['DESCRIPTOR'] = msg_des - create_dict['__module__'] = module_name - message_class = _reflection.GeneratedProtocolMessageType( - msg_des.name, (_message.Message,), create_dict) - _sym_db.RegisterMessage(message_class) - return message_class - - # top level enums - for (name, enum_des) in file_des.enum_types_by_name.items(): - module['_' + name.upper()] = enum_des - module[name] = enum_type_wrapper.EnumTypeWrapper(enum_des) - for enum_value in enum_des.values: - module[enum_value.name] = enum_value.number - - # top level extensions - for (name, extension_des) in file_des.extensions_by_name.items(): - module[name.upper() + '_FIELD_NUMBER'] = extension_des.number - module[name] = extension_des - - # services - for (name, service) in file_des.services_by_name.items(): - module['_' + name.upper()] = service - - # Build messages. - for (name, msg_des) in file_des.message_types_by_name.items(): - module[name] = BuildMessage(msg_des) - - -def BuildServices(file_des, module_name, module): - """Builds services classes and services stub class. - - Args: - file_des: FileDescriptor of the .proto file - module_name: str, the name of generated _pb2 module - module: Generated _pb2 module - """ - # pylint: disable=g-import-not-at-top - from google.protobuf import service as _service - from google.protobuf import service_reflection - # pylint: enable=g-import-not-at-top - for (name, service) in file_des.services_by_name.items(): - module[name] = service_reflection.GeneratedServiceType( - name, (_service.Service,), - dict(DESCRIPTOR=service, __module__=module_name)) - stub_name = name + '_Stub' - module[stub_name] = service_reflection.GeneratedServiceStubType( - stub_name, (module[name],), - dict(DESCRIPTOR=service, __module__=module_name)) diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/containers.py b/script.module.protobuf/resources/lib/google/protobuf/internal/containers.py deleted file mode 100644 index 29fbb53d2..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/containers.py +++ /dev/null @@ -1,710 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Contains container classes to represent different protocol buffer types. - -This file defines container classes which represent categories of protocol -buffer field types which need extra maintenance. Currently these categories -are: - -- Repeated scalar fields - These are all repeated fields which aren't - composite (e.g. they are of simple types like int32, string, etc). -- Repeated composite fields - Repeated fields which are composite. This - includes groups and nested messages. -""" - -import collections.abc -import copy -import pickle -from typing import ( - Any, - Iterable, - Iterator, - List, - MutableMapping, - MutableSequence, - NoReturn, - Optional, - Sequence, - TypeVar, - Union, - overload, -) - - -_T = TypeVar('_T') -_K = TypeVar('_K') -_V = TypeVar('_V') - - -class BaseContainer(Sequence[_T]): - """Base container class.""" - - # Minimizes memory usage and disallows assignment to other attributes. - __slots__ = ['_message_listener', '_values'] - - def __init__(self, message_listener: Any) -> None: - """ - Args: - message_listener: A MessageListener implementation. - The RepeatedScalarFieldContainer will call this object's - Modified() method when it is modified. - """ - self._message_listener = message_listener - self._values = [] - - @overload - def __getitem__(self, key: int) -> _T: - ... - - @overload - def __getitem__(self, key: slice) -> List[_T]: - ... - - def __getitem__(self, key): - """Retrieves item by the specified key.""" - return self._values[key] - - def __len__(self) -> int: - """Returns the number of elements in the container.""" - return len(self._values) - - def __ne__(self, other: Any) -> bool: - """Checks if another instance isn't equal to this one.""" - # The concrete classes should define __eq__. - return not self == other - - __hash__ = None - - def __repr__(self) -> str: - return repr(self._values) - - def sort(self, *args, **kwargs) -> None: - # Continue to support the old sort_function keyword argument. - # This is expected to be a rare occurrence, so use LBYL to avoid - # the overhead of actually catching KeyError. - if 'sort_function' in kwargs: - kwargs['cmp'] = kwargs.pop('sort_function') - self._values.sort(*args, **kwargs) - - def reverse(self) -> None: - self._values.reverse() - - -# TODO(slebedev): Remove this. BaseContainer does *not* conform to -# MutableSequence, only its subclasses do. -collections.abc.MutableSequence.register(BaseContainer) - - -class RepeatedScalarFieldContainer(BaseContainer[_T], MutableSequence[_T]): - """Simple, type-checked, list-like container for holding repeated scalars.""" - - # Disallows assignment to other attributes. - __slots__ = ['_type_checker'] - - def __init__( - self, - message_listener: Any, - type_checker: Any, - ) -> None: - """Args: - - message_listener: A MessageListener implementation. The - RepeatedScalarFieldContainer will call this object's Modified() method - when it is modified. - type_checker: A type_checkers.ValueChecker instance to run on elements - inserted into this container. - """ - super().__init__(message_listener) - self._type_checker = type_checker - - def append(self, value: _T) -> None: - """Appends an item to the list. Similar to list.append().""" - self._values.append(self._type_checker.CheckValue(value)) - if not self._message_listener.dirty: - self._message_listener.Modified() - - def insert(self, key: int, value: _T) -> None: - """Inserts the item at the specified position. Similar to list.insert().""" - self._values.insert(key, self._type_checker.CheckValue(value)) - if not self._message_listener.dirty: - self._message_listener.Modified() - - def extend(self, elem_seq: Iterable[_T]) -> None: - """Extends by appending the given iterable. Similar to list.extend().""" - if elem_seq is None: - return - try: - elem_seq_iter = iter(elem_seq) - except TypeError: - if not elem_seq: - # silently ignore falsy inputs :-/. - # TODO(ptucker): Deprecate this behavior. b/18413862 - return - raise - - new_values = [self._type_checker.CheckValue(elem) for elem in elem_seq_iter] - if new_values: - self._values.extend(new_values) - self._message_listener.Modified() - - def MergeFrom( - self, - other: Union['RepeatedScalarFieldContainer[_T]', Iterable[_T]], - ) -> None: - """Appends the contents of another repeated field of the same type to this - one. We do not check the types of the individual fields. - """ - self._values.extend(other) - self._message_listener.Modified() - - def remove(self, elem: _T): - """Removes an item from the list. Similar to list.remove().""" - self._values.remove(elem) - self._message_listener.Modified() - - def pop(self, key: Optional[int] = -1) -> _T: - """Removes and returns an item at a given index. Similar to list.pop().""" - value = self._values[key] - self.__delitem__(key) - return value - - @overload - def __setitem__(self, key: int, value: _T) -> None: - ... - - @overload - def __setitem__(self, key: slice, value: Iterable[_T]) -> None: - ... - - def __setitem__(self, key, value) -> None: - """Sets the item on the specified position.""" - if isinstance(key, slice): - if key.step is not None: - raise ValueError('Extended slices not supported') - self._values[key] = map(self._type_checker.CheckValue, value) - self._message_listener.Modified() - else: - self._values[key] = self._type_checker.CheckValue(value) - self._message_listener.Modified() - - def __delitem__(self, key: Union[int, slice]) -> None: - """Deletes the item at the specified position.""" - del self._values[key] - self._message_listener.Modified() - - def __eq__(self, other: Any) -> bool: - """Compares the current instance with another one.""" - if self is other: - return True - # Special case for the same type which should be common and fast. - if isinstance(other, self.__class__): - return other._values == self._values - # We are presumably comparing against some other sequence type. - return other == self._values - - def __deepcopy__( - self, - unused_memo: Any = None, - ) -> 'RepeatedScalarFieldContainer[_T]': - clone = RepeatedScalarFieldContainer( - copy.deepcopy(self._message_listener), self._type_checker) - clone.MergeFrom(self) - return clone - - def __reduce__(self, **kwargs) -> NoReturn: - raise pickle.PickleError( - "Can't pickle repeated scalar fields, convert to list first") - - -# TODO(slebedev): Constrain T to be a subtype of Message. -class RepeatedCompositeFieldContainer(BaseContainer[_T], MutableSequence[_T]): - """Simple, list-like container for holding repeated composite fields.""" - - # Disallows assignment to other attributes. - __slots__ = ['_message_descriptor'] - - def __init__(self, message_listener: Any, message_descriptor: Any) -> None: - """ - Note that we pass in a descriptor instead of the generated directly, - since at the time we construct a _RepeatedCompositeFieldContainer we - haven't yet necessarily initialized the type that will be contained in the - container. - - Args: - message_listener: A MessageListener implementation. - The RepeatedCompositeFieldContainer will call this object's - Modified() method when it is modified. - message_descriptor: A Descriptor instance describing the protocol type - that should be present in this container. We'll use the - _concrete_class field of this descriptor when the client calls add(). - """ - super().__init__(message_listener) - self._message_descriptor = message_descriptor - - def add(self, **kwargs: Any) -> _T: - """Adds a new element at the end of the list and returns it. Keyword - arguments may be used to initialize the element. - """ - new_element = self._message_descriptor._concrete_class(**kwargs) - new_element._SetListener(self._message_listener) - self._values.append(new_element) - if not self._message_listener.dirty: - self._message_listener.Modified() - return new_element - - def append(self, value: _T) -> None: - """Appends one element by copying the message.""" - new_element = self._message_descriptor._concrete_class() - new_element._SetListener(self._message_listener) - new_element.CopyFrom(value) - self._values.append(new_element) - if not self._message_listener.dirty: - self._message_listener.Modified() - - def insert(self, key: int, value: _T) -> None: - """Inserts the item at the specified position by copying.""" - new_element = self._message_descriptor._concrete_class() - new_element._SetListener(self._message_listener) - new_element.CopyFrom(value) - self._values.insert(key, new_element) - if not self._message_listener.dirty: - self._message_listener.Modified() - - def extend(self, elem_seq: Iterable[_T]) -> None: - """Extends by appending the given sequence of elements of the same type - - as this one, copying each individual message. - """ - message_class = self._message_descriptor._concrete_class - listener = self._message_listener - values = self._values - for message in elem_seq: - new_element = message_class() - new_element._SetListener(listener) - new_element.MergeFrom(message) - values.append(new_element) - listener.Modified() - - def MergeFrom( - self, - other: Union['RepeatedCompositeFieldContainer[_T]', Iterable[_T]], - ) -> None: - """Appends the contents of another repeated field of the same type to this - one, copying each individual message. - """ - self.extend(other) - - def remove(self, elem: _T) -> None: - """Removes an item from the list. Similar to list.remove().""" - self._values.remove(elem) - self._message_listener.Modified() - - def pop(self, key: Optional[int] = -1) -> _T: - """Removes and returns an item at a given index. Similar to list.pop().""" - value = self._values[key] - self.__delitem__(key) - return value - - @overload - def __setitem__(self, key: int, value: _T) -> None: - ... - - @overload - def __setitem__(self, key: slice, value: Iterable[_T]) -> None: - ... - - def __setitem__(self, key, value): - # This method is implemented to make RepeatedCompositeFieldContainer - # structurally compatible with typing.MutableSequence. It is - # otherwise unsupported and will always raise an error. - raise TypeError( - f'{self.__class__.__name__} object does not support item assignment') - - def __delitem__(self, key: Union[int, slice]) -> None: - """Deletes the item at the specified position.""" - del self._values[key] - self._message_listener.Modified() - - def __eq__(self, other: Any) -> bool: - """Compares the current instance with another one.""" - if self is other: - return True - if not isinstance(other, self.__class__): - raise TypeError('Can only compare repeated composite fields against ' - 'other repeated composite fields.') - return self._values == other._values - - -class ScalarMap(MutableMapping[_K, _V]): - """Simple, type-checked, dict-like container for holding repeated scalars.""" - - # Disallows assignment to other attributes. - __slots__ = ['_key_checker', '_value_checker', '_values', '_message_listener', - '_entry_descriptor'] - - def __init__( - self, - message_listener: Any, - key_checker: Any, - value_checker: Any, - entry_descriptor: Any, - ) -> None: - """ - Args: - message_listener: A MessageListener implementation. - The ScalarMap will call this object's Modified() method when it - is modified. - key_checker: A type_checkers.ValueChecker instance to run on keys - inserted into this container. - value_checker: A type_checkers.ValueChecker instance to run on values - inserted into this container. - entry_descriptor: The MessageDescriptor of a map entry: key and value. - """ - self._message_listener = message_listener - self._key_checker = key_checker - self._value_checker = value_checker - self._entry_descriptor = entry_descriptor - self._values = {} - - def __getitem__(self, key: _K) -> _V: - try: - return self._values[key] - except KeyError: - key = self._key_checker.CheckValue(key) - val = self._value_checker.DefaultValue() - self._values[key] = val - return val - - def __contains__(self, item: _K) -> bool: - # We check the key's type to match the strong-typing flavor of the API. - # Also this makes it easier to match the behavior of the C++ implementation. - self._key_checker.CheckValue(item) - return item in self._values - - @overload - def get(self, key: _K) -> Optional[_V]: - ... - - @overload - def get(self, key: _K, default: _T) -> Union[_V, _T]: - ... - - # We need to override this explicitly, because our defaultdict-like behavior - # will make the default implementation (from our base class) always insert - # the key. - def get(self, key, default=None): - if key in self: - return self[key] - else: - return default - - def __setitem__(self, key: _K, value: _V) -> _T: - checked_key = self._key_checker.CheckValue(key) - checked_value = self._value_checker.CheckValue(value) - self._values[checked_key] = checked_value - self._message_listener.Modified() - - def __delitem__(self, key: _K) -> None: - del self._values[key] - self._message_listener.Modified() - - def __len__(self) -> int: - return len(self._values) - - def __iter__(self) -> Iterator[_K]: - return iter(self._values) - - def __repr__(self) -> str: - return repr(self._values) - - def MergeFrom(self, other: 'ScalarMap[_K, _V]') -> None: - self._values.update(other._values) - self._message_listener.Modified() - - def InvalidateIterators(self) -> None: - # It appears that the only way to reliably invalidate iterators to - # self._values is to ensure that its size changes. - original = self._values - self._values = original.copy() - original[None] = None - - # This is defined in the abstract base, but we can do it much more cheaply. - def clear(self) -> None: - self._values.clear() - self._message_listener.Modified() - - def GetEntryClass(self) -> Any: - return self._entry_descriptor._concrete_class - - -class MessageMap(MutableMapping[_K, _V]): - """Simple, type-checked, dict-like container for with submessage values.""" - - # Disallows assignment to other attributes. - __slots__ = ['_key_checker', '_values', '_message_listener', - '_message_descriptor', '_entry_descriptor'] - - def __init__( - self, - message_listener: Any, - message_descriptor: Any, - key_checker: Any, - entry_descriptor: Any, - ) -> None: - """ - Args: - message_listener: A MessageListener implementation. - The ScalarMap will call this object's Modified() method when it - is modified. - key_checker: A type_checkers.ValueChecker instance to run on keys - inserted into this container. - value_checker: A type_checkers.ValueChecker instance to run on values - inserted into this container. - entry_descriptor: The MessageDescriptor of a map entry: key and value. - """ - self._message_listener = message_listener - self._message_descriptor = message_descriptor - self._key_checker = key_checker - self._entry_descriptor = entry_descriptor - self._values = {} - - def __getitem__(self, key: _K) -> _V: - key = self._key_checker.CheckValue(key) - try: - return self._values[key] - except KeyError: - new_element = self._message_descriptor._concrete_class() - new_element._SetListener(self._message_listener) - self._values[key] = new_element - self._message_listener.Modified() - return new_element - - def get_or_create(self, key: _K) -> _V: - """get_or_create() is an alias for getitem (ie. map[key]). - - Args: - key: The key to get or create in the map. - - This is useful in cases where you want to be explicit that the call is - mutating the map. This can avoid lint errors for statements like this - that otherwise would appear to be pointless statements: - - msg.my_map[key] - """ - return self[key] - - @overload - def get(self, key: _K) -> Optional[_V]: - ... - - @overload - def get(self, key: _K, default: _T) -> Union[_V, _T]: - ... - - # We need to override this explicitly, because our defaultdict-like behavior - # will make the default implementation (from our base class) always insert - # the key. - def get(self, key, default=None): - if key in self: - return self[key] - else: - return default - - def __contains__(self, item: _K) -> bool: - item = self._key_checker.CheckValue(item) - return item in self._values - - def __setitem__(self, key: _K, value: _V) -> NoReturn: - raise ValueError('May not set values directly, call my_map[key].foo = 5') - - def __delitem__(self, key: _K) -> None: - key = self._key_checker.CheckValue(key) - del self._values[key] - self._message_listener.Modified() - - def __len__(self) -> int: - return len(self._values) - - def __iter__(self) -> Iterator[_K]: - return iter(self._values) - - def __repr__(self) -> str: - return repr(self._values) - - def MergeFrom(self, other: 'MessageMap[_K, _V]') -> None: - # pylint: disable=protected-access - for key in other._values: - # According to documentation: "When parsing from the wire or when merging, - # if there are duplicate map keys the last key seen is used". - if key in self: - del self[key] - self[key].CopyFrom(other[key]) - # self._message_listener.Modified() not required here, because - # mutations to submessages already propagate. - - def InvalidateIterators(self) -> None: - # It appears that the only way to reliably invalidate iterators to - # self._values is to ensure that its size changes. - original = self._values - self._values = original.copy() - original[None] = None - - # This is defined in the abstract base, but we can do it much more cheaply. - def clear(self) -> None: - self._values.clear() - self._message_listener.Modified() - - def GetEntryClass(self) -> Any: - return self._entry_descriptor._concrete_class - - -class _UnknownField: - """A parsed unknown field.""" - - # Disallows assignment to other attributes. - __slots__ = ['_field_number', '_wire_type', '_data'] - - def __init__(self, field_number, wire_type, data): - self._field_number = field_number - self._wire_type = wire_type - self._data = data - return - - def __lt__(self, other): - # pylint: disable=protected-access - return self._field_number < other._field_number - - def __eq__(self, other): - if self is other: - return True - # pylint: disable=protected-access - return (self._field_number == other._field_number and - self._wire_type == other._wire_type and - self._data == other._data) - - -class UnknownFieldRef: # pylint: disable=missing-class-docstring - - def __init__(self, parent, index): - self._parent = parent - self._index = index - - def _check_valid(self): - if not self._parent: - raise ValueError('UnknownField does not exist. ' - 'The parent message might be cleared.') - if self._index >= len(self._parent): - raise ValueError('UnknownField does not exist. ' - 'The parent message might be cleared.') - - @property - def field_number(self): - self._check_valid() - # pylint: disable=protected-access - return self._parent._internal_get(self._index)._field_number - - @property - def wire_type(self): - self._check_valid() - # pylint: disable=protected-access - return self._parent._internal_get(self._index)._wire_type - - @property - def data(self): - self._check_valid() - # pylint: disable=protected-access - return self._parent._internal_get(self._index)._data - - -class UnknownFieldSet: - """UnknownField container""" - - # Disallows assignment to other attributes. - __slots__ = ['_values'] - - def __init__(self): - self._values = [] - - def __getitem__(self, index): - if self._values is None: - raise ValueError('UnknownFields does not exist. ' - 'The parent message might be cleared.') - size = len(self._values) - if index < 0: - index += size - if index < 0 or index >= size: - raise IndexError('index %d out of range'.index) - - return UnknownFieldRef(self, index) - - def _internal_get(self, index): - return self._values[index] - - def __len__(self): - if self._values is None: - raise ValueError('UnknownFields does not exist. ' - 'The parent message might be cleared.') - return len(self._values) - - def _add(self, field_number, wire_type, data): - unknown_field = _UnknownField(field_number, wire_type, data) - self._values.append(unknown_field) - return unknown_field - - def __iter__(self): - for i in range(len(self)): - yield UnknownFieldRef(self, i) - - def _extend(self, other): - if other is None: - return - # pylint: disable=protected-access - self._values.extend(other._values) - - def __eq__(self, other): - if self is other: - return True - # Sort unknown fields because their order shouldn't - # affect equality test. - values = list(self._values) - if other is None: - return not values - values.sort() - # pylint: disable=protected-access - other_values = sorted(other._values) - return values == other_values - - def _clear(self): - for value in self._values: - # pylint: disable=protected-access - if isinstance(value._data, UnknownFieldSet): - value._data._clear() # pylint: disable=protected-access - self._values = None diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/decoder.py b/script.module.protobuf/resources/lib/google/protobuf/internal/decoder.py deleted file mode 100644 index 8ff549381..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/decoder.py +++ /dev/null @@ -1,1067 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Code for decoding protocol buffer primitives. - -This code is very similar to encoder.py -- read the docs for that module first. - -A "decoder" is a function with the signature: - Decode(buffer, pos, end, message, field_dict) -The arguments are: - buffer: The string containing the encoded message. - pos: The current position in the string. - end: The position in the string where the current message ends. May be - less than len(buffer) if we're reading a sub-message. - message: The message object into which we're parsing. - field_dict: message._fields (avoids a hashtable lookup). -The decoder reads the field and stores it into field_dict, returning the new -buffer position. A decoder for a repeated field may proactively decode all of -the elements of that field, if they appear consecutively. - -Note that decoders may throw any of the following: - IndexError: Indicates a truncated message. - struct.error: Unpacking of a fixed-width field failed. - message.DecodeError: Other errors. - -Decoders are expected to raise an exception if they are called with pos > end. -This allows callers to be lax about bounds checking: it's fineto read past -"end" as long as you are sure that someone else will notice and throw an -exception later on. - -Something up the call stack is expected to catch IndexError and struct.error -and convert them to message.DecodeError. - -Decoders are constructed using decoder constructors with the signature: - MakeDecoder(field_number, is_repeated, is_packed, key, new_default) -The arguments are: - field_number: The field number of the field we want to decode. - is_repeated: Is the field a repeated field? (bool) - is_packed: Is the field a packed field? (bool) - key: The key to use when looking up the field within field_dict. - (This is actually the FieldDescriptor but nothing in this - file should depend on that.) - new_default: A function which takes a message object as a parameter and - returns a new instance of the default value for this field. - (This is called for repeated fields and sub-messages, when an - instance does not already exist.) - -As with encoders, we define a decoder constructor for every type of field. -Then, for every field of every message class we construct an actual decoder. -That decoder goes into a dict indexed by tag, so when we decode a message -we repeatedly read a tag, look up the corresponding decoder, and invoke it. -""" - -__author__ = 'kenton@google.com (Kenton Varda)' - -import math -import struct - -from google.protobuf.internal import containers -from google.protobuf.internal import encoder -from google.protobuf.internal import wire_format -from google.protobuf import message - - -# This is not for optimization, but rather to avoid conflicts with local -# variables named "message". -_DecodeError = message.DecodeError - - -def _VarintDecoder(mask, result_type): - """Return an encoder for a basic varint value (does not include tag). - - Decoded values will be bitwise-anded with the given mask before being - returned, e.g. to limit them to 32 bits. The returned decoder does not - take the usual "end" parameter -- the caller is expected to do bounds checking - after the fact (often the caller can defer such checking until later). The - decoder returns a (value, new_pos) pair. - """ - - def DecodeVarint(buffer, pos): - result = 0 - shift = 0 - while 1: - b = buffer[pos] - result |= ((b & 0x7f) << shift) - pos += 1 - if not (b & 0x80): - result &= mask - result = result_type(result) - return (result, pos) - shift += 7 - if shift >= 64: - raise _DecodeError('Too many bytes when decoding varint.') - return DecodeVarint - - -def _SignedVarintDecoder(bits, result_type): - """Like _VarintDecoder() but decodes signed values.""" - - signbit = 1 << (bits - 1) - mask = (1 << bits) - 1 - - def DecodeVarint(buffer, pos): - result = 0 - shift = 0 - while 1: - b = buffer[pos] - result |= ((b & 0x7f) << shift) - pos += 1 - if not (b & 0x80): - result &= mask - result = (result ^ signbit) - signbit - result = result_type(result) - return (result, pos) - shift += 7 - if shift >= 64: - raise _DecodeError('Too many bytes when decoding varint.') - return DecodeVarint - -# All 32-bit and 64-bit values are represented as int. -_DecodeVarint = _VarintDecoder((1 << 64) - 1, int) -_DecodeSignedVarint = _SignedVarintDecoder(64, int) - -# Use these versions for values which must be limited to 32 bits. -_DecodeVarint32 = _VarintDecoder((1 << 32) - 1, int) -_DecodeSignedVarint32 = _SignedVarintDecoder(32, int) - - -def ReadTag(buffer, pos): - """Read a tag from the memoryview, and return a (tag_bytes, new_pos) tuple. - - We return the raw bytes of the tag rather than decoding them. The raw - bytes can then be used to look up the proper decoder. This effectively allows - us to trade some work that would be done in pure-python (decoding a varint) - for work that is done in C (searching for a byte string in a hash table). - In a low-level language it would be much cheaper to decode the varint and - use that, but not in Python. - - Args: - buffer: memoryview object of the encoded bytes - pos: int of the current position to start from - - Returns: - Tuple[bytes, int] of the tag data and new position. - """ - start = pos - while buffer[pos] & 0x80: - pos += 1 - pos += 1 - - tag_bytes = buffer[start:pos].tobytes() - return tag_bytes, pos - - -# -------------------------------------------------------------------- - - -def _SimpleDecoder(wire_type, decode_value): - """Return a constructor for a decoder for fields of a particular type. - - Args: - wire_type: The field's wire type. - decode_value: A function which decodes an individual value, e.g. - _DecodeVarint() - """ - - def SpecificDecoder(field_number, is_repeated, is_packed, key, new_default, - clear_if_default=False): - if is_packed: - local_DecodeVarint = _DecodeVarint - def DecodePackedField(buffer, pos, end, message, field_dict): - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - (endpoint, pos) = local_DecodeVarint(buffer, pos) - endpoint += pos - if endpoint > end: - raise _DecodeError('Truncated message.') - while pos < endpoint: - (element, pos) = decode_value(buffer, pos) - value.append(element) - if pos > endpoint: - del value[-1] # Discard corrupt value. - raise _DecodeError('Packed element was truncated.') - return pos - return DecodePackedField - elif is_repeated: - tag_bytes = encoder.TagBytes(field_number, wire_type) - tag_len = len(tag_bytes) - def DecodeRepeatedField(buffer, pos, end, message, field_dict): - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - while 1: - (element, new_pos) = decode_value(buffer, pos) - value.append(element) - # Predict that the next tag is another copy of the same repeated - # field. - pos = new_pos + tag_len - if buffer[new_pos:pos] != tag_bytes or new_pos >= end: - # Prediction failed. Return. - if new_pos > end: - raise _DecodeError('Truncated message.') - return new_pos - return DecodeRepeatedField - else: - def DecodeField(buffer, pos, end, message, field_dict): - (new_value, pos) = decode_value(buffer, pos) - if pos > end: - raise _DecodeError('Truncated message.') - if clear_if_default and not new_value: - field_dict.pop(key, None) - else: - field_dict[key] = new_value - return pos - return DecodeField - - return SpecificDecoder - - -def _ModifiedDecoder(wire_type, decode_value, modify_value): - """Like SimpleDecoder but additionally invokes modify_value on every value - before storing it. Usually modify_value is ZigZagDecode. - """ - - # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but - # not enough to make a significant difference. - - def InnerDecode(buffer, pos): - (result, new_pos) = decode_value(buffer, pos) - return (modify_value(result), new_pos) - return _SimpleDecoder(wire_type, InnerDecode) - - -def _StructPackDecoder(wire_type, format): - """Return a constructor for a decoder for a fixed-width field. - - Args: - wire_type: The field's wire type. - format: The format string to pass to struct.unpack(). - """ - - value_size = struct.calcsize(format) - local_unpack = struct.unpack - - # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but - # not enough to make a significant difference. - - # Note that we expect someone up-stack to catch struct.error and convert - # it to _DecodeError -- this way we don't have to set up exception- - # handling blocks every time we parse one value. - - def InnerDecode(buffer, pos): - new_pos = pos + value_size - result = local_unpack(format, buffer[pos:new_pos])[0] - return (result, new_pos) - return _SimpleDecoder(wire_type, InnerDecode) - - -def _FloatDecoder(): - """Returns a decoder for a float field. - - This code works around a bug in struct.unpack for non-finite 32-bit - floating-point values. - """ - - local_unpack = struct.unpack - - def InnerDecode(buffer, pos): - """Decode serialized float to a float and new position. - - Args: - buffer: memoryview of the serialized bytes - pos: int, position in the memory view to start at. - - Returns: - Tuple[float, int] of the deserialized float value and new position - in the serialized data. - """ - # We expect a 32-bit value in little-endian byte order. Bit 1 is the sign - # bit, bits 2-9 represent the exponent, and bits 10-32 are the significand. - new_pos = pos + 4 - float_bytes = buffer[pos:new_pos].tobytes() - - # If this value has all its exponent bits set, then it's non-finite. - # In Python 2.4, struct.unpack will convert it to a finite 64-bit value. - # To avoid that, we parse it specially. - if (float_bytes[3:4] in b'\x7F\xFF' and float_bytes[2:3] >= b'\x80'): - # If at least one significand bit is set... - if float_bytes[0:3] != b'\x00\x00\x80': - return (math.nan, new_pos) - # If sign bit is set... - if float_bytes[3:4] == b'\xFF': - return (-math.inf, new_pos) - return (math.inf, new_pos) - - # Note that we expect someone up-stack to catch struct.error and convert - # it to _DecodeError -- this way we don't have to set up exception- - # handling blocks every time we parse one value. - result = local_unpack('= b'\xF0') - and (double_bytes[0:7] != b'\x00\x00\x00\x00\x00\x00\xF0')): - return (math.nan, new_pos) - - # Note that we expect someone up-stack to catch struct.error and convert - # it to _DecodeError -- this way we don't have to set up exception- - # handling blocks every time we parse one value. - result = local_unpack(' end: - raise _DecodeError('Truncated message.') - while pos < endpoint: - value_start_pos = pos - (element, pos) = _DecodeSignedVarint32(buffer, pos) - # pylint: disable=protected-access - if element in enum_type.values_by_number: - value.append(element) - else: - if not message._unknown_fields: - message._unknown_fields = [] - tag_bytes = encoder.TagBytes(field_number, - wire_format.WIRETYPE_VARINT) - - message._unknown_fields.append( - (tag_bytes, buffer[value_start_pos:pos].tobytes())) - if message._unknown_field_set is None: - message._unknown_field_set = containers.UnknownFieldSet() - message._unknown_field_set._add( - field_number, wire_format.WIRETYPE_VARINT, element) - # pylint: enable=protected-access - if pos > endpoint: - if element in enum_type.values_by_number: - del value[-1] # Discard corrupt value. - else: - del message._unknown_fields[-1] - # pylint: disable=protected-access - del message._unknown_field_set._values[-1] - # pylint: enable=protected-access - raise _DecodeError('Packed element was truncated.') - return pos - return DecodePackedField - elif is_repeated: - tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_VARINT) - tag_len = len(tag_bytes) - def DecodeRepeatedField(buffer, pos, end, message, field_dict): - """Decode serialized repeated enum to its value and a new position. - - Args: - buffer: memoryview of the serialized bytes. - pos: int, position in the memory view to start at. - end: int, end position of serialized data - message: Message object to store unknown fields in - field_dict: Map[Descriptor, Any] to store decoded values in. - - Returns: - int, new position in serialized data. - """ - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - while 1: - (element, new_pos) = _DecodeSignedVarint32(buffer, pos) - # pylint: disable=protected-access - if element in enum_type.values_by_number: - value.append(element) - else: - if not message._unknown_fields: - message._unknown_fields = [] - message._unknown_fields.append( - (tag_bytes, buffer[pos:new_pos].tobytes())) - if message._unknown_field_set is None: - message._unknown_field_set = containers.UnknownFieldSet() - message._unknown_field_set._add( - field_number, wire_format.WIRETYPE_VARINT, element) - # pylint: enable=protected-access - # Predict that the next tag is another copy of the same repeated - # field. - pos = new_pos + tag_len - if buffer[new_pos:pos] != tag_bytes or new_pos >= end: - # Prediction failed. Return. - if new_pos > end: - raise _DecodeError('Truncated message.') - return new_pos - return DecodeRepeatedField - else: - def DecodeField(buffer, pos, end, message, field_dict): - """Decode serialized repeated enum to its value and a new position. - - Args: - buffer: memoryview of the serialized bytes. - pos: int, position in the memory view to start at. - end: int, end position of serialized data - message: Message object to store unknown fields in - field_dict: Map[Descriptor, Any] to store decoded values in. - - Returns: - int, new position in serialized data. - """ - value_start_pos = pos - (enum_value, pos) = _DecodeSignedVarint32(buffer, pos) - if pos > end: - raise _DecodeError('Truncated message.') - if clear_if_default and not enum_value: - field_dict.pop(key, None) - return pos - # pylint: disable=protected-access - if enum_value in enum_type.values_by_number: - field_dict[key] = enum_value - else: - if not message._unknown_fields: - message._unknown_fields = [] - tag_bytes = encoder.TagBytes(field_number, - wire_format.WIRETYPE_VARINT) - message._unknown_fields.append( - (tag_bytes, buffer[value_start_pos:pos].tobytes())) - if message._unknown_field_set is None: - message._unknown_field_set = containers.UnknownFieldSet() - message._unknown_field_set._add( - field_number, wire_format.WIRETYPE_VARINT, enum_value) - # pylint: enable=protected-access - return pos - return DecodeField - - -# -------------------------------------------------------------------- - - -Int32Decoder = _SimpleDecoder( - wire_format.WIRETYPE_VARINT, _DecodeSignedVarint32) - -Int64Decoder = _SimpleDecoder( - wire_format.WIRETYPE_VARINT, _DecodeSignedVarint) - -UInt32Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint32) -UInt64Decoder = _SimpleDecoder(wire_format.WIRETYPE_VARINT, _DecodeVarint) - -SInt32Decoder = _ModifiedDecoder( - wire_format.WIRETYPE_VARINT, _DecodeVarint32, wire_format.ZigZagDecode) -SInt64Decoder = _ModifiedDecoder( - wire_format.WIRETYPE_VARINT, _DecodeVarint, wire_format.ZigZagDecode) - -# Note that Python conveniently guarantees that when using the '<' prefix on -# formats, they will also have the same size across all platforms (as opposed -# to without the prefix, where their sizes depend on the C compiler's basic -# type sizes). -Fixed32Decoder = _StructPackDecoder(wire_format.WIRETYPE_FIXED32, ' end: - raise _DecodeError('Truncated string.') - value.append(_ConvertToUnicode(buffer[pos:new_pos])) - # Predict that the next tag is another copy of the same repeated field. - pos = new_pos + tag_len - if buffer[new_pos:pos] != tag_bytes or new_pos == end: - # Prediction failed. Return. - return new_pos - return DecodeRepeatedField - else: - def DecodeField(buffer, pos, end, message, field_dict): - (size, pos) = local_DecodeVarint(buffer, pos) - new_pos = pos + size - if new_pos > end: - raise _DecodeError('Truncated string.') - if clear_if_default and not size: - field_dict.pop(key, None) - else: - field_dict[key] = _ConvertToUnicode(buffer[pos:new_pos]) - return new_pos - return DecodeField - - -def BytesDecoder(field_number, is_repeated, is_packed, key, new_default, - clear_if_default=False): - """Returns a decoder for a bytes field.""" - - local_DecodeVarint = _DecodeVarint - - assert not is_packed - if is_repeated: - tag_bytes = encoder.TagBytes(field_number, - wire_format.WIRETYPE_LENGTH_DELIMITED) - tag_len = len(tag_bytes) - def DecodeRepeatedField(buffer, pos, end, message, field_dict): - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - while 1: - (size, pos) = local_DecodeVarint(buffer, pos) - new_pos = pos + size - if new_pos > end: - raise _DecodeError('Truncated string.') - value.append(buffer[pos:new_pos].tobytes()) - # Predict that the next tag is another copy of the same repeated field. - pos = new_pos + tag_len - if buffer[new_pos:pos] != tag_bytes or new_pos == end: - # Prediction failed. Return. - return new_pos - return DecodeRepeatedField - else: - def DecodeField(buffer, pos, end, message, field_dict): - (size, pos) = local_DecodeVarint(buffer, pos) - new_pos = pos + size - if new_pos > end: - raise _DecodeError('Truncated string.') - if clear_if_default and not size: - field_dict.pop(key, None) - else: - field_dict[key] = buffer[pos:new_pos].tobytes() - return new_pos - return DecodeField - - -def GroupDecoder(field_number, is_repeated, is_packed, key, new_default): - """Returns a decoder for a group field.""" - - end_tag_bytes = encoder.TagBytes(field_number, - wire_format.WIRETYPE_END_GROUP) - end_tag_len = len(end_tag_bytes) - - assert not is_packed - if is_repeated: - tag_bytes = encoder.TagBytes(field_number, - wire_format.WIRETYPE_START_GROUP) - tag_len = len(tag_bytes) - def DecodeRepeatedField(buffer, pos, end, message, field_dict): - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - while 1: - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - # Read sub-message. - pos = value.add()._InternalParse(buffer, pos, end) - # Read end tag. - new_pos = pos+end_tag_len - if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: - raise _DecodeError('Missing group end tag.') - # Predict that the next tag is another copy of the same repeated field. - pos = new_pos + tag_len - if buffer[new_pos:pos] != tag_bytes or new_pos == end: - # Prediction failed. Return. - return new_pos - return DecodeRepeatedField - else: - def DecodeField(buffer, pos, end, message, field_dict): - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - # Read sub-message. - pos = value._InternalParse(buffer, pos, end) - # Read end tag. - new_pos = pos+end_tag_len - if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: - raise _DecodeError('Missing group end tag.') - return new_pos - return DecodeField - - -def MessageDecoder(field_number, is_repeated, is_packed, key, new_default): - """Returns a decoder for a message field.""" - - local_DecodeVarint = _DecodeVarint - - assert not is_packed - if is_repeated: - tag_bytes = encoder.TagBytes(field_number, - wire_format.WIRETYPE_LENGTH_DELIMITED) - tag_len = len(tag_bytes) - def DecodeRepeatedField(buffer, pos, end, message, field_dict): - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - while 1: - # Read length. - (size, pos) = local_DecodeVarint(buffer, pos) - new_pos = pos + size - if new_pos > end: - raise _DecodeError('Truncated message.') - # Read sub-message. - if value.add()._InternalParse(buffer, pos, new_pos) != new_pos: - # The only reason _InternalParse would return early is if it - # encountered an end-group tag. - raise _DecodeError('Unexpected end-group tag.') - # Predict that the next tag is another copy of the same repeated field. - pos = new_pos + tag_len - if buffer[new_pos:pos] != tag_bytes or new_pos == end: - # Prediction failed. Return. - return new_pos - return DecodeRepeatedField - else: - def DecodeField(buffer, pos, end, message, field_dict): - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - # Read length. - (size, pos) = local_DecodeVarint(buffer, pos) - new_pos = pos + size - if new_pos > end: - raise _DecodeError('Truncated message.') - # Read sub-message. - if value._InternalParse(buffer, pos, new_pos) != new_pos: - # The only reason _InternalParse would return early is if it encountered - # an end-group tag. - raise _DecodeError('Unexpected end-group tag.') - return new_pos - return DecodeField - - -# -------------------------------------------------------------------- - -MESSAGE_SET_ITEM_TAG = encoder.TagBytes(1, wire_format.WIRETYPE_START_GROUP) - -def MessageSetItemDecoder(descriptor): - """Returns a decoder for a MessageSet item. - - The parameter is the message Descriptor. - - The message set message looks like this: - message MessageSet { - repeated group Item = 1 { - required int32 type_id = 2; - required string message = 3; - } - } - """ - - type_id_tag_bytes = encoder.TagBytes(2, wire_format.WIRETYPE_VARINT) - message_tag_bytes = encoder.TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED) - item_end_tag_bytes = encoder.TagBytes(1, wire_format.WIRETYPE_END_GROUP) - - local_ReadTag = ReadTag - local_DecodeVarint = _DecodeVarint - local_SkipField = SkipField - - def DecodeItem(buffer, pos, end, message, field_dict): - """Decode serialized message set to its value and new position. - - Args: - buffer: memoryview of the serialized bytes. - pos: int, position in the memory view to start at. - end: int, end position of serialized data - message: Message object to store unknown fields in - field_dict: Map[Descriptor, Any] to store decoded values in. - - Returns: - int, new position in serialized data. - """ - message_set_item_start = pos - type_id = -1 - message_start = -1 - message_end = -1 - - # Technically, type_id and message can appear in any order, so we need - # a little loop here. - while 1: - (tag_bytes, pos) = local_ReadTag(buffer, pos) - if tag_bytes == type_id_tag_bytes: - (type_id, pos) = local_DecodeVarint(buffer, pos) - elif tag_bytes == message_tag_bytes: - (size, message_start) = local_DecodeVarint(buffer, pos) - pos = message_end = message_start + size - elif tag_bytes == item_end_tag_bytes: - break - else: - pos = SkipField(buffer, pos, end, tag_bytes) - if pos == -1: - raise _DecodeError('Missing group end tag.') - - if pos > end: - raise _DecodeError('Truncated message.') - - if type_id == -1: - raise _DecodeError('MessageSet item missing type_id.') - if message_start == -1: - raise _DecodeError('MessageSet item missing message.') - - extension = message.Extensions._FindExtensionByNumber(type_id) - # pylint: disable=protected-access - if extension is not None: - value = field_dict.get(extension) - if value is None: - message_type = extension.message_type - if not hasattr(message_type, '_concrete_class'): - message_factory.GetMessageClass(message_type) - value = field_dict.setdefault( - extension, message_type._concrete_class()) - if value._InternalParse(buffer, message_start,message_end) != message_end: - # The only reason _InternalParse would return early is if it encountered - # an end-group tag. - raise _DecodeError('Unexpected end-group tag.') - else: - if not message._unknown_fields: - message._unknown_fields = [] - message._unknown_fields.append( - (MESSAGE_SET_ITEM_TAG, buffer[message_set_item_start:pos].tobytes())) - if message._unknown_field_set is None: - message._unknown_field_set = containers.UnknownFieldSet() - message._unknown_field_set._add( - type_id, - wire_format.WIRETYPE_LENGTH_DELIMITED, - buffer[message_start:message_end].tobytes()) - # pylint: enable=protected-access - - return pos - - return DecodeItem - - -def UnknownMessageSetItemDecoder(): - """Returns a decoder for a Unknown MessageSet item.""" - - type_id_tag_bytes = encoder.TagBytes(2, wire_format.WIRETYPE_VARINT) - message_tag_bytes = encoder.TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED) - item_end_tag_bytes = encoder.TagBytes(1, wire_format.WIRETYPE_END_GROUP) - - def DecodeUnknownItem(buffer): - pos = 0 - end = len(buffer) - message_start = -1 - message_end = -1 - while 1: - (tag_bytes, pos) = ReadTag(buffer, pos) - if tag_bytes == type_id_tag_bytes: - (type_id, pos) = _DecodeVarint(buffer, pos) - elif tag_bytes == message_tag_bytes: - (size, message_start) = _DecodeVarint(buffer, pos) - pos = message_end = message_start + size - elif tag_bytes == item_end_tag_bytes: - break - else: - pos = SkipField(buffer, pos, end, tag_bytes) - if pos == -1: - raise _DecodeError('Missing group end tag.') - - if pos > end: - raise _DecodeError('Truncated message.') - - if type_id == -1: - raise _DecodeError('MessageSet item missing type_id.') - if message_start == -1: - raise _DecodeError('MessageSet item missing message.') - - return (type_id, buffer[message_start:message_end].tobytes()) - - return DecodeUnknownItem - -# -------------------------------------------------------------------- - -def MapDecoder(field_descriptor, new_default, is_message_map): - """Returns a decoder for a map field.""" - - key = field_descriptor - tag_bytes = encoder.TagBytes(field_descriptor.number, - wire_format.WIRETYPE_LENGTH_DELIMITED) - tag_len = len(tag_bytes) - local_DecodeVarint = _DecodeVarint - # Can't read _concrete_class yet; might not be initialized. - message_type = field_descriptor.message_type - - def DecodeMap(buffer, pos, end, message, field_dict): - submsg = message_type._concrete_class() - value = field_dict.get(key) - if value is None: - value = field_dict.setdefault(key, new_default(message)) - while 1: - # Read length. - (size, pos) = local_DecodeVarint(buffer, pos) - new_pos = pos + size - if new_pos > end: - raise _DecodeError('Truncated message.') - # Read sub-message. - submsg.Clear() - if submsg._InternalParse(buffer, pos, new_pos) != new_pos: - # The only reason _InternalParse would return early is if it - # encountered an end-group tag. - raise _DecodeError('Unexpected end-group tag.') - - if is_message_map: - value[submsg.key].CopyFrom(submsg.value) - else: - value[submsg.key] = submsg.value - - # Predict that the next tag is another copy of the same repeated field. - pos = new_pos + tag_len - if buffer[new_pos:pos] != tag_bytes or new_pos == end: - # Prediction failed. Return. - return new_pos - - return DecodeMap - -# -------------------------------------------------------------------- -# Optimization is not as heavy here because calls to SkipField() are rare, -# except for handling end-group tags. - -def _SkipVarint(buffer, pos, end): - """Skip a varint value. Returns the new position.""" - # Previously ord(buffer[pos]) raised IndexError when pos is out of range. - # With this code, ord(b'') raises TypeError. Both are handled in - # python_message.py to generate a 'Truncated message' error. - while ord(buffer[pos:pos+1].tobytes()) & 0x80: - pos += 1 - pos += 1 - if pos > end: - raise _DecodeError('Truncated message.') - return pos - -def _SkipFixed64(buffer, pos, end): - """Skip a fixed64 value. Returns the new position.""" - - pos += 8 - if pos > end: - raise _DecodeError('Truncated message.') - return pos - - -def _DecodeFixed64(buffer, pos): - """Decode a fixed64.""" - new_pos = pos + 8 - return (struct.unpack(' end: - raise _DecodeError('Truncated message.') - return pos - - -def _SkipGroup(buffer, pos, end): - """Skip sub-group. Returns the new position.""" - - while 1: - (tag_bytes, pos) = ReadTag(buffer, pos) - new_pos = SkipField(buffer, pos, end, tag_bytes) - if new_pos == -1: - return pos - pos = new_pos - - -def _DecodeUnknownFieldSet(buffer, pos, end_pos=None): - """Decode UnknownFieldSet. Returns the UnknownFieldSet and new position.""" - - unknown_field_set = containers.UnknownFieldSet() - while end_pos is None or pos < end_pos: - (tag_bytes, pos) = ReadTag(buffer, pos) - (tag, _) = _DecodeVarint(tag_bytes, 0) - field_number, wire_type = wire_format.UnpackTag(tag) - if wire_type == wire_format.WIRETYPE_END_GROUP: - break - (data, pos) = _DecodeUnknownField(buffer, pos, wire_type) - # pylint: disable=protected-access - unknown_field_set._add(field_number, wire_type, data) - - return (unknown_field_set, pos) - - -def _DecodeUnknownField(buffer, pos, wire_type): - """Decode a unknown field. Returns the UnknownField and new position.""" - - if wire_type == wire_format.WIRETYPE_VARINT: - (data, pos) = _DecodeVarint(buffer, pos) - elif wire_type == wire_format.WIRETYPE_FIXED64: - (data, pos) = _DecodeFixed64(buffer, pos) - elif wire_type == wire_format.WIRETYPE_FIXED32: - (data, pos) = _DecodeFixed32(buffer, pos) - elif wire_type == wire_format.WIRETYPE_LENGTH_DELIMITED: - (size, pos) = _DecodeVarint(buffer, pos) - data = buffer[pos:pos+size].tobytes() - pos += size - elif wire_type == wire_format.WIRETYPE_START_GROUP: - (data, pos) = _DecodeUnknownFieldSet(buffer, pos) - elif wire_type == wire_format.WIRETYPE_END_GROUP: - return (0, -1) - else: - raise _DecodeError('Wrong wire type in tag.') - - return (data, pos) - - -def _EndGroup(buffer, pos, end): - """Skipping an END_GROUP tag returns -1 to tell the parent loop to break.""" - - return -1 - - -def _SkipFixed32(buffer, pos, end): - """Skip a fixed32 value. Returns the new position.""" - - pos += 4 - if pos > end: - raise _DecodeError('Truncated message.') - return pos - - -def _DecodeFixed32(buffer, pos): - """Decode a fixed32.""" - - new_pos = pos + 4 - return (struct.unpack('B').pack - - def EncodeVarint(write, value, unused_deterministic=None): - bits = value & 0x7f - value >>= 7 - while value: - write(local_int2byte(0x80|bits)) - bits = value & 0x7f - value >>= 7 - return write(local_int2byte(bits)) - - return EncodeVarint - - -def _SignedVarintEncoder(): - """Return an encoder for a basic signed varint value (does not include - tag).""" - - local_int2byte = struct.Struct('>B').pack - - def EncodeSignedVarint(write, value, unused_deterministic=None): - if value < 0: - value += (1 << 64) - bits = value & 0x7f - value >>= 7 - while value: - write(local_int2byte(0x80|bits)) - bits = value & 0x7f - value >>= 7 - return write(local_int2byte(bits)) - - return EncodeSignedVarint - - -_EncodeVarint = _VarintEncoder() -_EncodeSignedVarint = _SignedVarintEncoder() - - -def _VarintBytes(value): - """Encode the given integer as a varint and return the bytes. This is only - called at startup time so it doesn't need to be fast.""" - - pieces = [] - _EncodeVarint(pieces.append, value, True) - return b"".join(pieces) - - -def TagBytes(field_number, wire_type): - """Encode the given tag and return the bytes. Only called at startup.""" - - return bytes(_VarintBytes(wire_format.PackTag(field_number, wire_type))) - -# -------------------------------------------------------------------- -# As with sizers (see above), we have a number of common encoder -# implementations. - - -def _SimpleEncoder(wire_type, encode_value, compute_value_size): - """Return a constructor for an encoder for fields of a particular type. - - Args: - wire_type: The field's wire type, for encoding tags. - encode_value: A function which encodes an individual value, e.g. - _EncodeVarint(). - compute_value_size: A function which computes the size of an individual - value, e.g. _VarintSize(). - """ - - def SpecificEncoder(field_number, is_repeated, is_packed): - if is_packed: - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) - local_EncodeVarint = _EncodeVarint - def EncodePackedField(write, value, deterministic): - write(tag_bytes) - size = 0 - for element in value: - size += compute_value_size(element) - local_EncodeVarint(write, size, deterministic) - for element in value: - encode_value(write, element, deterministic) - return EncodePackedField - elif is_repeated: - tag_bytes = TagBytes(field_number, wire_type) - def EncodeRepeatedField(write, value, deterministic): - for element in value: - write(tag_bytes) - encode_value(write, element, deterministic) - return EncodeRepeatedField - else: - tag_bytes = TagBytes(field_number, wire_type) - def EncodeField(write, value, deterministic): - write(tag_bytes) - return encode_value(write, value, deterministic) - return EncodeField - - return SpecificEncoder - - -def _ModifiedEncoder(wire_type, encode_value, compute_value_size, modify_value): - """Like SimpleEncoder but additionally invokes modify_value on every value - before passing it to encode_value. Usually modify_value is ZigZagEncode.""" - - def SpecificEncoder(field_number, is_repeated, is_packed): - if is_packed: - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) - local_EncodeVarint = _EncodeVarint - def EncodePackedField(write, value, deterministic): - write(tag_bytes) - size = 0 - for element in value: - size += compute_value_size(modify_value(element)) - local_EncodeVarint(write, size, deterministic) - for element in value: - encode_value(write, modify_value(element), deterministic) - return EncodePackedField - elif is_repeated: - tag_bytes = TagBytes(field_number, wire_type) - def EncodeRepeatedField(write, value, deterministic): - for element in value: - write(tag_bytes) - encode_value(write, modify_value(element), deterministic) - return EncodeRepeatedField - else: - tag_bytes = TagBytes(field_number, wire_type) - def EncodeField(write, value, deterministic): - write(tag_bytes) - return encode_value(write, modify_value(value), deterministic) - return EncodeField - - return SpecificEncoder - - -def _StructPackEncoder(wire_type, format): - """Return a constructor for an encoder for a fixed-width field. - - Args: - wire_type: The field's wire type, for encoding tags. - format: The format string to pass to struct.pack(). - """ - - value_size = struct.calcsize(format) - - def SpecificEncoder(field_number, is_repeated, is_packed): - local_struct_pack = struct.pack - if is_packed: - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) - local_EncodeVarint = _EncodeVarint - def EncodePackedField(write, value, deterministic): - write(tag_bytes) - local_EncodeVarint(write, len(value) * value_size, deterministic) - for element in value: - write(local_struct_pack(format, element)) - return EncodePackedField - elif is_repeated: - tag_bytes = TagBytes(field_number, wire_type) - def EncodeRepeatedField(write, value, unused_deterministic=None): - for element in value: - write(tag_bytes) - write(local_struct_pack(format, element)) - return EncodeRepeatedField - else: - tag_bytes = TagBytes(field_number, wire_type) - def EncodeField(write, value, unused_deterministic=None): - write(tag_bytes) - return write(local_struct_pack(format, value)) - return EncodeField - - return SpecificEncoder - - -def _FloatingPointEncoder(wire_type, format): - """Return a constructor for an encoder for float fields. - - This is like StructPackEncoder, but catches errors that may be due to - passing non-finite floating-point values to struct.pack, and makes a - second attempt to encode those values. - - Args: - wire_type: The field's wire type, for encoding tags. - format: The format string to pass to struct.pack(). - """ - - value_size = struct.calcsize(format) - if value_size == 4: - def EncodeNonFiniteOrRaise(write, value): - # Remember that the serialized form uses little-endian byte order. - if value == _POS_INF: - write(b'\x00\x00\x80\x7F') - elif value == _NEG_INF: - write(b'\x00\x00\x80\xFF') - elif value != value: # NaN - write(b'\x00\x00\xC0\x7F') - else: - raise - elif value_size == 8: - def EncodeNonFiniteOrRaise(write, value): - if value == _POS_INF: - write(b'\x00\x00\x00\x00\x00\x00\xF0\x7F') - elif value == _NEG_INF: - write(b'\x00\x00\x00\x00\x00\x00\xF0\xFF') - elif value != value: # NaN - write(b'\x00\x00\x00\x00\x00\x00\xF8\x7F') - else: - raise - else: - raise ValueError('Can\'t encode floating-point values that are ' - '%d bytes long (only 4 or 8)' % value_size) - - def SpecificEncoder(field_number, is_repeated, is_packed): - local_struct_pack = struct.pack - if is_packed: - tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) - local_EncodeVarint = _EncodeVarint - def EncodePackedField(write, value, deterministic): - write(tag_bytes) - local_EncodeVarint(write, len(value) * value_size, deterministic) - for element in value: - # This try/except block is going to be faster than any code that - # we could write to check whether element is finite. - try: - write(local_struct_pack(format, element)) - except SystemError: - EncodeNonFiniteOrRaise(write, element) - return EncodePackedField - elif is_repeated: - tag_bytes = TagBytes(field_number, wire_type) - def EncodeRepeatedField(write, value, unused_deterministic=None): - for element in value: - write(tag_bytes) - try: - write(local_struct_pack(format, element)) - except SystemError: - EncodeNonFiniteOrRaise(write, element) - return EncodeRepeatedField - else: - tag_bytes = TagBytes(field_number, wire_type) - def EncodeField(write, value, unused_deterministic=None): - write(tag_bytes) - try: - write(local_struct_pack(format, value)) - except SystemError: - EncodeNonFiniteOrRaise(write, value) - return EncodeField - - return SpecificEncoder - - -# ==================================================================== -# Here we declare an encoder constructor for each field type. These work -# very similarly to sizer constructors, described earlier. - - -Int32Encoder = Int64Encoder = EnumEncoder = _SimpleEncoder( - wire_format.WIRETYPE_VARINT, _EncodeSignedVarint, _SignedVarintSize) - -UInt32Encoder = UInt64Encoder = _SimpleEncoder( - wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize) - -SInt32Encoder = SInt64Encoder = _ModifiedEncoder( - wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize, - wire_format.ZigZagEncode) - -# Note that Python conveniently guarantees that when using the '<' prefix on -# formats, they will also have the same size across all platforms (as opposed -# to without the prefix, where their sizes depend on the C compiler's basic -# type sizes). -Fixed32Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, ' str - ValueType = int - - def __init__(self, enum_type): - """Inits EnumTypeWrapper with an EnumDescriptor.""" - self._enum_type = enum_type - self.DESCRIPTOR = enum_type # pylint: disable=invalid-name - - def Name(self, number): # pylint: disable=invalid-name - """Returns a string containing the name of an enum value.""" - try: - return self._enum_type.values_by_number[number].name - except KeyError: - pass # fall out to break exception chaining - - if not isinstance(number, int): - raise TypeError( - 'Enum value for {} must be an int, but got {} {!r}.'.format( - self._enum_type.name, type(number), number)) - else: - # repr here to handle the odd case when you pass in a boolean. - raise ValueError('Enum {} has no name defined for value {!r}'.format( - self._enum_type.name, number)) - - def Value(self, name): # pylint: disable=invalid-name - """Returns the value corresponding to the given enum name.""" - try: - return self._enum_type.values_by_name[name].number - except KeyError: - pass # fall out to break exception chaining - raise ValueError('Enum {} has no value defined for name {!r}'.format( - self._enum_type.name, name)) - - def keys(self): - """Return a list of the string names in the enum. - - Returns: - A list of strs, in the order they were defined in the .proto file. - """ - - return [value_descriptor.name - for value_descriptor in self._enum_type.values] - - def values(self): - """Return a list of the integer values in the enum. - - Returns: - A list of ints, in the order they were defined in the .proto file. - """ - - return [value_descriptor.number - for value_descriptor in self._enum_type.values] - - def items(self): - """Return a list of the (name, value) pairs of the enum. - - Returns: - A list of (str, int) pairs, in the order they were defined - in the .proto file. - """ - return [(value_descriptor.name, value_descriptor.number) - for value_descriptor in self._enum_type.values] - - def __getattr__(self, name): - """Returns the value corresponding to the given enum name.""" - try: - return super( - EnumTypeWrapper, - self).__getattribute__('_enum_type').values_by_name[name].number - except KeyError: - pass # fall out to break exception chaining - raise AttributeError('Enum {} has no value defined for name {!r}'.format( - self._enum_type.name, name)) diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/extension_dict.py b/script.module.protobuf/resources/lib/google/protobuf/internal/extension_dict.py deleted file mode 100644 index 83c4cb5dc..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/extension_dict.py +++ /dev/null @@ -1,214 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Contains _ExtensionDict class to represent extensions. -""" - -from google.protobuf.internal import type_checkers -from google.protobuf.descriptor import FieldDescriptor - - -def _VerifyExtensionHandle(message, extension_handle): - """Verify that the given extension handle is valid.""" - - if not isinstance(extension_handle, FieldDescriptor): - raise KeyError('HasExtension() expects an extension handle, got: %s' % - extension_handle) - - if not extension_handle.is_extension: - raise KeyError('"%s" is not an extension.' % extension_handle.full_name) - - if not extension_handle.containing_type: - raise KeyError('"%s" is missing a containing_type.' - % extension_handle.full_name) - - if extension_handle.containing_type is not message.DESCRIPTOR: - raise KeyError('Extension "%s" extends message type "%s", but this ' - 'message is of type "%s".' % - (extension_handle.full_name, - extension_handle.containing_type.full_name, - message.DESCRIPTOR.full_name)) - - -# TODO(robinson): Unify error handling of "unknown extension" crap. -# TODO(robinson): Support iteritems()-style iteration over all -# extensions with the "has" bits turned on? -class _ExtensionDict(object): - - """Dict-like container for Extension fields on proto instances. - - Note that in all cases we expect extension handles to be - FieldDescriptors. - """ - - def __init__(self, extended_message): - """ - Args: - extended_message: Message instance for which we are the Extensions dict. - """ - self._extended_message = extended_message - - def __getitem__(self, extension_handle): - """Returns the current value of the given extension handle.""" - - _VerifyExtensionHandle(self._extended_message, extension_handle) - - result = self._extended_message._fields.get(extension_handle) - if result is not None: - return result - - if extension_handle.label == FieldDescriptor.LABEL_REPEATED: - result = extension_handle._default_constructor(self._extended_message) - elif extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE: - message_type = extension_handle.message_type - if not hasattr(message_type, '_concrete_class'): - # pylint: disable=g-import-not-at-top - from google.protobuf import message_factory - message_factory.GetMessageClass(message_type) - assert getattr(extension_handle.message_type, '_concrete_class', None), ( - 'Uninitialized concrete class found for field %r (message type %r)' - % (extension_handle.full_name, - extension_handle.message_type.full_name)) - result = extension_handle.message_type._concrete_class() - try: - result._SetListener(self._extended_message._listener_for_children) - except ReferenceError: - pass - else: - # Singular scalar -- just return the default without inserting into the - # dict. - return extension_handle.default_value - - # Atomically check if another thread has preempted us and, if not, swap - # in the new object we just created. If someone has preempted us, we - # take that object and discard ours. - # WARNING: We are relying on setdefault() being atomic. This is true - # in CPython but we haven't investigated others. This warning appears - # in several other locations in this file. - result = self._extended_message._fields.setdefault( - extension_handle, result) - - return result - - def __eq__(self, other): - if not isinstance(other, self.__class__): - return False - - my_fields = self._extended_message.ListFields() - other_fields = other._extended_message.ListFields() - - # Get rid of non-extension fields. - my_fields = [field for field in my_fields if field.is_extension] - other_fields = [field for field in other_fields if field.is_extension] - - return my_fields == other_fields - - def __ne__(self, other): - return not self == other - - def __len__(self): - fields = self._extended_message.ListFields() - # Get rid of non-extension fields. - extension_fields = [field for field in fields if field[0].is_extension] - return len(extension_fields) - - def __hash__(self): - raise TypeError('unhashable object') - - # Note that this is only meaningful for non-repeated, scalar extension - # fields. Note also that we may have to call _Modified() when we do - # successfully set a field this way, to set any necessary "has" bits in the - # ancestors of the extended message. - def __setitem__(self, extension_handle, value): - """If extension_handle specifies a non-repeated, scalar extension - field, sets the value of that field. - """ - - _VerifyExtensionHandle(self._extended_message, extension_handle) - - if (extension_handle.label == FieldDescriptor.LABEL_REPEATED or - extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE): - raise TypeError( - 'Cannot assign to extension "%s" because it is a repeated or ' - 'composite type.' % extension_handle.full_name) - - # It's slightly wasteful to lookup the type checker each time, - # but we expect this to be a vanishingly uncommon case anyway. - type_checker = type_checkers.GetTypeChecker(extension_handle) - # pylint: disable=protected-access - self._extended_message._fields[extension_handle] = ( - type_checker.CheckValue(value)) - self._extended_message._Modified() - - def __delitem__(self, extension_handle): - self._extended_message.ClearExtension(extension_handle) - - def _FindExtensionByName(self, name): - """Tries to find a known extension with the specified name. - - Args: - name: Extension full name. - - Returns: - Extension field descriptor. - """ - return self._extended_message._extensions_by_name.get(name, None) - - def _FindExtensionByNumber(self, number): - """Tries to find a known extension with the field number. - - Args: - number: Extension field number. - - Returns: - Extension field descriptor. - """ - return self._extended_message._extensions_by_number.get(number, None) - - def __iter__(self): - # Return a generator over the populated extension fields - return (f[0] for f in self._extended_message.ListFields() - if f[0].is_extension) - - def __contains__(self, extension_handle): - _VerifyExtensionHandle(self._extended_message, extension_handle) - - if extension_handle not in self._extended_message._fields: - return False - - if extension_handle.label == FieldDescriptor.LABEL_REPEATED: - return bool(self._extended_message._fields.get(extension_handle)) - - if extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE: - value = self._extended_message._fields.get(extension_handle) - # pylint: disable=protected-access - return value is not None and value._is_present_in_parent - - return True diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/field_mask.py b/script.module.protobuf/resources/lib/google/protobuf/internal/field_mask.py deleted file mode 100644 index 489769901..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/field_mask.py +++ /dev/null @@ -1,333 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Contains FieldMask class.""" - -from google.protobuf.descriptor import FieldDescriptor - - -class FieldMask(object): - """Class for FieldMask message type.""" - - __slots__ = () - - def ToJsonString(self): - """Converts FieldMask to string according to proto3 JSON spec.""" - camelcase_paths = [] - for path in self.paths: - camelcase_paths.append(_SnakeCaseToCamelCase(path)) - return ','.join(camelcase_paths) - - def FromJsonString(self, value): - """Converts string to FieldMask according to proto3 JSON spec.""" - if not isinstance(value, str): - raise ValueError('FieldMask JSON value not a string: {!r}'.format(value)) - self.Clear() - if value: - for path in value.split(','): - self.paths.append(_CamelCaseToSnakeCase(path)) - - def IsValidForDescriptor(self, message_descriptor): - """Checks whether the FieldMask is valid for Message Descriptor.""" - for path in self.paths: - if not _IsValidPath(message_descriptor, path): - return False - return True - - def AllFieldsFromDescriptor(self, message_descriptor): - """Gets all direct fields of Message Descriptor to FieldMask.""" - self.Clear() - for field in message_descriptor.fields: - self.paths.append(field.name) - - def CanonicalFormFromMask(self, mask): - """Converts a FieldMask to the canonical form. - - Removes paths that are covered by another path. For example, - "foo.bar" is covered by "foo" and will be removed if "foo" - is also in the FieldMask. Then sorts all paths in alphabetical order. - - Args: - mask: The original FieldMask to be converted. - """ - tree = _FieldMaskTree(mask) - tree.ToFieldMask(self) - - def Union(self, mask1, mask2): - """Merges mask1 and mask2 into this FieldMask.""" - _CheckFieldMaskMessage(mask1) - _CheckFieldMaskMessage(mask2) - tree = _FieldMaskTree(mask1) - tree.MergeFromFieldMask(mask2) - tree.ToFieldMask(self) - - def Intersect(self, mask1, mask2): - """Intersects mask1 and mask2 into this FieldMask.""" - _CheckFieldMaskMessage(mask1) - _CheckFieldMaskMessage(mask2) - tree = _FieldMaskTree(mask1) - intersection = _FieldMaskTree() - for path in mask2.paths: - tree.IntersectPath(path, intersection) - intersection.ToFieldMask(self) - - def MergeMessage( - self, source, destination, - replace_message_field=False, replace_repeated_field=False): - """Merges fields specified in FieldMask from source to destination. - - Args: - source: Source message. - destination: The destination message to be merged into. - replace_message_field: Replace message field if True. Merge message - field if False. - replace_repeated_field: Replace repeated field if True. Append - elements of repeated field if False. - """ - tree = _FieldMaskTree(self) - tree.MergeMessage( - source, destination, replace_message_field, replace_repeated_field) - - -def _IsValidPath(message_descriptor, path): - """Checks whether the path is valid for Message Descriptor.""" - parts = path.split('.') - last = parts.pop() - for name in parts: - field = message_descriptor.fields_by_name.get(name) - if (field is None or - field.label == FieldDescriptor.LABEL_REPEATED or - field.type != FieldDescriptor.TYPE_MESSAGE): - return False - message_descriptor = field.message_type - return last in message_descriptor.fields_by_name - - -def _CheckFieldMaskMessage(message): - """Raises ValueError if message is not a FieldMask.""" - message_descriptor = message.DESCRIPTOR - if (message_descriptor.name != 'FieldMask' or - message_descriptor.file.name != 'google/protobuf/field_mask.proto'): - raise ValueError('Message {0} is not a FieldMask.'.format( - message_descriptor.full_name)) - - -def _SnakeCaseToCamelCase(path_name): - """Converts a path name from snake_case to camelCase.""" - result = [] - after_underscore = False - for c in path_name: - if c.isupper(): - raise ValueError( - 'Fail to print FieldMask to Json string: Path name ' - '{0} must not contain uppercase letters.'.format(path_name)) - if after_underscore: - if c.islower(): - result.append(c.upper()) - after_underscore = False - else: - raise ValueError( - 'Fail to print FieldMask to Json string: The ' - 'character after a "_" must be a lowercase letter ' - 'in path name {0}.'.format(path_name)) - elif c == '_': - after_underscore = True - else: - result += c - - if after_underscore: - raise ValueError('Fail to print FieldMask to Json string: Trailing "_" ' - 'in path name {0}.'.format(path_name)) - return ''.join(result) - - -def _CamelCaseToSnakeCase(path_name): - """Converts a field name from camelCase to snake_case.""" - result = [] - for c in path_name: - if c == '_': - raise ValueError('Fail to parse FieldMask: Path name ' - '{0} must not contain "_"s.'.format(path_name)) - if c.isupper(): - result += '_' - result += c.lower() - else: - result += c - return ''.join(result) - - -class _FieldMaskTree(object): - """Represents a FieldMask in a tree structure. - - For example, given a FieldMask "foo.bar,foo.baz,bar.baz", - the FieldMaskTree will be: - [_root] -+- foo -+- bar - | | - | +- baz - | - +- bar --- baz - In the tree, each leaf node represents a field path. - """ - - __slots__ = ('_root',) - - def __init__(self, field_mask=None): - """Initializes the tree by FieldMask.""" - self._root = {} - if field_mask: - self.MergeFromFieldMask(field_mask) - - def MergeFromFieldMask(self, field_mask): - """Merges a FieldMask to the tree.""" - for path in field_mask.paths: - self.AddPath(path) - - def AddPath(self, path): - """Adds a field path into the tree. - - If the field path to add is a sub-path of an existing field path - in the tree (i.e., a leaf node), it means the tree already matches - the given path so nothing will be added to the tree. If the path - matches an existing non-leaf node in the tree, that non-leaf node - will be turned into a leaf node with all its children removed because - the path matches all the node's children. Otherwise, a new path will - be added. - - Args: - path: The field path to add. - """ - node = self._root - for name in path.split('.'): - if name not in node: - node[name] = {} - elif not node[name]: - # Pre-existing empty node implies we already have this entire tree. - return - node = node[name] - # Remove any sub-trees we might have had. - node.clear() - - def ToFieldMask(self, field_mask): - """Converts the tree to a FieldMask.""" - field_mask.Clear() - _AddFieldPaths(self._root, '', field_mask) - - def IntersectPath(self, path, intersection): - """Calculates the intersection part of a field path with this tree. - - Args: - path: The field path to calculates. - intersection: The out tree to record the intersection part. - """ - node = self._root - for name in path.split('.'): - if name not in node: - return - elif not node[name]: - intersection.AddPath(path) - return - node = node[name] - intersection.AddLeafNodes(path, node) - - def AddLeafNodes(self, prefix, node): - """Adds leaf nodes begin with prefix to this tree.""" - if not node: - self.AddPath(prefix) - for name in node: - child_path = prefix + '.' + name - self.AddLeafNodes(child_path, node[name]) - - def MergeMessage( - self, source, destination, - replace_message, replace_repeated): - """Merge all fields specified by this tree from source to destination.""" - _MergeMessage( - self._root, source, destination, replace_message, replace_repeated) - - -def _StrConvert(value): - """Converts value to str if it is not.""" - # This file is imported by c extension and some methods like ClearField - # requires string for the field name. py2/py3 has different text - # type and may use unicode. - if not isinstance(value, str): - return value.encode('utf-8') - return value - - -def _MergeMessage( - node, source, destination, replace_message, replace_repeated): - """Merge all fields specified by a sub-tree from source to destination.""" - source_descriptor = source.DESCRIPTOR - for name in node: - child = node[name] - field = source_descriptor.fields_by_name[name] - if field is None: - raise ValueError('Error: Can\'t find field {0} in message {1}.'.format( - name, source_descriptor.full_name)) - if child: - # Sub-paths are only allowed for singular message fields. - if (field.label == FieldDescriptor.LABEL_REPEATED or - field.cpp_type != FieldDescriptor.CPPTYPE_MESSAGE): - raise ValueError('Error: Field {0} in message {1} is not a singular ' - 'message field and cannot have sub-fields.'.format( - name, source_descriptor.full_name)) - if source.HasField(name): - _MergeMessage( - child, getattr(source, name), getattr(destination, name), - replace_message, replace_repeated) - continue - if field.label == FieldDescriptor.LABEL_REPEATED: - if replace_repeated: - destination.ClearField(_StrConvert(name)) - repeated_source = getattr(source, name) - repeated_destination = getattr(destination, name) - repeated_destination.MergeFrom(repeated_source) - else: - if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE: - if replace_message: - destination.ClearField(_StrConvert(name)) - if source.HasField(name): - getattr(destination, name).MergeFrom(getattr(source, name)) - else: - setattr(destination, name, getattr(source, name)) - - -def _AddFieldPaths(node, prefix, field_mask): - """Adds the field paths descended from node to field_mask.""" - if not node and prefix: - field_mask.paths.append(prefix) - return - for name in sorted(node): - if prefix: - child_path = prefix + '.' + name - else: - child_path = name - _AddFieldPaths(node[name], child_path, field_mask) diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/message_listener.py b/script.module.protobuf/resources/lib/google/protobuf/internal/message_listener.py deleted file mode 100644 index 0fc255a77..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/message_listener.py +++ /dev/null @@ -1,78 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Defines a listener interface for observing certain -state transitions on Message objects. - -Also defines a null implementation of this interface. -""" - -__author__ = 'robinson@google.com (Will Robinson)' - - -class MessageListener(object): - - """Listens for modifications made to a message. Meant to be registered via - Message._SetListener(). - - Attributes: - dirty: If True, then calling Modified() would be a no-op. This can be - used to avoid these calls entirely in the common case. - """ - - def Modified(self): - """Called every time the message is modified in such a way that the parent - message may need to be updated. This currently means either: - (a) The message was modified for the first time, so the parent message - should henceforth mark the message as present. - (b) The message's cached byte size became dirty -- i.e. the message was - modified for the first time after a previous call to ByteSize(). - Therefore the parent should also mark its byte size as dirty. - Note that (a) implies (b), since new objects start out with a client cached - size (zero). However, we document (a) explicitly because it is important. - - Modified() will *only* be called in response to one of these two events -- - not every time the sub-message is modified. - - Note that if the listener's |dirty| attribute is true, then calling - Modified at the moment would be a no-op, so it can be skipped. Performance- - sensitive callers should check this attribute directly before calling since - it will be true most of the time. - """ - - raise NotImplementedError - - -class NullMessageListener(object): - - """No-op MessageListener implementation.""" - - def Modified(self): - pass diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/python_message.py b/script.module.protobuf/resources/lib/google/protobuf/internal/python_message.py deleted file mode 100644 index bf9acefd2..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/python_message.py +++ /dev/null @@ -1,1514 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# This code is meant to work on Python 2.4 and above only. -# -# TODO(robinson): Helpers for verbose, common checks like seeing if a -# descriptor's cpp_type is CPPTYPE_MESSAGE. - -"""Contains a metaclass and helper functions used to create -protocol message classes from Descriptor objects at runtime. - -Recall that a metaclass is the "type" of a class. -(A class is to a metaclass what an instance is to a class.) - -In this case, we use the GeneratedProtocolMessageType metaclass -to inject all the useful functionality into the classes -output by the protocol compiler at compile-time. - -The upshot of all this is that the real implementation -details for ALL pure-Python protocol buffers are *here in -this file*. -""" - -__author__ = 'robinson@google.com (Will Robinson)' - -from io import BytesIO -import struct -import sys -import weakref - -# We use "as" to avoid name collisions with variables. -from google.protobuf.internal import api_implementation -from google.protobuf.internal import containers -from google.protobuf.internal import decoder -from google.protobuf.internal import encoder -from google.protobuf.internal import enum_type_wrapper -from google.protobuf.internal import extension_dict -from google.protobuf.internal import message_listener as message_listener_mod -from google.protobuf.internal import type_checkers -from google.protobuf.internal import well_known_types -from google.protobuf.internal import wire_format -from google.protobuf import descriptor as descriptor_mod -from google.protobuf import message as message_mod -from google.protobuf import text_format - -_FieldDescriptor = descriptor_mod.FieldDescriptor -_AnyFullTypeName = 'google.protobuf.Any' -_ExtensionDict = extension_dict._ExtensionDict - -class GeneratedProtocolMessageType(type): - - """Metaclass for protocol message classes created at runtime from Descriptors. - - We add implementations for all methods described in the Message class. We - also create properties to allow getting/setting all fields in the protocol - message. Finally, we create slots to prevent users from accidentally - "setting" nonexistent fields in the protocol message, which then wouldn't get - serialized / deserialized properly. - - The protocol compiler currently uses this metaclass to create protocol - message classes at runtime. Clients can also manually create their own - classes at runtime, as in this example: - - mydescriptor = Descriptor(.....) - factory = symbol_database.Default() - factory.pool.AddDescriptor(mydescriptor) - MyProtoClass = factory.GetPrototype(mydescriptor) - myproto_instance = MyProtoClass() - myproto.foo_field = 23 - ... - """ - - # Must be consistent with the protocol-compiler code in - # proto2/compiler/internal/generator.*. - _DESCRIPTOR_KEY = 'DESCRIPTOR' - - def __new__(cls, name, bases, dictionary): - """Custom allocation for runtime-generated class types. - - We override __new__ because this is apparently the only place - where we can meaningfully set __slots__ on the class we're creating(?). - (The interplay between metaclasses and slots is not very well-documented). - - Args: - name: Name of the class (ignored, but required by the - metaclass protocol). - bases: Base classes of the class we're constructing. - (Should be message.Message). We ignore this field, but - it's required by the metaclass protocol - dictionary: The class dictionary of the class we're - constructing. dictionary[_DESCRIPTOR_KEY] must contain - a Descriptor object describing this protocol message - type. - - Returns: - Newly-allocated class. - - Raises: - RuntimeError: Generated code only work with python cpp extension. - """ - descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] - - if isinstance(descriptor, str): - raise RuntimeError('The generated code only work with python cpp ' - 'extension, but it is using pure python runtime.') - - # If a concrete class already exists for this descriptor, don't try to - # create another. Doing so will break any messages that already exist with - # the existing class. - # - # The C++ implementation appears to have its own internal `PyMessageFactory` - # to achieve similar results. - # - # This most commonly happens in `text_format.py` when using descriptors from - # a custom pool; it calls symbol_database.Global().getPrototype() on a - # descriptor which already has an existing concrete class. - new_class = getattr(descriptor, '_concrete_class', None) - if new_class: - return new_class - - if descriptor.full_name in well_known_types.WKTBASES: - bases += (well_known_types.WKTBASES[descriptor.full_name],) - _AddClassAttributesForNestedExtensions(descriptor, dictionary) - _AddSlots(descriptor, dictionary) - - superclass = super(GeneratedProtocolMessageType, cls) - new_class = superclass.__new__(cls, name, bases, dictionary) - return new_class - - def __init__(cls, name, bases, dictionary): - """Here we perform the majority of our work on the class. - We add enum getters, an __init__ method, implementations - of all Message methods, and properties for all fields - in the protocol type. - - Args: - name: Name of the class (ignored, but required by the - metaclass protocol). - bases: Base classes of the class we're constructing. - (Should be message.Message). We ignore this field, but - it's required by the metaclass protocol - dictionary: The class dictionary of the class we're - constructing. dictionary[_DESCRIPTOR_KEY] must contain - a Descriptor object describing this protocol message - type. - """ - descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] - - # If this is an _existing_ class looked up via `_concrete_class` in the - # __new__ method above, then we don't need to re-initialize anything. - existing_class = getattr(descriptor, '_concrete_class', None) - if existing_class: - assert existing_class is cls, ( - 'Duplicate `GeneratedProtocolMessageType` created for descriptor %r' - % (descriptor.full_name)) - return - - cls._decoders_by_tag = {} - if (descriptor.has_options and - descriptor.GetOptions().message_set_wire_format): - cls._decoders_by_tag[decoder.MESSAGE_SET_ITEM_TAG] = ( - decoder.MessageSetItemDecoder(descriptor), None) - - # Attach stuff to each FieldDescriptor for quick lookup later on. - for field in descriptor.fields: - _AttachFieldHelpers(cls, field) - - descriptor._concrete_class = cls # pylint: disable=protected-access - _AddEnumValues(descriptor, cls) - _AddInitMethod(descriptor, cls) - _AddPropertiesForFields(descriptor, cls) - _AddPropertiesForExtensions(descriptor, cls) - _AddStaticMethods(cls) - _AddMessageMethods(descriptor, cls) - _AddPrivateHelperMethods(descriptor, cls) - - superclass = super(GeneratedProtocolMessageType, cls) - superclass.__init__(name, bases, dictionary) - - -# Stateless helpers for GeneratedProtocolMessageType below. -# Outside clients should not access these directly. -# -# I opted not to make any of these methods on the metaclass, to make it more -# clear that I'm not really using any state there and to keep clients from -# thinking that they have direct access to these construction helpers. - - -def _PropertyName(proto_field_name): - """Returns the name of the public property attribute which - clients can use to get and (in some cases) set the value - of a protocol message field. - - Args: - proto_field_name: The protocol message field name, exactly - as it appears (or would appear) in a .proto file. - """ - # TODO(robinson): Escape Python keywords (e.g., yield), and test this support. - # nnorwitz makes my day by writing: - # """ - # FYI. See the keyword module in the stdlib. This could be as simple as: - # - # if keyword.iskeyword(proto_field_name): - # return proto_field_name + "_" - # return proto_field_name - # """ - # Kenton says: The above is a BAD IDEA. People rely on being able to use - # getattr() and setattr() to reflectively manipulate field values. If we - # rename the properties, then every such user has to also make sure to apply - # the same transformation. Note that currently if you name a field "yield", - # you can still access it just fine using getattr/setattr -- it's not even - # that cumbersome to do so. - # TODO(kenton): Remove this method entirely if/when everyone agrees with my - # position. - return proto_field_name - - -def _AddSlots(message_descriptor, dictionary): - """Adds a __slots__ entry to dictionary, containing the names of all valid - attributes for this message type. - - Args: - message_descriptor: A Descriptor instance describing this message type. - dictionary: Class dictionary to which we'll add a '__slots__' entry. - """ - dictionary['__slots__'] = ['_cached_byte_size', - '_cached_byte_size_dirty', - '_fields', - '_unknown_fields', - '_unknown_field_set', - '_is_present_in_parent', - '_listener', - '_listener_for_children', - '__weakref__', - '_oneofs'] - - -def _IsMessageSetExtension(field): - return (field.is_extension and - field.containing_type.has_options and - field.containing_type.GetOptions().message_set_wire_format and - field.type == _FieldDescriptor.TYPE_MESSAGE and - field.label == _FieldDescriptor.LABEL_OPTIONAL) - - -def _IsMapField(field): - return (field.type == _FieldDescriptor.TYPE_MESSAGE and - field.message_type.has_options and - field.message_type.GetOptions().map_entry) - - -def _IsMessageMapField(field): - value_type = field.message_type.fields_by_name['value'] - return value_type.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE - - -def _AttachFieldHelpers(cls, field_descriptor): - is_repeated = (field_descriptor.label == _FieldDescriptor.LABEL_REPEATED) - is_map_entry = _IsMapField(field_descriptor) - is_packed = field_descriptor.is_packed - - if is_map_entry: - field_encoder = encoder.MapEncoder(field_descriptor) - sizer = encoder.MapSizer(field_descriptor, - _IsMessageMapField(field_descriptor)) - elif _IsMessageSetExtension(field_descriptor): - field_encoder = encoder.MessageSetItemEncoder(field_descriptor.number) - sizer = encoder.MessageSetItemSizer(field_descriptor.number) - else: - field_encoder = type_checkers.TYPE_TO_ENCODER[field_descriptor.type]( - field_descriptor.number, is_repeated, is_packed) - sizer = type_checkers.TYPE_TO_SIZER[field_descriptor.type]( - field_descriptor.number, is_repeated, is_packed) - - field_descriptor._encoder = field_encoder - field_descriptor._sizer = sizer - field_descriptor._default_constructor = _DefaultValueConstructorForField( - field_descriptor) - - def AddDecoder(wiretype, is_packed): - tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype) - decode_type = field_descriptor.type - if (decode_type == _FieldDescriptor.TYPE_ENUM and - not field_descriptor.enum_type.is_closed): - decode_type = _FieldDescriptor.TYPE_INT32 - - oneof_descriptor = None - if field_descriptor.containing_oneof is not None: - oneof_descriptor = field_descriptor - - if is_map_entry: - is_message_map = _IsMessageMapField(field_descriptor) - - field_decoder = decoder.MapDecoder( - field_descriptor, _GetInitializeDefaultForMap(field_descriptor), - is_message_map) - elif decode_type == _FieldDescriptor.TYPE_STRING: - field_decoder = decoder.StringDecoder( - field_descriptor.number, is_repeated, is_packed, - field_descriptor, field_descriptor._default_constructor, - not field_descriptor.has_presence) - elif field_descriptor.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - field_decoder = type_checkers.TYPE_TO_DECODER[decode_type]( - field_descriptor.number, is_repeated, is_packed, - field_descriptor, field_descriptor._default_constructor) - else: - field_decoder = type_checkers.TYPE_TO_DECODER[decode_type]( - field_descriptor.number, is_repeated, is_packed, - # pylint: disable=protected-access - field_descriptor, field_descriptor._default_constructor, - not field_descriptor.has_presence) - - cls._decoders_by_tag[tag_bytes] = (field_decoder, oneof_descriptor) - - AddDecoder(type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type], - False) - - if is_repeated and wire_format.IsTypePackable(field_descriptor.type): - # To support wire compatibility of adding packed = true, add a decoder for - # packed values regardless of the field's options. - AddDecoder(wire_format.WIRETYPE_LENGTH_DELIMITED, True) - - -def _AddClassAttributesForNestedExtensions(descriptor, dictionary): - extensions = descriptor.extensions_by_name - for extension_name, extension_field in extensions.items(): - assert extension_name not in dictionary - dictionary[extension_name] = extension_field - - -def _AddEnumValues(descriptor, cls): - """Sets class-level attributes for all enum fields defined in this message. - - Also exporting a class-level object that can name enum values. - - Args: - descriptor: Descriptor object for this message type. - cls: Class we're constructing for this message type. - """ - for enum_type in descriptor.enum_types: - setattr(cls, enum_type.name, enum_type_wrapper.EnumTypeWrapper(enum_type)) - for enum_value in enum_type.values: - setattr(cls, enum_value.name, enum_value.number) - - -def _GetInitializeDefaultForMap(field): - if field.label != _FieldDescriptor.LABEL_REPEATED: - raise ValueError('map_entry set on non-repeated field %s' % ( - field.name)) - fields_by_name = field.message_type.fields_by_name - key_checker = type_checkers.GetTypeChecker(fields_by_name['key']) - - value_field = fields_by_name['value'] - if _IsMessageMapField(field): - def MakeMessageMapDefault(message): - return containers.MessageMap( - message._listener_for_children, value_field.message_type, key_checker, - field.message_type) - return MakeMessageMapDefault - else: - value_checker = type_checkers.GetTypeChecker(value_field) - def MakePrimitiveMapDefault(message): - return containers.ScalarMap( - message._listener_for_children, key_checker, value_checker, - field.message_type) - return MakePrimitiveMapDefault - -def _DefaultValueConstructorForField(field): - """Returns a function which returns a default value for a field. - - Args: - field: FieldDescriptor object for this field. - - The returned function has one argument: - message: Message instance containing this field, or a weakref proxy - of same. - - That function in turn returns a default value for this field. The default - value may refer back to |message| via a weak reference. - """ - - if _IsMapField(field): - return _GetInitializeDefaultForMap(field) - - if field.label == _FieldDescriptor.LABEL_REPEATED: - if field.has_default_value and field.default_value != []: - raise ValueError('Repeated field default value not empty list: %s' % ( - field.default_value)) - if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - # We can't look at _concrete_class yet since it might not have - # been set. (Depends on order in which we initialize the classes). - message_type = field.message_type - def MakeRepeatedMessageDefault(message): - return containers.RepeatedCompositeFieldContainer( - message._listener_for_children, field.message_type) - return MakeRepeatedMessageDefault - else: - type_checker = type_checkers.GetTypeChecker(field) - def MakeRepeatedScalarDefault(message): - return containers.RepeatedScalarFieldContainer( - message._listener_for_children, type_checker) - return MakeRepeatedScalarDefault - - if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - # _concrete_class may not yet be initialized. - message_type = field.message_type - def MakeSubMessageDefault(message): - assert getattr(message_type, '_concrete_class', None), ( - 'Uninitialized concrete class found for field %r (message type %r)' - % (field.full_name, message_type.full_name)) - result = message_type._concrete_class() - result._SetListener( - _OneofListener(message, field) - if field.containing_oneof is not None - else message._listener_for_children) - return result - return MakeSubMessageDefault - - def MakeScalarDefault(message): - # TODO(protobuf-team): This may be broken since there may not be - # default_value. Combine with has_default_value somehow. - return field.default_value - return MakeScalarDefault - - -def _ReraiseTypeErrorWithFieldName(message_name, field_name): - """Re-raise the currently-handled TypeError with the field name added.""" - exc = sys.exc_info()[1] - if len(exc.args) == 1 and type(exc) is TypeError: - # simple TypeError; add field name to exception message - exc = TypeError('%s for field %s.%s' % (str(exc), message_name, field_name)) - - # re-raise possibly-amended exception with original traceback: - raise exc.with_traceback(sys.exc_info()[2]) - - -def _AddInitMethod(message_descriptor, cls): - """Adds an __init__ method to cls.""" - - def _GetIntegerEnumValue(enum_type, value): - """Convert a string or integer enum value to an integer. - - If the value is a string, it is converted to the enum value in - enum_type with the same name. If the value is not a string, it's - returned as-is. (No conversion or bounds-checking is done.) - """ - if isinstance(value, str): - try: - return enum_type.values_by_name[value].number - except KeyError: - raise ValueError('Enum type %s: unknown label "%s"' % ( - enum_type.full_name, value)) - return value - - def init(self, **kwargs): - self._cached_byte_size = 0 - self._cached_byte_size_dirty = len(kwargs) > 0 - self._fields = {} - # Contains a mapping from oneof field descriptors to the descriptor - # of the currently set field in that oneof field. - self._oneofs = {} - - # _unknown_fields is () when empty for efficiency, and will be turned into - # a list if fields are added. - self._unknown_fields = () - # _unknown_field_set is None when empty for efficiency, and will be - # turned into UnknownFieldSet struct if fields are added. - self._unknown_field_set = None # pylint: disable=protected-access - self._is_present_in_parent = False - self._listener = message_listener_mod.NullMessageListener() - self._listener_for_children = _Listener(self) - for field_name, field_value in kwargs.items(): - field = _GetFieldByName(message_descriptor, field_name) - if field is None: - raise TypeError('%s() got an unexpected keyword argument "%s"' % - (message_descriptor.name, field_name)) - if field_value is None: - # field=None is the same as no field at all. - continue - if field.label == _FieldDescriptor.LABEL_REPEATED: - copy = field._default_constructor(self) - if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite - if _IsMapField(field): - if _IsMessageMapField(field): - for key in field_value: - copy[key].MergeFrom(field_value[key]) - else: - copy.update(field_value) - else: - for val in field_value: - if isinstance(val, dict): - copy.add(**val) - else: - copy.add().MergeFrom(val) - else: # Scalar - if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: - field_value = [_GetIntegerEnumValue(field.enum_type, val) - for val in field_value] - copy.extend(field_value) - self._fields[field] = copy - elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - copy = field._default_constructor(self) - new_val = field_value - if isinstance(field_value, dict): - new_val = field.message_type._concrete_class(**field_value) - try: - copy.MergeFrom(new_val) - except TypeError: - _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) - self._fields[field] = copy - else: - if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: - field_value = _GetIntegerEnumValue(field.enum_type, field_value) - try: - setattr(self, field_name, field_value) - except TypeError: - _ReraiseTypeErrorWithFieldName(message_descriptor.name, field_name) - - init.__module__ = None - init.__doc__ = None - cls.__init__ = init - - -def _GetFieldByName(message_descriptor, field_name): - """Returns a field descriptor by field name. - - Args: - message_descriptor: A Descriptor describing all fields in message. - field_name: The name of the field to retrieve. - Returns: - The field descriptor associated with the field name. - """ - try: - return message_descriptor.fields_by_name[field_name] - except KeyError: - raise ValueError('Protocol message %s has no "%s" field.' % - (message_descriptor.name, field_name)) - - -def _AddPropertiesForFields(descriptor, cls): - """Adds properties for all fields in this protocol message type.""" - for field in descriptor.fields: - _AddPropertiesForField(field, cls) - - if descriptor.is_extendable: - # _ExtensionDict is just an adaptor with no state so we allocate a new one - # every time it is accessed. - cls.Extensions = property(lambda self: _ExtensionDict(self)) - - -def _AddPropertiesForField(field, cls): - """Adds a public property for a protocol message field. - Clients can use this property to get and (in the case - of non-repeated scalar fields) directly set the value - of a protocol message field. - - Args: - field: A FieldDescriptor for this field. - cls: The class we're constructing. - """ - # Catch it if we add other types that we should - # handle specially here. - assert _FieldDescriptor.MAX_CPPTYPE == 10 - - constant_name = field.name.upper() + '_FIELD_NUMBER' - setattr(cls, constant_name, field.number) - - if field.label == _FieldDescriptor.LABEL_REPEATED: - _AddPropertiesForRepeatedField(field, cls) - elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - _AddPropertiesForNonRepeatedCompositeField(field, cls) - else: - _AddPropertiesForNonRepeatedScalarField(field, cls) - - -class _FieldProperty(property): - __slots__ = ('DESCRIPTOR',) - - def __init__(self, descriptor, getter, setter, doc): - property.__init__(self, getter, setter, doc=doc) - self.DESCRIPTOR = descriptor - - -def _AddPropertiesForRepeatedField(field, cls): - """Adds a public property for a "repeated" protocol message field. Clients - can use this property to get the value of the field, which will be either a - RepeatedScalarFieldContainer or RepeatedCompositeFieldContainer (see - below). - - Note that when clients add values to these containers, we perform - type-checking in the case of repeated scalar fields, and we also set any - necessary "has" bits as a side-effect. - - Args: - field: A FieldDescriptor for this field. - cls: The class we're constructing. - """ - proto_field_name = field.name - property_name = _PropertyName(proto_field_name) - - def getter(self): - field_value = self._fields.get(field) - if field_value is None: - # Construct a new object to represent this field. - field_value = field._default_constructor(self) - - # Atomically check if another thread has preempted us and, if not, swap - # in the new object we just created. If someone has preempted us, we - # take that object and discard ours. - # WARNING: We are relying on setdefault() being atomic. This is true - # in CPython but we haven't investigated others. This warning appears - # in several other locations in this file. - field_value = self._fields.setdefault(field, field_value) - return field_value - getter.__module__ = None - getter.__doc__ = 'Getter for %s.' % proto_field_name - - # We define a setter just so we can throw an exception with a more - # helpful error message. - def setter(self, new_value): - raise AttributeError('Assignment not allowed to repeated field ' - '"%s" in protocol message object.' % proto_field_name) - - doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name - setattr(cls, property_name, _FieldProperty(field, getter, setter, doc=doc)) - - -def _AddPropertiesForNonRepeatedScalarField(field, cls): - """Adds a public property for a nonrepeated, scalar protocol message field. - Clients can use this property to get and directly set the value of the field. - Note that when the client sets the value of a field by using this property, - all necessary "has" bits are set as a side-effect, and we also perform - type-checking. - - Args: - field: A FieldDescriptor for this field. - cls: The class we're constructing. - """ - proto_field_name = field.name - property_name = _PropertyName(proto_field_name) - type_checker = type_checkers.GetTypeChecker(field) - default_value = field.default_value - - def getter(self): - # TODO(protobuf-team): This may be broken since there may not be - # default_value. Combine with has_default_value somehow. - return self._fields.get(field, default_value) - getter.__module__ = None - getter.__doc__ = 'Getter for %s.' % proto_field_name - - def field_setter(self, new_value): - # pylint: disable=protected-access - # Testing the value for truthiness captures all of the proto3 defaults - # (0, 0.0, enum 0, and False). - try: - new_value = type_checker.CheckValue(new_value) - except TypeError as e: - raise TypeError( - 'Cannot set %s to %.1024r: %s' % (field.full_name, new_value, e)) - if not field.has_presence and not new_value: - self._fields.pop(field, None) - else: - self._fields[field] = new_value - # Check _cached_byte_size_dirty inline to improve performance, since scalar - # setters are called frequently. - if not self._cached_byte_size_dirty: - self._Modified() - - if field.containing_oneof: - def setter(self, new_value): - field_setter(self, new_value) - self._UpdateOneofState(field) - else: - setter = field_setter - - setter.__module__ = None - setter.__doc__ = 'Setter for %s.' % proto_field_name - - # Add a property to encapsulate the getter/setter. - doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name - setattr(cls, property_name, _FieldProperty(field, getter, setter, doc=doc)) - - -def _AddPropertiesForNonRepeatedCompositeField(field, cls): - """Adds a public property for a nonrepeated, composite protocol message field. - A composite field is a "group" or "message" field. - - Clients can use this property to get the value of the field, but cannot - assign to the property directly. - - Args: - field: A FieldDescriptor for this field. - cls: The class we're constructing. - """ - # TODO(robinson): Remove duplication with similar method - # for non-repeated scalars. - proto_field_name = field.name - property_name = _PropertyName(proto_field_name) - - def getter(self): - field_value = self._fields.get(field) - if field_value is None: - # Construct a new object to represent this field. - field_value = field._default_constructor(self) - - # Atomically check if another thread has preempted us and, if not, swap - # in the new object we just created. If someone has preempted us, we - # take that object and discard ours. - # WARNING: We are relying on setdefault() being atomic. This is true - # in CPython but we haven't investigated others. This warning appears - # in several other locations in this file. - field_value = self._fields.setdefault(field, field_value) - return field_value - getter.__module__ = None - getter.__doc__ = 'Getter for %s.' % proto_field_name - - # We define a setter just so we can throw an exception with a more - # helpful error message. - def setter(self, new_value): - raise AttributeError('Assignment not allowed to composite field ' - '"%s" in protocol message object.' % proto_field_name) - - # Add a property to encapsulate the getter. - doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name - setattr(cls, property_name, _FieldProperty(field, getter, setter, doc=doc)) - - -def _AddPropertiesForExtensions(descriptor, cls): - """Adds properties for all fields in this protocol message type.""" - extensions = descriptor.extensions_by_name - for extension_name, extension_field in extensions.items(): - constant_name = extension_name.upper() + '_FIELD_NUMBER' - setattr(cls, constant_name, extension_field.number) - - # TODO(amauryfa): Migrate all users of these attributes to functions like - # pool.FindExtensionByNumber(descriptor). - if descriptor.file is not None: - # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available. - pool = descriptor.file.pool - cls._extensions_by_number = pool._extensions_by_number[descriptor] - cls._extensions_by_name = pool._extensions_by_name[descriptor] - -def _AddStaticMethods(cls): - # TODO(robinson): This probably needs to be thread-safe(?) - def RegisterExtension(field_descriptor): - field_descriptor.containing_type = cls.DESCRIPTOR - # TODO(amauryfa): Use cls.MESSAGE_FACTORY.pool when available. - # pylint: disable=protected-access - cls.DESCRIPTOR.file.pool._AddExtensionDescriptor(field_descriptor) - _AttachFieldHelpers(cls, field_descriptor) - cls.RegisterExtension = staticmethod(RegisterExtension) - - def FromString(s): - message = cls() - message.MergeFromString(s) - return message - cls.FromString = staticmethod(FromString) - - -def _IsPresent(item): - """Given a (FieldDescriptor, value) tuple from _fields, return true if the - value should be included in the list returned by ListFields().""" - - if item[0].label == _FieldDescriptor.LABEL_REPEATED: - return bool(item[1]) - elif item[0].cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - return item[1]._is_present_in_parent - else: - return True - - -def _AddListFieldsMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - - def ListFields(self): - all_fields = [item for item in self._fields.items() if _IsPresent(item)] - all_fields.sort(key = lambda item: item[0].number) - return all_fields - - cls.ListFields = ListFields - - -def _AddHasFieldMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - - hassable_fields = {} - for field in message_descriptor.fields: - if field.label == _FieldDescriptor.LABEL_REPEATED: - continue - # For proto3, only submessages and fields inside a oneof have presence. - if not field.has_presence: - continue - hassable_fields[field.name] = field - - # Has methods are supported for oneof descriptors. - for oneof in message_descriptor.oneofs: - hassable_fields[oneof.name] = oneof - - def HasField(self, field_name): - try: - field = hassable_fields[field_name] - except KeyError as exc: - raise ValueError('Protocol message %s has no non-repeated field "%s" ' - 'nor has presence is not available for this field.' % ( - message_descriptor.full_name, field_name)) from exc - - if isinstance(field, descriptor_mod.OneofDescriptor): - try: - return HasField(self, self._oneofs[field].name) - except KeyError: - return False - else: - if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - value = self._fields.get(field) - return value is not None and value._is_present_in_parent - else: - return field in self._fields - - cls.HasField = HasField - - -def _AddClearFieldMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - def ClearField(self, field_name): - try: - field = message_descriptor.fields_by_name[field_name] - except KeyError: - try: - field = message_descriptor.oneofs_by_name[field_name] - if field in self._oneofs: - field = self._oneofs[field] - else: - return - except KeyError: - raise ValueError('Protocol message %s has no "%s" field.' % - (message_descriptor.name, field_name)) - - if field in self._fields: - # To match the C++ implementation, we need to invalidate iterators - # for map fields when ClearField() happens. - if hasattr(self._fields[field], 'InvalidateIterators'): - self._fields[field].InvalidateIterators() - - # Note: If the field is a sub-message, its listener will still point - # at us. That's fine, because the worst than can happen is that it - # will call _Modified() and invalidate our byte size. Big deal. - del self._fields[field] - - if self._oneofs.get(field.containing_oneof, None) is field: - del self._oneofs[field.containing_oneof] - - # Always call _Modified() -- even if nothing was changed, this is - # a mutating method, and thus calling it should cause the field to become - # present in the parent message. - self._Modified() - - cls.ClearField = ClearField - - -def _AddClearExtensionMethod(cls): - """Helper for _AddMessageMethods().""" - def ClearExtension(self, field_descriptor): - extension_dict._VerifyExtensionHandle(self, field_descriptor) - - # Similar to ClearField(), above. - if field_descriptor in self._fields: - del self._fields[field_descriptor] - self._Modified() - cls.ClearExtension = ClearExtension - - -def _AddHasExtensionMethod(cls): - """Helper for _AddMessageMethods().""" - def HasExtension(self, field_descriptor): - extension_dict._VerifyExtensionHandle(self, field_descriptor) - if field_descriptor.label == _FieldDescriptor.LABEL_REPEATED: - raise KeyError('"%s" is repeated.' % field_descriptor.full_name) - - if field_descriptor.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - value = self._fields.get(field_descriptor) - return value is not None and value._is_present_in_parent - else: - return field_descriptor in self._fields - cls.HasExtension = HasExtension - -def _InternalUnpackAny(msg): - """Unpacks Any message and returns the unpacked message. - - This internal method is different from public Any Unpack method which takes - the target message as argument. _InternalUnpackAny method does not have - target message type and need to find the message type in descriptor pool. - - Args: - msg: An Any message to be unpacked. - - Returns: - The unpacked message. - """ - # TODO(amauryfa): Don't use the factory of generated messages. - # To make Any work with custom factories, use the message factory of the - # parent message. - # pylint: disable=g-import-not-at-top - from google.protobuf import symbol_database - factory = symbol_database.Default() - - type_url = msg.type_url - - if not type_url: - return None - - # TODO(haberman): For now we just strip the hostname. Better logic will be - # required. - type_name = type_url.split('/')[-1] - descriptor = factory.pool.FindMessageTypeByName(type_name) - - if descriptor is None: - return None - - message_class = factory.GetPrototype(descriptor) - message = message_class() - - message.ParseFromString(msg.value) - return message - - -def _AddEqualsMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - def __eq__(self, other): - if (not isinstance(other, message_mod.Message) or - other.DESCRIPTOR != self.DESCRIPTOR): - return False - - if self is other: - return True - - if self.DESCRIPTOR.full_name == _AnyFullTypeName: - any_a = _InternalUnpackAny(self) - any_b = _InternalUnpackAny(other) - if any_a and any_b: - return any_a == any_b - - if not self.ListFields() == other.ListFields(): - return False - - # TODO(jieluo): Fix UnknownFieldSet to consider MessageSet extensions, - # then use it for the comparison. - unknown_fields = list(self._unknown_fields) - unknown_fields.sort() - other_unknown_fields = list(other._unknown_fields) - other_unknown_fields.sort() - return unknown_fields == other_unknown_fields - - cls.__eq__ = __eq__ - - -def _AddStrMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - def __str__(self): - return text_format.MessageToString(self) - cls.__str__ = __str__ - - -def _AddReprMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - def __repr__(self): - return text_format.MessageToString(self) - cls.__repr__ = __repr__ - - -def _AddUnicodeMethod(unused_message_descriptor, cls): - """Helper for _AddMessageMethods().""" - - def __unicode__(self): - return text_format.MessageToString(self, as_utf8=True).decode('utf-8') - cls.__unicode__ = __unicode__ - - -def _BytesForNonRepeatedElement(value, field_number, field_type): - """Returns the number of bytes needed to serialize a non-repeated element. - The returned byte count includes space for tag information and any - other additional space associated with serializing value. - - Args: - value: Value we're serializing. - field_number: Field number of this value. (Since the field number - is stored as part of a varint-encoded tag, this has an impact - on the total bytes required to serialize the value). - field_type: The type of the field. One of the TYPE_* constants - within FieldDescriptor. - """ - try: - fn = type_checkers.TYPE_TO_BYTE_SIZE_FN[field_type] - return fn(field_number, value) - except KeyError: - raise message_mod.EncodeError('Unrecognized field type: %d' % field_type) - - -def _AddByteSizeMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - - def ByteSize(self): - if not self._cached_byte_size_dirty: - return self._cached_byte_size - - size = 0 - descriptor = self.DESCRIPTOR - if descriptor.GetOptions().map_entry: - # Fields of map entry should always be serialized. - size = descriptor.fields_by_name['key']._sizer(self.key) - size += descriptor.fields_by_name['value']._sizer(self.value) - else: - for field_descriptor, field_value in self.ListFields(): - size += field_descriptor._sizer(field_value) - for tag_bytes, value_bytes in self._unknown_fields: - size += len(tag_bytes) + len(value_bytes) - - self._cached_byte_size = size - self._cached_byte_size_dirty = False - self._listener_for_children.dirty = False - return size - - cls.ByteSize = ByteSize - - -def _AddSerializeToStringMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - - def SerializeToString(self, **kwargs): - # Check if the message has all of its required fields set. - if not self.IsInitialized(): - raise message_mod.EncodeError( - 'Message %s is missing required fields: %s' % ( - self.DESCRIPTOR.full_name, ','.join(self.FindInitializationErrors()))) - return self.SerializePartialToString(**kwargs) - cls.SerializeToString = SerializeToString - - -def _AddSerializePartialToStringMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - - def SerializePartialToString(self, **kwargs): - out = BytesIO() - self._InternalSerialize(out.write, **kwargs) - return out.getvalue() - cls.SerializePartialToString = SerializePartialToString - - def InternalSerialize(self, write_bytes, deterministic=None): - if deterministic is None: - deterministic = ( - api_implementation.IsPythonDefaultSerializationDeterministic()) - else: - deterministic = bool(deterministic) - - descriptor = self.DESCRIPTOR - if descriptor.GetOptions().map_entry: - # Fields of map entry should always be serialized. - descriptor.fields_by_name['key']._encoder( - write_bytes, self.key, deterministic) - descriptor.fields_by_name['value']._encoder( - write_bytes, self.value, deterministic) - else: - for field_descriptor, field_value in self.ListFields(): - field_descriptor._encoder(write_bytes, field_value, deterministic) - for tag_bytes, value_bytes in self._unknown_fields: - write_bytes(tag_bytes) - write_bytes(value_bytes) - cls._InternalSerialize = InternalSerialize - - -def _AddMergeFromStringMethod(message_descriptor, cls): - """Helper for _AddMessageMethods().""" - def MergeFromString(self, serialized): - serialized = memoryview(serialized) - length = len(serialized) - try: - if self._InternalParse(serialized, 0, length) != length: - # The only reason _InternalParse would return early is if it - # encountered an end-group tag. - raise message_mod.DecodeError('Unexpected end-group tag.') - except (IndexError, TypeError): - # Now ord(buf[p:p+1]) == ord('') gets TypeError. - raise message_mod.DecodeError('Truncated message.') - except struct.error as e: - raise message_mod.DecodeError(e) - return length # Return this for legacy reasons. - cls.MergeFromString = MergeFromString - - local_ReadTag = decoder.ReadTag - local_SkipField = decoder.SkipField - decoders_by_tag = cls._decoders_by_tag - - def InternalParse(self, buffer, pos, end): - """Create a message from serialized bytes. - - Args: - self: Message, instance of the proto message object. - buffer: memoryview of the serialized data. - pos: int, position to start in the serialized data. - end: int, end position of the serialized data. - - Returns: - Message object. - """ - # Guard against internal misuse, since this function is called internally - # quite extensively, and its easy to accidentally pass bytes. - assert isinstance(buffer, memoryview) - self._Modified() - field_dict = self._fields - # pylint: disable=protected-access - unknown_field_set = self._unknown_field_set - while pos != end: - (tag_bytes, new_pos) = local_ReadTag(buffer, pos) - field_decoder, field_desc = decoders_by_tag.get(tag_bytes, (None, None)) - if field_decoder is None: - if not self._unknown_fields: # pylint: disable=protected-access - self._unknown_fields = [] # pylint: disable=protected-access - if unknown_field_set is None: - # pylint: disable=protected-access - self._unknown_field_set = containers.UnknownFieldSet() - # pylint: disable=protected-access - unknown_field_set = self._unknown_field_set - # pylint: disable=protected-access - (tag, _) = decoder._DecodeVarint(tag_bytes, 0) - field_number, wire_type = wire_format.UnpackTag(tag) - if field_number == 0: - raise message_mod.DecodeError('Field number 0 is illegal.') - # TODO(jieluo): remove old_pos. - old_pos = new_pos - (data, new_pos) = decoder._DecodeUnknownField( - buffer, new_pos, wire_type) # pylint: disable=protected-access - if new_pos == -1: - return pos - # pylint: disable=protected-access - unknown_field_set._add(field_number, wire_type, data) - # TODO(jieluo): remove _unknown_fields. - new_pos = local_SkipField(buffer, old_pos, end, tag_bytes) - if new_pos == -1: - return pos - self._unknown_fields.append( - (tag_bytes, buffer[old_pos:new_pos].tobytes())) - pos = new_pos - else: - pos = field_decoder(buffer, new_pos, end, self, field_dict) - if field_desc: - self._UpdateOneofState(field_desc) - return pos - cls._InternalParse = InternalParse - - -def _AddIsInitializedMethod(message_descriptor, cls): - """Adds the IsInitialized and FindInitializationError methods to the - protocol message class.""" - - required_fields = [field for field in message_descriptor.fields - if field.label == _FieldDescriptor.LABEL_REQUIRED] - - def IsInitialized(self, errors=None): - """Checks if all required fields of a message are set. - - Args: - errors: A list which, if provided, will be populated with the field - paths of all missing required fields. - - Returns: - True iff the specified message has all required fields set. - """ - - # Performance is critical so we avoid HasField() and ListFields(). - - for field in required_fields: - if (field not in self._fields or - (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and - not self._fields[field]._is_present_in_parent)): - if errors is not None: - errors.extend(self.FindInitializationErrors()) - return False - - for field, value in list(self._fields.items()): # dict can change size! - if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - if field.label == _FieldDescriptor.LABEL_REPEATED: - if (field.message_type.has_options and - field.message_type.GetOptions().map_entry): - continue - for element in value: - if not element.IsInitialized(): - if errors is not None: - errors.extend(self.FindInitializationErrors()) - return False - elif value._is_present_in_parent and not value.IsInitialized(): - if errors is not None: - errors.extend(self.FindInitializationErrors()) - return False - - return True - - cls.IsInitialized = IsInitialized - - def FindInitializationErrors(self): - """Finds required fields which are not initialized. - - Returns: - A list of strings. Each string is a path to an uninitialized field from - the top-level message, e.g. "foo.bar[5].baz". - """ - - errors = [] # simplify things - - for field in required_fields: - if not self.HasField(field.name): - errors.append(field.name) - - for field, value in self.ListFields(): - if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - if field.is_extension: - name = '(%s)' % field.full_name - else: - name = field.name - - if _IsMapField(field): - if _IsMessageMapField(field): - for key in value: - element = value[key] - prefix = '%s[%s].' % (name, key) - sub_errors = element.FindInitializationErrors() - errors += [prefix + error for error in sub_errors] - else: - # ScalarMaps can't have any initialization errors. - pass - elif field.label == _FieldDescriptor.LABEL_REPEATED: - for i in range(len(value)): - element = value[i] - prefix = '%s[%d].' % (name, i) - sub_errors = element.FindInitializationErrors() - errors += [prefix + error for error in sub_errors] - else: - prefix = name + '.' - sub_errors = value.FindInitializationErrors() - errors += [prefix + error for error in sub_errors] - - return errors - - cls.FindInitializationErrors = FindInitializationErrors - - -def _FullyQualifiedClassName(klass): - module = klass.__module__ - name = getattr(klass, '__qualname__', klass.__name__) - if module in (None, 'builtins', '__builtin__'): - return name - return module + '.' + name - - -def _AddMergeFromMethod(cls): - LABEL_REPEATED = _FieldDescriptor.LABEL_REPEATED - CPPTYPE_MESSAGE = _FieldDescriptor.CPPTYPE_MESSAGE - - def MergeFrom(self, msg): - if not isinstance(msg, cls): - raise TypeError( - 'Parameter to MergeFrom() must be instance of same class: ' - 'expected %s got %s.' % (_FullyQualifiedClassName(cls), - _FullyQualifiedClassName(msg.__class__))) - - assert msg is not self - self._Modified() - - fields = self._fields - - for field, value in msg._fields.items(): - if field.label == LABEL_REPEATED: - field_value = fields.get(field) - if field_value is None: - # Construct a new object to represent this field. - field_value = field._default_constructor(self) - fields[field] = field_value - field_value.MergeFrom(value) - elif field.cpp_type == CPPTYPE_MESSAGE: - if value._is_present_in_parent: - field_value = fields.get(field) - if field_value is None: - # Construct a new object to represent this field. - field_value = field._default_constructor(self) - fields[field] = field_value - field_value.MergeFrom(value) - else: - self._fields[field] = value - if field.containing_oneof: - self._UpdateOneofState(field) - - if msg._unknown_fields: - if not self._unknown_fields: - self._unknown_fields = [] - self._unknown_fields.extend(msg._unknown_fields) - # pylint: disable=protected-access - if self._unknown_field_set is None: - self._unknown_field_set = containers.UnknownFieldSet() - self._unknown_field_set._extend(msg._unknown_field_set) - - cls.MergeFrom = MergeFrom - - -def _AddWhichOneofMethod(message_descriptor, cls): - def WhichOneof(self, oneof_name): - """Returns the name of the currently set field inside a oneof, or None.""" - try: - field = message_descriptor.oneofs_by_name[oneof_name] - except KeyError: - raise ValueError( - 'Protocol message has no oneof "%s" field.' % oneof_name) - - nested_field = self._oneofs.get(field, None) - if nested_field is not None and self.HasField(nested_field.name): - return nested_field.name - else: - return None - - cls.WhichOneof = WhichOneof - - -def _Clear(self): - # Clear fields. - self._fields = {} - self._unknown_fields = () - # pylint: disable=protected-access - if self._unknown_field_set is not None: - self._unknown_field_set._clear() - self._unknown_field_set = None - - self._oneofs = {} - self._Modified() - - -def _UnknownFields(self): - if self._unknown_field_set is None: # pylint: disable=protected-access - # pylint: disable=protected-access - self._unknown_field_set = containers.UnknownFieldSet() - return self._unknown_field_set # pylint: disable=protected-access - - -def _DiscardUnknownFields(self): - self._unknown_fields = [] - self._unknown_field_set = None # pylint: disable=protected-access - for field, value in self.ListFields(): - if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: - if _IsMapField(field): - if _IsMessageMapField(field): - for key in value: - value[key].DiscardUnknownFields() - elif field.label == _FieldDescriptor.LABEL_REPEATED: - for sub_message in value: - sub_message.DiscardUnknownFields() - else: - value.DiscardUnknownFields() - - -def _SetListener(self, listener): - if listener is None: - self._listener = message_listener_mod.NullMessageListener() - else: - self._listener = listener - - -def _AddMessageMethods(message_descriptor, cls): - """Adds implementations of all Message methods to cls.""" - _AddListFieldsMethod(message_descriptor, cls) - _AddHasFieldMethod(message_descriptor, cls) - _AddClearFieldMethod(message_descriptor, cls) - if message_descriptor.is_extendable: - _AddClearExtensionMethod(cls) - _AddHasExtensionMethod(cls) - _AddEqualsMethod(message_descriptor, cls) - _AddStrMethod(message_descriptor, cls) - _AddReprMethod(message_descriptor, cls) - _AddUnicodeMethod(message_descriptor, cls) - _AddByteSizeMethod(message_descriptor, cls) - _AddSerializeToStringMethod(message_descriptor, cls) - _AddSerializePartialToStringMethod(message_descriptor, cls) - _AddMergeFromStringMethod(message_descriptor, cls) - _AddIsInitializedMethod(message_descriptor, cls) - _AddMergeFromMethod(cls) - _AddWhichOneofMethod(message_descriptor, cls) - # Adds methods which do not depend on cls. - cls.Clear = _Clear - cls.UnknownFields = _UnknownFields - cls.DiscardUnknownFields = _DiscardUnknownFields - cls._SetListener = _SetListener - - -def _AddPrivateHelperMethods(message_descriptor, cls): - """Adds implementation of private helper methods to cls.""" - - def Modified(self): - """Sets the _cached_byte_size_dirty bit to true, - and propagates this to our listener iff this was a state change. - """ - - # Note: Some callers check _cached_byte_size_dirty before calling - # _Modified() as an extra optimization. So, if this method is ever - # changed such that it does stuff even when _cached_byte_size_dirty is - # already true, the callers need to be updated. - if not self._cached_byte_size_dirty: - self._cached_byte_size_dirty = True - self._listener_for_children.dirty = True - self._is_present_in_parent = True - self._listener.Modified() - - def _UpdateOneofState(self, field): - """Sets field as the active field in its containing oneof. - - Will also delete currently active field in the oneof, if it is different - from the argument. Does not mark the message as modified. - """ - other_field = self._oneofs.setdefault(field.containing_oneof, field) - if other_field is not field: - del self._fields[other_field] - self._oneofs[field.containing_oneof] = field - - cls._Modified = Modified - cls.SetInParent = Modified - cls._UpdateOneofState = _UpdateOneofState - - -class _Listener(object): - - """MessageListener implementation that a parent message registers with its - child message. - - In order to support semantics like: - - foo.bar.baz.moo = 23 - assert foo.HasField('bar') - - ...child objects must have back references to their parents. - This helper class is at the heart of this support. - """ - - def __init__(self, parent_message): - """Args: - parent_message: The message whose _Modified() method we should call when - we receive Modified() messages. - """ - # This listener establishes a back reference from a child (contained) object - # to its parent (containing) object. We make this a weak reference to avoid - # creating cyclic garbage when the client finishes with the 'parent' object - # in the tree. - if isinstance(parent_message, weakref.ProxyType): - self._parent_message_weakref = parent_message - else: - self._parent_message_weakref = weakref.proxy(parent_message) - - # As an optimization, we also indicate directly on the listener whether - # or not the parent message is dirty. This way we can avoid traversing - # up the tree in the common case. - self.dirty = False - - def Modified(self): - if self.dirty: - return - try: - # Propagate the signal to our parents iff this is the first field set. - self._parent_message_weakref._Modified() - except ReferenceError: - # We can get here if a client has kept a reference to a child object, - # and is now setting a field on it, but the child's parent has been - # garbage-collected. This is not an error. - pass - - -class _OneofListener(_Listener): - """Special listener implementation for setting composite oneof fields.""" - - def __init__(self, parent_message, field): - """Args: - parent_message: The message whose _Modified() method we should call when - we receive Modified() messages. - field: The descriptor of the field being set in the parent message. - """ - super(_OneofListener, self).__init__(parent_message) - self._field = field - - def Modified(self): - """Also updates the state of the containing oneof in the parent message.""" - try: - self._parent_message_weakref._UpdateOneofState(self._field) - super(_OneofListener, self).Modified() - except ReferenceError: - pass diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/testing_refleaks.py b/script.module.protobuf/resources/lib/google/protobuf/internal/testing_refleaks.py deleted file mode 100644 index 5f19c46fd..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/testing_refleaks.py +++ /dev/null @@ -1,142 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""A subclass of unittest.TestCase which checks for reference leaks. - -To use: -- Use testing_refleak.BaseTestCase instead of unittest.TestCase -- Configure and compile Python with --with-pydebug - -If sys.gettotalrefcount() is not available (because Python was built without -the Py_DEBUG option), then this module is a no-op and tests will run normally. -""" - -import copyreg -import gc -import sys -import unittest - - -class LocalTestResult(unittest.TestResult): - """A TestResult which forwards events to a parent object, except for Skips.""" - - def __init__(self, parent_result): - unittest.TestResult.__init__(self) - self.parent_result = parent_result - - def addError(self, test, error): - self.parent_result.addError(test, error) - - def addFailure(self, test, error): - self.parent_result.addFailure(test, error) - - def addSkip(self, test, reason): - pass - - -class ReferenceLeakCheckerMixin(object): - """A mixin class for TestCase, which checks reference counts.""" - - NB_RUNS = 3 - - def run(self, result=None): - testMethod = getattr(self, self._testMethodName) - expecting_failure_method = getattr(testMethod, "__unittest_expecting_failure__", False) - expecting_failure_class = getattr(self, "__unittest_expecting_failure__", False) - if expecting_failure_class or expecting_failure_method: - return - - # python_message.py registers all Message classes to some pickle global - # registry, which makes the classes immortal. - # We save a copy of this registry, and reset it before we could references. - self._saved_pickle_registry = copyreg.dispatch_table.copy() - - # Run the test twice, to warm up the instance attributes. - super(ReferenceLeakCheckerMixin, self).run(result=result) - super(ReferenceLeakCheckerMixin, self).run(result=result) - - oldrefcount = 0 - local_result = LocalTestResult(result) - num_flakes = 0 - - refcount_deltas = [] - while len(refcount_deltas) < self.NB_RUNS: - oldrefcount = self._getRefcounts() - super(ReferenceLeakCheckerMixin, self).run(result=local_result) - newrefcount = self._getRefcounts() - # If the GC was able to collect some objects after the call to run() that - # it could not collect before the call, then the counts won't match. - if newrefcount < oldrefcount and num_flakes < 2: - # This result is (probably) a flake -- garbage collectors aren't very - # predictable, but a lower ending refcount is the opposite of the - # failure we are testing for. If the result is repeatable, then we will - # eventually report it, but not after trying to eliminate it. - num_flakes += 1 - continue - num_flakes = 0 - refcount_deltas.append(newrefcount - oldrefcount) - print(refcount_deltas, self) - - try: - self.assertEqual(refcount_deltas, [0] * self.NB_RUNS) - except Exception: # pylint: disable=broad-except - result.addError(self, sys.exc_info()) - - def _getRefcounts(self): - copyreg.dispatch_table.clear() - copyreg.dispatch_table.update(self._saved_pickle_registry) - # It is sometimes necessary to gc.collect() multiple times, to ensure - # that all objects can be collected. - gc.collect() - gc.collect() - gc.collect() - return sys.gettotalrefcount() - - -if hasattr(sys, 'gettotalrefcount'): - - def TestCase(test_class): - new_bases = (ReferenceLeakCheckerMixin,) + test_class.__bases__ - new_class = type(test_class)( - test_class.__name__, new_bases, dict(test_class.__dict__)) - return new_class - SkipReferenceLeakChecker = unittest.skip - -else: - # When PyDEBUG is not enabled, run the tests normally. - - def TestCase(test_class): - return test_class - - def SkipReferenceLeakChecker(reason): - del reason # Don't skip, so don't need a reason. - def Same(func): - return func - return Same diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/type_checkers.py b/script.module.protobuf/resources/lib/google/protobuf/internal/type_checkers.py deleted file mode 100644 index 165dcd8c2..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/type_checkers.py +++ /dev/null @@ -1,431 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Provides type checking routines. - -This module defines type checking utilities in the forms of dictionaries: - -VALUE_CHECKERS: A dictionary of field types and a value validation object. -TYPE_TO_BYTE_SIZE_FN: A dictionary with field types and a size computing - function. -TYPE_TO_SERIALIZE_METHOD: A dictionary with field types and serialization - function. -FIELD_TYPE_TO_WIRE_TYPE: A dictionary with field typed and their - corresponding wire types. -TYPE_TO_DESERIALIZE_METHOD: A dictionary with field types and deserialization - function. -""" - -__author__ = 'robinson@google.com (Will Robinson)' - -import ctypes -import numbers - -from google.protobuf.internal import decoder -from google.protobuf.internal import encoder -from google.protobuf.internal import wire_format -from google.protobuf import descriptor - -_FieldDescriptor = descriptor.FieldDescriptor - - -def TruncateToFourByteFloat(original): - return ctypes.c_float(original).value - - -def ToShortestFloat(original): - """Returns the shortest float that has same value in wire.""" - # All 4 byte floats have between 6 and 9 significant digits, so we - # start with 6 as the lower bound. - # It has to be iterative because use '.9g' directly can not get rid - # of the noises for most values. For example if set a float_field=0.9 - # use '.9g' will print 0.899999976. - precision = 6 - rounded = float('{0:.{1}g}'.format(original, precision)) - while TruncateToFourByteFloat(rounded) != original: - precision += 1 - rounded = float('{0:.{1}g}'.format(original, precision)) - return rounded - - -def GetTypeChecker(field): - """Returns a type checker for a message field of the specified types. - - Args: - field: FieldDescriptor object for this field. - - Returns: - An instance of TypeChecker which can be used to verify the types - of values assigned to a field of the specified type. - """ - if (field.cpp_type == _FieldDescriptor.CPPTYPE_STRING and - field.type == _FieldDescriptor.TYPE_STRING): - return UnicodeValueChecker() - if field.cpp_type == _FieldDescriptor.CPPTYPE_ENUM: - if field.enum_type.is_closed: - return EnumValueChecker(field.enum_type) - else: - # When open enums are supported, any int32 can be assigned. - return _VALUE_CHECKERS[_FieldDescriptor.CPPTYPE_INT32] - return _VALUE_CHECKERS[field.cpp_type] - - -# None of the typecheckers below make any attempt to guard against people -# subclassing builtin types and doing weird things. We're not trying to -# protect against malicious clients here, just people accidentally shooting -# themselves in the foot in obvious ways. -class TypeChecker(object): - - """Type checker used to catch type errors as early as possible - when the client is setting scalar fields in protocol messages. - """ - - def __init__(self, *acceptable_types): - self._acceptable_types = acceptable_types - - def CheckValue(self, proposed_value): - """Type check the provided value and return it. - - The returned value might have been normalized to another type. - """ - if not isinstance(proposed_value, self._acceptable_types): - message = ('%.1024r has type %s, but expected one of: %s' % - (proposed_value, type(proposed_value), self._acceptable_types)) - raise TypeError(message) - return proposed_value - - -class TypeCheckerWithDefault(TypeChecker): - - def __init__(self, default_value, *acceptable_types): - TypeChecker.__init__(self, *acceptable_types) - self._default_value = default_value - - def DefaultValue(self): - return self._default_value - - -class BoolValueChecker(object): - """Type checker used for bool fields.""" - - def CheckValue(self, proposed_value): - if not hasattr(proposed_value, '__index__') or ( - type(proposed_value).__module__ == 'numpy' and - type(proposed_value).__name__ == 'ndarray'): - message = ('%.1024r has type %s, but expected one of: %s' % - (proposed_value, type(proposed_value), (bool, int))) - raise TypeError(message) - return bool(proposed_value) - - def DefaultValue(self): - return False - - -# IntValueChecker and its subclasses perform integer type-checks -# and bounds-checks. -class IntValueChecker(object): - - """Checker used for integer fields. Performs type-check and range check.""" - - def CheckValue(self, proposed_value): - if not hasattr(proposed_value, '__index__') or ( - type(proposed_value).__module__ == 'numpy' and - type(proposed_value).__name__ == 'ndarray'): - message = ('%.1024r has type %s, but expected one of: %s' % - (proposed_value, type(proposed_value), (int,))) - raise TypeError(message) - - if not self._MIN <= int(proposed_value) <= self._MAX: - raise ValueError('Value out of range: %d' % proposed_value) - # We force all values to int to make alternate implementations where the - # distinction is more significant (e.g. the C++ implementation) simpler. - proposed_value = int(proposed_value) - return proposed_value - - def DefaultValue(self): - return 0 - - -class EnumValueChecker(object): - - """Checker used for enum fields. Performs type-check and range check.""" - - def __init__(self, enum_type): - self._enum_type = enum_type - - def CheckValue(self, proposed_value): - if not isinstance(proposed_value, numbers.Integral): - message = ('%.1024r has type %s, but expected one of: %s' % - (proposed_value, type(proposed_value), (int,))) - raise TypeError(message) - if int(proposed_value) not in self._enum_type.values_by_number: - raise ValueError('Unknown enum value: %d' % proposed_value) - return proposed_value - - def DefaultValue(self): - return self._enum_type.values[0].number - - -class UnicodeValueChecker(object): - - """Checker used for string fields. - - Always returns a unicode value, even if the input is of type str. - """ - - def CheckValue(self, proposed_value): - if not isinstance(proposed_value, (bytes, str)): - message = ('%.1024r has type %s, but expected one of: %s' % - (proposed_value, type(proposed_value), (bytes, str))) - raise TypeError(message) - - # If the value is of type 'bytes' make sure that it is valid UTF-8 data. - if isinstance(proposed_value, bytes): - try: - proposed_value = proposed_value.decode('utf-8') - except UnicodeDecodeError: - raise ValueError('%.1024r has type bytes, but isn\'t valid UTF-8 ' - 'encoding. Non-UTF-8 strings must be converted to ' - 'unicode objects before being added.' % - (proposed_value)) - else: - try: - proposed_value.encode('utf8') - except UnicodeEncodeError: - raise ValueError('%.1024r isn\'t a valid unicode string and ' - 'can\'t be encoded in UTF-8.'% - (proposed_value)) - - return proposed_value - - def DefaultValue(self): - return u"" - - -class Int32ValueChecker(IntValueChecker): - # We're sure to use ints instead of longs here since comparison may be more - # efficient. - _MIN = -2147483648 - _MAX = 2147483647 - - -class Uint32ValueChecker(IntValueChecker): - _MIN = 0 - _MAX = (1 << 32) - 1 - - -class Int64ValueChecker(IntValueChecker): - _MIN = -(1 << 63) - _MAX = (1 << 63) - 1 - - -class Uint64ValueChecker(IntValueChecker): - _MIN = 0 - _MAX = (1 << 64) - 1 - - -# The max 4 bytes float is about 3.4028234663852886e+38 -_FLOAT_MAX = float.fromhex('0x1.fffffep+127') -_FLOAT_MIN = -_FLOAT_MAX -_INF = float('inf') -_NEG_INF = float('-inf') - - -class DoubleValueChecker(object): - """Checker used for double fields. - - Performs type-check and range check. - """ - - def CheckValue(self, proposed_value): - """Check and convert proposed_value to float.""" - if (not hasattr(proposed_value, '__float__') and - not hasattr(proposed_value, '__index__')) or ( - type(proposed_value).__module__ == 'numpy' and - type(proposed_value).__name__ == 'ndarray'): - message = ('%.1024r has type %s, but expected one of: int, float' % - (proposed_value, type(proposed_value))) - raise TypeError(message) - return float(proposed_value) - - def DefaultValue(self): - return 0.0 - - -class FloatValueChecker(DoubleValueChecker): - """Checker used for float fields. - - Performs type-check and range check. - - Values exceeding a 32-bit float will be converted to inf/-inf. - """ - - def CheckValue(self, proposed_value): - """Check and convert proposed_value to float.""" - converted_value = super().CheckValue(proposed_value) - # This inf rounding matches the C++ proto SafeDoubleToFloat logic. - if converted_value > _FLOAT_MAX: - return _INF - if converted_value < _FLOAT_MIN: - return _NEG_INF - - return TruncateToFourByteFloat(converted_value) - -# Type-checkers for all scalar CPPTYPEs. -_VALUE_CHECKERS = { - _FieldDescriptor.CPPTYPE_INT32: Int32ValueChecker(), - _FieldDescriptor.CPPTYPE_INT64: Int64ValueChecker(), - _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(), - _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(), - _FieldDescriptor.CPPTYPE_DOUBLE: DoubleValueChecker(), - _FieldDescriptor.CPPTYPE_FLOAT: FloatValueChecker(), - _FieldDescriptor.CPPTYPE_BOOL: BoolValueChecker(), - _FieldDescriptor.CPPTYPE_STRING: TypeCheckerWithDefault(b'', bytes), -} - - -# Map from field type to a function F, such that F(field_num, value) -# gives the total byte size for a value of the given type. This -# byte size includes tag information and any other additional space -# associated with serializing "value". -TYPE_TO_BYTE_SIZE_FN = { - _FieldDescriptor.TYPE_DOUBLE: wire_format.DoubleByteSize, - _FieldDescriptor.TYPE_FLOAT: wire_format.FloatByteSize, - _FieldDescriptor.TYPE_INT64: wire_format.Int64ByteSize, - _FieldDescriptor.TYPE_UINT64: wire_format.UInt64ByteSize, - _FieldDescriptor.TYPE_INT32: wire_format.Int32ByteSize, - _FieldDescriptor.TYPE_FIXED64: wire_format.Fixed64ByteSize, - _FieldDescriptor.TYPE_FIXED32: wire_format.Fixed32ByteSize, - _FieldDescriptor.TYPE_BOOL: wire_format.BoolByteSize, - _FieldDescriptor.TYPE_STRING: wire_format.StringByteSize, - _FieldDescriptor.TYPE_GROUP: wire_format.GroupByteSize, - _FieldDescriptor.TYPE_MESSAGE: wire_format.MessageByteSize, - _FieldDescriptor.TYPE_BYTES: wire_format.BytesByteSize, - _FieldDescriptor.TYPE_UINT32: wire_format.UInt32ByteSize, - _FieldDescriptor.TYPE_ENUM: wire_format.EnumByteSize, - _FieldDescriptor.TYPE_SFIXED32: wire_format.SFixed32ByteSize, - _FieldDescriptor.TYPE_SFIXED64: wire_format.SFixed64ByteSize, - _FieldDescriptor.TYPE_SINT32: wire_format.SInt32ByteSize, - _FieldDescriptor.TYPE_SINT64: wire_format.SInt64ByteSize - } - - -# Maps from field types to encoder constructors. -TYPE_TO_ENCODER = { - _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleEncoder, - _FieldDescriptor.TYPE_FLOAT: encoder.FloatEncoder, - _FieldDescriptor.TYPE_INT64: encoder.Int64Encoder, - _FieldDescriptor.TYPE_UINT64: encoder.UInt64Encoder, - _FieldDescriptor.TYPE_INT32: encoder.Int32Encoder, - _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Encoder, - _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Encoder, - _FieldDescriptor.TYPE_BOOL: encoder.BoolEncoder, - _FieldDescriptor.TYPE_STRING: encoder.StringEncoder, - _FieldDescriptor.TYPE_GROUP: encoder.GroupEncoder, - _FieldDescriptor.TYPE_MESSAGE: encoder.MessageEncoder, - _FieldDescriptor.TYPE_BYTES: encoder.BytesEncoder, - _FieldDescriptor.TYPE_UINT32: encoder.UInt32Encoder, - _FieldDescriptor.TYPE_ENUM: encoder.EnumEncoder, - _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Encoder, - _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Encoder, - _FieldDescriptor.TYPE_SINT32: encoder.SInt32Encoder, - _FieldDescriptor.TYPE_SINT64: encoder.SInt64Encoder, - } - - -# Maps from field types to sizer constructors. -TYPE_TO_SIZER = { - _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleSizer, - _FieldDescriptor.TYPE_FLOAT: encoder.FloatSizer, - _FieldDescriptor.TYPE_INT64: encoder.Int64Sizer, - _FieldDescriptor.TYPE_UINT64: encoder.UInt64Sizer, - _FieldDescriptor.TYPE_INT32: encoder.Int32Sizer, - _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Sizer, - _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Sizer, - _FieldDescriptor.TYPE_BOOL: encoder.BoolSizer, - _FieldDescriptor.TYPE_STRING: encoder.StringSizer, - _FieldDescriptor.TYPE_GROUP: encoder.GroupSizer, - _FieldDescriptor.TYPE_MESSAGE: encoder.MessageSizer, - _FieldDescriptor.TYPE_BYTES: encoder.BytesSizer, - _FieldDescriptor.TYPE_UINT32: encoder.UInt32Sizer, - _FieldDescriptor.TYPE_ENUM: encoder.EnumSizer, - _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Sizer, - _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Sizer, - _FieldDescriptor.TYPE_SINT32: encoder.SInt32Sizer, - _FieldDescriptor.TYPE_SINT64: encoder.SInt64Sizer, - } - - -# Maps from field type to a decoder constructor. -TYPE_TO_DECODER = { - _FieldDescriptor.TYPE_DOUBLE: decoder.DoubleDecoder, - _FieldDescriptor.TYPE_FLOAT: decoder.FloatDecoder, - _FieldDescriptor.TYPE_INT64: decoder.Int64Decoder, - _FieldDescriptor.TYPE_UINT64: decoder.UInt64Decoder, - _FieldDescriptor.TYPE_INT32: decoder.Int32Decoder, - _FieldDescriptor.TYPE_FIXED64: decoder.Fixed64Decoder, - _FieldDescriptor.TYPE_FIXED32: decoder.Fixed32Decoder, - _FieldDescriptor.TYPE_BOOL: decoder.BoolDecoder, - _FieldDescriptor.TYPE_STRING: decoder.StringDecoder, - _FieldDescriptor.TYPE_GROUP: decoder.GroupDecoder, - _FieldDescriptor.TYPE_MESSAGE: decoder.MessageDecoder, - _FieldDescriptor.TYPE_BYTES: decoder.BytesDecoder, - _FieldDescriptor.TYPE_UINT32: decoder.UInt32Decoder, - _FieldDescriptor.TYPE_ENUM: decoder.EnumDecoder, - _FieldDescriptor.TYPE_SFIXED32: decoder.SFixed32Decoder, - _FieldDescriptor.TYPE_SFIXED64: decoder.SFixed64Decoder, - _FieldDescriptor.TYPE_SINT32: decoder.SInt32Decoder, - _FieldDescriptor.TYPE_SINT64: decoder.SInt64Decoder, - } - -# Maps from field type to expected wiretype. -FIELD_TYPE_TO_WIRE_TYPE = { - _FieldDescriptor.TYPE_DOUBLE: wire_format.WIRETYPE_FIXED64, - _FieldDescriptor.TYPE_FLOAT: wire_format.WIRETYPE_FIXED32, - _FieldDescriptor.TYPE_INT64: wire_format.WIRETYPE_VARINT, - _FieldDescriptor.TYPE_UINT64: wire_format.WIRETYPE_VARINT, - _FieldDescriptor.TYPE_INT32: wire_format.WIRETYPE_VARINT, - _FieldDescriptor.TYPE_FIXED64: wire_format.WIRETYPE_FIXED64, - _FieldDescriptor.TYPE_FIXED32: wire_format.WIRETYPE_FIXED32, - _FieldDescriptor.TYPE_BOOL: wire_format.WIRETYPE_VARINT, - _FieldDescriptor.TYPE_STRING: - wire_format.WIRETYPE_LENGTH_DELIMITED, - _FieldDescriptor.TYPE_GROUP: wire_format.WIRETYPE_START_GROUP, - _FieldDescriptor.TYPE_MESSAGE: - wire_format.WIRETYPE_LENGTH_DELIMITED, - _FieldDescriptor.TYPE_BYTES: - wire_format.WIRETYPE_LENGTH_DELIMITED, - _FieldDescriptor.TYPE_UINT32: wire_format.WIRETYPE_VARINT, - _FieldDescriptor.TYPE_ENUM: wire_format.WIRETYPE_VARINT, - _FieldDescriptor.TYPE_SFIXED32: wire_format.WIRETYPE_FIXED32, - _FieldDescriptor.TYPE_SFIXED64: wire_format.WIRETYPE_FIXED64, - _FieldDescriptor.TYPE_SINT32: wire_format.WIRETYPE_VARINT, - _FieldDescriptor.TYPE_SINT64: wire_format.WIRETYPE_VARINT, - } diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/well_known_types.py b/script.module.protobuf/resources/lib/google/protobuf/internal/well_known_types.py deleted file mode 100644 index e340f9087..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/well_known_types.py +++ /dev/null @@ -1,582 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Contains well known classes. - -This files defines well known classes which need extra maintenance including: - - Any - - Duration - - FieldMask - - Struct - - Timestamp -""" - -__author__ = 'jieluo@google.com (Jie Luo)' - -import calendar -import collections.abc -import datetime - -from google.protobuf.internal import field_mask - -FieldMask = field_mask.FieldMask - -_TIMESTAMPFOMAT = '%Y-%m-%dT%H:%M:%S' -_NANOS_PER_SECOND = 1000000000 -_NANOS_PER_MILLISECOND = 1000000 -_NANOS_PER_MICROSECOND = 1000 -_MILLIS_PER_SECOND = 1000 -_MICROS_PER_SECOND = 1000000 -_SECONDS_PER_DAY = 24 * 3600 -_DURATION_SECONDS_MAX = 315576000000 - - -class Any(object): - """Class for Any Message type.""" - - __slots__ = () - - def Pack(self, msg, type_url_prefix='type.googleapis.com/', - deterministic=None): - """Packs the specified message into current Any message.""" - if len(type_url_prefix) < 1 or type_url_prefix[-1] != '/': - self.type_url = '%s/%s' % (type_url_prefix, msg.DESCRIPTOR.full_name) - else: - self.type_url = '%s%s' % (type_url_prefix, msg.DESCRIPTOR.full_name) - self.value = msg.SerializeToString(deterministic=deterministic) - - def Unpack(self, msg): - """Unpacks the current Any message into specified message.""" - descriptor = msg.DESCRIPTOR - if not self.Is(descriptor): - return False - msg.ParseFromString(self.value) - return True - - def TypeName(self): - """Returns the protobuf type name of the inner message.""" - # Only last part is to be used: b/25630112 - return self.type_url.split('/')[-1] - - def Is(self, descriptor): - """Checks if this Any represents the given protobuf type.""" - return '/' in self.type_url and self.TypeName() == descriptor.full_name - - -_EPOCH_DATETIME_NAIVE = datetime.datetime.utcfromtimestamp(0) -_EPOCH_DATETIME_AWARE = datetime.datetime.fromtimestamp( - 0, tz=datetime.timezone.utc) - - -class Timestamp(object): - """Class for Timestamp message type.""" - - __slots__ = () - - def ToJsonString(self): - """Converts Timestamp to RFC 3339 date string format. - - Returns: - A string converted from timestamp. The string is always Z-normalized - and uses 3, 6 or 9 fractional digits as required to represent the - exact time. Example of the return format: '1972-01-01T10:00:20.021Z' - """ - nanos = self.nanos % _NANOS_PER_SECOND - total_sec = self.seconds + (self.nanos - nanos) // _NANOS_PER_SECOND - seconds = total_sec % _SECONDS_PER_DAY - days = (total_sec - seconds) // _SECONDS_PER_DAY - dt = datetime.datetime(1970, 1, 1) + datetime.timedelta(days, seconds) - - result = dt.isoformat() - if (nanos % 1e9) == 0: - # If there are 0 fractional digits, the fractional - # point '.' should be omitted when serializing. - return result + 'Z' - if (nanos % 1e6) == 0: - # Serialize 3 fractional digits. - return result + '.%03dZ' % (nanos / 1e6) - if (nanos % 1e3) == 0: - # Serialize 6 fractional digits. - return result + '.%06dZ' % (nanos / 1e3) - # Serialize 9 fractional digits. - return result + '.%09dZ' % nanos - - def FromJsonString(self, value): - """Parse a RFC 3339 date string format to Timestamp. - - Args: - value: A date string. Any fractional digits (or none) and any offset are - accepted as long as they fit into nano-seconds precision. - Example of accepted format: '1972-01-01T10:00:20.021-05:00' - - Raises: - ValueError: On parsing problems. - """ - if not isinstance(value, str): - raise ValueError('Timestamp JSON value not a string: {!r}'.format(value)) - timezone_offset = value.find('Z') - if timezone_offset == -1: - timezone_offset = value.find('+') - if timezone_offset == -1: - timezone_offset = value.rfind('-') - if timezone_offset == -1: - raise ValueError( - 'Failed to parse timestamp: missing valid timezone offset.') - time_value = value[0:timezone_offset] - # Parse datetime and nanos. - point_position = time_value.find('.') - if point_position == -1: - second_value = time_value - nano_value = '' - else: - second_value = time_value[:point_position] - nano_value = time_value[point_position + 1:] - if 't' in second_value: - raise ValueError( - 'time data \'{0}\' does not match format \'%Y-%m-%dT%H:%M:%S\', ' - 'lowercase \'t\' is not accepted'.format(second_value)) - date_object = datetime.datetime.strptime(second_value, _TIMESTAMPFOMAT) - td = date_object - datetime.datetime(1970, 1, 1) - seconds = td.seconds + td.days * _SECONDS_PER_DAY - if len(nano_value) > 9: - raise ValueError( - 'Failed to parse Timestamp: nanos {0} more than ' - '9 fractional digits.'.format(nano_value)) - if nano_value: - nanos = round(float('0.' + nano_value) * 1e9) - else: - nanos = 0 - # Parse timezone offsets. - if value[timezone_offset] == 'Z': - if len(value) != timezone_offset + 1: - raise ValueError('Failed to parse timestamp: invalid trailing' - ' data {0}.'.format(value)) - else: - timezone = value[timezone_offset:] - pos = timezone.find(':') - if pos == -1: - raise ValueError( - 'Invalid timezone offset value: {0}.'.format(timezone)) - if timezone[0] == '+': - seconds -= (int(timezone[1:pos])*60+int(timezone[pos+1:]))*60 - else: - seconds += (int(timezone[1:pos])*60+int(timezone[pos+1:]))*60 - # Set seconds and nanos - self.seconds = int(seconds) - self.nanos = int(nanos) - - def GetCurrentTime(self): - """Get the current UTC into Timestamp.""" - self.FromDatetime(datetime.datetime.utcnow()) - - def ToNanoseconds(self): - """Converts Timestamp to nanoseconds since epoch.""" - return self.seconds * _NANOS_PER_SECOND + self.nanos - - def ToMicroseconds(self): - """Converts Timestamp to microseconds since epoch.""" - return (self.seconds * _MICROS_PER_SECOND + - self.nanos // _NANOS_PER_MICROSECOND) - - def ToMilliseconds(self): - """Converts Timestamp to milliseconds since epoch.""" - return (self.seconds * _MILLIS_PER_SECOND + - self.nanos // _NANOS_PER_MILLISECOND) - - def ToSeconds(self): - """Converts Timestamp to seconds since epoch.""" - return self.seconds - - def FromNanoseconds(self, nanos): - """Converts nanoseconds since epoch to Timestamp.""" - self.seconds = nanos // _NANOS_PER_SECOND - self.nanos = nanos % _NANOS_PER_SECOND - - def FromMicroseconds(self, micros): - """Converts microseconds since epoch to Timestamp.""" - self.seconds = micros // _MICROS_PER_SECOND - self.nanos = (micros % _MICROS_PER_SECOND) * _NANOS_PER_MICROSECOND - - def FromMilliseconds(self, millis): - """Converts milliseconds since epoch to Timestamp.""" - self.seconds = millis // _MILLIS_PER_SECOND - self.nanos = (millis % _MILLIS_PER_SECOND) * _NANOS_PER_MILLISECOND - - def FromSeconds(self, seconds): - """Converts seconds since epoch to Timestamp.""" - self.seconds = seconds - self.nanos = 0 - - def ToDatetime(self, tzinfo=None): - """Converts Timestamp to a datetime. - - Args: - tzinfo: A datetime.tzinfo subclass; defaults to None. - - Returns: - If tzinfo is None, returns a timezone-naive UTC datetime (with no timezone - information, i.e. not aware that it's UTC). - - Otherwise, returns a timezone-aware datetime in the input timezone. - """ - delta = datetime.timedelta( - seconds=self.seconds, - microseconds=_RoundTowardZero(self.nanos, _NANOS_PER_MICROSECOND)) - if tzinfo is None: - return _EPOCH_DATETIME_NAIVE + delta - else: - return _EPOCH_DATETIME_AWARE.astimezone(tzinfo) + delta - - def FromDatetime(self, dt): - """Converts datetime to Timestamp. - - Args: - dt: A datetime. If it's timezone-naive, it's assumed to be in UTC. - """ - # Using this guide: http://wiki.python.org/moin/WorkingWithTime - # And this conversion guide: http://docs.python.org/library/time.html - - # Turn the date parameter into a tuple (struct_time) that can then be - # manipulated into a long value of seconds. During the conversion from - # struct_time to long, the source date in UTC, and so it follows that the - # correct transformation is calendar.timegm() - self.seconds = calendar.timegm(dt.utctimetuple()) - self.nanos = dt.microsecond * _NANOS_PER_MICROSECOND - - -class Duration(object): - """Class for Duration message type.""" - - __slots__ = () - - def ToJsonString(self): - """Converts Duration to string format. - - Returns: - A string converted from self. The string format will contains - 3, 6, or 9 fractional digits depending on the precision required to - represent the exact Duration value. For example: "1s", "1.010s", - "1.000000100s", "-3.100s" - """ - _CheckDurationValid(self.seconds, self.nanos) - if self.seconds < 0 or self.nanos < 0: - result = '-' - seconds = - self.seconds + int((0 - self.nanos) // 1e9) - nanos = (0 - self.nanos) % 1e9 - else: - result = '' - seconds = self.seconds + int(self.nanos // 1e9) - nanos = self.nanos % 1e9 - result += '%d' % seconds - if (nanos % 1e9) == 0: - # If there are 0 fractional digits, the fractional - # point '.' should be omitted when serializing. - return result + 's' - if (nanos % 1e6) == 0: - # Serialize 3 fractional digits. - return result + '.%03ds' % (nanos / 1e6) - if (nanos % 1e3) == 0: - # Serialize 6 fractional digits. - return result + '.%06ds' % (nanos / 1e3) - # Serialize 9 fractional digits. - return result + '.%09ds' % nanos - - def FromJsonString(self, value): - """Converts a string to Duration. - - Args: - value: A string to be converted. The string must end with 's'. Any - fractional digits (or none) are accepted as long as they fit into - precision. For example: "1s", "1.01s", "1.0000001s", "-3.100s - - Raises: - ValueError: On parsing problems. - """ - if not isinstance(value, str): - raise ValueError('Duration JSON value not a string: {!r}'.format(value)) - if len(value) < 1 or value[-1] != 's': - raise ValueError( - 'Duration must end with letter "s": {0}.'.format(value)) - try: - pos = value.find('.') - if pos == -1: - seconds = int(value[:-1]) - nanos = 0 - else: - seconds = int(value[:pos]) - if value[0] == '-': - nanos = int(round(float('-0{0}'.format(value[pos: -1])) *1e9)) - else: - nanos = int(round(float('0{0}'.format(value[pos: -1])) *1e9)) - _CheckDurationValid(seconds, nanos) - self.seconds = seconds - self.nanos = nanos - except ValueError as e: - raise ValueError( - 'Couldn\'t parse duration: {0} : {1}.'.format(value, e)) - - def ToNanoseconds(self): - """Converts a Duration to nanoseconds.""" - return self.seconds * _NANOS_PER_SECOND + self.nanos - - def ToMicroseconds(self): - """Converts a Duration to microseconds.""" - micros = _RoundTowardZero(self.nanos, _NANOS_PER_MICROSECOND) - return self.seconds * _MICROS_PER_SECOND + micros - - def ToMilliseconds(self): - """Converts a Duration to milliseconds.""" - millis = _RoundTowardZero(self.nanos, _NANOS_PER_MILLISECOND) - return self.seconds * _MILLIS_PER_SECOND + millis - - def ToSeconds(self): - """Converts a Duration to seconds.""" - return self.seconds - - def FromNanoseconds(self, nanos): - """Converts nanoseconds to Duration.""" - self._NormalizeDuration(nanos // _NANOS_PER_SECOND, - nanos % _NANOS_PER_SECOND) - - def FromMicroseconds(self, micros): - """Converts microseconds to Duration.""" - self._NormalizeDuration( - micros // _MICROS_PER_SECOND, - (micros % _MICROS_PER_SECOND) * _NANOS_PER_MICROSECOND) - - def FromMilliseconds(self, millis): - """Converts milliseconds to Duration.""" - self._NormalizeDuration( - millis // _MILLIS_PER_SECOND, - (millis % _MILLIS_PER_SECOND) * _NANOS_PER_MILLISECOND) - - def FromSeconds(self, seconds): - """Converts seconds to Duration.""" - self.seconds = seconds - self.nanos = 0 - - def ToTimedelta(self): - """Converts Duration to timedelta.""" - return datetime.timedelta( - seconds=self.seconds, microseconds=_RoundTowardZero( - self.nanos, _NANOS_PER_MICROSECOND)) - - def FromTimedelta(self, td): - """Converts timedelta to Duration.""" - self._NormalizeDuration(td.seconds + td.days * _SECONDS_PER_DAY, - td.microseconds * _NANOS_PER_MICROSECOND) - - def _NormalizeDuration(self, seconds, nanos): - """Set Duration by seconds and nanos.""" - # Force nanos to be negative if the duration is negative. - if seconds < 0 and nanos > 0: - seconds += 1 - nanos -= _NANOS_PER_SECOND - self.seconds = seconds - self.nanos = nanos - - -def _CheckDurationValid(seconds, nanos): - if seconds < -_DURATION_SECONDS_MAX or seconds > _DURATION_SECONDS_MAX: - raise ValueError( - 'Duration is not valid: Seconds {0} must be in range ' - '[-315576000000, 315576000000].'.format(seconds)) - if nanos <= -_NANOS_PER_SECOND or nanos >= _NANOS_PER_SECOND: - raise ValueError( - 'Duration is not valid: Nanos {0} must be in range ' - '[-999999999, 999999999].'.format(nanos)) - if (nanos < 0 and seconds > 0) or (nanos > 0 and seconds < 0): - raise ValueError( - 'Duration is not valid: Sign mismatch.') - - -def _RoundTowardZero(value, divider): - """Truncates the remainder part after division.""" - # For some languages, the sign of the remainder is implementation - # dependent if any of the operands is negative. Here we enforce - # "rounded toward zero" semantics. For example, for (-5) / 2 an - # implementation may give -3 as the result with the remainder being - # 1. This function ensures we always return -2 (closer to zero). - result = value // divider - remainder = value % divider - if result < 0 and remainder > 0: - return result + 1 - else: - return result - - -def _SetStructValue(struct_value, value): - if value is None: - struct_value.null_value = 0 - elif isinstance(value, bool): - # Note: this check must come before the number check because in Python - # True and False are also considered numbers. - struct_value.bool_value = value - elif isinstance(value, str): - struct_value.string_value = value - elif isinstance(value, (int, float)): - struct_value.number_value = value - elif isinstance(value, (dict, Struct)): - struct_value.struct_value.Clear() - struct_value.struct_value.update(value) - elif isinstance(value, (list, ListValue)): - struct_value.list_value.Clear() - struct_value.list_value.extend(value) - else: - raise ValueError('Unexpected type') - - -def _GetStructValue(struct_value): - which = struct_value.WhichOneof('kind') - if which == 'struct_value': - return struct_value.struct_value - elif which == 'null_value': - return None - elif which == 'number_value': - return struct_value.number_value - elif which == 'string_value': - return struct_value.string_value - elif which == 'bool_value': - return struct_value.bool_value - elif which == 'list_value': - return struct_value.list_value - elif which is None: - raise ValueError('Value not set') - - -class Struct(object): - """Class for Struct message type.""" - - __slots__ = () - - def __getitem__(self, key): - return _GetStructValue(self.fields[key]) - - def __contains__(self, item): - return item in self.fields - - def __setitem__(self, key, value): - _SetStructValue(self.fields[key], value) - - def __delitem__(self, key): - del self.fields[key] - - def __len__(self): - return len(self.fields) - - def __iter__(self): - return iter(self.fields) - - def keys(self): # pylint: disable=invalid-name - return self.fields.keys() - - def values(self): # pylint: disable=invalid-name - return [self[key] for key in self] - - def items(self): # pylint: disable=invalid-name - return [(key, self[key]) for key in self] - - def get_or_create_list(self, key): - """Returns a list for this key, creating if it didn't exist already.""" - if not self.fields[key].HasField('list_value'): - # Clear will mark list_value modified which will indeed create a list. - self.fields[key].list_value.Clear() - return self.fields[key].list_value - - def get_or_create_struct(self, key): - """Returns a struct for this key, creating if it didn't exist already.""" - if not self.fields[key].HasField('struct_value'): - # Clear will mark struct_value modified which will indeed create a struct. - self.fields[key].struct_value.Clear() - return self.fields[key].struct_value - - def update(self, dictionary): # pylint: disable=invalid-name - for key, value in dictionary.items(): - _SetStructValue(self.fields[key], value) - -collections.abc.MutableMapping.register(Struct) - - -class ListValue(object): - """Class for ListValue message type.""" - - __slots__ = () - - def __len__(self): - return len(self.values) - - def append(self, value): - _SetStructValue(self.values.add(), value) - - def extend(self, elem_seq): - for value in elem_seq: - self.append(value) - - def __getitem__(self, index): - """Retrieves item by the specified index.""" - return _GetStructValue(self.values.__getitem__(index)) - - def __setitem__(self, index, value): - _SetStructValue(self.values.__getitem__(index), value) - - def __delitem__(self, key): - del self.values[key] - - def items(self): - for i in range(len(self)): - yield self[i] - - def add_struct(self): - """Appends and returns a struct value as the next value in the list.""" - struct_value = self.values.add().struct_value - # Clear will mark struct_value modified which will indeed create a struct. - struct_value.Clear() - return struct_value - - def add_list(self): - """Appends and returns a list value as the next value in the list.""" - list_value = self.values.add().list_value - # Clear will mark list_value modified which will indeed create a list. - list_value.Clear() - return list_value - -collections.abc.MutableSequence.register(ListValue) - - -# LINT.IfChange(wktbases) -WKTBASES = { - 'google.protobuf.Any': Any, - 'google.protobuf.Duration': Duration, - 'google.protobuf.FieldMask': FieldMask, - 'google.protobuf.ListValue': ListValue, - 'google.protobuf.Struct': Struct, - 'google.protobuf.Timestamp': Timestamp, -} -# LINT.ThenChange(//depot/google.protobuf/compiler/python/pyi_generator.cc:wktbases) diff --git a/script.module.protobuf/resources/lib/google/protobuf/internal/wire_format.py b/script.module.protobuf/resources/lib/google/protobuf/internal/wire_format.py deleted file mode 100644 index 1f54414b1..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/internal/wire_format.py +++ /dev/null @@ -1,268 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Constants and static functions to support protocol buffer wire format.""" - -__author__ = 'robinson@google.com (Will Robinson)' - -import struct -from google.protobuf import descriptor -from google.protobuf import message - - -TAG_TYPE_BITS = 3 # Number of bits used to hold type info in a proto tag. -TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1 # 0x7 - -# These numbers identify the wire type of a protocol buffer value. -# We use the least-significant TAG_TYPE_BITS bits of the varint-encoded -# tag-and-type to store one of these WIRETYPE_* constants. -# These values must match WireType enum in //google/protobuf/wire_format.h. -WIRETYPE_VARINT = 0 -WIRETYPE_FIXED64 = 1 -WIRETYPE_LENGTH_DELIMITED = 2 -WIRETYPE_START_GROUP = 3 -WIRETYPE_END_GROUP = 4 -WIRETYPE_FIXED32 = 5 -_WIRETYPE_MAX = 5 - - -# Bounds for various integer types. -INT32_MAX = int((1 << 31) - 1) -INT32_MIN = int(-(1 << 31)) -UINT32_MAX = (1 << 32) - 1 - -INT64_MAX = (1 << 63) - 1 -INT64_MIN = -(1 << 63) -UINT64_MAX = (1 << 64) - 1 - -# "struct" format strings that will encode/decode the specified formats. -FORMAT_UINT32_LITTLE_ENDIAN = '> TAG_TYPE_BITS), (tag & TAG_TYPE_MASK) - - -def ZigZagEncode(value): - """ZigZag Transform: Encodes signed integers so that they can be - effectively used with varint encoding. See wire_format.h for - more details. - """ - if value >= 0: - return value << 1 - return (value << 1) ^ (~0) - - -def ZigZagDecode(value): - """Inverse of ZigZagEncode().""" - if not value & 0x1: - return value >> 1 - return (value >> 1) ^ (~0) - - - -# The *ByteSize() functions below return the number of bytes required to -# serialize "field number + type" information and then serialize the value. - - -def Int32ByteSize(field_number, int32): - return Int64ByteSize(field_number, int32) - - -def Int32ByteSizeNoTag(int32): - return _VarUInt64ByteSizeNoTag(0xffffffffffffffff & int32) - - -def Int64ByteSize(field_number, int64): - # Have to convert to uint before calling UInt64ByteSize(). - return UInt64ByteSize(field_number, 0xffffffffffffffff & int64) - - -def UInt32ByteSize(field_number, uint32): - return UInt64ByteSize(field_number, uint32) - - -def UInt64ByteSize(field_number, uint64): - return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64) - - -def SInt32ByteSize(field_number, int32): - return UInt32ByteSize(field_number, ZigZagEncode(int32)) - - -def SInt64ByteSize(field_number, int64): - return UInt64ByteSize(field_number, ZigZagEncode(int64)) - - -def Fixed32ByteSize(field_number, fixed32): - return TagByteSize(field_number) + 4 - - -def Fixed64ByteSize(field_number, fixed64): - return TagByteSize(field_number) + 8 - - -def SFixed32ByteSize(field_number, sfixed32): - return TagByteSize(field_number) + 4 - - -def SFixed64ByteSize(field_number, sfixed64): - return TagByteSize(field_number) + 8 - - -def FloatByteSize(field_number, flt): - return TagByteSize(field_number) + 4 - - -def DoubleByteSize(field_number, double): - return TagByteSize(field_number) + 8 - - -def BoolByteSize(field_number, b): - return TagByteSize(field_number) + 1 - - -def EnumByteSize(field_number, enum): - return UInt32ByteSize(field_number, enum) - - -def StringByteSize(field_number, string): - return BytesByteSize(field_number, string.encode('utf-8')) - - -def BytesByteSize(field_number, b): - return (TagByteSize(field_number) - + _VarUInt64ByteSizeNoTag(len(b)) - + len(b)) - - -def GroupByteSize(field_number, message): - return (2 * TagByteSize(field_number) # START and END group. - + message.ByteSize()) - - -def MessageByteSize(field_number, message): - return (TagByteSize(field_number) - + _VarUInt64ByteSizeNoTag(message.ByteSize()) - + message.ByteSize()) - - -def MessageSetItemByteSize(field_number, msg): - # First compute the sizes of the tags. - # There are 2 tags for the beginning and ending of the repeated group, that - # is field number 1, one with field number 2 (type_id) and one with field - # number 3 (message). - total_size = (2 * TagByteSize(1) + TagByteSize(2) + TagByteSize(3)) - - # Add the number of bytes for type_id. - total_size += _VarUInt64ByteSizeNoTag(field_number) - - message_size = msg.ByteSize() - - # The number of bytes for encoding the length of the message. - total_size += _VarUInt64ByteSizeNoTag(message_size) - - # The size of the message. - total_size += message_size - return total_size - - -def TagByteSize(field_number): - """Returns the bytes required to serialize a tag with this field number.""" - # Just pass in type 0, since the type won't affect the tag+type size. - return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0)) - - -# Private helper function for the *ByteSize() functions above. - -def _VarUInt64ByteSizeNoTag(uint64): - """Returns the number of bytes required to serialize a single varint - using boundary value comparisons. (unrolled loop optimization -WPierce) - uint64 must be unsigned. - """ - if uint64 <= 0x7f: return 1 - if uint64 <= 0x3fff: return 2 - if uint64 <= 0x1fffff: return 3 - if uint64 <= 0xfffffff: return 4 - if uint64 <= 0x7ffffffff: return 5 - if uint64 <= 0x3ffffffffff: return 6 - if uint64 <= 0x1ffffffffffff: return 7 - if uint64 <= 0xffffffffffffff: return 8 - if uint64 <= 0x7fffffffffffffff: return 9 - if uint64 > UINT64_MAX: - raise message.EncodeError('Value out of range: %d' % uint64) - return 10 - - -NON_PACKABLE_TYPES = ( - descriptor.FieldDescriptor.TYPE_STRING, - descriptor.FieldDescriptor.TYPE_GROUP, - descriptor.FieldDescriptor.TYPE_MESSAGE, - descriptor.FieldDescriptor.TYPE_BYTES -) - - -def IsTypePackable(field_type): - """Return true iff packable = true is valid for fields of this type. - - Args: - field_type: a FieldDescriptor::Type value. - - Returns: - True iff fields of this type are packable. - """ - return field_type not in NON_PACKABLE_TYPES diff --git a/script.module.protobuf/resources/lib/google/protobuf/json_format.py b/script.module.protobuf/resources/lib/google/protobuf/json_format.py deleted file mode 100644 index a04e8aef1..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/json_format.py +++ /dev/null @@ -1,929 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Contains routines for printing protocol messages in JSON format. - -Simple usage example: - - # Create a proto object and serialize it to a json format string. - message = my_proto_pb2.MyMessage(foo='bar') - json_string = json_format.MessageToJson(message) - - # Parse a json format string to proto object. - message = json_format.Parse(json_string, my_proto_pb2.MyMessage()) -""" - -__author__ = 'jieluo@google.com (Jie Luo)' - - -import base64 -from collections import OrderedDict -import json -import math -from operator import methodcaller -import re -import sys - -from google.protobuf.internal import type_checkers -from google.protobuf import descriptor -from google.protobuf import message_factory -from google.protobuf import symbol_database - - -_TIMESTAMPFOMAT = '%Y-%m-%dT%H:%M:%S' -_INT_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_INT32, - descriptor.FieldDescriptor.CPPTYPE_UINT32, - descriptor.FieldDescriptor.CPPTYPE_INT64, - descriptor.FieldDescriptor.CPPTYPE_UINT64]) -_INT64_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_INT64, - descriptor.FieldDescriptor.CPPTYPE_UINT64]) -_FLOAT_TYPES = frozenset([descriptor.FieldDescriptor.CPPTYPE_FLOAT, - descriptor.FieldDescriptor.CPPTYPE_DOUBLE]) -_INFINITY = 'Infinity' -_NEG_INFINITY = '-Infinity' -_NAN = 'NaN' - -_UNPAIRED_SURROGATE_PATTERN = re.compile( - u'[\ud800-\udbff](?![\udc00-\udfff])|(? self.max_recursion_depth: - raise ParseError('Message too deep. Max recursion depth is {0}'.format( - self.max_recursion_depth)) - message_descriptor = message.DESCRIPTOR - full_name = message_descriptor.full_name - if not path: - path = message_descriptor.name - if _IsWrapperMessage(message_descriptor): - self._ConvertWrapperMessage(value, message, path) - elif full_name in _WKTJSONMETHODS: - methodcaller(_WKTJSONMETHODS[full_name][1], value, message, path)(self) - else: - self._ConvertFieldValuePair(value, message, path) - self.recursion_depth -= 1 - - def _ConvertFieldValuePair(self, js, message, path): - """Convert field value pairs into regular message. - - Args: - js: A JSON object to convert the field value pairs. - message: A regular protocol message to record the data. - path: parent path to log parse error info. - - Raises: - ParseError: In case of problems converting. - """ - names = [] - message_descriptor = message.DESCRIPTOR - fields_by_json_name = dict((f.json_name, f) - for f in message_descriptor.fields) - for name in js: - try: - field = fields_by_json_name.get(name, None) - if not field: - field = message_descriptor.fields_by_name.get(name, None) - if not field and _VALID_EXTENSION_NAME.match(name): - if not message_descriptor.is_extendable: - raise ParseError( - 'Message type {0} does not have extensions at {1}'.format( - message_descriptor.full_name, path)) - identifier = name[1:-1] # strip [] brackets - # pylint: disable=protected-access - field = message.Extensions._FindExtensionByName(identifier) - # pylint: enable=protected-access - if not field: - # Try looking for extension by the message type name, dropping the - # field name following the final . separator in full_name. - identifier = '.'.join(identifier.split('.')[:-1]) - # pylint: disable=protected-access - field = message.Extensions._FindExtensionByName(identifier) - # pylint: enable=protected-access - if not field: - if self.ignore_unknown_fields: - continue - raise ParseError( - ('Message type "{0}" has no field named "{1}" at "{2}".\n' - ' Available Fields(except extensions): "{3}"').format( - message_descriptor.full_name, name, path, - [f.json_name for f in message_descriptor.fields])) - if name in names: - raise ParseError('Message type "{0}" should not have multiple ' - '"{1}" fields at "{2}".'.format( - message.DESCRIPTOR.full_name, name, path)) - names.append(name) - value = js[name] - # Check no other oneof field is parsed. - if field.containing_oneof is not None and value is not None: - oneof_name = field.containing_oneof.name - if oneof_name in names: - raise ParseError('Message type "{0}" should not have multiple ' - '"{1}" oneof fields at "{2}".'.format( - message.DESCRIPTOR.full_name, oneof_name, - path)) - names.append(oneof_name) - - if value is None: - if (field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE - and field.message_type.full_name == 'google.protobuf.Value'): - sub_message = getattr(message, field.name) - sub_message.null_value = 0 - elif (field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM - and field.enum_type.full_name == 'google.protobuf.NullValue'): - setattr(message, field.name, 0) - else: - message.ClearField(field.name) - continue - - # Parse field value. - if _IsMapEntry(field): - message.ClearField(field.name) - self._ConvertMapFieldValue(value, message, field, - '{0}.{1}'.format(path, name)) - elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED: - message.ClearField(field.name) - if not isinstance(value, list): - raise ParseError('repeated field {0} must be in [] which is ' - '{1} at {2}'.format(name, value, path)) - if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: - # Repeated message field. - for index, item in enumerate(value): - sub_message = getattr(message, field.name).add() - # None is a null_value in Value. - if (item is None and - sub_message.DESCRIPTOR.full_name != 'google.protobuf.Value'): - raise ParseError('null is not allowed to be used as an element' - ' in a repeated field at {0}.{1}[{2}]'.format( - path, name, index)) - self.ConvertMessage(item, sub_message, - '{0}.{1}[{2}]'.format(path, name, index)) - else: - # Repeated scalar field. - for index, item in enumerate(value): - if item is None: - raise ParseError('null is not allowed to be used as an element' - ' in a repeated field at {0}.{1}[{2}]'.format( - path, name, index)) - getattr(message, field.name).append( - _ConvertScalarFieldValue( - item, field, '{0}.{1}[{2}]'.format(path, name, index))) - elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: - if field.is_extension: - sub_message = message.Extensions[field] - else: - sub_message = getattr(message, field.name) - sub_message.SetInParent() - self.ConvertMessage(value, sub_message, '{0}.{1}'.format(path, name)) - else: - if field.is_extension: - message.Extensions[field] = _ConvertScalarFieldValue( - value, field, '{0}.{1}'.format(path, name)) - else: - setattr( - message, field.name, - _ConvertScalarFieldValue(value, field, - '{0}.{1}'.format(path, name))) - except ParseError as e: - if field and field.containing_oneof is None: - raise ParseError( - 'Failed to parse {0} field: {1}.'.format(name, e) - ) from e - else: - raise ParseError(str(e)) from e - except ValueError as e: - raise ParseError( - 'Failed to parse {0} field: {1}.'.format(name, e) - ) from e - except TypeError as e: - raise ParseError( - 'Failed to parse {0} field: {1}.'.format(name, e) - ) from e - - def _ConvertAnyMessage(self, value, message, path): - """Convert a JSON representation into Any message.""" - if isinstance(value, dict) and not value: - return - try: - type_url = value['@type'] - except KeyError as e: - raise ParseError( - '@type is missing when parsing any message at {0}'.format(path) - ) from e - - try: - sub_message = _CreateMessageFromTypeUrl(type_url, self.descriptor_pool) - except TypeError as e: - raise ParseError('{0} at {1}'.format(e, path)) from e - message_descriptor = sub_message.DESCRIPTOR - full_name = message_descriptor.full_name - if _IsWrapperMessage(message_descriptor): - self._ConvertWrapperMessage(value['value'], sub_message, - '{0}.value'.format(path)) - elif full_name in _WKTJSONMETHODS: - methodcaller(_WKTJSONMETHODS[full_name][1], value['value'], sub_message, - '{0}.value'.format(path))( - self) - else: - del value['@type'] - self._ConvertFieldValuePair(value, sub_message, path) - value['@type'] = type_url - # Sets Any message - message.value = sub_message.SerializeToString() - message.type_url = type_url - - def _ConvertGenericMessage(self, value, message, path): - """Convert a JSON representation into message with FromJsonString.""" - # Duration, Timestamp, FieldMask have a FromJsonString method to do the - # conversion. Users can also call the method directly. - try: - message.FromJsonString(value) - except ValueError as e: - raise ParseError('{0} at {1}'.format(e, path)) from e - - def _ConvertValueMessage(self, value, message, path): - """Convert a JSON representation into Value message.""" - if isinstance(value, dict): - self._ConvertStructMessage(value, message.struct_value, path) - elif isinstance(value, list): - self._ConvertListValueMessage(value, message.list_value, path) - elif value is None: - message.null_value = 0 - elif isinstance(value, bool): - message.bool_value = value - elif isinstance(value, str): - message.string_value = value - elif isinstance(value, _INT_OR_FLOAT): - message.number_value = value - else: - raise ParseError('Value {0} has unexpected type {1} at {2}'.format( - value, type(value), path)) - - def _ConvertListValueMessage(self, value, message, path): - """Convert a JSON representation into ListValue message.""" - if not isinstance(value, list): - raise ParseError('ListValue must be in [] which is {0} at {1}'.format( - value, path)) - message.ClearField('values') - for index, item in enumerate(value): - self._ConvertValueMessage(item, message.values.add(), - '{0}[{1}]'.format(path, index)) - - def _ConvertStructMessage(self, value, message, path): - """Convert a JSON representation into Struct message.""" - if not isinstance(value, dict): - raise ParseError('Struct must be in a dict which is {0} at {1}'.format( - value, path)) - # Clear will mark the struct as modified so it will be created even if - # there are no values. - message.Clear() - for key in value: - self._ConvertValueMessage(value[key], message.fields[key], - '{0}.{1}'.format(path, key)) - return - - def _ConvertWrapperMessage(self, value, message, path): - """Convert a JSON representation into Wrapper message.""" - field = message.DESCRIPTOR.fields_by_name['value'] - setattr( - message, 'value', - _ConvertScalarFieldValue(value, field, path='{0}.value'.format(path))) - - def _ConvertMapFieldValue(self, value, message, field, path): - """Convert map field value for a message map field. - - Args: - value: A JSON object to convert the map field value. - message: A protocol message to record the converted data. - field: The descriptor of the map field to be converted. - path: parent path to log parse error info. - - Raises: - ParseError: In case of convert problems. - """ - if not isinstance(value, dict): - raise ParseError( - 'Map field {0} must be in a dict which is {1} at {2}'.format( - field.name, value, path)) - key_field = field.message_type.fields_by_name['key'] - value_field = field.message_type.fields_by_name['value'] - for key in value: - key_value = _ConvertScalarFieldValue(key, key_field, - '{0}.key'.format(path), True) - if value_field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: - self.ConvertMessage(value[key], - getattr(message, field.name)[key_value], - '{0}[{1}]'.format(path, key_value)) - else: - getattr(message, field.name)[key_value] = _ConvertScalarFieldValue( - value[key], value_field, path='{0}[{1}]'.format(path, key_value)) - - -def _ConvertScalarFieldValue(value, field, path, require_str=False): - """Convert a single scalar field value. - - Args: - value: A scalar value to convert the scalar field value. - field: The descriptor of the field to convert. - path: parent path to log parse error info. - require_str: If True, the field value must be a str. - - Returns: - The converted scalar field value - - Raises: - ParseError: In case of convert problems. - """ - try: - if field.cpp_type in _INT_TYPES: - return _ConvertInteger(value) - elif field.cpp_type in _FLOAT_TYPES: - return _ConvertFloat(value, field) - elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL: - return _ConvertBool(value, require_str) - elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING: - if field.type == descriptor.FieldDescriptor.TYPE_BYTES: - if isinstance(value, str): - encoded = value.encode('utf-8') - else: - encoded = value - # Add extra padding '=' - padded_value = encoded + b'=' * (4 - len(encoded) % 4) - return base64.urlsafe_b64decode(padded_value) - else: - # Checking for unpaired surrogates appears to be unreliable, - # depending on the specific Python version, so we check manually. - if _UNPAIRED_SURROGATE_PATTERN.search(value): - raise ParseError('Unpaired surrogate') - return value - elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: - # Convert an enum value. - enum_value = field.enum_type.values_by_name.get(value, None) - if enum_value is None: - try: - number = int(value) - enum_value = field.enum_type.values_by_number.get(number, None) - except ValueError as e: - raise ParseError('Invalid enum value {0} for enum type {1}'.format( - value, field.enum_type.full_name)) from e - if enum_value is None: - if field.enum_type.is_closed: - raise ParseError('Invalid enum value {0} for enum type {1}'.format( - value, field.enum_type.full_name)) - else: - return number - return enum_value.number - except ParseError as e: - raise ParseError('{0} at {1}'.format(e, path)) from e - - -def _ConvertInteger(value): - """Convert an integer. - - Args: - value: A scalar value to convert. - - Returns: - The integer value. - - Raises: - ParseError: If an integer couldn't be consumed. - """ - if isinstance(value, float) and not value.is_integer(): - raise ParseError('Couldn\'t parse integer: {0}'.format(value)) - - if isinstance(value, str) and value.find(' ') != -1: - raise ParseError('Couldn\'t parse integer: "{0}"'.format(value)) - - if isinstance(value, bool): - raise ParseError('Bool value {0} is not acceptable for ' - 'integer field'.format(value)) - - return int(value) - - -def _ConvertFloat(value, field): - """Convert an floating point number.""" - if isinstance(value, float): - if math.isnan(value): - raise ParseError('Couldn\'t parse NaN, use quoted "NaN" instead') - if math.isinf(value): - if value > 0: - raise ParseError('Couldn\'t parse Infinity or value too large, ' - 'use quoted "Infinity" instead') - else: - raise ParseError('Couldn\'t parse -Infinity or value too small, ' - 'use quoted "-Infinity" instead') - if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_FLOAT: - # pylint: disable=protected-access - if value > type_checkers._FLOAT_MAX: - raise ParseError('Float value too large') - # pylint: disable=protected-access - if value < type_checkers._FLOAT_MIN: - raise ParseError('Float value too small') - if value == 'nan': - raise ParseError('Couldn\'t parse float "nan", use "NaN" instead') - try: - # Assume Python compatible syntax. - return float(value) - except ValueError as e: - # Check alternative spellings. - if value == _NEG_INFINITY: - return float('-inf') - elif value == _INFINITY: - return float('inf') - elif value == _NAN: - return float('nan') - else: - raise ParseError('Couldn\'t parse float: {0}'.format(value)) from e - - -def _ConvertBool(value, require_str): - """Convert a boolean value. - - Args: - value: A scalar value to convert. - require_str: If True, value must be a str. - - Returns: - The bool parsed. - - Raises: - ParseError: If a boolean value couldn't be consumed. - """ - if require_str: - if value == 'true': - return True - elif value == 'false': - return False - else: - raise ParseError('Expected "true" or "false", not {0}'.format(value)) - - if not isinstance(value, bool): - raise ParseError('Expected true or false without quotes') - return value - -_WKTJSONMETHODS = { - 'google.protobuf.Any': ['_AnyMessageToJsonObject', - '_ConvertAnyMessage'], - 'google.protobuf.Duration': ['_GenericMessageToJsonObject', - '_ConvertGenericMessage'], - 'google.protobuf.FieldMask': ['_GenericMessageToJsonObject', - '_ConvertGenericMessage'], - 'google.protobuf.ListValue': ['_ListValueMessageToJsonObject', - '_ConvertListValueMessage'], - 'google.protobuf.Struct': ['_StructMessageToJsonObject', - '_ConvertStructMessage'], - 'google.protobuf.Timestamp': ['_GenericMessageToJsonObject', - '_ConvertGenericMessage'], - 'google.protobuf.Value': ['_ValueMessageToJsonObject', - '_ConvertValueMessage'] -} diff --git a/script.module.protobuf/resources/lib/google/protobuf/message.py b/script.module.protobuf/resources/lib/google/protobuf/message.py deleted file mode 100644 index 37b9c4054..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/message.py +++ /dev/null @@ -1,425 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# TODO(robinson): We should just make these methods all "pure-virtual" and move -# all implementation out, into reflection.py for now. - - -"""Contains an abstract base class for protocol messages.""" - -__author__ = 'robinson@google.com (Will Robinson)' - -class Error(Exception): - """Base error type for this module.""" - pass - - -class DecodeError(Error): - """Exception raised when deserializing messages.""" - pass - - -class EncodeError(Error): - """Exception raised when serializing messages.""" - pass - - -class Message(object): - - """Abstract base class for protocol messages. - - Protocol message classes are almost always generated by the protocol - compiler. These generated types subclass Message and implement the methods - shown below. - """ - - # TODO(robinson): Link to an HTML document here. - - # TODO(robinson): Document that instances of this class will also - # have an Extensions attribute with __getitem__ and __setitem__. - # Again, not sure how to best convey this. - - # TODO(robinson): Document that the class must also have a static - # RegisterExtension(extension_field) method. - # Not sure how to best express at this point. - - # TODO(robinson): Document these fields and methods. - - __slots__ = [] - - #: The :class:`google.protobuf.Descriptor` - # for this message type. - DESCRIPTOR = None - - def __deepcopy__(self, memo=None): - clone = type(self)() - clone.MergeFrom(self) - return clone - - def __eq__(self, other_msg): - """Recursively compares two messages by value and structure.""" - raise NotImplementedError - - def __ne__(self, other_msg): - # Can't just say self != other_msg, since that would infinitely recurse. :) - return not self == other_msg - - def __hash__(self): - raise TypeError('unhashable object') - - def __str__(self): - """Outputs a human-readable representation of the message.""" - raise NotImplementedError - - def __unicode__(self): - """Outputs a human-readable representation of the message.""" - raise NotImplementedError - - def MergeFrom(self, other_msg): - """Merges the contents of the specified message into current message. - - This method merges the contents of the specified message into the current - message. Singular fields that are set in the specified message overwrite - the corresponding fields in the current message. Repeated fields are - appended. Singular sub-messages and groups are recursively merged. - - Args: - other_msg (Message): A message to merge into the current message. - """ - raise NotImplementedError - - def CopyFrom(self, other_msg): - """Copies the content of the specified message into the current message. - - The method clears the current message and then merges the specified - message using MergeFrom. - - Args: - other_msg (Message): A message to copy into the current one. - """ - if self is other_msg: - return - self.Clear() - self.MergeFrom(other_msg) - - def Clear(self): - """Clears all data that was set in the message.""" - raise NotImplementedError - - def SetInParent(self): - """Mark this as present in the parent. - - This normally happens automatically when you assign a field of a - sub-message, but sometimes you want to make the sub-message - present while keeping it empty. If you find yourself using this, - you may want to reconsider your design. - """ - raise NotImplementedError - - def IsInitialized(self): - """Checks if the message is initialized. - - Returns: - bool: The method returns True if the message is initialized (i.e. all of - its required fields are set). - """ - raise NotImplementedError - - # TODO(robinson): MergeFromString() should probably return None and be - # implemented in terms of a helper that returns the # of bytes read. Our - # deserialization routines would use the helper when recursively - # deserializing, but the end user would almost always just want the no-return - # MergeFromString(). - - def MergeFromString(self, serialized): - """Merges serialized protocol buffer data into this message. - - When we find a field in `serialized` that is already present - in this message: - - - If it's a "repeated" field, we append to the end of our list. - - Else, if it's a scalar, we overwrite our field. - - Else, (it's a nonrepeated composite), we recursively merge - into the existing composite. - - Args: - serialized (bytes): Any object that allows us to call - ``memoryview(serialized)`` to access a string of bytes using the - buffer interface. - - Returns: - int: The number of bytes read from `serialized`. - For non-group messages, this will always be `len(serialized)`, - but for messages which are actually groups, this will - generally be less than `len(serialized)`, since we must - stop when we reach an ``END_GROUP`` tag. Note that if - we *do* stop because of an ``END_GROUP`` tag, the number - of bytes returned does not include the bytes - for the ``END_GROUP`` tag information. - - Raises: - DecodeError: if the input cannot be parsed. - """ - # TODO(robinson): Document handling of unknown fields. - # TODO(robinson): When we switch to a helper, this will return None. - raise NotImplementedError - - def ParseFromString(self, serialized): - """Parse serialized protocol buffer data in binary form into this message. - - Like :func:`MergeFromString()`, except we clear the object first. - - Raises: - message.DecodeError if the input cannot be parsed. - """ - self.Clear() - return self.MergeFromString(serialized) - - def SerializeToString(self, **kwargs): - """Serializes the protocol message to a binary string. - - Keyword Args: - deterministic (bool): If true, requests deterministic serialization - of the protobuf, with predictable ordering of map keys. - - Returns: - A binary string representation of the message if all of the required - fields in the message are set (i.e. the message is initialized). - - Raises: - EncodeError: if the message isn't initialized (see :func:`IsInitialized`). - """ - raise NotImplementedError - - def SerializePartialToString(self, **kwargs): - """Serializes the protocol message to a binary string. - - This method is similar to SerializeToString but doesn't check if the - message is initialized. - - Keyword Args: - deterministic (bool): If true, requests deterministic serialization - of the protobuf, with predictable ordering of map keys. - - Returns: - bytes: A serialized representation of the partial message. - """ - raise NotImplementedError - - # TODO(robinson): Decide whether we like these better - # than auto-generated has_foo() and clear_foo() methods - # on the instances themselves. This way is less consistent - # with C++, but it makes reflection-type access easier and - # reduces the number of magically autogenerated things. - # - # TODO(robinson): Be sure to document (and test) exactly - # which field names are accepted here. Are we case-sensitive? - # What do we do with fields that share names with Python keywords - # like 'lambda' and 'yield'? - # - # nnorwitz says: - # """ - # Typically (in python), an underscore is appended to names that are - # keywords. So they would become lambda_ or yield_. - # """ - def ListFields(self): - """Returns a list of (FieldDescriptor, value) tuples for present fields. - - A message field is non-empty if HasField() would return true. A singular - primitive field is non-empty if HasField() would return true in proto2 or it - is non zero in proto3. A repeated field is non-empty if it contains at least - one element. The fields are ordered by field number. - - Returns: - list[tuple(FieldDescriptor, value)]: field descriptors and values - for all fields in the message which are not empty. The values vary by - field type. - """ - raise NotImplementedError - - def HasField(self, field_name): - """Checks if a certain field is set for the message. - - For a oneof group, checks if any field inside is set. Note that if the - field_name is not defined in the message descriptor, :exc:`ValueError` will - be raised. - - Args: - field_name (str): The name of the field to check for presence. - - Returns: - bool: Whether a value has been set for the named field. - - Raises: - ValueError: if the `field_name` is not a member of this message. - """ - raise NotImplementedError - - def ClearField(self, field_name): - """Clears the contents of a given field. - - Inside a oneof group, clears the field set. If the name neither refers to a - defined field or oneof group, :exc:`ValueError` is raised. - - Args: - field_name (str): The name of the field to check for presence. - - Raises: - ValueError: if the `field_name` is not a member of this message. - """ - raise NotImplementedError - - def WhichOneof(self, oneof_group): - """Returns the name of the field that is set inside a oneof group. - - If no field is set, returns None. - - Args: - oneof_group (str): the name of the oneof group to check. - - Returns: - str or None: The name of the group that is set, or None. - - Raises: - ValueError: no group with the given name exists - """ - raise NotImplementedError - - def HasExtension(self, field_descriptor): - """Checks if a certain extension is present for this message. - - Extensions are retrieved using the :attr:`Extensions` mapping (if present). - - Args: - field_descriptor: The field descriptor for the extension to check. - - Returns: - bool: Whether the extension is present for this message. - - Raises: - KeyError: if the extension is repeated. Similar to repeated fields, - there is no separate notion of presence: a "not present" repeated - extension is an empty list. - """ - raise NotImplementedError - - def ClearExtension(self, field_descriptor): - """Clears the contents of a given extension. - - Args: - field_descriptor: The field descriptor for the extension to clear. - """ - raise NotImplementedError - - def UnknownFields(self): - """Returns the UnknownFieldSet. - - Returns: - UnknownFieldSet: The unknown fields stored in this message. - """ - raise NotImplementedError - - def DiscardUnknownFields(self): - """Clears all fields in the :class:`UnknownFieldSet`. - - This operation is recursive for nested message. - """ - raise NotImplementedError - - def ByteSize(self): - """Returns the serialized size of this message. - - Recursively calls ByteSize() on all contained messages. - - Returns: - int: The number of bytes required to serialize this message. - """ - raise NotImplementedError - - @classmethod - def FromString(cls, s): - raise NotImplementedError - - @staticmethod - def RegisterExtension(field_descriptor): - raise NotImplementedError - - def _SetListener(self, message_listener): - """Internal method used by the protocol message implementation. - Clients should not call this directly. - - Sets a listener that this message will call on certain state transitions. - - The purpose of this method is to register back-edges from children to - parents at runtime, for the purpose of setting "has" bits and - byte-size-dirty bits in the parent and ancestor objects whenever a child or - descendant object is modified. - - If the client wants to disconnect this Message from the object tree, she - explicitly sets callback to None. - - If message_listener is None, unregisters any existing listener. Otherwise, - message_listener must implement the MessageListener interface in - internal/message_listener.py, and we discard any listener registered - via a previous _SetListener() call. - """ - raise NotImplementedError - - def __getstate__(self): - """Support the pickle protocol.""" - return dict(serialized=self.SerializePartialToString()) - - def __setstate__(self, state): - """Support the pickle protocol.""" - self.__init__() - serialized = state['serialized'] - # On Python 3, using encoding='latin1' is required for unpickling - # protos pickled by Python 2. - if not isinstance(serialized, bytes): - serialized = serialized.encode('latin1') - self.ParseFromString(serialized) - - def __reduce__(self): - message_descriptor = self.DESCRIPTOR - if message_descriptor.containing_type is None: - return type(self), (), self.__getstate__() - # the message type must be nested. - # Python does not pickle nested classes; use the symbol_database on the - # receiving end. - container = message_descriptor - return (_InternalConstructMessage, (container.full_name,), - self.__getstate__()) - - -def _InternalConstructMessage(full_name): - """Constructs a nested message.""" - from google.protobuf import symbol_database # pylint:disable=g-import-not-at-top - - return symbol_database.Default().GetSymbol(full_name)() diff --git a/script.module.protobuf/resources/lib/google/protobuf/message_factory.py b/script.module.protobuf/resources/lib/google/protobuf/message_factory.py deleted file mode 100644 index 74dd4a676..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/message_factory.py +++ /dev/null @@ -1,234 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Provides a factory class for generating dynamic messages. - -The easiest way to use this class is if you have access to the FileDescriptor -protos containing the messages you want to create you can just do the following: - -message_classes = message_factory.GetMessages(iterable_of_file_descriptors) -my_proto_instance = message_classes['some.proto.package.MessageName']() -""" - -__author__ = 'matthewtoia@google.com (Matt Toia)' - -import warnings - -from google.protobuf.internal import api_implementation -from google.protobuf import descriptor_pool -from google.protobuf import message - -if api_implementation.Type() == 'python': - from google.protobuf.internal import python_message as message_impl -else: - from google.protobuf.pyext import cpp_message as message_impl # pylint: disable=g-import-not-at-top - - -# The type of all Message classes. -_GENERATED_PROTOCOL_MESSAGE_TYPE = message_impl.GeneratedProtocolMessageType - - -def GetMessageClass(descriptor): - """Obtains a proto2 message class based on the passed in descriptor. - - Passing a descriptor with a fully qualified name matching a previous - invocation will cause the same class to be returned. - - Args: - descriptor: The descriptor to build from. - - Returns: - A class describing the passed in descriptor. - """ - concrete_class = getattr(descriptor, '_concrete_class', None) - if concrete_class: - return concrete_class - return _InternalCreateMessageClass(descriptor) - - -def GetMessageClassesForFiles(files, pool): - """Gets all the messages from specified files. - - This will find and resolve dependencies, failing if the descriptor - pool cannot satisfy them. - - Args: - files: The file names to extract messages from. - pool: The descriptor pool to find the files including the dependent - files. - - Returns: - A dictionary mapping proto names to the message classes. - """ - result = {} - for file_name in files: - file_desc = pool.FindFileByName(file_name) - for desc in file_desc.message_types_by_name.values(): - result[desc.full_name] = GetMessageClass(desc) - - # While the extension FieldDescriptors are created by the descriptor pool, - # the python classes created in the factory need them to be registered - # explicitly, which is done below. - # - # The call to RegisterExtension will specifically check if the - # extension was already registered on the object and either - # ignore the registration if the original was the same, or raise - # an error if they were different. - - for extension in file_desc.extensions_by_name.values(): - extended_class = GetMessageClass(extension.containing_type) - extended_class.RegisterExtension(extension) - # Recursively load protos for extension field, in order to be able to - # fully represent the extension. This matches the behavior for regular - # fields too. - if extension.message_type: - GetMessageClass(extension.message_type) - return result - - -def _InternalCreateMessageClass(descriptor): - """Builds a proto2 message class based on the passed in descriptor. - - Args: - descriptor: The descriptor to build from. - - Returns: - A class describing the passed in descriptor. - """ - descriptor_name = descriptor.name - result_class = _GENERATED_PROTOCOL_MESSAGE_TYPE( - descriptor_name, - (message.Message,), - { - 'DESCRIPTOR': descriptor, - # If module not set, it wrongly points to message_factory module. - '__module__': None, - }) - for field in descriptor.fields: - if field.message_type: - GetMessageClass(field.message_type) - for extension in result_class.DESCRIPTOR.extensions: - extended_class = GetMessageClass(extension.containing_type) - extended_class.RegisterExtension(extension) - if extension.message_type: - GetMessageClass(extension.message_type) - return result_class - - -# Deprecated. Please use GetMessageClass() or GetMessageClassesForFiles() -# method above instead. -class MessageFactory(object): - """Factory for creating Proto2 messages from descriptors in a pool.""" - - def __init__(self, pool=None): - """Initializes a new factory.""" - self.pool = pool or descriptor_pool.DescriptorPool() - - def GetPrototype(self, descriptor): - """Obtains a proto2 message class based on the passed in descriptor. - - Passing a descriptor with a fully qualified name matching a previous - invocation will cause the same class to be returned. - - Args: - descriptor: The descriptor to build from. - - Returns: - A class describing the passed in descriptor. - """ - warnings.warn('MessageFactory class is deprecated. Please use ' - 'GetMessageClass() instead of MessageFactory.GetPrototype. ' - 'MessageFactory class will be removed after 2024.') - return GetMessageClass(descriptor) - - def CreatePrototype(self, descriptor): - """Builds a proto2 message class based on the passed in descriptor. - - Don't call this function directly, it always creates a new class. Call - GetMessageClass() instead. - - Args: - descriptor: The descriptor to build from. - - Returns: - A class describing the passed in descriptor. - """ - warnings.warn('Directly call CreatePrototype is wrong. Please use ' - 'GetMessageClass() method instead. Directly use ' - 'CreatePrototype will raise error after July 2023.') - return _InternalCreateMessageClass(descriptor) - - def GetMessages(self, files): - """Gets all the messages from a specified file. - - This will find and resolve dependencies, failing if the descriptor - pool cannot satisfy them. - - Args: - files: The file names to extract messages from. - - Returns: - A dictionary mapping proto names to the message classes. This will include - any dependent messages as well as any messages defined in the same file as - a specified message. - """ - warnings.warn('MessageFactory class is deprecated. Please use ' - 'GetMessageClassesForFiles() instead of ' - 'MessageFactory.GetMessages(). MessageFactory class ' - 'will be removed after 2024.') - return GetMessageClassesForFiles(files, self.pool) - - -def GetMessages(file_protos, pool=None): - """Builds a dictionary of all the messages available in a set of files. - - Args: - file_protos: Iterable of FileDescriptorProto to build messages out of. - pool: The descriptor pool to add the file protos. - - Returns: - A dictionary mapping proto names to the message classes. This will include - any dependent messages as well as any messages defined in the same file as - a specified message. - """ - # The cpp implementation of the protocol buffer library requires to add the - # message in topological order of the dependency graph. - des_pool = pool or descriptor_pool.DescriptorPool() - file_by_name = {file_proto.name: file_proto for file_proto in file_protos} - def _AddFile(file_proto): - for dependency in file_proto.dependency: - if dependency in file_by_name: - # Remove from elements to be visited, in order to cut cycles. - _AddFile(file_by_name.pop(dependency)) - des_pool.Add(file_proto) - while file_by_name: - _AddFile(file_by_name.popitem()[1]) - return GetMessageClassesForFiles( - [file_proto.name for file_proto in file_protos], des_pool) diff --git a/script.module.protobuf/resources/lib/google/protobuf/proto_builder.py b/script.module.protobuf/resources/lib/google/protobuf/proto_builder.py deleted file mode 100644 index 8dab8b3ee..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/proto_builder.py +++ /dev/null @@ -1,134 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Dynamic Protobuf class creator.""" - -from collections import OrderedDict -import hashlib -import os - -from google.protobuf import descriptor_pb2 -from google.protobuf import descriptor -from google.protobuf import descriptor_pool -from google.protobuf import message_factory - - -def _GetMessageFromFactory(pool, full_name): - """Get a proto class from the MessageFactory by name. - - Args: - pool: a descriptor pool. - full_name: str, the fully qualified name of the proto type. - Returns: - A class, for the type identified by full_name. - Raises: - KeyError, if the proto is not found in the factory's descriptor pool. - """ - proto_descriptor = pool.FindMessageTypeByName(full_name) - proto_cls = message_factory.GetMessageClass(proto_descriptor) - return proto_cls - - -def MakeSimpleProtoClass(fields, full_name=None, pool=None): - """Create a Protobuf class whose fields are basic types. - - Note: this doesn't validate field names! - - Args: - fields: dict of {name: field_type} mappings for each field in the proto. If - this is an OrderedDict the order will be maintained, otherwise the - fields will be sorted by name. - full_name: optional str, the fully-qualified name of the proto type. - pool: optional DescriptorPool instance. - Returns: - a class, the new protobuf class with a FileDescriptor. - """ - pool_instance = pool or descriptor_pool.DescriptorPool() - if full_name is not None: - try: - proto_cls = _GetMessageFromFactory(pool_instance, full_name) - return proto_cls - except KeyError: - # The factory's DescriptorPool doesn't know about this class yet. - pass - - # Get a list of (name, field_type) tuples from the fields dict. If fields was - # an OrderedDict we keep the order, but otherwise we sort the field to ensure - # consistent ordering. - field_items = fields.items() - if not isinstance(fields, OrderedDict): - field_items = sorted(field_items) - - # Use a consistent file name that is unlikely to conflict with any imported - # proto files. - fields_hash = hashlib.sha1() - for f_name, f_type in field_items: - fields_hash.update(f_name.encode('utf-8')) - fields_hash.update(str(f_type).encode('utf-8')) - proto_file_name = fields_hash.hexdigest() + '.proto' - - # If the proto is anonymous, use the same hash to name it. - if full_name is None: - full_name = ('net.proto2.python.public.proto_builder.AnonymousProto_' + - fields_hash.hexdigest()) - try: - proto_cls = _GetMessageFromFactory(pool_instance, full_name) - return proto_cls - except KeyError: - # The factory's DescriptorPool doesn't know about this class yet. - pass - - # This is the first time we see this proto: add a new descriptor to the pool. - pool_instance.Add( - _MakeFileDescriptorProto(proto_file_name, full_name, field_items)) - return _GetMessageFromFactory(pool_instance, full_name) - - -def _MakeFileDescriptorProto(proto_file_name, full_name, field_items): - """Populate FileDescriptorProto for MessageFactory's DescriptorPool.""" - package, name = full_name.rsplit('.', 1) - file_proto = descriptor_pb2.FileDescriptorProto() - file_proto.name = os.path.join(package.replace('.', '/'), proto_file_name) - file_proto.package = package - desc_proto = file_proto.message_type.add() - desc_proto.name = name - for f_number, (f_name, f_type) in enumerate(field_items, 1): - field_proto = desc_proto.field.add() - field_proto.name = f_name - # # If the number falls in the reserved range, reassign it to the correct - # # number after the range. - if f_number >= descriptor.FieldDescriptor.FIRST_RESERVED_FIELD_NUMBER: - f_number += ( - descriptor.FieldDescriptor.LAST_RESERVED_FIELD_NUMBER - - descriptor.FieldDescriptor.FIRST_RESERVED_FIELD_NUMBER + 1) - field_proto.number = f_number - field_proto.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL - field_proto.type = f_type - return file_proto diff --git a/script.module.protobuf/resources/lib/google/protobuf/pyext/__init__.py b/script.module.protobuf/resources/lib/google/protobuf/pyext/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/script.module.protobuf/resources/lib/google/protobuf/pyext/cpp_message.py b/script.module.protobuf/resources/lib/google/protobuf/pyext/cpp_message.py deleted file mode 100644 index ca290299f..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/pyext/cpp_message.py +++ /dev/null @@ -1,72 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Protocol message implementation hooks for C++ implementation. - -Contains helper functions used to create protocol message classes from -Descriptor objects at runtime backed by the protocol buffer C++ API. -""" - -__author__ = 'tibell@google.com (Johan Tibell)' - -from google.protobuf.internal import api_implementation - - -# pylint: disable=protected-access -_message = api_implementation._c_module -# TODO(jieluo): Remove this import after fix api_implementation -if _message is None: - from google.protobuf.pyext import _message - - -class GeneratedProtocolMessageType(_message.MessageMeta): - - """Metaclass for protocol message classes created at runtime from Descriptors. - - The protocol compiler currently uses this metaclass to create protocol - message classes at runtime. Clients can also manually create their own - classes at runtime, as in this example: - - mydescriptor = Descriptor(.....) - factory = symbol_database.Default() - factory.pool.AddDescriptor(mydescriptor) - MyProtoClass = factory.GetPrototype(mydescriptor) - myproto_instance = MyProtoClass() - myproto.foo_field = 23 - ... - - The above example will not work for nested types. If you wish to include them, - use reflection.MakeClass() instead of manually instantiating the class in - order to create the appropriate class structure. - """ - - # Must be consistent with the protocol-compiler code in - # proto2/compiler/internal/generator.*. - _DESCRIPTOR_KEY = 'DESCRIPTOR' diff --git a/script.module.protobuf/resources/lib/google/protobuf/reflection.py b/script.module.protobuf/resources/lib/google/protobuf/reflection.py deleted file mode 100644 index 1627669b9..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/reflection.py +++ /dev/null @@ -1,95 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# This code is meant to work on Python 2.4 and above only. - -"""Contains a metaclass and helper functions used to create -protocol message classes from Descriptor objects at runtime. - -Recall that a metaclass is the "type" of a class. -(A class is to a metaclass what an instance is to a class.) - -In this case, we use the GeneratedProtocolMessageType metaclass -to inject all the useful functionality into the classes -output by the protocol compiler at compile-time. - -The upshot of all this is that the real implementation -details for ALL pure-Python protocol buffers are *here in -this file*. -""" - -__author__ = 'robinson@google.com (Will Robinson)' - - -from google.protobuf import message_factory -from google.protobuf import symbol_database - -# The type of all Message classes. -# Part of the public interface, but normally only used by message factories. -GeneratedProtocolMessageType = message_factory._GENERATED_PROTOCOL_MESSAGE_TYPE - -MESSAGE_CLASS_CACHE = {} - - -# Deprecated. Please NEVER use reflection.ParseMessage(). -def ParseMessage(descriptor, byte_str): - """Generate a new Message instance from this Descriptor and a byte string. - - DEPRECATED: ParseMessage is deprecated because it is using MakeClass(). - Please use MessageFactory.GetPrototype() instead. - - Args: - descriptor: Protobuf Descriptor object - byte_str: Serialized protocol buffer byte string - - Returns: - Newly created protobuf Message object. - """ - result_class = MakeClass(descriptor) - new_msg = result_class() - new_msg.ParseFromString(byte_str) - return new_msg - - -# Deprecated. Please NEVER use reflection.MakeClass(). -def MakeClass(descriptor): - """Construct a class object for a protobuf described by descriptor. - - DEPRECATED: use MessageFactory.GetPrototype() instead. - - Args: - descriptor: A descriptor.Descriptor object describing the protobuf. - Returns: - The Message class object described by the descriptor. - """ - # Original implementation leads to duplicate message classes, which won't play - # well with extensions. Message factory info is also missing. - # Redirect to message_factory. - return message_factory.GetMessageClass(descriptor) diff --git a/script.module.protobuf/resources/lib/google/protobuf/service.py b/script.module.protobuf/resources/lib/google/protobuf/service.py deleted file mode 100644 index 562524632..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/service.py +++ /dev/null @@ -1,228 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""DEPRECATED: Declares the RPC service interfaces. - -This module declares the abstract interfaces underlying proto2 RPC -services. These are intended to be independent of any particular RPC -implementation, so that proto2 services can be used on top of a variety -of implementations. Starting with version 2.3.0, RPC implementations should -not try to build on these, but should instead provide code generator plugins -which generate code specific to the particular RPC implementation. This way -the generated code can be more appropriate for the implementation in use -and can avoid unnecessary layers of indirection. -""" - -__author__ = 'petar@google.com (Petar Petrov)' - - -class RpcException(Exception): - """Exception raised on failed blocking RPC method call.""" - pass - - -class Service(object): - - """Abstract base interface for protocol-buffer-based RPC services. - - Services themselves are abstract classes (implemented either by servers or as - stubs), but they subclass this base interface. The methods of this - interface can be used to call the methods of the service without knowing - its exact type at compile time (analogous to the Message interface). - """ - - def GetDescriptor(): - """Retrieves this service's descriptor.""" - raise NotImplementedError - - def CallMethod(self, method_descriptor, rpc_controller, - request, done): - """Calls a method of the service specified by method_descriptor. - - If "done" is None then the call is blocking and the response - message will be returned directly. Otherwise the call is asynchronous - and "done" will later be called with the response value. - - In the blocking case, RpcException will be raised on error. - - Preconditions: - - * method_descriptor.service == GetDescriptor - * request is of the exact same classes as returned by - GetRequestClass(method). - * After the call has started, the request must not be modified. - * "rpc_controller" is of the correct type for the RPC implementation being - used by this Service. For stubs, the "correct type" depends on the - RpcChannel which the stub is using. - - Postconditions: - - * "done" will be called when the method is complete. This may be - before CallMethod() returns or it may be at some point in the future. - * If the RPC failed, the response value passed to "done" will be None. - Further details about the failure can be found by querying the - RpcController. - """ - raise NotImplementedError - - def GetRequestClass(self, method_descriptor): - """Returns the class of the request message for the specified method. - - CallMethod() requires that the request is of a particular subclass of - Message. GetRequestClass() gets the default instance of this required - type. - - Example: - method = service.GetDescriptor().FindMethodByName("Foo") - request = stub.GetRequestClass(method)() - request.ParseFromString(input) - service.CallMethod(method, request, callback) - """ - raise NotImplementedError - - def GetResponseClass(self, method_descriptor): - """Returns the class of the response message for the specified method. - - This method isn't really needed, as the RpcChannel's CallMethod constructs - the response protocol message. It's provided anyway in case it is useful - for the caller to know the response type in advance. - """ - raise NotImplementedError - - -class RpcController(object): - - """An RpcController mediates a single method call. - - The primary purpose of the controller is to provide a way to manipulate - settings specific to the RPC implementation and to find out about RPC-level - errors. The methods provided by the RpcController interface are intended - to be a "least common denominator" set of features which we expect all - implementations to support. Specific implementations may provide more - advanced features (e.g. deadline propagation). - """ - - # Client-side methods below - - def Reset(self): - """Resets the RpcController to its initial state. - - After the RpcController has been reset, it may be reused in - a new call. Must not be called while an RPC is in progress. - """ - raise NotImplementedError - - def Failed(self): - """Returns true if the call failed. - - After a call has finished, returns true if the call failed. The possible - reasons for failure depend on the RPC implementation. Failed() must not - be called before a call has finished. If Failed() returns true, the - contents of the response message are undefined. - """ - raise NotImplementedError - - def ErrorText(self): - """If Failed is true, returns a human-readable description of the error.""" - raise NotImplementedError - - def StartCancel(self): - """Initiate cancellation. - - Advises the RPC system that the caller desires that the RPC call be - canceled. The RPC system may cancel it immediately, may wait awhile and - then cancel it, or may not even cancel the call at all. If the call is - canceled, the "done" callback will still be called and the RpcController - will indicate that the call failed at that time. - """ - raise NotImplementedError - - # Server-side methods below - - def SetFailed(self, reason): - """Sets a failure reason. - - Causes Failed() to return true on the client side. "reason" will be - incorporated into the message returned by ErrorText(). If you find - you need to return machine-readable information about failures, you - should incorporate it into your response protocol buffer and should - NOT call SetFailed(). - """ - raise NotImplementedError - - def IsCanceled(self): - """Checks if the client cancelled the RPC. - - If true, indicates that the client canceled the RPC, so the server may - as well give up on replying to it. The server should still call the - final "done" callback. - """ - raise NotImplementedError - - def NotifyOnCancel(self, callback): - """Sets a callback to invoke on cancel. - - Asks that the given callback be called when the RPC is canceled. The - callback will always be called exactly once. If the RPC completes without - being canceled, the callback will be called after completion. If the RPC - has already been canceled when NotifyOnCancel() is called, the callback - will be called immediately. - - NotifyOnCancel() must be called no more than once per request. - """ - raise NotImplementedError - - -class RpcChannel(object): - - """Abstract interface for an RPC channel. - - An RpcChannel represents a communication line to a service which can be used - to call that service's methods. The service may be running on another - machine. Normally, you should not use an RpcChannel directly, but instead - construct a stub {@link Service} wrapping it. Example: - - Example: - RpcChannel channel = rpcImpl.Channel("remotehost.example.com:1234") - RpcController controller = rpcImpl.Controller() - MyService service = MyService_Stub(channel) - service.MyMethod(controller, request, callback) - """ - - def CallMethod(self, method_descriptor, rpc_controller, - request, response_class, done): - """Calls the method identified by the descriptor. - - Call the given method of the remote service. The signature of this - procedure looks the same as Service.CallMethod(), but the requirements - are less strict in one important way: the request object doesn't have to - be of any specific class as long as its descriptor is method.input_type. - """ - raise NotImplementedError diff --git a/script.module.protobuf/resources/lib/google/protobuf/service_reflection.py b/script.module.protobuf/resources/lib/google/protobuf/service_reflection.py deleted file mode 100644 index f82ab7145..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/service_reflection.py +++ /dev/null @@ -1,295 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Contains metaclasses used to create protocol service and service stub -classes from ServiceDescriptor objects at runtime. - -The GeneratedServiceType and GeneratedServiceStubType metaclasses are used to -inject all useful functionality into the classes output by the protocol -compiler at compile-time. -""" - -__author__ = 'petar@google.com (Petar Petrov)' - - -class GeneratedServiceType(type): - - """Metaclass for service classes created at runtime from ServiceDescriptors. - - Implementations for all methods described in the Service class are added here - by this class. We also create properties to allow getting/setting all fields - in the protocol message. - - The protocol compiler currently uses this metaclass to create protocol service - classes at runtime. Clients can also manually create their own classes at - runtime, as in this example:: - - mydescriptor = ServiceDescriptor(.....) - class MyProtoService(service.Service): - __metaclass__ = GeneratedServiceType - DESCRIPTOR = mydescriptor - myservice_instance = MyProtoService() - # ... - """ - - _DESCRIPTOR_KEY = 'DESCRIPTOR' - - def __init__(cls, name, bases, dictionary): - """Creates a message service class. - - Args: - name: Name of the class (ignored, but required by the metaclass - protocol). - bases: Base classes of the class being constructed. - dictionary: The class dictionary of the class being constructed. - dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object - describing this protocol service type. - """ - # Don't do anything if this class doesn't have a descriptor. This happens - # when a service class is subclassed. - if GeneratedServiceType._DESCRIPTOR_KEY not in dictionary: - return - - descriptor = dictionary[GeneratedServiceType._DESCRIPTOR_KEY] - service_builder = _ServiceBuilder(descriptor) - service_builder.BuildService(cls) - cls.DESCRIPTOR = descriptor - - -class GeneratedServiceStubType(GeneratedServiceType): - - """Metaclass for service stubs created at runtime from ServiceDescriptors. - - This class has similar responsibilities as GeneratedServiceType, except that - it creates the service stub classes. - """ - - _DESCRIPTOR_KEY = 'DESCRIPTOR' - - def __init__(cls, name, bases, dictionary): - """Creates a message service stub class. - - Args: - name: Name of the class (ignored, here). - bases: Base classes of the class being constructed. - dictionary: The class dictionary of the class being constructed. - dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object - describing this protocol service type. - """ - super(GeneratedServiceStubType, cls).__init__(name, bases, dictionary) - # Don't do anything if this class doesn't have a descriptor. This happens - # when a service stub is subclassed. - if GeneratedServiceStubType._DESCRIPTOR_KEY not in dictionary: - return - - descriptor = dictionary[GeneratedServiceStubType._DESCRIPTOR_KEY] - service_stub_builder = _ServiceStubBuilder(descriptor) - service_stub_builder.BuildServiceStub(cls) - - -class _ServiceBuilder(object): - - """This class constructs a protocol service class using a service descriptor. - - Given a service descriptor, this class constructs a class that represents - the specified service descriptor. One service builder instance constructs - exactly one service class. That means all instances of that class share the - same builder. - """ - - def __init__(self, service_descriptor): - """Initializes an instance of the service class builder. - - Args: - service_descriptor: ServiceDescriptor to use when constructing the - service class. - """ - self.descriptor = service_descriptor - - def BuildService(builder, cls): - """Constructs the service class. - - Args: - cls: The class that will be constructed. - """ - - # CallMethod needs to operate with an instance of the Service class. This - # internal wrapper function exists only to be able to pass the service - # instance to the method that does the real CallMethod work. - # Making sure to use exact argument names from the abstract interface in - # service.py to match the type signature - def _WrapCallMethod(self, method_descriptor, rpc_controller, request, done): - return builder._CallMethod(self, method_descriptor, rpc_controller, - request, done) - - def _WrapGetRequestClass(self, method_descriptor): - return builder._GetRequestClass(method_descriptor) - - def _WrapGetResponseClass(self, method_descriptor): - return builder._GetResponseClass(method_descriptor) - - builder.cls = cls - cls.CallMethod = _WrapCallMethod - cls.GetDescriptor = staticmethod(lambda: builder.descriptor) - cls.GetDescriptor.__doc__ = 'Returns the service descriptor.' - cls.GetRequestClass = _WrapGetRequestClass - cls.GetResponseClass = _WrapGetResponseClass - for method in builder.descriptor.methods: - setattr(cls, method.name, builder._GenerateNonImplementedMethod(method)) - - def _CallMethod(self, srvc, method_descriptor, - rpc_controller, request, callback): - """Calls the method described by a given method descriptor. - - Args: - srvc: Instance of the service for which this method is called. - method_descriptor: Descriptor that represent the method to call. - rpc_controller: RPC controller to use for this method's execution. - request: Request protocol message. - callback: A callback to invoke after the method has completed. - """ - if method_descriptor.containing_service != self.descriptor: - raise RuntimeError( - 'CallMethod() given method descriptor for wrong service type.') - method = getattr(srvc, method_descriptor.name) - return method(rpc_controller, request, callback) - - def _GetRequestClass(self, method_descriptor): - """Returns the class of the request protocol message. - - Args: - method_descriptor: Descriptor of the method for which to return the - request protocol message class. - - Returns: - A class that represents the input protocol message of the specified - method. - """ - if method_descriptor.containing_service != self.descriptor: - raise RuntimeError( - 'GetRequestClass() given method descriptor for wrong service type.') - return method_descriptor.input_type._concrete_class - - def _GetResponseClass(self, method_descriptor): - """Returns the class of the response protocol message. - - Args: - method_descriptor: Descriptor of the method for which to return the - response protocol message class. - - Returns: - A class that represents the output protocol message of the specified - method. - """ - if method_descriptor.containing_service != self.descriptor: - raise RuntimeError( - 'GetResponseClass() given method descriptor for wrong service type.') - return method_descriptor.output_type._concrete_class - - def _GenerateNonImplementedMethod(self, method): - """Generates and returns a method that can be set for a service methods. - - Args: - method: Descriptor of the service method for which a method is to be - generated. - - Returns: - A method that can be added to the service class. - """ - return lambda inst, rpc_controller, request, callback: ( - self._NonImplementedMethod(method.name, rpc_controller, callback)) - - def _NonImplementedMethod(self, method_name, rpc_controller, callback): - """The body of all methods in the generated service class. - - Args: - method_name: Name of the method being executed. - rpc_controller: RPC controller used to execute this method. - callback: A callback which will be invoked when the method finishes. - """ - rpc_controller.SetFailed('Method %s not implemented.' % method_name) - callback(None) - - -class _ServiceStubBuilder(object): - - """Constructs a protocol service stub class using a service descriptor. - - Given a service descriptor, this class constructs a suitable stub class. - A stub is just a type-safe wrapper around an RpcChannel which emulates a - local implementation of the service. - - One service stub builder instance constructs exactly one class. It means all - instances of that class share the same service stub builder. - """ - - def __init__(self, service_descriptor): - """Initializes an instance of the service stub class builder. - - Args: - service_descriptor: ServiceDescriptor to use when constructing the - stub class. - """ - self.descriptor = service_descriptor - - def BuildServiceStub(self, cls): - """Constructs the stub class. - - Args: - cls: The class that will be constructed. - """ - - def _ServiceStubInit(stub, rpc_channel): - stub.rpc_channel = rpc_channel - self.cls = cls - cls.__init__ = _ServiceStubInit - for method in self.descriptor.methods: - setattr(cls, method.name, self._GenerateStubMethod(method)) - - def _GenerateStubMethod(self, method): - return (lambda inst, rpc_controller, request, callback=None: - self._StubMethod(inst, method, rpc_controller, request, callback)) - - def _StubMethod(self, stub, method_descriptor, - rpc_controller, request, callback): - """The body of all service methods in the generated stub class. - - Args: - stub: Stub instance. - method_descriptor: Descriptor of the invoked method. - rpc_controller: Rpc controller to execute the method. - request: Request protocol message. - callback: A callback to execute when the method finishes. - Returns: - Response message (in case of blocking call). - """ - return stub.rpc_channel.CallMethod( - method_descriptor, rpc_controller, request, - method_descriptor.output_type._concrete_class, callback) diff --git a/script.module.protobuf/resources/lib/google/protobuf/source_context_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/source_context_pb2.py deleted file mode 100644 index e69cd1759..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/source_context_pb2.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/source_context.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$google/protobuf/source_context.proto\x12\x0fgoogle.protobuf\",\n\rSourceContext\x12\x1b\n\tfile_name\x18\x01 \x01(\tR\x08\x66ileNameB\x8a\x01\n\x13\x63om.google.protobufB\x12SourceContextProtoP\x01Z6google.golang.org/protobuf/types/known/sourcecontextpb\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.source_context_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\022SourceContextProtoP\001Z6google.golang.org/protobuf/types/known/sourcecontextpb\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_SOURCECONTEXT']._serialized_start=57 - _globals['_SOURCECONTEXT']._serialized_end=101 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/struct_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/struct_pb2.py deleted file mode 100644 index ec1d62d04..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/struct_pb2.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/struct.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1cgoogle/protobuf/struct.proto\x12\x0fgoogle.protobuf\"\x98\x01\n\x06Struct\x12;\n\x06\x66ields\x18\x01 \x03(\x0b\x32#.google.protobuf.Struct.FieldsEntryR\x06\x66ields\x1aQ\n\x0b\x46ieldsEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12,\n\x05value\x18\x02 \x01(\x0b\x32\x16.google.protobuf.ValueR\x05value:\x02\x38\x01\"\xb2\x02\n\x05Value\x12;\n\nnull_value\x18\x01 \x01(\x0e\x32\x1a.google.protobuf.NullValueH\x00R\tnullValue\x12#\n\x0cnumber_value\x18\x02 \x01(\x01H\x00R\x0bnumberValue\x12#\n\x0cstring_value\x18\x03 \x01(\tH\x00R\x0bstringValue\x12\x1f\n\nbool_value\x18\x04 \x01(\x08H\x00R\tboolValue\x12<\n\x0cstruct_value\x18\x05 \x01(\x0b\x32\x17.google.protobuf.StructH\x00R\x0bstructValue\x12;\n\nlist_value\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.ListValueH\x00R\tlistValueB\x06\n\x04kind\";\n\tListValue\x12.\n\x06values\x18\x01 \x03(\x0b\x32\x16.google.protobuf.ValueR\x06values*\x1b\n\tNullValue\x12\x0e\n\nNULL_VALUE\x10\x00\x42\x7f\n\x13\x63om.google.protobufB\x0bStructProtoP\x01Z/google.golang.org/protobuf/types/known/structpb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.struct_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\013StructProtoP\001Z/google.golang.org/protobuf/types/known/structpb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _STRUCT_FIELDSENTRY._options = None - _STRUCT_FIELDSENTRY._serialized_options = b'8\001' - _globals['_NULLVALUE']._serialized_start=574 - _globals['_NULLVALUE']._serialized_end=601 - _globals['_STRUCT']._serialized_start=50 - _globals['_STRUCT']._serialized_end=202 - _globals['_STRUCT_FIELDSENTRY']._serialized_start=121 - _globals['_STRUCT_FIELDSENTRY']._serialized_end=202 - _globals['_VALUE']._serialized_start=205 - _globals['_VALUE']._serialized_end=511 - _globals['_LISTVALUE']._serialized_start=513 - _globals['_LISTVALUE']._serialized_end=572 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/symbol_database.py b/script.module.protobuf/resources/lib/google/protobuf/symbol_database.py deleted file mode 100644 index 390c49810..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/symbol_database.py +++ /dev/null @@ -1,220 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""A database of Python protocol buffer generated symbols. - -SymbolDatabase is the MessageFactory for messages generated at compile time, -and makes it easy to create new instances of a registered type, given only the -type's protocol buffer symbol name. - -Example usage:: - - db = symbol_database.SymbolDatabase() - - # Register symbols of interest, from one or multiple files. - db.RegisterFileDescriptor(my_proto_pb2.DESCRIPTOR) - db.RegisterMessage(my_proto_pb2.MyMessage) - db.RegisterEnumDescriptor(my_proto_pb2.MyEnum.DESCRIPTOR) - - # The database can be used as a MessageFactory, to generate types based on - # their name: - types = db.GetMessages(['my_proto.proto']) - my_message_instance = types['MyMessage']() - - # The database's underlying descriptor pool can be queried, so it's not - # necessary to know a type's filename to be able to generate it: - filename = db.pool.FindFileContainingSymbol('MyMessage') - my_message_instance = db.GetMessages([filename])['MyMessage']() - - # This functionality is also provided directly via a convenience method: - my_message_instance = db.GetSymbol('MyMessage')() -""" - -import warnings - -from google.protobuf.internal import api_implementation -from google.protobuf import descriptor_pool -from google.protobuf import message_factory - - -class SymbolDatabase(): - """A database of Python generated symbols.""" - - # local cache of registered classes. - _classes = {} - - def __init__(self, pool=None): - """Initializes a new SymbolDatabase.""" - self.pool = pool or descriptor_pool.DescriptorPool() - - def GetPrototype(self, descriptor): - warnings.warn('SymbolDatabase.GetPrototype() is deprecated. Please ' - 'use message_factory.GetMessageClass() instead. ' - 'SymbolDatabase.GetPrototype() will be removed soon.') - return message_factory.GetMessageClass(descriptor) - - def CreatePrototype(self, descriptor): - warnings.warn('Directly call CreatePrototype() is wrong. Please use ' - 'message_factory.GetMessageClass() instead. ' - 'SymbolDatabase.CreatePrototype() will be removed soon.') - return message_factory._InternalCreateMessageClass(descriptor) - - def GetMessages(self, files): - warnings.warn('SymbolDatabase.GetMessages() is deprecated. Please use ' - 'message_factory.GetMessageClassedForFiles() instead. ' - 'SymbolDatabase.GetMessages() will be removed soon.') - return message_factory.GetMessageClassedForFiles(files, self.pool) - - def RegisterMessage(self, message): - """Registers the given message type in the local database. - - Calls to GetSymbol() and GetMessages() will return messages registered here. - - Args: - message: A :class:`google.protobuf.message.Message` subclass (or - instance); its descriptor will be registered. - - Returns: - The provided message. - """ - - desc = message.DESCRIPTOR - self._classes[desc] = message - self.RegisterMessageDescriptor(desc) - return message - - def RegisterMessageDescriptor(self, message_descriptor): - """Registers the given message descriptor in the local database. - - Args: - message_descriptor (Descriptor): the message descriptor to add. - """ - if api_implementation.Type() == 'python': - # pylint: disable=protected-access - self.pool._AddDescriptor(message_descriptor) - - def RegisterEnumDescriptor(self, enum_descriptor): - """Registers the given enum descriptor in the local database. - - Args: - enum_descriptor (EnumDescriptor): The enum descriptor to register. - - Returns: - EnumDescriptor: The provided descriptor. - """ - if api_implementation.Type() == 'python': - # pylint: disable=protected-access - self.pool._AddEnumDescriptor(enum_descriptor) - return enum_descriptor - - def RegisterServiceDescriptor(self, service_descriptor): - """Registers the given service descriptor in the local database. - - Args: - service_descriptor (ServiceDescriptor): the service descriptor to - register. - """ - if api_implementation.Type() == 'python': - # pylint: disable=protected-access - self.pool._AddServiceDescriptor(service_descriptor) - - def RegisterFileDescriptor(self, file_descriptor): - """Registers the given file descriptor in the local database. - - Args: - file_descriptor (FileDescriptor): The file descriptor to register. - """ - if api_implementation.Type() == 'python': - # pylint: disable=protected-access - self.pool._InternalAddFileDescriptor(file_descriptor) - - def GetSymbol(self, symbol): - """Tries to find a symbol in the local database. - - Currently, this method only returns message.Message instances, however, if - may be extended in future to support other symbol types. - - Args: - symbol (str): a protocol buffer symbol. - - Returns: - A Python class corresponding to the symbol. - - Raises: - KeyError: if the symbol could not be found. - """ - - return self._classes[self.pool.FindMessageTypeByName(symbol)] - - def GetMessages(self, files): - # TODO(amauryfa): Fix the differences with MessageFactory. - """Gets all registered messages from a specified file. - - Only messages already created and registered will be returned; (this is the - case for imported _pb2 modules) - But unlike MessageFactory, this version also returns already defined nested - messages, but does not register any message extensions. - - Args: - files (list[str]): The file names to extract messages from. - - Returns: - A dictionary mapping proto names to the message classes. - - Raises: - KeyError: if a file could not be found. - """ - - def _GetAllMessages(desc): - """Walk a message Descriptor and recursively yields all message names.""" - yield desc - for msg_desc in desc.nested_types: - for nested_desc in _GetAllMessages(msg_desc): - yield nested_desc - - result = {} - for file_name in files: - file_desc = self.pool.FindFileByName(file_name) - for msg_desc in file_desc.message_types_by_name.values(): - for desc in _GetAllMessages(msg_desc): - try: - result[desc.full_name] = self._classes[desc] - except KeyError: - # This descriptor has no registered class, skip it. - pass - return result - - -_DEFAULT = SymbolDatabase(pool=descriptor_pool.Default()) - - -def Default(): - """Returns the default SymbolDatabase.""" - return _DEFAULT diff --git a/script.module.protobuf/resources/lib/google/protobuf/text_encoding.py b/script.module.protobuf/resources/lib/google/protobuf/text_encoding.py deleted file mode 100644 index 1955b6a3c..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/text_encoding.py +++ /dev/null @@ -1,108 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Encoding related utilities.""" -import re - -_cescape_chr_to_symbol_map = {} -_cescape_chr_to_symbol_map[9] = r'\t' # optional escape -_cescape_chr_to_symbol_map[10] = r'\n' # optional escape -_cescape_chr_to_symbol_map[13] = r'\r' # optional escape -_cescape_chr_to_symbol_map[34] = r'\"' # necessary escape -_cescape_chr_to_symbol_map[39] = r"\'" # optional escape -_cescape_chr_to_symbol_map[92] = r'\\' # necessary escape - -# Lookup table for unicode -_cescape_unicode_to_str = [chr(i) for i in range(0, 256)] -for byte, string in _cescape_chr_to_symbol_map.items(): - _cescape_unicode_to_str[byte] = string - -# Lookup table for non-utf8, with necessary escapes at (o >= 127 or o < 32) -_cescape_byte_to_str = ([r'\%03o' % i for i in range(0, 32)] + - [chr(i) for i in range(32, 127)] + - [r'\%03o' % i for i in range(127, 256)]) -for byte, string in _cescape_chr_to_symbol_map.items(): - _cescape_byte_to_str[byte] = string -del byte, string - - -def CEscape(text, as_utf8) -> str: - """Escape a bytes string for use in an text protocol buffer. - - Args: - text: A byte string to be escaped. - as_utf8: Specifies if result may contain non-ASCII characters. - In Python 3 this allows unescaped non-ASCII Unicode characters. - In Python 2 the return value will be valid UTF-8 rather than only ASCII. - Returns: - Escaped string (str). - """ - # Python's text.encode() 'string_escape' or 'unicode_escape' codecs do not - # satisfy our needs; they encodes unprintable characters using two-digit hex - # escapes whereas our C++ unescaping function allows hex escapes to be any - # length. So, "\0011".encode('string_escape') ends up being "\\x011", which - # will be decoded in C++ as a single-character string with char code 0x11. - text_is_unicode = isinstance(text, str) - if as_utf8 and text_is_unicode: - # We're already unicode, no processing beyond control char escapes. - return text.translate(_cescape_chr_to_symbol_map) - ord_ = ord if text_is_unicode else lambda x: x # bytes iterate as ints. - if as_utf8: - return ''.join(_cescape_unicode_to_str[ord_(c)] for c in text) - return ''.join(_cescape_byte_to_str[ord_(c)] for c in text) - - -_CUNESCAPE_HEX = re.compile(r'(\\+)x([0-9a-fA-F])(?![0-9a-fA-F])') - - -def CUnescape(text: str) -> bytes: - """Unescape a text string with C-style escape sequences to UTF-8 bytes. - - Args: - text: The data to parse in a str. - Returns: - A byte string. - """ - - def ReplaceHex(m): - # Only replace the match if the number of leading back slashes is odd. i.e. - # the slash itself is not escaped. - if len(m.group(1)) & 1: - return m.group(1) + 'x0' + m.group(2) - return m.group(0) - - # This is required because the 'string_escape' encoding doesn't - # allow single-digit hex escapes (like '\xf'). - result = _CUNESCAPE_HEX.sub(ReplaceHex, text) - - return (result.encode('utf-8') # Make it bytes to allow decode. - .decode('unicode_escape') - # Make it bytes again to return the proper type. - .encode('raw_unicode_escape')) diff --git a/script.module.protobuf/resources/lib/google/protobuf/text_format.py b/script.module.protobuf/resources/lib/google/protobuf/text_format.py deleted file mode 100644 index 7a6ca7df0..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/text_format.py +++ /dev/null @@ -1,1857 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Contains routines for printing protocol messages in text format. - -Simple usage example:: - - # Create a proto object and serialize it to a text proto string. - message = my_proto_pb2.MyMessage(foo='bar') - text_proto = text_format.MessageToString(message) - - # Parse a text proto string. - message = text_format.Parse(text_proto, my_proto_pb2.MyMessage()) -""" - -__author__ = 'kenton@google.com (Kenton Varda)' - -# TODO(b/129989314) Import thread contention leads to test failures. -import encodings.raw_unicode_escape # pylint: disable=unused-import -import encodings.unicode_escape # pylint: disable=unused-import -import io -import math -import re - -from google.protobuf.internal import decoder -from google.protobuf.internal import type_checkers -from google.protobuf import descriptor -from google.protobuf import text_encoding -from google.protobuf import unknown_fields - -# pylint: disable=g-import-not-at-top -__all__ = ['MessageToString', 'Parse', 'PrintMessage', 'PrintField', - 'PrintFieldValue', 'Merge', 'MessageToBytes'] - -_INTEGER_CHECKERS = (type_checkers.Uint32ValueChecker(), - type_checkers.Int32ValueChecker(), - type_checkers.Uint64ValueChecker(), - type_checkers.Int64ValueChecker()) -_FLOAT_INFINITY = re.compile('-?inf(?:inity)?f?$', re.IGNORECASE) -_FLOAT_NAN = re.compile('nanf?$', re.IGNORECASE) -_QUOTES = frozenset(("'", '"')) -_ANY_FULL_TYPE_NAME = 'google.protobuf.Any' -_DEBUG_STRING_SILENT_MARKER = '\t ' - - -class Error(Exception): - """Top-level module error for text_format.""" - - -class ParseError(Error): - """Thrown in case of text parsing or tokenizing error.""" - - def __init__(self, message=None, line=None, column=None): - if message is not None and line is not None: - loc = str(line) - if column is not None: - loc += ':{0}'.format(column) - message = '{0} : {1}'.format(loc, message) - if message is not None: - super(ParseError, self).__init__(message) - else: - super(ParseError, self).__init__() - self._line = line - self._column = column - - def GetLine(self): - return self._line - - def GetColumn(self): - return self._column - - -class TextWriter(object): - - def __init__(self, as_utf8): - self._writer = io.StringIO() - - def write(self, val): - return self._writer.write(val) - - def close(self): - return self._writer.close() - - def getvalue(self): - return self._writer.getvalue() - - -def MessageToString( - message, - as_utf8=False, - as_one_line=False, - use_short_repeated_primitives=False, - pointy_brackets=False, - use_index_order=False, - float_format=None, - double_format=None, - use_field_number=False, - descriptor_pool=None, - indent=0, - message_formatter=None, - print_unknown_fields=False, - force_colon=False) -> str: - """Convert protobuf message to text format. - - Double values can be formatted compactly with 15 digits of - precision (which is the most that IEEE 754 "double" can guarantee) - using double_format='.15g'. To ensure that converting to text and back to a - proto will result in an identical value, double_format='.17g' should be used. - - Args: - message: The protocol buffers message. - as_utf8: Return unescaped Unicode for non-ASCII characters. - as_one_line: Don't introduce newlines between fields. - use_short_repeated_primitives: Use short repeated format for primitives. - pointy_brackets: If True, use angle brackets instead of curly braces for - nesting. - use_index_order: If True, fields of a proto message will be printed using - the order defined in source code instead of the field number, extensions - will be printed at the end of the message and their relative order is - determined by the extension number. By default, use the field number - order. - float_format (str): If set, use this to specify float field formatting - (per the "Format Specification Mini-Language"); otherwise, shortest float - that has same value in wire will be printed. Also affect double field - if double_format is not set but float_format is set. - double_format (str): If set, use this to specify double field formatting - (per the "Format Specification Mini-Language"); if it is not set but - float_format is set, use float_format. Otherwise, use ``str()`` - use_field_number: If True, print field numbers instead of names. - descriptor_pool (DescriptorPool): Descriptor pool used to resolve Any types. - indent (int): The initial indent level, in terms of spaces, for pretty - print. - message_formatter (function(message, indent, as_one_line) -> unicode|None): - Custom formatter for selected sub-messages (usually based on message - type). Use to pretty print parts of the protobuf for easier diffing. - print_unknown_fields: If True, unknown fields will be printed. - force_colon: If set, a colon will be added after the field name even if the - field is a proto message. - - Returns: - str: A string of the text formatted protocol buffer message. - """ - out = TextWriter(as_utf8) - printer = _Printer( - out, - indent, - as_utf8, - as_one_line, - use_short_repeated_primitives, - pointy_brackets, - use_index_order, - float_format, - double_format, - use_field_number, - descriptor_pool, - message_formatter, - print_unknown_fields=print_unknown_fields, - force_colon=force_colon) - printer.PrintMessage(message) - result = out.getvalue() - out.close() - if as_one_line: - return result.rstrip() - return result - - -def MessageToBytes(message, **kwargs) -> bytes: - """Convert protobuf message to encoded text format. See MessageToString.""" - text = MessageToString(message, **kwargs) - if isinstance(text, bytes): - return text - codec = 'utf-8' if kwargs.get('as_utf8') else 'ascii' - return text.encode(codec) - - -def _IsMapEntry(field): - return (field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and - field.message_type.has_options and - field.message_type.GetOptions().map_entry) - - -def PrintMessage(message, - out, - indent=0, - as_utf8=False, - as_one_line=False, - use_short_repeated_primitives=False, - pointy_brackets=False, - use_index_order=False, - float_format=None, - double_format=None, - use_field_number=False, - descriptor_pool=None, - message_formatter=None, - print_unknown_fields=False, - force_colon=False): - """Convert the message to text format and write it to the out stream. - - Args: - message: The Message object to convert to text format. - out: A file handle to write the message to. - indent: The initial indent level for pretty print. - as_utf8: Return unescaped Unicode for non-ASCII characters. - as_one_line: Don't introduce newlines between fields. - use_short_repeated_primitives: Use short repeated format for primitives. - pointy_brackets: If True, use angle brackets instead of curly braces for - nesting. - use_index_order: If True, print fields of a proto message using the order - defined in source code instead of the field number. By default, use the - field number order. - float_format: If set, use this to specify float field formatting - (per the "Format Specification Mini-Language"); otherwise, shortest - float that has same value in wire will be printed. Also affect double - field if double_format is not set but float_format is set. - double_format: If set, use this to specify double field formatting - (per the "Format Specification Mini-Language"); if it is not set but - float_format is set, use float_format. Otherwise, str() is used. - use_field_number: If True, print field numbers instead of names. - descriptor_pool: A DescriptorPool used to resolve Any types. - message_formatter: A function(message, indent, as_one_line): unicode|None - to custom format selected sub-messages (usually based on message type). - Use to pretty print parts of the protobuf for easier diffing. - print_unknown_fields: If True, unknown fields will be printed. - force_colon: If set, a colon will be added after the field name even if - the field is a proto message. - """ - printer = _Printer( - out=out, indent=indent, as_utf8=as_utf8, - as_one_line=as_one_line, - use_short_repeated_primitives=use_short_repeated_primitives, - pointy_brackets=pointy_brackets, - use_index_order=use_index_order, - float_format=float_format, - double_format=double_format, - use_field_number=use_field_number, - descriptor_pool=descriptor_pool, - message_formatter=message_formatter, - print_unknown_fields=print_unknown_fields, - force_colon=force_colon) - printer.PrintMessage(message) - - -def PrintField(field, - value, - out, - indent=0, - as_utf8=False, - as_one_line=False, - use_short_repeated_primitives=False, - pointy_brackets=False, - use_index_order=False, - float_format=None, - double_format=None, - message_formatter=None, - print_unknown_fields=False, - force_colon=False): - """Print a single field name/value pair.""" - printer = _Printer(out, indent, as_utf8, as_one_line, - use_short_repeated_primitives, pointy_brackets, - use_index_order, float_format, double_format, - message_formatter=message_formatter, - print_unknown_fields=print_unknown_fields, - force_colon=force_colon) - printer.PrintField(field, value) - - -def PrintFieldValue(field, - value, - out, - indent=0, - as_utf8=False, - as_one_line=False, - use_short_repeated_primitives=False, - pointy_brackets=False, - use_index_order=False, - float_format=None, - double_format=None, - message_formatter=None, - print_unknown_fields=False, - force_colon=False): - """Print a single field value (not including name).""" - printer = _Printer(out, indent, as_utf8, as_one_line, - use_short_repeated_primitives, pointy_brackets, - use_index_order, float_format, double_format, - message_formatter=message_formatter, - print_unknown_fields=print_unknown_fields, - force_colon=force_colon) - printer.PrintFieldValue(field, value) - - -def _BuildMessageFromTypeName(type_name, descriptor_pool): - """Returns a protobuf message instance. - - Args: - type_name: Fully-qualified protobuf message type name string. - descriptor_pool: DescriptorPool instance. - - Returns: - A Message instance of type matching type_name, or None if the a Descriptor - wasn't found matching type_name. - """ - # pylint: disable=g-import-not-at-top - if descriptor_pool is None: - from google.protobuf import descriptor_pool as pool_mod - descriptor_pool = pool_mod.Default() - from google.protobuf import message_factory - try: - message_descriptor = descriptor_pool.FindMessageTypeByName(type_name) - except KeyError: - return None - message_type = message_factory.GetMessageClass(message_descriptor) - return message_type() - - -# These values must match WireType enum in //google/protobuf/wire_format.h. -WIRETYPE_LENGTH_DELIMITED = 2 -WIRETYPE_START_GROUP = 3 - - -class _Printer(object): - """Text format printer for protocol message.""" - - def __init__( - self, - out, - indent=0, - as_utf8=False, - as_one_line=False, - use_short_repeated_primitives=False, - pointy_brackets=False, - use_index_order=False, - float_format=None, - double_format=None, - use_field_number=False, - descriptor_pool=None, - message_formatter=None, - print_unknown_fields=False, - force_colon=False): - """Initialize the Printer. - - Double values can be formatted compactly with 15 digits of precision - (which is the most that IEEE 754 "double" can guarantee) using - double_format='.15g'. To ensure that converting to text and back to a proto - will result in an identical value, double_format='.17g' should be used. - - Args: - out: To record the text format result. - indent: The initial indent level for pretty print. - as_utf8: Return unescaped Unicode for non-ASCII characters. - as_one_line: Don't introduce newlines between fields. - use_short_repeated_primitives: Use short repeated format for primitives. - pointy_brackets: If True, use angle brackets instead of curly braces for - nesting. - use_index_order: If True, print fields of a proto message using the order - defined in source code instead of the field number. By default, use the - field number order. - float_format: If set, use this to specify float field formatting - (per the "Format Specification Mini-Language"); otherwise, shortest - float that has same value in wire will be printed. Also affect double - field if double_format is not set but float_format is set. - double_format: If set, use this to specify double field formatting - (per the "Format Specification Mini-Language"); if it is not set but - float_format is set, use float_format. Otherwise, str() is used. - use_field_number: If True, print field numbers instead of names. - descriptor_pool: A DescriptorPool used to resolve Any types. - message_formatter: A function(message, indent, as_one_line): unicode|None - to custom format selected sub-messages (usually based on message type). - Use to pretty print parts of the protobuf for easier diffing. - print_unknown_fields: If True, unknown fields will be printed. - force_colon: If set, a colon will be added after the field name even if - the field is a proto message. - """ - self.out = out - self.indent = indent - self.as_utf8 = as_utf8 - self.as_one_line = as_one_line - self.use_short_repeated_primitives = use_short_repeated_primitives - self.pointy_brackets = pointy_brackets - self.use_index_order = use_index_order - self.float_format = float_format - if double_format is not None: - self.double_format = double_format - else: - self.double_format = float_format - self.use_field_number = use_field_number - self.descriptor_pool = descriptor_pool - self.message_formatter = message_formatter - self.print_unknown_fields = print_unknown_fields - self.force_colon = force_colon - - def _TryPrintAsAnyMessage(self, message): - """Serializes if message is a google.protobuf.Any field.""" - if '/' not in message.type_url: - return False - packed_message = _BuildMessageFromTypeName(message.TypeName(), - self.descriptor_pool) - if packed_message: - packed_message.MergeFromString(message.value) - colon = ':' if self.force_colon else '' - self.out.write('%s[%s]%s ' % (self.indent * ' ', message.type_url, colon)) - self._PrintMessageFieldValue(packed_message) - self.out.write(' ' if self.as_one_line else '\n') - return True - else: - return False - - def _TryCustomFormatMessage(self, message): - formatted = self.message_formatter(message, self.indent, self.as_one_line) - if formatted is None: - return False - - out = self.out - out.write(' ' * self.indent) - out.write(formatted) - out.write(' ' if self.as_one_line else '\n') - return True - - def PrintMessage(self, message): - """Convert protobuf message to text format. - - Args: - message: The protocol buffers message. - """ - if self.message_formatter and self._TryCustomFormatMessage(message): - return - if (message.DESCRIPTOR.full_name == _ANY_FULL_TYPE_NAME and - self._TryPrintAsAnyMessage(message)): - return - fields = message.ListFields() - if self.use_index_order: - fields.sort( - key=lambda x: x[0].number if x[0].is_extension else x[0].index) - for field, value in fields: - if _IsMapEntry(field): - for key in sorted(value): - # This is slow for maps with submessage entries because it copies the - # entire tree. Unfortunately this would take significant refactoring - # of this file to work around. - # - # TODO(haberman): refactor and optimize if this becomes an issue. - entry_submsg = value.GetEntryClass()(key=key, value=value[key]) - self.PrintField(field, entry_submsg) - elif field.label == descriptor.FieldDescriptor.LABEL_REPEATED: - if (self.use_short_repeated_primitives - and field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE - and field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_STRING): - self._PrintShortRepeatedPrimitivesValue(field, value) - else: - for element in value: - self.PrintField(field, element) - else: - self.PrintField(field, value) - - if self.print_unknown_fields: - self._PrintUnknownFields(unknown_fields.UnknownFieldSet(message)) - - def _PrintUnknownFields(self, unknown_field_set): - """Print unknown fields.""" - out = self.out - for field in unknown_field_set: - out.write(' ' * self.indent) - out.write(str(field.field_number)) - if field.wire_type == WIRETYPE_START_GROUP: - if self.as_one_line: - out.write(' { ') - else: - out.write(' {\n') - self.indent += 2 - - self._PrintUnknownFields(field.data) - - if self.as_one_line: - out.write('} ') - else: - self.indent -= 2 - out.write(' ' * self.indent + '}\n') - elif field.wire_type == WIRETYPE_LENGTH_DELIMITED: - try: - # If this field is parseable as a Message, it is probably - # an embedded message. - # pylint: disable=protected-access - (embedded_unknown_message, pos) = decoder._DecodeUnknownFieldSet( - memoryview(field.data), 0, len(field.data)) - except Exception: # pylint: disable=broad-except - pos = 0 - - if pos == len(field.data): - if self.as_one_line: - out.write(' { ') - else: - out.write(' {\n') - self.indent += 2 - - self._PrintUnknownFields(embedded_unknown_message) - - if self.as_one_line: - out.write('} ') - else: - self.indent -= 2 - out.write(' ' * self.indent + '}\n') - else: - # A string or bytes field. self.as_utf8 may not work. - out.write(': \"') - out.write(text_encoding.CEscape(field.data, False)) - out.write('\" ' if self.as_one_line else '\"\n') - else: - # varint, fixed32, fixed64 - out.write(': ') - out.write(str(field.data)) - out.write(' ' if self.as_one_line else '\n') - - def _PrintFieldName(self, field): - """Print field name.""" - out = self.out - out.write(' ' * self.indent) - if self.use_field_number: - out.write(str(field.number)) - else: - if field.is_extension: - out.write('[') - if (field.containing_type.GetOptions().message_set_wire_format and - field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and - field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL): - out.write(field.message_type.full_name) - else: - out.write(field.full_name) - out.write(']') - elif field.type == descriptor.FieldDescriptor.TYPE_GROUP: - # For groups, use the capitalized name. - out.write(field.message_type.name) - else: - out.write(field.name) - - if (self.force_colon or - field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE): - # The colon is optional in this case, but our cross-language golden files - # don't include it. Here, the colon is only included if force_colon is - # set to True - out.write(':') - - def PrintField(self, field, value): - """Print a single field name/value pair.""" - self._PrintFieldName(field) - self.out.write(' ') - self.PrintFieldValue(field, value) - self.out.write(' ' if self.as_one_line else '\n') - - def _PrintShortRepeatedPrimitivesValue(self, field, value): - """"Prints short repeated primitives value.""" - # Note: this is called only when value has at least one element. - self._PrintFieldName(field) - self.out.write(' [') - for i in range(len(value) - 1): - self.PrintFieldValue(field, value[i]) - self.out.write(', ') - self.PrintFieldValue(field, value[-1]) - self.out.write(']') - self.out.write(' ' if self.as_one_line else '\n') - - def _PrintMessageFieldValue(self, value): - if self.pointy_brackets: - openb = '<' - closeb = '>' - else: - openb = '{' - closeb = '}' - - if self.as_one_line: - self.out.write('%s ' % openb) - self.PrintMessage(value) - self.out.write(closeb) - else: - self.out.write('%s\n' % openb) - self.indent += 2 - self.PrintMessage(value) - self.indent -= 2 - self.out.write(' ' * self.indent + closeb) - - def PrintFieldValue(self, field, value): - """Print a single field value (not including name). - - For repeated fields, the value should be a single element. - - Args: - field: The descriptor of the field to be printed. - value: The value of the field. - """ - out = self.out - if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: - self._PrintMessageFieldValue(value) - elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: - enum_value = field.enum_type.values_by_number.get(value, None) - if enum_value is not None: - out.write(enum_value.name) - else: - out.write(str(value)) - elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING: - out.write('\"') - if isinstance(value, str) and not self.as_utf8: - out_value = value.encode('utf-8') - else: - out_value = value - if field.type == descriptor.FieldDescriptor.TYPE_BYTES: - # We always need to escape all binary data in TYPE_BYTES fields. - out_as_utf8 = False - else: - out_as_utf8 = self.as_utf8 - out.write(text_encoding.CEscape(out_value, out_as_utf8)) - out.write('\"') - elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL: - if value: - out.write('true') - else: - out.write('false') - elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_FLOAT: - if self.float_format is not None: - out.write('{1:{0}}'.format(self.float_format, value)) - else: - if math.isnan(value): - out.write(str(value)) - else: - out.write(str(type_checkers.ToShortestFloat(value))) - elif (field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_DOUBLE and - self.double_format is not None): - out.write('{1:{0}}'.format(self.double_format, value)) - else: - out.write(str(value)) - - -def Parse(text, - message, - allow_unknown_extension=False, - allow_field_number=False, - descriptor_pool=None, - allow_unknown_field=False): - """Parses a text representation of a protocol message into a message. - - NOTE: for historical reasons this function does not clear the input - message. This is different from what the binary msg.ParseFrom(...) does. - If text contains a field already set in message, the value is appended if the - field is repeated. Otherwise, an error is raised. - - Example:: - - a = MyProto() - a.repeated_field.append('test') - b = MyProto() - - # Repeated fields are combined - text_format.Parse(repr(a), b) - text_format.Parse(repr(a), b) # repeated_field contains ["test", "test"] - - # Non-repeated fields cannot be overwritten - a.singular_field = 1 - b.singular_field = 2 - text_format.Parse(repr(a), b) # ParseError - - # Binary version: - b.ParseFromString(a.SerializeToString()) # repeated_field is now "test" - - Caller is responsible for clearing the message as needed. - - Args: - text (str): Message text representation. - message (Message): A protocol buffer message to merge into. - allow_unknown_extension: if True, skip over missing extensions and keep - parsing - allow_field_number: if True, both field number and field name are allowed. - descriptor_pool (DescriptorPool): Descriptor pool used to resolve Any types. - allow_unknown_field: if True, skip over unknown field and keep - parsing. Avoid to use this option if possible. It may hide some - errors (e.g. spelling error on field name) - - Returns: - Message: The same message passed as argument. - - Raises: - ParseError: On text parsing problems. - """ - return ParseLines(text.split(b'\n' if isinstance(text, bytes) else u'\n'), - message, - allow_unknown_extension, - allow_field_number, - descriptor_pool=descriptor_pool, - allow_unknown_field=allow_unknown_field) - - -def Merge(text, - message, - allow_unknown_extension=False, - allow_field_number=False, - descriptor_pool=None, - allow_unknown_field=False): - """Parses a text representation of a protocol message into a message. - - Like Parse(), but allows repeated values for a non-repeated field, and uses - the last one. This means any non-repeated, top-level fields specified in text - replace those in the message. - - Args: - text (str): Message text representation. - message (Message): A protocol buffer message to merge into. - allow_unknown_extension: if True, skip over missing extensions and keep - parsing - allow_field_number: if True, both field number and field name are allowed. - descriptor_pool (DescriptorPool): Descriptor pool used to resolve Any types. - allow_unknown_field: if True, skip over unknown field and keep - parsing. Avoid to use this option if possible. It may hide some - errors (e.g. spelling error on field name) - - Returns: - Message: The same message passed as argument. - - Raises: - ParseError: On text parsing problems. - """ - return MergeLines( - text.split(b'\n' if isinstance(text, bytes) else u'\n'), - message, - allow_unknown_extension, - allow_field_number, - descriptor_pool=descriptor_pool, - allow_unknown_field=allow_unknown_field) - - -def ParseLines(lines, - message, - allow_unknown_extension=False, - allow_field_number=False, - descriptor_pool=None, - allow_unknown_field=False): - """Parses a text representation of a protocol message into a message. - - See Parse() for caveats. - - Args: - lines: An iterable of lines of a message's text representation. - message: A protocol buffer message to merge into. - allow_unknown_extension: if True, skip over missing extensions and keep - parsing - allow_field_number: if True, both field number and field name are allowed. - descriptor_pool: A DescriptorPool used to resolve Any types. - allow_unknown_field: if True, skip over unknown field and keep - parsing. Avoid to use this option if possible. It may hide some - errors (e.g. spelling error on field name) - - Returns: - The same message passed as argument. - - Raises: - ParseError: On text parsing problems. - """ - parser = _Parser(allow_unknown_extension, - allow_field_number, - descriptor_pool=descriptor_pool, - allow_unknown_field=allow_unknown_field) - return parser.ParseLines(lines, message) - - -def MergeLines(lines, - message, - allow_unknown_extension=False, - allow_field_number=False, - descriptor_pool=None, - allow_unknown_field=False): - """Parses a text representation of a protocol message into a message. - - See Merge() for more details. - - Args: - lines: An iterable of lines of a message's text representation. - message: A protocol buffer message to merge into. - allow_unknown_extension: if True, skip over missing extensions and keep - parsing - allow_field_number: if True, both field number and field name are allowed. - descriptor_pool: A DescriptorPool used to resolve Any types. - allow_unknown_field: if True, skip over unknown field and keep - parsing. Avoid to use this option if possible. It may hide some - errors (e.g. spelling error on field name) - - Returns: - The same message passed as argument. - - Raises: - ParseError: On text parsing problems. - """ - parser = _Parser(allow_unknown_extension, - allow_field_number, - descriptor_pool=descriptor_pool, - allow_unknown_field=allow_unknown_field) - return parser.MergeLines(lines, message) - - -class _Parser(object): - """Text format parser for protocol message.""" - - def __init__(self, - allow_unknown_extension=False, - allow_field_number=False, - descriptor_pool=None, - allow_unknown_field=False): - self.allow_unknown_extension = allow_unknown_extension - self.allow_field_number = allow_field_number - self.descriptor_pool = descriptor_pool - self.allow_unknown_field = allow_unknown_field - - def ParseLines(self, lines, message): - """Parses a text representation of a protocol message into a message.""" - self._allow_multiple_scalars = False - self._ParseOrMerge(lines, message) - return message - - def MergeLines(self, lines, message): - """Merges a text representation of a protocol message into a message.""" - self._allow_multiple_scalars = True - self._ParseOrMerge(lines, message) - return message - - def _ParseOrMerge(self, lines, message): - """Converts a text representation of a protocol message into a message. - - Args: - lines: Lines of a message's text representation. - message: A protocol buffer message to merge into. - - Raises: - ParseError: On text parsing problems. - """ - # Tokenize expects native str lines. - try: - str_lines = ( - line if isinstance(line, str) else line.decode('utf-8') - for line in lines) - tokenizer = Tokenizer(str_lines) - except UnicodeDecodeError as e: - raise ParseError from e - if message: - self.root_type = message.DESCRIPTOR.full_name - while not tokenizer.AtEnd(): - self._MergeField(tokenizer, message) - - def _MergeField(self, tokenizer, message): - """Merges a single protocol message field into a message. - - Args: - tokenizer: A tokenizer to parse the field name and values. - message: A protocol message to record the data. - - Raises: - ParseError: In case of text parsing problems. - """ - message_descriptor = message.DESCRIPTOR - if (message_descriptor.full_name == _ANY_FULL_TYPE_NAME and - tokenizer.TryConsume('[')): - type_url_prefix, packed_type_name = self._ConsumeAnyTypeUrl(tokenizer) - tokenizer.Consume(']') - tokenizer.TryConsume(':') - self._DetectSilentMarker(tokenizer, message_descriptor.full_name, - type_url_prefix + '/' + packed_type_name) - if tokenizer.TryConsume('<'): - expanded_any_end_token = '>' - else: - tokenizer.Consume('{') - expanded_any_end_token = '}' - expanded_any_sub_message = _BuildMessageFromTypeName(packed_type_name, - self.descriptor_pool) - # Direct comparison with None is used instead of implicit bool conversion - # to avoid false positives with falsy initial values, e.g. for - # google.protobuf.ListValue. - if expanded_any_sub_message is None: - raise ParseError('Type %s not found in descriptor pool' % - packed_type_name) - while not tokenizer.TryConsume(expanded_any_end_token): - if tokenizer.AtEnd(): - raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % - (expanded_any_end_token,)) - self._MergeField(tokenizer, expanded_any_sub_message) - deterministic = False - - message.Pack(expanded_any_sub_message, - type_url_prefix=type_url_prefix, - deterministic=deterministic) - return - - if tokenizer.TryConsume('['): - name = [tokenizer.ConsumeIdentifier()] - while tokenizer.TryConsume('.'): - name.append(tokenizer.ConsumeIdentifier()) - name = '.'.join(name) - - if not message_descriptor.is_extendable: - raise tokenizer.ParseErrorPreviousToken( - 'Message type "%s" does not have extensions.' % - message_descriptor.full_name) - # pylint: disable=protected-access - field = message.Extensions._FindExtensionByName(name) - # pylint: enable=protected-access - if not field: - if self.allow_unknown_extension: - field = None - else: - raise tokenizer.ParseErrorPreviousToken( - 'Extension "%s" not registered. ' - 'Did you import the _pb2 module which defines it? ' - 'If you are trying to place the extension in the MessageSet ' - 'field of another message that is in an Any or MessageSet field, ' - 'that message\'s _pb2 module must be imported as well' % name) - elif message_descriptor != field.containing_type: - raise tokenizer.ParseErrorPreviousToken( - 'Extension "%s" does not extend message type "%s".' % - (name, message_descriptor.full_name)) - - tokenizer.Consume(']') - - else: - name = tokenizer.ConsumeIdentifierOrNumber() - if self.allow_field_number and name.isdigit(): - number = ParseInteger(name, True, True) - field = message_descriptor.fields_by_number.get(number, None) - if not field and message_descriptor.is_extendable: - field = message.Extensions._FindExtensionByNumber(number) - else: - field = message_descriptor.fields_by_name.get(name, None) - - # Group names are expected to be capitalized as they appear in the - # .proto file, which actually matches their type names, not their field - # names. - if not field: - field = message_descriptor.fields_by_name.get(name.lower(), None) - if field and field.type != descriptor.FieldDescriptor.TYPE_GROUP: - field = None - - if (field and field.type == descriptor.FieldDescriptor.TYPE_GROUP and - field.message_type.name != name): - field = None - - if not field and not self.allow_unknown_field: - raise tokenizer.ParseErrorPreviousToken( - 'Message type "%s" has no field named "%s".' % - (message_descriptor.full_name, name)) - - if field: - if not self._allow_multiple_scalars and field.containing_oneof: - # Check if there's a different field set in this oneof. - # Note that we ignore the case if the same field was set before, and we - # apply _allow_multiple_scalars to non-scalar fields as well. - which_oneof = message.WhichOneof(field.containing_oneof.name) - if which_oneof is not None and which_oneof != field.name: - raise tokenizer.ParseErrorPreviousToken( - 'Field "%s" is specified along with field "%s", another member ' - 'of oneof "%s" for message type "%s".' % - (field.name, which_oneof, field.containing_oneof.name, - message_descriptor.full_name)) - - if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: - tokenizer.TryConsume(':') - self._DetectSilentMarker(tokenizer, message_descriptor.full_name, - field.full_name) - merger = self._MergeMessageField - else: - tokenizer.Consume(':') - self._DetectSilentMarker(tokenizer, message_descriptor.full_name, - field.full_name) - merger = self._MergeScalarField - - if (field.label == descriptor.FieldDescriptor.LABEL_REPEATED and - tokenizer.TryConsume('[')): - # Short repeated format, e.g. "foo: [1, 2, 3]" - if not tokenizer.TryConsume(']'): - while True: - merger(tokenizer, message, field) - if tokenizer.TryConsume(']'): - break - tokenizer.Consume(',') - - else: - merger(tokenizer, message, field) - - else: # Proto field is unknown. - assert (self.allow_unknown_extension or self.allow_unknown_field) - self._SkipFieldContents(tokenizer, name, message_descriptor.full_name) - - # For historical reasons, fields may optionally be separated by commas or - # semicolons. - if not tokenizer.TryConsume(','): - tokenizer.TryConsume(';') - - def _LogSilentMarker(self, immediate_message_type, field_name): - pass - - def _DetectSilentMarker(self, tokenizer, immediate_message_type, field_name): - if tokenizer.contains_silent_marker_before_current_token: - self._LogSilentMarker(immediate_message_type, field_name) - - def _ConsumeAnyTypeUrl(self, tokenizer): - """Consumes a google.protobuf.Any type URL and returns the type name.""" - # Consume "type.googleapis.com/". - prefix = [tokenizer.ConsumeIdentifier()] - tokenizer.Consume('.') - prefix.append(tokenizer.ConsumeIdentifier()) - tokenizer.Consume('.') - prefix.append(tokenizer.ConsumeIdentifier()) - tokenizer.Consume('/') - # Consume the fully-qualified type name. - name = [tokenizer.ConsumeIdentifier()] - while tokenizer.TryConsume('.'): - name.append(tokenizer.ConsumeIdentifier()) - return '.'.join(prefix), '.'.join(name) - - def _MergeMessageField(self, tokenizer, message, field): - """Merges a single scalar field into a message. - - Args: - tokenizer: A tokenizer to parse the field value. - message: The message of which field is a member. - field: The descriptor of the field to be merged. - - Raises: - ParseError: In case of text parsing problems. - """ - is_map_entry = _IsMapEntry(field) - - if tokenizer.TryConsume('<'): - end_token = '>' - else: - tokenizer.Consume('{') - end_token = '}' - - if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: - if field.is_extension: - sub_message = message.Extensions[field].add() - elif is_map_entry: - sub_message = getattr(message, field.name).GetEntryClass()() - else: - sub_message = getattr(message, field.name).add() - else: - if field.is_extension: - if (not self._allow_multiple_scalars and - message.HasExtension(field)): - raise tokenizer.ParseErrorPreviousToken( - 'Message type "%s" should not have multiple "%s" extensions.' % - (message.DESCRIPTOR.full_name, field.full_name)) - sub_message = message.Extensions[field] - else: - # Also apply _allow_multiple_scalars to message field. - # TODO(jieluo): Change to _allow_singular_overwrites. - if (not self._allow_multiple_scalars and - message.HasField(field.name)): - raise tokenizer.ParseErrorPreviousToken( - 'Message type "%s" should not have multiple "%s" fields.' % - (message.DESCRIPTOR.full_name, field.name)) - sub_message = getattr(message, field.name) - sub_message.SetInParent() - - while not tokenizer.TryConsume(end_token): - if tokenizer.AtEnd(): - raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % (end_token,)) - self._MergeField(tokenizer, sub_message) - - if is_map_entry: - value_cpptype = field.message_type.fields_by_name['value'].cpp_type - if value_cpptype == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: - value = getattr(message, field.name)[sub_message.key] - value.CopyFrom(sub_message.value) - else: - getattr(message, field.name)[sub_message.key] = sub_message.value - - def _MergeScalarField(self, tokenizer, message, field): - """Merges a single scalar field into a message. - - Args: - tokenizer: A tokenizer to parse the field value. - message: A protocol message to record the data. - field: The descriptor of the field to be merged. - - Raises: - ParseError: In case of text parsing problems. - RuntimeError: On runtime errors. - """ - _ = self.allow_unknown_extension - value = None - - if field.type in (descriptor.FieldDescriptor.TYPE_INT32, - descriptor.FieldDescriptor.TYPE_SINT32, - descriptor.FieldDescriptor.TYPE_SFIXED32): - value = _ConsumeInt32(tokenizer) - elif field.type in (descriptor.FieldDescriptor.TYPE_INT64, - descriptor.FieldDescriptor.TYPE_SINT64, - descriptor.FieldDescriptor.TYPE_SFIXED64): - value = _ConsumeInt64(tokenizer) - elif field.type in (descriptor.FieldDescriptor.TYPE_UINT32, - descriptor.FieldDescriptor.TYPE_FIXED32): - value = _ConsumeUint32(tokenizer) - elif field.type in (descriptor.FieldDescriptor.TYPE_UINT64, - descriptor.FieldDescriptor.TYPE_FIXED64): - value = _ConsumeUint64(tokenizer) - elif field.type in (descriptor.FieldDescriptor.TYPE_FLOAT, - descriptor.FieldDescriptor.TYPE_DOUBLE): - value = tokenizer.ConsumeFloat() - elif field.type == descriptor.FieldDescriptor.TYPE_BOOL: - value = tokenizer.ConsumeBool() - elif field.type == descriptor.FieldDescriptor.TYPE_STRING: - value = tokenizer.ConsumeString() - elif field.type == descriptor.FieldDescriptor.TYPE_BYTES: - value = tokenizer.ConsumeByteString() - elif field.type == descriptor.FieldDescriptor.TYPE_ENUM: - value = tokenizer.ConsumeEnum(field) - else: - raise RuntimeError('Unknown field type %d' % field.type) - - if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: - if field.is_extension: - message.Extensions[field].append(value) - else: - getattr(message, field.name).append(value) - else: - if field.is_extension: - if (not self._allow_multiple_scalars and - field.has_presence and - message.HasExtension(field)): - raise tokenizer.ParseErrorPreviousToken( - 'Message type "%s" should not have multiple "%s" extensions.' % - (message.DESCRIPTOR.full_name, field.full_name)) - else: - message.Extensions[field] = value - else: - duplicate_error = False - if not self._allow_multiple_scalars: - if field.has_presence: - duplicate_error = message.HasField(field.name) - else: - # For field that doesn't represent presence, try best effort to - # check multiple scalars by compare to default values. - duplicate_error = bool(getattr(message, field.name)) - - if duplicate_error: - raise tokenizer.ParseErrorPreviousToken( - 'Message type "%s" should not have multiple "%s" fields.' % - (message.DESCRIPTOR.full_name, field.name)) - else: - setattr(message, field.name, value) - - def _SkipFieldContents(self, tokenizer, field_name, immediate_message_type): - """Skips over contents (value or message) of a field. - - Args: - tokenizer: A tokenizer to parse the field name and values. - field_name: The field name currently being parsed. - immediate_message_type: The type of the message immediately containing - the silent marker. - """ - # Try to guess the type of this field. - # If this field is not a message, there should be a ":" between the - # field name and the field value and also the field value should not - # start with "{" or "<" which indicates the beginning of a message body. - # If there is no ":" or there is a "{" or "<" after ":", this field has - # to be a message or the input is ill-formed. - if tokenizer.TryConsume( - ':') and not tokenizer.LookingAt('{') and not tokenizer.LookingAt('<'): - self._DetectSilentMarker(tokenizer, immediate_message_type, field_name) - if tokenizer.LookingAt('['): - self._SkipRepeatedFieldValue(tokenizer) - else: - self._SkipFieldValue(tokenizer) - else: - self._DetectSilentMarker(tokenizer, immediate_message_type, field_name) - self._SkipFieldMessage(tokenizer, immediate_message_type) - - def _SkipField(self, tokenizer, immediate_message_type): - """Skips over a complete field (name and value/message). - - Args: - tokenizer: A tokenizer to parse the field name and values. - immediate_message_type: The type of the message immediately containing - the silent marker. - """ - field_name = '' - if tokenizer.TryConsume('['): - # Consume extension or google.protobuf.Any type URL - field_name += '[' + tokenizer.ConsumeIdentifier() - num_identifiers = 1 - while tokenizer.TryConsume('.'): - field_name += '.' + tokenizer.ConsumeIdentifier() - num_identifiers += 1 - # This is possibly a type URL for an Any message. - if num_identifiers == 3 and tokenizer.TryConsume('/'): - field_name += '/' + tokenizer.ConsumeIdentifier() - while tokenizer.TryConsume('.'): - field_name += '.' + tokenizer.ConsumeIdentifier() - tokenizer.Consume(']') - field_name += ']' - else: - field_name += tokenizer.ConsumeIdentifierOrNumber() - - self._SkipFieldContents(tokenizer, field_name, immediate_message_type) - - # For historical reasons, fields may optionally be separated by commas or - # semicolons. - if not tokenizer.TryConsume(','): - tokenizer.TryConsume(';') - - def _SkipFieldMessage(self, tokenizer, immediate_message_type): - """Skips over a field message. - - Args: - tokenizer: A tokenizer to parse the field name and values. - immediate_message_type: The type of the message immediately containing - the silent marker - """ - if tokenizer.TryConsume('<'): - delimiter = '>' - else: - tokenizer.Consume('{') - delimiter = '}' - - while not tokenizer.LookingAt('>') and not tokenizer.LookingAt('}'): - self._SkipField(tokenizer, immediate_message_type) - - tokenizer.Consume(delimiter) - - def _SkipFieldValue(self, tokenizer): - """Skips over a field value. - - Args: - tokenizer: A tokenizer to parse the field name and values. - - Raises: - ParseError: In case an invalid field value is found. - """ - if (not tokenizer.TryConsumeByteString()and - not tokenizer.TryConsumeIdentifier() and - not _TryConsumeInt64(tokenizer) and - not _TryConsumeUint64(tokenizer) and - not tokenizer.TryConsumeFloat()): - raise ParseError('Invalid field value: ' + tokenizer.token) - - def _SkipRepeatedFieldValue(self, tokenizer): - """Skips over a repeated field value. - - Args: - tokenizer: A tokenizer to parse the field value. - """ - tokenizer.Consume('[') - if not tokenizer.LookingAt(']'): - self._SkipFieldValue(tokenizer) - while tokenizer.TryConsume(','): - self._SkipFieldValue(tokenizer) - tokenizer.Consume(']') - - -class Tokenizer(object): - """Protocol buffer text representation tokenizer. - - This class handles the lower level string parsing by splitting it into - meaningful tokens. - - It was directly ported from the Java protocol buffer API. - """ - - _WHITESPACE = re.compile(r'\s+') - _COMMENT = re.compile(r'(\s*#.*$)', re.MULTILINE) - _WHITESPACE_OR_COMMENT = re.compile(r'(\s|(#.*$))+', re.MULTILINE) - _TOKEN = re.compile('|'.join([ - r'[a-zA-Z_][0-9a-zA-Z_+-]*', # an identifier - r'([0-9+-]|(\.[0-9]))[0-9a-zA-Z_.+-]*', # a number - ] + [ # quoted str for each quote mark - # Avoid backtracking! https://stackoverflow.com/a/844267 - r'{qt}[^{qt}\n\\]*((\\.)+[^{qt}\n\\]*)*({qt}|\\?$)'.format(qt=mark) - for mark in _QUOTES - ])) - - _IDENTIFIER = re.compile(r'[^\d\W]\w*') - _IDENTIFIER_OR_NUMBER = re.compile(r'\w+') - - def __init__(self, lines, skip_comments=True): - self._position = 0 - self._line = -1 - self._column = 0 - self._token_start = None - self.token = '' - self._lines = iter(lines) - self._current_line = '' - self._previous_line = 0 - self._previous_column = 0 - self._more_lines = True - self._skip_comments = skip_comments - self._whitespace_pattern = (skip_comments and self._WHITESPACE_OR_COMMENT - or self._WHITESPACE) - self.contains_silent_marker_before_current_token = False - - self._SkipWhitespace() - self.NextToken() - - def LookingAt(self, token): - return self.token == token - - def AtEnd(self): - """Checks the end of the text was reached. - - Returns: - True iff the end was reached. - """ - return not self.token - - def _PopLine(self): - while len(self._current_line) <= self._column: - try: - self._current_line = next(self._lines) - except StopIteration: - self._current_line = '' - self._more_lines = False - return - else: - self._line += 1 - self._column = 0 - - def _SkipWhitespace(self): - while True: - self._PopLine() - match = self._whitespace_pattern.match(self._current_line, self._column) - if not match: - break - self.contains_silent_marker_before_current_token = match.group(0) == ( - ' ' + _DEBUG_STRING_SILENT_MARKER) - length = len(match.group(0)) - self._column += length - - def TryConsume(self, token): - """Tries to consume a given piece of text. - - Args: - token: Text to consume. - - Returns: - True iff the text was consumed. - """ - if self.token == token: - self.NextToken() - return True - return False - - def Consume(self, token): - """Consumes a piece of text. - - Args: - token: Text to consume. - - Raises: - ParseError: If the text couldn't be consumed. - """ - if not self.TryConsume(token): - raise self.ParseError('Expected "%s".' % token) - - def ConsumeComment(self): - result = self.token - if not self._COMMENT.match(result): - raise self.ParseError('Expected comment.') - self.NextToken() - return result - - def ConsumeCommentOrTrailingComment(self): - """Consumes a comment, returns a 2-tuple (trailing bool, comment str).""" - - # Tokenizer initializes _previous_line and _previous_column to 0. As the - # tokenizer starts, it looks like there is a previous token on the line. - just_started = self._line == 0 and self._column == 0 - - before_parsing = self._previous_line - comment = self.ConsumeComment() - - # A trailing comment is a comment on the same line than the previous token. - trailing = (self._previous_line == before_parsing - and not just_started) - - return trailing, comment - - def TryConsumeIdentifier(self): - try: - self.ConsumeIdentifier() - return True - except ParseError: - return False - - def ConsumeIdentifier(self): - """Consumes protocol message field identifier. - - Returns: - Identifier string. - - Raises: - ParseError: If an identifier couldn't be consumed. - """ - result = self.token - if not self._IDENTIFIER.match(result): - raise self.ParseError('Expected identifier.') - self.NextToken() - return result - - def TryConsumeIdentifierOrNumber(self): - try: - self.ConsumeIdentifierOrNumber() - return True - except ParseError: - return False - - def ConsumeIdentifierOrNumber(self): - """Consumes protocol message field identifier. - - Returns: - Identifier string. - - Raises: - ParseError: If an identifier couldn't be consumed. - """ - result = self.token - if not self._IDENTIFIER_OR_NUMBER.match(result): - raise self.ParseError('Expected identifier or number, got %s.' % result) - self.NextToken() - return result - - def TryConsumeInteger(self): - try: - self.ConsumeInteger() - return True - except ParseError: - return False - - def ConsumeInteger(self): - """Consumes an integer number. - - Returns: - The integer parsed. - - Raises: - ParseError: If an integer couldn't be consumed. - """ - try: - result = _ParseAbstractInteger(self.token) - except ValueError as e: - raise self.ParseError(str(e)) - self.NextToken() - return result - - def TryConsumeFloat(self): - try: - self.ConsumeFloat() - return True - except ParseError: - return False - - def ConsumeFloat(self): - """Consumes an floating point number. - - Returns: - The number parsed. - - Raises: - ParseError: If a floating point number couldn't be consumed. - """ - try: - result = ParseFloat(self.token) - except ValueError as e: - raise self.ParseError(str(e)) - self.NextToken() - return result - - def ConsumeBool(self): - """Consumes a boolean value. - - Returns: - The bool parsed. - - Raises: - ParseError: If a boolean value couldn't be consumed. - """ - try: - result = ParseBool(self.token) - except ValueError as e: - raise self.ParseError(str(e)) - self.NextToken() - return result - - def TryConsumeByteString(self): - try: - self.ConsumeByteString() - return True - except ParseError: - return False - - def ConsumeString(self): - """Consumes a string value. - - Returns: - The string parsed. - - Raises: - ParseError: If a string value couldn't be consumed. - """ - the_bytes = self.ConsumeByteString() - try: - return str(the_bytes, 'utf-8') - except UnicodeDecodeError as e: - raise self._StringParseError(e) - - def ConsumeByteString(self): - """Consumes a byte array value. - - Returns: - The array parsed (as a string). - - Raises: - ParseError: If a byte array value couldn't be consumed. - """ - the_list = [self._ConsumeSingleByteString()] - while self.token and self.token[0] in _QUOTES: - the_list.append(self._ConsumeSingleByteString()) - return b''.join(the_list) - - def _ConsumeSingleByteString(self): - """Consume one token of a string literal. - - String literals (whether bytes or text) can come in multiple adjacent - tokens which are automatically concatenated, like in C or Python. This - method only consumes one token. - - Returns: - The token parsed. - Raises: - ParseError: When the wrong format data is found. - """ - text = self.token - if len(text) < 1 or text[0] not in _QUOTES: - raise self.ParseError('Expected string but found: %r' % (text,)) - - if len(text) < 2 or text[-1] != text[0]: - raise self.ParseError('String missing ending quote: %r' % (text,)) - - try: - result = text_encoding.CUnescape(text[1:-1]) - except ValueError as e: - raise self.ParseError(str(e)) - self.NextToken() - return result - - def ConsumeEnum(self, field): - try: - result = ParseEnum(field, self.token) - except ValueError as e: - raise self.ParseError(str(e)) - self.NextToken() - return result - - def ParseErrorPreviousToken(self, message): - """Creates and *returns* a ParseError for the previously read token. - - Args: - message: A message to set for the exception. - - Returns: - A ParseError instance. - """ - return ParseError(message, self._previous_line + 1, - self._previous_column + 1) - - def ParseError(self, message): - """Creates and *returns* a ParseError for the current token.""" - return ParseError('\'' + self._current_line + '\': ' + message, - self._line + 1, self._column + 1) - - def _StringParseError(self, e): - return self.ParseError('Couldn\'t parse string: ' + str(e)) - - def NextToken(self): - """Reads the next meaningful token.""" - self._previous_line = self._line - self._previous_column = self._column - self.contains_silent_marker_before_current_token = False - - self._column += len(self.token) - self._SkipWhitespace() - - if not self._more_lines: - self.token = '' - return - - match = self._TOKEN.match(self._current_line, self._column) - if not match and not self._skip_comments: - match = self._COMMENT.match(self._current_line, self._column) - if match: - token = match.group(0) - self.token = token - else: - self.token = self._current_line[self._column] - -# Aliased so it can still be accessed by current visibility violators. -# TODO(dbarnett): Migrate violators to textformat_tokenizer. -_Tokenizer = Tokenizer # pylint: disable=invalid-name - - -def _ConsumeInt32(tokenizer): - """Consumes a signed 32bit integer number from tokenizer. - - Args: - tokenizer: A tokenizer used to parse the number. - - Returns: - The integer parsed. - - Raises: - ParseError: If a signed 32bit integer couldn't be consumed. - """ - return _ConsumeInteger(tokenizer, is_signed=True, is_long=False) - - -def _ConsumeUint32(tokenizer): - """Consumes an unsigned 32bit integer number from tokenizer. - - Args: - tokenizer: A tokenizer used to parse the number. - - Returns: - The integer parsed. - - Raises: - ParseError: If an unsigned 32bit integer couldn't be consumed. - """ - return _ConsumeInteger(tokenizer, is_signed=False, is_long=False) - - -def _TryConsumeInt64(tokenizer): - try: - _ConsumeInt64(tokenizer) - return True - except ParseError: - return False - - -def _ConsumeInt64(tokenizer): - """Consumes a signed 32bit integer number from tokenizer. - - Args: - tokenizer: A tokenizer used to parse the number. - - Returns: - The integer parsed. - - Raises: - ParseError: If a signed 32bit integer couldn't be consumed. - """ - return _ConsumeInteger(tokenizer, is_signed=True, is_long=True) - - -def _TryConsumeUint64(tokenizer): - try: - _ConsumeUint64(tokenizer) - return True - except ParseError: - return False - - -def _ConsumeUint64(tokenizer): - """Consumes an unsigned 64bit integer number from tokenizer. - - Args: - tokenizer: A tokenizer used to parse the number. - - Returns: - The integer parsed. - - Raises: - ParseError: If an unsigned 64bit integer couldn't be consumed. - """ - return _ConsumeInteger(tokenizer, is_signed=False, is_long=True) - - -def _ConsumeInteger(tokenizer, is_signed=False, is_long=False): - """Consumes an integer number from tokenizer. - - Args: - tokenizer: A tokenizer used to parse the number. - is_signed: True if a signed integer must be parsed. - is_long: True if a long integer must be parsed. - - Returns: - The integer parsed. - - Raises: - ParseError: If an integer with given characteristics couldn't be consumed. - """ - try: - result = ParseInteger(tokenizer.token, is_signed=is_signed, is_long=is_long) - except ValueError as e: - raise tokenizer.ParseError(str(e)) - tokenizer.NextToken() - return result - - -def ParseInteger(text, is_signed=False, is_long=False): - """Parses an integer. - - Args: - text: The text to parse. - is_signed: True if a signed integer must be parsed. - is_long: True if a long integer must be parsed. - - Returns: - The integer value. - - Raises: - ValueError: Thrown Iff the text is not a valid integer. - """ - # Do the actual parsing. Exception handling is propagated to caller. - result = _ParseAbstractInteger(text) - - # Check if the integer is sane. Exceptions handled by callers. - checker = _INTEGER_CHECKERS[2 * int(is_long) + int(is_signed)] - checker.CheckValue(result) - return result - - -def _ParseAbstractInteger(text): - """Parses an integer without checking size/signedness. - - Args: - text: The text to parse. - - Returns: - The integer value. - - Raises: - ValueError: Thrown Iff the text is not a valid integer. - """ - # Do the actual parsing. Exception handling is propagated to caller. - orig_text = text - c_octal_match = re.match(r'(-?)0(\d+)$', text) - if c_octal_match: - # Python 3 no longer supports 0755 octal syntax without the 'o', so - # we always use the '0o' prefix for multi-digit numbers starting with 0. - text = c_octal_match.group(1) + '0o' + c_octal_match.group(2) - try: - return int(text, 0) - except ValueError: - raise ValueError('Couldn\'t parse integer: %s' % orig_text) - - -def ParseFloat(text): - """Parse a floating point number. - - Args: - text: Text to parse. - - Returns: - The number parsed. - - Raises: - ValueError: If a floating point number couldn't be parsed. - """ - try: - # Assume Python compatible syntax. - return float(text) - except ValueError: - # Check alternative spellings. - if _FLOAT_INFINITY.match(text): - if text[0] == '-': - return float('-inf') - else: - return float('inf') - elif _FLOAT_NAN.match(text): - return float('nan') - else: - # assume '1.0f' format - try: - return float(text.rstrip('f')) - except ValueError: - raise ValueError('Couldn\'t parse float: %s' % text) - - -def ParseBool(text): - """Parse a boolean value. - - Args: - text: Text to parse. - - Returns: - Boolean values parsed - - Raises: - ValueError: If text is not a valid boolean. - """ - if text in ('true', 't', '1', 'True'): - return True - elif text in ('false', 'f', '0', 'False'): - return False - else: - raise ValueError('Expected "true" or "false".') - - -def ParseEnum(field, value): - """Parse an enum value. - - The value can be specified by a number (the enum value), or by - a string literal (the enum name). - - Args: - field: Enum field descriptor. - value: String value. - - Returns: - Enum value number. - - Raises: - ValueError: If the enum value could not be parsed. - """ - enum_descriptor = field.enum_type - try: - number = int(value, 0) - except ValueError: - # Identifier. - enum_value = enum_descriptor.values_by_name.get(value, None) - if enum_value is None: - raise ValueError('Enum type "%s" has no value named %s.' % - (enum_descriptor.full_name, value)) - else: - if not field.enum_type.is_closed: - return number - enum_value = enum_descriptor.values_by_number.get(number, None) - if enum_value is None: - raise ValueError('Enum type "%s" has no value with number %d.' % - (enum_descriptor.full_name, number)) - return enum_value.number diff --git a/script.module.protobuf/resources/lib/google/protobuf/timestamp_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/timestamp_pb2.py deleted file mode 100644 index b10f2f204..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/timestamp_pb2.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/timestamp.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fgoogle/protobuf/timestamp.proto\x12\x0fgoogle.protobuf\";\n\tTimestamp\x12\x18\n\x07seconds\x18\x01 \x01(\x03R\x07seconds\x12\x14\n\x05nanos\x18\x02 \x01(\x05R\x05nanosB\x85\x01\n\x13\x63om.google.protobufB\x0eTimestampProtoP\x01Z2google.golang.org/protobuf/types/known/timestamppb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.timestamp_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\016TimestampProtoP\001Z2google.golang.org/protobuf/types/known/timestamppb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_TIMESTAMP']._serialized_start=52 - _globals['_TIMESTAMP']._serialized_end=111 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/type_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/type_pb2.py deleted file mode 100644 index ca8a4e20e..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/type_pb2.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/type.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2 -from google.protobuf import source_context_pb2 as google_dot_protobuf_dot_source__context__pb2 - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1agoogle/protobuf/type.proto\x12\x0fgoogle.protobuf\x1a\x19google/protobuf/any.proto\x1a$google/protobuf/source_context.proto\"\xa7\x02\n\x04Type\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12.\n\x06\x66ields\x18\x02 \x03(\x0b\x32\x16.google.protobuf.FieldR\x06\x66ields\x12\x16\n\x06oneofs\x18\x03 \x03(\tR\x06oneofs\x12\x31\n\x07options\x18\x04 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12\x45\n\x0esource_context\x18\x05 \x01(\x0b\x32\x1e.google.protobuf.SourceContextR\rsourceContext\x12/\n\x06syntax\x18\x06 \x01(\x0e\x32\x17.google.protobuf.SyntaxR\x06syntax\x12\x18\n\x07\x65\x64ition\x18\x07 \x01(\tR\x07\x65\x64ition\"\xb4\x06\n\x05\x46ield\x12/\n\x04kind\x18\x01 \x01(\x0e\x32\x1b.google.protobuf.Field.KindR\x04kind\x12\x44\n\x0b\x63\x61rdinality\x18\x02 \x01(\x0e\x32\".google.protobuf.Field.CardinalityR\x0b\x63\x61rdinality\x12\x16\n\x06number\x18\x03 \x01(\x05R\x06number\x12\x12\n\x04name\x18\x04 \x01(\tR\x04name\x12\x19\n\x08type_url\x18\x06 \x01(\tR\x07typeUrl\x12\x1f\n\x0boneof_index\x18\x07 \x01(\x05R\noneofIndex\x12\x16\n\x06packed\x18\x08 \x01(\x08R\x06packed\x12\x31\n\x07options\x18\t \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12\x1b\n\tjson_name\x18\n \x01(\tR\x08jsonName\x12#\n\rdefault_value\x18\x0b \x01(\tR\x0c\x64\x65\x66\x61ultValue\"\xc8\x02\n\x04Kind\x12\x10\n\x0cTYPE_UNKNOWN\x10\x00\x12\x0f\n\x0bTYPE_DOUBLE\x10\x01\x12\x0e\n\nTYPE_FLOAT\x10\x02\x12\x0e\n\nTYPE_INT64\x10\x03\x12\x0f\n\x0bTYPE_UINT64\x10\x04\x12\x0e\n\nTYPE_INT32\x10\x05\x12\x10\n\x0cTYPE_FIXED64\x10\x06\x12\x10\n\x0cTYPE_FIXED32\x10\x07\x12\r\n\tTYPE_BOOL\x10\x08\x12\x0f\n\x0bTYPE_STRING\x10\t\x12\x0e\n\nTYPE_GROUP\x10\n\x12\x10\n\x0cTYPE_MESSAGE\x10\x0b\x12\x0e\n\nTYPE_BYTES\x10\x0c\x12\x0f\n\x0bTYPE_UINT32\x10\r\x12\r\n\tTYPE_ENUM\x10\x0e\x12\x11\n\rTYPE_SFIXED32\x10\x0f\x12\x11\n\rTYPE_SFIXED64\x10\x10\x12\x0f\n\x0bTYPE_SINT32\x10\x11\x12\x0f\n\x0bTYPE_SINT64\x10\x12\"t\n\x0b\x43\x61rdinality\x12\x17\n\x13\x43\x41RDINALITY_UNKNOWN\x10\x00\x12\x18\n\x14\x43\x41RDINALITY_OPTIONAL\x10\x01\x12\x18\n\x14\x43\x41RDINALITY_REQUIRED\x10\x02\x12\x18\n\x14\x43\x41RDINALITY_REPEATED\x10\x03\"\x99\x02\n\x04\x45num\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x38\n\tenumvalue\x18\x02 \x03(\x0b\x32\x1a.google.protobuf.EnumValueR\tenumvalue\x12\x31\n\x07options\x18\x03 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\x12\x45\n\x0esource_context\x18\x04 \x01(\x0b\x32\x1e.google.protobuf.SourceContextR\rsourceContext\x12/\n\x06syntax\x18\x05 \x01(\x0e\x32\x17.google.protobuf.SyntaxR\x06syntax\x12\x18\n\x07\x65\x64ition\x18\x06 \x01(\tR\x07\x65\x64ition\"j\n\tEnumValue\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12\x16\n\x06number\x18\x02 \x01(\x05R\x06number\x12\x31\n\x07options\x18\x03 \x03(\x0b\x32\x17.google.protobuf.OptionR\x07options\"H\n\x06Option\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12*\n\x05value\x18\x02 \x01(\x0b\x32\x14.google.protobuf.AnyR\x05value*C\n\x06Syntax\x12\x11\n\rSYNTAX_PROTO2\x10\x00\x12\x11\n\rSYNTAX_PROTO3\x10\x01\x12\x13\n\x0fSYNTAX_EDITIONS\x10\x02\x42{\n\x13\x63om.google.protobufB\tTypeProtoP\x01Z-google.golang.org/protobuf/types/known/typepb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.type_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\tTypeProtoP\001Z-google.golang.org/protobuf/types/known/typepb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_SYNTAX']._serialized_start=1699 - _globals['_SYNTAX']._serialized_end=1766 - _globals['_TYPE']._serialized_start=113 - _globals['_TYPE']._serialized_end=408 - _globals['_FIELD']._serialized_start=411 - _globals['_FIELD']._serialized_end=1231 - _globals['_FIELD_KIND']._serialized_start=785 - _globals['_FIELD_KIND']._serialized_end=1113 - _globals['_FIELD_CARDINALITY']._serialized_start=1115 - _globals['_FIELD_CARDINALITY']._serialized_end=1231 - _globals['_ENUM']._serialized_start=1234 - _globals['_ENUM']._serialized_end=1515 - _globals['_ENUMVALUE']._serialized_start=1517 - _globals['_ENUMVALUE']._serialized_end=1623 - _globals['_OPTION']._serialized_start=1625 - _globals['_OPTION']._serialized_end=1697 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.protobuf/resources/lib/google/protobuf/unknown_fields.py b/script.module.protobuf/resources/lib/google/protobuf/unknown_fields.py deleted file mode 100644 index 3bd828619..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/unknown_fields.py +++ /dev/null @@ -1,120 +0,0 @@ -# Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. All rights reserved. -# https://developers.google.com/protocol-buffers/ -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -"""Contains Unknown Fields APIs. - -Simple usage example: - unknown_field_set = UnknownFieldSet(message) - for unknown_field in unknown_field_set: - wire_type = unknown_field.wire_type - field_number = unknown_field.field_number - data = unknown_field.data -""" - - -from google.protobuf.internal import api_implementation - -if api_implementation._c_module is not None: # pylint: disable=protected-access - UnknownFieldSet = api_implementation._c_module.UnknownFieldSet # pylint: disable=protected-access -else: - from google.protobuf.internal import decoder # pylint: disable=g-import-not-at-top - from google.protobuf.internal import wire_format # pylint: disable=g-import-not-at-top - - class UnknownField: - """A parsed unknown field.""" - - # Disallows assignment to other attributes. - __slots__ = ['_field_number', '_wire_type', '_data'] - - def __init__(self, field_number, wire_type, data): - self._field_number = field_number - self._wire_type = wire_type - self._data = data - return - - @property - def field_number(self): - return self._field_number - - @property - def wire_type(self): - return self._wire_type - - @property - def data(self): - return self._data - - class UnknownFieldSet: - """UnknownField container.""" - - # Disallows assignment to other attributes. - __slots__ = ['_values'] - - def __init__(self, msg): - - def InternalAdd(field_number, wire_type, data): - unknown_field = UnknownField(field_number, wire_type, data) - self._values.append(unknown_field) - - self._values = [] - msg_des = msg.DESCRIPTOR - # pylint: disable=protected-access - unknown_fields = msg._unknown_fields - if (msg_des.has_options and - msg_des.GetOptions().message_set_wire_format): - local_decoder = decoder.UnknownMessageSetItemDecoder() - for _, buffer in unknown_fields: - (field_number, data) = local_decoder(memoryview(buffer)) - InternalAdd(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED, data) - else: - for tag_bytes, buffer in unknown_fields: - # pylint: disable=protected-access - (tag, _) = decoder._DecodeVarint(tag_bytes, 0) - field_number, wire_type = wire_format.UnpackTag(tag) - if field_number == 0: - raise RuntimeError('Field number 0 is illegal.') - (data, _) = decoder._DecodeUnknownField( - memoryview(buffer), 0, wire_type) - InternalAdd(field_number, wire_type, data) - - def __getitem__(self, index): - size = len(self._values) - if index < 0: - index += size - if index < 0 or index >= size: - raise IndexError('index %d out of range'.index) - - return self._values[index] - - def __len__(self): - return len(self._values) - - def __iter__(self): - return iter(self._values) diff --git a/script.module.protobuf/resources/lib/google/protobuf/util/__init__.py b/script.module.protobuf/resources/lib/google/protobuf/util/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/script.module.protobuf/resources/lib/google/protobuf/wrappers_pb2.py b/script.module.protobuf/resources/lib/google/protobuf/wrappers_pb2.py deleted file mode 100644 index 035bddcb5..000000000 --- a/script.module.protobuf/resources/lib/google/protobuf/wrappers_pb2.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: google/protobuf/wrappers.proto -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1egoogle/protobuf/wrappers.proto\x12\x0fgoogle.protobuf\"#\n\x0b\x44oubleValue\x12\x14\n\x05value\x18\x01 \x01(\x01R\x05value\"\"\n\nFloatValue\x12\x14\n\x05value\x18\x01 \x01(\x02R\x05value\"\"\n\nInt64Value\x12\x14\n\x05value\x18\x01 \x01(\x03R\x05value\"#\n\x0bUInt64Value\x12\x14\n\x05value\x18\x01 \x01(\x04R\x05value\"\"\n\nInt32Value\x12\x14\n\x05value\x18\x01 \x01(\x05R\x05value\"#\n\x0bUInt32Value\x12\x14\n\x05value\x18\x01 \x01(\rR\x05value\"!\n\tBoolValue\x12\x14\n\x05value\x18\x01 \x01(\x08R\x05value\"#\n\x0bStringValue\x12\x14\n\x05value\x18\x01 \x01(\tR\x05value\"\"\n\nBytesValue\x12\x14\n\x05value\x18\x01 \x01(\x0cR\x05valueB\x83\x01\n\x13\x63om.google.protobufB\rWrappersProtoP\x01Z1google.golang.org/protobuf/types/known/wrapperspb\xf8\x01\x01\xa2\x02\x03GPB\xaa\x02\x1eGoogle.Protobuf.WellKnownTypesb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'google.protobuf.wrappers_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\023com.google.protobufB\rWrappersProtoP\001Z1google.golang.org/protobuf/types/known/wrapperspb\370\001\001\242\002\003GPB\252\002\036Google.Protobuf.WellKnownTypes' - _globals['_DOUBLEVALUE']._serialized_start=51 - _globals['_DOUBLEVALUE']._serialized_end=86 - _globals['_FLOATVALUE']._serialized_start=88 - _globals['_FLOATVALUE']._serialized_end=122 - _globals['_INT64VALUE']._serialized_start=124 - _globals['_INT64VALUE']._serialized_end=158 - _globals['_UINT64VALUE']._serialized_start=160 - _globals['_UINT64VALUE']._serialized_end=195 - _globals['_INT32VALUE']._serialized_start=197 - _globals['_INT32VALUE']._serialized_end=231 - _globals['_UINT32VALUE']._serialized_start=233 - _globals['_UINT32VALUE']._serialized_end=268 - _globals['_BOOLVALUE']._serialized_start=270 - _globals['_BOOLVALUE']._serialized_end=303 - _globals['_STRINGVALUE']._serialized_start=305 - _globals['_STRINGVALUE']._serialized_end=340 - _globals['_BYTESVALUE']._serialized_start=342 - _globals['_BYTESVALUE']._serialized_end=376 -# @@protoc_insertion_point(module_scope) diff --git a/script.module.python.twitch/LICENSES/GPL-3.0-only b/script.module.python.twitch/LICENSES/GPL-3.0-only deleted file mode 100644 index 9cecc1d46..000000000 --- a/script.module.python.twitch/LICENSES/GPL-3.0-only +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/script.module.python.twitch/addon.xml b/script.module.python.twitch/addon.xml deleted file mode 100644 index c9173fc3e..000000000 --- a/script.module.python.twitch/addon.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - all - -[fix] Following Channels - - - resources/media/icon.png - - all - GPL-3.0-only - https://github.com/anxdpanic/script.module.python.twitch - https://twitchaddon.panicked.xyz/forum - true - Modul til interaktion med Twitch.tv API - Modul für die Interaktion mit der Twitch.tv-API - Module for interaction with the Twitch.tv API - Módulo para interactuar con la API de Twitch.tv - Moduuli Twitch.tv-rajapinnan käyttöön - Module pour interagir avec l'API de Twitch.tv - Modul za interakciju s Twitch.tv API - Modul a Twitch.tv API -val való interakcióhoz - Modulo per l'interazione con l'API di Twitch.tv - Twitch.tv API와의 상호작용을 위한 모듈 - Moduł do interakcji z API Twitch.tv - Модуль для взаимодействия с Twitch.tv API - 与 Twitch.tv API 交互的模块 - python-twitch til Kodi er et modul til interaktion med Twitch.tv API baseret på python-twitch af ingwinlu. - python-twitch für Kodi ist ein Modul für die Interaktion mit der Twitch.tv-API, basierend auf python-twitch von ingwinlu. - python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu. - python-twitch para Kodi es un módulo para interactuar con la API de Twitch.tv basado en python-twitch de ingwinlu. - 'Python-twitch for Kodi' on Twitch.tv-palvelun rajapinnan hyödyntämisen mahdollistava moduuli, joka perustuu kehittäjän ingwinlu luomaan python-twitch-moduuliin. - python-twitch pour Kodi est un module pour interagir avec l'API Twitch.tv basé sur python-twitch de ingwinlu. - python-twitch za Kodi je modul za interakciju s Twitch.tv API-jem temeljenom na python-twitch by ingwinlu. - A python-twitch a Kodi számára a Twitch.tv API-val való interakció modulja, amely az ingwinlu python-twitch-jén alapul. - python-twitch per Kodi è un modulo per l'interazione con l'API di Twitch.tv basato su python-twitch di ingwinlu. - Kodi용 python-twitch는 ingwinlu의 python-twitch를 기반으로 하는 Twitch.tv API와 상호 작용하기 위한 모듈입니다. - python-twitch dla Kodi to moduł do interakcji z API Twitch.tv oparty na python-twitch autorstwa ingwinlu. - python-twitch это модуль для взаимодействия с Twitch.tv API. Основан на модуле python-twitch от ingwinlu. - Kodi 的 python-twitch 是从 ingwinlu 开发版本移植的与 twitch.tv API 交互的模块。 - - diff --git a/script.module.python.twitch/changelog.txt b/script.module.python.twitch/changelog.txt deleted file mode 100644 index 6643b4e59..000000000 --- a/script.module.python.twitch/changelog.txt +++ /dev/null @@ -1,108 +0,0 @@ -3.0.0 -[rem] removed support for Kodi versions pre-Nexus v20 -[rem] removed python 2 support -[rem] removed dependency on six -[lang] updated translations from Weblate - -2.0.21 -[upd] fixups and additions to Helix API -[rem] remove v5 API -[lang] updated translations from Weblate - -2.0.19 -[fix] fix v5.users.follow_channel request - apo86 -[fix] fix v5.users.unfollow_channel request - apo86 -[lang] updated translations from Weblate - -2.0.18 -[fix] fix v5.streams.by_id request - apo86 - -2.0.17 -[fix] playback of clips - -2.0.16 -[fix] playback, change access token to use gql endpoints -[chg] change followed, following, and unfollowing games to use gql endpoints - -2.0.15 -[upd] Update material to reflect repository changes - -2.0.14 -[fix] logging in Kodi 19 - -2.0.13 -[fix] stream language - -2.0.12 -[fix] clip usher - -2.0.11 -[fix] Python 3 - don't decode string when processing clips - -2.0.10 -[upd] allow overriding headers for all hidden api calls - -2.0.9 -[upd] allow overriding headers for usher and hidden api calls -[fix] decode byte responses in scraper -[fix] usher/parser error handling - -2.0.8 -[upd] Mark communities endpoints and queries as deprecated - -2.0.7 -[add] add platform parameter to usher - -2.0.6 -[add] add missing helix api endpoints - -2.0.5 -[add] add frame rate and resolution to returned stream information -[upd] update usher parameters -[upd] use SPDX license identifiers - -2.0.4 -[fix] video/live stream token encoding - -2.0.3 -[chg] redact user ip from token logging - -2.0.2 -[fix] Python 3 compat. -[add] fast_bread param to usher -[add/upd] helix endpoints - -2.0.1 -[fix] clips usher -[chg] to relative imports -[upd] deprecation/removal dates - -2.0.0 -[chg] refactor oauth for inclusion of helix -- adds MobileClient().prepare_token_uri() for generating app access tokens, adds client_secret requirement -- adds MobileClient().prepare_revoke_uri() for revoking oauth tokens -- adds helix oauth scopes -- twitch.scopes -> twitch.oauth..scopes -- twitch.oauth.MobileClient() -> twitch.oauth.clients.MobileClient() -[add] helix api -[add] add usher.live_request and usher.video_request -[add] MobileClient().revoke_token and MobileClient().get_app_access_token queries -[add] Kodi logging -[add] v5 users.users - -1.1.0 -*** Twitch API V5 is deprecated and will be removed entirely on 2/14/18 -*** script.module.python.twitch v2 will include the Twitch helix API, and may include breaking changes to current implementations. - If you rely on this module follow development at https://github.com/MrSprigster/script.module.python.twitch - -[fix/upd] v5.channels deprecated notations for community endpoints, add new communities endpoints - -1.0.2 -[fix] omit oauth token for queries with 'required scope: none' - -1.0.1 -[fix/upd] offset, limit to games _get_followed -[fix] omit oauth token for videos by_id - -1.0.0 -- initial release diff --git a/script.module.python.twitch/resources/__init__.py b/script.module.python.twitch/resources/__init__.py deleted file mode 100644 index a5da79b88..000000000 --- a/script.module.python.twitch/resources/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -""" - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" diff --git a/script.module.python.twitch/resources/language/resource.language.af_za/strings.po b/script.module.python.twitch/resources/language/resource.language.af_za/strings.po deleted file mode 100644 index f9caee45c..000000000 --- a/script.module.python.twitch/resources/language/resource.language.af_za/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: af_za\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.am_et/strings.po b/script.module.python.twitch/resources/language/resource.language.am_et/strings.po deleted file mode 100644 index 3219e715d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.am_et/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: am_et\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ar_sa/strings.po b/script.module.python.twitch/resources/language/resource.language.ar_sa/strings.po deleted file mode 100644 index 49309ef8d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ar_sa/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ar_sa\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ast_es/strings.po b/script.module.python.twitch/resources/language/resource.language.ast_es/strings.po deleted file mode 100644 index 2c13e49f1..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ast_es/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ast_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.az_az/strings.po b/script.module.python.twitch/resources/language/resource.language.az_az/strings.po deleted file mode 100644 index 7caeff798..000000000 --- a/script.module.python.twitch/resources/language/resource.language.az_az/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: az_az\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.be_by/strings.po b/script.module.python.twitch/resources/language/resource.language.be_by/strings.po deleted file mode 100644 index 94699adb0..000000000 --- a/script.module.python.twitch/resources/language/resource.language.be_by/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: be_by\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.bg_bg/strings.po b/script.module.python.twitch/resources/language/resource.language.bg_bg/strings.po deleted file mode 100644 index ca764b94f..000000000 --- a/script.module.python.twitch/resources/language/resource.language.bg_bg/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: bg_bg\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.bs_ba/strings.po b/script.module.python.twitch/resources/language/resource.language.bs_ba/strings.po deleted file mode 100644 index a8ff29de7..000000000 --- a/script.module.python.twitch/resources/language/resource.language.bs_ba/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: bs_ba\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ca_es/strings.po b/script.module.python.twitch/resources/language/resource.language.ca_es/strings.po deleted file mode 100644 index 40a64bcdf..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ca_es/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ca_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.cs_cz/strings.po b/script.module.python.twitch/resources/language/resource.language.cs_cz/strings.po deleted file mode 100644 index 5efb0628e..000000000 --- a/script.module.python.twitch/resources/language/resource.language.cs_cz/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: cs_cz\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.cy_gb/strings.po b/script.module.python.twitch/resources/language/resource.language.cy_gb/strings.po deleted file mode 100644 index 4ed549fe3..000000000 --- a/script.module.python.twitch/resources/language/resource.language.cy_gb/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: cy_gb\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=6; plural=(n==0) ? 0 : (n==1) ? 1 : (n==2) ? 2 : (n==3) ? 3 :(n==6) ? 4 : 5;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.da_dk/strings.po b/script.module.python.twitch/resources/language/resource.language.da_dk/strings.po deleted file mode 100644 index 1373d1b54..000000000 --- a/script.module.python.twitch/resources/language/resource.language.da_dk/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-07-26 22:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Danish \n" -"Language: da_dk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Modul til interaktion med Twitch.tv API" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "python-twitch til Kodi er et modul til interaktion med Twitch.tv API baseret på python-twitch af ingwinlu." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.de_de/strings.po b/script.module.python.twitch/resources/language/resource.language.de_de/strings.po deleted file mode 100644 index 984c0409b..000000000 --- a/script.module.python.twitch/resources/language/resource.language.de_de/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-07-26 22:29+0000\n" -"Last-Translator: Kai Sommerfeld \n" -"Language-Team: German \n" -"Language: de_de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Modul für die Interaktion mit der Twitch.tv-API" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "python-twitch für Kodi ist ein Modul für die Interaktion mit der Twitch.tv-API, basierend auf python-twitch von ingwinlu." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.el_gr/strings.po b/script.module.python.twitch/resources/language/resource.language.el_gr/strings.po deleted file mode 100644 index a8abdb8fc..000000000 --- a/script.module.python.twitch/resources/language/resource.language.el_gr/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: el_gr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.en_au/strings.po b/script.module.python.twitch/resources/language/resource.language.en_au/strings.po deleted file mode 100644 index 538c342e7..000000000 --- a/script.module.python.twitch/resources/language/resource.language.en_au/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: en_au\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.en_gb/strings.po b/script.module.python.twitch/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index 6c97c218a..000000000 --- a/script.module.python.twitch/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE\n" -"Language: en_GB\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.en_nz/strings.po b/script.module.python.twitch/resources/language/resource.language.en_nz/strings.po deleted file mode 100644 index 0bf3c8916..000000000 --- a/script.module.python.twitch/resources/language/resource.language.en_nz/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: en_nz\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.en_us/strings.po b/script.module.python.twitch/resources/language/resource.language.en_us/strings.po deleted file mode 100644 index c03bd8b02..000000000 --- a/script.module.python.twitch/resources/language/resource.language.en_us/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: en_us\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.eo/strings.po b/script.module.python.twitch/resources/language/resource.language.eo/strings.po deleted file mode 100644 index 5d972fb41..000000000 --- a/script.module.python.twitch/resources/language/resource.language.eo/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: eo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.es_ar/strings.po b/script.module.python.twitch/resources/language/resource.language.es_ar/strings.po deleted file mode 100644 index feb15b229..000000000 --- a/script.module.python.twitch/resources/language/resource.language.es_ar/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: es_ar\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.es_es/strings.po b/script.module.python.twitch/resources/language/resource.language.es_es/strings.po deleted file mode 100644 index aadd794fd..000000000 --- a/script.module.python.twitch/resources/language/resource.language.es_es/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-07-03 12:29+0000\n" -"Last-Translator: Alfonso Cachero \n" -"Language-Team: Spanish (Spain) \n" -"Language: es_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.1\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Módulo para interactuar con la API de Twitch.tv" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "python-twitch para Kodi es un módulo para interactuar con la API de Twitch.tv basado en python-twitch de ingwinlu." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.es_mx/strings.po b/script.module.python.twitch/resources/language/resource.language.es_mx/strings.po deleted file mode 100644 index 1c570be9e..000000000 --- a/script.module.python.twitch/resources/language/resource.language.es_mx/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: es_mx\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.et_ee/strings.po b/script.module.python.twitch/resources/language/resource.language.et_ee/strings.po deleted file mode 100644 index 1e4e6effa..000000000 --- a/script.module.python.twitch/resources/language/resource.language.et_ee/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: et_ee\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.eu_es/strings.po b/script.module.python.twitch/resources/language/resource.language.eu_es/strings.po deleted file mode 100644 index de8b73ef9..000000000 --- a/script.module.python.twitch/resources/language/resource.language.eu_es/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: eu_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.fa_af/strings.po b/script.module.python.twitch/resources/language/resource.language.fa_af/strings.po deleted file mode 100644 index 5827aa177..000000000 --- a/script.module.python.twitch/resources/language/resource.language.fa_af/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: fa_af\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.fa_ir/strings.po b/script.module.python.twitch/resources/language/resource.language.fa_ir/strings.po deleted file mode 100644 index 9a5629a26..000000000 --- a/script.module.python.twitch/resources/language/resource.language.fa_ir/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: fa_ir\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.fi_fi/strings.po b/script.module.python.twitch/resources/language/resource.language.fi_fi/strings.po deleted file mode 100644 index 59078cb9d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.fi_fi/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-19 06:51+0000\n" -"Last-Translator: Oskari Lavinto \n" -"Language-Team: Finnish \n" -"Language: fi_fi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Moduuli Twitch.tv-rajapinnan käyttöön" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "'Python-twitch for Kodi' on Twitch.tv-palvelun rajapinnan hyödyntämisen mahdollistava moduuli, joka perustuu kehittäjän ingwinlu luomaan python-twitch-moduuliin." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.fo_fo/strings.po b/script.module.python.twitch/resources/language/resource.language.fo_fo/strings.po deleted file mode 100644 index e33bf91a1..000000000 --- a/script.module.python.twitch/resources/language/resource.language.fo_fo/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: fo_fo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.fr_ca/strings.po b/script.module.python.twitch/resources/language/resource.language.fr_ca/strings.po deleted file mode 100644 index 42403e353..000000000 --- a/script.module.python.twitch/resources/language/resource.language.fr_ca/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: fr_ca\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.fr_fr/strings.po b/script.module.python.twitch/resources/language/resource.language.fr_fr/strings.po deleted file mode 100644 index 8ec67af4a..000000000 --- a/script.module.python.twitch/resources/language/resource.language.fr_fr/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2023-07-18 17:11+0000\n" -"Last-Translator: skypichat \n" -"Language-Team: French (France) \n" -"Language: fr_fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.18.2\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Module pour interagir avec l'API de Twitch.tv" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "python-twitch pour Kodi est un module pour interagir avec l'API Twitch.tv basé sur python-twitch de ingwinlu." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.gl_es/strings.po b/script.module.python.twitch/resources/language/resource.language.gl_es/strings.po deleted file mode 100644 index f3b07103b..000000000 --- a/script.module.python.twitch/resources/language/resource.language.gl_es/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: gl_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.he_il/strings.po b/script.module.python.twitch/resources/language/resource.language.he_il/strings.po deleted file mode 100644 index ce7d95aee..000000000 --- a/script.module.python.twitch/resources/language/resource.language.he_il/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: he_il\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && n % 10 == 0) ? 2 : 3));\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.hi_in/strings.po b/script.module.python.twitch/resources/language/resource.language.hi_in/strings.po deleted file mode 100644 index 815f9617d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.hi_in/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: hi_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.hr_hr/strings.po b/script.module.python.twitch/resources/language/resource.language.hr_hr/strings.po deleted file mode 100644 index 5824f81c8..000000000 --- a/script.module.python.twitch/resources/language/resource.language.hr_hr/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2023-01-11 18:15+0000\n" -"Last-Translator: gogogogi \n" -"Language-Team: Croatian \n" -"Language: hr_hr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Modul za interakciju s Twitch.tv API" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "python-twitch za Kodi je modul za interakciju s Twitch.tv API-jem temeljenom na python-twitch by ingwinlu." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.hu_hu/strings.po b/script.module.python.twitch/resources/language/resource.language.hu_hu/strings.po deleted file mode 100644 index f55904d37..000000000 --- a/script.module.python.twitch/resources/language/resource.language.hu_hu/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-09-03 07:29+0000\n" -"Last-Translator: Frodo19 \n" -"Language-Team: Hungarian \n" -"Language: hu_hu\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Modul a Twitch.tv API -val való interakcióhoz" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "A python-twitch a Kodi számára a Twitch.tv API-val való interakció modulja, amely az ingwinlu python-twitch-jén alapul." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.hy_am/strings.po b/script.module.python.twitch/resources/language/resource.language.hy_am/strings.po deleted file mode 100644 index 0731cc165..000000000 --- a/script.module.python.twitch/resources/language/resource.language.hy_am/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: hy_am\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.id_id/strings.po b/script.module.python.twitch/resources/language/resource.language.id_id/strings.po deleted file mode 100644 index 6c224a753..000000000 --- a/script.module.python.twitch/resources/language/resource.language.id_id/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: id_id\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.is_is/strings.po b/script.module.python.twitch/resources/language/resource.language.is_is/strings.po deleted file mode 100644 index ba59c924d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.is_is/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: is_is\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n % 10 != 1 || n % 100 == 11;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.it_it/strings.po b/script.module.python.twitch/resources/language/resource.language.it_it/strings.po deleted file mode 100644 index 3d590cbbc..000000000 --- a/script.module.python.twitch/resources/language/resource.language.it_it/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2023-04-24 04:16+0000\n" -"Last-Translator: Massimo Pissarello \n" -"Language-Team: Italian \n" -"Language: it_it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.2\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Modulo per l'interazione con l'API di Twitch.tv" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "python-twitch per Kodi è un modulo per l'interazione con l'API di Twitch.tv basato su python-twitch di ingwinlu." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ja_jp/strings.po b/script.module.python.twitch/resources/language/resource.language.ja_jp/strings.po deleted file mode 100644 index f86cb144d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ja_jp/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ja_jp\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.kn_in/strings.po b/script.module.python.twitch/resources/language/resource.language.kn_in/strings.po deleted file mode 100644 index 5cd9c36b6..000000000 --- a/script.module.python.twitch/resources/language/resource.language.kn_in/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: kn_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ko_kr/strings.po b/script.module.python.twitch/resources/language/resource.language.ko_kr/strings.po deleted file mode 100644 index fd61f6269..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ko_kr/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-08-28 07:29+0000\n" -"Last-Translator: Minho Park \n" -"Language-Team: Korean \n" -"Language: ko_kr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Twitch.tv API와의 상호작용을 위한 모듈" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "Kodi용 python-twitch는 ingwinlu의 python-twitch를 기반으로 하는 Twitch.tv API와 상호 작용하기 위한 모듈입니다." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.lt_lt/strings.po b/script.module.python.twitch/resources/language/resource.language.lt_lt/strings.po deleted file mode 100644 index 691509480..000000000 --- a/script.module.python.twitch/resources/language/resource.language.lt_lt/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: lt_lt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? 1 : 2);\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.lv_lv/strings.po b/script.module.python.twitch/resources/language/resource.language.lv_lv/strings.po deleted file mode 100644 index 29af1b6ee..000000000 --- a/script.module.python.twitch/resources/language/resource.language.lv_lv/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: lv_lv\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.mi/strings.po b/script.module.python.twitch/resources/language/resource.language.mi/strings.po deleted file mode 100644 index 8139e5f72..000000000 --- a/script.module.python.twitch/resources/language/resource.language.mi/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.mk_mk/strings.po b/script.module.python.twitch/resources/language/resource.language.mk_mk/strings.po deleted file mode 100644 index 9d585c39d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.mk_mk/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mk_mk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ml_in/strings.po b/script.module.python.twitch/resources/language/resource.language.ml_in/strings.po deleted file mode 100644 index 91be51d80..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ml_in/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ml_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.mn_mn/strings.po b/script.module.python.twitch/resources/language/resource.language.mn_mn/strings.po deleted file mode 100644 index 1ab5565a7..000000000 --- a/script.module.python.twitch/resources/language/resource.language.mn_mn/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mn_mn\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ms_my/strings.po b/script.module.python.twitch/resources/language/resource.language.ms_my/strings.po deleted file mode 100644 index b3e645527..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ms_my/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ms_my\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.mt_mt/strings.po b/script.module.python.twitch/resources/language/resource.language.mt_mt/strings.po deleted file mode 100644 index cb4f4c601..000000000 --- a/script.module.python.twitch/resources/language/resource.language.mt_mt/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mt_mt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.my_mm/strings.po b/script.module.python.twitch/resources/language/resource.language.my_mm/strings.po deleted file mode 100644 index 2403bdb4b..000000000 --- a/script.module.python.twitch/resources/language/resource.language.my_mm/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: my_mm\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.nb_no/strings.po b/script.module.python.twitch/resources/language/resource.language.nb_no/strings.po deleted file mode 100644 index 23d1b7bc8..000000000 --- a/script.module.python.twitch/resources/language/resource.language.nb_no/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: nb_no\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.nl_nl/strings.po b/script.module.python.twitch/resources/language/resource.language.nl_nl/strings.po deleted file mode 100644 index 467771de3..000000000 --- a/script.module.python.twitch/resources/language/resource.language.nl_nl/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: nl_nl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.oc_fr/strings.po b/script.module.python.twitch/resources/language/resource.language.oc_fr/strings.po deleted file mode 100644 index 345650300..000000000 --- a/script.module.python.twitch/resources/language/resource.language.oc_fr/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: oc_fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.os_os/strings.po b/script.module.python.twitch/resources/language/resource.language.os_os/strings.po deleted file mode 100644 index 68122aecd..000000000 --- a/script.module.python.twitch/resources/language/resource.language.os_os/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: os_os\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.pl_pl/strings.po b/script.module.python.twitch/resources/language/resource.language.pl_pl/strings.po deleted file mode 100644 index 28d29c3dd..000000000 --- a/script.module.python.twitch/resources/language/resource.language.pl_pl/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-07-16 19:29+0000\n" -"Last-Translator: Marek Adamski \n" -"Language-Team: Polish \n" -"Language: pl_pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7.1\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Moduł do interakcji z API Twitch.tv" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "python-twitch dla Kodi to moduł do interakcji z API Twitch.tv oparty na python-twitch autorstwa ingwinlu." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.pt_br/strings.po b/script.module.python.twitch/resources/language/resource.language.pt_br/strings.po deleted file mode 100644 index 2a0673776..000000000 --- a/script.module.python.twitch/resources/language/resource.language.pt_br/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: pt_br\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.pt_pt/strings.po b/script.module.python.twitch/resources/language/resource.language.pt_pt/strings.po deleted file mode 100644 index 1149431b3..000000000 --- a/script.module.python.twitch/resources/language/resource.language.pt_pt/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: pt_pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ro_ro/strings.po b/script.module.python.twitch/resources/language/resource.language.ro_ro/strings.po deleted file mode 100644 index a215c771e..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ro_ro/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ro_ro\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ru_ru/strings.po b/script.module.python.twitch/resources/language/resource.language.ru_ru/strings.po deleted file mode 100644 index c94f879d0..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ru_ru/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-06-25 00:29+0000\n" -"Last-Translator: Dmitry Petrov \n" -"Language-Team: Russian \n" -"Language: ru_ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.7\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "Модуль для взаимодействия с Twitch.tv API" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "python-twitch это модуль для взаимодействия с Twitch.tv API. Основан на модуле python-twitch от ingwinlu." - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.si_lk/strings.po b/script.module.python.twitch/resources/language/resource.language.si_lk/strings.po deleted file mode 100644 index 669f34d61..000000000 --- a/script.module.python.twitch/resources/language/resource.language.si_lk/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: si_lk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.sk_sk/strings.po b/script.module.python.twitch/resources/language/resource.language.sk_sk/strings.po deleted file mode 100644 index 4289d32cc..000000000 --- a/script.module.python.twitch/resources/language/resource.language.sk_sk/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: sk_sk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.sl_si/strings.po b/script.module.python.twitch/resources/language/resource.language.sl_si/strings.po deleted file mode 100644 index e2c508998..000000000 --- a/script.module.python.twitch/resources/language/resource.language.sl_si/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: sl_si\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.sq_al/strings.po b/script.module.python.twitch/resources/language/resource.language.sq_al/strings.po deleted file mode 100644 index f6ec84b8a..000000000 --- a/script.module.python.twitch/resources/language/resource.language.sq_al/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: sq_al\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.sr_rs/strings.po b/script.module.python.twitch/resources/language/resource.language.sr_rs/strings.po deleted file mode 100644 index 93395c690..000000000 --- a/script.module.python.twitch/resources/language/resource.language.sr_rs/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: sr_rs\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.sr_rs@latin/strings.po b/script.module.python.twitch/resources/language/resource.language.sr_rs@latin/strings.po deleted file mode 100644 index a25e3cefd..000000000 --- a/script.module.python.twitch/resources/language/resource.language.sr_rs@latin/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: sr_Latn\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.sv_se/strings.po b/script.module.python.twitch/resources/language/resource.language.sv_se/strings.po deleted file mode 100644 index e6465e747..000000000 --- a/script.module.python.twitch/resources/language/resource.language.sv_se/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: sv_se\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.szl/strings.po b/script.module.python.twitch/resources/language/resource.language.szl/strings.po deleted file mode 100644 index 237d4790f..000000000 --- a/script.module.python.twitch/resources/language/resource.language.szl/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: szl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.ta_in/strings.po b/script.module.python.twitch/resources/language/resource.language.ta_in/strings.po deleted file mode 100644 index 85acf5618..000000000 --- a/script.module.python.twitch/resources/language/resource.language.ta_in/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ta_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.te_in/strings.po b/script.module.python.twitch/resources/language/resource.language.te_in/strings.po deleted file mode 100644 index af21ffcd6..000000000 --- a/script.module.python.twitch/resources/language/resource.language.te_in/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: te_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.tg_tj/strings.po b/script.module.python.twitch/resources/language/resource.language.tg_tj/strings.po deleted file mode 100644 index 3a3a0147e..000000000 --- a/script.module.python.twitch/resources/language/resource.language.tg_tj/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: tg_tj\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.th_th/strings.po b/script.module.python.twitch/resources/language/resource.language.th_th/strings.po deleted file mode 100644 index b57ce775d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.th_th/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: th_th\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.tr_tr/strings.po b/script.module.python.twitch/resources/language/resource.language.tr_tr/strings.po deleted file mode 100644 index c623f4a6a..000000000 --- a/script.module.python.twitch/resources/language/resource.language.tr_tr/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: tr_tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.uk_ua/strings.po b/script.module.python.twitch/resources/language/resource.language.uk_ua/strings.po deleted file mode 100644 index 6d43b0223..000000000 --- a/script.module.python.twitch/resources/language/resource.language.uk_ua/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: uk_ua\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.uz_uz/strings.po b/script.module.python.twitch/resources/language/resource.language.uz_uz/strings.po deleted file mode 100644 index 9b19a1063..000000000 --- a/script.module.python.twitch/resources/language/resource.language.uz_uz/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: uz_uz\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.vi_vn/strings.po b/script.module.python.twitch/resources/language/resource.language.vi_vn/strings.po deleted file mode 100644 index ac7fb232d..000000000 --- a/script.module.python.twitch/resources/language/resource.language.vi_vn/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: vi_vn\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.zh_cn/strings.po b/script.module.python.twitch/resources/language/resource.language.zh_cn/strings.po deleted file mode 100644 index 13e218865..000000000 --- a/script.module.python.twitch/resources/language/resource.language.zh_cn/strings.po +++ /dev/null @@ -1,26 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-11-09 03:30+0000\n" -"Last-Translator: taxigps \n" -"Language-Team: Chinese (China) \n" -"Language: zh_cn\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "与 Twitch.tv API 交互的模块" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "Kodi 的 python-twitch 是从 ingwinlu 开发版本移植的与 twitch.tv API 交互的模块。" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/language/resource.language.zh_tw/strings.po b/script.module.python.twitch/resources/language/resource.language.zh_tw/strings.po deleted file mode 100644 index 4e24d8b33..000000000 --- a/script.module.python.twitch/resources/language/resource.language.zh_tw/strings.po +++ /dev/null @@ -1,25 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: zh_tw\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "Module for interaction with the Twitch.tv API" -msgstr "" - -msgctxt "Addon Description" -msgid "python-twitch for Kodi is module for interaction with the Twitch.tv API based on python-twitch by ingwinlu." -msgstr "" - -# msgctxt "#30000" -# msgid "" -# msgstr "" diff --git a/script.module.python.twitch/resources/lib/__init__.py b/script.module.python.twitch/resources/lib/__init__.py deleted file mode 100644 index af6ec4489..000000000 --- a/script.module.python.twitch/resources/lib/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -""" - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -__all__ = ['twitch'] - -from . import twitch diff --git a/script.module.python.twitch/resources/lib/twitch/__init__.py b/script.module.python.twitch/resources/lib/twitch/__init__.py deleted file mode 100644 index 9daac67ff..000000000 --- a/script.module.python.twitch/resources/lib/twitch/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -__all__ = ['VERSION', 'CLIENT_ID', 'CLIENT_SECRET', 'OAUTH_TOKEN', 'APP_TOKEN', 'api', 'oauth', - 'exceptions', 'keys', 'log', 'methods', 'parser', 'queries', 'scraper'] - -VERSION = '2.0.0' -CLIENT_ID = '' -CLIENT_SECRET = '' -OAUTH_TOKEN = '' -APP_TOKEN = '' - -from . import api -from . import oauth -from . import exceptions -from . import keys -from . import log -from . import methods -from . import parser -from . import queries -from . import scraper diff --git a/script.module.python.twitch/resources/lib/twitch/api/__init__.py b/script.module.python.twitch/resources/lib/twitch/api/__init__.py deleted file mode 100644 index 2eff873f6..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -__all__ = ['default', 'helix', 'parameters', 'usher'] - -from . import helix as default -from . import helix -from . import parameters -from . import usher diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/__init__.py b/script.module.python.twitch/resources/lib/twitch/api/helix/__init__.py deleted file mode 100644 index 2a5eeb12a..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/ - - Copyright (C) 2016-2019 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -__all__ = ['analytics', 'bits', 'clips', 'entitlements', 'games', 'search', 'streams', - 'subscriptions', 'tags', 'users', 'videos', 'webhooks'] - -from . import analytics # NOQA -from . import bits # NOQA -from . import clips # NOQA -from . import entitlements # NOQA -from . import games # NOQA -from . import search # NOQA -from . import streams # NOQA -from . import subscriptions # NOQA -from . import tags # NOQA -from . import users # NOQA -from . import videos # NOQA -from . import webhooks # NOQA diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/analytics.py b/script.module.python.twitch/resources/lib/twitch/api/helix/analytics.py deleted file mode 100644 index 15ca0006e..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/analytics.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ..parameters import IntRange, Cursor, ReportType -from ... import keys -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: analytics:read:extensions -@query -def extensions(started_at='', ended_at='', extension_id='', report_type='', after='MA==', first=20, use_app_token=False): - q = Qry('analytics/extensions', use_app_token=use_app_token) - q.add_param(keys.STARTED_AT, started_at, '') - q.add_param(keys.ENDED_AT, ended_at, '') - q.add_param(keys.EXTENSION_ID, extension_id, '') - if report_type: - q.add_param(keys.TYPE, ReportType.validate(report_type)) - if not extension_id: - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - - return q - - -# required scope: analytics:read:games -@query -def games(started_at='', ended_at='', game_id='', report_type='', after='MA==', first=20, use_app_token=False): - q = Qry('analytics/games', use_app_token=use_app_token) - q.add_param(keys.STARTED_AT, started_at, '') - q.add_param(keys.ENDED_AT, ended_at, '') - q.add_param(keys.GAME_ID, game_id, '') - if report_type: - q.add_param(keys.TYPE, ReportType.validate(report_type)) - if not game_id: - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/bits.py b/script.module.python.twitch/resources/lib/twitch/api/helix/bits.py deleted file mode 100644 index da9481724..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/bits.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ..parameters import PeriodHelix, IntRange -from ... import keys -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: bits:read -@query -def get_bits_leaderboard(count=10, period=PeriodHelix.ALL, started_at='', user_id='', use_app_token=False): - q = Qry('bits/leaderboard', use_app_token=use_app_token) - q.add_param(keys.COUNT, IntRange(1, 100).validate(count), 10) - q.add_param(keys.PERIOD, PeriodHelix.validate(period), PeriodHelix.ALL) - if period != PeriodHelix.ALL: - q.add_param(keys.STARTED_AT, started_at, '') - q.add_param(keys.USER_ID, user_id, '') - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/clips.py b/script.module.python.twitch/resources/lib/twitch/api/helix/clips.py deleted file mode 100644 index af1a0902e..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/clips.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ..parameters import Boolean, Cursor, IntRange, ItemCount -from ... import keys, methods -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: none -@query -def get_clip(broadcaster_id='', game_id='', clip_id=list(), - after='MA==', before='MA==', first=20, use_app_token=False): - q = Qry('clips', use_app_token=use_app_token) - q.add_param(keys.ID, ItemCount().validate(clip_id), list()) - if len(clip_id) != 1: - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.BEFORE, Cursor.validate(before), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - q.add_param(keys.BROADCASTER_ID, broadcaster_id, '') - q.add_param(keys.GAME_ID, game_id, '') - q.add_param(keys.ID, ItemCount().validate(clip_id), list()) - - return q - - -# required scope: clips:edit -@query -def create_clip(broadcaster_id, has_delay=Boolean.FALSE, use_app_token=False): - q = Qry('clips', use_app_token=use_app_token, method=methods.POST) - q.add_param(keys.BROADCASTER_ID, broadcaster_id, '') - q.add_param(keys.HAS_DELAY, Boolean.validate(has_delay), Boolean.FALSE) - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/entitlements.py b/script.module.python.twitch/resources/lib/twitch/api/helix/entitlements.py deleted file mode 100644 index e146ad427..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/entitlements.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2019 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ..parameters import EntitlementType, ItemCount -from ... import keys -from ... import methods -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: none -# requires app access token -@query -def upload(manifest_id, entitlement_type=EntitlementType.BULK_DROPS_GRANT): - q = Qry('entitlements/upload', use_app_token=True) - q.add_param(keys.MANIFEST_ID, manifest_id) - q.add_param(keys.TYPE, EntitlementType.validate(entitlement_type)) - - return q - - -# required scope: none -# requires app access token -@query -def get_code_status(code, user_id): - q = Qry('entitlements/codes', use_app_token=True, method=methods.GET) - q.add_param(keys.CODE, ItemCount(max_items=20).validate(code), list()) - q.add_param(keys.USER_ID, user_id) - - return q - - -# required scope: none -# requires app access token -@query -def redeem_code(code, user_id): - q = Qry('entitlements/codes', use_app_token=True, method=methods.POST) - q.add_param(keys.CODE, ItemCount(max_items=20).validate(code), list()) - q.add_param(keys.USER_ID, user_id) - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/games.py b/script.module.python.twitch/resources/lib/twitch/api/helix/games.py deleted file mode 100644 index 19238fcb0..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/games.py +++ /dev/null @@ -1,114 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ... import keys -from ...api.parameters import Cursor, IntRange, ItemCount -from ...queries import HelixQuery as Qry -from ...queries import GQLQuery as GQLQry -from ...queries import HiddenApiQuery as HQry -from ...queries import query - - -# required scope: none -@query -def get_games(game_id=list(), game_name=list(), use_app_token=False): - q = Qry('games', use_app_token=use_app_token) - q.add_param(keys.ID, ItemCount().validate(game_id), list()) - q.add_param(keys.NAME, ItemCount().validate(game_name), list()) - - return q - - -# required scope: none -@query -def get_top(after='MA==', before='MA==', first=20, use_app_token=False): - q = Qry('games/top', use_app_token=use_app_token) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.BEFORE, Cursor.validate(before), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - - return q - - -# required scope: none -# undocumented / unsupported -@query -def _check_follows(username, name, headers={}): - q = HQry('users/{username}/follows/games/isFollowing', headers=headers, use_token=False) - q.add_urlkw(keys.USERNAME, username) - q.add_param(keys.NAME, name) - return q - - -# required scope: none -# undocumented / unsupported -@query -def _get_followed(limit=100, headers={}): - data = [{ - "operationName": "FollowingGames_CurrentUser", - "variables": { - "limit": limit, - "type": "LIVE" - }, - "extensions": { - "persistedQuery": { - "version": 1, - "sha256Hash": "8446d4d234005813dc1f024f487ce95434c3e4202f451dd42777935b5ed035ce" - } - } - }] - q = GQLQry('', headers=headers, data=data, use_token=False) - return q - - -# required scope: user_follows_edit -# undocumented / unsupported -@query -def _follow(game_id, headers={}): - data = [{ - "operationName": "FollowGameButton_FollowGame", - "variables": { - "input": { - "gameID": str(game_id) - } - }, - "extensions": { - "persistedQuery": { - "version": 1, - "sha256Hash": "b846b65ba4bc9a3561dbe2d069d95deed9b9e031bcfda2482d1bedd84a1c2eb3" - } - } - }] - q = GQLQry('', headers=headers, data=data, use_token=False) - return q - - -# required scope: user_follows_edit -# undocumented / unsupported -@query -def _unfollow(game_id, headers={}): - data = [{ - "operationName": "FollowGameButton_UnfollowGame", - "variables": { - "input": { - "gameID": str(game_id) - } - }, - "extensions": { - "persistedQuery": { - "version": 1, - "sha256Hash": "811e02e396ebba0664f21ff002f2eff3c6f57e8af9aedb4f4dfa77cefd0db43d" - } - } - }] - q = GQLQry('', headers=headers, data=data, use_token=False) - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/search.py b/script.module.python.twitch/resources/lib/twitch/api/helix/search.py deleted file mode 100644 index 7819e2392..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/search.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2022- script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ... import keys -from ...api.parameters import Boolean, Cursor, IntRange -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: none -@query -def get_categories(search_query, after='MA==', first=20, use_app_token=False): - q = Qry('search/categories', use_app_token=use_app_token) - q.add_param(keys.QUERY, search_query) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - - return q - - -# required scope: none -@query -def get_channels(search_query, after='MA==', first=20, live_only=True, use_app_token=False): - q = Qry('search/channels', use_app_token=use_app_token) - q.add_param(keys.QUERY, search_query) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - q.add_param(keys.LIVE_ONLY, Boolean.validate(live_only), Boolean.FALSE) - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/streams.py b/script.module.python.twitch/resources/lib/twitch/api/helix/streams.py deleted file mode 100644 index b3b526830..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/streams.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2019 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ... import keys -from ...api.parameters import Cursor, Language, IntRange, ItemCount -from ... import methods -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: none -@query -def get_streams(game_id=list(), user_id=list(), - user_login=list(), language=list(), after='MA==', - before='MA==', first=20, use_app_token=False): - q = Qry('streams', use_app_token=use_app_token) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.BEFORE, Cursor.validate(before), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - q.add_param(keys.GAME_ID, ItemCount().validate(game_id), list()) - q.add_param(keys.USER_ID, ItemCount().validate(user_id), list()) - q.add_param(keys.USER_LOGIN, ItemCount().validate(user_login), list()) - if isinstance(language, list): - _language = [lang for lang in language if lang in Language.valid()] - q.add_param(keys.LANGUAGE, ItemCount().validate(_language), list()) - else: - q.add_param(keys.LANGUAGE, Language.validate(language), '') - - return q - - -# required scope: user:read:follows -@query -def get_followed(user_id, after='MA==', first=20, use_app_token=False): - q = Qry('streams/followed', use_app_token=use_app_token) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - q.add_param(keys.USER_ID, user_id) - - return q - - -# required scope: none -@query -def get_metadata(game_id=list(), user_id=list(), - user_login=list(), language=list(), after='MA==', - before='MA==', first=20, use_app_token=False): - q = Qry('streams/metadata', use_app_token=use_app_token) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.BEFORE, Cursor.validate(before), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - q.add_param(keys.GAME_ID, ItemCount().validate(game_id), list()) - q.add_param(keys.USER_ID, ItemCount().validate(user_id), list()) - q.add_param(keys.USER_LOGIN, ItemCount().validate(user_login), list()) - if isinstance(language, list): - _language = [lang for lang in language if lang in Language.valid()] - q.add_param(keys.LANGUAGE, ItemCount().validate(_language), list()) - else: - q.add_param(keys.LANGUAGE, Language.validate(language), '') - - return q - - -# required scope: user:edit:broadcast -@query -def create_stream_marker(user_id, description=''): - q = Qry('streams/markers', use_app_token=False, method=methods.POST) - q.add_param(keys.USER_ID, user_id) - q.add_param(keys.DESCRIPTION, description, '') - - return q - - -# required scope: user:read:broadcast -@query -def get_stream_markers(user_id, video_id, after='MA==', before='MA==', first=20): - q = Qry('streams/markers', use_app_token=False, method=methods.GET) - q.add_param(keys.USER_ID, user_id) - q.add_param(keys.VIDEO_ID, video_id) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.BEFORE, Cursor.validate(before), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/subscriptions.py b/script.module.python.twitch/resources/lib/twitch/api/helix/subscriptions.py deleted file mode 100644 index 5b23843e6..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/subscriptions.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2019 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ..parameters import Cursor, IntRange, ItemCount -from ... import keys, methods -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: channel:read:subscriptions -@query -def get_broadcaster_subscriptions(broadcaster_id, user_id=list(), after='MA==', first=20): - q = Qry('subscriptions', use_app_token=False, method=methods.GET) - q.add_param(keys.BROADCASTER_ID, broadcaster_id) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - q.add_param(keys.USER_ID, ItemCount().validate(user_id), list()) - return q - - -# required scope: channel:read:subscriptions -@query -def get_user_subscriptions(broadcaster_id, user_id): - q = Qry('subscriptions/user', use_app_token=False, method=methods.GET) - q.add_param(keys.BROADCASTER_ID, broadcaster_id) - q.add_param(keys.USER_ID, ItemCount().validate(user_id), list()) - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/tags.py b/script.module.python.twitch/resources/lib/twitch/api/helix/tags.py deleted file mode 100644 index aa9d0225f..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/tags.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2019 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ..parameters import Cursor, IntRange, ItemCount -from ... import keys, methods -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: none -# requires app access token -@query -def get_all_stream_tags(tag_id, after='MA==', first=20): - q = Qry('tags/streams', use_app_token=True, method=methods.GET) - q.add_param(keys.TAG_ID, ItemCount().validate(tag_id), list()) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - - return q - - -# required scope: none -# requires app access token -@query -def get_stream_tags(broadcaster_id): - q = Qry('streams/tags', use_app_token=True, method=methods.GET) - q.add_param(keys.BROADCASTER_ID, broadcaster_id) - - return q - - -# required scope: user:edit:broadcast -@query -def replace_stream_tags(broadcaster_id, tag_ids=list()): - q = Qry('tags/streams', use_app_token=False, method=methods.PUT) - q.add_param(keys.BROADCASTER_ID, broadcaster_id) - q.add_param(keys.TAG_IDS, ItemCount().validate(tag_ids), list()) - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/users.py b/script.module.python.twitch/resources/lib/twitch/api/helix/users.py deleted file mode 100644 index 4da035df9..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/users.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ... import keys, methods -from ...api.parameters import Cursor, IntRange, ItemCount -from ...queries import GQLQuery as GQLQry -from ...queries import HelixQuery as Qry -from ...queries import query - - -# optional scope: user:read:email -@query -def get_users(user_id=list(), user_login=list(), use_app_token=False): - use_token = (not user_id and not user_login) - use_app_token = False if use_token else use_app_token - q = Qry('users', use_app_token=use_app_token) - q.add_param(keys.ID, ItemCount().validate(user_id), list()) - q.add_param(keys.LOGIN, ItemCount().validate(user_login), list()) - - return q - - -# required scope: none -@query -def get_follows(user_id='', after='MA==', first=20, use_app_token=False): - q = Qry('channels/followed', use_app_token=use_app_token) - q.add_param(keys.USER_ID, user_id, '') - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - - return q - - -# required scope: user:edit -@query -def put_users(description): - q = Qry('users', method=methods.PUT) - q.add_param(keys.DESCRIPTION, description, '') - - return q - - -# required scope: user:read:broadcast -@query -def get_extensions(): - q = Qry('users/extensions/list') - - return q - - -# optional scope: user:read:broadcast or user:edit:broadcast -@query -def get_active_extensions(user_id=''): - q = Qry('users/extensions') - q.add_param(keys.USER_ID, user_id, '') - - return q - - -# required scope: user:edit:broadcast -@query -def update_extensions(): - q = Qry('users/extensions', method=methods.PUT) - - return q - - -# required scope: user_follows_edit -@query -def _follow_channel(channel_id, headers={}, notifications=False): - data = [{ - "operationName": "FollowButton_FollowUser", - "variables": { - "input": { - "disableNotifications": notifications, - "targetID": str(channel_id) - } - }, - "extensions": { - "persistedQuery": { - "version": 1, - "sha256Hash": "14319edb840c1dfce880dc64fa28a1f4eb69d821901e9e96eb9610d2e52b54f2" - } - } - }] - q = GQLQry('', headers=headers, data=data, use_token=False) - return q - - -# required scope: user_follows_edit -@query -def _unfollow_channel(channel_id, headers={}): - data = [{ - "operationName": "FollowButton_UnfollowUser", - "variables": { - "input": { - "targetID": str(channel_id) - } - }, - "extensions": { - "persistedQuery": { - "version": 1, - "sha256Hash": "29783a1dac24124e02f7295526241a9f1476cd2f5ce1e394f93ea50c253d8628" - } - } - }] - q = GQLQry('', headers=headers, data=data, use_token=False) - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/videos.py b/script.module.python.twitch/resources/lib/twitch/api/helix/videos.py deleted file mode 100644 index cf3c3be78..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/videos.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ... import keys -from ...api.parameters import Cursor, Language, BroadcastTypeHelix, VideoSortHelix, PeriodHelix, IntRange, ItemCount -from ...queries import HelixQuery as Qry -from ...queries import HiddenApiQuery as HQry -from ...queries import query - - -# required scope: none -@query -def get_videos(video_id=list(), game_id='', user_id='', - broadcast_type=BroadcastTypeHelix.ALL, language='', - after='MA==', before='MA==', first=20, - sort_order=VideoSortHelix.TIME, period=PeriodHelix.ALL, use_app_token=False): - q = Qry('videos', use_app_token=use_app_token) - if not video_id: - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.BEFORE, Cursor.validate(before), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - q.add_param(keys.GAME_ID, game_id, '') - q.add_param(keys.USER_ID, user_id, '') - q.add_param(keys.TYPE, BroadcastTypeHelix.validate(broadcast_type), BroadcastTypeHelix.ALL) - q.add_param(keys.SORT, VideoSortHelix.validate(sort_order), VideoSortHelix.TIME) - q.add_param(keys.PERIOD, PeriodHelix.validate(period), PeriodHelix.ALL) - if language: - q.add_param(keys.LANGUAGE, Language.validate(language), '') - else: - q.add_param(keys.ID, ItemCount().validate(video_id), list()) - - return q - - -# required scope: none -# undocumented / unsupported -@query -def _by_id(video_id, headers={}): - q = HQry('videos/{video_id}', headers=headers, use_token=False) - q.add_urlkw(keys.VIDEO_ID, video_id) - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/helix/webhooks.py b/script.module.python.twitch/resources/lib/twitch/api/helix/webhooks.py deleted file mode 100644 index bfe92498f..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/helix/webhooks.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/api/reference - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ..parameters import Cursor, IntRange -from ... import keys -from ...queries import HelixQuery as Qry -from ...queries import query - - -# required scope: none -# requires app access token -@query -def subscriptions(after='MA==', first=20): - q = Qry('webhooks/subscriptions', use_app_token=True) - q.add_param(keys.AFTER, Cursor.validate(after), 'MA==') - q.add_param(keys.FIRST, IntRange(1, 100).validate(first), 20) - - return q diff --git a/script.module.python.twitch/resources/lib/twitch/api/parameters.py b/script.module.python.twitch/resources/lib/twitch/api/parameters.py deleted file mode 100644 index d5be526e9..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/parameters.py +++ /dev/null @@ -1,240 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from base64 import b64decode - - -class _Parameter(object): - _valid = [] - - @classmethod - def valid(cls): - return cls._valid - - @classmethod - def validate(cls, value): - if value in cls._valid: - return value - raise ValueError(value) - - -class Period(_Parameter): - WEEK = 'week' - MONTH = 'month' - ALL = 'all' - _valid = [WEEK, MONTH, ALL] - - -class PeriodHelix(_Parameter): - DAY = 'day' - WEEK = 'week' - MONTH = 'month' - ALL = 'all' - _valid = [DAY, WEEK, MONTH, ALL] - - -class ClipPeriod(_Parameter): - DAY = 'day' - WEEK = 'week' - MONTH = 'month' - ALL = 'all' - _valid = [DAY, WEEK, MONTH, ALL] - - -class Boolean(_Parameter): - TRUE = 'true' - FALSE = 'false' - - _valid = [TRUE, FALSE] - - -class Direction(_Parameter): - DESC = 'desc' - ASC = 'asc' - - _valid = [DESC, ASC] - - -class SortBy(_Parameter): - CREATED_AT = 'created_at' - LAST_BROADCAST = 'last_broadcast' - LOGIN = 'login' - - _valid = [CREATED_AT, LAST_BROADCAST, LOGIN] - - -class VideoSort(_Parameter): - VIEWS = 'views' - TIME = 'time' - - _valid = [VIEWS, TIME] - - -class VideoSortHelix(_Parameter): - VIEWS = 'views' - TIME = 'time' - TRENDING = 'trending' - - _valid = [VIEWS, TIME, TRENDING] - - -class BroadcastType(_Parameter): - ARCHIVE = 'archive' - HIGHLIGHT = 'highlight' - UPLOAD = 'upload' - - _valid = [ARCHIVE, HIGHLIGHT, UPLOAD] - - @classmethod - def validate(cls, value): - split_values = value.split(',') - for val in split_values: - if val not in cls._valid: - raise ValueError(value) - return value - - -class BroadcastTypeHelix(_Parameter): - ARCHIVE = 'archive' - HIGHLIGHT = 'highlight' - UPLOAD = 'upload' - ALL = 'all' - - _valid = [ALL, ARCHIVE, HIGHLIGHT, UPLOAD] - - @classmethod - def validate(cls, value): - split_values = value.split(',') - for val in split_values: - if val not in cls._valid: - raise ValueError(value) - return value - - -class StreamType(_Parameter): - LIVE = 'live' - PLAYLIST = 'playlist' - ALL = 'all' - - _valid = [LIVE, PLAYLIST, ALL] - - -class StreamTypeHelix(_Parameter): - LIVE = 'live' - VODCAST = 'vodcast' - ALL = 'all' - - _valid = [LIVE, VODCAST, ALL] - - -class Platform(_Parameter): - XBOX_ONE = 'xbox_one' - PS4 = 'ps4' - ALL = 'all' - - _valid = [XBOX_ONE, PS4, ALL] - - -class Cursor(_Parameter): - @classmethod - def validate(cls, value): - try: - padding = (4 - len(value) % 4) % 4 - padding *= '=' - decoded = b64decode(value + padding) - return value - except ValueError: - raise ValueError(value) - - -class Language(_Parameter): - ALL = '' - EN = 'en' - DA = 'da' - DE = 'de' - ES = 'es' - FR = 'fr' - IT = 'it' - HU = 'hu' - NL = 'nl' - NO = 'no' - PL = 'pl' - OTHER = 'other' - ASL = 'asl' - KO = 'ko' - JA = 'ja' - ZH = 'zh' - TH = 'th' - AR = 'ar' - RU = 'ru' - BG = 'bg' - EL = 'el' - CS = 'cs' - TR = 'tr' - VI = 'vi' - SV = 'sv' - FI = 'fi' - SK = 'sk' - PT = 'pt' - - _valid = [ALL, EN, DA, DE, ES, FR, IT, HU, NL, - NO, PL, OTHER, ASL, KO, JA, ZH, TH, - AR, RU, BG, EL, CS, TR, VI, SV, FI, - SK, PT] - - @classmethod - def validate(cls, value): - if value not in cls._valid: - raise ValueError(value) - return value - - -class Duration(_Parameter): - _valid = [30, 60, 90, 120, 150, 180] - - -class ReportType(_Parameter): - OVERVIEW_V1 = 'overview_v1' - OVERVIEW_V2 = 'overview_v2' - - _valid = [OVERVIEW_V1, OVERVIEW_V2] - - -class EntitlementType(_Parameter): - BULK_DROPS_GRANT = 'bulk_drops_grant' - - _valid = [BULK_DROPS_GRANT] - - -class IntRange(_Parameter): - - @classmethod - def __init__(cls, first, last): - cls._valid = [i for i in range(first, last + 1)] - - -class ItemCount(object): - _max_items = 100 - - @classmethod - def __init__(cls, max_items=100): - cls._max_items = max_items - - @classmethod - def valid(cls): - raise NotImplementedError - - @classmethod - def validate(cls, value): - if len(value) <= cls._max_items: - return value - raise ValueError(value) diff --git a/script.module.python.twitch/resources/lib/twitch/api/usher.py b/script.module.python.twitch/resources/lib/twitch/api/usher.py deleted file mode 100644 index b03edff77..000000000 --- a/script.module.python.twitch/resources/lib/twitch/api/usher.py +++ /dev/null @@ -1,251 +0,0 @@ -# -*- encoding: utf-8 -*- -# By using this module you are violating the Twitch TOS -""" - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -import json -from urllib.parse import urlencode - -from .. import keys -from ..api.parameters import Boolean -from ..parser import m3u8, clip_embed -from ..queries import ClipsQuery, HiddenApiQuery, UsherQuery, GQLQuery -from ..queries import query -from ..log import log - -ACCESS_TOKEN_EXCEPTION = { - 'error': 'Error', - 'message': 'Failed to retrieve access token', - 'status': 404 -} - - -def get_access_token(token): - stream_access_token = None - video_access_token = None - if isinstance(token, list): - if token: - data = token[0].get(keys.DATA, {}) - stream_access_token = data.get(keys.STREAM_PLAYBACK_ACCESS_TOKEN) - video_access_token = data.get(keys.VIDEO_PLAYBACK_ACCESS_TOKEN) - return stream_access_token or video_access_token or token - - -def valid_video_id(video_id): - if video_id.startswith('videos'): - video_id = 'v' + video_id[6:] - if video_id.startswith(('a', 'c', 'v')): - return video_id[1:] - return video_id - - -@query -def channel_token(channel, platform=keys.WEB, headers={}): - data = [{ - "operationName": "PlaybackAccessToken_Template", - "query": "query PlaybackAccessToken_Template($login: String!, $isLive: Boolean!, $vodID: ID!, $isVod: Boolean!, $playerType: String!) { streamPlaybackAccessToken(channelName: $login, params: {platform: \"web\", playerBackend: \"mediaplayer\", playerType: $playerType}) @include(if: $isLive) { value signature __typename } videoPlaybackAccessToken(id: $vodID, params: {platform: \"web\", playerBackend: \"mediaplayer\", playerType: $playerType}) @include(if: $isVod) { value signature __typename }}", - "variables": { - "isLive": True, - "login": channel, - "isVod": False, - "vodID": "", - "playerType": "site" - } - }] - q = GQLQuery('', headers=headers, data=data, use_token=True) - return q - - -@query -def vod_token(video_id, platform=keys.WEB, headers={}): - data = [{ - "operationName": "PlaybackAccessToken_Template", - "query": "query PlaybackAccessToken_Template($login: String!, $isLive: Boolean!, $vodID: ID!, $isVod: Boolean!, $playerType: String!) { streamPlaybackAccessToken(channelName: $login, params: {platform: \"web\", playerBackend: \"mediaplayer\", playerType: $playerType}) @include(if: $isLive) { value signature __typename } videoPlaybackAccessToken(id: $vodID, params: {platform: \"web\", playerBackend: \"mediaplayer\", playerType: $playerType}) @include(if: $isVod) { value signature __typename }}", - "variables": { - "isLive": False, - "login": "", - "isVod": True, - "vodID": video_id, - "playerType": "site" - } - }] - q = GQLQuery('', headers=headers, data=data, use_token=True) - return q - - -@query -def _legacy_video(video_id): - q = HiddenApiQuery('videos/{id}') - q.add_urlkw(keys.ID, video_id) - return q - - -def live_request(channel, platform=keys.WEB, headers={}): - token = channel_token(channel, platform=platform, headers=headers) - token = get_access_token(token) - - if not token: - return ACCESS_TOKEN_EXCEPTION - elif isinstance(token, dict) and 'error' in token: - return token - else: - signature = token[keys.SIGNATURE] - access_token = token[keys.VALUE] - q = UsherQuery('api/channel/hls/{channel}.m3u8', headers=headers) - q.add_urlkw(keys.CHANNEL, channel) - q.add_param(keys.SIG, signature.encode('utf-8')) - q.add_param(keys.TOKEN, access_token.encode('utf-8')) - q.add_param(keys.ALLOW_SOURCE, Boolean.TRUE) - q.add_param(keys.ALLOW_SPECTRE, Boolean.TRUE) - q.add_param(keys.ALLOW_AUDIO_ONLY, Boolean.TRUE) - q.add_param(keys.FAST_BREAD, Boolean.TRUE) - q.add_param(keys.CDM, keys.WV) - q.add_param(keys.REASSIGNMENT_SUPPORTED, Boolean.TRUE) - q.add_param(keys.PLAYLIST_INCLUDE_FRAMERATE, Boolean.TRUE) - q.add_param(keys.RTQOS, keys.CONTROL) - q.add_param(keys.PLAYER_BACKEND, keys.MEDIAPLAYER) - url = '?'.join([q.url, urlencode(q.params)]) - request_dict = { - 'url': url, - 'headers': q.headers - } - log.debug('live_request: |{0}|'.format(str(request_dict))) - return request_dict - - -@query -def _live(channel, token, headers={}): - signature = token[keys.SIGNATURE] - access_token = token[keys.VALUE] - - q = UsherQuery('api/channel/hls/{channel}.m3u8', headers=headers) - q.add_urlkw(keys.CHANNEL, channel) - q.add_param(keys.SIG, signature.encode('utf-8')) - q.add_param(keys.TOKEN, access_token.encode('utf-8')) - q.add_param(keys.ALLOW_SOURCE, Boolean.TRUE) - q.add_param(keys.ALLOW_SPECTRE, Boolean.TRUE) - q.add_param(keys.ALLOW_AUDIO_ONLY, Boolean.TRUE) - q.add_param(keys.FAST_BREAD, Boolean.TRUE) - q.add_param(keys.CDM, keys.WV) - q.add_param(keys.REASSIGNMENT_SUPPORTED, Boolean.TRUE) - q.add_param(keys.PLAYLIST_INCLUDE_FRAMERATE, Boolean.TRUE) - q.add_param(keys.RTQOS, keys.CONTROL) - q.add_param(keys.PLAYER_BACKEND, keys.MEDIAPLAYER) - return q - - -@m3u8 -def live(channel, platform=keys.WEB, headers={}): - token = channel_token(channel, platform=platform, headers=headers) - token = get_access_token(token) - if not token: - return ACCESS_TOKEN_EXCEPTION - elif isinstance(token, dict) and 'error' in token: - return token - else: - return _live(channel, token, headers=headers) - - -def video_request(video_id, platform=keys.WEB, headers={}): - video_id = valid_video_id(video_id) - if video_id: - token = vod_token(video_id, platform=platform, headers=headers) - token = get_access_token(token) - - if not token: - return ACCESS_TOKEN_EXCEPTION - elif isinstance(token, dict) and 'error' in token: - return token - else: - signature = token[keys.SIGNATURE] - access_token = token[keys.VALUE] - q = UsherQuery('vod/{id}', headers=headers) - q.add_urlkw(keys.ID, video_id) - q.add_param(keys.NAUTHSIG, signature.encode('utf-8')) - q.add_param(keys.NAUTH, access_token.encode('utf-8')) - q.add_param(keys.ALLOW_SOURCE, Boolean.TRUE) - q.add_param(keys.ALLOW_AUDIO_ONLY, Boolean.TRUE) - q.add_param(keys.CDM, keys.WV) - q.add_param(keys.REASSIGNMENT_SUPPORTED, Boolean.TRUE) - q.add_param(keys.PLAYLIST_INCLUDE_FRAMERATE, Boolean.TRUE) - q.add_param(keys.RTQOS, keys.CONTROL) - q.add_param(keys.PLAYER_BACKEND, keys.MEDIAPLAYER) - q.add_param(keys.BAKING_BREAD, Boolean.TRUE) - q.add_param(keys.BAKING_BROWNIES, Boolean.TRUE) - q.add_param(keys.BAKING_BROWNIES_TIMEOUT, 1050) - url = '?'.join([q.url, urlencode(q.params)]) - request_dict = { - 'url': url, - 'headers': q.headers - } - log.debug('video_request: |{0}|'.format(str(request_dict))) - return request_dict - else: - raise NotImplementedError('Unknown Video Type') - - -@query -def _vod(video_id, token, headers={}): - signature = token[keys.SIGNATURE] - access_token = token[keys.VALUE] - - q = UsherQuery('vod/{id}', headers=headers) - q.add_urlkw(keys.ID, video_id) - q.add_param(keys.NAUTHSIG, signature.encode('utf-8')) - q.add_param(keys.NAUTH, access_token.encode('utf-8')) - q.add_param(keys.ALLOW_SOURCE, Boolean.TRUE) - q.add_param(keys.ALLOW_AUDIO_ONLY, Boolean.TRUE) - q.add_param(keys.CDM, keys.WV) - q.add_param(keys.REASSIGNMENT_SUPPORTED, Boolean.TRUE) - q.add_param(keys.PLAYLIST_INCLUDE_FRAMERATE, Boolean.TRUE) - q.add_param(keys.RTQOS, keys.CONTROL) - q.add_param(keys.PLAYER_BACKEND, keys.MEDIAPLAYER) - q.add_param(keys.BAKING_BREAD, Boolean.TRUE) - q.add_param(keys.BAKING_BROWNIES, Boolean.TRUE) - q.add_param(keys.BAKING_BROWNIES_TIMEOUT, 1050) - return q - - -@m3u8 -def video(video_id, platform=keys.WEB, headers={}): - video_id = valid_video_id(video_id) - if video_id: - token = vod_token(video_id, platform=platform, headers=headers) - token = get_access_token(token) - - if not token: - return ACCESS_TOKEN_EXCEPTION - elif isinstance(token, dict) and 'error' in token: - return token - else: - return _vod(video_id, token, headers=headers) - else: - raise NotImplementedError('Unknown Video Type') - - -@clip_embed -@query -def clip(slug, headers={}): - qry = { - "operationName": "VideoAccessToken_Clip", - "extensions": { - "persistedQuery": { - "version": 1, - "sha256Hash": "36b89d2507fce29e5ca551df756d27c1cfe079e2609642b4390aa4c35796eb11" - } - }, - "variables": { - "slug": slug - } - } - - q = ClipsQuery(headers=headers, data=json.dumps(qry)) - return q diff --git a/script.module.python.twitch/resources/lib/twitch/exceptions.py b/script.module.python.twitch/resources/lib/twitch/exceptions.py deleted file mode 100644 index a764f1a0b..000000000 --- a/script.module.python.twitch/resources/lib/twitch/exceptions.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - - -class ResourceUnavailableException(Exception): - pass diff --git a/script.module.python.twitch/resources/lib/twitch/keys.py b/script.module.python.twitch/resources/lib/twitch/keys.py deleted file mode 100644 index c33d0e3a1..000000000 --- a/script.module.python.twitch/resources/lib/twitch/keys.py +++ /dev/null @@ -1,132 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - string constants - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2019 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -AFTER = 'after' -ALLOW_AUDIO_ONLY = 'allow_audio_only' -ALLOW_SOURCE = 'allow_source' -ALLOW_SPECTRE = 'allow_spectre' -AVATAR_IMAGE = 'avatar_image' -BAKING_BREAD = 'baking_bread' -BAKING_BROWNIES = 'baking_brownies' -BAKING_BROWNIES_TIMEOUT = 'baking_brownies_timeout' -BEFORE = 'before' -BROADCAST_TYPE = 'broadcast_type' -BROADCASTER_ID = 'broadcaster_id' -BROADCASTER_LANGUAGE = 'broadcaster_language' -BROADCASTS = 'broadcasts' -CDM = 'cdm' -CHANNEL = 'channel' -CHANNEL_FEED_ENABLED = 'channel_feed_enabled' -CHANNEL_ID = 'channel_id' -CLIP = 'clip' -CODE = 'code' -COLLECTION_ID = 'collection_id' -COMMENT_ID = 'comment_id' -COMMENTS = 'comments' -COMMUNITIES = 'communities' -COMMUNITY_ID = 'community_id' -COMMUNITY_IDS = 'community_ids' -CONTAINING_ITEM = 'containing_item' -CONTENT = 'content' -CONTROL = 'control' -COUNT = 'count' -COVER_IMAGE = 'cover_image' -CURSOR = 'cursor' -CLIENT_ID = 'client_id' -DATA = 'data' -DELAY = 'delay' -DESCRIPTION = 'description' -DIRECTION = 'direction' -DURATION = 'duration' -EMAIL = 'email' -EMOTE_ID = 'emote_id' -EMOTESETS = 'emotesets' -ENDED_AT = 'ended_at' -ERROR = 'error' -EXTENSION_ID = 'extension_id' -FAST_BREAD = 'fast_bread' -FEATURED = 'featured' -FIRST = 'first' -FOLLOWS = 'follows' -FROM_ID = 'from_id' -GAME = 'game' -GAME_ID = 'game_id' -HAS_DELAY = 'has_delay' -HLS = 'hls' -ID = 'id' -IDENTIFIER = 'identifier' -INCLUDE_ALL_ITEMS = 'include_all_items' -ITEM_ID = 'item_id' -LANGUAGE = 'language' -LIMIT = 'limit' -LIVE = 'live' -LIVE_ONLY = 'live_only' -LOGIN = 'login' -MANIFEST_ID = 'manifest_id' -MEDIAPLAYER = 'mediaplayer' -MESSAGE = 'message' -NAME = 'name' -NAUTH = 'nauth' -NAUTHSIG = 'nauthsig' -NEED_HTTPS = 'need_https' -NOTIFICATIONS = 'notifications' -OFFSET = 'offset' -PART = 'part' -PERIOD = 'period' -PLATFORM = 'platform' -PLAYER_BACKEND = 'player_backend' -PLAYLIST_INCLUDE_FRAMERATE = 'playlist_include_framerate' -POSITION = 'position' -POST_ID = 'post_id' -QUERY = 'query' -REASON = 'reason' -REASSIGNMENT_SUPPORTED = 'reassignment_supported' -RTQOS = 'rtqos' -RULES = 'rules' -SCE_PLATFORM = 'sce_platform' -SHARE = 'share' -SIG = 'sig' -SIGNATURE = 'signature' -SLUG = 'slug' -SORT = 'sort' -SORT_BY = 'sortby' -STARTED_AT = 'started_at' -STATUS = 'status' -STREAM_PLAYBACK_ACCESS_TOKEN = 'streamPlaybackAccessToken' -STREAM_TYPE = 'stream_type' -SUMMARY = 'summary' -TAG_ID = 'tag_id' -TAG_IDS = 'tag_ids' -TAG_LIST = 'tag_list' -TARGET_ID = 'target_id' -TEAM = 'team' -TITLE = 'title' -TO_ID = 'to_id' -TOKEN = 'token' -TRENDING = 'trending' -TYPE = 'type' -USER = 'user' -USERNAME = 'username' -USER_AGENT = 'User-Agent' -USER_AGENT_STRING = ('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) ' - 'Gecko/20100101 Firefox/6.0') -USER_ID = 'user_id' -USER_LOGIN = 'user_login' -UPLOAD_TOKEN = 'upload_token' -VALUE = 'value' -VIDEO_ID = 'video_id' -VIDEO_PLAYBACK_ACCESS_TOKEN = 'videoPlaybackAccessToken' -VOD = 'vod' -WEB = 'web' -WV = 'wv' -XBOX_HEARTBEAT = 'xbox_heartbeat' diff --git a/script.module.python.twitch/resources/lib/twitch/log.py b/script.module.python.twitch/resources/lib/twitch/log.py deleted file mode 100644 index cc50925c1..000000000 --- a/script.module.python.twitch/resources/lib/twitch/log.py +++ /dev/null @@ -1,110 +0,0 @@ -# -*- coding: utf-8 -*- -""" - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -import re -import logging -import copy - -try: - from logging import NullHandler -except ImportError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - -try: - import xbmc -except ImportError: - xbmc = None - - -def _mask(message): - mask = '*' * 11 - masked_message = re.sub(r'((?:OAuth|Bearer)\s)[^\'"]+', r'\1' + mask, message) - masked_message = re.sub(r'(["\']email["\']:\s*[\'"])[^\'"]+', r'\1' + mask, masked_message) - masked_message = re.sub(r'(USER-IP=[\'"])[^\'"]+', r'\1' + mask, masked_message) - masked_message = re.sub(r'(["\']client_secret["\']:\s*[\'"])[^\'"]+', r'\1' + mask, masked_message) - masked_message = re.sub(r'(client_secret=).+?(&|$|\|)', r'\1' + mask + r'\2', masked_message) - masked_message = re.sub(r'(\\*["\']user_ip\\*["\']:\\*["\']).+?(\\*["\'])', r'\1' + mask + r'\2', masked_message) - masked_message = re.sub(r'(["\'](?:nauth)*sig["\']: ["\'])[^\'"]+', r'\1' + mask, masked_message) - return masked_message - - -def _add_leader(message): - if xbmc: - message = 'script.module.python.twitch: %s' % message - return message - - -def prep_log_message(message): - message = copy.deepcopy(message) - message = _mask(message) - message = _add_leader(message) - return message - - -class Log: - def __init__(self): - if xbmc: - self._log = xbmc.log - else: - self._log = logging.getLogger('twitch') - self._log.addHandler(NullHandler()) - - def info(self, message): - message = prep_log_message(message) - if xbmc: - self._log(message, xbmc.LOGINFO) - else: - self._log.info(message) - - def debug(self, message): - message = prep_log_message(message) - if xbmc: - self._log(message, xbmc.LOGDEBUG) - else: - self._log.debug(message) - - def warning(self, message): - message = prep_log_message(message) - if xbmc: - self._log(message, xbmc.LOGWARNING) - else: - self._log.debug(message) - - def error(self, message): - message = prep_log_message(message) - if xbmc: - self._log(message, xbmc.LOGERROR) - else: - self._log.error(message) - - def critical(self, message): - message = prep_log_message(message) - if xbmc: - self._log(message, xbmc.LOGFATAL) - else: - self._log.critical(message) - - def deprecated_query(self, old, new=None): - if new: - self.warning('DEPRECATED call to |{0}| detected, please use |{1}| instead'.format(old, new)) - else: - self.warning('DEPRECATED call to |{0}| detected, no alternatives available'.format(old)) - - def deprecated_endpoint(self, old): - self.warning('DEPRECATED call to |{0}| endpoint detected'.format(old)) - - def deprecated_api_version(self, old, new, eol_date): - self.warning('API version |{0}| is deprecated, update to |{1}| by |{2}|'.format(old, new, eol_date)) - - -log = Log() diff --git a/script.module.python.twitch/resources/lib/twitch/methods.py b/script.module.python.twitch/resources/lib/twitch/methods.py deleted file mode 100644 index 574ff007d..000000000 --- a/script.module.python.twitch/resources/lib/twitch/methods.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -GET = 'GET' -POST = 'POST' -PUT = 'PUT' -DELETE = 'DELETE' - -valid = [GET, POST, PUT, DELETE] - - -def validate(value): - if value in valid: - return value - raise ValueError(value) diff --git a/script.module.python.twitch/resources/lib/twitch/oauth/__init__.py b/script.module.python.twitch/resources/lib/twitch/oauth/__init__.py deleted file mode 100644 index c19f3763a..000000000 --- a/script.module.python.twitch/resources/lib/twitch/oauth/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -__all__ = ['default', 'helix', 'clients', 'validation'] - -from . import helix -from . import helix as default -from . import clients -from . import validation diff --git a/script.module.python.twitch/resources/lib/twitch/oauth/clients.py b/script.module.python.twitch/resources/lib/twitch/oauth/clients.py deleted file mode 100644 index 0b73f1344..000000000 --- a/script.module.python.twitch/resources/lib/twitch/oauth/clients.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from urllib.parse import urlsplit -from urllib.parse import urlencode - -from .. import CLIENT_ID, CLIENT_SECRET, methods -from ..queries import OAuthQuery as Qry -from ..queries import query - -class MobileClient: - def __init__(self, client_id='', client_secret=''): - self.client_id = client_id if client_id else CLIENT_ID - self.client_secret = client_secret if client_secret else CLIENT_SECRET - - def prepare_request_uri(self, redirect_uri='http://localhost:3000/', scope=list(), force_verify=False, state=''): - q = Qry('authorize') - q.add_param('response_type', 'token') - q.add_param('client_id', self.client_id) - q.add_param('redirect_uri', redirect_uri) - q.add_param('scope', ' '.join(scope)) - q.add_param('force_verify', str(force_verify).lower()) - q.add_param('state', state) - return '?'.join([q.url, urlencode(q.params)]) - - def prepare_token_uri(self, scope=list()): - q = Qry('token') - q.add_param('client_id', self.client_id) - q.add_param('client_secret', self.client_secret) - q.add_param('grant_type', 'client_credentials') - q.add_param('scope', ' '.join(scope)) - return '?'.join([q.url, urlencode(q.params)]) - - def prepare_revoke_uri(self, token): - q = Qry('revoke') - q.add_param('client_id', self.client_id) - q.add_param('token', token) - return '?'.join([q.url, urlencode(q.params)]) - - @query - def revoke_token(self, token): - q = Qry('revoke', method=methods.POST) - q.add_param('client_id', self.client_id) - q.add_param('token', token) - return q - - @query - def get_app_access_token(self, scope=list()): - q = Qry('token', method=methods.POST) - q.add_param('client_id', self.client_id) - q.add_param('client_secret', self.client_secret) - q.add_param('grant_type', 'client_credentials') - q.add_param('scope', ' '.join(scope)) - return q - - @staticmethod - def parse_implicit_response(url): - pairs = urlsplit(url).fragment.split('&') - fragment = dict() - for pair in pairs: - key, value = pair.split('=') - fragment[key] = value - return {'access_token': fragment.get('access_token'), 'scope': fragment.get('scope', '').split('+'), 'state': fragment.get('state')} diff --git a/script.module.python.twitch/resources/lib/twitch/oauth/helix/__init__.py b/script.module.python.twitch/resources/lib/twitch/oauth/helix/__init__.py deleted file mode 100644 index 652caae9a..000000000 --- a/script.module.python.twitch/resources/lib/twitch/oauth/helix/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -__all__ = ['scopes'] - -from . import scopes diff --git a/script.module.python.twitch/resources/lib/twitch/oauth/helix/scopes.py b/script.module.python.twitch/resources/lib/twitch/oauth/helix/scopes.py deleted file mode 100644 index d388d316e..000000000 --- a/script.module.python.twitch/resources/lib/twitch/oauth/helix/scopes.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - Reference: https://dev.twitch.tv/docs/authentication#scopes - - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -analytics_read_extensions = 'analytics:read:extensions' # View analytics data for the Twitch Extensions owned by the authenticated account. -analytics_read_games = 'analytics:read:games' # View analytics data for the games owned by the authenticated account. -bits_read = 'bits:read' # View Bits information for a channel. -channel_edit_commercial = 'channel:edit:commercial' # Run commercials on a channel. -channel_manage_broadcast = 'channel:manage:broadcast' # Manage a channel’s broadcast configuration, including updating channel configuration and managing stream markers and stream tags. -channel_manage_extensions = 'channel:manage:extensions' # Manage a channel’s Extension configuration, including activating Extensions. -channel_manage_polls = 'channel:manage:polls' # Manage a channel’s polls. -channel_manage_predictions = 'channel:manage:predictions' # Manage of channel’s Channel Points Predictions -channel_manage_redemptions = 'channel:manage:redemptions' # Manage Channel Points custom rewards and their redemptions on a channel. -channel_manage_schedule = 'channel:manage:schedule' # Manage a channel’s stream schedule. -channel_manage_videos = 'channel:manage:videos' # Manage a channel’s videos, including deleting videos. -channel_read_editors = 'channel:read:editors' # View a list of users with the editor role for a channel. -channel_read_goals = 'channel:read:goals' # View Creator Goals for a channel. -channel_read_hype_train = 'channel:read:hype_train' # View Hype Train information for a channel. -channel_read_polls = 'channel:read:polls' # View a channel’s polls. -channel_read_predictions = 'channel:read:predictions' # View a channel’s Channel Points Predictions. -channel_read_redemptions = 'channel:read:redemptions' # View Channel Points custom rewards and their redemptions on a channel. -channel_read_stream_key = 'channel:read:stream_key' # View an authorized user’s stream key. -channel_read_subscriptions = 'channel:read:subscriptions' # View a list of all subscribers to a channel and check if a user is subscribed to a channel. -clips_edit = 'clips:edit' # Manage Clips for a channel. -moderation_read = 'moderation:read' # View a channel’s moderation data including Moderators, Bans, Timeouts, and Automod settings. -moderator_manage_banned_users = 'moderator:manage:banned_users' # Ban and unban users. -moderator_read_blocked_terms = 'moderator:read:blocked_terms' # View a broadcaster’s list of blocked terms. -moderator_manage_blocked_terms = 'moderator:manage:blocked_terms' # Manage a broadcaster’s list of blocked terms. -moderator_manage_automod = 'moderator:manage:automod' # Manage messages held for review by AutoMod in channels where you are a moderator. -moderator_read_automod_settings = 'moderator:read:automod_settings' # View a broadcaster’s AutoMod settings. -moderator_manage_automod_settings = 'moderator:manage:automod_settings' # Manage a broadcaster’s AutoMod settings. -moderator_read_chat_settings = 'moderator:read:chat_settings' # View a broadcaster’s chat room settings. -moderator_manage_chat_settings = 'moderator:manage:chat_settings' # Manage a broadcaster’s chat room settings. -user_edit = 'user:edit' # Manage a user object. -user_edit_follows = 'user:edit:follows' # Deprecated. Was previously used for “Create User Follows” and “Delete User Follows.” See Deprecation of Create and Delete Follows API Endpoints. -user_manage_blocked_users = 'user:manage:blocked_users' # Manage the block list of a user. -user_read_blocked_users = 'user:read:blocked_users' # View the block list of a user. -user_read_broadcast = 'user:read:broadcast' # View a user’s broadcasting configuration, including Extension configurations. -user_read_email = 'user:read:email' # View a user’s email address. -user_read_follows = 'user:read:follows' # View the list of channels a user follows. -user_read_subscriptions = 'user:read:subscriptions' # View if an authorized user is subscribed to specific channels. -channel_moderate = 'channel:moderate' # Perform moderation actions in a channel. The user requesting the scope must be a moderator in the channel. -chat_edit = 'chat:edit' # Send live stream chat and rooms messages. -chat_read = 'chat:read' # View live stream chat and rooms messages. -whispers_read = 'whispers:read' # View your whisper messages. -whispers_edit = 'whispers:edit' # Send whisper messages. diff --git a/script.module.python.twitch/resources/lib/twitch/oauth/validation.py b/script.module.python.twitch/resources/lib/twitch/oauth/validation.py deleted file mode 100644 index 45b8be3a2..000000000 --- a/script.module.python.twitch/resources/lib/twitch/oauth/validation.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2022 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from ..queries import OAuthValidationQuery as Qry -from ..queries import query - - -@query -def validate(token=None): - q = Qry(token) - return q diff --git a/script.module.python.twitch/resources/lib/twitch/parser.py b/script.module.python.twitch/resources/lib/twitch/parser.py deleted file mode 100644 index b41345c82..000000000 --- a/script.module.python.twitch/resources/lib/twitch/parser.py +++ /dev/null @@ -1,174 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -import re -from urllib.parse import urlencode - -from . import keys -from .log import log - -_m3u_pattern = re.compile( - r'#EXT-X-MEDIA:TYPE=VIDEO.*' - r'GROUP-ID="(?P[^"]*)",' - r'NAME="(?P[^"]*)"[,=\w]*\n' - r'#EXT-X-STREAM-INF:.*' - r'BANDWIDTH=(?P[0-9]+),' - r'(?:.*RESOLUTION="*(?P[0-9xX]+)"*,)?' - r'(?:.*FRAME-RATE=(?P[0-9.]+))?.*\n' - r'(?Phttp.*)') - -_error_pattern = re.compile(r'.*error(?P.+?).*', re.IGNORECASE) - - -def _find_frame_rate(group_id, group_name): - group_id = group_id.lower() - - if group_id == 'audio_only': - return None - elif group_id == 'chunked': - group_id = group_name.lower().replace('(source)', '').strip() - - info = group_id.split('p') - if len(info) > 1 and info[1]: - fps = float(info[1]) - else: - fps = 30.0 - - return fps - - -def m3u8(f): - def m3u8_wrapper(*args, **kwargs): - results = f(*args, **kwargs) - try: - results = results.decode('utf-8') - except AttributeError: - pass - if keys.ERROR in results: - if isinstance(results, dict): - return results - else: - error = re.search(_error_pattern, results) - if error: - return { - 'error': 'Error', - 'message': error.group('message'), - 'status': 404 - } - return m3u8_to_list(results) - - return m3u8_wrapper - - -def clip_embed(f): - def clip_embed_wrapper(*args, **kwargs): - return clip_embed_to_list(f(*args, **kwargs)) - - return clip_embed_wrapper - - -def m3u8_to_dict(string): - log.debug('m3u8_to_dict called for:\n{0}'.format(string)) - d = dict() - matches = re.finditer(_m3u_pattern, string) - for m in matches: - if m.group('group_name') == 'audio_only': - name = 'Audio Only' - elif m.group('group_id') == 'chunked': - name = 'Source' - else: - name = m.group('group_name') - - if m.group('fps'): - fps = float(m.group('fps')) - else: - fps = _find_frame_rate(m.group('group_id'), m.group('group_name')) - - d[m.group('group_id')] = { - 'id': m.group('group_id'), - 'name': name, - 'url': m.group('url'), - 'bandwidth': int(m.group('bandwidth')), - 'fps': fps, - 'resolution': m.group('resolution') - } - log.debug('m3u8_to_dict result:\n{0}'.format(d)) - return d - - -def m3u8_to_list(string): - log.debug('m3u8_to_list called for:\n{0}'.format(string)) - l = list() - matches = re.finditer(_m3u_pattern, string) - for m in matches: - if m.group('group_name') == 'audio_only': - name = 'Audio Only' - elif m.group('group_id') == 'chunked': - name = 'Source' - else: - name = m.group('group_name') - - if m.group('fps'): - fps = float(m.group('fps')) - else: - fps = _find_frame_rate(m.group('group_id'), m.group('group_name')) - - l.append({ - 'id': m.group('group_id'), - 'name': name, - 'url': m.group('url'), - 'bandwidth': int(m.group('bandwidth')), - 'fps': fps, - 'resolution': m.group('resolution') - }) - - log.debug('m3u8_to_list result:\n{0}'.format(l)) - return l - - -def clip_embed_to_list(response): - log.debug('clip_embed_to_list called for:\n{0}'.format(response)) - - clip_json = response.get('data', {}).get('clip', {}) - access_token = clip_json.get('playbackAccessToken', {}) - token = access_token.get('value', '') - signature = access_token.get('signature', '') - qualities = clip_json.get('videoQualities', []) - - params = urlencode({ - 'sig': signature, - 'token': token - }) - - l = list() - - if isinstance(response, dict): - clip = response.get('data', {}).get('clip', {}) - qualities = clip.get('videoQualities', list()) - - if qualities: - l = [{ - 'id': item['quality'], - 'name': item['quality'], - 'url': item['sourceURL'] + '?' + params, - 'bandwidth': -1 - } for item in qualities] - if l: - l.insert(0, { - 'id': 'Source', - 'name': 'Source', - 'url': l[0]['url'], - 'bandwidth': -1 - }) - - log.debug('clip_embed_to_list result:\n{0}'.format(l)) - return l diff --git a/script.module.python.twitch/resources/lib/twitch/queries.py b/script.module.python.twitch/resources/lib/twitch/queries.py deleted file mode 100644 index 63c299e4d..000000000 --- a/script.module.python.twitch/resources/lib/twitch/queries.py +++ /dev/null @@ -1,262 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -from copy import deepcopy -from urllib.parse import urljoin - -from . import CLIENT_ID, OAUTH_TOKEN, APP_TOKEN -from .exceptions import ResourceUnavailableException -from .log import log, prep_log_message -from .scraper import download, get_json, get_json_and_headers -from . import methods - -_kraken_baseurl = 'https://api.twitch.tv/kraken/' -_helix_baseurl = 'https://api.twitch.tv/helix/' -_hidden_baseurl = 'https://api.twitch.tv/api/' -_usher_baseurl = 'https://usher.ttvnw.net/' -_clips_baseurl = 'https://gql.twitch.tv/gql' -_uploads_baseurl = 'https://uploads.twitch.tv/' -_gql_baseurl = 'https://gql.twitch.tv/gql' -_oauth_baseurl = 'https://api.twitch.tv/kraken/oauth2/' -_oauthid_baseurl = 'https://id.twitch.tv/oauth2/' - - -class _Query(object): - def __init__(self, url, headers={}, data={}, method=methods.GET): - self._headers = headers - self._data = data - self._url = url - self._method = method - - self._params = dict() - self._urlkws = dict() - - @property - def url(self): - formatted_url = self._url.format(**self._urlkws) # throws KeyError - return formatted_url - - @property - def headers(self): - return self._headers - - @property - def data(self): - return self._data - - @property - def params(self): - return self._params - - @property - def method(self): - return self._method - - @property - def urlkws(self): - return self._urlkws - - def add_path(self, path): - self._url = urljoin(self._url, path) - return self - - def add_data(self, key, value, default=None): - assert_new(self._data, key) - if value != default: - self._data[key] = value - return self - - def add_bin(self, data): - self._data = data - return self - - def add_param(self, key, value, default=None): - assert_new(self._params, key) - if value != default: - self._params[key] = value - return self - - def add_urlkw(self, kw, replacement): - assert_new(self._urlkws, kw) - self._urlkws[kw] = replacement - return self - - def set_headers(self, headers): - self._headers = headers - return self - - def __str__(self): - return '{method} Query to {url}, params {params}, data {data}, headers {headers}' \ - .format(url=self.url, params=self.params, headers=self.headers, data=self.data, method=self.method) - - def execute(self, f): - try: - return f(self.url, self.params, self.headers, self.data, self.method) - except: - raise ResourceUnavailableException(prep_log_message(str(self))) - - -class DownloadQuery(_Query): - def execute(self): - # TODO implement download completely here - return super(DownloadQuery, self).execute(download) - - -class JsonQuery(_Query): - def execute(self): - # TODO implement get_json completely here - return super(JsonQuery, self).execute(get_json) - - -class HelixJsonQuery(_Query): - def execute(self): - # TODO implement get_json completely here - return super(HelixJsonQuery, self).execute(get_json_and_headers) - - -class ApiQuery(JsonQuery): - def __init__(self, path, headers={}, data={}, use_token=True, method=methods.GET): - _headers = deepcopy(headers) - _headers.setdefault('Client-ID', CLIENT_ID) - if use_token and OAUTH_TOKEN: - _headers.setdefault('Authorization', 'OAuth {access_token}'.format(access_token=OAUTH_TOKEN)) - super(ApiQuery, self).__init__(_kraken_baseurl, _headers, data, method) - self.add_path(path) - - -class HelixApiQuery(HelixJsonQuery): - def __init__(self, path, headers={}, data={}, use_app_token=False, method=methods.GET): - _headers = deepcopy(headers) - _headers.setdefault('Client-ID', CLIENT_ID) - if use_app_token and APP_TOKEN: - _headers.setdefault('Authorization', 'Bearer {access_token}'.format(access_token=APP_TOKEN)) - elif OAUTH_TOKEN: - _headers.setdefault('Authorization', 'Bearer {access_token}'.format(access_token=OAUTH_TOKEN)) - super(HelixApiQuery, self).__init__(_helix_baseurl, _headers, data, method) - self._params = list() - self.add_path(path) - - def add_param(self, key, value, default=None): - if value != default: - if isinstance(value, list): - _params = [] - for val in value: - _params += [(key, val)] - self._params += _params - elif (key, value) not in self._params: - self._params += [(key, value)] - return self - - -class HiddenApiQuery(JsonQuery): - def __init__(self, path, headers={}, data={}, use_token=True, method=methods.GET): - _headers = deepcopy(headers) - if 'Client-ID' not in _headers: - _headers.setdefault('Client-ID', CLIENT_ID) - if 'Client-ID' in _headers and not _headers.get('Client-ID'): - del _headers['Client-ID'] - if 'Authorization' not in _headers: - if use_token and OAUTH_TOKEN: - _headers.setdefault('Authorization', 'OAuth {access_token}'.format(access_token=OAUTH_TOKEN)) - if 'Authorization' in _headers and not _headers.get('Authorization'): - del _headers['Authorization'] - super(HiddenApiQuery, self).__init__(_hidden_baseurl, _headers, data, method) - self.add_path(path) - - -class UsherQuery(DownloadQuery): - def __init__(self, path, headers={}, data={}, method=methods.GET): - _headers = deepcopy(headers) - if 'Client-ID' not in _headers: - _headers.setdefault('Client-ID', CLIENT_ID) - if 'Client-ID' in _headers and not _headers.get('Client-ID'): - del _headers['Client-ID'] - if 'Authorization' not in _headers: - if OAUTH_TOKEN: - _headers.setdefault('Authorization', 'OAuth {access_token}'.format(access_token=OAUTH_TOKEN)) - if 'Authorization' in _headers and not _headers.get('Authorization'): - del _headers['Authorization'] - super(UsherQuery, self).__init__(_usher_baseurl, _headers, data, method) - self.add_path(path) - - -class OAuthQuery(JsonQuery): - def __init__(self, path, headers={}, data={}, method=methods.GET): - _headers = deepcopy(headers) - super(JsonQuery, self).__init__(_oauthid_baseurl, _headers, data, method) - self.add_path(path) - - -class OAuthValidationQuery(JsonQuery): - def __init__(self, token=None): - _headers = {} - if token: - _headers['Authorization'] = 'OAuth {access_token}'.format(access_token=token) - if 'Authorization' not in _headers: - _headers.setdefault('Authorization', 'OAuth {access_token}'.format(access_token=OAUTH_TOKEN)) - super(JsonQuery, self).__init__(_oauthid_baseurl, _headers, {}, methods.GET) - self.add_path('validate') - - -class ClipsQuery(JsonQuery): - def __init__(self, path='', headers={}, data={}, method=methods.POST): - _headers = deepcopy(headers) - super(ClipsQuery, self).__init__(_clips_baseurl, _headers, data, method) - if path: - self.add_path(path) - - -class UploadsQuery(DownloadQuery): - def __init__(self, path, headers={}, data={}, method=methods.PUT): - _headers = deepcopy(headers) - super(UploadsQuery, self).__init__(_uploads_baseurl, _headers, data, method) - self.add_path(path) - - -class V5Query(ApiQuery): - def __init__(self, path, use_token=True, method=methods.GET): - headers = {'ACCEPT': 'application/vnd.twitchtv.v5+json'} - super(V5Query, self).__init__(path, headers, use_token=use_token, method=method) - - -class HelixQuery(HelixApiQuery): - def __init__(self, path, use_app_token=False, method=methods.GET): - super(HelixQuery, self).__init__(path, use_app_token=use_app_token, method=method) - - -class GQLQuery(JsonQuery): - def __init__(self, path, headers={}, data={}, use_token=True, method=methods.POST): - _headers = deepcopy(headers) - _headers.setdefault('Client-ID', CLIENT_ID) - if use_token and OAUTH_TOKEN: - _headers.setdefault('Authorization', 'OAuth {access_token}'.format(access_token=OAUTH_TOKEN)) - super(GQLQuery, self).__init__(_gql_baseurl, _headers, data, method) - self.add_path(path) - - -def assert_new(d, k): - if k in d: - v = d.get(k) - raise ValueError('Key |{0}| already set to |{1}|'.format(k, v)) - - -# TODO maybe rename -def query(f): - def wrapper(*args, **kwargs): - qry = f(*args, **kwargs) - if not isinstance(qry, _Query): - raise ValueError('|{0}| did not return a Query, was: |{1}|'.format(f.__name__, repr(qry))) - log.debug('{0} QUERY: url: |{1}|, params: |{2}|, data: |{3}|, headers: |{4}|, target_func: |{5}|' - .format(qry.method, qry.url, qry.params, qry.data, qry.headers, f.__name__)) - return qry.execute() - - return wrapper diff --git a/script.module.python.twitch/resources/lib/twitch/scraper.py b/script.module.python.twitch/resources/lib/twitch/scraper.py deleted file mode 100644 index 433d95db0..000000000 --- a/script.module.python.twitch/resources/lib/twitch/scraper.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- encoding: utf-8 -*- -""" - - Copyright (C) 2012-2016 python-twitch (https://github.com/ingwinlu/python-twitch) - Copyright (C) 2016-2018 script.module.python.twitch - - This file is part of script.module.python.twitch - - SPDX-License-Identifier: GPL-3.0-only - See LICENSES/GPL-3.0-only for more information. -""" - -import sys -from urllib.error import URLError -from urllib.parse import quote_plus -from urllib.parse import urlencode - -import requests - -from .keys import USER_AGENT, USER_AGENT_STRING -from .log import log -from .exceptions import ResourceUnavailableException -from . import methods - -try: - import json -except: - import simplejson as json # @UnresolvedImport - -SSL_VERIFICATION = True -if sys.version_info <= (2, 7, 9): - SSL_VERIFICATION = False - -MAX_RETRIES = 5 - - -def get_json(baseurl, parameters={}, headers={}, data={}, method=methods.GET): - '''Download Data from an URL and returns it as JSON - @param url Url to download from - @param parameters Parameter dict to be encoded with url or list of tuple pairs - @param headers Headers dict to pass with Request - @param data Request body - @param method Request method - @returns JSON Object with data from URL - ''' - method = methods.validate(method) - jsonString = download(baseurl, parameters, headers, data, method) - jsonDict = json.loads(jsonString) - log.debug('url: |{0}| parameters: |{1}|\n{2}'.format(baseurl, parameters, json.dumps(jsonDict, indent=4, sort_keys=True))) - return jsonDict - - -def get_json_and_headers(baseurl, parameters={}, headers={}, data={}, method=methods.GET): - '''Download Data from an URL and returns it as JSON - @param url Url to download from - @param parameters Parameter dict to be encoded with url or list of tuple pairs - @param headers Headers dict to pass with Request - @param data Request body - @param method Request method - @returns JSON Object with data and headers from URL {'response': {}, 'headers': {}} - ''' - method = methods.validate(method) - content = download(baseurl, parameters, headers, data, method, response_headers=True) - content['response'] = json.loads(content['response']) - log.debug('url: |{0}| parameters: |{1}|\n{2}'.format(baseurl, parameters, json.dumps(content['response'], indent=4, sort_keys=True))) - return content - - -def download(baseurl, parameters={}, headers={}, data={}, method=methods.GET, response_headers=False): - '''Download Data from an url and returns it as a String - @param method Request method - @param baseurl Url to download from (e.g. http://www.google.com) - @param parameters Parameter dict to be encoded with url or list of tuple pairs - @param headers Headers dict to pass with Request - @param data Request body - @param method Request method - @param response_headers Include response headers in response {'response': {}, 'headers': {}} - @returns String of data from URL or {'response': {}, 'headers': {}} if response_headers is True - ''' - method = methods.validate(method) - - if not parameters: - url = baseurl - elif isinstance(parameters, dict): - url = '?'.join([baseurl, urlencode(parameters)]) - else: - _parameters = '' - for param in parameters: - _parameters += '{0}={1}&'.format(param[0], quote_plus(str(param[1]))) - _parameters = _parameters.rstrip('&') - url = '?'.join([baseurl, _parameters]) - - log.debug('Downloading: |{0}|'.format(url)) - content = "" - for _ in range(MAX_RETRIES): - try: - headers.update({USER_AGENT: USER_AGENT_STRING}) - if isinstance(data, list): - json_body = data - data = None - else: - json_body = None - response = requests.request(method=method, url=url, headers=headers, - json=json_body, data=data, verify=SSL_VERIFICATION) - content = response.content - if not content: - content = '{{"status": {0}}}'.format(response.status_code) - break - except Exception as err: - if not isinstance(err, URLError): - log.debug('Error |{0}| during HTTP Request, abort'.format(repr(err))) - raise # propagate non-URLError - log.debug('Error |{0}| during HTTP Request, retrying'.format(repr(err))) - else: - raise ResourceUnavailableException('Max retries exceeded') - - if isinstance(content, bytes): - content = content.decode('utf-8') - - if not response_headers: - return content - else: - return {'response': content, 'headers': response.headers} diff --git a/script.module.python.twitch/resources/media/icon.png b/script.module.python.twitch/resources/media/icon.png deleted file mode 100644 index d51a68046831cb714cf2939272606a93c88f5a8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19547 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 - - - - - - - - - t1m Library Routines - t1m Library Routines - Feel free to use this script. - GPL-2.0-or-later - all - https://forum.kodi.tv/showthread.php?tid=247163 - https://github.com/learningit/repo-scripts> - en - v4.0.8 - fixes for Nexus - - resources/icon.png - - - diff --git a/script.module.t1mlib/lib/t1mlib.py b/script.module.t1mlib/lib/t1mlib.py deleted file mode 100644 index 94a64ce3c..000000000 --- a/script.module.t1mlib/lib/t1mlib.py +++ /dev/null @@ -1,304 +0,0 @@ -# -*- coding: utf-8 -*- -# Framework Video Addon Routines for Kodi -# For Kodi Matrix (v19) and above -# -# -import sys -import os -import xbmc -import xbmcgui -import xbmcaddon -import xbmcplugin -import xbmcvfs -import urllib.parse -import calendar -import datetime -import requests -import string -import locale - - -qp = urllib.parse.quote_plus -uqp = urllib.parse.unquote_plus -USERAGENT = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36' -httpHeaders = {'User-Agent': USERAGENT, - 'Accept':"application/json, text/javascript, text/html,*/*", - 'Accept-Encoding':'gzip,deflate,sdch', - 'Accept-Language':'en-US,en;q=0.8' - } - - -class t1mAddon(object): - - def __init__(self, aname): - self.script = xbmcaddon.Addon('script.module.t1mlib') - self.addon = xbmcaddon.Addon(''.join(['plugin.video.', aname])) - self.addonName = self.addon.getAddonInfo('name') - self.localLang = self.addon.getLocalizedString - self.homeDir = self.addon.getAddonInfo('path') - self.addonIcon = xbmcvfs.translatePath(os.path.join(self.homeDir, 'resources', 'icon.png')) - self.addonFanart = xbmcvfs.translatePath(os.path.join(self.homeDir,'resources' 'fanart.jpg')) - self.defaultHeaders = httpHeaders - self.defaultVidStream = {'codec': 'h264', 'width': 1280, 'height': 720, 'aspect': 1.78} - self.defaultAudStream = {'codec': 'aac', 'language': 'en'} - self.defaultSubStream = {'language': 'en'} - self.log(''.join(["Python version : ",str(sys.version)])) - self.log(''.join(["locale.getpreferredencoding : ",str(locale.getpreferredencoding())])) - - - def log(self, txt): - message = ''.join([self.addonName, ' : ', txt]) - xbmc.log(msg=message, level=xbmc.LOGDEBUG) - - - def addMenuItem(self, name, mode, ilist=None, url=None, thumb=None, fanart=None, - videoInfo=None, videoStream=None, audioStream=None, - subtitleStream=None, cm=None, isFolder=True): - videoStream = self.defaultVidStream - audioStream = self.defaultAudStream - subtitleStream = self.defaultSubStream - liz = xbmcgui.ListItem(name, offscreen=True) - liz.setArt({'thumb': thumb, 'fanart': fanart, 'poster':thumb}) - liz.setInfo('Video', videoInfo) - liz.addStreamInfo('video', videoStream) - liz.addStreamInfo('audio', audioStream) - liz.addStreamInfo('subtitle', subtitleStream) - if cm is not None: - liz.addContextMenuItems(cm) - if not isFolder: - liz.setProperty('IsPlayable', 'true') - u = ''.join([sys.argv[0], '?mode=', str(mode), '&url=']) - if url is not None: - u = ''.join([u, qp(url)]) - ilist.append((u, liz, isFolder)) - return ilist - - # override or extend these functions in the specific addon default.py - - def getAddonMenu(self, url, ilist): - return ilist - - def getAddonCats(self, url, ilist): - return ilist - - def getAddonMovies(self, url, ilist): - return ilist - - def getAddonShows(self, url, ilist): - return ilist - - def getAddonEpisodes(self, url, ilist): - return ilist - - def getAddonSearch(self, url, ilist): - return ilist - - - def getAddonListing(self, url, ilist): - url, sta, sids = url.split('|') - sid = sids.split('%',1)[0] - sid = int(sid) - d = datetime.datetime.utcnow() - now = calendar.timegm(d.utctimetuple()) -# fix some legacy stuff for existing add-ons - if sta == '20517': - sta = '9133006313' - if sid == 94072: - sid = 95652 - elif sta == '20534': - sta = '9133000248' - if sid == 35794: - sid = 93301 - elif sid == 39303: - sid = 14506 - elif sid ==17075: - sid = 87003 - a = requests.get(''.join(['https://cmg-prod.apigee.net/v1/xapi/tvschedules/tvguide/',sta,'/web?start=',str(now),'&duration=180']), headers=self.defaultHeaders).json() - for c in a["data"]["items"]: - if c["channel"]["legacySourceId"] == sid: - for b in c["programSchedules"]: - st = datetime.datetime.fromtimestamp(float(b['startTime'])).strftime('%H:%M') - et = datetime.datetime.fromtimestamp(float(b['endTime'])).strftime('%H:%M') - duration = int(float(b['endTime']) - float(b['startTime'])) - name = ''.join([st,' - ',et,' ',str(b.get('title'))]) - d = requests.get(b["programDetails"], headers=self.defaultHeaders).json()['data']['item'] - if d.get('type') == 'show' or d.get('type') == None: - name = b.get('title') - epiname = d.get('episodeTitle',name) - if epiname == None: - epiname = '' - infoList = {'mediatype':'episode', - 'Title': name, - 'duration': duration, - 'Plot': ''.join([st,' - ',et,' ',str(duration/60),' min.\n\n[COLOR blue]',str(name),'\n',str(epiname),'[/COLOR]\n\n',str(d.get('description',''))]), - 'MPAA': b.get('rating') - } - else: - name = d.get('title') - infoList = {'mediatype':'movie', - 'Title': name, - 'duration': duration, - 'Plot': ''.join([st,' - ',et,' ',str(duration/60),' min.\n\n[COLOR blue]',str(d.get('title')),'[/COLOR]\n\n',str(d.get('description'))]), - 'MPAA': b.get('rating') - } - - thumb = self.addonIcon - fanart = self.addonFanart - ilist = self.addMenuItem(name,'LV', ilist, url, thumb, fanart, infoList, isFolder=False) - break - return(ilist) - - - def getAddonLiveVideo(self, url): - liz = xbmcgui.ListItem(path = url, offscreen=True) - liz.setProperty('inputstream','inputstream.adaptive') - liz.setProperty('inputstream.adaptive.manifest_type','hls') - liz.setMimeType('application/x-mpegURL') - xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, liz) - - - def getAddonVideo(self, url): - xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xbmcgui.ListItem(path=uqp(url), offscreen=True)) - - - def doFunction(self, url): - return - - - def cleanFilename(self, filename): - whitelist = "-_.() %s%s" % (string.ascii_letters, string.digits) - filename = ''.join(c for c in filename if c in whitelist) - return filename - - - def makeLibraryPath(self, ftype, name=None): - if name is None: - name = self.cleanFilename(xbmc.getInfoLabel('ListItem.Title').replace('(Series)','',1).strip()) - profile = self.script.getAddonInfo('profile') - moviesDir = xbmcvfs.translatePath(os.path.join(profile,str(ftype))) - movieDir = xbmcvfs.translatePath(os.path.join(moviesDir, name)) - if not os.path.isdir(movieDir): - os.makedirs(movieDir) - return movieDir - - def doScan(self,movieDir): - json_cmd = '{"jsonrpc":"2.0","method":"VideoLibrary.Scan", "params": {"directory":"%s/"},"id":1}' % movieDir.replace('\\','/') - jsonRespond = xbmc.executeJSONRPC(json_cmd) - - - def addMusicVideoToLibrary(self, url): - from xml.etree.ElementTree import Element - from xml.etree.ElementTree import tostring - import html.parser - from xml.dom import minidom - UNESCAPE = html.parser.HTMLParser().unescape - - url, infoList = urllib.parse.unquote_plus(url).split('||',1) - infoList = eval(infoList) - artist = infoList.get('artist') - title = infoList.get('title') - movieDir = self.makeLibraryPath('music_videos', name=self.cleanFilename(artist)) - strmFile = xbmcvfs.translatePath(os.path.join(movieDir, ''.join([self.cleanFilename(title),'.strm']))) - url = ''.join([sys.argv[0],'?mode=GV&url=',url]) - with open(strmFile, 'w') as outfile: - outfile.write(url) - nfoFile = xbmcvfs.translatePath(os.path.join(movieDir, ''.join([self.cleanFilename(title),'.nfo']))) - nfoData = Element('musicvideo') - for key, val in infoList.items(): - child = Element(key) - child.text = str(val) - nfoData.append(child) - - nfoData = UNESCAPE(minidom.parseString(tostring(nfoData)).toprettyxml(indent=" ")) -# the next lines of code fail with a Type Error on Android if 'wb' and .encode('utf-8) aren't used. Works ok on Windows and Linux though - with open(nfoFile, 'wb') as outfile: - outfile.write(nfoData.encode('utf-8')) - self.doScan(movieDir) - - - def addMovieToLibrary(self, url): - name = self.cleanFilename(''.join([xbmc.getInfoLabel('ListItem.Title'),'.strm'])) - movieDir = self.makeLibraryPath('movies') - strmFile = xbmcvfs.translatePath(os.path.join(movieDir, name)) - url = ''.join([sys.argv[0],'?mode=GV&url=',url]) - with open(strmFile, 'w') as outfile: - outfile.write(url) - self.doScan(movieDir) - - - def addShowByDate(self,url): - url = uqp(url) - movieDir = self.makeLibraryPath('shows') - ilist = [] - ilist = self.getAddonEpisodes(url, ilist) - for url, liz, isFolder in ilist: - pdate = str(liz.getVideoInfoTag().getFirstAired()) - pdate = pdate.split('/') - pdate = ''.join([pdate[2],'-',pdate[0],'-',pdate[1]]) - title = self.cleanFilename(str(liz.getVideoInfoTag().getTitle())) - TVShowTitle = self.cleanFilename(str(liz.getVideoInfoTag().getTVShowTitle())) - se = ''.join([TVShowTitle,' ',pdate,' [',title,'].strm']) - strmFile = xbmcvfs.translatePath(os.path.join(movieDir, se)) - with open(strmFile, 'w') as outfile: - outfile.write(url) - self.doScan(movieDir) - - - def addShowToLibrary(self,url): - movieDir = self.makeLibraryPath('shows') - ilist = [] - ilist = self.getAddonEpisodes(url, ilist) - for url, liz, isFolder in ilist: - season = str(liz.getVideoInfoTag().getSeason()) - episode = str(liz.getVideoInfoTag().getEpisode()) - title = self.cleanFilename(str(liz.getVideoInfoTag().getTitle())) - se = ''.join(['S',season,'E',episode,' ',title,'.strm']) - strmFile = xbmcvfs.translatePath(os.path.join(movieDir, se)) - with open(strmFile, 'w') as outfile: - outfile.write(url) - self.doScan(movieDir) - - - # internal functions for views, cache and directory management - - def procDir(self, dirFunc, url, content, cache2Disc=True): - ih = int(sys.argv[1]) - xbmcplugin.setContent(ih, content) - xbmcplugin.addSortMethod(ih, xbmcplugin.SORT_METHOD_UNSORTED) - xbmcplugin.addSortMethod(ih, xbmcplugin.SORT_METHOD_TITLE) - xbmcplugin.addSortMethod(ih, xbmcplugin.SORT_METHOD_EPISODE) - ilist = dirFunc(url, []) - xbmcplugin.addDirectoryItems(ih, ilist, len(ilist)) - xbmcplugin.endOfDirectory(ih, cacheToDisc=cache2Disc) - - def getVideo(self, url, ilist): - self.getAddonVideo(url) - - - def processAddonEvent(self): - mtable = {None : [self.getAddonMenu, 'files'], - 'GC' : [self.getAddonCats, 'files'], - 'GM' : [self.getAddonMovies, 'movies'], - 'GS' : [self.getAddonShows, 'tvshows'], - 'GE' : [self.getAddonEpisodes, 'episodes'], - 'SE' : [self.getAddonSearch, 'movies'], - 'GL' : [self.getAddonListing, 'episodes']} - ftable = {'GV' : self.getAddonVideo, - 'LV' : self.getAddonLiveVideo, - 'AM' : self.addMovieToLibrary, - 'AS' : self.addShowToLibrary, - 'AD' : self.addShowByDate, - 'MU' : self.addMusicVideoToLibrary, - 'DF' : self.doFunction} - parms = {} - if len((sys.argv[2][1:])) > 0: - parms = dict(arg.split("=") for arg in ((sys.argv[2][1:]).split("&"))) - for key in parms: - parms[key] = uqp(parms[key]) - fun = mtable.get(parms.get('mode')) - if fun != None: - self.procDir(fun[0],parms.get('url'),fun[1]) - else: - fun = ftable.get(parms.get('mode')) - if fun != None: - fun(parms.get('url')) diff --git a/script.module.t1mlib/readme.txt b/script.module.t1mlib/readme.txt deleted file mode 100644 index 21a4b6471..000000000 --- a/script.module.t1mlib/readme.txt +++ /dev/null @@ -1,9 +0,0 @@ -script.module.t1mlib -================ - -Library of support routines for t1m addons - -V4.0.4 Matrix version - added music video support -V4.0.6 - fix for Android file write having a Type Error -v4.0.7 - fix tv listings for live stream addons -V4.0.9 - fixes for Nexus \ No newline at end of file diff --git a/script.module.t1mlib/resources/icon.png b/script.module.t1mlib/resources/icon.png deleted file mode 100644 index ca4c53adbfa8d06d0e282d45f9cad195e89d571e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7237 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 diff --git a/script.module.tubed.api/LICENSES/GPL-2.0-only.txt b/script.module.tubed.api/LICENSES/GPL-2.0-only.txt deleted file mode 100644 index d7f105139..000000000 --- a/script.module.tubed.api/LICENSES/GPL-2.0-only.txt +++ /dev/null @@ -1,339 +0,0 @@ -GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {description} - Copyright (C) {year} {fullname} - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - {signature of Ty Coon}, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/script.module.tubed.api/addon.xml b/script.module.tubed.api/addon.xml deleted file mode 100644 index 0e886b4e6..000000000 --- a/script.module.tubed.api/addon.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - -- removed support for Kodi Matrix v19 - - - resources/media/icon.png - resources/media/fanart.jpg - - all - GPL-2.0-only - https://github.com/anxdpanic/script.module.tubed.api - Doplněk pro přístup k YouTube Data API - Et modul for adgang til YouTubes data-API - Ein Modul für den Zugriff auf die YouTube-Daten-API - Μονάδα για προσπέλαση του API δεδομένων του Youtube - A module to access YouTube's Data API - A module to access YouTube's Data API - A module to access YouTube's Data API - Un módulo para accedee al API de Datos de YouTube - Moduuli YouTube Data -rajapinnan käyttöön - Modul za pristup YouTubovom API-ju - Un modulo per accedere ai dati API di YouTube - YouTube의 데이터 API에 액세스하기 위한 모듈 - Модуль для доступа к YouTube Data API - Modul na prístup k údajom API služby Youtube - 访问 YouTube 数据 API 的模块 - Doplněk API Tubed poskytuje pohodlný způsob přístupu k YouTube Data API pro Kodi 19+ - Tubed API-modulet giver en praktisk måde at få adgang til YouTubes data-API i Kodi 19+ - Das Tubed-API-Modul stellt eine komfortable Möglichkeit zum Zugriff auf die YouTube-Daten-API in Kodi 19+ zur Verfügung - Η μονάδα Tubed API παρέχει έναν βολικό τρόπο προσπέλασης του API δεδομένων του Youtube στο Kodi 19+ - The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+ - The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+ - El módulo API Tubed provee una manera conveniente de acceder al API de Datos de YouTube en Kodi 19+ - Tubed API-moduuli tarjoaa helpon tavan YouTube Data -rajapinnan käyttöön Kodi versioissa 19+ - Tubed API modul omogućuje pouzdan način pristupa YouTubovom API-ju u Kodi 19+ - Il modulo Tubed API fornisce un modo conveniente per accedere all'API dei dati di YouTube in Kodi 19+ - Tubed API 모듈은 Kodi 19+에서 YouTube의 Data API에 액세스하는 편리한 방법을 제공합니다 - API модуль Tubed предоставляет удобный доступ к YouTube Data API в Kodi 19+ - Tubed API 模块为 Kodi 19+ 提供了访问 YouTube 数据 API 的便捷方式 - - diff --git a/script.module.tubed.api/resources/language/resource.language.af_za/strings.po b/script.module.tubed.api/resources/language/resource.language.af_za/strings.po deleted file mode 100644 index 085fc3690..000000000 --- a/script.module.tubed.api/resources/language/resource.language.af_za/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-01 17:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Afrikaans (South Africa) \n" -"Language: af_za\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Ontfout" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.am_et/strings.po b/script.module.tubed.api/resources/language/resource.language.am_et/strings.po deleted file mode 100644 index 51c0140db..000000000 --- a/script.module.tubed.api/resources/language/resource.language.am_et/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: am_et\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ar_sa/strings.po b/script.module.tubed.api/resources/language/resource.language.ar_sa/strings.po deleted file mode 100644 index cba10017b..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ar_sa/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ar_sa\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ast_es/strings.po b/script.module.tubed.api/resources/language/resource.language.ast_es/strings.po deleted file mode 100644 index e509f3b43..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ast_es/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-01 17:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Asturian (Spain) \n" -"Language: ast_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depuración" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.az_az/strings.po b/script.module.tubed.api/resources/language/resource.language.az_az/strings.po deleted file mode 100644 index 2fdd62e90..000000000 --- a/script.module.tubed.api/resources/language/resource.language.az_az/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: az_az\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.be_by/strings.po b/script.module.tubed.api/resources/language/resource.language.be_by/strings.po deleted file mode 100644 index 439d2985d..000000000 --- a/script.module.tubed.api/resources/language/resource.language.be_by/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-01 17:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Belarusian \n" -"Language: be_by\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Адсочваць хібы" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.bg_bg/strings.po b/script.module.tubed.api/resources/language/resource.language.bg_bg/strings.po deleted file mode 100644 index 1ff10060b..000000000 --- a/script.module.tubed.api/resources/language/resource.language.bg_bg/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-01 17:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Bulgarian \n" -"Language: bg_bg\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Дебъгване" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.bs_ba/strings.po b/script.module.tubed.api/resources/language/resource.language.bs_ba/strings.po deleted file mode 100644 index a0926451d..000000000 --- a/script.module.tubed.api/resources/language/resource.language.bs_ba/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: bs_ba\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ca_es/strings.po b/script.module.tubed.api/resources/language/resource.language.ca_es/strings.po deleted file mode 100644 index 2c88c980b..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ca_es/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-01 17:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Catalan (Spain) \n" -"Language: ca_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depuració" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.cs_cz/strings.po b/script.module.tubed.api/resources/language/resource.language.cs_cz/strings.po deleted file mode 100644 index 82af6a216..000000000 --- a/script.module.tubed.api/resources/language/resource.language.cs_cz/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-29 13:43+0000\n" -"Last-Translator: Kryštof Černý \n" -"Language-Team: Czech \n" -"Language: cs_cz\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Doplněk pro přístup k YouTube Data API" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Doplněk API Tubed poskytuje pohodlný způsob přístupu k YouTube Data API pro Kodi 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "Nastavte HTTP server, který bude poskytovat MPEG-DASH manifesty" - -msgctxt "#30002" -msgid "Port" -msgstr "Port" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "Nastavte port HTTP serveru, který bude poskytovat MPEG-DASH manifesty" - -msgctxt "#30004" -msgid "Debug" -msgstr "Ladit" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Generátor manifestů" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.cy_gb/strings.po b/script.module.tubed.api/resources/language/resource.language.cy_gb/strings.po deleted file mode 100644 index db34024d3..000000000 --- a/script.module.tubed.api/resources/language/resource.language.cy_gb/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Welsh (United Kingdom) \n" -"Language: cy_gb\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=6; plural=(n==0) ? 0 : (n==1) ? 1 : (n==2) ? 2 : (n==3) ? 3 :(n==6) ? 4 : 5;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Dadfygio" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.da_dk/strings.po b/script.module.tubed.api/resources/language/resource.language.da_dk/strings.po deleted file mode 100644 index aeecfa68b..000000000 --- a/script.module.tubed.api/resources/language/resource.language.da_dk/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-08-18 09:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Danish \n" -"Language: da_dk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.7.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Et modul for adgang til YouTubes data-API" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Tubed API-modulet giver en praktisk måde at få adgang til YouTubes data-API i Kodi 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "Indstil den HTTP-server, som MPEG-DASH-manifester ligger på" - -msgctxt "#30002" -msgid "Port" -msgstr "Port" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "Indstil den HTTP-serverport, som MPEG-DASH-manifester ligger på" - -msgctxt "#30004" -msgid "Debug" -msgstr "Fejlfinding" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "Komponentlogføring" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Manifestgenerator" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "Aktivér logføring af mere detaljerede oplysninger fra manifestgeneratoren" diff --git a/script.module.tubed.api/resources/language/resource.language.de_de/strings.po b/script.module.tubed.api/resources/language/resource.language.de_de/strings.po deleted file mode 100644 index 4ff7b9224..000000000 --- a/script.module.tubed.api/resources/language/resource.language.de_de/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: script.module.tubed.api\n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2023-02-06 23:15+0000\n" -"Last-Translator: Kai Sommerfeld \n" -"Language-Team: German \n" -"Language: de_de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.15.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Ein Modul für den Zugriff auf die YouTube-Daten-API" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Das Tubed-API-Modul stellt eine komfortable Möglichkeit zum Zugriff auf die YouTube-Daten-API in Kodi 19+ zur Verfügung" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "HTTP-Server konfigurieren, über den MPEG-DASH-Manifeste bereitgestellt werden" - -msgctxt "#30002" -msgid "Port" -msgstr "Port" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "Port des HTTP-Servers konfigurieren, über den MPEG-DASH-Manifeste bereitgestellt werden" - -msgctxt "#30004" -msgid "Debug" -msgstr "Fehlersuche" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "Komponentenprotokollierung" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Manifest-Generator" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "Protokollieren detaillierterer Informationen für den Manifest-Generator aktivieren" diff --git a/script.module.tubed.api/resources/language/resource.language.el_gr/strings.po b/script.module.tubed.api/resources/language/resource.language.el_gr/strings.po deleted file mode 100644 index 4ccb10f1d..000000000 --- a/script.module.tubed.api/resources/language/resource.language.el_gr/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: el_gr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Μονάδα για προσπέλαση του API δεδομένων του Youtube" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Η μονάδα Tubed API παρέχει έναν βολικό τρόπο προσπέλασης του API δεδομένων του Youtube στο Kodi 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "Ρύθμιση του εξυπηρετητή HTTP για τα μανιφέστα MPEG-DASH που φιλοξενούνται" - -msgctxt "#30002" -msgid "Port" -msgstr "Θύρα" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "Ρύθμιση της θύρας του εξυπηρετητή HTTP στον οποίο φιλοξενούνται τα μανιφέστα MPEG-DASH" - -msgctxt "#30004" -msgid "Debug" -msgstr "Αποσφαλμάτωση" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "Καταγραφή στοιχείων" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Γεννήτρια μανιφέστων" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "Ενεργοποίηση καταγραφής σφαλμάτων για πιο λεπτομερείς πληροφορίες που αφορουν την γεννήτρια μανιφέστων" diff --git a/script.module.tubed.api/resources/language/resource.language.en_au/strings.po b/script.module.tubed.api/resources/language/resource.language.en_au/strings.po deleted file mode 100644 index 3a5ef6fb7..000000000 --- a/script.module.tubed.api/resources/language/resource.language.en_au/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-06-13 10:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: English (Australia) \n" -"Language: en_au\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.6.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "A module to access YouTube's Data API" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.en_gb/strings.po b/script.module.tubed.api/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index c1862aef8..000000000 --- a/script.module.tubed.api/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE\n" -"Language: en_GB\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.en_nz/strings.po b/script.module.tubed.api/resources/language/resource.language.en_nz/strings.po deleted file mode 100644 index 89528f869..000000000 --- a/script.module.tubed.api/resources/language/resource.language.en_nz/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: en_nz\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.en_us/strings.po b/script.module.tubed.api/resources/language/resource.language.en_us/strings.po deleted file mode 100644 index 2f4b9b6be..000000000 --- a/script.module.tubed.api/resources/language/resource.language.en_us/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-06-13 10:29+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: English (United States) \n" -"Language: en_us\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.6.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "A module to access YouTube's Data API" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.eo/strings.po b/script.module.tubed.api/resources/language/resource.language.eo/strings.po deleted file mode 100644 index 2d24ff44d..000000000 --- a/script.module.tubed.api/resources/language/resource.language.eo/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: eo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.es_ar/strings.po b/script.module.tubed.api/resources/language/resource.language.es_ar/strings.po deleted file mode 100644 index ae75a94dc..000000000 --- a/script.module.tubed.api/resources/language/resource.language.es_ar/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Spanish (Argentina) \n" -"Language: es_ar\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depuración" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.es_es/strings.po b/script.module.tubed.api/resources/language/resource.language.es_es/strings.po deleted file mode 100644 index 6d450c8fb..000000000 --- a/script.module.tubed.api/resources/language/resource.language.es_es/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2020-12-26 19:28+0000\n" -"Last-Translator: bsoriano \n" -"Language-Team: Spanish (Spain) \n" -"Language: es_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Un módulo para accedee al API de Datos de YouTube" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "El módulo API Tubed provee una manera conveniente de acceder al API de Datos de YouTube en Kodi 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "Configurar el servidor HTTP en el cual están hosteados los manifests MPEG-DASH" - -msgctxt "#30002" -msgid "Port" -msgstr "Puerto" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "Configurar el puerto del servidor HTTP en el cual están hosteados los manifests MPEG-DASH" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depurar" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "Bitácora de Componentes" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Generador de Manifest" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "Activar bitácora para información más detallada del generador de manifest" diff --git a/script.module.tubed.api/resources/language/resource.language.es_mx/strings.po b/script.module.tubed.api/resources/language/resource.language.es_mx/strings.po deleted file mode 100644 index 487b14ede..000000000 --- a/script.module.tubed.api/resources/language/resource.language.es_mx/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Spanish (Mexico) \n" -"Language: es_mx\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depurar" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.et_ee/strings.po b/script.module.tubed.api/resources/language/resource.language.et_ee/strings.po deleted file mode 100644 index ed77e876a..000000000 --- a/script.module.tubed.api/resources/language/resource.language.et_ee/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-11 09:00+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Estonian \n" -"Language: et_ee\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Silumine" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.eu_es/strings.po b/script.module.tubed.api/resources/language/resource.language.eu_es/strings.po deleted file mode 100644 index 55462c937..000000000 --- a/script.module.tubed.api/resources/language/resource.language.eu_es/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-01 17:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Basque (Spain) \n" -"Language: eu_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Araztu" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.fa_af/strings.po b/script.module.tubed.api/resources/language/resource.language.fa_af/strings.po deleted file mode 100644 index f13a6780b..000000000 --- a/script.module.tubed.api/resources/language/resource.language.fa_af/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: fa_af\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.fa_ir/strings.po b/script.module.tubed.api/resources/language/resource.language.fa_ir/strings.po deleted file mode 100644 index dad977b69..000000000 --- a/script.module.tubed.api/resources/language/resource.language.fa_ir/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Persian (Iran) \n" -"Language: fa_ir\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "دیباگ" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.fi_fi/strings.po b/script.module.tubed.api/resources/language/resource.language.fi_fi/strings.po deleted file mode 100644 index 0ff51ddc5..000000000 --- a/script.module.tubed.api/resources/language/resource.language.fi_fi/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Oskari Lavinto \n" -"Language-Team: Finnish \n" -"Language: fi_fi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Moduuli YouTube Data -rajapinnan käyttöön" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Tubed API-moduuli tarjoaa helpon tavan YouTube Data -rajapinnan käyttöön Kodi versioissa 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "Määritä HTTP-palvelin, jolta MPEG-DASH-manifestit jaellaan" - -msgctxt "#30002" -msgid "Port" -msgstr "Portti" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "Määritä HTTP-palvelin, jolta MPEG-DASH-manifestit jaellaan" - -msgctxt "#30004" -msgid "Debug" -msgstr "Vianselvitys" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "Komponenttien kirjaus" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Manifestigeneraattori" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "Käytä manifestigeneraattorille laajempaa lokikirjausta" diff --git a/script.module.tubed.api/resources/language/resource.language.fo_fo/strings.po b/script.module.tubed.api/resources/language/resource.language.fo_fo/strings.po deleted file mode 100644 index 1f239c0cf..000000000 --- a/script.module.tubed.api/resources/language/resource.language.fo_fo/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: fo_fo\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.fr_ca/strings.po b/script.module.tubed.api/resources/language/resource.language.fr_ca/strings.po deleted file mode 100644 index 1dfb54433..000000000 --- a/script.module.tubed.api/resources/language/resource.language.fr_ca/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-17 10:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: French (Canada) \n" -"Language: fr_ca\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Débogage" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.fr_fr/strings.po b/script.module.tubed.api/resources/language/resource.language.fr_fr/strings.po deleted file mode 100644 index a2aa58455..000000000 --- a/script.module.tubed.api/resources/language/resource.language.fr_fr/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2023-02-25 18:15+0000\n" -"Last-Translator: skypichat \n" -"Language-Team: French (France) \n" -"Language: fr_fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.15.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Déboguer" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.gl_es/strings.po b/script.module.tubed.api/resources/language/resource.language.gl_es/strings.po deleted file mode 100644 index 9e2194609..000000000 --- a/script.module.tubed.api/resources/language/resource.language.gl_es/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Galician (Spain) \n" -"Language: gl_es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depurar" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.he_il/strings.po b/script.module.tubed.api/resources/language/resource.language.he_il/strings.po deleted file mode 100644 index 1342eeb43..000000000 --- a/script.module.tubed.api/resources/language/resource.language.he_il/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Hebrew (Israel) \n" -"Language: he_il\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "ניפוי שגיאות" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.hi_in/strings.po b/script.module.tubed.api/resources/language/resource.language.hi_in/strings.po deleted file mode 100644 index fe967f8fd..000000000 --- a/script.module.tubed.api/resources/language/resource.language.hi_in/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: hi_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.hr_hr/strings.po b/script.module.tubed.api/resources/language/resource.language.hr_hr/strings.po deleted file mode 100644 index 40e6bde05..000000000 --- a/script.module.tubed.api/resources/language/resource.language.hr_hr/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2023-01-14 18:15+0000\n" -"Last-Translator: gogogogi \n" -"Language-Team: Croatian \n" -"Language: hr_hr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.15\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Modul za pristup YouTubovom API-ju" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Tubed API modul omogućuje pouzdan način pristupa YouTubovom API-ju u Kodi 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "Prilagodi HTTP poslužitelj s kojeg se hostiraju MPEG-DASH manifesti" - -msgctxt "#30002" -msgid "Port" -msgstr "Ulaz" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "HTTP ulaz poslužitelja s kojeg se hostiraju MPEG-DASH manifesti" - -msgctxt "#30004" -msgid "Debug" -msgstr "Otklanjanje grešaka" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "Zapisivanje komponenta" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Generator manifesta" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "Omogući zapisivanje više opširnijih informacija iz generatora manifesta" diff --git a/script.module.tubed.api/resources/language/resource.language.hu_hu/strings.po b/script.module.tubed.api/resources/language/resource.language.hu_hu/strings.po deleted file mode 100644 index 12bef4214..000000000 --- a/script.module.tubed.api/resources/language/resource.language.hu_hu/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Hungarian \n" -"Language: hu_hu\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Hibakeresés" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.hy_am/strings.po b/script.module.tubed.api/resources/language/resource.language.hy_am/strings.po deleted file mode 100644 index c4a280860..000000000 --- a/script.module.tubed.api/resources/language/resource.language.hy_am/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: hy_am\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.id_id/strings.po b/script.module.tubed.api/resources/language/resource.language.id_id/strings.po deleted file mode 100644 index 4bf21c19a..000000000 --- a/script.module.tubed.api/resources/language/resource.language.id_id/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: id_id\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.is_is/strings.po b/script.module.tubed.api/resources/language/resource.language.is_is/strings.po deleted file mode 100644 index 2ed7bb986..000000000 --- a/script.module.tubed.api/resources/language/resource.language.is_is/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Icelandic \n" -"Language: is_is\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n % 10 != 1 || n % 100 == 11;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Aflúsa villur" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.it_it/strings.po b/script.module.tubed.api/resources/language/resource.language.it_it/strings.po deleted file mode 100644 index 3857fdd0e..000000000 --- a/script.module.tubed.api/resources/language/resource.language.it_it/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-10-29 09:15+0000\n" -"Last-Translator: Massimo Pissarello \n" -"Language-Team: Italian \n" -"Language: it_it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Un modulo per accedere ai dati API di YouTube" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Il modulo Tubed API fornisce un modo conveniente per accedere all'API dei dati di YouTube in Kodi 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "Configura il server HTTP su cui sono ospitati i manifest MPEG-DASH" - -msgctxt "#30002" -msgid "Port" -msgstr "Porta" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "Configura la porta del server HTTP su cui sono ospitati i manifest MPEG-DASH" - -msgctxt "#30004" -msgid "Debug" -msgstr "Debug" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "Logging componenti" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Generatore manifest" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "Abilita il logging di eventi più dettagliati dal generatore manifest" diff --git a/script.module.tubed.api/resources/language/resource.language.ja_jp/strings.po b/script.module.tubed.api/resources/language/resource.language.ja_jp/strings.po deleted file mode 100644 index 19e51f229..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ja_jp/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Japanese \n" -"Language: ja_jp\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "デバッグ" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.kn_in/strings.po b/script.module.tubed.api/resources/language/resource.language.kn_in/strings.po deleted file mode 100644 index 04d6f2c21..000000000 --- a/script.module.tubed.api/resources/language/resource.language.kn_in/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: kn_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ko_kr/strings.po b/script.module.tubed.api/resources/language/resource.language.ko_kr/strings.po deleted file mode 100644 index 81d4f3b87..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ko_kr/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-08-28 08:29+0000\n" -"Last-Translator: Minho Park \n" -"Language-Team: Korean \n" -"Language: ko_kr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.8\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "YouTube의 데이터 API에 액세스하기 위한 모듈" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Tubed API 모듈은 Kodi 19+에서 YouTube의 Data API에 액세스하는 편리한 방법을 제공합니다" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "MPEG-DASH 매니페스트가 호스팅되는 HTTP 서버 구성" - -msgctxt "#30002" -msgid "Port" -msgstr "포트" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "MPEG-DASH 매니페스트가 호스팅되는 HTTP 서버 포트 구성" - -msgctxt "#30004" -msgid "Debug" -msgstr "디버그" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "구성 요소 로그" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "매니페스트 생성기" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "매니페스트 생성기에서 더 자세한 정보 로그 사용" diff --git a/script.module.tubed.api/resources/language/resource.language.lt_lt/strings.po b/script.module.tubed.api/resources/language/resource.language.lt_lt/strings.po deleted file mode 100644 index 33ffc9d19..000000000 --- a/script.module.tubed.api/resources/language/resource.language.lt_lt/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Lithuanian \n" -"Language: lt_lt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Derinimas" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.lv_lv/strings.po b/script.module.tubed.api/resources/language/resource.language.lv_lv/strings.po deleted file mode 100644 index d14f25c72..000000000 --- a/script.module.tubed.api/resources/language/resource.language.lv_lv/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Latvian \n" -"Language: lv_lv\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Atkļūdošana" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.mi/strings.po b/script.module.tubed.api/resources/language/resource.language.mi/strings.po deleted file mode 100644 index cf51c3ed1..000000000 --- a/script.module.tubed.api/resources/language/resource.language.mi/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mi\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.mk_mk/strings.po b/script.module.tubed.api/resources/language/resource.language.mk_mk/strings.po deleted file mode 100644 index 3e3631d03..000000000 --- a/script.module.tubed.api/resources/language/resource.language.mk_mk/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Macedonian \n" -"Language: mk_mk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Дебаг" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ml_in/strings.po b/script.module.tubed.api/resources/language/resource.language.ml_in/strings.po deleted file mode 100644 index 111d1a6b2..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ml_in/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: ml_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.mn_mn/strings.po b/script.module.tubed.api/resources/language/resource.language.mn_mn/strings.po deleted file mode 100644 index a8fec76d7..000000000 --- a/script.module.tubed.api/resources/language/resource.language.mn_mn/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mn_mn\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ms_my/strings.po b/script.module.tubed.api/resources/language/resource.language.ms_my/strings.po deleted file mode 100644 index b84ba4af3..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ms_my/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Malay \n" -"Language: ms_my\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Nyahpepijat" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.mt_mt/strings.po b/script.module.tubed.api/resources/language/resource.language.mt_mt/strings.po deleted file mode 100644 index fa31908a4..000000000 --- a/script.module.tubed.api/resources/language/resource.language.mt_mt/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: mt_mt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.my_mm/strings.po b/script.module.tubed.api/resources/language/resource.language.my_mm/strings.po deleted file mode 100644 index aee3135b7..000000000 --- a/script.module.tubed.api/resources/language/resource.language.my_mm/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-01 17:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Burmese \n" -"Language: my_mm\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "အပြစ်ရှာဖွေရန်" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.nb_no/strings.po b/script.module.tubed.api/resources/language/resource.language.nb_no/strings.po deleted file mode 100644 index 1168ef25d..000000000 --- a/script.module.tubed.api/resources/language/resource.language.nb_no/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-27 01:17+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Norwegian Bokmål \n" -"Language: nb_no\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Feilsøk" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.nl_nl/strings.po b/script.module.tubed.api/resources/language/resource.language.nl_nl/strings.po deleted file mode 100644 index bec71610b..000000000 --- a/script.module.tubed.api/resources/language/resource.language.nl_nl/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-11 09:00+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Dutch \n" -"Language: nl_nl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Foutregistrering" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.oc_fr/strings.po b/script.module.tubed.api/resources/language/resource.language.oc_fr/strings.po deleted file mode 100644 index e1150725d..000000000 --- a/script.module.tubed.api/resources/language/resource.language.oc_fr/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: oc_fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.os_os/strings.po b/script.module.tubed.api/resources/language/resource.language.os_os/strings.po deleted file mode 100644 index f6016e11e..000000000 --- a/script.module.tubed.api/resources/language/resource.language.os_os/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: os_os\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.pl_pl/strings.po b/script.module.tubed.api/resources/language/resource.language.pl_pl/strings.po deleted file mode 100644 index f81d262a7..000000000 --- a/script.module.tubed.api/resources/language/resource.language.pl_pl/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-30 09:46+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Polish \n" -"Language: pl_pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Diagnostyka" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.pt_br/strings.po b/script.module.tubed.api/resources/language/resource.language.pt_br/strings.po deleted file mode 100644 index 62e8311a9..000000000 --- a/script.module.tubed.api/resources/language/resource.language.pt_br/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-30 09:46+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Portuguese (Brazil) \n" -"Language: pt_br\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depurar" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.pt_pt/strings.po b/script.module.tubed.api/resources/language/resource.language.pt_pt/strings.po deleted file mode 100644 index 13b4e7a65..000000000 --- a/script.module.tubed.api/resources/language/resource.language.pt_pt/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Portuguese (Portugal) \n" -"Language: pt_pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depuração" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ro_ro/strings.po b/script.module.tubed.api/resources/language/resource.language.ro_ro/strings.po deleted file mode 100644 index 32a33cc04..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ro_ro/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Romanian \n" -"Language: ro_ro\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Depanare" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ru_ru/strings.po b/script.module.tubed.api/resources/language/resource.language.ru_ru/strings.po deleted file mode 100644 index f242874b9..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ru_ru/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-03-12 13:18+0000\n" -"Last-Translator: Dmitry Petrov \n" -"Language-Team: Russian \n" -"Language: ru_ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5.1\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Модуль для доступа к YouTube Data API" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "API модуль Tubed предоставляет удобный доступ к YouTube Data API в Kodi 19+" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "Настройте HTTP сервер, в котором размещаются MPEG-DASH манифесты" - -msgctxt "#30002" -msgid "Port" -msgstr "Порт" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "Настройте порт HTTP сервера, в котором размещаются MPEG-DASH манифесты" - -msgctxt "#30004" -msgid "Debug" -msgstr "Отладка" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "Отслеживание компонентов" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "Генератор манифестов" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "Включить сбор детальной информации из генератора манифестов" diff --git a/script.module.tubed.api/resources/language/resource.language.si_lk/strings.po b/script.module.tubed.api/resources/language/resource.language.si_lk/strings.po deleted file mode 100644 index 948a7d1dd..000000000 --- a/script.module.tubed.api/resources/language/resource.language.si_lk/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: si_lk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n > 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.sk_sk/strings.po b/script.module.tubed.api/resources/language/resource.language.sk_sk/strings.po deleted file mode 100644 index 9bc3fa3ba..000000000 --- a/script.module.tubed.api/resources/language/resource.language.sk_sk/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-12-07 09:13+0000\n" -"Last-Translator: Dušan Kazik \n" -"Language-Team: Slovak \n" -"Language: sk_sk\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.9.1\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "Modul na prístup k údajom API služby Youtube" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "Port" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Ladenie" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.sl_si/strings.po b/script.module.tubed.api/resources/language/resource.language.sl_si/strings.po deleted file mode 100644 index 26f6b6e20..000000000 --- a/script.module.tubed.api/resources/language/resource.language.sl_si/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Slovenian \n" -"Language: sl_si\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Razhrošči" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.sq_al/strings.po b/script.module.tubed.api/resources/language/resource.language.sq_al/strings.po deleted file mode 100644 index bae0eae9c..000000000 --- a/script.module.tubed.api/resources/language/resource.language.sq_al/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: sq_al\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.sr_rs/strings.po b/script.module.tubed.api/resources/language/resource.language.sr_rs/strings.po deleted file mode 100644 index c5b9da5fc..000000000 --- a/script.module.tubed.api/resources/language/resource.language.sr_rs/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-30 09:46+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Serbian \n" -"Language: sr_rs\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Тражење грешака" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.sr_rs@latin/strings.po b/script.module.tubed.api/resources/language/resource.language.sr_rs@latin/strings.po deleted file mode 100644 index 671fb6329..000000000 --- a/script.module.tubed.api/resources/language/resource.language.sr_rs@latin/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Serbian (latin) \n" -"Language: sr_rs@latin\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Traženje grešaka" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.sv_se/strings.po b/script.module.tubed.api/resources/language/resource.language.sv_se/strings.po deleted file mode 100644 index 806860d3b..000000000 --- a/script.module.tubed.api/resources/language/resource.language.sv_se/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Swedish \n" -"Language: sv_se\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Felsök" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.szl/strings.po b/script.module.tubed.api/resources/language/resource.language.szl/strings.po deleted file mode 100644 index 77ff862fe..000000000 --- a/script.module.tubed.api/resources/language/resource.language.szl/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Silesian \n" -"Language: szl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Diagnostyka" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.ta_in/strings.po b/script.module.tubed.api/resources/language/resource.language.ta_in/strings.po deleted file mode 100644 index 60b3dc0ad..000000000 --- a/script.module.tubed.api/resources/language/resource.language.ta_in/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Tamil (India) \n" -"Language: ta_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "வழுநீக்கு" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.te_in/strings.po b/script.module.tubed.api/resources/language/resource.language.te_in/strings.po deleted file mode 100644 index 16259a311..000000000 --- a/script.module.tubed.api/resources/language/resource.language.te_in/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: te_in\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.tg_tj/strings.po b/script.module.tubed.api/resources/language/resource.language.tg_tj/strings.po deleted file mode 100644 index 932c13f77..000000000 --- a/script.module.tubed.api/resources/language/resource.language.tg_tj/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: tg_tj\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.th_th/strings.po b/script.module.tubed.api/resources/language/resource.language.th_th/strings.po deleted file mode 100644 index 4a366a110..000000000 --- a/script.module.tubed.api/resources/language/resource.language.th_th/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Thai \n" -"Language: th_th\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "แก้จุดบกพร่อง" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.tr_tr/strings.po b/script.module.tubed.api/resources/language/resource.language.tr_tr/strings.po deleted file mode 100644 index ab621cbdb..000000000 --- a/script.module.tubed.api/resources/language/resource.language.tr_tr/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Turkish \n" -"Language: tr_tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Hata Ayıkla" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.uk_ua/strings.po b/script.module.tubed.api/resources/language/resource.language.uk_ua/strings.po deleted file mode 100644 index c66d6fe76..000000000 --- a/script.module.tubed.api/resources/language/resource.language.uk_ua/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Ukrainian \n" -"Language: uk_ua\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Відладка" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.uz_uz/strings.po b/script.module.tubed.api/resources/language/resource.language.uz_uz/strings.po deleted file mode 100644 index 5678c39bd..000000000 --- a/script.module.tubed.api/resources/language/resource.language.uz_uz/strings.po +++ /dev/null @@ -1,53 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: uz_uz\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.vi_vn/strings.po b/script.module.tubed.api/resources/language/resource.language.vi_vn/strings.po deleted file mode 100644 index b536821a1..000000000 --- a/script.module.tubed.api/resources/language/resource.language.vi_vn/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-04-08 00:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Vietnamese \n" -"Language: vi_vn\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11.2\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "Gỡ lỗi" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/language/resource.language.zh_cn/strings.po b/script.module.tubed.api/resources/language/resource.language.zh_cn/strings.po deleted file mode 100644 index 4c0154e1a..000000000 --- a/script.module.tubed.api/resources/language/resource.language.zh_cn/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2021-11-09 05:30+0000\n" -"Last-Translator: taxigps \n" -"Language-Team: Chinese (China) \n" -"Language: zh_cn\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.8.1\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "访问 YouTube 数据 API 的模块" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "Tubed API 模块为 Kodi 19+ 提供了访问 YouTube 数据 API 的便捷方式" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "MPEG-DASH HTTPD" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "配置承载 MPEG-DASH 指令清单的 HTTP 服务器" - -msgctxt "#30002" -msgid "Port" -msgstr "端口" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "配置承载 MPEG-DASH 指令清单的 HTTP 服务器端口" - -msgctxt "#30004" -msgid "Debug" -msgstr "调试" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "组件日志记录" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "指令清单生成器" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "启用从指令清单生成器记录更多详细日志信息" diff --git a/script.module.tubed.api/resources/language/resource.language.zh_tw/strings.po b/script.module.tubed.api/resources/language/resource.language.zh_tw/strings.po deleted file mode 100644 index 9348496cc..000000000 --- a/script.module.tubed.api/resources/language/resource.language.zh_tw/strings.po +++ /dev/null @@ -1,54 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: translations@kodi.tv\n" -"POT-Creation-Date: 2016-09-18 00:54+0000\n" -"PO-Revision-Date: 2022-03-01 17:13+0000\n" -"Last-Translator: Christian Gade \n" -"Language-Team: Chinese (Taiwan) \n" -"Language: zh_tw\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.11\n" - -msgctxt "Addon Summary" -msgid "A module to access YouTube's Data API" -msgstr "" - -msgctxt "Addon Description" -msgid "The Tubed API module provides a convenient way to access YouTube's Data API in Kodi 19+" -msgstr "" - -msgctxt "#30000" -msgid "MPEG-DASH HTTPD" -msgstr "" - -msgctxt "#30001" -msgid "Configure the HTTP server that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30002" -msgid "Port" -msgstr "" - -msgctxt "#30003" -msgid "Configure the HTTP server port that MPEG-DASH manifests are hosted from" -msgstr "" - -msgctxt "#30004" -msgid "Debug" -msgstr "除錯" - -msgctxt "#30005" -msgid "Component Logging" -msgstr "" - -msgctxt "#30006" -msgid "Manifest generator" -msgstr "" - -msgctxt "#30007" -msgid "Enable logging of more detailed information from the manifest generator" -msgstr "" diff --git a/script.module.tubed.api/resources/lib/__init__.py b/script.module.tubed.api/resources/lib/__init__.py deleted file mode 100644 index df2b3887d..000000000 --- a/script.module.tubed.api/resources/lib/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -__all__ = ['src', 'service'] diff --git a/script.module.tubed.api/resources/lib/service.py b/script.module.tubed.api/resources/lib/service.py deleted file mode 100644 index ccc15ba66..000000000 --- a/script.module.tubed.api/resources/lib/service.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from src import service # pylint: disable=import-error - -service.invoke() diff --git a/script.module.tubed.api/resources/lib/src/__init__.py b/script.module.tubed.api/resources/lib/src/__init__.py deleted file mode 100644 index a04a02833..000000000 --- a/script.module.tubed.api/resources/lib/src/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -__all__ = ['constants', 'httpd', 'tubed_api', 'service'] diff --git a/script.module.tubed.api/resources/lib/src/constants/__init__.py b/script.module.tubed.api/resources/lib/src/constants/__init__.py deleted file mode 100644 index 3454e9ee0..000000000 --- a/script.module.tubed.api/resources/lib/src/constants/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from .config import ADDON_ID -from .config import TEMP_DIRECTORY - -# the actual constants -__all__ = ['ADDON_ID', 'TEMP_DIRECTORY'] - -# the modules containing the constants -__all__ += ['config'] diff --git a/script.module.tubed.api/resources/lib/src/constants/config.py b/script.module.tubed.api/resources/lib/src/constants/config.py deleted file mode 100644 index aae2dc79d..000000000 --- a/script.module.tubed.api/resources/lib/src/constants/config.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -ADDON_ID = 'script.module.tubed.api' -TEMP_DIRECTORY = 'special://temp/%s/' % ADDON_ID diff --git a/script.module.tubed.api/resources/lib/src/httpd/__init__.py b/script.module.tubed.api/resources/lib/src/httpd/__init__.py deleted file mode 100644 index b06182960..000000000 --- a/script.module.tubed.api/resources/lib/src/httpd/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -__all__ = ['daemon', 'handler'] diff --git a/script.module.tubed.api/resources/lib/src/httpd/daemon.py b/script.module.tubed.api/resources/lib/src/httpd/daemon.py deleted file mode 100644 index 295fac02c..000000000 --- a/script.module.tubed.api/resources/lib/src/httpd/daemon.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from http.server import HTTPServer -from threading import Thread - -import requests -import xbmc # pylint: disable=import-error -import xbmcaddon # pylint: disable=import-error -import xbmcvfs # pylint: disable=import-error - -from ..constants import ADDON_ID -from ..constants import TEMP_DIRECTORY -from .handler import RequestHandler - - -class HTTPDaemon(xbmc.Monitor): - cache_path = xbmcvfs.translatePath(TEMP_DIRECTORY) - - def __init__(self): - self._address = '127.0.0.1' - self._port = xbmcaddon.Addon(ADDON_ID).getSettingInt('httpd.port') or 52520 - - self._httpd = None - self._thread = None - - super().__init__() - - @property - def address(self): - return self._address - - @property - def port(self): - return int(self._port) - - @property - def httpd(self): - return self._httpd - - @httpd.setter - def httpd(self, value): - self._httpd = value - - @property - def thread(self): - return self._thread - - @thread.setter - def thread(self, value): - self._thread = value - - def start(self): - if not self.httpd: - self.httpd = self._server() - self.thread = Thread(target=self.httpd.serve_forever) - self.thread.daemon = True - self.thread.start() - - def restart(self): - self.shutdown() - self.start() - - def shutdown(self): - if self.httpd: - self.httpd.shutdown() - self.httpd.socket.close() - self.thread.join() - self.thread = None - self.httpd = None - - def ping(self): - try: - response = requests.get('http://{address}:{port}/ping' - .format(address=self.address, port=self.port), - timeout=60) - return response.status_code == 204 - - finally: - return False # pylint: disable=lost-exception - - def clean_cache(self): - if xbmcvfs.exists(self.cache_path): - xbmcvfs.rmdir(self.cache_path, force=True) - - return not xbmcvfs.exists(self.cache_path) - - def _server(self): - server = HTTPServer((self.address, self.port), RequestHandler) - return server diff --git a/script.module.tubed.api/resources/lib/src/httpd/handler.py b/script.module.tubed.api/resources/lib/src/httpd/handler.py deleted file mode 100644 index 0da3b8d84..000000000 --- a/script.module.tubed.api/resources/lib/src/httpd/handler.py +++ /dev/null @@ -1,203 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -import os -import re -import traceback -from http.server import BaseHTTPRequestHandler -from ipaddress import ip_address - -import requests -import xbmc # pylint: disable=import-error -import xbmcgui # pylint: disable=import-error -import xbmcvfs # pylint: disable=import-error - -from ..constants import TEMP_DIRECTORY -from ..tubed_api.utils.logger import Log - -LOG = Log('httpd', __file__) - - -class RequestHandler(BaseHTTPRequestHandler): - cache_path = xbmcvfs.translatePath(TEMP_DIRECTORY) - chunk_size = 1024 * 64 - - def log_message(self, format, *args): # pylint: disable=redefined-builtin - return # disable BaseHTTPRequestHandler logging mechanism - - def connection_allowed(self): - return ip_address(self.client_address[0]).is_private - - def _get_path(self): - return os.path.join(self.cache_path, self.path.strip('/').strip('\\')) - - def _get_chunks(self, data): - for i in range(0, len(data), self.chunk_size): - yield data[i:i + self.chunk_size] - - def do_GET(self): # pylint: disable=invalid-name - if not self.connection_allowed(): - LOG.warning('Rejected GET connection from %s' % - ip_address(self.client_address[0])) - self.send_error(403) - return - - if self.path.endswith('.mpd'): - dash_manifest = self._get_path() - LOG.debug('A manifest was requested @ %s' % self.path) - - self.send_response(200) - self.send_header('Content-Type', 'application/xml+dash') - self.send_header('Content-Length', str(os.path.getsize(dash_manifest))) - self.end_headers() - - try: - with open(dash_manifest, 'rb') as file_handle: - chunk = True - while chunk: - chunk = file_handle.read(self.chunk_size) - if chunk: - self.wfile.write(chunk) - - LOG.debug('A manifest was delivered from %s' % self.path) - - except IOError: - LOG.error('An IOError occurred when retrieving the manifest @ %s' % self.path) - LOG.error(traceback.format_exc()) - self.send_error(404) - - except: # pylint: disable=bare-except - LOG.error('An unknown occurred when retrieving the manifest @ %s' % self.path) - LOG.error(traceback.format_exc()) - self.send_error(500) - - elif self.path == '/ping': - self.send_error(204) - - else: - LOG.error('Rejected GET connection to an unknown resource @ %s' % self.path) - self.send_error(501) - - def do_HEAD(self): # pylint: disable=invalid-name - if not self.connection_allowed(): - LOG.warning('Rejected HEAD connection from %s' % - ip_address(self.client_address[0])) - self.send_error(403) - return - - if self.path.endswith('.mpd'): - dash_manifest = self._get_path() - - LOG.debug('A manifest existence check was requested @ %s' % self.path) - - if not os.path.isfile(dash_manifest): - LOG.error('A manifest does not exist @ %s' % self.path) - self.send_error(404) - return - - self.send_response(200) - self.send_header('Content-Type', 'application/xml+dash') - self.send_header('Content-Length', str(os.path.getsize(dash_manifest))) - self.end_headers() - - LOG.error('A manifest exists @ %s' % self.path) - return - - LOG.error('Rejected HEAD connection to an unknown resource @ %s' % self.path) - self.send_error(501) - - def do_POST(self): # pylint: disable=invalid-name - if not self.connection_allowed(): - LOG.warning('Rejected POST connection from %s' % - ip_address(self.client_address[0])) - self.send_error(403) - return - - if self.path.startswith('/widevine'): - LOG.debug('A widevine license request was made') - - url = xbmcgui.Window(10000).getProperty('tubed-api-license_url') - token = xbmcgui.Window(10000).getProperty('tubed-api-license_token') - - if not url: - LOG.error('No license url was found') - self.send_error(404) - return - - if not token: - LOG.error('No license token was found') - self.send_error(403) - return - - size_limit = None - - length = int(self.headers['Content-Length']) - data = self.rfile.read(length) - - headers = { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Authorization': 'Bearer %s' % token - } - - response = requests.post(url=url, headers=headers, - data=data, stream=True, - timeout=60) - - content = response.raw.read(int(response.headers.get('content-length'))) - - header, body = content.split('\r\n\r\n'.encode('utf-8')) - header = header.decode('utf-8') - - authorized_formats = re.search(r'^Authorized-Format-Types:\s*(?P.+?)\r*$', - header, re.MULTILINE) - if authorized_formats: - authorized_types = authorized_formats.group('types').split(',') - - formats = { - 'SD': (1280 * 528) - 1, - 'HD720': 1280 * 720, - 'HD': 7680 * 4320 - } - - if 'HD' in authorized_types: - size_limit = formats['HD'] - - elif 'HD720' in authorized_types: - if xbmc.getCondVisibility('system.platform.android') == 1: - size_limit = formats['HD720'] - else: - size_limit = formats['SD'] - - elif 'SD' in authorized_types: - size_limit = formats['SD'] - - self.send_response(200) - - if size_limit: - self.send_header('X-Limit-Video', 'max={size_limit}px' - .format(size_limit=str(size_limit))) - - for header, value in response.headers.items(): - if value.lower() == 'content-length': - self.send_header(value, str(len(body))) - - else: - self.send_header(header, value) - - self.end_headers() - - for chunk in self._get_chunks(body): - self.wfile.write(chunk) - - LOG.debug('A widevine license response was sent') - return - - LOG.error('Rejected POST connection to an unknown resource @ %s' % self.path) - self.send_error(501) diff --git a/script.module.tubed.api/resources/lib/src/service.py b/script.module.tubed.api/resources/lib/src/service.py deleted file mode 100644 index a23a0b4b8..000000000 --- a/script.module.tubed.api/resources/lib/src/service.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from .httpd.daemon import HTTPDaemon -from .tubed_api.utils.time import now -from .tubed_api.utils.time import timestamp_diff - - -def invoke(): - sleep_time = 10 - ping_delay = 60 - ping_timestamp = None - - httpd = HTTPDaemon() - - httpd.clean_cache() - - httpd.start() - - while not httpd.abortRequested(): - - if ping_timestamp is None or timestamp_diff(ping_timestamp) >= ping_delay: - ping_timestamp = str(now()) - - if not httpd.ping(): - httpd.restart() - - if httpd.waitForAbort(sleep_time): - break - - if httpd: - httpd.shutdown() diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/__init__.py b/script.module.tubed.api/resources/lib/src/tubed_api/__init__.py deleted file mode 100644 index 5947f84bc..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -ACCESS_TOKEN = '' -API_KEY = '' -CLIENT_ID = '' -CLIENT_SECRET = '' -HTTP_REFERRER = '' - -ACCESS_TOKEN_TV = '' -API_KEY_TV = 'QUl6YVN5QzZmdlpTSkhBN1Z6NWo4akNpS1J0N3RVSU9xakUyTjNn' -CLIENT_ID_TV = 'ODYxNTU2NzA4NDU0LWQ2ZGxtM2xoMDVpZGQ4bnBlazE4azZiZThiYTNvYzY4' -CLIENT_SECRET_TV = 'U2JvVmhvRzlzMHJOYWZpeENTR0dLWEFU' - -__all__ = ['ACCESS_TOKEN', 'ACCESS_TOKEN_TV', 'API_KEY', 'API_KEY_TV', 'CLIENT_ID', - 'CLIENT_ID_TV', 'CLIENT_SECRET', 'HTTP_REFERRER', 'CLIENT_SECRET_TV', - 'constants', 'oauth', 'usher', 'utils', 'v3', 'exceptions'] diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/constants/__init__.py b/script.module.tubed.api/resources/lib/src/tubed_api/constants/__init__.py deleted file mode 100644 index 7d1bc3742..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/constants/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2022 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from .http import MOBILE_HEADERS - -# the actual constants -__all__ = ['MOBILE_HEADERS'] - -# the modules containing the constants -__all__ += ['http'] diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/constants/http.py b/script.module.tubed.api/resources/lib/src/tubed_api/constants/http.py deleted file mode 100644 index f95ed8444..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/constants/http.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2022 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -MOBILE_HEADERS = { - 'User-Agent': ('Mozilla/5.0 (Linux; Android 7.0; SM-G892A Build/NRD90M;' - ' wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0' - ' Chrome/67.0.3396.87 Mobile Safari/537.36'), - 'Accept': '*/*', - 'DNT': '1', - 'Accept-Encoding': 'gzip, deflate', - 'Accept-Language': 'en-US,en;q=0.5' -} diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/exceptions.py b/script.module.tubed.api/resources/lib/src/tubed_api/exceptions.py deleted file mode 100644 index c09d23956..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/exceptions.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - - -class TubedAPIException(Exception): - _data = { - 'error': 'exception', - 'error_description': 'Unknown exception occurred', - 'code': '500' - } - - def __init__(self, data=None): - super().__init__() - - if isinstance(data, str) and data: - self._data['error_description'] = data - elif isinstance(data, dict): - self._data.update(data) - - @property - def data(self): - return self._data - - @property - def error(self): - return self.data.get('error', 'exception') - - @property - def description(self): - return self.data.get('description', 'Unknown exception occurred') - - @property - def code(self): - return self.data.get('code', '500') - - -class TubedOAuthException(TubedAPIException): - pass - - -class ResourceUnavailable(TubedAPIException): - pass - - -class ContentNoResponse(TubedAPIException): - pass - - -class ContentRestricted(TubedAPIException): - pass - - -class OAuthRequestFailed(TubedOAuthException): - pass - - -class OAuthInvalidGrant(TubedOAuthException): - pass diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/oauth/__init__.py b/script.module.tubed.api/resources/lib/src/tubed_api/oauth/__init__.py deleted file mode 100644 index 173f8dbce..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/oauth/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from .client import Client - -__all__ = ['client', 'Client', 'scopes'] diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/oauth/client.py b/script.module.tubed.api/resources/lib/src/tubed_api/oauth/client.py deleted file mode 100644 index 96899605d..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/oauth/client.py +++ /dev/null @@ -1,214 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -import requests - -from ..constants import MOBILE_HEADERS -from ..exceptions import OAuthInvalidGrant -from ..exceptions import OAuthRequestFailed -from . import scopes - - -class Client: - # https://developers.google.com/youtube/v3/guides/auth/devices - - def __init__(self, client_id='', client_secret=''): - # pylint: disable=import-outside-toplevel - - if client_id and client_secret: - self.client_id = client_id - self.client_secret = client_secret - else: - from .. import CLIENT_ID - from .. import CLIENT_SECRET - self.client_id = CLIENT_ID - self.client_secret = CLIENT_SECRET - - from .. import HTTP_REFERRER - self.http_referrer = HTTP_REFERRER - - def request_codes(self, scope=None): - headers = { - 'Host': 'accounts.google.com', - 'Content-Type': 'application/x-www-form-urlencoded' - } - headers.update(MOBILE_HEADERS.copy()) - - if self.http_referrer: - headers['Referer'] = self.http_referrer - - if not scope: - scope = scopes.YOUTUBE - - elif isinstance(scope, list): - scope = ' '.join(scope) - - data = { - 'client_id': self.client_id, - 'scope': scope - } - - response, payload = self._post('https://accounts.google.com/o/oauth2/device/code', - data=data, headers=headers) - - if 'error' in payload: - payload.update({ - 'code': str(response.status_code) - }) - raise OAuthRequestFailed(payload) - - if response.status_code != requests.codes.ok: # pylint: disable=no-member - raise OAuthRequestFailed({ - 'error': 'code_request_failed', - 'error_description': 'Code request failed with status code %s' % - str(response.status_code), - 'code': str(response.status_code) - }) - - if response.headers.get('content-type', '').startswith('application/json'): - return payload - - raise OAuthRequestFailed({ - 'error': 'code_request_failed_unknown', - 'error_description': 'Code request failed with an unknown response', - 'code': str(response.status_code) - }) - - def request_access_token(self, code): - headers = { - 'Host': 'www.googleapis.com', - 'Content-Type': 'application/x-www-form-urlencoded' - } - headers.update(MOBILE_HEADERS.copy()) - - if self.http_referrer: - headers['Referer'] = self.http_referrer - - data = { - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'code': code, - 'grant_type': 'http://oauth.net/grant_type/device/1.0' - } - - response, payload = self._post('https://www.googleapis.com/oauth2/v4/token', - data=data, headers=headers) - - pending = False - - if 'error' in payload: - pending = payload['error'] == 'authorization_pending' - - if not pending: - payload.update({ - 'code': str(response.status_code) - }) - raise OAuthRequestFailed(payload) - - if (response.status_code != requests.codes.ok) and not pending: # pylint: disable=no-member - raise OAuthRequestFailed({ - 'error': 'access_token_request_failed', - 'error_description': 'Access token request failed with status code %s' % - str(response.status_code), - 'code': str(response.status_code) - }) - - if response.headers.get('content-type', '').startswith('application/json'): - return payload - - raise OAuthRequestFailed({ - 'error': 'access_token_request_failed_unknown', - 'error_description': 'Access token request failed with an unknown response', - 'code': str(response.status_code) - }) - - def refresh_token(self, token): - headers = { - 'Host': 'www.googleapis.com', - 'Content-Type': 'application/x-www-form-urlencoded' - } - headers.update(MOBILE_HEADERS.copy()) - - if self.http_referrer: - headers['Referer'] = self.http_referrer - - data = { - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'refresh_token': token, - 'grant_type': 'refresh_token' - } - - response, payload = self._post('https://www.googleapis.com/oauth2/v4/token', - data=data, headers=headers) - - if 'error' in payload: - payload.update({ - 'code': str(response.status_code) - }) - - if payload['error'] == 'invalid_grant' and payload['code'] == '400': - raise OAuthInvalidGrant(payload) - - raise OAuthRequestFailed(payload) - - if response.status_code != requests.codes.ok: # pylint: disable=no-member - raise OAuthRequestFailed({ - 'error': 'refresh_token_request_failed', - 'error_description': 'Refreshing token failed with status code %s' % - str(response.status_code), - 'code': str(response.status_code) - }) - - if response.headers.get('content-type', '').startswith('application/json'): - return payload['access_token'], int(payload.get('expires_in', 3600)) - - return '', '' - - def revoke_token(self, token): - headers = { - 'Host': 'accounts.google.com', - 'Content-Type': 'application/x-www-form-urlencoded' - } - headers.update(MOBILE_HEADERS.copy()) - - if self.http_referrer: - headers['Referer'] = self.http_referrer - - data = { - 'token': token - } - - response, payload = self._post('https://accounts.google.com/o/oauth2/revoke', - data=data, headers=headers) - - if 'error' in payload: - payload.update({ - 'code': str(response.status_code) - }) - raise OAuthRequestFailed(payload) - - if response.status_code != requests.codes.ok: # pylint: disable=no-member - raise OAuthRequestFailed({ - 'error': 'revoke_token_request_failed', - 'error_description': 'Token revocation failed', - 'code': str(response.status_code) - }) - - @staticmethod - def _post(url, data, headers): - response = requests.post(url, data=data, headers=headers, timeout=60) - - response.encoding = 'utf-8' - - try: - return response, response.json() - except ValueError: - return response, {} diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/oauth/scopes.py b/script.module.tubed.api/resources/lib/src/tubed_api/oauth/scopes.py deleted file mode 100644 index 5809fc437..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/oauth/scopes.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -# Manage your YouTube account -YOUTUBE = 'https://www.googleapis.com/auth/youtube' - -# See a list of your current active channel members, their current level, and when they -# became a member -CHANNEL_MEMBERSHIPS = 'https://www.googleapis.com/auth/youtube.channel-memberships.creator' - -# See, edit, and permanently delete your YouTube videos, ratings, comments and captions -FORCE_SSL = 'https://www.googleapis.com/auth/youtube.force-ssl' - -# View your YouTube account -READONLY = 'https://www.googleapis.com/auth/youtube.readonly' - -# Manage your YouTube videos -UPLOAD = 'https://www.googleapis.com/auth/youtube.upload' - -# View and manage your assets and associated content on YouTube -PARTNER = 'https://www.googleapis.com/auth/youtubepartner' - -# View private information of your YouTube channel relevant during the audit process -# with a YouTube partner -PARTNER_CHANNEL_AUDIT = 'https://www.googleapis.com/auth/youtubepartner-channel-audit' diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/usher/__init__.py b/script.module.tubed.api/resources/lib/src/tubed_api/usher/__init__.py deleted file mode 100644 index 49b2a0201..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/usher/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from .lib.quality import Quality -from .resolver import resolve - -__all__ = ['Quality', 'resolve', 'resolver'] diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/__init__.py b/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/__init__.py deleted file mode 100644 index f6981a3c3..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -__all__ = ['mpeg_dash', 'quality', 'subtitles', 'video_info'] diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/itags.json b/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/itags.json deleted file mode 100644 index 4e7c81a4e..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/itags.json +++ /dev/null @@ -1,1160 +0,0 @@ -{ - "5": { - "container": "flv", - "title": "240p", - "sort": [ - 240, - 0 - ], - "video": { - "height": 240, - "encoding": "h.263" - }, - "audio": { - "bitrate": 64, - "encoding": "mp3" - } - }, - "6": { - "container": "flv", - "discontinued": true, - "video": { - "height": 270, - "encoding": "h.263" - }, - "audio": { - "bitrate": 64, - "encoding": "mp3" - } - }, - "13": { - "container": "3gp", - "discontinued": true, - "video": { - "encoding": "mpeg-4" - }, - "audio": { - "encoding": "aac" - } - }, - "17": { - "container": "3gp", - "title": "144p", - "sort": [ - 144, - -20 - ], - "video": { - "height": 144, - "encoding": "mpeg-4" - }, - "audio": { - "bitrate": 24, - "encoding": "aac" - } - }, - "18": { - "container": "mp4", - "title": "360p", - "sort": [ - 360, - 0 - ], - "video": { - "height": 360, - "encoding": "h.264" - }, - "audio": { - "bitrate": 96, - "encoding": "aac" - } - }, - "22": { - "container": "mp4", - "title": "720p", - "sort": [ - 720, - 0 - ], - "video": { - "height": 720, - "encoding": "h.264" - }, - "audio": { - "bitrate": 192, - "encoding": "aac" - } - }, - "34": { - "container": "flv", - "discontinued": true, - "video": { - "height": 360, - "encoding": "h.264" - }, - "audio": { - "bitrate": 128, - "encoding": "aac" - } - }, - "35": { - "container": "flv", - "discontinued": true, - "video": { - "height": 480, - "encoding": "h.264" - }, - "audio": { - "bitrate": 128, - "encoding": "aac" - } - }, - "36": { - "container": "3gp", - "title": "240p", - "sort": [ - 240, - -20 - ], - "video": { - "height": 240, - "encoding": "mpeg-4" - }, - "audio": { - "bitrate": 32, - "encoding": "aac" - } - }, - "37": { - "container": "mp4", - "title": "1080p", - "sort": [ - 1080, - 0 - ], - "video": { - "height": 1080, - "encoding": "h.264" - }, - "audio": { - "bitrate": 192, - "encoding": "aac" - } - }, - "38": { - "container": "mp4", - "title": "3072p", - "sort": [ - 3072, - 0 - ], - "video": { - "height": 3072, - "encoding": "h.264" - }, - "audio": { - "bitrate": 192, - "encoding": "aac" - } - }, - "43": { - "container": "webm", - "title": "360p", - "sort": [ - 360, - -1 - ], - "video": { - "height": 360, - "encoding": "vp8" - }, - "audio": { - "bitrate": 128, - "encoding": "vorbis" - } - }, - "44": { - "container": "webm", - "discontinued": true, - "video": { - "height": 480, - "encoding": "vp8" - }, - "audio": { - "bitrate": 128, - "encoding": "vorbis" - } - }, - "45": { - "container": "webm", - "discontinued": true, - "video": { - "height": 720, - "encoding": "vp8" - }, - "audio": { - "bitrate": 192, - "encoding": "vorbis" - } - }, - "46": { - "container": "webm", - "discontinued": true, - "video": { - "height": 1080, - "encoding": "vp8" - }, - "audio": { - "bitrate": 192, - "encoding": "vorbis" - } - }, - "59": { - "container": "mp4", - "title": "480p", - "sort": [ - 480, - 0 - ], - "video": { - "height": 480, - "encoding": "h.264" - }, - "audio": { - "bitrate": 96, - "encoding": "aac" - } - }, - "78": { - "container": "mp4", - "title": "360p", - "sort": [ - 360, - 0 - ], - "video": { - "height": 360, - "encoding": "h.264" - }, - "audio": { - "bitrate": 96, - "encoding": "aac" - } - }, - "82": { - "container": "mp4", - "3D": true, - "title": "3D@360p", - "sort": [ - 360, - 0 - ], - "video": { - "height": 360, - "encoding": "h.264" - }, - "audio": { - "bitrate": 96, - "encoding": "aac" - } - }, - "83": { - "container": "mp4", - "3D": true, - "title": "3D@240p", - "sort": [ - 240, - 0 - ], - "video": { - "height": 240, - "encoding": "h.264" - }, - "audio": { - "bitrate": 96, - "encoding": "aac" - } - }, - "84": { - "container": "mp4", - "3D": true, - "title": "3D@720p", - "sort": [ - 720, - 0 - ], - "video": { - "height": 720, - "encoding": "h.264" - }, - "audio": { - "bitrate": 192, - "encoding": "aac" - } - }, - "85": { - "container": "mp4", - "3D": true, - "title": "3D@1080p", - "sort": [ - 1080, - 0 - ], - "video": { - "height": 1080, - "encoding": "h.264" - }, - "audio": { - "bitrate": 192, - "encoding": "aac" - } - }, - "100": { - "container": "webm", - "3D": true, - "title": "3D@360p", - "sort": [ - 360, - -1 - ], - "video": { - "height": 360, - "encoding": "vp8" - }, - "audio": { - "bitrate": 128, - "encoding": "vorbis" - } - }, - "101": { - "container": "webm", - "discontinued": true, - "3D": true, - "title": "3D@360p", - "sort": [ - 360, - -1 - ], - "video": { - "height": 360, - "encoding": "vp8" - }, - "audio": { - "bitrate": 192, - "encoding": "vorbis" - } - }, - "102": { - "container": "webm", - "discontinued": true, - "3D": true, - "video": { - "height": 720, - "encoding": "vp8" - }, - "audio": { - "bitrate": 192, - "encoding": "vorbis" - } - }, - "91": { - "container": "ts", - "Live": true, - "title": "Live@144p", - "sort": [ - 144, - 0 - ], - "video": { - "height": 144, - "encoding": "h.264" - }, - "audio": { - "bitrate": 48, - "encoding": "aac" - } - }, - "92": { - "container": "ts", - "Live": true, - "title": "Live@240p", - "sort": [ - 240, - 0 - ], - "video": { - "height": 240, - "encoding": "h.264" - }, - "audio": { - "bitrate": 48, - "encoding": "aac" - } - }, - "93": { - "container": "ts", - "Live": true, - "title": "Live@360p", - "sort": [ - 360, - 0 - ], - "video": { - "height": 360, - "encoding": "h.264" - }, - "audio": { - "bitrate": 128, - "encoding": "aac" - } - }, - "94": { - "container": "ts", - "Live": true, - "title": "Live@480p", - "sort": [ - 480, - 0 - ], - "video": { - "height": 480, - "encoding": "h.264" - }, - "audio": { - "bitrate": 128, - "encoding": "aac" - } - }, - "95": { - "container": "ts", - "Live": true, - "title": "Live@720p", - "sort": [ - 720, - 0 - ], - "video": { - "height": 720, - "encoding": "h.264" - }, - "audio": { - "bitrate": 256, - "encoding": "aac" - } - }, - "96": { - "container": "ts", - "Live": true, - "title": "Live@1080p", - "sort": [ - 1080, - 0 - ], - "video": { - "height": 1080, - "encoding": "h.264" - }, - "audio": { - "bitrate": 256, - "encoding": "aac" - } - }, - "120": { - "container": "flv", - "discontinued": true, - "Live": true, - "title": "Live@720p", - "sort": [ - 720, - -10 - ], - "video": { - "height": 720, - "encoding": "h.264" - }, - "audio": { - "bitrate": 128, - "encoding": "aac" - } - }, - "127": { - "container": "ts", - "Live": true, - "audio": { - "bitrate": 96, - "encoding": "aac" - } - }, - "128": { - "container": "ts", - "Live": true, - "audio": { - "bitrate": 96, - "encoding": "aac" - } - }, - "132": { - "container": "ts", - "Live": true, - "title": "Live@240p", - "sort": [ - 240, - 0 - ], - "video": { - "height": 240, - "encoding": "h.264" - }, - "audio": { - "bitrate": 48, - "encoding": "aac" - } - }, - "151": { - "container": "ts", - "Live": true, - "unsupported": true, - "title": "Live@72p", - "sort": [ - 72, - 0 - ], - "video": { - "height": 72, - "encoding": "h.264" - }, - "audio": { - "bitrate": 24, - "encoding": "aac" - } - }, - "300": { - "container": "ts", - "Live": true, - "title": "Live@720p", - "sort": [ - 720, - 0 - ], - "video": { - "height": 720, - "encoding": "h.264" - }, - "audio": { - "bitrate": 128, - "encoding": "aac" - } - }, - "301": { - "container": "ts", - "Live": true, - "title": "Live@1080p", - "sort": [ - 1080, - 0 - ], - "video": { - "height": 1080, - "encoding": "h.264" - }, - "audio": { - "bitrate": 128, - "encoding": "aac" - } - }, - "133": { - "container": "mp4", - "dash/video": true, - "video": { - "height": 240, - "encoding": "h.264" - } - }, - "134": { - "container": "mp4", - "dash/video": true, - "video": { - "height": 360, - "encoding": "h.264" - } - }, - "135": { - "container": "mp4", - "dash/video": true, - "video": { - "height": 480, - "encoding": "h.264" - } - }, - "136": { - "container": "mp4", - "dash/video": true, - "video": { - "height": 720, - "encoding": "h.264" - } - }, - "137": { - "container": "mp4", - "dash/video": true, - "video": { - "height": 1080, - "encoding": "h.264" - } - }, - "138": { - "container": "mp4", - "discontinued": true, - "dash/video": true, - "video": { - "height": 2160, - "encoding": "h.264" - } - }, - "160": { - "container": "mp4", - "dash/video": true, - "video": { - "height": 144, - "encoding": "h.264" - } - }, - "167": { - "container": "webm", - "dash/video": true, - "video": { - "height": 360, - "encoding": "vp8" - } - }, - "168": { - "container": "webm", - "dash/video": true, - "video": { - "height": 480, - "encoding": "vp8" - } - }, - "169": { - "container": "webm", - "dash/video": true, - "video": { - "height": 720, - "encoding": "vp8" - } - }, - "170": { - "container": "webm", - "dash/video": true, - "video": { - "height": 1080, - "encoding": "vp8" - } - }, - "218": { - "container": "webm", - "dash/video": true, - "video": { - "height": 480, - "encoding": "vp8" - } - }, - "219": { - "container": "webm", - "dash/video": true, - "video": { - "height": 480, - "encoding": "vp8" - } - }, - "242": { - "container": "webm", - "dash/video": true, - "video": { - "height": 240, - "encoding": "vp9" - } - }, - "243": { - "container": "webm", - "dash/video": true, - "video": { - "height": 360, - "encoding": "vp9" - } - }, - "244": { - "container": "webm", - "dash/video": true, - "video": { - "height": 480, - "encoding": "vp9" - } - }, - "247": { - "container": "webm", - "dash/video": true, - "video": { - "height": 720, - "encoding": "vp9" - } - }, - "248": { - "container": "webm", - "dash/video": true, - "video": { - "height": 1080, - "encoding": "vp9" - } - }, - "264": { - "container": "mp4", - "dash/video": true, - "video": { - "height": 1440, - "encoding": "h.264" - } - }, - "266": { - "container": "mp4", - "dash/video": true, - "video": { - "height": 2160, - "encoding": "h.264" - } - }, - "271": { - "container": "webm", - "dash/video": true, - "video": { - "height": 1440, - "encoding": "vp9" - } - }, - "272": { - "container": "webm", - "dash/video": true, - "video": { - "height": 2160, - "encoding": "vp9" - } - }, - "278": { - "container": "webm", - "dash/video": true, - "video": { - "height": 144, - "encoding": "vp9" - } - }, - "298": { - "container": "mp4", - "dash/video": true, - "fps": 60, - "video": { - "height": 720, - "encoding": "h.264" - } - }, - "299": { - "container": "mp4", - "dash/video": true, - "fps": 60, - "video": { - "height": 1080, - "encoding": "h.264" - } - }, - "302": { - "container": "webm", - "dash/video": true, - "fps": 60, - "video": { - "height": 720, - "encoding": "vp9" - } - }, - "303": { - "container": "webm", - "dash/video": true, - "fps": 60, - "video": { - "height": 1080, - "encoding": "vp9" - } - }, - "308": { - "container": "webm", - "dash/video": true, - "fps": 60, - "video": { - "height": 1440, - "encoding": "vp9" - } - }, - "313": { - "container": "webm", - "dash/video": true, - "video": { - "height": 2160, - "encoding": "vp9" - } - }, - "315": { - "container": "webm", - "dash/video": true, - "fps": 60, - "video": { - "height": 2160, - "encoding": "vp9" - } - }, - "330": { - "container": "webm", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 144, - "encoding": "vp9.2" - } - }, - "331": { - "container": "webm", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 240, - "encoding": "vp9.2" - } - }, - "332": { - "container": "webm", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 360, - "encoding": "vp9.2" - } - }, - "333": { - "container": "webm", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 480, - "encoding": "vp9.2" - } - }, - "334": { - "container": "webm", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 720, - "encoding": "vp9.2" - } - }, - "335": { - "container": "webm", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 1080, - "encoding": "vp9.2" - } - }, - "336": { - "container": "webm", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 1440, - "encoding": "vp9.2" - } - }, - "337": { - "container": "webm", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 2160, - "encoding": "vp9.2" - } - }, - "400": { - "container": "mp4", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 1440, - "encoding": "av1" - } - }, - "401": { - "container": "mp4", - "dash/video": true, - "fps": 60, - "hdr": true, - "video": { - "height": 2160, - "encoding": "av1" - } - }, - "394": { - "container": "mp4", - "dash/video": true, - "fps": 30, - "video": { - "height": 144, - "encoding": "av1" - } - }, - "395": { - "container": "mp4", - "dash/video": true, - "fps": 30, - "video": { - "height": 240, - "encoding": "av1" - } - }, - "396": { - "container": "mp4", - "dash/video": true, - "fps": 30, - "video": { - "height": 360, - "encoding": "av1" - } - }, - "397": { - "container": "mp4", - "dash/video": true, - "fps": 30, - "video": { - "height": 480, - "encoding": "av1" - } - }, - "398": { - "container": "mp4", - "dash/video": true, - "fps": 30, - "video": { - "height": 720, - "encoding": "av1" - } - }, - "399": { - "container": "mp4", - "dash/video": true, - "fps": 30, - "video": { - "height": 1080, - "encoding": "av1" - } - }, - "139": { - "container": "mp4", - "sort": [ - 48, - 0 - ], - "title": "aac@48", - "dash/audio": true, - "audio": { - "bitrate": 48, - "encoding": "aac" - } - }, - "140": { - "container": "mp4", - "sort": [ - 129, - 0 - ], - "title": "aac@128", - "dash/audio": true, - "audio": { - "bitrate": 128, - "encoding": "aac" - } - }, - "141": { - "container": "mp4", - "sort": [ - 143, - 0 - ], - "title": "aac@256", - "dash/audio": true, - "audio": { - "bitrate": 256, - "encoding": "aac" - } - }, - "256": { - "container": "mp4", - "title": "aac/itag 256", - "dash/audio": true, - "unsupported": true, - "audio": { - "bitrate": 0, - "encoding": "aac" - } - }, - "258": { - "container": "mp4", - "title": "aac/itag 258", - "dash/audio": true, - "unsupported": true, - "audio": { - "bitrate": 0, - "encoding": "aac" - } - }, - "325": { - "container": "mp4", - "title": "dtse/itag 325", - "dash/audio": true, - "unsupported": true, - "audio": { - "bitrate": 0, - "encoding": "aac" - } - }, - "328": { - "container": "mp4", - "title": "ec-3/itag 328", - "dash/audio": true, - "unsupported": true, - "audio": { - "bitrate": 0, - "encoding": "aac" - } - }, - "171": { - "container": "webm", - "sort": [ - 128, - 0 - ], - "title": "vorbis@128", - "dash/audio": true, - "audio": { - "bitrate": 128, - "encoding": "vorbis" - } - }, - "172": { - "container": "webm", - "sort": [ - 142, - 0 - ], - "title": "vorbis@192", - "dash/audio": true, - "audio": { - "bitrate": 192, - "encoding": "vorbis" - } - }, - "249": { - "container": "webm", - "sort": [ - 50, - 0 - ], - "title": "opus@50", - "dash/audio": true, - "audio": { - "bitrate": 50, - "encoding": "opus" - } - }, - "250": { - "container": "webm", - "sort": [ - 70, - 0 - ], - "title": "opus@70", - "dash/audio": true, - "audio": { - "bitrate": 70, - "encoding": "opus" - } - }, - "251": { - "container": "webm", - "sort": [ - 141, - 0 - ], - "title": "opus@160", - "dash/audio": true, - "audio": { - "bitrate": 160, - "encoding": "opus" - } - }, - "9997": { - "container": "mpd", - "sort": [ - -1, - 0 - ], - "title": "DASH Audio", - "dash/audio": true, - "audio": { - "bitrate": 0, - "encoding": "" - } - }, - "9998": { - "container": "mpd", - "Live": true, - "sort": [ - 1080, - 1 - ], - "title": "Live DASH", - "dash/audio": true, - "dash/video": true, - "audio": { - "bitrate": 0, - "encoding": "" - }, - "video": { - "height": 0, - "encoding": "" - } - }, - "9999": { - "container": "mpd", - "sort": [ - 1080, - 1 - ], - "title": "DASH", - "dash/audio": true, - "dash/video": true, - "audio": { - "bitrate": 0, - "encoding": "" - }, - "video": { - "height": 0, - "encoding": "" - } - } -} diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/mpeg_dash.py b/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/mpeg_dash.py deleted file mode 100644 index ae360f5db..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/mpeg_dash.py +++ /dev/null @@ -1,596 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -import json -import operator -import re -from copy import deepcopy -from html import escape -from urllib.parse import parse_qsl -from urllib.parse import unquote - -import xbmcaddon # pylint: disable=import-error -import xbmcgui # pylint: disable=import-error -import xbmcvfs # pylint: disable=import-error - -from ...utils.logger import Log -from .quality import Quality - -LOG = Log('usher', __file__) - - -class ManifestGenerator: - path = xbmcvfs.translatePath('special://temp/script.module.tubed.api/') - - def __init__(self, itags, license_data=None): - self.addon = xbmcaddon.Addon('script.module.tubed.api') - - self._itags = itags - self._discarded = [] - if license_data is None: - license_data = {} - self.license_data = license_data - - self.component_logging = self.addon.getSettingBool('log.manifest.generator') - - @property - def itags(self): - return self._itags - - @property - def discarded(self): - return self._discarded - - @discarded.setter - def discarded(self, value): - self._discarded.append(value) - - def _make_dirs(self): - if not xbmcvfs.exists(self.path): - _ = xbmcvfs.mkdirs(self.path) - - return xbmcvfs.exists(self.path) - - def discard_audio(self, fmt, mime_type, itag, stream, reason='unsupported'): - discarded = { - 'audio': { - 'itag': str(itag), - 'mime': str(mime_type), - 'codec': str(stream['codec']), - 'bandwidth': int(stream['bandwidth']) - }, - 'reason': reason - } - - if fmt: - bitrate = int(fmt.get('audio', {}).get('bitrate', 0)) - if bitrate > 0: - discarded['audio']['bitrate'] = bitrate - - self.discarded = discarded - - def discard_video(self, mime_type, itag, stream, reason='unsupported'): - discarded = { - 'video': { - 'itag': str(itag), - 'width': str(stream['width']), - 'height': str(stream['height']), - 'fps': str(stream['frameRate']), - 'codec': str(stream['codec']), - 'mime': str(mime_type), - 'bandwidth': int(stream['bandwidth']) - }, - 'reason': reason - } - - if stream.get('quality_label'): - discarded['video']['quality_label'] = str(stream['quality_label']) - - self.discarded = discarded - - def _filter_qualities(self, stream_data, container, quality_object): - data = deepcopy(stream_data) - - height_to_width_map = { - 4320: 7680, - 2160: 3840, - 1440: 2560, - 1080: 1920, - 720: 1280, - 480: 854, - 426: 240, - } - - rng = 1 if container == 'mp4' else 2 - - for idx in range(rng): - mime_mp4 = 'video/mp4' - mime_webm = 'video/webm' - if container == 'mp4' or (container == 'webm' and idx == 1): - discard_mime = mime_webm - try: - discarded_mime_streams = data[mime_webm] - except KeyError: - discarded_mime_streams = [] - - selected_mime = mime_mp4 - streams = deepcopy(data[mime_mp4]) - elif container == 'webm': - discard_mime = mime_mp4 - try: - discarded_mime_streams = data[mime_mp4] - except KeyError: - discarded_mime_streams = [] - - selected_mime = mime_webm - streams = deepcopy(data[mime_webm]) - - if not streams: - discard_mime = mime_webm - try: - discarded_mime_streams = data[mime_webm] - except KeyError: - discarded_mime_streams = [] - - selected_mime = mime_mp4 - streams = deepcopy(data[mime_mp4]) - else: - return data - - thirty_fps_streams = [streams[itag] for itag in list(streams.keys()) - if streams[itag].get('fps') <= 30] - - sixty_fps_streams = [streams[itag] for itag in list(streams.keys()) - if streams[itag].get('fps') > 30] - - fps_streams = sixty_fps_streams - if (not quality_object.limit_30fps and not sixty_fps_streams) or \ - quality_object.limit_30fps: - fps_streams = thirty_fps_streams - - quality_streams = [] - - for quality in quality_object.qualities: - # find all streams with matching width - matches = [stream for stream in fps_streams - if int(stream.get('width', 0)) == height_to_width_map.get(quality, -1)] - - if matches: - quality_streams.extend(matches) - continue - - if not quality_streams: - continue - - quality_streams.sort(key=operator.itemgetter('bandwidth'), reverse=True) - quality_streams.sort(key=operator.itemgetter('width'), reverse=True) - - selected_stream = quality_streams[0] - selected_itag = selected_stream.get('id', -1) - - for itag in list(streams.keys()): - # discard all streams except the best match - if itag != selected_itag: - self.discard_video(selected_mime, itag, streams[itag], 'quality') - del data[selected_mime][itag] - - if discarded_mime_streams: - # discard streams with unwanted mime type - for itag in list(discarded_mime_streams.keys()): - self.discard_video(discard_mime, itag, - discarded_mime_streams[itag], 'mime type') - del data[discard_mime][itag] - - break - - return data - - def _stream_data(self, formats): - data = {} - for item in formats: - stream_map = item - - stream_map.update(dict(parse_qsl(item.get('signatureCipher', item.get('cipher', ''))))) - stream_map['itag'] = str(stream_map.get('itag')) - - mime_type = stream_map.get('mimeType') - mime_type = unquote(mime_type).split(';') - - key = mime_type[0] - itag = stream_map.get('itag') - - if key not in data: - data[key] = {} - data[key][itag] = {} - - codec = str(mime_type[1][1:]) - data[key][itag]['codec'] = codec - - match = re.search('codecs="(?P[^"]+)"', codec) - if match: - data[key][itag]['codec'] = match.group('codec') - - data[key][itag]['id'] = itag - - data[key][itag]['width'] = stream_map.get('width') - data[key][itag]['height'] = stream_map.get('height') - - data[key][itag]['quality_label'] = str(stream_map.get('qualityLabel')) - - data[key][itag]['bandwidth'] = stream_map.get('bitrate', 0) - - # map frame rates to a more common representation to - # lessen the chance of double refresh changes sometimes - # 30 fps is 30 fps, more commonly it is 29.97 fps (same for all mapped frame rates) - frame_rate = None - fps_scale_map = { - 24: 1001, - 30: 1001, - 60: 1001 - } - - if 'fps' in stream_map: - fps = int(stream_map.get('fps')) - data[key][itag]['fps'] = fps - scale = fps_scale_map.get(fps, 1000) - frame_rate = '%d/%d' % (fps * 1000, scale) - - data[key][itag]['frameRate'] = frame_rate - - url = unquote(stream_map.get('url')) - - signature_parameter = '&signature=' - if 'sp' in stream_map: - signature_parameter = '&%s=' % stream_map['sp'] - - if 'sig' in stream_map: - url = ''.join([url, signature_parameter, stream_map['sig']]) - - url = url.replace("&", "&").replace('"', """) - url = url.replace("<", "<").replace(">", ">") - - data[key][itag]['baseUrl'] = url - - data[key][itag]['indexRange'] = '0-0' - data[key][itag]['initRange'] = '0-0' - - if 'indexRange' in stream_map and 'initRange' in stream_map: - data[key][itag]['indexRange'] = \ - '-'.join([stream_map.get('indexRange').get('start'), - stream_map.get('indexRange').get('end')]) - - data[key][itag]['init'] = \ - '-'.join([stream_map.get('initRange').get('start'), - stream_map.get('initRange').get('end')]) - - if ('indexRange' not in stream_map or - 'initRange' not in stream_map or - data[key][itag].get('indexRange') == '0-0' and - data[key][itag].get('initRange') == '0-0'): - - if key.startswith('video'): - self.discard_video(key, itag, data[key][itag], 'no init or index') - - else: - stream_format = self.itags.get(itag, {}) - self.discard_audio(stream_format, key, itag, - data[key][itag], 'no init or index') - - del data[key][itag] - - return data - - def _filter_av1(self, data): - data = deepcopy(data) - payload = {} - - for itag in data.keys(): - if data[itag]['codec'].lower().startswith(('av01', 'av1')): - continue - - payload[itag] = data[itag] - - discarded = [data[itag] for itag in (set(data) - set(payload)) if itag in data] - - for discard in discarded: - self.discard_video('video/mp4', discard['id'], - data[discard['id']], 'av1 unsupported') - - return payload - - def _filter_hdr(self, data, hdr=False): - data = deepcopy(data) - webm = {} - - if hdr and any(itag for itag in data.keys() - if 'vp9.2' in data[itag]['codec']): - # when hdr enabled and available replace vp9 streams with vp9.2 (hdr) - for itag in data.keys(): - if 'vp9.2' in data[itag]['codec']: - webm[itag] = data[itag] - - discarded = [data[itag] for itag in (set(data) - set(webm)) if itag in data] - - for discard in discarded: - self.discard_video('video/webm', discard['id'], - data[discard['id']], 'replaced by hdr') - - elif not hdr: - # when hdr disabled and remove vp9.2 (hdr) streams - for itag in data.keys(): - if 'vp9.2' in data[itag]['codec']: - continue - - webm[itag] = data[itag] - - discarded = [data[itag] for itag in (set(data) - set(webm)) if itag in data] - - for discard in discarded: - self.discard_video('video/webm', discard['id'], - data[discard['id']], 'hdr disabled') - - return webm - - @staticmethod - def _stream_info_template(): - return { - 'video': { - 'height': '0', - 'fps': '0', - 'codec': '', - 'mime': '', - 'quality_label': '', - 'bandwidth': 0 - }, - 'audio': { - 'bitrate': '0', - 'codec': '', - 'mime': '', - 'bandwidth': 0 - } - } - - def generate(self, video_id, formats, duration, quality_object=None): # pylint: disable=too-many-branches,too-many-statements,too-many-locals - LOG.debug('Generating MPEG-DASH manifest for %s' % video_id) - - if self.component_logging: - LOG.debug('Stream information available for %s MPEG-DASH manifest:\n%s' % - (video_id, json.dumps(formats, indent=4))) - - if not self._make_dirs(): - return None - - if not quality_object: - quality_object = Quality('mp4') - - has_video_stream = False - - stream_info = self._stream_info_template() - data = self._stream_data(formats) - - if not data.get('video/mp4') and not data.get('video/webm'): - return None, None - - default_mime_type = 'mp4' - supported_mime_types = [] - - if data.get('video/mp4'): - supported_mime_types.append('video/mp4') - - if data.get('audio/mp4'): - supported_mime_types.append('audio/mp4') - - if any(mime for mime in data if mime == 'video/webm') and data.get('video/webm'): - supported_mime_types.append('video/webm') - - if ('video/webm' in supported_mime_types and - ((isinstance(quality_object.quality, str) and quality_object.quality == 'webm') or - (isinstance(quality_object.quality, int) and quality_object.quality > 1080) or - quality_object.hdr)): - default_mime_type = 'webm' - - av1_filtered = self._filter_av1(data.get('video/mp4', {})) - if av1_filtered: - data['video/mp4'] = av1_filtered - - hdr_filtered = self._filter_hdr(data.get('video/webm', {}), hdr=quality_object.hdr) - if hdr_filtered: - data['video/webm'] = hdr_filtered - - if isinstance(quality_object.quality, int) and isinstance(quality_object.qualities, list): - data = self._filter_qualities(data, default_mime_type, quality_object) - - mpd_list = ['\n' - '\n', - '\t\n'] - - adaptation_set_idx = 0 - for key in data: # pylint: disable=too-many-nested-blocks - if "_" in key: - mime, lang = key.split("_") - else: - mime = key - lang = None - - if mime in supported_mime_types: - default = False - if mime.endswith(default_mime_type): - default = True - - mpd_list.append(''.join(['\t\t\n'])) - - license_url = self.license_data.get('license_url') - if license_url: - mpd_list.append(''.join(['\t\t\t\n', - '\t\t\t\t', - escape(license_url), '\n', - '\t\t\t\n'])) - - mpd_list.append('\t\t\t\n') - - for itag in data[key]: - stream_format = self.itags.get(itag, {}) - if 'audio' in mime: - - audio_codec = data[key][itag]['codec'] - if audio_codec.lower() == 'opus': - self.discard_audio(stream_format, mime, itag, data[key][itag]) - continue - - if audio_codec.lower() == 'vorbis': - self.discard_audio(stream_format, mime, itag, data[key][itag]) - continue - - if (int(data[key][itag]['bandwidth']) > - int(stream_info['audio']['bandwidth'])): - - stream_info['audio']['mime'] = str(mime) - if stream_format: - - bitrate = int(stream_format.get('audio', {}).get('bitrate', 0)) - if bitrate > 0: - stream_info['audio']['bitrate'] = str(bitrate) - - stream_info['audio']['codec'] = \ - stream_format.get('audio', {}).get('encoding') - - if not stream_info['audio'].get('codec'): - stream_info['audio']['codec'] = audio_codec - - stream_info['audio']['bandwidth'] = int(data[key][itag]['bandwidth']) - - mpd_list.append(''.join(['\t\t\t\n'])) - - mpd_list.append('\t\t\t\t\n') - - else: - video_codec = data[key][itag]['codec'] - - if video_codec.lower() == 'vp9.2' and not quality_object.hdr: - self.discard_video(mime, itag, data[key][itag], 'hdr not selected') - continue - - if video_codec.lower().startswith(('av01', 'av1')) and \ - not quality_object.av1: - self.discard_video(mime, itag, data[key][itag], 'av1 not selected') - continue - - has_video_stream = True - if default: - if (int(data[key][itag]['bandwidth']) > - int(stream_info['video']['bandwidth'])): - stream_info['video']['height'] = str(data[key][itag]['height']) - stream_info['video']['fps'] = str(data[key][itag]['frameRate']) - stream_info['video']['mime'] = str(mime) - stream_info['video']['codec'] = video_codec - stream_info['video']['bandwidth'] = \ - int(data[key][itag]['bandwidth']) - - if data[key][itag].get('quality_label'): - stream_info['video']['quality_label'] = \ - str(data[key][itag]['quality_label']) - - if stream_format: - stream_info['video']['codec'] = \ - stream_format.get('video', {}).get('encoding') - - if not stream_info['video'].get('codec'): - stream_info['video']['codec'] = video_codec - - video_codec = data[key][itag]['codec'] - mpd_list.append(''.join(['\t\t\t\n'])) - - mpd_list.append(''.join(['\t\t\t\t', - data[key][itag]['baseUrl'], - '\n'])) - - mpd_list.append(''.join(['\t\t\t\t\n', '\t\t\t\t\t\t\n', - '\t\t\t\t\n'])) - - mpd_list.append('\t\t\t\n') - mpd_list.append('\t\t\n') - - adaptation_set_idx = adaptation_set_idx + 1 - - else: - for i in data[key]: - stream_format = self.itags.get(i, {}) - if 'audio' in mime: - self.discard_audio(stream_format, mime, i, data[key][i]) - - else: - self.discard_video(mime, i, data[key][i]) - - mpd_list.append('\t\n\n') - manifest_contents = ''.join(mpd_list) - - if self.discarded: - self._discarded = sorted( - self.discarded, - key=lambda k: (k.get('reason'), k.get('audio', k.get('video', {}))['bandwidth']), - reverse=True - ) - - if not has_video_stream: - pass - - filename = '{path}{video_id}.mpd'.format(path=self.path, video_id=video_id) - with open(filename, 'wb') as file_handle: - _ = file_handle.write(bytes(manifest_contents, encoding='utf-8')) - - license_url = self.license_data.get('license_url', '') - license_token = self.license_data.get('license_token', '') - if license_url and license_token: - xbmcgui.Window(10000).setProperty('tubed-api-license_url', license_url) - xbmcgui.Window(10000).setProperty('tubed-api-license_token', license_token) - - port = self.addon.getSettingInt('httpd.port') or 52520 - proxy_url = 'http://127.0.0.1:{port}/{video_id}.mpd'.format(port=port, video_id=video_id) - - if self.component_logging: - LOG.debug('Stream information discard for %s MPEG-DASH manifest:\n%s' % - (video_id, json.dumps(self.discarded, indent=4))) - LOG.debug('Stream information used for %s MPEG-DASH manifest:\n%s' % - (video_id, json.dumps(stream_info, indent=4))) - - LOG.debug('Finished generating MPEG-DASH manifest for %s @ %s' % (video_id, proxy_url)) - - return proxy_url, stream_info diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/quality.py b/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/quality.py deleted file mode 100644 index 54d7db48b..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/quality.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - - -class Quality: - MAP = { - 0: 240, - 1: 360, - 2: 480, - 3: 720, - 4: 1080, - 5: 1440, - 6: 2160, - 7: 4320, - 8: 'mp4', - 9: 'webm' - } - - def __init__(self, height, limit_30fps=True, hdr=False, av1=False): - - self._index = self._index_of_height(height) - self._limit_30fps = limit_30fps - self._hdr = hdr - if hdr: - self._limit_30fps = False - - self._av1 = av1 - - @property - def map(self): - return self.MAP - - @property - def quality(self): - return self.map.get(self._index, 'mp4') - - @property - def qualities(self): - if not isinstance(self.quality, int): - return self.quality - - qualities = sorted([quality for quality in self.map.values() - if isinstance(quality, int) and quality <= self.quality], - reverse=True) - - return qualities - - @property - def limit_30fps(self): - if self.hdr: - return False - return self._limit_30fps - - @property - def hdr(self): - return self._hdr - - @property - def av1(self): - return self._av1 - - def _index_of_height(self, height): - for index, quality in self.MAP.items(): - if height == quality: - return index - - return 8 diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/subtitles.py b/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/subtitles.py deleted file mode 100644 index d38dfa3b7..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/subtitles.py +++ /dev/null @@ -1,127 +0,0 @@ -# -*- coding: utf-8 -*- -""" - - Copyright (C) 2017-2020 plugin.video.youtube - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only for more information. -""" - -from urllib.parse import parse_qs -from urllib.parse import urlencode -from urllib.parse import urlsplit -from urllib.parse import urlunsplit - - -class Subtitles: - def __init__(self, video_id, captions): - self.video_id = video_id - - self.caption_track = {} - - renderer = captions.get('playerCaptionsTracklistRenderer', {}) - - self.caption_tracks = renderer.get('captionTracks', []) - self.translation_languages = renderer.get('translationLanguages', []) - - default_audio = renderer.get('defaultAudioTrackIndex') - if default_audio: - audio_tracks = renderer.get('audioTracks', []) - - try: - audio_track = audio_tracks[default_audio] - except: # pylint: disable=bare-except - audio_track = None - - if audio_track: - default_caption = audio_track.get('defaultCaptionTrackIndex') - - if not default_caption: - default_caption = audio_track.get('captionTrackIndices') - if default_caption and isinstance(default_caption, list): - default_caption = default_caption[0] - - if default_caption and default_caption in self.caption_tracks: - self.caption_track = self.caption_tracks[default_caption] - - def retrieve(self): - list_of_subs = [] - - all_captions = self.translation_languages + self.caption_tracks - for language in all_captions: - subtitle = self._get(language=language.get('languageCode')) - if subtitle: - list_of_subs.append(subtitle) - - return list(set(list_of_subs)) - - def _get(self, language='en'): - caption = None - - for track in self.caption_tracks: - if language == track.get('languageCode'): - if track.get('kind') == 'asr': - if not caption: - caption = track - continue - - caption = track - break - - has_translation = any(lang for lang in self.translation_languages - if lang.get('languageCode') == language) - - if not has_translation and not caption: - return None - - subtitle_url = None - if not caption and has_translation: - base_url = self.caption_track.get('baseUrl') - if base_url: - subtitle_url = self.set_query_param(base_url, 'tlang', language) - - elif caption: - base_url = caption.get('baseUrl') - if base_url: - subtitle_url = base_url - - if subtitle_url: - subtitle_url = self.set_query_param(subtitle_url, 'type', 'track') - subtitle_url = self.set_query_param(subtitle_url, 'fmt', 'vtt') - return (caption.get('languageCode'), - self._get_language_name(caption), - caption.get('kind'), - subtitle_url) - - return None - - @staticmethod - def _get_language_name(track): - key = 'languageName' if 'languageName' in track else 'name' - - lang_name = track.get(key, {}).get('simpleText') - if lang_name: - return lang_name - - if not lang_name: - track_name = track.get(key, {}).get('runs', [{}]) - - if isinstance(track_name, list) and len(track_name) >= 1: - return track_name[0].get('text') - - return '' - - @staticmethod - def set_query_param(url, name, value): - scheme, netloc, path, query_string, fragment = urlsplit(url) - query_params = parse_qs(query_string) - - query_params[name] = [value] - new_query_string = urlencode(query_params, doseq=True) - if isinstance(scheme, bytes): - new_query_string = new_query_string.encode('utf-8') - - return urlunsplit((scheme, netloc, path, new_query_string, fragment)) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/video_info.py b/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/video_info.py deleted file mode 100644 index 6a1972a2a..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/usher/lib/video_info.py +++ /dev/null @@ -1,390 +0,0 @@ -# -*- coding: utf-8 -*- -""" - - Copyright (C) 2014-2016 bromix (plugin.video.youtube) - Copyright (C) 2016-2020 plugin.video.youtube - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -import json -import os -import random -import traceback -from base64 import b64decode -from copy import deepcopy -from urllib.parse import quote - -import requests -import xbmcaddon # pylint: disable=import-error -import xbmcvfs # pylint: disable=import-error - -from ...constants.http import MOBILE_HEADERS -from ...exceptions import ContentNoResponse -from ...exceptions import ContentRestricted -from ...utils.logger import Log -from .mpeg_dash import ManifestGenerator -from .quality import Quality -from .subtitles import Subtitles - -LOG = Log('usher', __file__) - - -class VideoInfo: - - def __init__(self, language='en-US', region='US'): - from ... import ACCESS_TOKEN_TV # pylint: disable=import-outside-toplevel - from ... import API_KEY_TV # pylint: disable=import-outside-toplevel - - self._access_token_tv = ACCESS_TOKEN_TV - self._api_key_tv = b64decode(API_KEY_TV).decode('utf-8') - self._language = language - self._region = region - self._itags = {} - - self.addon = xbmcaddon.Addon('script.module.tubed.api') - - @property - def language(self): - return self._language - - @property - def region(self): - return self._region - - @property - def headers(self): - return deepcopy(MOBILE_HEADERS.copy()) - - @property - def itags(self): - if not self._itags: - self._load_itags() - return self._itags - - def _load_itags(self): - filename = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'itags.json') - with xbmcvfs.File(filename, 'r') as itag_file: - self._itags = json.load(itag_file) - - @staticmethod - def generate_cpn(): - # https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L1381 - # LICENSE: The Unlicense - # cpn generation algorithm is reverse engineered from base.js. - # In fact it works even with dummy cpn. - cpn_alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_' - cpn = ''.join((cpn_alphabet[random.randint(0, 256) & 63] for _ in range(0, 16))) - return cpn - - @staticmethod - def make_curl_headers(headers, cookies=None): - output = '' - if cookies: - output += 'Cookie={all_cookies}'.format( - all_cookies=quote( - '; '.join('{0}={1}'.format(c.name, c.value) for c in cookies) - ) - ) - output += '&' - # Headers to be used in function 'to_play_item' of 'xbmc_items.py'. - output += '&'.join('{0}={1}'.format(key, quote(headers[key])) - for key in headers) - return output - - @staticmethod - def image_map(): - return [ - { - 'from': 'iurlhq', - 'to': 'high', - 'image': 'hqdefault.jpg' - }, - { - 'from': 'iurlmq', - 'to': 'medium', - 'image': 'mqdefault.jpg' - }, - { - 'from': 'iurlsd', - 'to': 'standard', - 'image': 'sddefault.jpg' - }, - { - 'from': 'thumbnail_url', - 'to': 'default', - 'image': 'default.jpg' - } - ] - - @staticmethod - def playability(status): - if ((status.get('fallback', True) and status.get('status', 'ok').lower() == 'ok') or - status.get('desktopLegacyAgeGateReason', 1) == 1): - return { - 'playable': True, - 'reason': '' - } - - if status.get('status') == 'LIVE_STREAM_OFFLINE': - reason = status.get('reason') - if not reason: - streamability = status.get('liveStreamability', {}) - renderer = streamability.get('liveStreamabilityRenderer', {}) - slate = renderer.get('offlineSlate', {}) - offline_slate_renderer = slate.get('liveStreamOfflineSlateRenderer', {}) - main_text = offline_slate_renderer.get('mainText', {}) - text_runs = main_text.get('runs', [{}]) - - reason_text = [] - for text in text_runs: - reason_text.append(text.get('text', '')) - - if reason_text: - reason = ''.join(reason_text) - else: - reason = status.get('reason') - - if 'errorScreen' in status and 'playerErrorMessageRenderer' in status['errorScreen']: - renderer = status['errorScreen']['playerErrorMessageRenderer'] - - descript_reason = renderer.get('subreason', {}).get('simpleText') - general_reason = renderer.get('reason', {}).get('simpleText') - - if descript_reason: - reason = descript_reason - elif general_reason: - reason = general_reason - - if not reason: - reason = 'UNKNOWN' - - try: - reason = reason.encode('raw_unicode_escape').decode('utf-8') - except: # pylint: disable=bare-except - pass - - LOG.error('Video is unplayable: %s' % reason) - return { - 'playable': False, - 'reason': reason - } - - def get_video(self, video_id, quality=None): # pylint: disable=too-many-locals, too-many-branches, too-many-statements - LOG.debug('Retrieving video information for %s' % video_id) - - headers = self.headers.copy() - - params = None - if self._access_token_tv: - headers['Authorization'] = 'Bearer %s' % self._access_token_tv - else: - params = { - 'key': self._api_key_tv - } - video_info_url = 'https://youtubei.googleapis.com/youtubei/v1/player' - # payload = {'videoId': video_id, - # 'context': {'client': {'clientVersion': '1.20210909.07.00', 'gl': self.region, - # 'clientName': 'WEB_CREATOR', 'hl': self.language}}} - - # payload = {'videoId': video_id, - # 'context': {'client': {'clientVersion': '16.05', 'gl': self.region, - # 'clientName': 'ANDROID', 'clientScreen': 'EMBED', - # 'hl': self.language}}} - - payload = { - 'videoId': video_id, - 'context': { - 'client': { - 'clientVersion': '16.05', - 'gl': self.region, - 'clientName': 'ANDROID', - 'hl': self.language - } - } - } - - player_response = {} - for attempt in range(2): - try: - response_payload = requests.post(video_info_url, params=params, - json=payload, headers=headers, - cookies=None, allow_redirects=True, - timeout=60) - response_payload.raise_for_status() - player_response = response_payload.json() - if player_response.get('playabilityStatus', {}).get('status', 'OK') == \ - 'AGE_CHECK_REQUIRED' and attempt == 0: - payload['context']['client']['clientScreen'] = 'EMBED' - continue - except: - error_message = 'Failed to get player response for video_id "%s"' % video_id - LOG.error(error_message + '\n' + traceback.format_exc()) - - raise ContentNoResponse(error_message) # pylint: disable=raise-missing-from - - # Make a set of URL-quoted headers to be sent to Kodi when requesting - # the stream during playback. The YT player doesn't seem to use any - # cookies when doing that, so for now cookies are ignored. - # curl_headers = self.make_curl_headers(headers, cookies) - curl_headers = self.make_curl_headers(headers, cookies=None) - - playability_status = player_response.get('playabilityStatus', {}) - - playback_tracking = player_response.get('playbackTracking', {}) - captions = player_response.get('captions', {}) - video_details = player_response.get('videoDetails', {}) - is_live_content = video_details.get('isLiveContent') is True - streaming_data = player_response.get('streamingData', {}) - - live_url = streaming_data.get('hlsManifestUrl', '') - is_live = is_live_content and live_url - - metadata = { - 'video': {}, - 'channel': {}, - 'images': {}, - 'subtitles': [] - } - - metadata['video']['id'] = video_details.get('videoId', video_id) - metadata['video']['title'] = video_details.get('title', '') - metadata['channel']['author'] = video_details.get('author', '') - metadata['channel']['id'] = video_details.get('channelId', '') - - for image_meta in self.image_map(): - image_url = 'https://i.ytimg.com/vi/{video_id}/{image}' \ - .format(video_id=video_id, image=image_meta['image']) - - if is_live: - image_url = image_url.replace('.jpg', '_live.jpg') - - metadata['images'][image_meta['to']] = image_url - - microformat = player_response.get('microformat', {}).get('playerMicroformatRenderer', {}) - metadata['video']['status'] = { - 'unlisted': microformat.get('isUnlisted', False), - 'private': video_details.get('isPrivate', False), - 'crawlable': video_details.get('isCrawlable', False), - 'family_safe': microformat.get('isFamilySafe', False), - 'live': is_live, - } - - status = self.playability(playability_status) - if not status['playable']: - raise ContentRestricted({ - 'error': 'content_restricted', - 'error_description': status['reason'], - 'code': '403' - }) - - metadata['subtitles'] = Subtitles(video_id, captions).retrieve() - - report = { - 'playback_url': '', - 'watchtime_url': '' - } - - playback_url = playback_tracking.get('videostatsPlaybackUrl', {}).get('baseUrl', '') - watchtime_url = playback_tracking.get('videostatsWatchtimeUrl', {}).get('baseUrl', '') - - if playback_url and playback_url.startswith('http'): - report['playback_url'] = ''.join([ - playback_url, - '&ver=2&fs=0&volume=100&muted=0', - '&cpn={cpn}'.format(cpn=self.generate_cpn()) - ]) - - if watchtime_url and watchtime_url.startswith('http'): - report['watchtime_url'] = ''.join([ - watchtime_url, - '&ver=2&fs=0&volume=100&muted=0', - '&cpn={cpn}'.format(cpn=self.generate_cpn()), - '&st={st}&et={et}&state={state}' - ]) - - stream_info = {} - - adaptive_formats = streaming_data.get('adaptiveFormats', []) - # standard_formats = streaming_data.get('formats', []) - - mpd_url = streaming_data.get('dashManifestUrl', '') - - license_data = { - 'url': None, - 'proxy': None, - 'token': None - } - - license_infos = streaming_data.get('licenseInfos', []) - for license_info in license_infos: - if license_info.get('drmFamily') == 'WIDEVINE': - license_data['url'] = license_info.get('url', '') - if license_data['url']: - license_data['proxy'] = 'http://127.0.0.1:%s/widevine||R{SSM}|' % self.addon \ - .getSettingInt('httpd.port') or 52520 - license_data['token'] = self._access_token_tv - break - - if not is_live: - if not quality: - quality = Quality('mp4') - - mpd_url, stream_info = \ - ManifestGenerator(self.itags, license_data).generate( - video_id, - adaptive_formats, - video_details.get('lengthSeconds', '0'), - quality - ) - - video_stream = { - 'url': mpd_url, - 'metadata': metadata, - 'headers': curl_headers, - 'license': license_data, - 'report': report - } - - if is_live: - video_stream['url'] = '&'.join([video_stream['url'], 'start_seq=$START_NUMBER$']) - video_stream.update(self.itags.get('9998')) - return video_stream - - if not stream_info: - video_stream.update(self.itags.get('9999')) - return video_stream - - has_video = (stream_info['video']['codec'] != '' and - int(stream_info['video']['bandwidth']) > 0) - if has_video: - video_stream.update(self.itags.get('9999')) - video_stream['video']['height'] = stream_info['video']['height'] - video_stream['video']['encoding'] = stream_info['video']['codec'] - else: - video_stream.update(self.itags.get('9997')) - - video_stream['audio']['encoding'] = stream_info['audio']['codec'] - if int(stream_info['audio'].get('bitrate', 0)) > 0: - video_stream['audio']['bitrate'] = int(stream_info['audio'].get('bitrate', 0)) - - if stream_info['video']['quality_label']: - video_stream['title'] = stream_info['video']['quality_label'] - return video_stream - - if has_video: - video_stream['title'] = '%sp%s' % \ - (stream_info['video']['height'], - stream_info['video']['fps']) - return video_stream - - video_stream['title'] = '%s@%s' % \ - (stream_info['audio']['codec'], - str(stream_info['audio'].get('bitrate', 0))) - - LOG.debug('Retrieved video information for %s: %s' % (video_id, video_stream)) - return video_stream diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/usher/resolver.py b/script.module.tubed.api/resources/lib/src/tubed_api/usher/resolver.py deleted file mode 100644 index dba71eaed..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/usher/resolver.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from .lib.quality import Quality -from .lib.video_info import VideoInfo - - -def resolve(video_id, quality=None, language='en-US', region='US'): - if not quality: - quality = Quality('mp4') - elif isinstance(quality, (int, str)): - quality = Quality(quality) - - video_info = VideoInfo(language, region) - video = video_info.get_video(video_id, quality) - - return video diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/utils/__init__.py b/script.module.tubed.api/resources/lib/src/tubed_api/utils/__init__.py deleted file mode 100644 index af8fcabec..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/utils/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -__all__ = ['logger', 'time'] diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/utils/logger.py b/script.module.tubed.api/resources/lib/src/tubed_api/utils/logger.py deleted file mode 100644 index 6c47a2e1f..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/utils/logger.py +++ /dev/null @@ -1,185 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -import logging -import os - -try: - import xbmc -except ImportError: - xbmc = None - -LOGGER_NAME = 'script.module.tubed.api' - - -class Log: - def __init__(self, package='', module='', filename=''): - """ - A simple logger for logging to the Kodi log, Console or a separate Log file - - :param package: name of the calling package if relevant - :type package: str - :param module: name of the calling module if relevant - :type module: str - :param filename: filename and path of log file if logging to file is desired - :type filename: str - """ - self._package = package - - module = os.path.basename(module) - self._module = module.replace('.pyo', '').replace('.pyc', '').replace('.py', '') - - self._filename = filename - - if xbmc: - self._log = xbmc.log - else: - self._create_logger() - - def info(self, message): - """ - Log at `Info` level - :param message: message to log - :type message: [str, bytes] - """ - message = self._decode_message(message) - if xbmc: - message = self._format_message(message) - self._log(message, xbmc.LOGINFO) - else: - self._log.info(message) - - def debug(self, message): - """ - Log at `Debug` level - :param message: message to log - :type message: [str, bytes] - """ - message = self._decode_message(message) - if xbmc: - message = self._format_message(message) - self._log(message, xbmc.LOGDEBUG) - else: - self._log.debug(message) - - def warning(self, message): - """ - Log at `Warning` level - :param message: message to log - :type message: [str, bytes] - """ - message = self._decode_message(message) - if xbmc: - message = self._format_message(message) - self._log(message, xbmc.LOGWARNING) - else: - self._log.debug(message) - - def error(self, message): - """ - Log at `Error` level - :param message: message to log - :type message: [str, bytes] - """ - message = self._decode_message(message) - if xbmc: - message = self._format_message(message) - self._log(message, xbmc.LOGERROR) - else: - self._log.error(message) - - def critical(self, message): - """ - Log at `Critical/Fatal` level - :param message: message to log - :type message: [str, bytes] - """ - message = self._decode_message(message) - if xbmc: - message = self._format_message(message) - self._log(message, xbmc.LOGFATAL) - else: - self._log.critical(message) - - @staticmethod - def _decode_message(message): - """ - If message is `bytes` decode and return - :param message: message to decode - :type message: [str, bytes] - :return: decoded message - :rtype: str - """ - if isinstance(message, bytes): - message = message.decode('utf-8') - - return message - - def _format_message(self, message): - """ - Format the log message for Kodi - :param message: log message to format - :type message: str - :return: log message with log leaders added - :rtype: str - """ - if self._package and not self._module: - return '[%s][%s] %s' % (LOGGER_NAME, self._package, message) - - if not self._package and self._module: - return '[%s][%s] %s' % (LOGGER_NAME, self._module, message) - - if self._package and self._module: - return '[%s][%s][%s] %s' % (LOGGER_NAME, self._package, self._module, message) - - return '[%s] %s' % (LOGGER_NAME, message) - - def _create_logger(self): - """ - Create a python logger - Creates a file based logger if a filename was provided, otherwise use console based logging - """ - self._log = logging.getLogger(LOGGER_NAME) - - self._log.setLevel(logging.DEBUG) - self._log.propagate = False - - formatter = self._get_formatter() - - if not self._filename: - handler = logging.StreamHandler() - - else: - handler = logging.handlers.RotatingFileHandler(self._filename, - encoding='utf-8', mode="w") - handler.setLevel(logging.DEBUG) - handler.setFormatter(formatter) - self._log.addHandler(handler) - - def _get_formatter(self): - """ - Get formatter for python logging - :return: formatter for python logging - :rtype: logging.Formatter - """ - fmt_lead = '%(asctime)s-[%(levelname)s]' - fmt_tail = ' %(message)s' - fmt = '[%(name)s]' - - if self._package and not self._module: - fmt = '[%s]' % self._package - - elif not self._package and self._module: - fmt = '[%s][%s]' % ('%(name)s', self._module) - - elif self._package and self._module: - fmt = '[%s][%s]' % (self._package, self._module) - - return logging.Formatter(fmt.join([fmt_lead, fmt_tail])) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/utils/time.py b/script.module.tubed.api/resources/lib/src/tubed_api/utils/time.py deleted file mode 100644 index 1351f502d..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/utils/time.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -import time -from datetime import datetime - -now = datetime.now - - -def strptime(timestamp, timestamp_format): - import _strptime # pylint: disable=import-outside-toplevel - try: - time.strptime('01 01 2012', '%d %m %Y') - finally: - return time.strptime(timestamp, timestamp_format) # pylint: disable=lost-exception - - -def timestamp_diff(timestamp): - try: - then = datetime(*(strptime(timestamp, '%Y-%m-%d %H:%M:%S.%f')[0:6])) - except ValueError: - then = datetime(*(strptime(timestamp, '%Y-%m-%d %H:%M:%S')[0:6])) - - delta = now() - then - - return delta.total_seconds() diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/__init__.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/__init__.py deleted file mode 100644 index cce945760..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from .api import activities -from .api import captions -from .api import channel_banners -from .api import channel_sections -from .api import channels -from .api import comment_threads -from .api import comments -from .api import guide_categories -from .api import i18n_languages -from .api import i18n_regions -from .api import members -from .api import membership_levels -from .api import playlist_items -from .api import playlists -from .api import search -from .api import subscriptions -from .api import thumbnails -from .api import video_abuse_report_reasons -from .api import video_categories -from .api import videos -from .api import watermarks - -__all__ = ['activities', 'captions', 'channel_banners', 'channel_sections', - 'channels', 'comment_threads', 'comments', 'guide_categories', - 'i18n_languages', 'i18n_regions', 'members', 'membership_levels', - 'playlist_items', 'playlists', 'search', 'subscriptions', - 'thumbnails', 'video_abuse_report_reasons', 'video_categories', 'videos', - 'watermarks'] - -__all__ += ['query', 'request_handler'] diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/__init__.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/__init__.py deleted file mode 100644 index 0092e6196..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -__all__ = ['activities', 'captions', 'channel_banners', 'channel_sections', - 'channels', 'comment_threads', 'comments', 'guide_categories', - 'i18n_languages', 'i18n_regions', 'members', 'membership_levels', - 'playlist_items', 'playlists', 'search', 'subscriptions', - 'thumbnails', 'video_abuse_report_reasons', 'video_categories', 'videos', - 'watermarks'] diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/activities.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/activities.py deleted file mode 100644 index 48f1d3ce7..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/activities.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/activities/list -@query -def get(parameters=None): - return V3Query('get', 'activities', parameters=parameters) - - -# deprecated -# https://developers.google.com/youtube/v3/docs/activities/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'activities', parameters=parameters, data=data) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/captions.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/captions.py deleted file mode 100644 index 6c07a2091..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/captions.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/captions/list -@query -def get(parameters=None): - return V3Query('get', 'captions', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/captions/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'captions', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/captions/update -@query -def update(parameters=None, data=None): - return V3Query('put', 'captions', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/captions/download -@query -def download(caption_id, parameters=None): - return V3Query('get', 'captions/{id}'.format(id=caption_id), parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/captions/delete -@query -def delete(parameters=None): - return V3Query('delete', 'captions', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channel_banners.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channel_banners.py deleted file mode 100644 index 29d6d47ad..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channel_banners.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/channelBanners/insert -@query -def insert(parameters=None): - return V3Query('post', 'channelBanners', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channel_sections.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channel_sections.py deleted file mode 100644 index 7508ae796..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channel_sections.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/channelSections/list -@query -def get(parameters=None): - return V3Query('get', 'channelSections', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/channelSections/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'channelSections', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/channelSections/update -@query -def update(parameters=None, data=None): - return V3Query('put', 'channelSections', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/channelSections/delete -@query -def delete(parameters=None): - return V3Query('delete', 'channelSections', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channels.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channels.py deleted file mode 100644 index 4df9cbe73..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/channels.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/channels/list -@query -def get(parameters=None): - return V3Query('get', 'channels', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/channels/update -@query -def update(parameters=None, data=None): - return V3Query('put', 'channels', parameters=parameters, data=data) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/comment_threads.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/comment_threads.py deleted file mode 100644 index 3ad42c868..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/comment_threads.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/commentThreads/list -@query -def get(parameters=None, unauthorized=False): - return V3Query('get', 'commentThreads', parameters=parameters, unauthorized=unauthorized) - - -# https://developers.google.com/youtube/v3/docs/commentThreads/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'commentThreads', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/commentThreads/update -@query -def update(parameters=None, data=None): - return V3Query('put', 'commentThreads', parameters=parameters, data=data) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/comments.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/comments.py deleted file mode 100644 index 7e028f6c2..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/comments.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/comments/list -@query -def get(parameters=None, unauthorized=False): - return V3Query('get', 'comments', parameters=parameters, unauthorized=unauthorized) - - -# https://developers.google.com/youtube/v3/docs/comments/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'comments', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/comments/update -@query -def update(parameters=None, data=None): - return V3Query('put', 'comments', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/comments/markAsSpam -@query -def mark_as_spam(parameters=None): - return V3Query('post', 'comments/markAsSpam', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/comments/setModerationStatus -@query -def set_moderation_status(parameters=None): - return V3Query('post', 'comments/setModerationStatus', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/comments/delete -@query -def delete(parameters=None): - return V3Query('delete', 'comments', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/guide_categories.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/guide_categories.py deleted file mode 100644 index 4ab2c9f9e..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/guide_categories.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# deprecated -# https://developers.google.com/youtube/v3/docs/guideCategories/list -@query -def get(parameters=None): - return V3Query('get', 'guideCategories', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/i18n_languages.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/i18n_languages.py deleted file mode 100644 index 81ad08a43..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/i18n_languages.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/i18nLanguages/list -@query -def get(parameters=None): - return V3Query('get', 'i18nLanguages', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/i18n_regions.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/i18n_regions.py deleted file mode 100644 index 4eba78985..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/i18n_regions.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/i18nRegions/list -@query -def get(parameters=None): - return V3Query('get', 'i18nRegions', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/members.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/members.py deleted file mode 100644 index 8fa36cf6d..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/members.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/members/list -@query -def get(parameters=None): - return V3Query('get', 'members', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/membership_levels.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/membership_levels.py deleted file mode 100644 index 686a862fc..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/membership_levels.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/membershipsLevels/list -@query -def get(parameters=None): - return V3Query('get', 'membershipsLevels', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/playlist_items.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/playlist_items.py deleted file mode 100644 index 6fab0106a..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/playlist_items.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/playlistItems/list -@query -def get(parameters=None): - return V3Query('get', 'playlistItems', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/playlistItems/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'playlistItems', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/playlistItems/update -@query -def update(parameters=None, data=None): - return V3Query('put', 'playlistItems', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/playlistItems/delete -@query -def delete(parameters=None): - return V3Query('delete', 'playlistItems', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/playlists.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/playlists.py deleted file mode 100644 index e9dcb2306..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/playlists.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/playlists/list -@query -def get(parameters=None): - return V3Query('get', 'playlists', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/playlists/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'playlists', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/playlists/update -@query -def update(parameters=None, data=None): - return V3Query('put', 'playlists', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/playlists/delete -@query -def delete(parameters=None): - return V3Query('delete', 'playlists', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/search.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/search.py deleted file mode 100644 index f499baca8..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/search.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/search/list -@query -def get(parameters=None): - return V3Query('get', 'search', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/subscriptions.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/subscriptions.py deleted file mode 100644 index 1894e7813..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/subscriptions.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/subscriptions/list -@query -def get(parameters=None): - return V3Query('get', 'subscriptions', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/subscriptions/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'subscriptions', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/subscriptions/delete -@query -def delete(parameters=None): - return V3Query('delete', 'subscriptions', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/thumbnails.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/thumbnails.py deleted file mode 100644 index 3e846e29d..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/thumbnails.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/thumbnails/set -@query -def upload(parameters=None, data=None): - return V3Query('post', 'thumbnails/set', parameters=parameters, data=data) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/video_abuse_report_reasons.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/video_abuse_report_reasons.py deleted file mode 100644 index 8ecadf60f..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/video_abuse_report_reasons.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/videoAbuseReportReasons/list -@query -def get(parameters=None): - return V3Query('get', 'videoAbuseReportReasons', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/video_categories.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/video_categories.py deleted file mode 100644 index 8934ecfab..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/video_categories.py +++ /dev/null @@ -1,18 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/videoCategories/list -@query -def get(parameters=None): - return V3Query('get', 'videoCategories', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/videos.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/videos.py deleted file mode 100644 index c4b0839cc..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/videos.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/videos/list -@query -def get(parameters=None): - return V3Query('get', 'videos', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/videos/insert -@query -def insert(parameters=None, data=None): - return V3Query('post', 'videos', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/videos/update -@query -def update(parameters=None, data=None): - return V3Query('put', 'videos', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/videos/rate -@query -def rate(parameters=None): - return V3Query('post', 'videos/rate', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/videos/getRating -@query -def get_rating(parameters=None): - return V3Query('get', 'videos/getRating', parameters=parameters) - - -# https://developers.google.com/youtube/v3/docs/videos/reportAbuse -@query -def report_abuse(parameters=None, data=None): - return V3Query('post', 'videos/reportAbuse', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/videos/delete -@query -def delete(parameters=None): - return V3Query('delete', 'videos', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/watermarks.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/watermarks.py deleted file mode 100644 index fe78d48c2..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/api/watermarks.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from ..query import V3Query -from ..query import query - - -# https://developers.google.com/youtube/v3/docs/watermarks/set -@query -def upload(parameters=None, data=None): - return V3Query('post', 'watermarks/set', parameters=parameters, data=data) - - -# https://developers.google.com/youtube/v3/docs/watermarks/unset -@query -def delete(parameters=None): - return V3Query('post', 'watermarks/unset', parameters=parameters) diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/query.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/query.py deleted file mode 100644 index 3ec5aacd2..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/query.py +++ /dev/null @@ -1,150 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from copy import deepcopy - -from ..exceptions import ResourceUnavailable -from ..utils.logger import Log -from .request_handler import v3_request - -LOG = Log('v3', __file__) - - -class Query: - _base_url = '' - - def __init__(self, method, path, parameters=None, data=None, headers=None): - log_headers = deepcopy(headers) - log_parameters = deepcopy(parameters) - - if 'Authorization' in log_headers: # hide user's access token - log_headers['Authorization'] = '*' * 16 - - if 'key' in log_parameters: # hide api key - if len(log_parameters['key']) >= 20: - log_parameters['key'] = '****%s%s%s****' % \ - (log_parameters['key'][4:8], - '*' * (len(log_parameters['key']) - 16), - log_parameters['key'][-8:-4]) - else: - log_parameters['key'] = '*' * 16 - - LOG.debug('Initializing query: %s | %s | %s | %s | %s |' % - (method.upper(), path, log_parameters, data, log_headers)) - - if parameters is None: - parameters = {} - - if data is None: - data = {} - - if headers is None: - headers = {} - - self._method = method - self._url = self._base_url + path.lstrip('/') - self._parameters = parameters - self._data = data - self._headers = headers - - @property - def url(self): - return self._url - - @property - def headers(self): - return self._headers - - @property - def data(self): - return self._data - - @property - def parameters(self): - return self._parameters - - @property - def method(self): - return self._method - - def __str__(self): - return '{method}: {url}, {params}, {data}, {headers}' \ - .format(method=self.method.upper(), url=self.url, params=self.parameters, - data=self.data, headers=self.headers) - - def invoke(self, func): - try: - return func(self.method, self.url, self.parameters, self.data, self.headers) - except Exception as error: - raise ResourceUnavailable({ - 'error': 'resource_unavailable', - 'error_description': str(self), - 'code': '500' - }).with_traceback(error.__traceback__) - - -class V3Query(Query): - _base_url = 'https://www.googleapis.com/youtube/v3/' - - def __init__(self, method, path, parameters=None, data=None, headers=None, unauthorized=False): - # pylint: disable=import-outside-toplevel - - if parameters is None: - parameters = {} - else: - parameters = deepcopy(parameters) - - if headers is None: - headers = {} - else: - headers = deepcopy(headers) - - from .. import ACCESS_TOKEN - from .. import API_KEY - from .. import HTTP_REFERRER - - if API_KEY: - parameters.update({ - 'key': API_KEY - }) - - headers.update({ - 'Host': 'www.googleapis.com', - 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ' - '(KHTML, like Gecko) Chrome/39.0.2171.36 Safari/537.36', - 'Accept-Encoding': 'gzip, deflate' - }) - - if HTTP_REFERRER: - headers['Referer'] = HTTP_REFERRER - - if method.lower() == 'post': - headers.update({ - 'Content-Type': 'application/json' - }) - - if ACCESS_TOKEN and not unauthorized: - headers.update({ - 'Authorization': 'Bearer {access_token}'.format(access_token=ACCESS_TOKEN) - }) - - super().__init__(method, path, parameters, data, headers) - - def invoke(self, *args, **kwargs): # pylint: disable=unused-argument - return super().invoke(v3_request) - - -def query(obj): - def wrapper(*args, **kwargs): - LOG.debug('Initiating query: %s | %s |' % (args, kwargs)) - qry = obj(*args, **kwargs) - return qry.invoke() - - return wrapper diff --git a/script.module.tubed.api/resources/lib/src/tubed_api/v3/request_handler.py b/script.module.tubed.api/resources/lib/src/tubed_api/v3/request_handler.py deleted file mode 100644 index ff976eca5..000000000 --- a/script.module.tubed.api/resources/lib/src/tubed_api/v3/request_handler.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -""" - Copyright (C) 2020 Tubed API (script.module.tubed.api) - - This file is part of script.module.tubed.api - - SPDX-License-Identifier: GPL-2.0-only - See LICENSES/GPL-2.0-only.txt for more information. -""" - -from requests import Session -from requests.adapters import HTTPAdapter - - -def _status_response(response): - if 200 <= response.status_code < 300: - payload = { - 'error': { - 'message': 'v3 Data API request was successful', - 'errors': [{ - 'reason': 'v3RequestSucceeded' - }], - 'code': response.status_code - } - } - - else: - payload = { - 'error': { - 'message': 'v3 Data API request failed', - 'errors': [{ - 'reason': 'v3RequestFailed' - }], - 'code': response.status_code - } - } - - return payload - - -def v3_request(method, url, parameters, data, headers): - adapter = HTTPAdapter(max_retries=3) - session = Session() - - session.mount('http://', adapter) - session.mount('https://', adapter) - - if data and isinstance(data, dict): - response = getattr(session, method)(url, params=parameters, json=data, - headers=headers, timeout=(2, 60)) - else: - response = getattr(session, method)(url, params=parameters, data=data, - headers=headers, timeout=(2, 60)) - - response.encoding = 'utf-8' - - try: - return response.json() - except ValueError: - return _status_response(response) diff --git a/script.module.tubed.api/resources/media/fanart.jpg b/script.module.tubed.api/resources/media/fanart.jpg deleted file mode 100644 index 6fa3d5bdd818d3c7b3f1ecfa44524ec62e010bbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457244 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

3Zg8|wV`$GYHxp~J6_cIM1+HEUI& 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 diff --git a/script.module.tubed.api/resources/media/icon.png b/script.module.tubed.api/resources/media/icon.png deleted file mode 100644 index efdb3f7ad214d0723d7f3ca2937681935be182bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37924 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

IQW0wM5@F_-s%!A}v@FW%H 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 Y7Eba{{x*8P0D%w1(aqtC-8XUn1p-I#5C8xG diff --git a/script.module.tubed.api/resources/settings.xml b/script.module.tubed.api/resources/settings.xml deleted file mode 100644 index 27a45b6a8..000000000 --- a/script.module.tubed.api/resources/settings.xml +++ /dev/null @@ -1,25 +0,0 @@ - - -

- - - - 0 - 52520 - - 30002 - - - - - - - - 0 - false - - - - -
- diff --git a/script.plexmod/.gitignore b/script.plexmod/.gitignore new file mode 100644 index 000000000..59f60a7f6 --- /dev/null +++ b/script.plexmod/.gitignore @@ -0,0 +1,3 @@ +/fixRepo.py +/resources/skins/Main/TexturePacker.exe +/resources/skins/Main/packtex.bat diff --git a/screensaver.picture.slideshow/LICENSE.txt b/script.plexmod/LICENSE.txt similarity index 61% rename from screensaver.picture.slideshow/LICENSE.txt rename to script.plexmod/LICENSE.txt index 4f8e8eb30..6bcffb461 100644 --- a/screensaver.picture.slideshow/LICENSE.txt +++ b/script.plexmod/LICENSE.txt @@ -280,3 +280,213 @@ POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS ------------------------------------------------------------------------- + + +Some of this code has been modified from the PlexApi written by Michael Shepanski + +https://github.com/mjs7231/python-plexapi + +The license for that code follows: + +Copyright (c) 2010, Michael Shepanski +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name conky-pkmeter nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------------------------------------------------------------------------- + +https://github.com/ValentinBELYN/icmplib + +GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + + +------------------------------------------------------------------------- +Fontawesome +https://fontawesome.com/license/free +CC BY 4.0 License: https://creativecommons.org/licenses/by/4.0/# diff --git a/script.plexmod/README.md b/script.plexmod/README.md new file mode 100644 index 000000000..317bd7cab --- /dev/null +++ b/script.plexmod/README.md @@ -0,0 +1,33 @@ +# PlexMod (for Kodi) + +This is a modification of the official open-source Plex client for Kodi "plex-for-kodi" (Plex4Kodi) semi-maintained by me (pannal). + +Contrary to how this repository was handled before, this client does _not_ claim to adhere to the Plex Inc. design guidelines, all the time. + +It implements features that are not implemented in other official Plex clients and may implement others in non-conform ways. + +It is still based off of the original P4K source and critical bugfixes will be PR'd back. + +## Active branches +* [develop-kodi21](https://github.com/pannal/plex-for-kodi/tree/develop_kodi21) (Kodi 19, 20, 21 cross-compatible) +* [develop-kodi18](https://github.com/pannal/plex-for-kodi/tree/develop_kodi18) (legacy) + +Master branch is based off of the official plex-for-kodi master branch. + +## Installation + +### Via repository +* Add `https://pannal.github.io/dontpanickodi/` to your Kodi installation as a file source +* Go back to addons, choose zip file, choose the file source you added and install the repository +* Install Plex via Addons->Install from repository->Don’t Panic->Video add-ons->Plex +* Optional, recommended: Install Plextuary via Addons->Install from repository->Don’t Panic->Look and Feel->Skin->Plextuary + +### Manual +* Checkout any branch of this GitHub repository, rename to `script.plexmod` and use as an addon + + +## Help/Bug Reports +https://forums.plex.tv/t/plexmod-for-kodi-18-19-20-21/481208 + +## License +[LICENSE](https://github.com/plexinc/plex-for-kodi/blob/master/LICENSE.txt) diff --git a/script.plexmod/TESTING_SQUAD.md b/script.plexmod/TESTING_SQUAD.md new file mode 100644 index 000000000..12506a8e3 --- /dev/null +++ b/script.plexmod/TESTING_SQUAD.md @@ -0,0 +1,2 @@ +## The Squad (TM) +@sonofdibnah @ecsjjgg @Unknown3899 @THGhost @bowlingbeeg @Buttzy10169 diff --git a/script.plexmod/addon.xml b/script.plexmod/addon.xml new file mode 100644 index 000000000..f004d249e --- /dev/null +++ b/script.plexmod/addon.xml @@ -0,0 +1,49 @@ + + + + + + + + + + video + + + executable + + + + PlexMod for Kodi + Unofficial Plex for Kodi add-on + GPL-2.0-only + https://forums.plex.tv/t/plexmod-for-kodi-18-19-20-21/481208 + https://www.plex.tv + https://github.com/pannal/plex-for-kodi + all + +- Fix: certain home hubs were limited to 10 items without pagination +- Fix: very rare infinite playback loop with enabled embedded subtitles (thanks @florinvlaicu for reporting) +- Fix: Partially fix issues when switching audio streams during Transcoded/DirectStream playback +- Fix: Fix error in ExtendHubTask +- Fix: Partially revert "Home: Increase section change timeout from 0.3s to 0.5s; re-jig section change handling to allow using ENTER/SELECT to immediately select a section below 0.5s wait time" due to instability +- Fix: Fix a couple of SyntaxWarnings for invalid escape sequences +- Fix: Unfocusable buttons throw focus errors occasionally on shutdown +- Fix: Laggy UI after playback/5 minutes due to requesting certain hubs without limits applied. Drastically improving UI smoothness even for smaller hubs (below 1000 items) + This also fixes crash and shutdown issues and by proxy should enable everyone to use a poster resolution scale of at least 200%. +- Fix: Depending on the situation, the home hubs update request could be sent multiple times while waiting for the first one to finish. (thanks @bowlingbeeg) +- Subtitles: Supply OpenSubtitles.com hash if possible and enabled +- Subtitles: Add setting to Audio/Subtitles to calculate the OpenSubtitles.com hash (default: off) +- Core: Advanced Settings: make default resolution scale a percentage; limit to 750% max (based on Plex max poster size) +- Core: Add more debug logging for player events +- Core: Add more debug logging details for hub refresh events + + + icon.png + fanart.jpg + + + diff --git a/script.plexmod/changelog.txt b/script.plexmod/changelog.txt new file mode 100644 index 000000000..825da958f --- /dev/null +++ b/script.plexmod/changelog.txt @@ -0,0 +1,655 @@ +[- 0.7.3-rev2 -] +- Fix: certain home hubs were limited to 10 items without pagination +- Fix: very rare infinite playback loop with enabled embedded subtitles (thanks @florinvlaicu for reporting) +- Fix: Partially fix issues when switching audio streams during Transcoded/DirectStream playback +- Fix: Fix error in ExtendHubTask +- Fix: Partially revert "Home: Increase section change timeout from 0.3s to 0.5s; re-jig section change handling to allow using ENTER/SELECT to immediately select a section below 0.5s wait time" due to instability +- Fix: Fix a couple of SyntaxWarnings for invalid escape sequences +- Fix: Unfocusable buttons throw focus errors occasionally on shutdown +- Fix: Laggy UI after playback/5 minutes due to requesting certain hubs without limits applied. Drastically improving UI smoothness even for smaller hubs (<1000 items) + This also fixes crash and shutdown issues and by proxy should enable everyone to use a poster resolution scale of at least 200%. +- Fix: Depending on the situation, the home hubs update request could be sent multiple times while waiting for the first one to finish. (thanks @bowlingbeeg) +- Subtitles: Supply OpenSubtitles.com hash if possible and enabled +- Subtitles: Add setting to Audio/Subtitles to calculate the OpenSubtitles.com hash (default: off) +- Core: Advanced Settings: make default resolution scale a percentage; limit to 750% max (based on Plex max poster size) +- Core: Add more debug logging for player events +- Core: Add more debug logging details for hub refresh events + + +[- 0.7.2 -] +- Fix: playing next episode when episode played threshold was met when hitting STOP button +- Fix: Dropdown would roundrobin falsely onup item when initial item wasn't item 0 +- Fix: Movies: pressing back in a scrolled movie view with the header options open wouldn't back out properly +- Fix: Reset library filters when Role/Cast view opened +- Fix: Cast display in movies/preplay +- Fix: Apply dialog flicker fix in Role/Cast +- Fix: Dropdowns were broken sometimes (especially library view) +- Fix: Addon crash on non-default Kodi (e.g. OSMC) due to System.BuildVersion not matching Kodi's default +- Fix: Error on no data returned on PlexObject.reload (disconnect); Handle connection errors more gracefully +- Fix: Background of info page (thanks @bowlingbeeg) +- Fix: Rare SeekDialog crashes between episodes +- Fix: OpenSubtitles not finding subtitles for certain Movies + +- Core: Harden against network disconnects in multiple views, home and videoplayer/seekdialog +- Core: Re-enable backing out of videoplayer (inbetween screen) +- Core: Player: Alternative implementation of bingeMode auto-next; ignore stop events when triggering non-user-stop +- Core: Add setting for poster/thumbnail resolution scaling, implement everywhere sensible +- Core: Thumbnails/Art: use the same parameters as PlexWeb for images +- SeekDialog: Possible fix for OSD not coming up again in some scenarios + + +[- 0.7.1 -] +- Fix: Embedded subtitle could be set to the wrong one (edge case) +- Fix: Episodes: theme music error when clicking on seasons +- Possibly fix rare traceback when closing an episodes window while waiting for an episode reload task +- Fix: Core: only stop playback on screensaver if player is playing video (not audio, ...) +- Fix: rare UI crash for items before 1970-01-02 (yes, we've had media back then) + +- Set Accept-Language to Kodi's language setting when talking to the Plex Server, localizes subtitle titles, Library translations etc. +- Use extended title for subtitles (and add advanced/addon setting) +- Add: Show buffer state in stream info +- Reduce dialog flickering in certain situations (not fully, probably impossible) +- Player: bingeMode/autoskip credits/manual-next: avoid double-next in certain circumstances +- VideoPlayer: don't react to inputs while waiting for playback (AVStarted) to start (fixes early-back-out-crashes) +- SeekDialog: stop marker countdown on seek +- SeekDialog: auto-skip marker: ignore input while auto skipping to next video +- SeekDialog: only count down marker when OSD not shown +- SeekDialog: ignore input while handling next-video-pressed +- SeekDialog: hide OSD fast on ACTION_PAUSE/ACTION_PLAYER_PLAY/ACTION_PLAYER_PLAYPAUSE and OSD is shown +- Player/SeekDialog: Fix crash when handling SIGINT (alt+f4 on windows) +- Hubs: make all TV/movie hubs as hub types that receive updates after items being watched or marked (un) watched +- Settings: Disable alternative home hubs refresh by default +- ServerList: further hardening, list shouldn't visually "crash" anymore in certain conditions +- Pagination/Episodes: allow right round-robin on paginated long item lists (>26) +- Movies: Reorder Cast/Related/Extras according to PlexWeb +- Movies: Add reviews +- Cast: Increase Cast picture quality everywhere +- Core/Settings: Adjust recommended cache/buffer/readfactor values for different Kodi versions, starting with 21.0-BETA2 (20.90.821) +- Core/Settings: Incorporate new Kodi cache/readfactor values; clamp cache values to divisible by 16 +- Serverlist: allow roundrobin at the bottom boundary +- StreamInfo: hide OSD after closing streaminfo +- Settings: Add setting to use Kodi keyboard for searching (default: off) +- Main: harden main loop (still not exiting properly when exiting fast after server change; reinits previously inited windows on exit, sometimes) +- SubtitleDownload/OpenSubtitles.com: set global videoinfo infoLabels to improve subtitle search hinting (waiting for PR to be accepted) + + +[- 0.7.0 -] +- Fix kiosk mode startup issue when other modal dialogs were active when PM4K was trying to start in kiosk mode +- Fix video OSD hiding too fast in certain circumstances +- Fix photoplayer issues; skip ugly initial loading image; show loading state only when it takes longer than 500ms; fix prev/next not always working; increase speed by x10 +- Fix episodes view replaying the theme music when returning from a different-season-view +- Fix mediaBufferSize reported to the Plex MDE endpoint was always empty (resulting in Plex assuming we only have 5 MB cache, leading to all sorts of buffer issues) +- Fix pin entry with J characters looking like an uppercase i +- Fix episode regularly ending in bingeMode (not credits skipped) still showing post play +- Fix enabled subtitles always leading to a transcode (and subtitle burn-in) of the video stream in DirectStream scenarios +- Fix player UI for transcoded/DirectStream sessions + +- UI: background/transition/rendering core rework, reducing flickering, "bouncy" background fades, improving overall snappiness of the interface (dialog transition flicker not solved) +- UI: remove the [...]-loading-spinner for everything that takes under 500ms, making the UI more natural +- UI: crossfade backgrounds before entering a view, if possible, reducing the animation load between view transitions +- UI: support more elements as background-providers (e.g. photos) +- Add advanced/plugin setting to enable/disable background crossfading altogether +- Add setting to stop video playback when screensaver (Kodi) is activated +- Add setting to stop video playback after a set idle time +- Increase home section change timeout from 0.3s to 0.5s and allow immediate section selection using ENTER + +- Completely rework the AC3 handling, allowing to select in which channel configurations one wants to transcode to AC3 +- Allow subtitles to be DirectStreamed; resulting in possibly ONLY the audio being transcoded +- Add setting to burn in SSA/ASS subtitles when DirectStreaming. When disabled, they're converted to raw text and DirectStreamed, if enabled (previous default), they lead to the video stream being transcoded +- Enable markers (intro/credits) functionality in transcoded/DirectStream sessions +- Harden chapter selection logic in player UI +- SeekDialog: Unify time formatting as much as possible between transcoded and directplay modes +- Add setting to allow or deny auto-skip functionality when transcoding/DirectStreaming +- Movies preplay: raise the ratings up by 70 pixels to be in line with the title, fixes issues with certain skins +- Core: improve skin compatibility: font30 is no more as we're not using Confluence but Estuary as default. Replace with its fallback, font13 +- Core: improve skin compatibility: font16 is no more as we're not using Confluence but Estuary as default. Replace with its fallback, font13 +- Core: allow DirectStreaming of webvtt subtitles in Kodi >= 20 +- AdvancedSettings: reset background blur and opacity to their new defaults +- BGM: store last "good" audio volume before playing theme music, and apply it upon start of the addon, in case the volume reset after BGM failed/was skipped +- Core: Harden and speed up server change + + +[- 0.6.5+rev5 -] +- Add support for urllib3 >= 2.1.0 + + +[- 0.6.5+rev4 -] +- Fix dropdown roundrobin needing two UPs if first selected item is item 0, introduced in 0.6.5 +- Theme music: Harden BGM handler; wait for correct volume to be re-set, might fix not-so-rare stale volume issue +- Episodes: Show TV Show's other seasons in episodes window + + +[- 0.6.5 -] +- Fix rare postplay still shown on bingemode/autoskip credits +- Fix quick subtitle selection when override forced advanced setting is active +- Fix rare round robin case skipping item 0 onup in dropdowns +- Fix episode progress and time remaining not updating (thanks @bowlingbeeg) +- Fix embedded subtitle display delay when Cycling/using buttons to switch subtitles +- Fix rare subtitles not shown issue + +- Add: Allow video player UI buttons customization via settings; remove a couple of player navbar buttons by default +- Add "Previous Subtitle" to quick subtitles nav item +- Remember subtitle actions (prev, next, download, delay) via quick nav +- Use our own CycleSubtitles/ShowSubtitles implementation; +- Rely even less on Kodi's Player states for subtitles +- Parse and show SDH/HI flag for subtitle streams +- Hide OSD faster after closing settings; try hiding OSD faster in general if necessary +- Lose orange fallback BG on userselect as well by default +- Settings: rename Player to Player UI, rename Player (user-specific) to Playback (user-specific) +- Settings: Move forced subtitles fix from plugin settings to settings interface audio/subtitles +- Store last background URL in settings if dynamic backgrounds is active; use last BG url on startup to prevent blank BG +- Reduce embedded subtitle display backseek to 100ms +- Use episode thumbnails in continue hub if available, by default; add advanced setting +- Set default background blur to 0 (was 4), background opacity to 20 (was 30) +- Disable legacy background image fallback by default; add advanced setting +- Core improvements + + +[- 0.6.4 -] +- Fix preplay mediachoice issues +- Fix seeking with auto-skip scenarios on slower devices +- Fix online/trailer quality issues (was always using a low quality before) +- Fix round-robining in episode view +- Fix Kodi 18 +- Fix some rare Kodi playback errors in logs, mostly cosmetic +- Fix player sometimes not sending the last timeline state after playback ends +- Fix playback issues when multiple versions exist but one of them is missing +- Fix embedded subtitle display delays on playback start and on subtitle change while playing back (backseeks 1 second) +- Fix double-back-button necessary to exit when cancelling autoskip +- Fix chapters not showing when no markers present +- Fix User Pin entry not showing errors +- Fix reactivating addon after minimize +- Fix autoskip marker continuing to count down when paused; don't hide autoskip marker when paused + +- Add support for multiple media versions and fix individual stream selection support +- Add support for stream selection in trailers/extras +- Add current cache/buffer state to progress bar +- Add video/audio/subtitle stream selection for trailers +- Add zero drift playback timers for current time, time left, ends at +- Add minimize option to exit +- Add playback settings manager to enable full settings per TV show instead of just binge mode toggle; +- Add slow connection support (e.g. in a hotel); waits for the buffer to fill to a reasonable amount until playback; sets readfactor to 20 (don't use with passthrough) +Migrate previous binge mode data to new extensible format, stored as addon_data/playback_settings.json + +- Player: Better/more immediate intro-auto-skip implementation +- Cache/Buffer: Allow 26% and 30% "overcommit" (+android 23%) +- Cache/Buffer: Add readfactor to settings (needs Kodi restart) +- Cache/Buffer: Add support for new kodi-omega-master Cache/Buffer GUI settings +- Harden next/prev episode handling in auto-skip scenarios +- Harden next/prev button handling +- Settings: allow vertical round-robining for settings and options lists +- User Switch: Allow cancellation of switch; select the current user by default when switching + + +[- 0.6.2 -] +- Add system setting to execute action upon sleep event (e.g. exit Kodi when display goes to sleep; fixes passthrough issues on SHIELD) +- Allow canceling postplay timeout with enter/OK +- Binge mode: show postplay if video was exited manually +- Show local/LAN server status in status bar and server list via new icon; server list is live now +- Discover local/LAN servers automatically (if any of the plex.tv/resource's DNS points to a local IP and is reachable) +- plexapp/account/main: init account earlier to pick up ID early; slightly reorder initialization sequence to pick up preferred servers earlier +- Connection logic: refactor connection significance; wait for manual connections if necessary/wanted; add way more logging (as this might break things) +- Remember last used server per user +- Refactor seekdialog autoskip handling and chapter/marker display logic +- Harden the episodeswindow's paginator, making it less easy to generate a huge amount of requests when paging quickly (holding down left/right) +- Harden chapter/marker autoskip +- Add "combined chapters", intelligently merging chapters and markers into one, if available +- Add BIF preview images to markers if available ("Enable video preview thumbnails" needs to be enabled on server and library) +- Add separate "show autoskip info early" offset to addon settings (default: 2.5s) +- Add countdown to autoskip info button, informing the user that we're about to auto skip the next marker (intro/credits) +- Set skip intro button show early threshold to 60s (was 120s) to skip recaps but only those +- Seek as fast as possible on immediately occurring intro; skip directly to next video if possible on last credits with autoskip enabled +- Add separate connectivity check timeout; properly set up timeouts for async requests; log ping in local network tests +- Harden server discovery; further improvements to preferring local over secure +- Update reachability of servers live in server list; +- Remove server refresh button due to issues; +- Add fontawesome license +- Show busy dialog when selecting a new user, preventing errors +- Trigger force available servers/connections refresh when changing network settings; + +- Fix Bingemode not properly stored per user +- Fix multiple credits naming in seekdialog +- Fix error upon episodes window reinit; catch error upon missing listitem +- Remove time left tag after watching more than one episode +- Add some missing advanced/addon setting descriptions; cleanup +- Disable GDM discovery by default +- Fix late display of embedded subtitles; the change has been forgotten, sorry; fixes #54 + + +[- 0.6.0-rc1 -] +- Add Kodi Buffer/Cache settings to new System tab +- Add pm4k_cache_template.xml to allow further customization (copy to profile folder) +- Add addon path and Kodi profile path to Settings/About +- Add advanced/addon setting to set (Plex) HTTP request timeouts; change default from 10 to 5 (on display/crash issues, increase timeout) +- Add explicit LAN check for servers (docker-based ones won't show as local by default); only works on Kodi 19 and above; add icmplib and license +- Add setting to specify LAN check connection timeout (default 10ms) +- If desired, prefer an insecure local server over a secure one after switching users, as well +- Add warning when preferring local server connections over secure ones +- Add long timeout for essential plex.tv requests +- Add force server list refresh button to server list (allows reloading the available servers after changing PMS network settings) +- Add setting to verify local/LAN connections even if plex.tv doesn't think they're local +- Add setting to prefer local connections over secure ones, enabling enforced manual servers +- Add advanced/addon setting to add an offset to intro/credits autoskip, as the Plex markers might be a little early (default +2 seconds) + +- Show video chapters if available in playback instead of bigSeek (also add a setting) +- Show virtual chapters in playback (from Plex markers, intro, credits etc.) if no chapters exist for a video file +- Reload items properly with chapters upon preplay-reinit +- Reorder settings, advanced is now system, add network settings +- Show chapters and/or markers in info view of a video item + +- Implement TV binge mode (auto skip intros if not first EP of season; auto skip credits; skip postplay) +- Implement per-user settings +- Make Binge-mode overridable per show +- Make Binge-mode, all auto-skip and whether to display chapters or markers a per-user setting + +- Fix focusing the wrong episode after opening the info screen +- Fix reloading episodes list after watching multiple episodes +- Strip out MP4 file name in stream URL to prevent subtitles trying to be downloaded, fixing long wait time (thanks @microadam) +- Fix failure on video with no audio stream +- Optimize remaining time calculations for preplay screen + + +[- 0.5.5-rev2 -] +- Fix auto intro skip not working after skipping to next episode +- Skip postplay when skipping to next video from player +- Limit early-show-intro-skip to intros occurring in the first 2 minutes; +- add advanced setting to customize this value +- Add option to show and episodes-windows (they toggle their show) to override the global auto-skip-intro setting for a show + + +[- 0.5.5 -] +- Add main setting to show the intro skip button early; enables recap skipping; works with auto-intro-skip! +- Move some boolean settings from Main>Advanced to Main +- Add main setting to use alternative home hubs refresh method introduced by @bowlingbeeg; default on +- Add main setting to specify item-played-threshold in main settings, please sync with your Plex Server; possibly fixes edge cases (postplay/next-overskip issues) +- Fix postplay timer-circle display on later (Nexus++?) Kodi versions +- Rework time formatting and hour padding detection for "Ends at" display completely +- Change watched status to also look at resume offset (thanks @bowlingbeeg) +- Fix crash when background threads are still running on library exit (thanks @bowlingbeeg) +- Fix playlist issues (thanks @bowlingbeeg) +- Change look of letter jump list (thanks @bowlingbeeg) +- Fix sorting/filtering issues (thanks @bowlingbeeg) +- Add second view type for episodes and albums (thanks @bowlingbeeg) +- Support showing collections inline (thanks @bowlingbeeg) +- Add support for smaller poster size view (thanks @bowlingbeeg) + + +[- 0.5.4 -] +- Store user thumbnail in cache (improves home "load" time) +- Change client identifier from Plex-for-Kodi to PM4K; + possibly fix "PlexNet" entries in Authorized Devices; might also break stuff, please report back +- fix closing quote in chinese translation +- Add missing German translations +- Add "Ends at" to player ends-at time by default; add option to disable this label +- Add fallback for missing audiooutput.channels setting (seems to affect libreelec only); relates to #48 +- Change resume dialog to show resume time (thanks @bowlingbeeg) +- Add unwatched status to pre-play screen and add progress bars to more hubs (thanks @bowlingbeeg) +- Fix missing parameters on Plex API queries (thanks @bowlingbeeg) +- Add time left to pre-play screen (thanks @bowlingbeeg) +- Fix audio/subtitle selection not updating correctly in pre-play screen (thanks @bowlingbeeg) + + +[- 0.5.3 -] +- Inhibit screensaver when in photo slideshow (Kodi 19 and above) +- Add addon setting to use old profile from P4K instead of the optimized one (might fix 3D issues with DP; not sure why?); default: off +- Show video stream render type in preplay/epidoses screen (SDR/HDR/DV/HLG) +- Adjust default background image blur/opacity from 0/40 to 4/30 +- Add addon setting to set solid background colour instead of pictures (Kodi 19 and above) +- Add addon setting to hide when current media will end (default: shown, as before) +- Split filename in info screen to avoid overflow +- Don't show "no content" on home; amended PR #43 +- Bad temporary fix for photo playqueues containing videos +- Photos: Use Kodi slideshow interval; fixes #41 +- Add Simplified Chinese Translation (thanks @Liqianyu) +- Fix AV1 setting description +- Fix single-season pagination (anime) +- Update german translation (thanks @jamal2362) +- Fix issue when displaying a library that has no hubs to display (thanks @bowlingbeeg) +- Fixed an issue with video playlists and the general play button not working (thanks @bowlingbeeg) +- Fixed a couple of places that require integer division (thanks @bowlingbeeg) + + +[- 0.5.2-beta0.1 -] +re-add support for leia (Kodi 18) + + +[- 0.5.1 -] +add media/part/stream info to info screen +read and honor advancedsettings/memorysize + + +[- 0.5.0 -] +implement multiple markers per video file +add skip credits Plex-style (skip to post-credit scene if applicable or skip to end) +add auto skip credits feature +actually respect DirectPlay=Off and DirectStream=Off +fix directstream/transcoding (DS never worked apart from h264) +fix transcoded audio always being MP3 +deviate from Web-client-based profile to own dynamic profile +allow directplay/stream/transcode of virtually anything on Kodi +add settings to force directstream/transcoded audio to AC3 and/or DTS (for passthrough) +add setting to limit directstream/transcoded audio to original audio bitrate/channels +add setting to limit directstream/transcoded audio to Kodi audio channel setting +prevent PMS transcoding audio to higher channel count than original audio +show video codec in preplay screen +settings: round-robin when at the end of the left heading list +stream status dialog: show HW encoding state +replace progressive jpg files (thanks @shyzus) + +note: massive thanks to @hbbs for reporting the MP3 issue and sticking with me for the whole process of figuring out how to do audio stuff in a Plex client + + +[- 0.4.6 -] +add more sort options for ratings where applicable (rating, audienceRating, contentRating, userRating) +add smart desc/asc default sort (need feedback) +use PlexWeb sort field naming (except for PlexWeb Rating=My Rating which is clearer) +note: TV shows "By Audience Rating" seems to be broken in Plex +previous beta fixes +small bugfixes + + +[- 0.4.5-beta1.3 -] +properly refocus after stopping music via the mini player fix msgstr +reset autoseektimer prematurely before auto skipping intro +stream details: don't show unknown values +some music fixes; internals +auto intro skip: skip only once, show manual skipping otherwise, measures for preventing wrong jump +fix HEVC default + + +[- 0.4.5-beta1.2 -] +fix music and photo handlers (thanks @Buttzy10169) +fix next/prev handlers in general +fix previous release's issues +use different photos temp path resolution +enable HEVC by default + + +[- 0.4.4 -] +community fixes (thanks @Buttzy10169 @fvlaicu) +add auto-skip intro setting (default: off) +add addon-setting to customize how long skip-intro button is shown (default: 10s) + + +[- 0.4.3 -] +Allow skip-intro for users on a plexpass enabled server (thanks @fvlaicu) +Fix visual issues (due to botched addon rename) +Make AV1 setting Kodi major version dependant; pave way for hybrid codebase for 19/20 +Implement new network discovery mech on windows (GDM) using powershell (experimental) +Possibly fix GDM on windows (especially on non-english variants) +Possibly fix GDM on Linux (non-BSD) + + +[- 0.4.2 -] +Fix skip intro button +Fix duplicate addon setting +Enable dynamic backgrounds by default set defaults for dynamic backgrounds: blur=0, opacity=40 +Fix kiosk mode (autorun plex on kodi startup) +Fix music playback +Fix theme music playback; set default theme music volume to 50% + + +[- 0.4.1 -] +Initial PlexMod for Kodi release, based on my plex-for-kodi fork's develop branch +Add support for Kodi Nexus (20) on LibreELEC and Android +Add AV1 toggle and AV1 direct play support +Rename addon to "script.plexmod" +Add all non-plex-conform features of the develop branch as default features + +[- 0.2.3 -] + +Fix error causing playback to fail + +[- 0.2.2 -] + +Added support for collections in library views +Update Polish strings (thanks to Zachar) +Fix GDM issue (thanks to MrPumo) +Fix Python 3 issues (thanks to MrPumo and pannal) + +[- 0.2.1 -] + +Added Skip Intro (thanks to pannal) +Use device name for friendly name +Fix some hubs not displaying +Added title scrolling when focused on some items +Show playback speed on OSD +Fix possible error on playlists window + +[- 0.2.0 -] + +Bump version to 0.2.0 to differentiate from deprecated Kodi 17 0.1.x versions + +[- 0.1.8 -] + +Fix seek resetting when clicking select on seek bar with OSD visible +Add Spanish translations (thanks to rdcalle) +Add Portuguese (Portugal) translations (thanks to Generator) +Make python 3 compatible (thanks to pannal) + +[- 0.1.7 -] + +Fix transcode failures on Windows (possibly other platforms) +Add Italian translations (thanks to iz8mbw) +Use Kodi time format setting (Issue #90) (thanks to pannal) +Restore last window when starting the add-on while it is running (Issue #126) +Add Portuguese (Brazil) translations (thanks to DiogoAbu) +Add ability to exit search edit box with previous menu (escape) button (Issue #194) (thanks to pannal) +Only play unwatched media when pressing play or shuffle and filtering for unwatched (thanks to tlt21) +Fix issue with duplicated icons when fast-scrolling a hub (Issue #177) (thanks to pannal) +Fixed GUI not responding after public IP renewal (thanks to pannal and mkliche) +Advanced setting: Automatically seek selected position after a delay (Issue #172) (thanks to pannal) +Advanced setting: Use skip step settings from Kodi (Issue #133) (thanks to pannal) +Advanced setting: Use Plex/Kodi steps for timeline (Issue #133) (thanks to pannal) +OSD-Autohide improvements (thanks to pannal) +Show post play on user stop when item is considered played (thanks to pannal) +Use Unplayed/Played instead of Unwatched/Watched (thanks to pannal) +Fix issue with cast popup displaying partially offscreen (thanks to pannal) +Various fixes for incorrectly transcoded playback (Issue #201) (thanks to pannal) +Support new subtitles menu in playback for Leia (thanks to pannal) +Make sure progress bar is visible on items with less than 2% watched (thanks to pannal) +Fix focus issues caused when hubs are removed, i.e. On Deck, Continue Watching (thanks to pannal) +Fix issues with flattened seasons +Allow Kodi info display to be visible when hitting the info button +Fixes hubs not updating and some crash issues +More fixes for Kodi 18, ex. missing letters list (Issue #265) +Fix resume behavior with DSPlayer (thanks to pannal) +Add Polish translations (thanks to Zachar2) +Playlist and album view tweaks (thanks to pannal) +Quality selection clean up and fixes (thanks to pannal) +Fix to allow 3D mode selection +Add advanced option to skip the header when going back (thanks to pannal) +Ensure paused state is retained after seeking or changing video settings (thanks to pannal) +Allow closing of the options header in scrolled views using context menu button (thanks to pannal) +Some direct playback fixes (thanks to pannal) +Some shutdown fixes (thanks to pannal) +Show play state indicators to related items in preplays and On Deck in postplay (thanks to pannal) +Fix some resume issues (thanks to pannal) + +[- 0.1.6 -] + +Fix issues when selecting subtitles for users of certain languages (Issue #188) + +[- 0.1.5 -] + +Allow direct playback of episodes and movies using the play button on hub screen (thanks to pannal) +In progress watched items had the 'Mark unwatched' option instead of 'Mark watched' +Fix an issue causing the home window to start slightly scrolled down if it was closed scolled down +Fix an issue causing an error when sort was sort was "BY UNWATCHED" and the filtering "UNWATCHED" (Issue #187) +Fix issue with letter shortcuts sometimes being shown/not shown incorrectly +Fix a bug causing crash and reboot on startup on Raspberry Pi (LibreElec specific?) - Reverts "Fix autostart to work with profiles" + +[- 0.1.4 -] + +Kodi v18: Fix skin compatability issues +Kodi v18: Fix incompatibility with requests module update +Kodi v18: Fix issue with playback not resuming properly when direct playing +Kodi v18: Fix issue with progress bar not moving on music player/music playlist screens +Fix album display on artist screen +Fix bug causing failure to show audio player when clicking the mini player from some screens +Show original artist when available (Issue #143) +Improve centering over label backgrounds on pre-play screens +Fix some spots where tokens could still be logged +Play correct track when playing a multi-disc album (Issue #148) +Improve headers for better identification in 'Now Playing' and future server profile +Updated German language strings (thanks to coffinbearer) +Fix French translations file (thanks to coffinbearer) +Fix some Hungarian translations (thanks to vampywiz17) +Add Russian translations (thanks to shady2k) +Fix autostart to work with profiles (thanks to pannal) +Fix focus loss on home screen due to error (Issue #169) +Fix "No Servers Found" when preferred server is unavailable (Issue #159) +Fix system keyboard not working for search (Kodi 17+)(Issue #165) +Fix issue causing hubs to scroll up when settings were opened +Fix failure to sign in when signed off externally (Issue #110 & #117) + +[- 0.1.3 -] + +Fix incompatibility with requests module update + +[- 0.1.2 -] + +Fix issue with hubs not showing with (newer?) server versions + +[- 0.1.1 -] + +Remove PlexPass disclaimer from add-on info + +[- 0.1.0 -] + +Improved hub vertical scrolling animation +Fix (#87): Switching between managed users causes Kodi to crash +Fix (#119): Occasional crashes when exiting the add-on +Remove PlexPass requirement + +[- 0.0.102 -] + +Handle connection errors on link screen polling +Handle skip next/prev when playing video playlists +Home Screen: Navigating to the 'More' button now causes an update for all movement +Add ability to view episodes/albums in library view +Add German translation (thanks to coffinbearer) +Add Czech translation (thanks to Pavuucek) +Add Hungarian translation (thanks to vampywiz17) +Add French translation (thanks to raffoul/rlimbach) +Fix issue #64 (multi part movies won't playback) +Improve timeline reporting +Friendly name now includes hostname to differentiate Kodi devices +Possible fix for issue #102 +Fix a bug causing an error on server decisions +Fix errors caused by localization on episodes and pre-play screens +Fix some errors caused when no internet + +[- 0.0.101 -] + +Fix (Issue #68): Artist screen options button was showing Mark Unwatched +Fix (Issue #65): When returning from playback episode pre-play did not update the selected episode +Fix: Codec info button ('o') handling on Krypton+ +Remove mkv/hls testing option in add-on Kodi settings +Add Debug Logging option to Advanced Settings +Fix: Post-play after the last item in the playlist was replaying the last item instead of the displayed up next item + +[- 0.0.100 -] + +Fix some stability issues +Fix encoding error on startup +Improve fallbaack background quality +Fix an error causing opening of photo directories to fail +Disable debug logging by default +Make Home hub square items smaller +Improve startup and shutdown times +Fix some server reachability testing bugs and improve performance +Possible fix for crashing when shutting down Kodi while the add-on is running +Add workaround to allow launching from My Add-ons and shortcuts +Fix text cutoff for post-play in Estuary +Prevent the add-on from starting another instance on update +Skip user select in offline mode +Show 'Offline Mode' item in user options when in offline mode - selecting attempts going online + +[- 0.0.99 -] + +Fix: Episodes were not resuming + +[- 0.0.98 -] + +Fix: Was allowing non-Plex-Pass users +Fix: Some videos failed to play with certain audio stream selections +Fix: Some videos failed to play due to a logging error + +[- 0.0.97 -] + +Add 'Play Version...' to the pre-play options (Issue #34) +Added spring loaded playlists to Playlist section on Home screen (Issue #28) +Fix playlist composite images +Fix: Extending a hub again after a section change was starting where the previous extension left off +Handle no content and 404 for section hubs on Home screen (Issue #52) +Handle no content or no content for filter on library screen +Handle videos without duration set +Some Home screen hub loading optimization + +[- 0.0.96 -] + +Remove PIL usage +Use plex.tv instead of my.plexapp.com when requesting pin (Issue #50) + +[- 0.0.95 -] + +Now remembers unwatched filter state and sorting selection on library views (Issue #44) +Fix: Local media was being treated as remote media for playback decisions +Added a dialog to search for when selected playlists are not accessible by the current user (Issue #42) +Fixed font issues on episode/movie pre-plays and settings screens (Issue #45) + +[- 0.0.94 -] + +Fix: Filtering for unwatched movies was causing nothing to be displayed (regression) +Fix (Issue #41): Incorrect strings were being displayed on the episode pre-play delete dialog +Playlists now load in progressively in the background (Issue #35) +Added a dialog on failure to connect when getting sign-in pin (Issue #32) +Change posters view so that two rows are always visible + +[- 0.0.93 -] + +Fix: (Issue #20) Filtering by unwatched still showed watched items +Fix: (Issue #33) Photo directories were failing to open from the Home screen +Fix: (Issue #33) Some photos failed to open from the Home screen +Fix: Disabling the 'Allow HEVC' setting had no effect +Added a busy indicator while photos are loading +Fixes for DVR episodes without episode numbers + +[- 0.0.92 -] + +Official Kodi repo submission +Only change audio streams when necessary + +[- 0.0.91 -] + +Fix (Issue #23): Pressing a play on a show was not starting on the first unwatched or in progress episode +Implement (Issue #30): Decision endpoint handling for proper interaaction with streaming brain - fixes related failed playback issues +Various minor bug fixes causing fanart screen stalls, etc + +[- 0.0.90 -] + +Fix: (Issue #13) Errors caused by encoding issues in episodes pre-play and track playback +Fix: Player settings dialog would sometimes not close without some user input +Fix: (Issue #25) Increased music playback thumbnail resolution - affects add-on player screen and skin views outside the addon +Fix: (Issue #24) Items in movie playlists were not playable +Change: Player settings dialog now puts focus on the selected setting when displaying setting lists +Change: (Issue #21) Now back button only jumps to top bar when top bar is off screen + +[- 0.0.89 -] + +Fix: Selecting non plex pass not managed users caused sign out on addon restart +Fix: Playlists view showed empty space when no audio playlists were present and prevented focus + +[- 0.0.88 -] + +Fix: Starting a video while audio was playing triggered an error causing issues with OSD/control +Fix: Selected audio track was not being played with direct play + +[- 0.0.87 -] + +Initial public beta + +[- 0.0.1 -] + +Initial development \ No newline at end of file diff --git a/script.plexmod/default.py b/script.plexmod/default.py new file mode 100644 index 000000000..3f0bb5be7 --- /dev/null +++ b/script.plexmod/default.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import +from lib import main + + +main.main() diff --git a/script.plexmod/fanart.jpg b/script.plexmod/fanart.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7548349f6a1dd3633c2dc7262c386ec461f361cb GIT binary patch literal 71213 zcmeFZcU)7;)-W98AY$VnBGOe91Vlu7KSwDlO@t6SLWD>QEeRcLC`G_RuL_btfFJ}2 z9i=K&h@lfoq(egQ<=c3!=Xjp?p7Y%M$Nlc_{XT~ud)A&cvu5ozGkexvvsQMycZWbf z-%!7<4x*!@1DODSpxu#uZ?9jyYI*aPuKIN?H2?tu?R(`2b#njd5(wl3N4VY6xN^$K z*yI%B80aSuJ%|~^1roJ_y1V>(^QIQ)FVjjV2%rQ45k>cC{bjX(jyQ71#vKX*(VYU& zzd&8w5CD7|fTcYUE_-k+03V0mwYmeq*#LaO4PX#}yZ6eie}iZCVAxl99{_@myBXZN z3Ow6!06qo#4z~UdhTe5^0_sQtb}g5E5huas(kjqCgG@O58!W0Q{A|XwUhz{Y{{iHPFfq1O-~C zf}BB4AgizKL3?8W)B(~TvURtWxcs$jHrc09k3ZfIxBaAdmnIpl$XS&wT)B@Vngp zw$4A~x7!E03fc!uU^=?J>%P786aC(m;isSIf7;KmfB)BiMy3P%8JQUO?>}(p0Mo&} z1VD!m9Xz~uvq$8&ru!J^=@||(?q~d3<=?vOz5}rw_(_)W9z7ikXdeq5Jqz7#Er=JG z`1|(J1FY@I;%lNmcz|i&PmKE+_V9OqrUTLKqyLHi;QqsmM;I9PGk(2gVA;=jfa%!j zUk|c!h|B32d&GP`&UwZ)y702>6(cLu{m0Mqi->F|_-}#nB=(aMQu>D0h{&kd?Hy;Y zx);2cgt|RQJty!YEwB2#s+z$a+j*cT9)N|foP6U07(05p13-^IF#+i7EC3^P`}h6C zbZFmC3_sBW{O<9^z;arA|F4XCR<6g`PMqPtY<>SF>+vhM3?4ksd*9vxo;z^X?S+J- zYW}d)>(r5RSJkR_dqIbR#`{?4SwJeF+_gV?`vLuszz+%hkiZWK{E)y83H*@24+;E` zzz+%hkiZWK{E)y83H*@24+;E`zz+%hkiZWK{E)y83H*@24+;E#SONt!_u!_!drs?a z(0=j~q3hkwgmjG^UYEi?m)!28GkZC^hA))nqZZdg7<4`PRLSEaLe!K1Pma=WM~B#j zX9Vqc@f7qj_Lf`=Sdn?YnZe6MHna#+=GzYY;y=asz#}RqP4~$z2 zybJ0kYfxYPU*7BhZ6RjVGAOO0e>A69HVnDWmGaRpg?REdQf$F*R3j+264K=C+AeRG zUePs*XqZ6P($BlYuW`R#%!sXbn;cN%T-#yFH@vh9BB{yKe?i5ReEyPC7(GU|d&k>k z61)@EyvTigd52qBAdGIT4BG$7O}p0z+5XaHvVcoTYCEhs!PBeIU87|#TWw z&PYvkrH^*AI&F2cQYodvu;P&C(>~Gq?zEP4soQsP0iy4q)Fq!MPdD29>fn%A3sx3f z#W-D|LIt)>qa|naWaIKy^sAE}E0rl#2`H))xsJNYQl?Zz(7{{Rx6b-`nyDdH9CV;i zW;H4QqwC^pzdkWt{<7J^`uJmoyU*4EXED0Kn%b5vqF7HtPxyXvN^9Nik=fW?(ELMg zS6PQOZtZ4X31&CaG`NM`$sBEm4M|1B+X~_Y1mCjU`_l@$fbY+7;eWRa`gtqMk;WXb z#Yx4$-Pg$iu8$K}9X&jvZ9PBYRjoEol&uKVA(wZ*cFb~Mp5<5 zw58g?65^80T3TAQ55_J2|FTy9zx*Eh^Rqq7Om=%c>f~^)-n_8M)I}1ke&P!etdRKe zjJ0)Khc)!j=Y#5di|t5~8@^fg)(8~A<|r`eLM!W6?{!SVib84D(hBt8{su-R!#sTn z2b1Z|(3f3G=h2xdqo;GW1={Nr(!KN{@_tVINlNh=*cB>6E?qsa zz@8CGd$bFacfu2=Fj1yH*x9aRt@NEGURLGh*#SSMcm9)O7KX06eY2IKm<5k2K^NwH zV_$g{=;kL+t<5e1a!HVGGp(^zXw#2SSFoe;vY4^wLM0Dh-u8r|fZudq=?3e)?eJY~CU+J4F>2+bAr%A;Cpwb*KdPKfdq_Tp==3xlXdCT*%1FJrKnU3xbeeZkdC5}K z{nIX}V~^K6k#io^%JFT7OiMOc?rk?>i>pE?yPyfvEug!$Zye{}@RT3sy4DpK*6+vo z&VQ6+Waq-pYiEGg3uRrG9m|EUY@bu)b_qqltgf8hc{sWYD!JPDt=4ny-xw!u0$jm= z9>12%MsQvW*bIx=8D*mIivC9Hr3AoNz;A4Qc5$d?HfuYWP_$Kc1gHgxRy5zfGDtBA zIP07Ij$bz(U_JnLeyHscQ)~oHe}Dk&##Cv`%}9I7#fxE37Q$L*%Et)7xvwJ3Wwe>)w)!450oaqb2X;Yk^4AbMAMJ)}9uCN_-5kgr?KZ1gJ+I3# zAF#|75N5X(yAS}{JQq`gS#ifapfaD4N@iWPQ;CfWpx#WDq%coO?}9jq>%6){e0TOJ zwIWL{WhL_&;ua9psdrg@l#Sn(D`EGS`#gtFTp$yadrW z+mphXP0|lf_m~N=v)-@OXe79a6vE@tu~`0e^(x^wY;u>-{iTRHPh~NvPhq7=pPuUa zXNaA-0ZCW3F*CMJ6eB7q1Z7>r&Nd+&7KTnxd*Hg|Sd^yi<=L0- z7KZy#0`v_msf~p=Hxypwb+_WmdZ-Rq>!C-?HuvT;P!=?Y?M))7! zcJD5hHubeyn#qnxyWhLWTrAU1ZgfiDSxj+0WVfP$D$!x&i?&kqRIGfe_Ebqm6ylAn zaudSFmkmfmaiOGNBtyOp%irhw1}mB(o~5~_Bn}p=zm?efC$;ImlwX zq{S{(5ea@+*L56B8bOmb3w1+vPrS~~p}{qMeN|?0f*xE;0~ViVPyvsU#O0)kce>un z#`7D8`3y|iVWC(=R-Mud=IHO9hR%M6GWcN~+KKYoD8B8q=aBg|F-ZHQ(nKwGK~Yd1$9!o4C>Rq4Mq9L*4iOjQ!*8DEd=Ckn7--N5HLLe;ESG=~m07 zofjR7Z3hK(E4IUN_7yRf6O>EtW<+(FLlAHun_UlBS!jBKbezP4sChJU;oxL#tXg{g ze4*Z(ZId(-Rsl2rl#&qj-qoR=DcG1i&W-z`%Gbg3oL0_?KMtSJ9cFv+>dOVi$nf;nt$lB94qhmV_T2pU8jny;N zk&%(=_}n;i)3fpYNF)lIg_4QP<5Uj<=W~^`Yps`#f=$y|T11bp@JmGU%crMGCHXdv zTb)(Mr_v`$PRn1Bay%QiBENMsQY7RK%f&?D!9b3;U}|`8pnM)d)gk-_~@!H&_3qG$Bn zB^&x<34!lT=eM#5*wiFMa+n0zeZlV8EuWyI9hyXl)B3C>i|Lm(Z1YN*Bfe}M?HZb7 z9ao0ROb$HW+;(N)_|o0fpeb~S5L!N!ZvL0=`u!VFbhE#B{h$oTddsG60=>$+e_EBX z+LfV(ommm$cy6HERj9-%q3`KqDxL$?VI!SqV1k3{tlK*TV_QDV;DXT^GqL-Vy&igS zmHMp;!<Ew)qm>Jn{VZR%6Vhn2lNG(1{iy>cb=g0`T0-C z?{4Tm_cG5PRoK>{O06SY42j$YF!>_@-A<> zzUV#*fsl7WWfcV{3YF@%(Naltt^CIA2j6I`BB#d;&Za7WNoP#>uXVNJ5YpFG?Ksy- zd0giRI(ez3>2d8+EWJ4#9o&;)Fg16@c1=}O)(ynd7er3gE3Db6(frri4W{IXI?r?- z+_39l(+WP1xz_1>_o(a)o-SduYay|V!GSfft_RmD$n4(_QR_ph))|1c>Z4R^o3(Tk z(VZRj9irzG(Mi@&&)D$;UD_uiTcp%oMOha`hN>VS1-{$RAmGBa-U)_&*m>MS&wI$$NZOMt}*uYOPEpFwy;R12{ zU%mT|z~6v$&g9XC4|>IIt0p1Q<`97SY z-(ftL2QF?VR5l(hXq>zY(s}-iq*(bt7md%Y&nu2f@abbpaBS_k(;Zhc)^oxqroVb* zF2-7FqQB7X3>J1hI1Gvt5RiYvckdg+`$*djRnHe1vS${TUEcNH{Z@X^aaE0MQn3s2 zmmK!bsir^p%QwvTIo+f$`*v{xW;y1$pVe*lyzg;;f_b!G0frDt)o1F?n+Nyb?ctc- z#+K{QvpH}*tnIR0j-SNs*;J(T40Q4gfK8@$d8!VfXQxUufU$132J0KN12cE@Qvd2j zf3Zvb#_)^v63X>`NjW{;X$%FOQb7rYlUvEcXOzcgC7avsK(t+X^p2=ZGCrCbc7)sI zNBnA+WayWK*dE+;i~ca@@w3LyR(eux>1j7My|J5v$&L?F70izzP@f|;?BgF5)IVQ* zt-xf5snfyQ_g`npo;(0P-*(FcY8-S0@#sZ64;Bk-d+op`r}F_=w)(y3oSrbEp04H4 zBjKK~4n5A+N*ko(S#**O>m6Wo#7dmGVb=-P$v>Bx1hc#>amGZbLuxTIj#s3i>wp|P zN5A5jX<>z0g4_zL8LH710@Zy8%|Lrgk{~u^&vQz*{J@BUICKnh=;)<#7YK{-AXF|t ztEB)lt*5X(cpzmf+ITg0a#Zv~!}; z19J>f&!Y@l^?CG}+srb)4JsYErzNqisOqi@mtcO6GXJIKMJ=an0rQxlnU<#RgjJCc z(caY9X>2JLD-;x75_iw6>4mN+_mik9x;~lWW<%y97Jar$^&aIhneQ7w>QtRcqCD zsmqU+&|;}ix9d-QZW*u@h$|uAO_{rgxo8#9Fn)4#9p?~U5mINJ3-)0Rt~HORnwJ3F0j6YgoKj&=gS>W z`|~Ysy=lhi0i>>>$dQh?&bqdj3)pyp0e9j(EJmVL-`8j%eUN=sW`y0=uI^4;R9}>1 zbpNO%*upru2kkvJ;Lh1wp{0eGfutiGavM|aaIfl5{ex?Utj&l3{?Q2Ip7E*S`vpJ@ z&2Q;=4>h#B&}V1Mu6o<_(f;H2z9GKP={wfMHeF?Or^U`}RKF9m{vP)ySU%y`ozo2g znFHI`8R+kQMR~XFSJWNf5}2+d!m#I@L)Kus#|2={C5ZNj&JP55S9OHil#b-2RK%*Yi= zZdRVo#PrYOEZGx*`dFciaME?1=PyhEMVP5mPm|@%T`UsVlliY8j@8<6UWt2tPIBdn z#H;9#09D~Q?oZqk7~SNXam_8+%HD}bd=IfWhaKs&0R{}5Eif?rcBM2U7aMwVGEBbI zQh?+>PSfw|z?xqDq`^~%Xge|}+$n*rhh=$ZZ<7m^l8?Iud9Ge7SBSEZdW*T(ney0FLtu;{Qj13R2z~U%QR&Toiund60KqFOUs>3Ah&Lt-SC4JAOu zvly6$N`iL|pH%&>r@saNB^7p$0xz;o<6y!g3dD82>uCRV>LO!7nMiWa#K>D&ECSc^ zq3d-J-Yq4{cA2$HyHP+G?c+U0cZ-TLdoI)0DCR3k4vlTe7`WJBJ&mz0njY%ama>xy zV5C^5ymVk!6PI8mX;0b3PY^YuXCEKF_Z!EDAgjDP8cn=-d>g5T-tN_Jr67gqQj(BpmGa2h- zt#Z&|7qmrM^|7dGuVNXM2(%EM#cz$JbSiC!g}1Y2H(6LzzX+Nlf%RjfV>^_Q?r+59 zuiSuM3;HGKqg3(q)C}0*WxhT1+7*PlhkL4m!Dm&NP!6&CQR_{e%)4R0Hij*-I>(Yd zJ*En1rD+Di=fg=7881S7d?%WN?ZWug^s~be8WzABdx?nD?**DYoxT{|?dad)On(P2 z8rXLsxz#Fi{3KVgViSYERO)sppnA5eC~DzK2AyS*)YfH>toH?YtS}lHSv!6#up%&O zsyd6y#2uZ{2*sVV+>tN7-U~lm9N0q8jQ5yc2P1VPY~3{rc0sen2d9!(4cbB+FxLr| z8wfDQptfy7jBehqD@+#Ex(k9uns^sQZktd75F4LYwA_OoWLSoxi;oJK_vS*pVYs-y zK`vcKMZ5mQZ(D*A`=iQ}1WbLvF$Jz_>gYml;4E)143)oi7|bd?x71o_UTaRoB^WyC zyUij|dhpC?hMqOCVHsrk;kmLrUm>b9Jvm=A>|@SQ_8_)j-<`|f)}hv#I!PLIw!n_| zE=^6ECCL}u^S<}pOgM6N)uf!b3#z#KXjAbh{N>%vdNS<^om=9@7$-Hxts*W2J+Of( ziqAu;8QJ@;OxCWUg%~W}eMjMM!4un5Gv7e2r(0v&n3nq~Lw{XanLYR-*Q$73{gQ1F1039nV!bO|5jxP>LxSCqxWFT&aigv$Xret7-;tV7ps|=yqNOGywErK9>3>fv z1%YTYrM0cObz-(qAJ`szyw)RGIy&v)kNsI{fs~+vEtpVG&x<4i|7WDX4=02p{ zMa%26sJNPGK{ST4w2^3Z)I8y^sY|k)c?S}oBHxNDg)N6+iX?ii@MaR>J+AxNwMUdZ zJBs&oyWyEg{gEfyNdtkR;@PkDSu3xf53@N~WFuATqc{aa$&E!Fe0Ck4ax9J%+rbK` zsg(%ffk%<`&u}ogWBNMJYA4PG%>+tadlBM$^XY^Du((P5k*dv;2U;JP2t~*kh*-nU zYpN;X*ME*{4*J-5#ugFiE{Df+$)&km4WuYM@l|KF&EIq{DihOg_HVT8IFq%EfL0ET z1tfUKTl3eYH##-9K9}FHRP%L*Fu3wanSysr`h=bMflYo;wQbWjV^HuWDg(4 zwZ@Ni$!B8YVzHMa55N6w=I;AY(J(H&HgIBWk=LedxTp1T`z)1n%(yJ{WSNQ>!*ilV zOkN(a7kDNVAna23yzs27l7r9S{ol=d#(LKyRTVvRCB?H@BmBN`%W}3&GjNRn$yV1W zB#4DHfssTlWb?k4{qJSF$j+Bq#Zbgh?I{b~Q}}1wC`im`(uM;e z%4TIpot?pXo6FEHHOZPE1G!PM4*tx{{#~bk51Ou)xGo%rODra=q)6`%xcAq!>G?`x z-Dv%}5;#^o^`y+lKy-^ysWLmB>ngk!67&IYiXfd3k1m{_?1*o#|rJa|=l`u}4F(8L>cG zEU4}XnaL3dp$LTu$fxHcNZN=xgI3pzEiAog4}N1!xKub9W=BqBMFAo@T3OV0s14@ z%lj?D!O7d=yuxC&TFtwlD0B{N{f1Ss68-#m*xcaHgZ4|E;z@~Z9r%rkCD=}XWp=sd z8)feGC|bQV%b1C7QV+zEytUc8=BUv8?yKxMARn`$$3DBOQSdfv$m*Wjo*pyNfa=Yf zmbrQHIqv8>#Og#y<=AX5HjNqXy@Xqq(n8o}uq$_OKko?}bPR{QO<;X)m0zB4wkdn) zaw4A5{yhFsjWI#H%+QI*W6-XBoT#O7N0ol*x9)x$Z%9lT>)7ip+up?7sG@P{i1d3O z;Z}oR#Swang)7HWBpkl54(MkTVfJudAC=YT<)25NFe8D)b%rT~tuvl7xS7~#pUGJu>rb?sjrVN`lvOh~VKbH{< zwg?7{Rp#5a-p5rLp!dEKHK{6IT~Ib!PD=L2o#fK~))Ad{@5IbC`Ky&#p>EO z#Gi5{u?M>#0xM!Ce?ct!!oHPLf5LuuL!Vi|H^S|)ku>=E*-hDhAm|D#G`DPbLA)#S zm24jO#Rszz!URw7h^eF>X+tX((c=cJ!HDTUfs z6M>@v;A1Li*6``_Idsx#vql{Q{p@Mwb3S>OqeFZU>Nde0mo>HJuVf~UCg%H6*F3J~ zajg!Zyh?c}qXv}A=C7KjtD#OvL}u_bdX!ZK>ISGLlUY=Ibli-atg^WOJ8@I)E8~!d zb~XlJ-C3oVoPZAaaej~r@l_u;?XnstJ+{+ZO3k3n{PH&Y@I`^*c@!NKuwLS%FiBDxIa;f_6b_w^ zPDSX!^4r~E9-2;*z220_hJYPjw;A}Qy`eb}j70=>{tEXW!$&=N`0)M(-cDx`nDU_t zo~iaHZPKk`y&XHIk0-Q-@;`Rr;tJuT;C{6C$ns`EYo6Mv?u_q-{jmF3ZZo^p`kgto zB5ngG=lAn+;q*sN@`QhM?kBF9%2%=J2iACw*d|$L5hSP4EeVAh-4CM5+Q=6Dv>4Cz zl~tLf0?((EyDJGYwYG6ohtMq3*mCpDD6=xR+!`=aYm!H=oB92B9sWJ|FB?h#GN+pJ z`^)5;@;H=T@8LtLt+TseY=O1Cq0ux`;M6Ju8($cb85Mh5=-eiWJ(Q`jR6szblI%1)ms6|rVP3aHF~QgL9Qe4pe49`6 z9E;_R?4y^1g37FOcQ`R7w$}0nBsEJ!d!^9u^xz?iVXf%%)Uxo*=qG&^z{3^bBDVICs!s={ib#nZQ1Kg9=41uecdn5s4k{{SxG zOb5<0Sb&wRo{t4|%XXd&1A(9pNqzZnL(1MJrlu4!^>x?6-ny=)l#I2^Z;g8X94;)wqCgs0(Ud6~w|d(peo_G?I_-Y>onO?JAjBL@ zd^14c2@n=W^RH`Lw0+9uTNjGhs$R8#m^Rny_~==D?&@KkBK1VJVJFJnYsj)Sm99|U z=q96;%yHdmz9-TV2_17k?@a^8#S*tsb6wtkc<*56(u(`ALViD$pE-Uk(%MP2rv)D# zNxJ{88B8)~0kZ~`>6#%f5Y_b3Cm7!DHU5_940xxm#y^^$tRHQ82gl#tVJQ=BwRYt& zG_~NQ7P&i)8>R7tPfg+C?NcwUU~ux%S-7~4rH4kRz7hD}a{|qc^5uL#Y+Pnm+41o1 z?+xg1%BOrX;f7|C&TS5B-ee0EPs!P%wN3&OXIm+B`7GYG)^EG8c#n#%!8DBSjo=PM z*loVk^Y2TPc0t!@G82maTg>4{KGHTcysCbstPc6Qz;y#U6k0Zz`KstC58Zrro|BzF zd2X-qadW*KTnbBU*s1?nqDpo!#eaLAtwkthf!SX?K74t5rX(0C(zqQ|G002^A z1D-LGy-kETqO=E#Fm7IfM*Uz^&a~T(S_pO^+lI&7ot*VlncsK{9SSMf6k;%W zw@2bcE>&qOB3cOsOUZh?pZLpO*HoMgYYtV-)()s- zmxoRt0#yWkLo)}Ds05T%4qLkP8P~#>aTL)Ra@`k?MMr9R)uF-Mdd?Ol;f)i^;YlW* zX*V6JC;@KBofNXhC;KXI#`>Kv)7vWL5wA%8OUz;0AG`-P8D(U!^RN^?U%K|{-glR>hmSeT=M<-suKBKkS>jX zLdvp&{{NPKrfmnhFoM}|aB#J88zF*N_5>G#?DkHTinrz8S!4TsEa;+qGuJ*Pv#$>7 z)H$J@$VFm~7yD{#k>6n}$5p7-H}? zzCWPOY)@?u>I8%Hh0gEUzxJ8%X8~5HlHj}Hxk*Ox{hn#f*i7ybsU$#;`K)1q9n(vG z0~{oE;%o%v`3p@XK1YYZwAq^T$|s`v^Vz78voEfN@m~X!ndIx|)9^dOXm_=VV~K*9Br`VnDvTsv9XFKR5Ha2bIhj!g%Y7&>naJdc z+rTepkq5$OQ54^@`VWNbWul3-wwr1NJ(YYS9~R2bDTx%9gEu4l02}Zk39QHCXMVf% zi7?!fi@8bg0nf8xn2qw0;O05mfG4xj$R}yK!;VwilC8j(W35&@>+xPfu9-33K5qKn z9hYw_1jvt|RN%q8^< zkag25nCl_-3~Fdwm~mWJ0pGjtX#FqXUwu8l$(0=xVLql@hKiXM8LI#El?>}>Pq5W8@#E zQny`PTkrEA!F3npp)E^ZHxCJzvnQxL;xZeODbwoac~g6PMI;u(95pjK4fx}=lni_} zs~yUWo0=py(IDVWgNAVXLe#Q;F1UFA*qYr)&10%K!5Qk4DCUeg)#sO7A+AMPxPX)q zsQVb^L)vstZ&vCKFCn1f9m2dP?|Gm6LkwFy6V$;wG9SydUk{v^%a0ddKl=HLXL*{! zd&o$wmAJG$-n$?0WY;s-TmMxZe$f-zi(@H%)wgr9sKY*2yxTmd;Z9c`tA@I`q)`R< z#QgDw#fzpP7xj0-T$ttedijsMHV+$(-~aM>M2w{Dw5|Fe>X$zr=YK#)Di^#dIv(q# z9Q`Qr7}4DUCBdY2;^JUQPIJSBu=50uHZZDE8#~@2Jrx&+HF@5#y5IBRiTS9`lwY0Y zM+>DBno(*Ng(}|CK|X^Z*W)9x0nM{hOGSEZllqN*eY#~iaYd9Jv6EPfKrRe{(?1ZY z$&?YE1Gs10P`n11#-Mcv?Ew`h;4`)5V=^zJTG{1# zw)~9D%vo4Jm9TWF^$J+a8%_gfhw){0*tl8$=R-yVH9>Pe+&4xcfiMT%K%OL5rGi#h z@kXm`!e$uda3usqc#2JROCc)=diuVM^1ThB_t|cMi7@r%;9BI~IETUn+_u8U_|Fcg zJq72!4B(P%DM#68>4uBy84Tx;x>(JdHA1rVPQCs9+nl+jcRQyi=U$H%5x&x;RAb{M ztr=t4FxC?-J);L>dW?r>#W4o3zN6qT8u+v7I9MQ+B zhWyAjvca)yCp4`~%bHsxR%FD$V9(I!UFjZJj76B_!{hJ%$9(#mTZSs17{1f$6cxED zyT#kE-_?$THx|Pd-p=z+6YTu+D-Q#|=lEOl4qz&`nU{My zH>I{(Rt!AF2i2Q}$ctMz#2{QemS$2mW!?#=)R;|=Kl^-lujzlrbZ6b5$b43Y#Xob= zdFt$O?C(7OAAnyjbKiWQGPg&?bK1+>^Ge+Q+M%IQM%c^{aYI{q8Ak{vJY*t1Gex?z z!A!N-|I|CGuf`*j;nj@Rc*=!!q9QiD7Y5-EwDw3m1Dxjgcdv3V!o#A zwfm>slxXl>5D)u8IgLSkQ_rA5r^R0++JRVS&ITM%@Os<4jvZt6dnfMT5IA)i*Xl+K z2W!~qWuv46j?`Z4POlCnJz6hp817>2V|`OuAJoCENZmYEi@K8e88Fh-dOgRg764~k zHu`eGPW4sk<|a&FCQ)LKN)%J4QCzzc3n@3rto4n$j=`Q`&+y9(;27z<5U8KUn*Al3 z-?)QKLh1S$sXfDngj}PE&~#UGE(%Z_rtV$WR(giJqp2pp^(ogix7CMxzxq1CRF`eD z;A3h9y1V%}vB1bzsVXMcMzWbCBcFyVS8M_Af`(gKtDb8~3%*i*2K}k7{8zu+PZomh z&9mCM5F~nVD#Uxt!nuR_=+?$0<?Dtc_PNWPpmbTsC zAr`anxqqcYyCR*u|HRWKPr@9*--3}J{be`qW`qP=-`<}@E z0{^?qn6B@`V)L}EL?Um8W2b9K(;{~jn=|XZh9OrrsQ;rv{Yq0yY;eU{PfeX|w*OR$s$xEu(@(y9Dq~6Kyjm(Bc7cSyt>QAbTk2#PS9Jy_FVfOF z!`lw!O>Fbd^M&SCT_R+)_qHat_*Rgd24fuHOB!ZZ_3V>)r(VQ%-UK#X>=baZl+OcB zru7Z00mtJju=B_I!pY=1ceyJP+34_$cJQqinuux6)ACp3rZ4YpzIr!q@E0;AzG~Cz z&;vZSBJ~01$}@6$y3P~ouSJjV#DOIegRLdQSmGKPxr!Z5_OT7;848uykFu&YA&DL6 zQd`N`*c9#?;^qcmHhnowRu%&r(F5+Vp&P)n`l?x!<$Kv6W-fMtJ^1no)^QV7uyj@* zdWrEuuwMIOA8ydB?fS-%PrD#KVgt7ni)Ypr>9IjClCKA;Ocx8i5L1ZZv0@LOt2}AssyX0a>6GIQWeZNgWLe z^RLe~chxzQt5oVj77BUA<^A0t(T#E2%v+X{8D($x=?JejMI^`_t-sSHPMB#o0}h{k z0Ou1;lV$C`E-b-5%)1oAZ_aPbARtQ^dE#wm=PFoacFQ?Ma?P-PHW}%`7dD~QQm!PC zF8#K%a5@w?;)au0delm9^SXW4dss?QmZ<_47IEvKs^%OyfEdB6ZE#YVC*wa|v+iL^5^)hlLqoe?^ilxE-jA zu^x;H%ymUng@Hun&!duE@iqwZBq?f4ddz8L4yhY%J22&d29zHIgh)_FF=OGqZ@t!C z^x}G%SId6B^^}Z<1y_|>VcAnS@=@XOX{nLRt>HHIfOY%^+)5~D>+(UPy+;2Lr;z;@ z+}|x+b!DGQk={xD^~S4j-2I<9_iR6|rMt|&1emRWbAOV6VB0Y*b>r)Jlv$SSXF^@_ zi0GFxt9Z4Rq8<^{TdysM0b;(WAQm6Cr6h~CuG$`D(|OKzt0O$h^P;CF&$?!X%4iNA z8)54o#XCE>Vk@7XXU0}*p;V)I$hft)?M4|i%3{Z_a_m++PwqvJvjz3f(66Ofx)x6> zFlB_D)}qSo82|+doVqOsr=t1IZ>c)S3n%p?ofc*34ZH?8P}u`2G|Uio?c<)m6q_b% zslCvwK@DK= z@~y`L=bCaky;3{O%}zw6sd0$q6=VXk)^no7Fv(lXLz#}EFureIH2fSihc_o(#iZ5m zE{#}?=?(faEc=8Zufe5}O4{fnDuLZnI(*nV`(_{YR&+bz9Lg%nKEg+PTCc~Nzqj?| znr8tgbWX+FV_KA4N#Z2&H}!9~1#0FGp+#KsE6qjbW@d##GO=>C^{(3sGzYaYniGP6 zt?vZR{%r*mtYUp1tlx&Nzn-6c;du1(sEorveSJ&$F33x^I5_0u?VSGb<$IGFA?4ui zP!rWUJ?AQj?wU+zx@%&U*gG59LmY9}Gns~tbEB`ws}dUX1P2#sURRLxsmh2E^e4-W*vk=XPl zMsOj5cnu>8@5$166urZfK0ApVHa`;zDQhXY)E1f$_f9;)_YiC9GAvs?O2b^D+<%}% zhEmp2-eW#7qpn}B{kUb8lK*s?-kBq2WOfZ_f{TsqR33wx3&c$a2M13-el!9(L}v3V zC?RLgIb8r|b$IvAQnG6n>>?rS&@4IBhZB#^Xg#-CP+#cVDxK4nPS~^M1KaAg7yX{E znUai>PAl=AyVZPm9Ed?sM<%}P!{7mX7jV$M=RtV|A@^p_M=WH|MUv$l3kfTA4LGV( zxe@pITG*8vLNl{b`f?wlLy%K5>af%2fUqBtxDO7jDFI@>@UG#xa$C5wt(Y}lQ_85R zXi&6iZqbc;F*x4IDlf8K%K?mNCfZg=#i5;a;`I!QvbGeKo-CXoR=1v!(d+dOGRi=J66e-j}_)B!(9IJWAJZtaWAihqZFImjv8(;I$hkJ zTg#SeDQK~FGw-+Y7!h96arF)~7Y@<-q|&diD|BRzz4(CAiVPC=#F_Lkvh#x@JHmW9s*v{%`PKh3qk$^QvDr z@_fGBS5ReaxnKI;?}QFN9M!CC<$u@;EsGx!NOT;Yi`zdil+g-T^A1>n3*|o ztGwm6hRQzt-s*f$^AoGgftX7zoA3ov2DUG#Iw0>?=JD`w^8|7(Yo2H5^0HCA zZe!WQPG5t8Xf#r#z63xLSC^r^RLI%C7+U5O~Xn0^5Si0+ew_lSYyEb z>iC`=s53ces;d=PD0d=(pn@!{QPPV(%=LDI=?iCrIuX{0uLdP-5vv}jM(d*qIUsZZ zi&p)t-+M1Q-siO0$9%v>tmdAXZ+29W<$hgH^Q9Pj0;;YTZd{@p9zPiyi&eG@GWDo1 z?WY|#?FLJB0r5Q~uG-phR-QcJ*$dgTGgy4V)5+L9m&v!SJTh$$22rzfeHv1F>NZb^ z%n8Gpo1yc3HY`2bt_x}7vGcW6*Gk1HSyg;46-let2x-lQ7;JIah;oiaq4I_Y+N7s; zjSWo~0=8NbG!g9Crr2$HRc=q<%KsRJqcRuu>_cz^I3aYrtvxogAZD?A6pE+}EN% zPjWqU@{|a2C?m2;v#oc!&um+4pi&Tvj+ld#70(^^6Zl=wu_Tdja^)0Z3;ObuQ-edB zFbX2ip9@A_n=y%CZw6ePWZZ#e0WnCIzvAH9i+dw@=W|2IacXk|pllZUHcnZ40AX_u zQVlAF-oUm@;iaHxeQy)x1R}3X5j0 zxOZek;!=lhRqj)jn3V1>^ zyf4ed0Sz_63Kj_nnp?g(A>9c{;B?By0{S8#d!yK-J?~J?VRN<~h$MtV%TB24%(qDf zqBrCr2}*Gc`8?@U0oeY00!=8<7H}B3G>Kw-gL{^wf zbmSk*{GGtR1pJlD)A6Wru2HKIjV^e{wvF$}-tUN&te$E~uPF3QSo3KSBS}aT{Gg1i zkOXGb7_Z8(JzdPZZ*_%A1~`Ux=vxT^MF?Vg!J0yR!2D<|a3Z<=uKG4m=|AIzAr4Ju ze8Ck|Ww1_IK6ViNjhTO%D-Fivp7d(iuXy#gGu1uo7hG0 zH0du)&L#7duMyYS=TfEKl?cIK zrH-$N#L2iDo=pvJTgysPea`c&wpB~31c)NV!UQB5Iqcp=Z;i`0+V_(?C{lH|om!e- z%r=%%jlxTF{5jGZShjj%=Wq7Y<|aGD+Nka|>{Hw4BDD=ARBlA1Yxr>yXU4g1&L=-x zLph52!mM-?45L=Sjky&CE35fxh0J2V4~OsAsz>fyuHXT9yK{8tG7j>B)3t2FCcI_UA#-;jXM6)LH$J)3dMOn+BK)h3^LmgP&2&f>-@gRQlP>; zokLyM);3Y#m}FcK_WU}sMG0(Pf~rt9693(F|9j7W3;bJWhF>W$G;Ag+bcwlX_w#r_ zanc@qTE6Y^6l;~?pAQdw>xxdBIx)^MM@4aMSB&*)u~qGY_Cp?~?Sgs_p9SjtMr#x_D7tp=@QKtHqH?TIf;!vb!wrg87hX?yF)0?#PY1z4&n zV(qm7wc02QrV6{ZXZXXi0v3VOhSi#gwaC^H;QfAZ@BO}rjr% znsucMpv6j+jKN*Vf=+%D*tEWaF0C(ND(U0zu|P){J*@kQl#5Mnm4*t5y}F}$h+%xo ztYtNMI`y-b`8yk=ow7VysIDLFBUIh269oq4zWS$w`Im+N{^tVdqSps@8|N7h0W$AG zq8i|i?{ixeni^m3t|PqMucbR0nx_)UaqnA?`(m~>@f*?!iOxTlgq5aRch1ernnT;H z2g+D?L0q?MF98+*`)_~HcG9E1q>O>+UK^kH-M%AK%Y-k*o1V>O9JUB7sSgQwa}EP> z(t=oPTS23krhsB|SIwyOjzx_?n4K2UKvy<}rn?<8kb9y_vrc+NBFX>=rgywR|6Yd8 zRJ2}}phBuJJqDFo8Le{Ca0O5*^=;oo5q{m8+^}N#ju;JJ=&uwVlH1JU&?_?@hTa;F}D3bJi zT3e$#GwDOeF(U7Ih~bP*Fc6`rbv9Lgd6C~BIHw`lfV%f}0Wo|4te2bdK$r&(7W)G5 zI%y8Ri^-k4Qqj_(uah6Be}D>@*TFj34wqkqAg5#1VFI>p9o(emFZFFk!y6R5* zG&fHV)u3H5%$~F(>ze0VJKIcrph?O*<`pxPU^LbmYb!~_T5SlivZ=dtbuFLzZT>Jm zap$JI^x!Tjmh02Guo`1tR#fC68t-O?&Z^*CbnKvgsJ=ZhyK`%X*nvIcePX0^OcF4U z@@&uuUfkE6W9(MfE04S`iJw*O8uxrkRA>NP9m=b`OK=%z<&hBN1W^^KuPq7ucET^p zdzPVpBmI>p>%JG|6yI#cYa9O$byptO)U~a#wpz7l5di^_7Ah!+8kxh?DuXCPF@!J$ zDik7NCM03T)`1zSG6n(_G(Z9YWC$S)3IUWMG{huK36sna=1B(M!TWA+-@Ui5_x{n} zea}B+=j5E7ea>F{>@|GrTXTKRMJ0Eozy7t)gE}^3XPSAY#x%KRI@TjMorBDnjZQjw z(e0&RLa?yfXfs1O6cJ4rrwf+Pyz-$(8XWqeJc`u3;r&YQFLV?@SD&2TeCCZ$7)Gg# z9P#!`0|$k*hwE5|9`M+KYVoKq=Rddcb8yIj8q>YKF{L`@M(D8kGw^e9T0M!3b#*i71O*-r0a;`_ zbhqv|k@TBoWAnE=6VY~C&h|-lso8H#&hwgn+=!yvJ~b+Or)-u>W)SNJwp4vBnrE~! zPq0DfZKE`2pcZH9YR?h#IX=CSSr7e9FY{3z#jB&zP`mcVky z)DB}Q;`F9%)_IQ;UCxQOrwNfCv-HBfm);8ZnFXopaNR0GXIBWJ zx{@4Jkgu%YIuHiaFHJJ>0B@;Bt_?Qmw^B8wJVYd`yvx0AJC zv=$S!x(**pkraliGRdpReai&tJ>wHF(BSB!fSV9_kmE!>?Y2l2t%=`B{HmGnd((xg zrMN#gb7vy7a9%?TCvT)@!KZ6&=B&(swA5uovmfvEzv%1m8T963DRzkspEAnBEcAg0 z3_2S>Q|U-@ZnwU>2;Aa--sJ>5QcdC4M-uG@^=A+dghvsgD33MGgJR!f7sa+~BOqqY zYD{v25=~T%X|PpOyzx%`hD8W!$ny9|y$+Q%sWQd9}6AC}-Hlk@HN zjAgUwd(%J$ue-kMEfqk@mDXh|OLaW6edaw&b==CiH7B!#H^?}IQ$kx9)C!i3E6gB7 zV0D^wO`;dFb#BEDAltgzinf#zh=g!l9vJc5S^P{CZ}CO~)*)!wGpUK_TBT?cApr8e zE}M_eCLZ)!i&(!QoKP;dqRt_qH;5G2yS<&XbHllyR+(PyD={Q~va+RUcFt9o%F=EJvlj=XgPm*51;5C#YghKn&so(r44zTR!xSulEG|z@hakrx;C zZRdS8eM1FTX>ljGGV8}8hz4_#@g~cDRm3U!6ljoCX0~c`IK-vQHY-A5TvIZdJU7Gc z!~*^+B(a8o#t{%?cSMQZ#~=FM>;GT;_j`HlH(^=6DN!-9aN3R4lm*w@f9tNa)gSdj zTp3Yi;2WGY$2V1T>>4S4)N>@QV1{%EIi`s^We(n$BCm>{XIZ1^!zHXf;iX@%Zguj} z8LX_%w$<6@-y3xmj@)09HO+7iL0BZJirk|(9H&4JrswvUlA#kLqU`OBH5J!t=?>m5wHkOt>gi%*0#$Mr^B}LzKuZjUMz;79b1f zW&!6W#B2=Ie~fapfq$ueP9pPA8&T1KuR~DFZhoNUI&$pRM&3a7)%v-?LGCA6!(eP_ zC07*nNp${OUef?eFiBR(X%Z1Lv2I!>#Ri4E7iz2?tC9>&0>^X*LoJy^9i@a&4ZgJY zy%B7f%dnB46`8k??XTCpA{|bq>S#-j16bdN&k9L_H%$^n@b@@d&<}wU_!S4Mku;c^yY(*>z;udKj9@4`IZ)K5xy^;MkdR)P7u^>MgqlmFl{ge{NcjAv}pYI{mDVH3JBG$Hz*+*(9 zzqBJnF3RbA1Ko2U|4BPklE{OyxH21Q375DkQi3w&0~1OoNdHn`WDM=gUF2B9EI>{A z_TZxC_XeGgl${5I+jn*qW}`Mq0Q|ZXKqmeqOXvOcUPwJ)a7{XLY5zv%bJ=mS!)}xB z?$?o`n5*0D_Q)P@0Kj-`#OGBcj_SK5+_1TC+r0PKGEC*Y&@IY)p)U;nZ~xLK=&h>l zJf*hk2LncuHg-`>Mxm0Ko&Hf}<|5YH7rK(JC47_j%U`GVzyI#bJe3wSnJ9%F+-b(% z&B7MP^%ucudTXnlDr3~FDWfbCXQ-NEf{J5~#0HoUNVzC7MY*$`|Dx6{Fkh#$Pa%*` z)0@t(@>nh0VoJT4-~NPdb#Fvgy(+7yIC6vC7QSU!6RhcM61P+lQJlT5qp%l8vSt)K z&6|B9*<*>+bq3=o#|=F}ho>I`4!i(PVKmsQ>VL7fiHk(C>1E61{atJpSpZ2 zXdh3UxsI>ma}JO)?XX9%H!^%WjZlCI?5*y40Rl~5oI!FF6fIINA8!4-S@`3R|E>>v z|19=UwaTLZ)w+%(zpWp6Yqu(;?J9!W{CbVeQ|+c4X^yJ^o9vW1Es!M&$111i#(EHm z1f0wF;&X3b}LM6mU+R|n%U*t~C? zlwt&C8I^Vp{dx~JGqmqU-1*!^tC|SWrFg~#+a7!peWJIL1YL#1b(A#MoF&T(Cd+>$ zRCAjx6nD-Yc(ixzpW+z&bx{A^I6RK^eJ|u?G2C#xJaU`&)9s$WKVx6*1&dSYRTFL=AUP4pl}HqzCc35g#qS;}tCb!U+& zF&X(P1tlQ`vq{e^-ThCKz6+9#uJwPgeZS(JgNkBbev0$cwVBQg%&6&hk|>YY%^cm1 zW|wBa2?7wdKsx-^S?ITWAJC9e+#r&8FLe}(K9ma{5o4civ)4r;ZUSoT-kKbk$^ zwsK`}oo$?!l&?AF`G5@Q#H~^rLZo1}m%yvek%3DRBcPBkmcID=+5V%?|E@PgQn~$c z^1PJpFY5`uu0gkXiE_1R!f^!7FWww)Bg|z-Tt>IMuZx0$GWA4DlH&l`(P}SP#;Vd%&5)=jX0h|fjm=h~;)O)_LP7== z+Ez&TPW9}s_i*YWyfUiXNnQklQ(>C1;b`_VHM()Rs@_kBO_tq8I6-g6HS72amol2?7f2ivux@Fam4AdFx*s&o6?S1mMEb3_hg!b_`uvmj@n1*#m&Qj_Jg_(Si&p#6 ziw55dX?`!I@poqk358f5K6QPLa>!xx)%tL0B^y3lF2d}%BpTq6CwsSqxOTcuM=8Hq zwZyo9P^?an@r|o?8ExM9q)IZRuX-6dVQw|emSJtQ_;ua&dJvBPG zIbC*i0$WxFkSZsd*6{}1nF+5kclY^9+-V@B1R@uijwU@^b1MK7yRHtg#u#XoWy$T_ z8L8?CU&=Ya0Um$B4!|*~9y1|&yf-stZ9bZJwzkJ25GL8W&Xu_0OM# zRHr7%zWvMMc0-lok|f3;HY0mlG@J4ES>9|4TU)+Mt!fl%bT0W#>sM8yrkhVBnfKPF z7OxcIKaM_hHowgARjQmjG||e;B=#iZ;F^mf(Ka@!Zo#fT=2bb8VqS5w?o#?zxf2B5 zR#WVpBSWrl+xFj0_ER<<;U6CO_h1c@rY{@L?7Hh>T}ol=`x_%z zj;}#AP-E_#`0;?EoVu>WF|AtIl{n^UZ9-RANvGMgFmq{Ipn=_AL!w43Qe%9L>qZdi zp>O#3=-wL?zYH-^Da$K6?+Wuo;}Sx4EniN};yja1`oJ(cBwqHIhU`UN;sho9u~!vi zOe2(I_i%RC&hyZ{M&{@w6UkO%Svr-2O&l5JoMS)#?M6>td@Gyo2eUr zn(fV(*uXy*F=r(7(nlxBaqG9!X9y(QYt8W3yk__b6Pwb*=sSBo{3%Y(zYXm#Eto1T za?1rPypfXmUTA#wuJMb%KSM}E{#9n;yZ~Mct~TU5`7?WWNX_fKWV*|Ruq<&8n}=FK zKsx_Lx}jlY3IQ+gkaEMZCTvJnYMB4+K*36tNXkLikf)T)t_7-+hZ6}xb_^wdqSsU(va74TBe-2QHUgI?jC8fd6*HOS z)lTphI}V4QJnZ0m(6_2RgoefY>I7vP#dI$3^sMH?vny6?3 z4Z}t|kXN9FonnS7$msOBgK=RH2F5wGg|T(Dts&xIv+ji3dac)dg)Rw5&j07RAx4f~F-1kB!B^#Oy6!@^P zFX3hBJ`z8g-)~2Krq*m5HlyB-(CARH%#L@`Cvhj=3jtK0j{!XM)31N~%$1sWKB%Kj z{_s}5>;qx`+-ELTR|9N4d!6KK9XTBN+ZWB%U1z2j*9&qP(xzKdvra5xDe~T45C3=e z=Y9GIrQ_SnFy*HjBvHqr%P^U#7kjB{FrOL(Kq6HDfO4bL(--AE5JttKM*dkAk3}o! zOUZ>qA~LqH`&NSmbin_+YW6ToINe(uJh;ep*Wo)?_5`KJlDW*?8q!^ge`kL@ts0szZzqyhw*vq=;_80lIco?2W$$) z-(LQH=d@x9?dFYeB2p$UoH#8C8A-}86P&4hFO&;7ihV1g*BGzoOyb62IDSyH0NW}J;jBIN3F519NRs;Whr9Lj`-7<4s%+7gKyNuLP zl|N(0SWe^QbMmV$_Z4=PEM7Q>NV=6`Ygr-%p!OqJ0L$ZWR&T_uA396LRn5vpjkYxu z*qUBW6fg_m`cY7dSvE5>_?C>NRqjq9LTE6tUalEX)1=axElF<;Q?Ku9<1}(e%GcV6 zh;xaBQMXn|)(ti2@h7JmwZ`Z^ndmK(g<`JY!J526?{w)px*RtSKbtR;Zj6Vr)S2Sm zKprbVs%C*-``Od%w{rWhwSO-s?VnvuC!@1oSD{ko_hmvFV*S??y-+ux-)C00`vf9M zqFI9!=MbuzWv_ji87!JwV$Jf*E4f~SK70#d$MLPmU|hUibyu|^p>=do6QnikuCy{h zi>`x1pjc%h86ajZ%m8K~B<-WVBZrn7Hj}F-%zia$d1yu=(*+@Bz-1zj?se9Kz){{`J%7It$J3^zQ4g`33a}doU^bq_?e@1eQ;m3PVrQh0AAJYEU^A)Zex zFgHnbvz|Rek=jjx`s{HtqO?VxfB-Xpjw*_K1Yb@@u@tpA0PyIf&Bqdc9>|Ql8YcYsIIzBb#{LyRbWx&04c9 zYWUm4IIJ8S0Cc#_z4Od>T7~%Wzb*XwpGoW=9Q(bv$Uk1TkJE|rDwk^qX^&&mdtMHe z+J?-JET)s*^jEsDPjo^D$V7r1&V!)fjv&hI`}V@5Wu}Ha&Q~gJS$J@K&qeJtU)b(g8fCRf>Lt zF?J2RKCjfg{{9T$v!>gt1A^TPe(1RT;K27n>lRr{Z+&)a4cUX^00LG)-if>@u{w!a z*;@bpCbMf%*ka!)gk?v=xbCN$VRg<&Cd1zg9ptQqoer)W&C8%Gew>r`UMOlfM8CE^ zjo0Nf(Ay8lWaVx#|4#NGQtVLSqDcopSNJ^;#E7}Q7y(uHil4=CcVnk}ZkQx3ox}Iw zS^bNx9SLR%d9$~GFk)p7u}r<54Jl3K?gG^K_{Wf^7SGAWt!va-7fq3YSzEf#gOU^5 z?S*cAy>@*{8u=IS59b>ib3UVN%kcHP8Upj4LIJ_-?rV za`0`0Q^}*QmyCd}Fe;+|F?_!8f5*oClSu-?Xn$NR>95yGofedA@~z4?jXm0$?st+1 zD6=kMbLr8(&x8fF3Q_u{` z!)x;DVWJ=qi)2eNwB!xsI~8OkrgR^Zglow@DE5~&Be2-z`7`zwOx|e#AY`eVHF0z( zwP)>|Q6K&szi^tMxsz9ABijRy?+qXD!oW&(L?7F=KabDc?|CrwJHM4Fqd1MJ*xR}4 z%Z4V7tL@9NKxK-$5m@^T-gqIoyBpA)@`H)!46nNT_ft5HnbK$5aIR+)Uq#f_b7gOG zT?Uag_ug#ejYD)EKKDd%{_fSB4R{&PsM17hLgCSG8bkD3#4JV}Ab=mjS|P86j6QCq z7mE}%oRNA0$`mQ38=K`(!86Neq<@NSC`)TQ&dsSauyHc&R{VS-RpORjrB+`qvx3=Rp6*9;6xsG1@D$4Jzgwmul2-mq)4HgPpaUeat4NZypB!(@QuZ za_g#y#be7xrKAOMV!~R5YpC;pKOwtNezLn%m{>Y*8qb zt@;!qB7;)Zv%f0FH9BFAW>|gJtZF?blGPr*U05yME2vEBYkz0R zb_r4C`&k)umYYLFC#dk(G2I@l<@smzx+Mu4j|xjk+r^22y(Z3_l6q=_UOGXuvn))u zX=O;u(dcQ2{VHiCU$7heJay2sO{VNjJzM=~b3Fj@_{&@TcpqT0I|}H6RKQCIc`U-Qif?L0VZq$LN;DIp<5OZX&qeif?k%nN@7O}9J4XeUK3{#;^B!)?ADGi9v$ zRN95I405u9tpX?dX5%6 zpg1_#^HqqI6Gn?7)F&-yn6BZu^>UR zg^o%BxG?sDBVn$_^;#TkGFN>bz2D*Ie-!jTI`S_oFj6ljSiIvt4XF`~(T%`iu5{X* z#SZGT6RZWF6ivU-FOAyN^TZMotI4~M#T*(p#?{CZ#xaD_xW8uok8L*ouxy2GZ{Hb+je!O*hT zDk>&6H?oaw{8&#=;7PG`3?GSCrAsK)sn>>>CgmYkL+60VwMC@;=``m2v9P7pQR$Gd zcJ1X*HvHy*`RR*oEGbGTGBlicFFEK95HI?mwgAA`#=?O;S-%XJv49SvR4fVj zkSB-+9|JD3-t!iZj}wb~@QZx3J-J4|BOE_Y7x7-&2U4Qbdp6n}YW#@nq|!RwT4qX)S+Vvo!Gi18 z$CCAgXDrD3B{p9yjrU%-t$Sq7Sy;RHq?bMu;<*9)t~}mc&kloi!Q~%wWUp%ojG#SK zy~x*tWEb`5PcCT8xM)x?p`Mw7QQxXa(c}s00Yr3rc~*(E?~~AjapeIdtQXhP&6;a& z-4Q$_oBR(`{D%jA56bcP7k+$lJ7T}mi@{D+pn8yogfNm+on;~S*2;%nHOnn#=7rKFT5gb!lWI>Bcp2?gtpO@Vsk=Y`< zN9v)VfF4+mheq1%s;=Aq{qV}oT}}1Qa$R_bja$aJEpdJXgcU&5VHhBchNQxwW^8rn zhYe`*&VP^dPjNY)_H8+MT*u($`jM^R=F{w1fvRRZ=9s&`9YgbcyTHnP+nlCm4)KX0 zhk&fg(hm91MRCPkBn%J;frapI z0Zk!h*1GvJPSKVP{kHY1)Cv0CLvvl*VjYK|F=t7X6;k?f!!RH#b zKg{cj3tTXF!K9EaqkG(gX^yzdIORlAb@bxE%wn@l&Xnal6%wHD)=39(k7u84U`~1| zDxb`G<{{1P7Z0nWvh2@{!@pcS)=Az~Db3MuaDJX$Qn!hH{-n0+q>zxC;-fHLbk+{%wM+F2{STg_~+eWsEW-Lcgqc`-$m11iE(?^qRE?$^T zBqjcA6Pei+h-f*crrjbSA;ydQeG*Bm6J8c3No3MyU3Jc5?Q8|GYRsZ1--8gR#=x=Q z*3B)7K^;klk7j9UZ(>1I2UZR7FzR+)C&gJ)~j{0h$4*hkppd(l>k=-g(`9 z^RukB98Ng%HO}VUg!7BVLp=V?zra3lZ#F8S0D1$jbRT-CxGRT2#E3HWLX?OfCtJGI z++*sMk_%h{?^Rf&D5bL#h~|bfhl!WDieSYu`*V||mFwzX<6<~!P*A~`+0@w%#7EbW zEV5XKyEc&25>^yx@x5LDHpo&_EWw3y@`4O}nw!ex!p`n)BD+-5dW&*gt3nSx z-#mK!{Lq5Nxk{J8p~T+h4o10Zzv|^3vzM2=45CWoPHBvq{NUzh1~J2!XwPKu5m_A_ z)11sX0sp;FD0$Iao9j4XFu2P+#thi2rXBoV=){1A4=w)mX^o}_<}2R=tE#uS;`K#0 zDt@mhM~zi6ZEf5oMAO?b_Ch~N;7KuC`{=Qw@524M)BA&n{Z69mP4^}zbY!z&_v7Ij zgv{Uv;x5Wfqbi2)g?RjOD6L|R4tu&vf1&&HuY&ilHhwPx_CKyaCORsgp8rYMzS;Yo zB_mDI-uPaFEp^yJu!f?v1j?*2ol6q_k<#4|X_uhB=ari!$QMbej9=wFn$HjBp!9l{ zMtJvTPg_RdW+MZIiz7om3GM3oV*Apsqx_S+-v0(!#okalFPPOH zF%j)wN|>KNcy^v9TG~UxmN?Y;Is~V>Nx=}pTsHIs8cvl7w=zQ8pXet2)h^PhW*E-`T)`!mdteEKU|RY(m@g`nzhhDIO*I!jN_32K$ff4xANxqi+gWRp~ zJms-*IpQ)uR+G^6JR&9H&6s|X?*4?0yRBMjuX?(2%e(ao`;a^GutPCWM|%*{j<%I-noB8CDfV&K0aQK|CU8rs6o`7v?+VW>t8U{j9d5s~ zcj>?L?_Y41931kM4+(ufF#dW3vm8omepTfl-v}XJ)b7*mV;ni+ZqQ8&A>Ph!?*D>& zQG&;DR9nacgV#^$3 zv8qX}Yq_>Pqg1}ZU*JsV3RlG{8oX8nWsAphZ6h5pa$p+mjB ztYOP30IfA9a%$W~)~#_gh+dKmFOmn7vhvmi31hb+#5aO^BE%@NKM72}E20kv#Gf}- zmed%@OrJG}W6LDewumzsc>QrT0=O`0!dYxlW-AWV?q#v6kA6CJs*s>(@A^D_8v!3H z4>Fd(z9frdZ^#r*aCIjJ4a%9fv+HD#n1HM?6@YsDnYqKysfwmCE@)A!(R9eSIPj>o zQqPS&yEG%g@Qo#`gN!{+Uu!Jw7)=zF;8 zr*aJXEw$I@PH(>LfK480{2Gu8AV=%6Zl=eQqkHF^I3%joZS#TnxU}pK&3%NiBBRXY zPO*OSUTqGb7*~3BVNCib>e_FYUNf{E{KqPEGTTbEVyi?AaOIu-?wXav3u7=6$xI#E z)eCPLh@FKNtq^0+Qb8gCKi&Ep)zEK*@qcUnf%TOJpd)18#B#pk}Cojg*?e*Km z(p@IYee^>}>34#RSE&^NEdy!clv;*9);w+G{LG-Ac-6!wG0l*Cpmfq0HuBv!v9tw2 z1y#c*b}Yy{h5w+(_xMgdan8%Qc`%yWDWNLa=s=nv6ecx(1|AWm1-~xtrKT-Bd%;m! zea)>M?{DlwdN=EP`=x`GrXtJ?gDU3UoIFEsK$|k;qia=W^Arc2ZqOWSw!6Y!3b=@= zm)v}3s8*2?c2O;8I}rZ#q;ws8b^dY0mbp{kd_$HT~DwK|c%z$QgJzzu&(`rH|cgv-mvXLAQ6r(X+k%C*vY7?n^PF zH@}KmghjY0akuem9tIZ*JSHr%uv#sOBg%NE2aVxhwRTrb3-Wwd5$t1rlj~6~W2nW1 z+K?O9mR*V24RxDtT$MWxc=@GDK|zSwDgnUF--OiI>!J=LzfrR&Bg)-CjlirAP3Alz zqfgB-Vv#@ePz)AOi&smLxrV+`-GD80g@7>aWGI@l zty^x=TW&szt(cj;buXEn@AxI?r=5fcJ=^m^I%OB0qnlH50GzAM*6#%2A-%`qL>hPtv=l5Uc=>ib;M1GW=$71} zb>4rC^(^a=iSOOAw|!|J>;ASS#fcm;4KNv2T9g~;kl<&87cXU2HGm+;jTKyT#9itPnb@kEg znzPf3x0LCo?@Fl&TN)~z?bX*wR3^m;)J-fT26EiLKdre))E?Pc>&2FbMGf59V4qry z*z%(F)?XET9fnK{Y6!1_&klaM{)N7}iLP^f|AjT*pSFIImCDP$IOv@gs`)DXm5dn- ztC~=o)gzmZHBJd7Bxx0XC5!J9Xnou|M8Lj=eOg1 zk86v9$(dvw7k;gdHTK>|b*!(W;ry`)|ws==4>frYc6>N|a)70D^O}~37=-fc$qOx0L zjmFmb!nL@_ja^r$p{@vp=3~O5w4ykZY#WIn5%PxJ<@Q1!B8L)f(<>D$?Kt>ygCgHD?HT9(8P=K zUg*WdVI9!R)?*pQlK~d1k)YTJiHcx+O<)#Azs9wGV0lIUT5fcX*a=99Q@KG-7^*pq ztU4m?c!hgi&jB1!EK-5(Duz|6zAitd_hZkH7F+_U=RKWWL)~TetSKREqi*1{mK=Z` zNk^V>3*gXH_c4C$kzJ5}g`oI7X99Zut3Bb&vp!VJ9!Y^z15{>J6UEnXG1DD_@Z^p*j4L>>Ai>G)kbQ3&!A~Y{-OS# zN<#ZzKUl$y-=R$L{!G&FuFa$0e+S*;nA z?8T*K4SdK|0;DF$;4=AR3c4fiu1fi^W>EMvkl_@@>)qzl;7ZTqIh@L2Q1TS_nS`8N zb%Fv7?U)Bw{^{o9@X$=Y;xQdwAH2oa7ja=s+Wfg4M^UNk@(h!U5OIIYbTr%mICa$t z1=GZgm;@J>ZJUmYavvloo`Qq%T9Kn-+2La$Lmlw*ramns~O zy?iT>2KDvUhL|BP_h^i*+okwKVtZ8L+ud;jrp&TzY&2{5WK8rFcNuMHg2TDU61Mlf zOuO*$aOSBCP4;<=3errUWibq^JsuYt}59-96yZ>h0v} zqc(q12^oz$M{1V1V39gG7n4CUja3Rv{3)oh6;KhnH=p*g$9q{^YanW4u3xb$IdN&$ z5p<`||G+u(2LQ0R3u;h1C!3_ORptA|YYoU3FTJWd$5Jn8V;t^L?!Wl1bS2Qcr`#u< z5En=fDvWiJlV4C1U-k74sRcyCnhi$*(Y)G@8CAWxwCB$O-cAC8ahZ_b24v?CQuLB= zPkC`DV$BmN$4UI2GBKOYb2IL}H?wD+CZ z(Llx{a=~$?UM&3$bR-4!(KSG62$iNXVZIrM;uE^*Gg4(VQAsKU_WiCAM6#?tzI4dI z|8dF~+c(F`gkU=DT&%9|zL>26)adAS5b zDsAwqAr)KN47M)nsl^wY4$fjd7RfWtUQ7AB+O@GauiZJizeeBpElW=h?9OZb$W!R{ z(Ft|XMriipi(dO{+XSaMZ%J=>a>ipv6kE;hEh^YDfou`bQ~I@YrX5Xp=7yL0M-9BH zE%?VG=#Yn_gf+&5gi4@C=Tc@L_g)Jm-=?y^TREC@mI@#iI57u*{OhXtU4i@`U;Mv+ z_3rCyzdX>S-BG%!0ZHREyDVZS%kMYY=6X^wV^AYCra1^eE~x_gs&=xsw^z~m>52-X z9L`lcqfbsVV>;3hoY~T7GyW0ubg@e zQ3V|*1iGW|Rdg8ApID1s0bbTOF9cdV&c{nti8_#W4-*Hj-*-54mQ)E?!Dn&{7K48w z-2xm?mTzH~wCPhof_Y*fv|l#GsfnrOIZ$;myuY>SE!KM=|6HR-G{gS{I?&s2)k?G% zidu4A2+S8aJ!Jas>-S$j(aTeciL1-W@rFSSY!qi;`d(;H7&Faoq$s3oU*mLT(ngAh zA!cFM%IIR4H?i!K-g#&9k;e?p(rB*1KC?9X4l>hVi}WOAXX zj{xbloiLkH8vnQg3cQ|UZj)>`e@Z_Nu_-0HD#+a&TG+^Pzra6o$lV8C7XTDduuLQp z0;7}k%at#zdjf`lxVRdCJp`G9q&hmLL}bd(_SsvxA~aGM)-C0FR>JoecvQ2~Z#8|R zUR|&8c~73Yo>6X zxix4)!CuN;)jrGJ$+VPbd^_D>cU!$5UwJkOnu6-K^m%jbnDO&NQ^biK()pO>VKPj_ z4BZt>b8!c}`gdOZt?PfG^?P`oeb?%J_&`pAUg#Wxv+=X*|MWHfw&VYBO);T^goT7A zW3InvLs%v%R9UQ#5=R{@k8eCXWxRjCA)Vi#hob|~MFTguHKcFG5l-h?9Dm{MFCFfV zKbH@@jEW74Rw1IgSuLO3<%0&U#}%jPA#+G(z6KPZZwIsIu%XW#2tDWXFtkI-RzJL6 zG83*P+>|LcI>brTmY{DAc#6v+pqZRUfGNrEcQ(!0+RLBop-gcwvsf|e~=NKo+fFne-DVG0dZ|0fQIIq6ngEDZp0 z6p*S6lyqXwk*dTxq$@MK%F``$Zats9c%UEG7usVsA<0JxS9Sz!8}`%gmWfJS+PLnS zKL&xLPVh=hV`9%yWc&jhZtTju)7|VG56XToWRhXnsR7cR?ju>!rde}Akh)7t7!ez+m<*#whSY@rFYhRV}5E~j)8H|X_;koyJ^KAa7}X&-16Tz z1;-Whnw%-tOki=5$hbnHf`TGhL17>3H$VA@&ENHCJ`Cg40^4TDdS6%Z;@7ReyJP&P zBFE$5@dQ@Pg5{kJ6JO(csW>!G_+ygBE@`N77{^Lx z-P1FOKu+j6>sCjr8`s~#MomX*QEz?Nk*TE&TnLdg1)J~7aaWyCi5kk5i9ZI=ecG;Y zaO~bwg*#iJ88E{&-D2KN7Pyg^_occh_c+=08+B23eg+h<5BEY|Kb!j$BcNz`DGO6M zz!A?rWKmemsJlLWPtm%9QA!Lk#Z^&y@CLBTrgbE)Q^bwQ0IcU z;&WVmE#^Rw=-rYm6g^eT?Ll%E-UIfgJjtHCYrV<_9hH!6@$x%=nZ^#CGefi64D4oM zkf6+$eLFJ%ZAEQeJ%c>1%?VA1w~X7ivx;Frfl4GX@?$ixhX9~ZDZ{HPnZixvAY)m# zfEue4c6Ka4KWUR+oykTOO>^Qp$N8H8KXPBuG|}BX)GclMZt%~eoAAY%NAvrUD9<-O z6JDWv>*b89s?ka5H2J#G-1J56eHsXB8$yR#1JCE#l^*y=<-jbf|BNa%1RwO)vZRzg4ZZf`-^8Zr-^8)*?zMZzv<);o4*&JyLmB_lHw3! z>9l3HT7UMW;CDOv5Bt8|8x;75T_Zw!@j%h!UC5vY%oP;KIKbWt>F+>Yizdbz2y3`_ zP+{*NNbm?UsKLz9V?6ejj8B)S*DUb0aZjZ~eGAGnD8`Raqr~``HS^b4DArAu3LX{pLsiu=)R9e+o|= zUO!irW$5es)qvo|u+F$Ee)L?Wgc89$UcGt~c9EMO8y9E)GqXzE}bK~uSlB|IMZ3?x$M!RFp5IN{GL{TYo)Dfh~5A41eqH!D^ z4UKeaDiP#rje3EOfnu*UGdNOC6AWgPAl$l0n*V%ct>^wUirkHwjUF?@K%}nTzElgI zzwdaqW)JKto8;K##VDx+oRWT(SLaO4WiVT576t*L1LryU?r=Lc^) zu+i*e#8z$&ANpYrd_j$W@X<1Jv|IDb8rxwMhRVH)TEEU)RZQY@J-3TTA)|n{!zaIfqR`=M?L6@AfTc{}dG0yl#+gYx%Sy zNvAg-Ko|3R*VGz$Q4j9y?*+(M3TydJweVS(cqowu4Vp{s^q?lSyU#Lx)nCB2vz0#y z2-!97SBDwbSQ-}+syD4)Txf2p0@fj-Sz{Cfi7xI$ycrJ#RoThJvlN-=_+ zyCpQ_)*?$pitTiIE?hvJ$zBf0$cXj&sQS(yu8qH)@c-Nybbv?IUT~03;OWjU`v#=v zA*;F$ncFJE3c70>l<~?GV|)rPoiOJ-*<3K4URa2~goP1aVINrAx?mO)HB16Tj8?P&p z3=Jy)EeNQ#D2Ap#0c9P!on5TkM*M*RyzG}rB-igb)9DGWWpD@iif6E!rYh{G$oT0* z`woR%au*o)^RvD4jM10h0*D5@BAs|klKH`*^EE1_8?9)yuzh{;SZUUIfrOz^+ zcbCmhaea@N`tXlC5oYv^t-WR<_6ab zX9?ZV2fNnUwOOsh+V#J<66r4P3L)Yi z(*zz)F3j2?_grrJEFpcd;aYX%{%Svtu2?A0>=*19v@7|5heB*uQ&fH($eeQQJ z=Lcs$hqL!SS$m(e_gd>+@5<2lb;bkPIEXd9+SathBrlb}8>};*%8dxIosbj9BkH*9 z@Gi29Z~;+r&_bujKREgRn3e|)ZkRgfnhKTSLR;1_hMsHfk0}`=~~VXeT4qlJGK}orDt1y6G)Qm^y@H`P71xnQPFQ z-dKV{lEBv>V#BH=s2zDk;Rk`@#K#=ZF*tB)xpoDKN--iR9YSlAGdYn{5 z!Zf@Ry9+m{d@e>vvO2*&!4qr4$=Kk4o`Gs#HA>{?UbrpK?K^T)GTrCLo#!ldzl=Gp z1>dT`&9JNn@N-^yLLNAOZxd6%-**6O{Efz-XY_H#z*~R2gZtHhNahD@eOoPraMiAJ zgC1LQT2&x9yFXFBWraTMS(5}W4%GtA|v}eN(st8vO9!gCFN;a zuEP^tvF(ZUjJ~sWa zQ%bwpf9D5|-QUH3FfuXgvQ(0Y+^9x}Q-qP6EaWx{D9}a#0lO?4&Hb<&+ zV9OF%>Z5o@Fmr0^@H=^Zx37945Io;b2XatE=N)Ac;WgAlj*D7c zGP_5qS?W?DH4KGjeTX!joMYBkZjT`S_+;q!;R9!xD!P5dV~ZF?jc?v*ks2ic1_uFK?-UEc?}OkM zDdB0eOGft*2zD5>mp{kA4acuTWjgzn>tk}mrbw#PCM6{b@)UfzrMI1v%)i8DixwAQ8>s91` zuxk3E*rm|47)cYqLTK48J?=_}6L>SaL;@wFGhy%UX`wyS3>ab!#HZduH;oiuJp~?J zGlqbP{Q@inlB;kY?;aZ^gF3&5!FllsAXD=jpAv2bH-Z;VH-r7<#3WD~w52ZA?7Cn*06yW-un@-dP@+1nlorZ$r^Lz7 zp?v~=7kFS>tV!_&Noy$Y3OLljVPJxyt%5g$n zff}O`-!I5=FLFW{PVSFwlhA%oXgPx66SfHB=+(mQy@BCYoQ2D0fED~IcNdwhTs(DM zWtvSf4y#mr{m<`W%cJdy7*KNSC{Rd~&r*ZxC_ppvn`Yf!i zX)QvOHct0w+2;1(9;ys(SyZ?Pz-LjmB9;`=pFHOeqI*!2U@751%*k zx8;AC+4Rr79+6pkwy3l4{S*|bLMl6^6#%{{?dy_TE^>NINrBDk*OGtDlcA9Ctj z{+aY0&BKR4#g7NK>R3rtn4?FNQQf0?R~$rps?JbWqi$1SzDIZ}=hVw}0wrA|?!y5g zc4ZfrY~@QXk6R^G&X#sg=*#zMyAh+5-_5CXJ4rgc9}QG-wj9;+#!fA#<|UzhXW_W% zZ9F>gUil4K9hCnFAp_*Pq`o4dA0RLaLb)(CR8s%S_S94l?mSRuNqE3P5)^EQv(~#* z`dm}pq+$4>mA%N$NkRtCh&v8M;1s|%&zrrktw-A7ynn%+3vK}rNHk0V0_ecA70RZy z&z7A_A^i%ys8-41!`;=B-7wpsI6z&XJ<|uK` zIGU~mW-V#1!D$wTny~hN5k0=(YM&}urJrS7)3z?0-XL|NokW=GFiG1KujY|-9ops3 zt)8Xn^P$bANWS*z6&_Pzsn3k1vP=fg)Dp}4miiPj$NA=3<-Jn#il6U|ihylgmyqV+ z5=uM?+18A?E5`T6S=4U#R5|ZETFsb`wcPA-&csdg2lXrv9Kr-YLqY4iW-=4HBsx1! zwX=qP9N6Ff)RUaBWge1ogNG8})vImLM>Ugj)Bayg12Y zG{G_w@Oh7aTmE-mCk_qBWAB7M9%1_5)JbT5)os^{O?VN}mjyo|b;3$ysTZpc*~|{)BUzn6AI>I*g9*!%a%p^SEo`*J^=MV zqsWiZD_}7;8?s;2>qQPZS-vVZ6~J8MflB2?F3a+uTkw)zUIG$reqV zilf?M;*y*qQ$id8$~`Pa`tjVN$9uqRGKFwYb&sCZeJNt2T+-z)5Giy!lKKpwfq+#= zHw~$0Vvnd38Rys|MyW06e3|<5(>+C-fIFw9w)*|g(Q#ceFokQAd*%3$^al2>2laO% z+Mfyv$~<&C{c>C#p8VoV5J@0@%3-OR{c9WQna7i94Hj!!w7$z%=tVB=Z;C8VaTVpC z2&62!#3lMh@Y$*~hMrJ%*)_}z4tG*3T6&K9V!@``^WK(TT2WY5ieGqg*IZ6a{%)pc z&b37KB}!|kqfm2d_Y9FZyX)KHDJwqlX;ytr80&2gwU>vxbmwiW4?9~qI~EC64uucf zeCHLn?xE#Z>a!ZT)7b=rY6$eB9b8+anQesUW*-h%d(_yhJC*X5bT3zf&=_wKbytJm}{2Xz@HGbjo5>-8t8k;D1lrN6k}Y#+3sJ|!H=B{CIMV&57;Y-c?c@L3ywU;KA|D`v;!Injmk z6Ku8~7_sv3W(W_gOqS(nU}~D{&eRkjw2FPq(*ixg{|IJE>!D|f6crMy@Ud}mxRkTT zQPGBmMXLq9z4d6A6rdVXl=FF=bIe%vE84@?j;ylN^j4QrYma1pl+4_EX=b=x2*rsO zegT*hAKAAHW+E{>F6v}X>!^Xs9rukQ_Z2A5N8rKFy-8fJ9gF>s;cFPw!dAFNffN5@ zxq=R5eTf(Y#WQxm?|}XZ()Bd1{pVQfNgWW81_O>~Sm#&g$VSc#m{erinRfbR`z5}>NZ{i$?Qsy?qu)ol<7ppO%VWy z2y>{rzW=HYF3UeUuaRgxJ$}{KEqxO!JT`@e*PaNlbc3-o9NHgu!yBh?_JApj1RxT&i2A`0vG;lTA!4H!!UfLSMP$W~!eB-Q zod%Pam@j|Ru#XF1__6N*8CPPnm)%?-Qo%?4)lG-Eq*=+49Bdg%6V~E9l!BNh*1$<3 zcqQM7)h8!(f{*+suNGGIWTMh+Lnv?6j58~3^3AAJZ+QN%lH+j|+{APaGmw>t3}J7h zpo;P1r$C0M5c`PY!-DHeLmgh*mFxK+j9aeI3IXX=>LXrutWJQcm$e=?Q*V}#?bqu! z&xdgdD7m*lwYPzjV|3{6U!y<%`!BOD{n5qmC8?ame>aKPYtp@ShOA*aQoU9YdXgQ+@Sfx#FB?S z&B~h!Bseo=6{5LNrz+CPzCF944Ar?buN&)0d7Zz&+m($FE{vTTh*#b%geS3?mAj?- zanCao4HwR6MEh<}tvT_QtX#Pr>H7?x^aezNfnYH^oTb^6_BlNIp`*sHPMuj(qzs{( zdTJ}k3E+@ZECHMZUhg`;)(Fo2Xl!k+zY!f@5CzQ#WJ2c;o@al_nACXj@dQ?iXs~+x zlyS1da1XZ6lS$MBkbU5>xV@_;WMC^_ngA>GQGT^08S9kPjo`d<+8lbXB(&M3IDS)h z+L)}}4M*$63kOHVn5Iqac&E%*f;0whz@1#yOx6F&)YKS0Z4cP6GVzeOsUSPH$9|Hs zq2b>MKy;?8ZFjhF!RU<6P7G*TL0c&=U(vf_ta$snS{N?;O zu09dpj%8l2D0HhVO*Tw=)9MwSzaSy+0ANezLf6k;wK{<77&EnbW?FBO3x7kHII``aarP)im$YTOA}4N?Zgjn$(fRWJyB~h*Z|{U; zmJW?u?kx37S{AR;`KXwgVmjX!r5-6=oLyu$<+yk}rBF9X;Z;;8Y<)q^q$D`5`}(a@ z|1_3;*3y4n{8wT3{@mNaaO~LjGwe0*$UZ${&KFOIz%9!a$9Ma6IyRf$RJ?k1yeHt# zwLV?>2LIMS$YpQ}NIhinU~(gz!{Iw6R(9US zO1bOk5aHmhQbsq?$Yf;p9A&=ZC=y%Hm7S5!gehLd$WI5ml_}mcwO&u-GEs(4B@wK> zcFq==R`tw0>!siC)uvc^Too?7+qjr@s!Z_EQCmUbLfeo%S~je&KCfH1xI~3{4%b!- zCe*u3gbA3hm~r%cvO{@zJD_3|aovMm=kXKOR(Q!A@F{v|X)~>Bx(bm3~ zP`2)6Ie{g4uC!t-@;98;>9d{gOEZ0=BnOykRX0jci$zAaw7l^)lB+${oi+Yb@a}<&pL70@=n(t8ruaVZh}H!AcNB$8v7|BC6?;(2pK|1O!b(M zN6p{0e#l#IyeoCfF5O`@I>D2kS|YWWh1T<~R@=yi8Z4KsbXu6>IG-;E)P6!4)4Y(P9TQjUO?~W#7T%7aEPS3BzJL~bo z5;j`a6FHm4V?ZEE-@;0VGOLxsCWo3%useb$KaUWV1kH zcVh)Plavv2u(o(S`ryM(Ph!^|Gh_O4_+;+$?5w`*6k2&kvq!6gn`!ZOhipB)ZsKyk zx=FX+N+Z6MNx&`{G?O82C4_iW=5!)Qytwp?w#5o^`n`# z+Pw+vQ~8)Nv$pkbddt^G7K-gX(Z&bA@mn9LNF`YwUsl$|qZHM4k` zIP%Yz=6~-HoR55s`H_b-U)H*Qv}F})oo9+6N4+XvQ>9l32uE!Av#VE*FYfp!gcR!e z1a%3|74(ougoC=<=ImTCBeO#;Jq~-c{V+DFFi*hHoq|um8@}?Uz5butuNmi-wtRG0eicoQOg8RPPb>qF!r)50w9t4x! zyOz|WkzHG$XF+}WaWw#YFMwyVx(?tP@57KOCL+miAL<_!BrE&E2}M^t_k7krSsR|D z5iJ^tx6^O#1(D&3n(f(c!L~}{%L3ipl#;vD5Q^$guj;H{d3k&@t14Aznj2U{ zBaAcGh#__$q&yoqa}}T`PCy{%jJuI$P&EYPrJ7r`2q9iLo`Cy4g=*VxZ+*FGg#ARq z?VGgZ+L^?;Sk`AXy1889%c&J36GF2&Fl{|EwK@(O-kTA<;%;3feFwn?RnPK|Eo>xe zP9+&&^v__{p)J|l7Pah;N1nmh-)FQ(43q)_$7eizVN(Hr%$(NU$*b`;RO4+go3=96 z7ev<5ow1g%KxYQUJo=SMx9XS8lP&W;g{{{~O>#L5cI9tPr#hQ3*&QC8F0fOzIx-y! zwY96Y_y3b(UW_qTBBnl&kPvrCErln}aaRoTDa=fF4VD7;pzm+PuZ;2r9YDTz%zXfO+koEB$r_Eqj0a3h-V*DVtA^vFu%BD;e%~ z;kKxaUccn@))AI1C67O=tsz1Xw5u9sFe!eO%XaC;9YyYVg$W+HZ>=%9yw&2)YvCE; zXK^rByyE2i;Iqi8c_LLNsFyB=AtoER#mxfReJ{l{y6qbj)MG<-YL!iLT^9EARz}UR z9Zmtp=!P{;7L`uL1J;^8LLAaoG}wG0?5D0RFQUSXko-<+-q~x@PDl7%D3)YJ#q0+* z>L()oc9zOkD}oy;Uh}-)TP%h&_f!u+R*FpKAQHaZi{2r`HmdEJtxla)&_xR41kWE0 zYX=4@k<8QWZaVB)_7CbEbt4S)tO!AgX)+*$I1+JV4YDpYj-(Cx@h+Sl5M zBfkou!z~S7zgEF0IoHp697|%yU=noXCps*xW;?CK%$QZ<`6D$VUW~lb*)gA z#uXIs+o9D!qpvnv?=Bkjm8hQBQ745qD+J7DmeR%|m2it+;IlseruaoiIaTOl(m^u!uaDh)vIi}AxS#jz-~ml%m_@aZVxeMF zW8StOdxaAx!h6uSW<-j^jNDP^N^kTwXt)k6#R~Xyr>lmo#%&m4!yx^e;MKVwJa3j5 zduv_xU;XvT)>}SK2}ARzRQ{d3+kVR|4@0A3Ugigaly!0Zc$`n|!}H zCy2MKM?9k`zxlDkphm}N9(M9VJ*{?Fs>iehFF-Mx9w0;1Y3MeX3=|HL?gabU=4(p7 zY4ZPtB#jXzCZm+QyL|G7z4VC>2i6J zVQn~(4$XG=g+sTK{qgAo)e) z?Go9QJglK4Z*WNfMTa8m*jL+vLBR~_q}#N0VA{26Up#*fCf~BkNw=&7+x0AZbej{O z)5E64?MhE$2_fEy`Vrwm1gmWrI-XeKS~?*N^1uei5o`qn1aEUG%;&o1El1z^aA4-y z*|q0NVrE(8=Mz=8Zok=i&vu+kR8kYcw%dD2)%#F&U1L+baSgzBYCj$b*su1#S0udJ zOYv)>4kZ$oI!QK)cS(eKGRQ15$fpT`NK>Dj_>T1IhVPu>#P(~Ea^M3cu@xbko1+TnN2c0ESA|pLYagLhf?rMWr8@v;@ z_I8%ZC_1#3Be|#-;#cJ~pRF2N>7^dvOKKX?-%1|ztws!9q2%Cu*ang`7xa3>D^8^^ zD5bns>9$$8u+utMF$|e|LGSKxWSP@Dx1K)DIe4sNJxTu-zeC=7q~EN;f`9dGJ=$Nl z(9ak>^q?4+PS#UDwG!2O)Wu+O_b1x0i9dUz*r6E@i<6J(=XoseJmZDd3C{W@45?xR zpPCu19(R6-+`hRO8n_FdMR=!Ozh3C*8KlyU*-1vlp|!@z2bW3yyS|mx1-oJ!zyF|@ zsbS_P3feu>>9yD`mw=r`zH2V#7Mq{$^12dW1CY*pKdc>EuliLfQpo@{3fxa?VJvgM zEM5s!O{Z;(>W$R8a2{NxNCxZ8PF_8&Byja{2#&VmwK^)fv&df6Z@Qy02%i0wh$RPu`17Yh+y#S}R@JXZv!>{!d->1BE=q>^;|Ek&!94iAok2(i$(lzH^$cx1 zF`ozDcC>9D&Fg11x_J7?l|oN#Ls4EoKOKreoBcQpDbu1XQV@&B0li%&W0l&XxlFtMJ?C;EC;PE^ZVlEX;4KC%N2fhelku&eB5 zbf#uAov%2OJIb(=-n7>(h|`IP;>`t5=F$iQHiD03z6TNX0BsNwj|^J4;(0MqV)CA4 zkP$gyqty-V>O(Nrl4tEo_+;SLvMW5)Msu+gZ_Q>tsuGW&50){@`4H?)vfo zi#STUNG_E1{#;L}yoB7)md>+2N?X|Ah4QrT%FZzr9ANw+!Ni*Y764-`9z^X#O&)Gc zckn<+^p&wm(HkrsZ9R`)rd)RH_KwqFKV=&lsqUiAU@~eQ25Pmh zRj>RX{>C2(-O9=i0Q~Z`M||@W{pa241t&eo4yd)nKu?-f?$(>e-1TkWcw}tVgn{M! z+Ej_FQ-}8OY_nSHm7%4VP*moT$bh|%=KirSfqe<=OJH9D`x4lfz`g|bC9p4neF^MK rU|$0J64;l(z6ACqurGmq3G7Q?Ujq9Q*q6Y*1okEHe_aABAA0`-mMVIv literal 0 HcmV?d00001 diff --git a/script.plexmod/icon.png b/script.plexmod/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1a6ba14690a461e957c9b27a7b50b959928feb12 GIT binary patch literal 25724 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 2.1.0 + pass + +from . import compat +from . import _included_packages diff --git a/script.plexmod/lib/_included_packages/__init__.py b/script.plexmod/lib/_included_packages/__init__.py new file mode 100644 index 000000000..52d8b592a --- /dev/null +++ b/script.plexmod/lib/_included_packages/__init__.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import +import os +import sys +import inspect + +cmd_folder = os.path.realpath(os.path.abspath(os.path.split(inspect.getfile(inspect.currentframe()))[0])) +if cmd_folder not in sys.path: + sys.path.insert(0, cmd_folder) diff --git a/script.plexmod/lib/_included_packages/icmplib/__init__.py b/script.plexmod/lib/_included_packages/icmplib/__init__.py new file mode 100644 index 000000000..6770e6988 --- /dev/null +++ b/script.plexmod/lib/_included_packages/icmplib/__init__.py @@ -0,0 +1,44 @@ +''' + icmplib + ~~~~~~~ + + Easily forge ICMP packets and make your own ping and traceroute. + + https://github.com/ValentinBELYN/icmplib + + :copyright: Copyright 2017-2023 Valentin BELYN. + :license: GNU LGPLv3, see the LICENSE for details. + + ~~~~~~~ + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +''' + +from .sockets import ICMPv4Socket, ICMPv6Socket, AsyncSocket +from .models import ICMPRequest, ICMPReply, Host, Hop +from .ping import ping, async_ping +from .multiping import multiping, async_multiping +from .traceroute import traceroute +from .exceptions import * +from .utils import is_hostname, is_ipv4_address, is_ipv6_address +from .utils import PID, resolve, async_resolve + + +__author__ = 'Valentin BELYN' +__copyright__ = 'Copyright 2017-2023 Valentin BELYN' +__license__ = 'GNU Lesser General Public License v3.0' + +__version__ = '3.0.4' +__build__ = '231010' diff --git a/script.plexmod/lib/_included_packages/icmplib/exceptions.py b/script.plexmod/lib/_included_packages/icmplib/exceptions.py new file mode 100644 index 000000000..b37646bfa --- /dev/null +++ b/script.plexmod/lib/_included_packages/icmplib/exceptions.py @@ -0,0 +1,214 @@ +''' + icmplib + ~~~~~~~ + + Easily forge ICMP packets and make your own ping and traceroute. + + https://github.com/ValentinBELYN/icmplib + + :copyright: Copyright 2017-2023 Valentin BELYN. + :license: GNU LGPLv3, see the LICENSE for details. + + ~~~~~~~ + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +''' + + +class ICMPLibError(Exception): + ''' + Exception class for the icmplib package. + + ''' + + +class NameLookupError(ICMPLibError): + ''' + Raised when the requested name does not exist or cannot be resolved. + This concerns both Fully Qualified Domain Names and hostnames. + + ''' + def __init__(self, name): + message = f'The name \'{name}\' cannot be resolved' + super().__init__(message) + + +class ICMPSocketError(ICMPLibError): + ''' + Base class for ICMP sockets exceptions. + + ''' + + +class SocketAddressError(ICMPSocketError): + ''' + Raised when the requested address cannot be assigned to the socket. + + ''' + def __init__(self, address): + message = f'The requested address ({address}) cannot be ' \ + 'assigned to the socket' + super().__init__(message) + + +class SocketPermissionError(ICMPSocketError): + ''' + Raised when the privileges are insufficient to create the socket. + + ''' + def __init__(self, privileged): + if privileged: + message = 'Root privileges are required to create the socket' + else: + message = 'A prior configuration of your OS is required ' \ + 'to use ICMP sockets without root privileges. ' \ + 'Read more on https://github.com/ValentinBELYN' \ + '/icmplib' + + super().__init__(message) + + +class SocketUnavailableError(ICMPSocketError): + ''' + Raised when an action is performed while the socket is closed. + + ''' + def __init__(self): + message = 'The socket can no longer be used after its closure' + super().__init__(message) + + +class SocketBroadcastError(ICMPSocketError): + ''' + Raised when a broadcast address is used and the corresponding option + is not enabled on the socket. + + ''' + def __init__(self): + message = 'Broadcast is not allowed: ' \ + 'please use the \'broadcast\' property to allow it' + super().__init__(message) + + +class TimeoutExceeded(ICMPSocketError): + ''' + Raised when a timeout occurs on a socket. + + ''' + def __init__(self, timeout): + message = f'The timeout has been reached ({timeout}s)' + super().__init__(message) + + +class ICMPError(ICMPLibError): + ''' + Base class for ICMP error messages. + + ''' + def __init__(self, message, reply): + super().__init__(message) + self._reply = reply + + @property + def reply(self): + return self._reply + + +class DestinationUnreachable(ICMPError): + ''' + Base class for ICMP Destination Unreachable messages. + + Destination Unreachable message is generated by the host or its + inbound gateway to inform the client that the destination is + unreachable for some reason. + + ''' + _CODES = {} + + def __init__(self, reply): + if reply.code in self._CODES: + message = self._CODES[reply.code] + else: + message = f'Destination unreachable, bad code: {reply.code}' + + super().__init__(message, reply) + + +class ICMPv4DestinationUnreachable(DestinationUnreachable): + _CODES = { + 0: 'Destination network unreachable', + 1: 'Destination host unreachable', + 2: 'Destination protocol unreachable', + 3: 'Destination port unreachable', + 4: 'Fragmentation needed and DF set', + 5: 'Source route failed', + 6: 'Destination network unknown', + 7: 'Destination host unknown', + 8: 'Source host isolated', + 9: 'Destination network prohibed', + 10: 'Destination host prohibed', + 11: 'Destination network unreachable for ToS', + 12: 'Destination host unreachable for ToS', + 13: 'Packet filtered', + 14: 'Precedence violation', + 15: 'Precedence cutoff' + } + + +class ICMPv6DestinationUnreachable(DestinationUnreachable): + _CODES = { + 0: 'No route to destination', + 1: 'Communication with destination administratively prohibited', + 2: 'Beyond scope of source address', + 3: 'Address unreachable', + 4: 'Port unreachable', + 5: 'Source address failed ingress/egress policy', + 6: 'Reject route to destination' + } + + +class TimeExceeded(ICMPError): + ''' + Base class for ICMP Time Exceeded messages. + + Time Exceeded message is generated by a gateway to inform the source + of a discarded datagram due to the time to live field reaching zero. + A Time Exceeded message may also be sent by a host if it fails to + reassemble a fragmented datagram within its time limit. + + ''' + _CODES = {} + + def __init__(self, reply): + if reply.code in self._CODES: + message = self._CODES[reply.code] + else: + message = f'Time exceeded, bad code: {reply.code}' + + super().__init__(message, reply) + + +class ICMPv4TimeExceeded(TimeExceeded): + _CODES = { + 0: 'Time to live exceeded', + 1: 'Fragment reassembly time exceeded' + } + + +class ICMPv6TimeExceeded(TimeExceeded): + _CODES = { + 0: 'Hop limit exceeded', + 1: 'Fragment reassembly time exceeded' + } diff --git a/script.plexmod/lib/_included_packages/icmplib/models.py b/script.plexmod/lib/_included_packages/icmplib/models.py new file mode 100644 index 000000000..c055fdf13 --- /dev/null +++ b/script.plexmod/lib/_included_packages/icmplib/models.py @@ -0,0 +1,491 @@ +''' + icmplib + ~~~~~~~ + + Easily forge ICMP packets and make your own ping and traceroute. + + https://github.com/ValentinBELYN/icmplib + + :copyright: Copyright 2017-2023 Valentin BELYN. + :license: GNU LGPLv3, see the LICENSE for details. + + ~~~~~~~ + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +''' + +from .exceptions import * +from .utils import random_byte_message + + +class ICMPRequest: + ''' + A user-created object that represents an ICMP Echo Request. + + :type destination: str + :param destination: The IP address of the host to which the message + should be sent. + + :type id: int + :param id: The identifier of the request. Used to match the reply + with the request. In practice, a unique identifier is used for + every ping process. On Linux, this identifier is automatically + replaced if the request is sent from an unprivileged socket. + + :type sequence: int + :param sequence: The sequence number. Used to match the reply with + the request. Typically, the sequence number is incremented for + each packet sent during the process. + + :type payload: bytes, optional + :param payload: The payload content in bytes. A random payload is + used by default. + + :type payload_size: int, optional + :param payload_size: The payload size. Ignored when the `payload` + parameter is set. Default to 56. + + :type ttl: int, optional + :param ttl: The time to live of the packet in terms of hops. + Default to 64. + + :type traffic_class: int, optional + :param traffic_class: The traffic class of the ICMP packet. + Provides a defined level of service to the packet by setting the + DS Field (formerly TOS) or the Traffic Class field of the IP + header. Packets are delivered with the minimum priority by + default (Best-effort delivery). + Intermediate routers must be able to support this feature. + Only available on Unix systems. Ignored on Windows. + + ''' + __slots__ = '_destination', '_id', '_sequence', '_payload', \ + '_payload_size', '_ttl', '_traffic_class', '_time' + + def __init__(self, destination, id, sequence, payload=None, + payload_size=56, ttl=64, traffic_class=0): + + if payload: + payload_size = len(payload) + + self._destination = destination + self._id = id & 0xffff + self._sequence = sequence & 0xffff + self._payload = payload + self._payload_size = payload_size + self._ttl = ttl + self._traffic_class = traffic_class + self._time = 0 + + def __repr__(self): + return f'' + + @property + def destination(self): + ''' + The IP address of the host to which the message should be sent. + + ''' + return self._destination + + @property + def id(self): + ''' + The identifier of the request. + Used to match the reply with the request. + + ''' + return self._id + + @property + def sequence(self): + ''' + The sequence number. + Used to match the reply with the request. + + ''' + return self._sequence + + @property + def payload(self): + ''' + The payload content in bytes. + Return a random payload if not defined. + + ''' + return self._payload or random_byte_message(self._payload_size) + + @property + def payload_size(self): + ''' + The payload size. + + ''' + return self._payload_size + + @property + def ttl(self): + ''' + The time to live of the packet in terms of hops. + + ''' + return self._ttl + + @property + def traffic_class(self): + ''' + The traffic class of the packet. + + ''' + return self._traffic_class + + @property + def time(self): + ''' + The timestamp of the ICMP request. + + Initialized to zero when creating the request and replaced by + the `send` method of an ICMP socket with the time of sending. + + ''' + return self._time + + +class ICMPReply: + ''' + A class that represents an ICMP reply. Generated from an ICMP socket. + + :type source: str + :param source: The IP address of the host that composes the ICMP + message. + + :type family: int + :param family: The address family. Can be set to `4` for IPv4 or `6` + for IPv6 addresses. + + :type id: int + :param id: The identifier of the reply. Used to match the reply with + the request. + + :type sequence: int + :param sequence: The sequence number. Used to match the reply with + the request. + + :type type: int + :param type: The type of ICMP message. + + :type code: int + :param code: The ICMP error code. + + :type bytes_received: int + :param bytes_received: The number of bytes received. + + :type time: float + :param time: The timestamp of the ICMP reply. + + ''' + __slots__ = '_source', '_family', '_id', '_sequence', '_type', \ + '_code', '_bytes_received', '_time' + + def __init__(self, source, family, id, sequence, type, code, + bytes_received, time): + + self._source = source + self._family = family + self._id = id + self._sequence = sequence + self._type = type + self._code = code + self._bytes_received = bytes_received + self._time = time + + def __repr__(self): + return f'' + + def raise_for_status(self): + ''' + Throw an exception if the reply is not an ICMP Echo Reply. + Otherwise, do nothing. + + :raises DestinationUnreachable: If the destination is + unreachable for some reason. + :raises TimeExceeded: If the time to live field of the ICMP + request has reached zero. + :raises ICMPError: Raised for any other type and ICMP error + code, except ICMP Echo Reply messages. + + ''' + if self._family == 6: + if self._type == 1: + raise ICMPv6DestinationUnreachable(self) + + if self._type == 3: + raise ICMPv6TimeExceeded(self) + else: + if self._type == 3: + raise ICMPv4DestinationUnreachable(self) + + if self._type == 11: + raise ICMPv4TimeExceeded(self) + + if (self._family == 4 and self._type != 0 or + self._family == 6 and self._type != 129): + message = f'Error type: {self._type}, code: {self._code}' + raise ICMPError(message, self) + + @property + def source(self): + ''' + The IP address of the host that composes the ICMP message. + + ''' + return self._source + + @property + def id(self): + ''' + The identifier of the reply. + Used to match the reply with the request. + + ''' + return self._id + + @property + def sequence(self): + ''' + The sequence number. + Used to match the reply with the request. + + ''' + return self._sequence + + @property + def type(self): + ''' + The type of ICMP message. + + ''' + return self._type + + @property + def code(self): + ''' + The ICMP error code. + + ''' + return self._code + + @property + def bytes_received(self): + ''' + The number of bytes received. + + ''' + return self._bytes_received + + @property + def time(self): + ''' + The timestamp of the ICMP reply. + + ''' + return self._time + + +class Host: + ''' + A class that represents a host. It simplifies the use of the results + from the `ping`, `multiping` and `traceroute` functions. + + :type address: str + :param address: The IP address of the host that responded to the + request. + + :type packets_sent: int + :param packets_sent: The number of packets transmitted to the + destination host. + + :type rtts: list[float] + :param rtts: The list of round-trip times expressed in milliseconds. + + ''' + __slots__ = '_address', '_packets_sent', '_rtts' + + def __init__(self, address, packets_sent, rtts): + self._address = address + self._packets_sent = packets_sent + self._rtts = rtts + + def __repr__(self): + return f'' + + def __str__(self): + return f' {self._address}\n' + '-' * 60 + '\n' \ + f' Packets sent: {self._packets_sent}\n' \ + f' Packets received: {self.packets_received}\n' \ + f' Packet loss: {self.packet_loss * 100}%\n' \ + f' Round-trip times: {self.min_rtt} ms / ' \ + f'{self.avg_rtt} ms / {self.max_rtt} ms\n' \ + f' Jitter: {self.jitter} ms\n' + '-' * 60 + + @property + def address(self): + ''' + The IP address of the host that responded to the request. + + ''' + return self._address + + @property + def min_rtt(self): + ''' + The minimum round-trip time in milliseconds. + + ''' + if not self._rtts: + return 0.0 + + return round(min(self._rtts), 3) + + @property + def avg_rtt(self): + ''' + The average round-trip time in milliseconds. + + ''' + if not self._rtts: + return 0.0 + + return round(sum(self._rtts) / len(self._rtts), 3) + + @property + def max_rtt(self): + ''' + The maximum round-trip time in milliseconds. + + ''' + if not self._rtts: + return 0.0 + + return round(max(self._rtts), 3) + + @property + def rtts(self): + ''' + The list of round-trip times expressed in milliseconds. + + ''' + return self._rtts + + @property + def packets_sent(self): + ''' + The number of requests transmitted to the remote host. + + ''' + return self._packets_sent + + @property + def packets_received(self): + ''' + The number of ICMP responses received from the remote host. + + ''' + return len(self._rtts) + + @property + def packet_loss(self): + ''' + Packet loss occurs when packets fail to reach their destination. + Return a `float` between 0 and 1 (all packets are lost). + + ''' + if not self._packets_sent: + return 0.0 + + return round(1 - len(self._rtts) / self._packets_sent, 2) + + @property + def jitter(self): + ''' + The jitter in milliseconds, defined as the variance of the + latency of packets flowing through the network. + + At least two ICMP responses are required to calculate the + jitter. + + ''' + sum_deltas = 0.0 + num_deltas = len(self._rtts) - 1 + + if num_deltas < 1: + return 0.0 + + for i in range(num_deltas): + sum_deltas += abs(self._rtts[i] - self._rtts[i + 1]) + + return round(sum_deltas / num_deltas, 3) + + @property + def is_alive(self): + ''' + Indicate whether the host is reachable. + Return a `boolean`. + + ''' + return len(self._rtts) > 0 + + +class Hop(Host): + ''' + A class that represents a hop. It extends the `Host` class and adds + some features for the `traceroute` function. + + :type address: str + :param address: The IP address of the gateway or host that responded + to the request. + + :type packets_sent: int + :param packets_sent: The number of packets transmitted to the + destination host. + + :type rtts: list[float] + :param rtts: The list of round-trip times expressed in milliseconds. + + :type distance: int + :param distance: The distance, in terms of hops, that separates the + remote host from the current machine. + + ''' + __slots__ = '_address', '_packets_sent', '_rtts', '_distance' + + def __init__(self, address, packets_sent, rtts, distance): + super().__init__(address, packets_sent, rtts) + self._distance = distance + + def __repr__(self): + return f'' + + def __str__(self): + return f' #{self._distance:<2} {super().__str__()[2:]}' + + @property + def distance(self): + ''' + The distance, in terms of hops, that separates the remote host + from the current machine. + + ''' + return self._distance diff --git a/script.plexmod/lib/_included_packages/icmplib/multiping.py b/script.plexmod/lib/_included_packages/icmplib/multiping.py new file mode 100644 index 000000000..0705b281d --- /dev/null +++ b/script.plexmod/lib/_included_packages/icmplib/multiping.py @@ -0,0 +1,277 @@ +''' + icmplib + ~~~~~~~ + + Easily forge ICMP packets and make your own ping and traceroute. + + https://github.com/ValentinBELYN/icmplib + + :copyright: Copyright 2017-2023 Valentin BELYN. + :license: GNU LGPLv3, see the LICENSE for details. + + ~~~~~~~ + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +''' + +import asyncio + +from .ping import async_ping + + +async def async_multiping(addresses, count=2, interval=0.5, timeout=2, + concurrent_tasks=50, source=None, family=None, privileged=True, + **kwargs): + ''' + Send ICMP Echo Request packets to several network hosts. + + This function is non-blocking. + + :type addresses: list[str] + :param addresses: The IP addresses of the hosts to which messages + should be sent. Hostnames and FQDNs are allowed but not + recommended. You can easily retrieve their IP address by calling + the built-in `async_resolve` function. + + :type count: int, optional + :param count: The number of ping to perform per address. + Default to 2. + + :type interval: int or float, optional + :param interval: The interval in seconds between sending each packet. + Default to 0.5. + + :type timeout: int or float, optional + :param timeout: The maximum waiting time for receiving a reply in + seconds. Default to 2. + + :type concurrent_tasks: int, optional + :param concurrent_tasks: The maximum number of concurrent tasks to + speed up processing. This value cannot exceed the maximum number + of file descriptors configured on the operating system. + Default to 50. + + :type source: str, optional + :param source: The IP address from which you want to send packets. + By default, the interface is automatically chosen according to + the specified destinations. This parameter should not be used if + you are passing both IPv4 and IPv6 addresses to this function. + + :type family: int, optional + :param family: The address family if a hostname or FQDN is specified. + Can be set to `4` for IPv4 or `6` for IPv6 addresses. By default, + this function searches for IPv4 addresses first before searching + for IPv6 addresses. + + :type privileged: bool, optional + :param privileged: When this option is enabled, this library fully + manages the exchanges and the structure of ICMP packets. + Disable this option if you want to use this function without + root privileges and let the kernel handle ICMP headers. + Default to True. + Only available on Unix systems. Ignored on Windows. + + Advanced (**kwags): + + :type payload: bytes, optional + :param payload: The payload content in bytes. A random payload is + used by default. + + :type payload_size: int, optional + :param payload_size: The payload size. Ignored when the `payload` + parameter is set. Default to 56. + + :type traffic_class: int, optional + :param traffic_class: The traffic class of ICMP packets. + Provides a defined level of service to packets by setting the DS + Field (formerly TOS) or the Traffic Class field of IP headers. + Packets are delivered with the minimum priority by default + (Best-effort delivery). + Intermediate routers must be able to support this feature. + Only available on Unix systems. Ignored on Windows. + + :rtype: list[Host] + :returns: A list of `Host` objects containing statistics about the + desired destinations. The list is sorted in the same order as + the addresses passed in parameters. + + :raises NameLookupError: If you pass a hostname or FQDN in + parameters and it does not exist or cannot be resolved. + :raises SocketPermissionError: If the privileges are insufficient to + create the socket. + :raises SocketAddressError: If the source address cannot be assigned + to the socket. + :raises ICMPSocketError: If another error occurs. See the + `ICMPv4Socket` or `ICMPv6Socket` class for details. + + Usage:: + + >>> import asyncio + >>> from icmplib import async_multiping + >>> hosts = asyncio.run(async_multiping(['10.0.0.5', '::1'])) + + >>> for host in hosts: + ... if host.is_alive: + ... print(f'{host.address} is up!') + ... else: + ... print(f'{host.address} is down!') + + 10.0.0.5 is down! + ::1 is up! + + See the `Host` class for details. + + ''' + loop = asyncio.get_running_loop() + tasks = [] + tasks_pending = set() + + for address in addresses: + if len(tasks_pending) >= concurrent_tasks: + _, tasks_pending = await asyncio.wait( + tasks_pending, + return_when=asyncio.FIRST_COMPLETED) + + task = loop.create_task( + async_ping( + address=address, + count=count, + interval=interval, + timeout=timeout, + source=source, + family=family, + privileged=privileged, + **kwargs)) + + tasks.append(task) + tasks_pending.add(task) + + await asyncio.wait(tasks_pending) + + return [task.result() for task in tasks] + + +def multiping(addresses, count=2, interval=0.5, timeout=2, + concurrent_tasks=50, source=None, family=None, privileged=True, + **kwargs): + ''' + Send ICMP Echo Request packets to several network hosts. + + :type addresses: list[str] + :param addresses: The IP addresses of the hosts to which messages + should be sent. Hostnames and FQDNs are allowed but not + recommended. You can easily retrieve their IP address by calling + the built-in `resolve` function. + + :type count: int, optional + :param count: The number of ping to perform per address. + Default to 2. + + :type interval: int or float, optional + :param interval: The interval in seconds between sending each packet. + Default to 0.5. + + :type timeout: int or float, optional + :param timeout: The maximum waiting time for receiving a reply in + seconds. Default to 2. + + :type concurrent_tasks: int, optional + :param concurrent_tasks: The maximum number of concurrent tasks to + speed up processing. This value cannot exceed the maximum number + of file descriptors configured on the operating system. + Default to 50. + + :type source: str, optional + :param source: The IP address from which you want to send packets. + By default, the interface is automatically chosen according to + the specified destinations. This parameter should not be used if + you are passing both IPv4 and IPv6 addresses to this function. + + :type family: int, optional + :param family: The address family if a hostname or FQDN is specified. + Can be set to `4` for IPv4 or `6` for IPv6 addresses. By default, + this function searches for IPv4 addresses first before searching + for IPv6 addresses. + + :type privileged: bool, optional + :param privileged: When this option is enabled, this library fully + manages the exchanges and the structure of ICMP packets. + Disable this option if you want to use this function without + root privileges and let the kernel handle ICMP headers. + Default to True. + Only available on Unix systems. Ignored on Windows. + + Advanced (**kwags): + + :type payload: bytes, optional + :param payload: The payload content in bytes. A random payload is + used by default. + + :type payload_size: int, optional + :param payload_size: The payload size. Ignored when the `payload` + parameter is set. Default to 56. + + :type traffic_class: int, optional + :param traffic_class: The traffic class of ICMP packets. + Provides a defined level of service to packets by setting the DS + Field (formerly TOS) or the Traffic Class field of IP headers. + Packets are delivered with the minimum priority by default + (Best-effort delivery). + Intermediate routers must be able to support this feature. + Only available on Unix systems. Ignored on Windows. + + :rtype: list[Host] + :returns: A list of `Host` objects containing statistics about the + desired destinations. The list is sorted in the same order as + the addresses passed in parameters. + + :raises NameLookupError: If you pass a hostname or FQDN in + parameters and it does not exist or cannot be resolved. + :raises SocketPermissionError: If the privileges are insufficient to + create the socket. + :raises SocketAddressError: If the source address cannot be assigned + to the socket. + :raises ICMPSocketError: If another error occurs. See the + `ICMPv4Socket` or `ICMPv6Socket` class for details. + + Usage:: + + >>> from icmplib import multiping + >>> hosts = multiping(['10.0.0.5', '127.0.0.1', '::1']) + + >>> for host in hosts: + ... if host.is_alive: + ... print(f'{host.address} is up!') + ... else: + ... print(f'{host.address} is down!') + + 10.0.0.5 is down! + 127.0.0.1 is up! + ::1 is up! + + See the `Host` class for details. + + ''' + return asyncio.run( + async_multiping( + addresses=addresses, + count=count, + interval=interval, + timeout=timeout, + concurrent_tasks=concurrent_tasks, + source=source, + family=family, + privileged=privileged, + **kwargs)) diff --git a/script.plexmod/lib/_included_packages/icmplib/ping.py b/script.plexmod/lib/_included_packages/icmplib/ping.py new file mode 100644 index 000000000..5ba1efc8b --- /dev/null +++ b/script.plexmod/lib/_included_packages/icmplib/ping.py @@ -0,0 +1,298 @@ +''' + icmplib + ~~~~~~~ + + Easily forge ICMP packets and make your own ping and traceroute. + + https://github.com/ValentinBELYN/icmplib + + :copyright: Copyright 2017-2023 Valentin BELYN. + :license: GNU LGPLv3, see the LICENSE for details. + + ~~~~~~~ + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +''' + +import asyncio +from time import sleep + +from .sockets import ICMPv4Socket, ICMPv6Socket, AsyncSocket +from .models import ICMPRequest, Host +from .exceptions import ICMPLibError +from .utils import * + + +def ping(address, count=4, interval=1, timeout=2, id=None, source=None, + family=None, privileged=True, **kwargs): + ''' + Send ICMP Echo Request packets to a network host. + + :type address: str + :param address: The IP address, hostname or FQDN of the host to + which messages should be sent. For deterministic behavior, + prefer to use an IP address. + + :type count: int, optional + :param count: The number of ping to perform. Default to 4. + + :type interval: int or float, optional + :param interval: The interval in seconds between sending each packet. + Default to 1. + + :type timeout: int or float, optional + :param timeout: The maximum waiting time for receiving a reply in + seconds. Default to 2. + + :type id: int, optional + :param id: The identifier of ICMP requests. Used to match the + responses with requests. In practice, a unique identifier should + be used for every ping process. On Linux, this identifier is + ignored when the `privileged` parameter is disabled. The library + handles this identifier itself by default. + + :type source: str, optional + :param source: The IP address from which you want to send packets. + By default, the interface is automatically chosen according to + the specified destination. + + :type family: int, optional + :param family: The address family if a hostname or FQDN is specified. + Can be set to `4` for IPv4 or `6` for IPv6 addresses. By default, + this function searches for IPv4 addresses first before searching + for IPv6 addresses. + + :type privileged: bool, optional + :param privileged: When this option is enabled, this library fully + manages the exchanges and the structure of ICMP packets. + Disable this option if you want to use this function without + root privileges and let the kernel handle ICMP headers. + Default to True. + Only available on Unix systems. Ignored on Windows. + + Advanced (**kwags): + + :type payload: bytes, optional + :param payload: The payload content in bytes. A random payload is + used by default. + + :type payload_size: int, optional + :param payload_size: The payload size. Ignored when the `payload` + parameter is set. Default to 56. + + :type traffic_class: int, optional + :param traffic_class: The traffic class of ICMP packets. + Provides a defined level of service to packets by setting the DS + Field (formerly TOS) or the Traffic Class field of IP headers. + Packets are delivered with the minimum priority by default + (Best-effort delivery). + Intermediate routers must be able to support this feature. + Only available on Unix systems. Ignored on Windows. + + :rtype: Host + :returns: A `Host` object containing statistics about the desired + destination. + + :raises NameLookupError: If you pass a hostname or FQDN in + parameters and it does not exist or cannot be resolved. + :raises SocketPermissionError: If the privileges are insufficient to + create the socket. + :raises SocketAddressError: If the source address cannot be assigned + to the socket. + :raises ICMPSocketError: If another error occurs. See the + `ICMPv4Socket` or `ICMPv6Socket` class for details. + + Usage:: + + >>> from icmplib import ping + >>> host = ping('1.1.1.1') + >>> host.avg_rtt + 13.2 + >>> host.is_alive + True + + See the `Host` class for details. + + ''' + if is_hostname(address): + address = resolve(address, family)[0] + + if is_ipv6_address(address): + _Socket = ICMPv6Socket + else: + _Socket = ICMPv4Socket + + id = id or unique_identifier() + packets_sent = 0 + rtts = [] + + with _Socket(source, privileged) as sock: + for sequence in range(count): + if sequence > 0: + sleep(interval) + + request = ICMPRequest( + destination=address, + id=id, + sequence=sequence, + **kwargs) + + try: + sock.send(request) + packets_sent += 1 + + reply = sock.receive(request, timeout) + reply.raise_for_status() + + rtt = (reply.time - request.time) * 1000 + rtts.append(rtt) + + except ICMPLibError: + pass + + return Host(address, packets_sent, rtts) + + +async def async_ping(address, count=4, interval=1, timeout=2, id=None, + source=None, family=None, privileged=True, **kwargs): + ''' + Send ICMP Echo Request packets to a network host. + + This function is non-blocking. + + :type address: str + :param address: The IP address, hostname or FQDN of the host to + which messages should be sent. For deterministic behavior, + prefer to use an IP address. + + :type count: int, optional + :param count: The number of ping to perform. Default to 4. + + :type interval: int or float, optional + :param interval: The interval in seconds between sending each packet. + Default to 1. + + :type timeout: int or float, optional + :param timeout: The maximum waiting time for receiving a reply in + seconds. Default to 2. + + :type id: int, optional + :param id: The identifier of ICMP requests. Used to match the + responses with requests. In practice, a unique identifier should + be used for every ping process. On Linux, this identifier is + ignored when the `privileged` parameter is disabled. The library + handles this identifier itself by default. + + :type source: str, optional + :param source: The IP address from which you want to send packets. + By default, the interface is automatically chosen according to + the specified destination. + + :type family: int, optional + :param family: The address family if a hostname or FQDN is specified. + Can be set to `4` for IPv4 or `6` for IPv6 addresses. By default, + this function searches for IPv4 addresses first before searching + for IPv6 addresses. + + :type privileged: bool, optional + :param privileged: When this option is enabled, this library fully + manages the exchanges and the structure of ICMP packets. + Disable this option if you want to use this function without + root privileges and let the kernel handle ICMP headers. + Default to True. + Only available on Unix systems. Ignored on Windows. + + Advanced (**kwags): + + :type payload: bytes, optional + :param payload: The payload content in bytes. A random payload is + used by default. + + :type payload_size: int, optional + :param payload_size: The payload size. Ignored when the `payload` + parameter is set. Default to 56. + + :type traffic_class: int, optional + :param traffic_class: The traffic class of ICMP packets. + Provides a defined level of service to packets by setting the DS + Field (formerly TOS) or the Traffic Class field of IP headers. + Packets are delivered with the minimum priority by default + (Best-effort delivery). + Intermediate routers must be able to support this feature. + Only available on Unix systems. Ignored on Windows. + + :rtype: Host + :returns: A `Host` object containing statistics about the desired + destination. + + :raises NameLookupError: If you pass a hostname or FQDN in + parameters and it does not exist or cannot be resolved. + :raises SocketPermissionError: If the privileges are insufficient to + create the socket. + :raises SocketAddressError: If the source address cannot be assigned + to the socket. + :raises ICMPSocketError: If another error occurs. See the + `ICMPv4Socket` or `ICMPv6Socket` class for details. + + Usage:: + + >>> import asyncio + >>> from icmplib import async_ping + >>> host = asyncio.run(async_ping('1.1.1.1')) + >>> host.avg_rtt + 13.2 + >>> host.is_alive + True + + See the `Host` class for details. + + ''' + if is_hostname(address): + address = (await async_resolve(address, family))[0] + + if is_ipv6_address(address): + _Socket = ICMPv6Socket + else: + _Socket = ICMPv4Socket + + id = id or unique_identifier() + packets_sent = 0 + rtts = [] + + with AsyncSocket(_Socket(source, privileged)) as sock: + for sequence in range(count): + if sequence > 0: + await asyncio.sleep(interval) + + request = ICMPRequest( + destination=address, + id=id, + sequence=sequence, + **kwargs) + + try: + sock.send(request) + packets_sent += 1 + + reply = await sock.receive(request, timeout) + reply.raise_for_status() + + rtt = (reply.time - request.time) * 1000 + rtts.append(rtt) + + except ICMPLibError: + pass + + return Host(address, packets_sent, rtts) diff --git a/script.plexmod/lib/_included_packages/icmplib/sockets.py b/script.plexmod/lib/_included_packages/icmplib/sockets.py new file mode 100644 index 000000000..130f55a3a --- /dev/null +++ b/script.plexmod/lib/_included_packages/icmplib/sockets.py @@ -0,0 +1,806 @@ +''' + icmplib + ~~~~~~~ + + Easily forge ICMP packets and make your own ping and traceroute. + + https://github.com/ValentinBELYN/icmplib + + :copyright: Copyright 2017-2023 Valentin BELYN. + :license: GNU LGPLv3, see the LICENSE for details. + + ~~~~~~~ + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +''' + +import socket, asyncio +from struct import pack, unpack +from time import time + +from .models import ICMPReply +from .exceptions import * +from .utils import PLATFORM_LINUX, PLATFORM_MACOS, PLATFORM_WINDOWS + + +class ICMPSocket: + ''' + Base class for ICMP sockets. + + :type address: str, optional + :param address: The IP address from which you want to listen and + send packets. By default, the socket listens on all interfaces. + + :type privileged: bool, optional + :param privileged: When this option is enabled, the socket fully + manages the exchanges and the structure of the ICMP packets. + Disable this option if you want to instantiate and use the + socket without root privileges and let the kernel handle ICMP + headers. Default to True. + Only available on Unix systems. Ignored on Windows. + + :raises SocketPermissionError: If the privileges are insufficient to + create the socket. + :raises SocketAddressError: If the requested address cannot be + assigned to the socket. + :raises ICMPSocketError: If another error occurs while creating the + socket. + + ''' + __slots__ = '_sock', '_address', '_privileged' + + _IP_VERSION = -1 + _ICMP_HEADER_OFFSET = -1 + _ICMP_HEADER_REAL_OFFSET = -1 + + _ICMP_CODE_OFFSET = _ICMP_HEADER_OFFSET + 1 + _ICMP_CHECKSUM_OFFSET = _ICMP_HEADER_OFFSET + 2 + _ICMP_ID_OFFSET = _ICMP_HEADER_OFFSET + 4 + _ICMP_SEQUENCE_OFFSET = _ICMP_HEADER_OFFSET + 6 + _ICMP_PAYLOAD_OFFSET = _ICMP_HEADER_OFFSET + 8 + + _ICMP_ECHO_REQUEST = -1 + _ICMP_ECHO_REPLY = -1 + + def __init__(self, address=None, privileged=True): + self._sock = None + self._address = address + + # The Linux kernel allows unprivileged users to use datagram + # sockets (SOCK_DGRAM) to send ICMP requests. This feature is + # now supported by the majority of Unix systems. + # Windows is not compatible. + self._privileged = privileged or PLATFORM_WINDOWS + + try: + self._sock = self._create_socket( + socket.SOCK_RAW if self._privileged else + socket.SOCK_DGRAM) + + if address: + self._sock.bind((address, 0)) + + except OSError as err: + if err.errno in (1, 13, 10013): + raise SocketPermissionError(privileged) + + if err.errno in (-9, 49, 99, 10049, 11001): + raise SocketAddressError(address) + + raise ICMPSocketError(str(err)) + + def __enter__(self): + ''' + Return this object. + + ''' + return self + + def __exit__(self, type, value, traceback): + ''' + Call the `close` method. + + ''' + self.close() + + def __del__(self): + ''' + Call the `close` method. + + ''' + self.close() + + def _create_socket(self, type): + ''' + Create and return a new socket. Must be overridden. + + ''' + raise NotImplementedError + + def _set_ttl(self, ttl): + ''' + Set the time to live of every IP packet originating from this + socket. Must be overridden. + + ''' + raise NotImplementedError + + def _set_traffic_class(self, traffic_class): + ''' + Set the DS Field (formerly TOS) or the Traffic Class field of + every IP packet originating from this socket. Must be + overridden. + + ''' + raise NotImplementedError + + def _checksum(self, data): + ''' + Compute the checksum of an ICMP packet. Checksums are used to + verify the integrity of packets. + + ''' + sum = 0 + data += b'\x00' + + for i in range(0, len(data) - 1, 2): + sum += (data[i] << 8) + data[i + 1] + sum = (sum & 0xffff) + (sum >> 16) + + sum = ~sum & 0xffff + + return sum + + def _create_packet(self, id, sequence, payload): + ''' + Build an ICMP packet from an identifier, a sequence number and + a payload. + + This method returns the newly created ICMP header concatenated + to the payload passed in parameters. + + ''' + checksum = 0 + + # Temporary ICMP header to compute the checksum + header = pack('!2B3H', self._ICMP_ECHO_REQUEST, 0, checksum, + id, sequence) + + checksum = self._checksum(header + payload) + + # Definitive ICMP header + header = pack('!2B3H', self._ICMP_ECHO_REQUEST, 0, checksum, + id, sequence) + + return header + payload + + def _parse_reply(self, packet, source, current_time): + ''' + Parse an ICMP reply from bytes. + + This method returns an `ICMPReply` object or `None` if the reply + cannot be parsed. + + ''' + # On Linux, the IP header is missing when a datagram socket is + # used (SOCK_DGRAM). To keep the same behavior on all operating + # systems including macOS which has this header, we add a + # padding of the size of the missing IP header. + if not self._privileged and PLATFORM_LINUX: + packet = b'\x00' * self._ICMP_HEADER_OFFSET + packet + + bytes_received = len(packet) - self._ICMP_HEADER_OFFSET + + if len(packet) < self._ICMP_CHECKSUM_OFFSET: + return None + + type, code = unpack('!2B', packet[ + self._ICMP_HEADER_OFFSET: + self._ICMP_CHECKSUM_OFFSET]) + + if type != self._ICMP_ECHO_REPLY: + packet = packet[ + self._ICMP_PAYLOAD_OFFSET + - self._ICMP_HEADER_OFFSET + + self._ICMP_HEADER_REAL_OFFSET:] + + if len(packet) < self._ICMP_PAYLOAD_OFFSET: + return None + + id, sequence = unpack('!2H', packet[ + self._ICMP_ID_OFFSET: + self._ICMP_PAYLOAD_OFFSET]) + + return ICMPReply( + source=source, + family=self._IP_VERSION, + id=id, + sequence=sequence, + type=type, + code=code, + bytes_received=bytes_received, + time=current_time) + + def send(self, request): + ''' + Send an ICMP request message over the network to a remote host. + + This operation is non-blocking. Use the `receive` method to get + the reply. + + :type request: ICMPRequest + :param request: The ICMP request you have created. If the socket + is used in non-privileged mode on a Linux system, the + identifier defined in the request will be replaced by the + kernel. + + :raises SocketBroadcastError: If a broadcast address is used and + the corresponding option is not enabled on the socket + (ICMPv4 only). + :raises SocketUnavailableError: If the socket is closed. + :raises ICMPSocketError: If another error occurs while sending. + + ''' + if not self._sock: + raise SocketUnavailableError + + try: + sock_destination = socket.getaddrinfo( + host=request.destination, + port=None, + family=self._sock.family, + type=self._sock.type)[0][4] + + packet = self._create_packet( + id=request.id, + sequence=request.sequence, + payload=request.payload) + + self._set_ttl(request.ttl) + self._set_traffic_class(request.traffic_class) + + request._time = time() + self._sock.sendto(packet, sock_destination) + + # On Linux, the ICMP request identifier is replaced by the + # kernel with a random port number when a datagram socket is + # used (SOCK_DGRAM). So, we update the request created by + # the user to take this new identifier into account. + if not self._privileged and PLATFORM_LINUX: + request._id = self._sock.getsockname()[1] + + except PermissionError: + raise SocketBroadcastError + + except OSError as err: + raise ICMPSocketError(str(err)) + + def receive(self, request=None, timeout=2): + ''' + Receive an ICMP reply message from the socket. + + This method can be called multiple times if you expect several + responses as with a broadcast address. + + :type request: ICMPRequest, optional + :param request: The ICMP request to use to match the response. + By default, all ICMP packets arriving on the socket are + returned. + + :type timeout: int or float, optional + :param timeout: The maximum waiting time for receiving the + response in seconds. Default to 2. + + :rtype: ICMPReply + :returns: An `ICMPReply` object representing the response of the + desired destination or an upstream gateway. See the + `ICMPReply` class for details. + + :raises TimeoutExceeded: If no response is received before the + timeout specified in parameters. + :raises SocketUnavailableError: If the socket is closed. + :raises ICMPSocketError: If another error occurs while receiving. + + ''' + if not self._sock: + raise SocketUnavailableError + + self._sock.settimeout(timeout) + time_limit = time() + timeout + + try: + while True: + response = self._sock.recvfrom(1024) + current_time = time() + + packet = response[0] + source = response[1][0] + + if current_time > time_limit: + raise socket.timeout + + reply = self._parse_reply( + packet=packet, + source=source, + current_time=current_time) + + if (reply and not request or + reply and request.id == reply.id and + request.sequence == reply.sequence): + return reply + + except socket.timeout: + raise TimeoutExceeded(timeout) + + except OSError as err: + raise ICMPSocketError(str(err)) + + def close(self): + ''' + Close the socket. It cannot be used after this call. + + ''' + if self._sock: + self._sock.close() + self._sock = None + + @property + def sock(self): + ''' + Return the underlying socket (`socket.socket` object) or `None` + if the socket is closed. + + This property should only be used if the feature you want is not + yet implemented. Some changes made to this socket may cause + unexpected behavior or be incompatible with later versions of + the library. + + Prefer to use the other methods and properties defined within + this class if possible. + + ''' + return self._sock + + @property + def blocking(self): + ''' + Indicate whether the socket is in blocking mode. + Return a `boolean`. + + ''' + return self._sock.getblocking() + + @blocking.setter + def blocking(self, enable): + return self._sock.setblocking(enable) + + @property + def address(self): + ''' + The IP address from which the socket listens and sends packets. + Return `None` if the socket listens on all interfaces. + + ''' + return self._address + + @property + def is_privileged(self): + ''' + Indicate whether the socket is running in privileged mode. + Return a `boolean`. + + ''' + return self._privileged + + @property + def is_closed(self): + ''' + Indicate whether the socket is closed. + Return a `boolean`. + + ''' + return self._sock is None + + +# Echo Request and Echo Reply messages RFC 792 +# +# 0 1 2 3 +# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Type | Code | Checksum | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Identifier | Sequence Number | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Data ... +# +-+-+-+-+- +# +# ICMPv4 Error message RFC 792 +# +# 0 1 2 3 +# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Type | Code | Checksum | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Unused / Depends on the error | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Internet Header + 64 bits of Original Data Datagram | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + +class ICMPv4Socket(ICMPSocket): + ''' + Class for sending and receiving ICMPv4 packets. + + :type address: str, optional + :param address: The IP address from which you want to listen and + send packets. By default, the socket listens on all interfaces. + + :type privileged: bool, optional + :param privileged: When this option is enabled, the socket fully + manages the exchanges and the structure of the ICMP packets. + Disable this option if you want to instantiate and use the + socket without root privileges and let the kernel handle ICMP + headers. Default to True. + Only available on Unix systems. Ignored on Windows. + + :raises SocketPermissionError: If the privileges are insufficient to + create the socket. + :raises SocketAddressError: If the requested address cannot be + assigned to the socket. + :raises ICMPSocketError: If another error occurs while creating the + socket. + + ''' + __slots__ = '_sock', '_address', '_privileged' + + _IP_VERSION = 4 + _ICMP_HEADER_OFFSET = 20 + _ICMP_HEADER_REAL_OFFSET = 20 + + _ICMP_CODE_OFFSET = _ICMP_HEADER_OFFSET + 1 + _ICMP_CHECKSUM_OFFSET = _ICMP_HEADER_OFFSET + 2 + _ICMP_ID_OFFSET = _ICMP_HEADER_OFFSET + 4 + _ICMP_SEQUENCE_OFFSET = _ICMP_HEADER_OFFSET + 6 + _ICMP_PAYLOAD_OFFSET = _ICMP_HEADER_OFFSET + 8 + + _ICMP_ECHO_REQUEST = 8 + _ICMP_ECHO_REPLY = 0 + + def _create_socket(self, type): + ''' + Create and return a new socket. + + ''' + return socket.socket( + family=socket.AF_INET, + type=type, + proto=socket.IPPROTO_ICMP) + + def _set_ttl(self, ttl): + ''' + Set the time to live of every IP packet originating from this + socket. + + ''' + self._sock.setsockopt( + socket.IPPROTO_IP, + socket.IP_TTL, + ttl) + + def _set_traffic_class(self, traffic_class): + ''' + Set the DS Field (formerly TOS) of every IP packet originating + from this socket. + + Only available on Unix systems. Ignored on Windows. + + ''' + # Not available on Windows + if PLATFORM_WINDOWS: + return + + self._sock.setsockopt( + socket.IPPROTO_IP, + socket.IP_TOS, + traffic_class) + + @property + def broadcast(self): + ''' + Indicate whether broadcast support is enabled on the socket. + Return a `boolean`. + + .. note:: + To enable broadcast support: + icmp_socket.broadcast = True + + ''' + return self._sock.getsockopt( + socket.SOL_SOCKET, + socket.SO_BROADCAST) > 0 + + @broadcast.setter + def broadcast(self, enable): + self._sock.setsockopt( + socket.SOL_SOCKET, + socket.SO_BROADCAST, + enable) + + +# Echo Request and Echo Reply messages RFC 4443 +# +# 0 1 2 3 +# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Type | Code | Checksum | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Identifier | Sequence Number | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Data ... +# +-+-+-+-+- +# +# ICMPv6 Error message RFC 4443 +# +# 0 1 2 3 +# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Type | Code | Checksum | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Unused / Depends on the error | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +# | Original packet without exceed the minimum IPv6 MTU | +# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + +# Windows IPv6 compatibility +if PLATFORM_WINDOWS: + socket.IPPROTO_IPV6 = 41 + socket.IPPROTO_ICMPV6 = 58 + + +class ICMPv6Socket(ICMPSocket): + ''' + Class for sending and receiving ICMPv6 packets. + + :type address: str, optional + :param address: The IP address from which you want to listen and + send packets. By default, the socket listens on all interfaces. + + :type privileged: bool, optional + :param privileged: When this option is enabled, the socket fully + manages the exchanges and the structure of the ICMP packets. + Disable this option if you want to instantiate and use the + socket without root privileges and let the kernel handle ICMP + headers. Default to True. + Only available on Unix systems. Ignored on Windows. + + :raises SocketPermissionError: If the privileges are insufficient to + create the socket. + :raises SocketAddressError: If the requested address cannot be + assigned to the socket. + :raises ICMPSocketError: If another error occurs while creating the + socket. + + ''' + __slots__ = '_sock', '_address', '_privileged' + + _IP_VERSION = 6 + _ICMP_HEADER_OFFSET = 0 + _ICMP_HEADER_REAL_OFFSET = 40 + + _ICMP_CODE_OFFSET = _ICMP_HEADER_OFFSET + 1 + _ICMP_CHECKSUM_OFFSET = _ICMP_HEADER_OFFSET + 2 + _ICMP_ID_OFFSET = _ICMP_HEADER_OFFSET + 4 + _ICMP_SEQUENCE_OFFSET = _ICMP_HEADER_OFFSET + 6 + _ICMP_PAYLOAD_OFFSET = _ICMP_HEADER_OFFSET + 8 + + _ICMP_ECHO_REQUEST = 128 + _ICMP_ECHO_REPLY = 129 + + def _create_socket(self, type): + ''' + Create and return a new socket. + + ''' + return socket.socket( + family=socket.AF_INET6, + type=type, + proto=socket.IPPROTO_ICMPV6) + + def _set_ttl(self, ttl): + ''' + Set the time to live of every IP packet originating from this + socket. + + ''' + # Not available on macOS when the privileged param. is disabled + if PLATFORM_MACOS and not self._privileged: + return + + self._sock.setsockopt( + socket.IPPROTO_IPV6, + socket.IPV6_UNICAST_HOPS, + ttl) + + def _set_traffic_class(self, traffic_class): + ''' + Set the Traffic Class field of every IP packet originating from + this socket. + + Only available on Unix systems. Ignored on Windows. + + ''' + # Not available on Windows + if PLATFORM_WINDOWS: + return + + # Not available on macOS when the privileged param. is disabled + if PLATFORM_MACOS and not self._privileged: + return + + self._sock.setsockopt( + socket.IPPROTO_IPV6, + socket.IPV6_TCLASS, + traffic_class) + + +class AsyncSocket: + ''' + A wrapper for ICMP sockets which makes them asynchronous. + + :type icmp_sock: ICMPSocket + :param icmp_sock: An ICMP socket. Once the wrapper is instantiated, + this socket should no longer be used directly. + + ''' + __slots__ = '_icmp_sock' + + def __init__(self, icmp_sock): + self._icmp_sock = icmp_sock + self._icmp_sock.blocking = False + + def __getattr__(self, name): + ''' + Return the specified attribute of the underlying ICMP socket. + + ''' + if not self._icmp_sock: + raise SocketUnavailableError + + return getattr(self._icmp_sock, name) + + def __enter__(self): + ''' + Return this object. + + ''' + return self + + def __exit__(self, type, value, traceback): + ''' + Call the `close` method. + + ''' + self.close() + + def __del__(self): + ''' + Call the `close` method. + + ''' + self.close() + + async def receive(self, request=None, timeout=2): + ''' + Receive an ICMP reply message from the socket. + + This method can be called multiple times if you expect several + responses as with a broadcast address. + + This method is non-blocking. + + :type request: ICMPRequest, optional + :param request: The ICMP request to use to match the response. + By default, all ICMP packets arriving on the socket are + returned. + + :type timeout: int or float, optional + :param timeout: The maximum waiting time for receiving the + response in seconds. Default to 2. + + :rtype: ICMPReply + :returns: An `ICMPReply` object representing the response of the + desired destination or an upstream gateway. See the + `ICMPReply` class for details. + Unlike the `reveive` method of synchronous ICMP sockets, the + returned `ICMPReply` object does not specify the IP address + of the host that replied to the request message. + + :raises TimeoutExceeded: If no response is received before the + timeout specified in parameters. + :raises SocketUnavailableError: If the socket is closed. + :raises ICMPSocketError: If another error occurs while receiving. + + ''' + if not self._icmp_sock or not self._icmp_sock._sock: + raise SocketUnavailableError + + loop = asyncio.get_running_loop() + time_limit = time() + timeout + remaining_time = timeout + + try: + while True: + packet = await asyncio.wait_for( + loop.sock_recv(self._icmp_sock._sock, 1024), + remaining_time) + + current_time = time() + + if current_time > time_limit: + raise asyncio.TimeoutError + + reply = self._parse_reply( + packet=packet, + source=None, + current_time=current_time) + + if (reply and not request or + reply and request.id == reply.id and + request.sequence == reply.sequence): + return reply + + remaining_time = time_limit - current_time + + except asyncio.TimeoutError: + raise TimeoutExceeded(timeout) + + except OSError as err: + raise ICMPSocketError(str(err)) + + finally: + if isinstance(loop, asyncio.SelectorEventLoop): + loop.remove_reader(self._icmp_sock._sock) + + def detach(self): + ''' + Detach the socket from the wrapper and return it. The wrapper + cannot be used after this call but the socket can be reused for + other purposes. + + ''' + icmp_sock = self._icmp_sock + + if self._icmp_sock: + self._icmp_sock = None + + return icmp_sock + + def close(self): + ''' + Detach the underlying socket from the wrapper and close it. Both + cannot be used after this call. + + ''' + if self._icmp_sock: + self.detach().close() + + @property + def is_closed(self): + ''' + Indicate whether the underlying socket is closed or detached + from this wrapper. Return a `boolean`. + + ''' + return self._icmp_sock is None diff --git a/script.plexmod/lib/_included_packages/icmplib/traceroute.py b/script.plexmod/lib/_included_packages/icmplib/traceroute.py new file mode 100644 index 000000000..7dd45f876 --- /dev/null +++ b/script.plexmod/lib/_included_packages/icmplib/traceroute.py @@ -0,0 +1,212 @@ +''' + icmplib + ~~~~~~~ + + Easily forge ICMP packets and make your own ping and traceroute. + + https://github.com/ValentinBELYN/icmplib + + :copyright: Copyright 2017-2023 Valentin BELYN. + :license: GNU LGPLv3, see the LICENSE for details. + + ~~~~~~~ + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +''' + +from time import sleep + +from .sockets import ICMPv4Socket, ICMPv6Socket +from .models import ICMPRequest, Hop +from .exceptions import TimeExceeded, ICMPLibError +from .utils import * + + +def traceroute(address, count=2, interval=0.05, timeout=2, first_hop=1, + max_hops=30, fast=False, id=None, source=None, family=None, + **kwargs): + ''' + Determine the route to a destination host. + + The Internet is a large and complex aggregation of network hardware, + connected together by gateways. Tracking the route one's packets + follow can be difficult. This function uses the IP protocol time to + live field and attempts to elicit an ICMP Time Exceeded response + from each gateway along the path to some host. + + This function requires root privileges to run. + + :type address: str + :param address: The IP address, hostname or FQDN of the host to + reach. For deterministic behavior, prefer to use an IP address. + + :type count: int, optional + :param count: The number of ping to perform per hop. Default to 2. + + :type interval: int or float, optional + :param interval: The interval in seconds between sending each packet. + Default to 0.05. + + :type timeout: int or float, optional + :param timeout: The maximum waiting time for receiving a reply in + seconds. Default to 2. + + :type first_hop: int, optional + :param first_hop: The initial time to live value used in outgoing + probe packets. Default to 1. + + :type max_hops: int, optional + :param max_hops: The maximum time to live (max number of hops) used + in outgoing probe packets. Default to 30. + + :type fast: bool, optional + :param fast: When this option is enabled and an intermediate router + has been reached, skip to the next hop rather than perform + additional requests. The `count` parameter then becomes the + maximum number of requests in the event of no response. + Default to False. + + :type id: int, optional + :param id: The identifier of ICMP requests. Used to match the + responses with requests. In practice, a unique identifier should + be used for every traceroute process. The library handles this + identifier itself by default. + + :type source: str, optional + :param source: The IP address from which you want to send packets. + By default, the interface is automatically chosen according to + the specified destination. + + :type family: int, optional + :param family: The address family if a hostname or FQDN is specified. + Can be set to `4` for IPv4 or `6` for IPv6 addresses. By default, + this function searches for IPv4 addresses first before searching + for IPv6 addresses. + + Advanced (**kwags): + + :type payload: bytes, optional + :param payload: The payload content in bytes. A random payload is + used by default. + + :type payload_size: int, optional + :param payload_size: The payload size. Ignored when the `payload` + parameter is set. Default to 56. + + :type traffic_class: int, optional + :param traffic_class: The traffic class of ICMP packets. + Provides a defined level of service to packets by setting the DS + Field (formerly TOS) or the Traffic Class field of IP headers. + Packets are delivered with the minimum priority by default + (Best-effort delivery). + Intermediate routers must be able to support this feature. + Only available on Unix systems. Ignored on Windows. + + :rtype: list[Hop] + :returns: A list of `Hop` objects representing the route to the + desired destination. The list is sorted in ascending order + according to the distance, in terms of hops, that separates the + remote host from the current machine. Gateways that do not + respond to requests are not added to this list. + + :raises NameLookupError: If you pass a hostname or FQDN in + parameters and it does not exist or cannot be resolved. + :raises SocketPermissionError: If the privileges are insufficient to + create the socket. + :raises SocketAddressError: If the source address cannot be assigned + to the socket. + :raises ICMPSocketError: If another error occurs. See the + `ICMPv4Socket` or `ICMPv6Socket` class for details. + + Usage:: + + >>> from icmplib import traceroute + >>> hops = traceroute('1.1.1.1') + >>> last_distance = 0 + + >>> for hop in hops: + ... if last_distance + 1 != hop.distance: + ... print('Some gateways are not responding') + ... + ... print(f'{hop.distance} {hop.address} {hop.avg_rtt} ms') + ... + ... last_distance = hop.distance + + 1 10.0.0.1 5.196 ms + 2 194.149.169.49 7.552 ms + 3 194.149.166.54 12.21 ms + * Some gateways are not responding + 5 212.73.205.22 22.15 ms + 6 1.1.1.1 13.59 ms + + See the `Hop` class for details. + + ''' + if is_hostname(address): + address = resolve(address, family)[0] + + if is_ipv6_address(address): + _Socket = ICMPv6Socket + else: + _Socket = ICMPv4Socket + + id = id or unique_identifier() + ttl = first_hop + host_reached = False + hops = [] + + with _Socket(source) as sock: + while not host_reached and ttl <= max_hops: + reply = None + packets_sent = 0 + rtts = [] + + for sequence in range(count): + request = ICMPRequest( + destination=address, + id=id, + sequence=sequence, + ttl=ttl, + **kwargs) + + try: + sock.send(request) + packets_sent += 1 + + reply = sock.receive(request, timeout) + rtt = (reply.time - request.time) * 1000 + rtts.append(rtt) + + reply.raise_for_status() + host_reached = True + + except TimeExceeded: + sleep(interval) + + except ICMPLibError: + break + + if reply: + hop = Hop( + address=reply.source, + packets_sent=packets_sent, + rtts=rtts, + distance=ttl) + + hops.append(hop) + + ttl += 1 + + return hops diff --git a/script.plexmod/lib/_included_packages/icmplib/utils.py b/script.plexmod/lib/_included_packages/icmplib/utils.py new file mode 100644 index 000000000..00e2664db --- /dev/null +++ b/script.plexmod/lib/_included_packages/icmplib/utils.py @@ -0,0 +1,199 @@ +''' + icmplib + ~~~~~~~ + + Easily forge ICMP packets and make your own ping and traceroute. + + https://github.com/ValentinBELYN/icmplib + + :copyright: Copyright 2017-2023 Valentin BELYN. + :license: GNU LGPLv3, see the LICENSE for details. + + ~~~~~~~ + + This program is free software: you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +''' + +import socket, asyncio + +from threading import Lock +from sys import platform +from os import getpid +from re import match +from random import choices + +from .exceptions import NameLookupError + + +PID = getpid() +PLATFORM_LINUX = platform == 'linux' +PLATFORM_MACOS = platform == 'darwin' +PLATFORM_WINDOWS = platform == 'win32' + +_lock_id = Lock() +_current_id = PID + + +def random_byte_message(size): + ''' + Generate a random byte sequence of the specified size. + + ''' + sequence = choices( + b'abcdefghijklmnopqrstuvwxyz' + b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + b'1234567890', k=size) + + return bytes(sequence) + + +def unique_identifier(): + ''' + Generate a unique identifier between 0 and 65535. + The first number generated will be equal to the PID + 1. + + ''' + global _current_id + + with _lock_id: + _current_id += 1 + _current_id &= 0xffff + + return _current_id + + +def resolve(name, family=None): + ''' + Resolve a hostname or FQDN to an IP address. Depending on the name + specified in parameters, several IP addresses may be returned. + + This function relies on the DNS name server configured on your + operating system. + + :type name: str + :param name: A hostname or a Fully Qualified Domain Name (FQDN). + + :type family: int, optional + :param family: The address family. Can be set to `4` for IPv4 or `6` + for IPv6 addresses. By default, this function searches for IPv4 + addresses first for compatibility reasons (A DNS lookup) before + searching for IPv6 addresses (AAAA DNS lookup). + + :rtype: list[str] + :returns: A list of IP addresses corresponding to the name passed as + a parameter. + + :raises NameLookupError: If the requested name does not exist or + cannot be resolved. + + ''' + try: + if family == 6: + _family = socket.AF_INET6 + else: + _family = socket.AF_INET + + lookup = socket.getaddrinfo( + host=name, + port=None, + family=_family, + type=socket.SOCK_DGRAM) + + return [address[4][0] for address in lookup] + + except OSError: + if not family: + return resolve(name, 6) + + raise NameLookupError(name) + + +async def async_resolve(name, family=None): + ''' + Resolve a hostname or FQDN to an IP address. Depending on the name + specified in parameters, several IP addresses may be returned. + + This function relies on the DNS name server configured on your + operating system. + + This function is non-blocking. + + :type name: str + :param name: A hostname or a Fully Qualified Domain Name (FQDN). + + :type family: int, optional + :param family: The address family. Can be set to `4` for IPv4 or `6` + for IPv6 addresses. By default, this function searches for IPv4 + addresses first for compatibility reasons (A DNS lookup) before + searching for IPv6 addresses (AAAA DNS lookup). + + :rtype: list[str] + :returns: A list of IP addresses corresponding to the name passed as + a parameter. + + :raises NameLookupError: If the requested name does not exist or + cannot be resolved. + + ''' + try: + if family == 6: + _family = socket.AF_INET6 + else: + _family = socket.AF_INET + + loop = asyncio.get_running_loop() + + lookup = await loop.getaddrinfo( + host=name, + port=None, + family=_family, + type=socket.SOCK_DGRAM) + + return [address[4][0] for address in lookup] + + except OSError: + if not family: + return await async_resolve(name, 6) + + raise NameLookupError(name) + + +def is_hostname(name): + ''' + Indicate whether the specified name is a hostname or an FQDN. + Return a `boolean`. + + ''' + pattern = r'(?i)^([a-z0-9-]+|([a-z0-9_-]+[.])+[a-z]+)$' + return match(pattern, name) is not None + + +def is_ipv4_address(address): + ''' + Indicate whether the specified address is an IPv4 address. + Return a `boolean`. + + ''' + pattern = r'^([0-9]{1,3}[.]){3}[0-9]{1,3}$' + return match(pattern, address) is not None + + +def is_ipv6_address(address): + ''' + Indicate whether the specified address is an IPv6 address. + Return a `boolean`. + + ''' + return ':' in address diff --git a/script.copacetic.helper/resources/__init__.py b/script.plexmod/lib/_included_packages/plexnet/__init__.py similarity index 100% rename from script.copacetic.helper/resources/__init__.py rename to script.plexmod/lib/_included_packages/plexnet/__init__.py diff --git a/script.plexmod/lib/_included_packages/plexnet/asyncadapter.py b/script.plexmod/lib/_included_packages/plexnet/asyncadapter.py new file mode 100644 index 000000000..97fbcd741 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/asyncadapter.py @@ -0,0 +1,338 @@ +from __future__ import absolute_import +import time +import socket +import six + +import requests +import six + +from requests.packages.urllib3 import HTTPConnectionPool, HTTPSConnectionPool +from requests.packages.urllib3.connection import HTTPConnection +from requests.packages.urllib3.poolmanager import PoolManager, proxy_from_url +try: + from requests.packages.urllib3.connectionpool import VerifiedHTTPSConnection +except ImportError: + # urllib3 >= 2.1.0 + from requests.packages.urllib3.connection import HTTPSConnection as VerifiedHTTPSConnection + +from requests.adapters import HTTPAdapter +from requests.compat import urlparse + +#from six.moves.http_client import HTTPConnection +import errno + +DEFAULT_POOLBLOCK = False +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version') + +WIN_WSAEINVAL = 10022 +WIN_EWOULDBLOCK = 10035 +WIN_ECONNRESET = 10054 +WIN_EISCONN = 10056 +WIN_ENOTCONN = 10057 +WIN_EHOSTUNREACH = 10065 + + +def ABORT_FLAG_FUNCTION(): + return False + + +class TimeoutException(Exception): + pass + + +class CanceledException(Exception): + pass + + +class AsyncTimeout(float): + def __repr__(self): + return '{0}({1})'.format(float(self), self.getConnectTimeout()) + + def __str__(self): + return repr(self) + + @classmethod + def fromTimeout(cls, t): + if isinstance(t, AsyncTimeout): + return t + + try: + return AsyncTimeout(float(t)) or DEFAULT_TIMEOUT + except TypeError: + return DEFAULT_TIMEOUT + + def setConnectTimeout(self, val): + self._connectTimout = val + return self + + def getConnectTimeout(self): + if hasattr(self, '_connectTimout'): + return self._connectTimout + + return self + + +DEFAULT_TIMEOUT = AsyncTimeout(10).setConnectTimeout(10) + + +class AsyncVerifiedHTTPSConnection(VerifiedHTTPSConnection): + def __init__(self, *args, **kwargs): + VerifiedHTTPSConnection.__init__(self, *args, **kwargs) + self._canceled = False + self.deadline = 0 + self._timeout = AsyncTimeout(DEFAULT_TIMEOUT) + + def _check_timeout(self): + if time.time() > self.deadline: + raise TimeoutException('connection timed out') + + def create_connection(self, address, timeout=None, source_address=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + timeout = AsyncTimeout.fromTimeout(timeout) + self._timeout = timeout + + host, port = address + err = None + for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + sock.setblocking(False) # this is obviously critical + self.deadline = time.time() + timeout.getConnectTimeout() + # sock.settimeout(timeout) + + if source_address: + sock.bind(source_address) + for msg in self._connect(sock, sa): + if self._canceled or ABORT_FLAG_FUNCTION(): + raise CanceledException('Request canceled') + sock.setblocking(True) + return sock + + except socket.error as _: + err = _ + if sock is not None: + sock.shutdown(socket.SHUT_RDWR) + sock.close() + + if err is not None: + raise err + else: + raise socket.error("getaddrinfo returns an empty list") + + def _connect(self, sock, sa): + while not self._canceled and not ABORT_FLAG_FUNCTION(): + time.sleep(0.01) + self._check_timeout() # this should be done at the beginning of each loop + status = sock.connect_ex(sa) + if not status or status in (errno.EISCONN, WIN_EISCONN): + break + elif status in (errno.EINPROGRESS, WIN_EWOULDBLOCK): + self.deadline = time.time() + self._timeout.getConnectTimeout() + # elif status in (errno.EWOULDBLOCK, errno.EALREADY) or (os.name == 'nt' and status == errno.WSAEINVAL): + # pass + yield + + if self._canceled or ABORT_FLAG_FUNCTION(): + raise CanceledException('Request canceled') + + error = sock.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) + if error: + # TODO: determine when this case can actually happen + raise socket.error((error,)) + + def _new_conn(self): + sock = self.create_connection( + address=(self.host, self.port), + timeout=self.timeout + ) + + return sock + + def cancel(self): + self._canceled = True + + +class AsyncHTTPConnection(HTTPConnection): + def __init__(self, *args, **kwargs): + HTTPConnection.__init__(self, *args, **kwargs) + self._canceled = False + self.deadline = 0 + + def cancel(self): + self._canceled = True + + +class AsyncHTTPConnectionPool(HTTPConnectionPool): + def __init__(self, *args, **kwargs): + HTTPConnectionPool.__init__(self, *args, **kwargs) + self.connections = [] + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPConnection`. + """ + self.num_connections += 1 + + extra_params = {} + if six.PY2: + extra_params['strict'] = self.strict + + conn = AsyncHTTPConnection(host=self.host, port=self.port, timeout=self.timeout.connect_timeout, **extra_params) + + # Backport fix LP #1412545 + if getattr(conn, '_tunnel_host', None): + # TODO: Fix tunnel so it doesn't depend on self.sock state. + conn._tunnel() + # Mark this connection as not reusable + conn.auto_open = 0 + + self.connections.append(conn) + + return conn + + def cancel(self): + for c in self.connections: + c.cancel() + + +class AsyncHTTPSConnectionPool(HTTPSConnectionPool): + def __init__(self, *args, **kwargs): + HTTPSConnectionPool.__init__(self, *args, **kwargs) + self.connections = [] + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + connection_class = AsyncVerifiedHTTPSConnection + + extra_params = {} + if six.PY2: + extra_params['strict'] = self.strict + connection = connection_class(host=actual_host, port=actual_port, timeout=self.timeout.connect_timeout, **extra_params) + + self.connections.append(connection) + + try: + return self._prepare_conn(connection) + except AttributeError: + # urllib3 2.1.0 + return connection + + def cancel(self): + for c in self.connections: + c.cancel() + + +pool_classes_by_scheme = { + 'http': AsyncHTTPConnectionPool, + 'https': AsyncHTTPSConnectionPool, +} + + +class AsyncPoolManager(PoolManager): + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port and scheme. + + This method is used to actually create the connection pools handed out + by :meth:`connection_from_url` and companion methods. It is intended + to be overridden for customization. + """ + pool_cls = pool_classes_by_scheme[scheme] + kwargs = self.connection_pool_kw + if scheme == 'http': + kwargs = self.connection_pool_kw.copy() + for kw in SSL_KEYWORDS: + kwargs.pop(kw, None) + + return pool_cls(host, port, **kwargs) + + +class AsyncHTTPAdapter(HTTPAdapter): + def cancel(self): + for c in self.connections: + c.cancel() + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK): + """Initializes a urllib3 PoolManager. This method should not be called + from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = AsyncPoolManager(num_pools=connections, maxsize=maxsize, block=block) + self.connections = [] + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + """ + proxies = proxies or {} + proxy = proxies.get(urlparse(url.lower()).scheme) + + if proxy: + proxy_headers = self.proxy_headers(proxy) + + if proxy not in self.proxy_manager: + self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block + ) + + conn = self.proxy_manager[proxy].connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + self.connections.append(conn) + return conn + + +class Session(requests.Session): + def __init__(self, *args, **kwargs): + requests.Session.__init__(self, *args, **kwargs) + self.mount('https://', AsyncHTTPAdapter()) + self.mount('http://', AsyncHTTPAdapter()) + + def cancel(self): + for v in self.adapters.values(): + v.close() + v.cancel() diff --git a/script.plexmod/lib/_included_packages/plexnet/audio.py b/script.plexmod/lib/_included_packages/plexnet/audio.py new file mode 100644 index 000000000..251c19b5e --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/audio.py @@ -0,0 +1,153 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from . import plexobjects +from . import plexmedia +from . import media + + +class Audio(media.MediaItem): + def __init__(self, *args, **kwargs): + self._settings = None + media.MediaItem.__init__(self, *args, **kwargs) + + def __eq__(self, other): + return self.ratingKey == other.ratingKey + + def __ne__(self, other): + return not self.__eq__(other) + + def _setData(self, data): + for k, v in data.attrib.items(): + setattr(self, k, plexobjects.PlexValue(v, self)) + + self.key = plexobjects.PlexValue(self.key.replace('/children', ''), self) + + def isMusicItem(self): + return True + + +@plexobjects.registerLibType +class Artist(Audio): + TYPE = 'artist' + + def _setData(self, data): + Audio._setData(self, data) + if self.isFullObject(): + self.countries = plexobjects.PlexItemList(data, media.Country, media.Country.TYPE, server=self.server) + self.genres = plexobjects.PlexItemList(data, media.Genre, media.Genre.TYPE, server=self.server) + self.similar = plexobjects.PlexItemList(data, media.Similar, media.Similar.TYPE, server=self.server) + + def albums(self): + path = '%s/children' % self.key + return plexobjects.listItems(self.server, path, Album.TYPE) + + def album(self, title): + path = '%s/children' % self.key + return plexobjects.findItem(self.server, path, title) + + def tracks(self, watched=None): + leavesKey = '/library/metadata/%s/allLeaves' % self.ratingKey + return plexobjects.listItems(self.server, leavesKey, watched=watched) + + def all(self): + return self.tracks() + + def track(self, title): + path = '/library/metadata/%s/allLeaves' % self.ratingKey + return plexobjects.findItem(self.server, path, title) + + def isFullObject(self): + # plex bug? http://bit.ly/1Sc2J3V + fixed_key = self.key.replace('/children', '') + return self.initpath == fixed_key + + def refresh(self): + self.server.query('/library/metadata/%s/refresh' % self.ratingKey) + + +@plexobjects.registerLibType +class Album(Audio): + TYPE = 'album' + + def _setData(self, data): + Audio._setData(self, data) + if self.isFullObject(): + self.genres = plexobjects.PlexItemList(data, media.Genre, media.Genre.TYPE, server=self.server) + + @property + def defaultTitle(self): + return self.parentTitle or self.title + + def tracks(self, watched=None): + path = '%s/children' % self.key + return plexobjects.listItems(self.server, path, watched=watched) + + def track(self, title): + path = '%s/children' % self.key + return plexobjects.findItem(self.server, path, title) + + def all(self): + return self.tracks() + + def isFullObject(self): + # plex bug? http://bit.ly/1Sc2J3V + fixed_key = self.key.replace('/children', '') + return self.initpath == fixed_key + + def artist(self): + return plexobjects.listItems(self.server, self.parentKey)[0] + + def watched(self): + return self.tracks(watched=True) + + def unwatched(self): + return self.tracks(watched=False) + + +@plexobjects.registerLibType +class Track(Audio): + TYPE = 'track' + + def _setData(self, data): + Audio._setData(self, data) + if self.isFullObject(): + self.moods = plexobjects.PlexItemList(data, media.Mood, media.Mood.TYPE, server=self.server) + self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, initpath=self.initpath, server=self.server, media=self) + + # data for active sessions + self.user = self._findUser(data) + self.player = self._findPlayer(data) + self.transcodeSession = self._findTranscodeSession(data) + + @property + def defaultTitle(self): + return self.parentTitle or self.title + + @property + def settings(self): + if not self._settings: + from . import plexapp + self._settings = plexapp.PlayerSettingsInterface() + + return self._settings + + @property + def thumbUrl(self): + return self.server.url(self.parentThumb) + + def album(self): + return plexobjects.listItems(self.server, self.parentKey)[0] + + def artist(self): + return plexobjects.listItems(self.server, self.grandparentKey)[0] + + def getStreamURL(self, **params): + return self._getStreamURL(**params) + + @property + def defaultThumb(self): + return self.__dict__.get('thumb') or self.__dict__.get('parentThumb') or self.get('grandparentThumb') + + @property + def defaultArt(self): + return self.__dict__.get('art') or self.get('grandparentArt') diff --git a/script.plexmod/lib/_included_packages/plexnet/audioobject.py b/script.plexmod/lib/_included_packages/plexnet/audioobject.py new file mode 100644 index 000000000..453e5e604 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/audioobject.py @@ -0,0 +1,83 @@ +from __future__ import absolute_import +from . import http +from . import mediadecisionengine +from . import util + + +class AudioObjectClass(object): + def __init__(self, item): + self.containerFormats = { + 'aac': "es.aac-adts" + } + + self.item = item + self.choice = mediadecisionengine.MediaDecisionEngine().chooseMedia(item) + if self.choice: + self.media = self.choice.media + self.lyrics = None # createLyrics(item, self.media) + + def build(self, directPlay=None): + directPlay = directPlay or self.choice.isDirectPlayable + + obj = util.AttributeDict() + + # TODO(schuyler): Do we want/need to add anything generic here? Title? Duration? + + if directPlay: + obj = self.buildDirectPlay(obj) + else: + obj = self.buildTranscode(obj) + + self.metadata = obj + + util.LOG("Constructed audio item for playback: {0}".format(obj)) + + return self.metadata + + def buildTranscode(self, obj): + transcodeServer = self.item.getTranscodeServer(True, "audio") + if not transcodeServer: + return None + + obj.streamFormat = "mp3" + obj.isTranscoded = True + obj.transcodeServer = transcodeServer + + builder = http.HttpRequest(transcodeServer.buildUrl("/music/:/transcode/universal/start.m3u8", True)) + builder.addParam("protocol", "http") + builder.addParam("path", self.item.getAbsolutePath("key")) + builder.addParam("session", self.item.getGlobal("clientIdentifier")) + builder.addParam("directPlay", "0") + builder.addParam("directStream", "0") + + obj.url = builder.getUrl() + + return obj + + def buildDirectPlay(self, obj): + if self.choice.part: + obj.url = self.item.getServer().buildUrl(self.choice.part.getAbsolutePath("key"), True) + + # Set and override the stream format if applicable + obj.streamFormat = self.choice.media.container or 'mp3' + if self.containerFormats.get(obj.streamFormat): + obj.streamFormat = self.containerFormats[obj.streamFormat] + + # If we're direct playing a FLAC, bitrate can be required, and supposedly + # this is the only way to do it. plexinc/roku-client#48 + # + bitrate = self.choice.media.getInt("bitrate") + if bitrate > 0: + obj.streams = [{'url': obj.url, 'bitrate': bitrate}] + + return obj + + # We may as well fallback to transcoding if we could not direct play + return self.buildTranscode(obj) + + def getLyrics(self): + return self.lyrics + + def hasLyrics(self): + return False + # return self.lyrics.isAvailable() diff --git a/script.plexmod/lib/_included_packages/plexnet/callback.py b/script.plexmod/lib/_included_packages/plexnet/callback.py new file mode 100644 index 000000000..d99a86f50 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/callback.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +import threading + + +class Callable(object): + _currID = 0 + + def __init__(self, func, forcedArgs=None, ID=None): + self.func = func + self.forcedArgs = forcedArgs + + self.ID = ID or id(func) + + if not self.ID: + self.ID = Callable.nextID() + + def __repr__(self): + return ''.format(repr(self.func).strip('<>')) + + def __eq__(self, other): + if not other: + return False + + if self.__class__ != other.__class__: + return False + + return self.ID and self.ID == other.ID + + def __ne__(self, other): + return not self.__eq__(other) + + def __call__(self, *args, **kwargs): + args = args or [] + if self.forcedArgs: + args = self.forcedArgs + + self.func(*args, **kwargs) + + @property + def context(self): + return self.func.__self__ + + @classmethod + def nextID(cls): + cls._currID += 1 + return cls._currID + + def deferCall(self, timeout=0.1): + timer = threading.Timer(timeout, self.onDeferCallTimer) + timer.name = 'ONDEFERCALLBACK-TIMER:{0}'.format(self.func) + timer.start() + + def onDeferCallTimer(self): + self() diff --git a/script.plexmod/lib/_included_packages/plexnet/captions.py b/script.plexmod/lib/_included_packages/plexnet/captions.py new file mode 100644 index 000000000..e3b49fe21 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/captions.py @@ -0,0 +1,80 @@ +from __future__ import absolute_import +from . import plexapp +from . import util + + +class Captions(object): + def __init__(self): + self.deviceInfo = util.INTERFACE.getGlobal("deviceInfo") + + self.textSize = util.AttributeDict({ + 'extrasmall': 15, + 'small': 20, + 'medium': 30, + 'large': 45, + 'extralarge': 65, + }) + + self.burnedSize = util.AttributeDict({ + 'extrasmall': "60", + 'small': "80", + 'medium': "100", + 'large': "135", + 'extralarge': "200" + }) + + self.colors = util.AttributeDict({ + 'white': 0xffffffff, + 'black': 0x000000ff, + 'red': 0xff0000ff, + 'green': 0x008000ff, + 'blue': 0x0000ffff, + 'yellow': 0xffff00ff, + 'magenta': 0xff00ffff, + 'cyan': 0x00ffffff, + }) + + self.defaults = util.AttributeDict({ + 'textSize': self.textSize.medium, + 'textColor': self.colors.white, + 'textOpacity': 80, + 'backgroundColor': self.colors.black, + 'backgroundOpacity': 70, + 'burnedSize': None + }) + + def getTextSize(self): + value = self.getOption("Text/Size") + return self.textSize.get(value) or self.defaults.textSize + + def getTextColor(self): + value = self.getOption("Text/Color") + return self.colors.get(value) or self.defaults.textColor + + def getTextOpacity(self): + value = self.getOption("Text/Opacity") + if value is None or value == "default": + return self.defaults.textOpacity + else: + return int(value) + + def getBackgroundColor(self): + value = self.getOption("Background/Color") + return self.colors.get(value) or self.defaults.backgroundColor + + def getBackgroundOpacity(self): + value = self.getOption("Background/Opacity") + if value is None or value == "default": + return self.defaults.backgroundOpacity + else: + return int(value) + + def getBurnedSize(self): + value = self.getOption("Text/Size") + return self.burnedSize.get(value) or self.defaults.burnedSize + + def getOption(self, key): + opt = self.deviceInfo.getCaptionsOption(key) + return opt is not None and opt.lower().replace(' ', '') or None + +CAPTIONS = Captions() diff --git a/script.plexmod/lib/_included_packages/plexnet/compat.py b/script.plexmod/lib/_included_packages/plexnet/compat.py new file mode 100644 index 000000000..96b0d7fce --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/compat.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +""" +Python 2/3 compatability +Always try Py3 first +""" + +from __future__ import absolute_import +try: + from urllib.parse import urlencode +except ImportError: + from six.moves.urllib.parse import urlencode + +try: + from urllib.parse import quote +except ImportError: + from six.moves.urllib.parse import quote + +try: + from urllib.parse import quote_plus +except ImportError: + from six.moves.urllib.parse import quote_plus + +try: + from configparser import ConfigParser +except ImportError: + from six.moves.configparser import ConfigParser diff --git a/script.plexmod/lib/_included_packages/plexnet/exceptions.py b/script.plexmod/lib/_included_packages/plexnet/exceptions.py new file mode 100644 index 000000000..a3adf39e8 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/exceptions.py @@ -0,0 +1,22 @@ +class BadRequest(Exception): + pass + + +class NotFound(Exception): + pass + + +class UnknownType(Exception): + pass + + +class Unsupported(Exception): + pass + + +class Unauthorized(Exception): + pass + + +class ServerNotOwned(Exception): + pass diff --git a/script.plexmod/lib/_included_packages/plexnet/gdm.py b/script.plexmod/lib/_included_packages/plexnet/gdm.py new file mode 100644 index 000000000..90b9eba7a --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/gdm.py @@ -0,0 +1,347 @@ +from __future__ import absolute_import +import threading +import socket +import traceback +import time +from . import util +from . import netif + +from . import plexconnection + +DISCOVERY_PORT = 32414 +WIN_NL = chr(13) + chr(10) + + +class GDMDiscovery(object): + def __init__(self): + self._close = False + self.thread = None + + # def isActive(self): + # util.LOG('GDMDiscovery().isActive() - NOT IMPLEMENTED') + # return False + + # def discover(self): + # util.LOG('GDMDiscovery().discover() - NOT IMPLEMENTED') + + def isActive(self): + from . import plexapp + return util.INTERFACE.getPreference("gdm_discovery", True) and self.thread and self.thread.is_alive() + + ''' + def discover(self): + # Only allow discovery if enabled and not currently running + self._close = False + import plexapp + if not util.INTERFACE.getPreference("gdm_discovery", True) or self.isActive(): + return + + ifaces = netif.getInterfaces() + + message = "M-SEARCH * HTTP/1.1" + WIN_NL + WIN_NL + + # Broadcasting to 255.255.255.255 only works on some Rokus, but we + # can't reliably determine the broadcast address for our current + # interface. Try assuming a /24 network, and then fall back to the + # multicast address if that doesn't work. + + multicast = "239.0.0.250" + ip = multicast + subnetRegex = re.compile("((\d+)\.(\d+)\.(\d+)\.)(\d+)") + addr = getFirstIPAddress() # TODO:: -------------------------------------------------------------------------------------------------------- HANDLE + if addr: + match = subnetRegex.search(addr) + if match: + ip = match.group(1) + "255" + util.DEBUG_LOG("Using broadcast address {0}".format()) + + # Socket things sometimes fail for no good reason, so try a few times. + attempt = 0 + success = False + + while attempt < 5 and not success: + udp = CreateObject("roDatagramSocket") + udp.setMessagePort(Application().port) + udp.setBroadcast(true) + + # More things that have been observed to be flaky. + for i in range(5): + addr = CreateObject("roSocketAddress") + addr.setHostName(ip) + addr.setPort(32414) + udp.setSendToAddress(addr) + + sendTo = udp.getSendToAddress() + if sendTo: + sendToStr = str(sendTo.getAddress()) + addrStr = str(addr.getAddress()) + util.DEBUG_LOG("GDM sendto address: " + sendToStr + " / " + addrStr) + if sendToStr == addrStr: + break + + util.ERROR_LOG("Failed to set GDM sendto address") + + udp.notifyReadable(true) + bytesSent = udp.sendStr(message) + util.DEBUG_LOG("Sent " + str(bytesSent) + " bytes") + if bytesSent > 0: + success = udp.eOK() + else: + success = False + if bytesSent == 0 and ip != multicast: + util.LOG("Falling back to multicast address") + ip = multicast + attempt = 0 + + if success: + break + elif attempt == 4 and ip != multicast: + util.LOG("Falling back to multicast address") + ip = multicast + attempt = 0 + else: + time.sleep(500) + util.WARN_LOG("Retrying GDM, errno=" + str(udp.status())) + attempt += 1 + + if success: + util.DEBUG_LOG("Successfully sent GDM discovery message, waiting for servers") + self.servers = [] + self.timer = plexapp.createTimer(5000, self.onTimer) + self.socket = udp + Application().AddSocketCallback(udp, createCallable("OnSocketEvent", m)) + util.APP.addTimer(self.timer) + else: + util.ERROR_LOG("Failed to send GDM discovery message") + import plexapp + import plexresource + plexapp.SERVERMANAGER.UpdateFromConnectionType([], plexresource.ResourceConnection.SOURCE_DISCOVERED) + self.socket = None + self.timer = None + ''' + + def discover(self): + from . import plexapp + if not util.INTERFACE.getPreference("gdm_discovery", True) or self.isActive(): + return + + self.thread = threading.Thread(target=self._discover) + self.thread.start() + + def _discover(self): + ifaces = netif.getInterfaces() + sockets = [] + self.servers = [] + + packet = ("M-SEARCH * HTTP/1.1" + WIN_NL + WIN_NL).encode("utf-8") + + for i in ifaces: + if not i.broadcast: + continue + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.settimeout(0.01) # 10ms + s.bind((i.ip, 0)) + s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) + sockets.append((s, i)) + + success = False + + for attempt in (0, 1): + for s, i in sockets: + if self._close: + return + util.DEBUG_LOG(' o-> Broadcasting to {0}: {1}'.format(i.name, i.broadcast)) + try: + s.sendto(packet, (i.broadcast, DISCOVERY_PORT)) + success = True + except: + util.ERROR() + + if success: + break + + end = time.time() + 5 + + while time.time() < end: + for s, i in sockets: + if self._close: + return + try: + message, address = s.recvfrom(4096) + self.onSocketEvent(message, address) + except socket.timeout: + pass + except: + traceback.print_exc() + + self.discoveryFinished() + + def onSocketEvent(self, message, addr): + util.DEBUG_LOG('Received GDM message:\n' + str(message)) + + hostname = addr[0] # socket.gethostbyaddr(addr[0])[0] + + name = parseFieldValue(message, b"Name: ") + port = parseFieldValue(message, b"Port: ") or b"32400" + machineID = parseFieldValue(message, b"Resource-Identifier: ") + secureHost = parseFieldValue(message, b"Host: ") + + util.DEBUG_LOG("Received GDM response for " + repr(name) + " at http://" + hostname + ":" + port) + + if not name or not machineID: + return + + from . import plexserver + conn = plexconnection.PlexConnection(plexconnection.PlexConnection.SOURCE_DISCOVERED, "http://" + hostname + ":" + port, True, None, bool(secureHost)) + server = plexserver.createPlexServerForConnection(conn) + server.uuid = machineID + server.name = name + server.sameNetwork = True + + # If the server advertised a secure hostname, add a secure connection as well, and + # set the http connection as a fallback. + # + if secureHost: + server.connections.insert( + 0, + plexconnection.PlexConnection( + plexconnection.PlexConnection.SOURCE_DISCOVERED, "https://" + hostname.replace(".", "-") + "." + secureHost + ":" + port, True, None + ) + ) + + self.servers.append(server) + + def discoveryFinished(self, *args, **kwargs): + # Time's up, report whatever we found + self.close() + + if self.servers: + util.LOG("Finished GDM discovery, found {0} server(s)".format(len(self.servers))) + from . import plexapp + plexapp.SERVERMANAGER.updateFromConnectionType(self.servers, plexconnection.PlexConnection.SOURCE_DISCOVERED) + self.servers = None + + def close(self): + self._close = True + + +def parseFieldValue(message, label): + if label not in message: + return None + + return message.split(label, 1)[-1].split(chr(13).encode())[0].decode() + + +DISCOVERY = GDMDiscovery() + +''' +# GDM Advertising + +class GDMAdvertiser(object): + + def __init__(self): + self.responseString = None + + def createSocket() + listenAddr = CreateObject("roSocketAddress") + listenAddr.setPort(32412) + listenAddr.setAddress("0.0.0.0") + + udp = CreateObject("roDatagramSocket") + + if not udp.setAddress(listenAddr) then + Error("Failed to set address on GDM advertiser socket") + return + end if + + if not udp.setBroadcast(true) then + Error("Failed to set broadcast on GDM advertiser socket") + return + end if + + udp.notifyReadable(true) + udp.setMessagePort(Application().port) + + m.socket = udp + + Application().AddSocketCallback(udp, createCallable("OnSocketEvent", m)) + + Debug("Created GDM player advertiser") + + + def refresh() + # Always regenerate our response, even if it might not have changed, it's + # just not that expensive. + m.responseString = invalid + + enabled = AppSettings().GetBoolPreference("remotecontrol") + if enabled AND m.socket = invalid then + m.CreateSocket() + else if not enabled AND m.socket <> invalid then + m.Close() + end if + + + def cleanup() + m.Close() + fn = function() :m.GDMAdvertiser = invalid : + fn() + + + def onSocketEvent(msg as object) + # PMS polls every five seconds, so this is chatty when not debugging. + # Debug("Got a GDM advertiser socket event, is readable: " + tostr(m.socket.isReadable())) + + if m.socket.isReadable() then + message = m.socket.receiveStr(4096) + endIndex = instr(1, message, chr(13)) - 1 + if endIndex <= 0 then endIndex = message.Len() + line = Mid(message, 1, endIndex) + + if line = "M-SEARCH * HTTP/1.1" then + response = m.GetResponseString() + + # Respond directly to whoever sent the search message. + sock = CreateObject("roDatagramSocket") + sock.setSendToAddress(m.socket.getReceivedFromAddress()) + bytesSent = sock.sendStr(response) + sock.Close() + if bytesSent <> Len(response) then + Error("GDM player response only sent " + tostr(bytesSent) + " bytes out of " + tostr(Len(response))) + end if + else + Error("Received unexpected message on GDM advertiser socket: " + tostr(line) + ";") + end if + end if + + + def getResponseString() as string + if m.responseString = invalid then + buf = box("HTTP/1.0 200 OK" + WinNL()) + + settings = AppSettings() + + appendNameValue(buf, "Name", settings.GetGlobal("friendlyName")) + appendNameValue(buf, "Port", WebServer().port.tostr()) + appendNameValue(buf, "Product", "Plex for Roku") + appendNameValue(buf, "Content-Type", "plex/media-player") + appendNameValue(buf, "Protocol", "plex") + appendNameValue(buf, "Protocol-Version", "1") + appendNameValue(buf, "Protocol-Capabilities", "timeline,playback,navigation,playqueues") + appendNameValue(buf, "Version", settings.GetGlobal("appVersionStr")) + appendNameValue(buf, "Resource-Identifier", settings.GetGlobal("clientIdentifier")) + appendNameValue(buf, "Device-Class", "stb") + + m.responseString = buf + + Debug("Built GDM player response:" + m.responseString) + end if + + return m.responseString + + + sub appendNameValue(buf, name, value) + line = name + ": " + value + WinNL() + buf.AppendString(line, Len(line)) + +''' diff --git a/script.plexmod/lib/_included_packages/plexnet/http.py b/script.plexmod/lib/_included_packages/plexnet/http.py new file mode 100644 index 000000000..d3df0b98d --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/http.py @@ -0,0 +1,329 @@ +from __future__ import absolute_import +import sys +import os +import re +import traceback +import requests +import socket +import urllib3 +from . import threadutils +import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error +import mimetypes +from . import plexobjects +from xml.etree import ElementTree + +from . import asyncadapter + +from . import callback +from . import util + + +codes = requests.codes +status_codes = requests.status_codes._codes + + +DEFAULT_TIMEOUT = asyncadapter.AsyncTimeout(util.TIMEOUT).setConnectTimeout(util.TIMEOUT) + + +def GET(*args, **kwargs): + return requests.get(*args, headers=util.BASE_HEADERS.copy(), timeout=util.TIMEOUT, **kwargs) + + +def POST(*args, **kwargs): + return requests.post(*args, headers=util.BASE_HEADERS.copy(), timeout=util.TIMEOUT, **kwargs) + + +def Session(): + s = asyncadapter.Session() + s.headers = util.BASE_HEADERS.copy() + s.timeout = util.TIMEOUT + + return s + + +class RequestContext(dict): + def __getattr__(self, attr): + return self.get(attr) + + def __setattr__(self, attr, value): + self[attr] = value + + +class HttpRequest(object): + _cancel = False + + def __init__(self, url, method=None, forceCertificate=False): + self.server = None + self.path = None + self.hasParams = '?' in url + self.ignoreResponse = False + self.session = asyncadapter.Session() + self.session.headers = util.BASE_HEADERS.copy() + self.currentResponse = None + self.method = method + self.url = url + self.thread = None + + # Use our specific plex.direct CA cert if applicable to improve performance + # if forceCertificate or url[:5] == "https": # TODO: ---------------------------------------------------------------------------------IMPLEMENT + # certsPath = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'certs') + # if "plex.direct" in url: + # self.session.cert = os.path.join(certsPath, 'plex-bundle.crt') + # else: + # self.session.cert = os.path.join(certsPath, 'ca-bundle.crt') + + def removeAsPending(self): + from . import plexapp + util.APP.delRequest(self) + + def startAsync(self, *args, **kwargs): + self.thread = threadutils.KillableThread(target=self._startAsync, args=args, kwargs=kwargs, name='HTTP-ASYNC:{0}'.format(self.url)) + self.thread.start() + return True + + def _startAsync(self, body=None, contentType=None, context=None): + timeout = context and context.timeout or DEFAULT_TIMEOUT + self.logRequest(body, timeout) + if self._cancel: + return + try: + if self.method == 'PUT': + res = self.session.put(self.url, timeout=timeout, stream=True) + elif self.method == 'DELETE': + res = self.session.delete(self.url, timeout=timeout, stream=True) + elif self.method == 'HEAD': + res = self.session.head(self.url, timeout=timeout, stream=True) + elif self.method == 'POST' or body is not None: + if not contentType: + self.session.headers["Content-Type"] = "application/x-www-form-urlencoded" + else: + self.session.headers["Content-Type"] = mimetypes.guess_type(contentType) + + res = self.session.post(self.url, data=body or None, timeout=timeout, stream=True) + else: + res = self.session.get(self.url, timeout=timeout, stream=True) + self.currentResponse = res + + if self._cancel: + return + except asyncadapter.TimeoutException: + from . import plexapp + plexapp.util.APP.onRequestTimeout(context) + self.removeAsPending() + return + except asyncadapter.CanceledException: + return + except (urllib3.exceptions.ProtocolError, requests.exceptions.ConnectionError): + self.removeAsPending() + return + except Exception as e: + util.ERROR('Request failed {0}'.format(util.cleanToken(self.url))) + if not hasattr(e, 'response'): + return + res = e.response + + self.onResponse(res, context) + + self.removeAsPending() + + def getWithTimeout(self, seconds=DEFAULT_TIMEOUT): + return HttpObjectResponse(self.getPostWithTimeout(seconds), self.path, self.server) + + def postWithTimeout(self, seconds=DEFAULT_TIMEOUT, body=None): + self.method = 'POST' + return HttpObjectResponse(self.getPostWithTimeout(seconds, body), self.path, self.server) + + def getToStringWithTimeout(self, seconds=DEFAULT_TIMEOUT): + res = self.getPostWithTimeout(seconds) + if not res: + return '' + return res.text.encode('utf8') + + def postToStringWithTimeout(self, body=None, seconds=DEFAULT_TIMEOUT): + self.method = 'POST' + res = self.getPostWithTimeout(seconds, body) + if not res: + return '' + return res.text.encode('utf8') + + def getPostWithTimeout(self, seconds=DEFAULT_TIMEOUT, body=None): + if self._cancel: + return + + self.logRequest(body, seconds, False) + try: + if self.method == 'PUT': + res = self.session.put(self.url, timeout=seconds, stream=True) + elif self.method == 'DELETE': + res = self.session.delete(self.url, timeout=seconds, stream=True) + elif self.method == 'HEAD': + res = self.session.head(self.url, timeout=seconds, stream=True) + elif self.method == 'POST' or body is not None: + res = self.session.post(self.url, data=body, timeout=seconds, stream=True) + else: + res = self.session.get(self.url, timeout=seconds, stream=True) + + self.currentResponse = res + + if self._cancel: + return None + + util.LOG("Got a {0} from {1}".format(res.status_code, util.cleanToken(self.url))) + # self.event = msg + return res + except Exception as e: + info = traceback.extract_tb(sys.exc_info()[2])[-1] + util.WARN_LOG( + "Request errored out - URL: {0} File: {1} Line: {2} Msg: {3}".format(util.cleanToken(self.url), os.path.basename(info[0]), info[1], getattr(e, 'message', '')) + ) + + return None + + def wasOK(self): + return self.currentResponse and self.currentResponse.ok + + def wasNotFound(self): + return self.currentResponse is not None and self.currentResponse.status_code == requests.codes.not_found + + def getIdentity(self): + return str(id(self)) + + def getUrl(self): + return self.url + + def getRelativeUrl(self): + url = self.getUrl() + m = re.match(r'^\w+://.+?(/.+)', url) + if m: + return m.group(1) + return url + + def killSocket(self): + if not self.currentResponse: + return + + try: + socket.fromfd(self.currentResponse.raw.fileno(), socket.AF_INET, socket.SOCK_STREAM).shutdown(socket.SHUT_RDWR) + return + except AttributeError: + pass + except Exception as e: + util.ERROR(err=e) + + try: + self.currentResponse.raw._fp.fp._sock.shutdown(socket.SHUT_RDWR) + except AttributeError: + pass + except Exception as e: + util.ERROR(err=e) + + def cancel(self): + self._cancel = True + self.session.cancel() + self.removeAsPending() + self.killSocket() + + def addParam(self, encodedName, value): + if self.hasParams: + self.url += "&" + encodedName + "=" + six.moves.urllib.parse.quote_plus(value) + else: + self.hasParams = True + self.url += "?" + encodedName + "=" + six.moves.urllib.parse.quote_plus(value) + + def addHeader(self, name, value): + self.session.headers[name] = value + + def createRequestContext(self, requestType, callback_=None, timeout=None): + context = RequestContext() + context.requestType = requestType + context.timeout = timeout or DEFAULT_TIMEOUT + + if callback_: + context.callback = callback.Callable(self.onResponse) + context.completionCallback = callback_ + context.callbackCtx = callback_.context + + return context + + def onResponse(self, event, context): + if context.completionCallback: + response = HttpResponse(event) + context.completionCallback(self, response, context) + + def logRequest(self, body, timeout=None, _async=True): + # Log the real request method + method = self.method + if not method: + method = body is not None and "POST" or "GET" + util.LOG( + "Starting request: {0} {1} (async={2} timeout={3})".format(method, util.cleanToken(self.url), + _async, timeout) + ) + + +class HttpResponse(object): + def __init__(self, event): + self.event = event + if not self.event is None: + self.event.content # force data to be read + self.event.close() + + def isSuccess(self): + if not self.event: + return False + return self.event.status_code >= 200 and self.event.status_code < 300 + + def isError(self): + return not self.isSuccess() + + def getStatus(self): + if self.event is None: + return 0 + return self.event.status_code + + def getBodyString(self): + if self.event is None: + return '' + return self.event.text.encode('utf-8') + + def getErrorString(self): + if self.event is None: + return '' + return self.event.reason + + def getBodyXml(self): + if not self.event is None: + return ElementTree.fromstring(self.getBodyString()) + + return None + + def getResponseHeader(self, name): + if self.event is None: + return None + return self.event.headers.get(name) + + +class HttpObjectResponse(HttpResponse, plexobjects.PlexContainer): + def __init__(self, response, path, server=None): + self.event = response + if self.event: + self.event.content # force data to be read + self.event.close() + + data = self.getBodyXml() + + plexobjects.PlexContainer.__init__(self, data, initpath=path, server=server, address=path) + self.container = self + + self.items = plexobjects.listItems(server, path, data=data, container=self) + + +def addRequestHeaders(transferObj, headers=None): + if isinstance(headers, dict): + for header in headers: + transferObj.addHeader(header, headers[header]) + util.DEBUG_LOG("Adding header to {0}: {1}: {2}".format(transferObj, header, headers[header])) + + +def addUrlParam(url, param): + return url + ('?' in url and '&' or '?') + param diff --git a/script.plexmod/lib/_included_packages/plexnet/locks.py b/script.plexmod/lib/_included_packages/plexnet/locks.py new file mode 100644 index 000000000..5e309f4ee --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/locks.py @@ -0,0 +1,67 @@ +# Generic Locks. These are only virtual. You will need to check for the lock to +# ignore processing depending on the lockName. +# * Locks().Lock("lockName") : creates virtual lock +# * Locks().IsLocked("lockName") : returns true if locked +# * Locks().Unlock("lockName") : return true if existed & removed +from __future__ import absolute_import +from . import util + + +class Locks(object): + def __init__(self): + self.locks = {} + self.oneTimeLocks = {} + + def lock(self, name): + self.locks[name] = (self.locks.get(name) or 0) + 1 + util.DEBUG_LOG("Lock {0}, total={0}".format(name, self.locks[name])) + + def lockOnce(self, name): + util.DEBUG_LOG("Locking once {0}".format(name)) + self.oneTimeLocks[name] = True + + def unlock(self, name, forceUnlock=False): + oneTime = False + if name in self.oneTimeLocks: + del self.oneTimeLocks[name] + oneTime = True + normal = (self.locks.get(name) or 0) > 0 + + if normal: + if forceUnlock: + self.locks[name] = 0 + else: + self.locks[name] -= 1 + + if self.locks[name] <= 0: + del self.locks[name] + else: + normal = False + + unlocked = (normal or oneTime) + util.DEBUG_LOG("Unlock {0}, total={1}, unlocked={2}".format(name, self.locks.get(name) or 0, unlocked)) + + return unlocked + + def isLocked(self, name): + return name in self.oneTimeLocks or name in self.locks + # return (self.oneTimeLocks.Delete(name) or self.locks.DoesExist(name)) + + +# lock helpers +def disableBackButton(): + LOCKS.lock("BackButton") + + +def enableBackButton(): + LOCKS.unlock("BackButton", True) + + +def disableRemoteControl(): + LOCKS.lock("roUniversalControlEvent") + + +def enableRemoteControl(): + LOCKS.unlock("roUniversalControlEvent", True) + +LOCKS = Locks() diff --git a/script.plexmod/lib/_included_packages/plexnet/media.py b/script.plexmod/lib/_included_packages/plexnet/media.py new file mode 100644 index 000000000..56d70eb02 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/media.py @@ -0,0 +1,258 @@ +from __future__ import absolute_import +from . import plexobjects +from . import plexstream +from . import util + +METADATA_RELATED_TRAILER = 1 +METADATA_RELATED_DELETED_SCENE = 2 +METADATA_RELATED_INTERVIEW = 3 +METADATA_RELATED_MUSIC_VIDEO = 4 +METADATA_RELATED_BEHIND_THE_SCENES = 5 +METADATA_RELATED_SCENE_OR_SAMPLE = 6 +METADATA_RELATED_LIVE_MUSIC_VIDEO = 7 +METADATA_RELATED_LYRIC_MUSIC_VIDEO = 8 +METADATA_RELATED_CONCERT = 9 +METADATA_RELATED_FEATURETTE = 10 +METADATA_RELATED_SHORT = 11 +METADATA_RELATED_OTHER = 12 + + +class MediaItem(plexobjects.PlexObject): + def getIdentifier(self): + identifier = self.get('identifier') or None + + if identifier is None: + identifier = self.container.identifier + + # HACK + # PMS doesn't return an identifier for playlist items. If we haven't found + # an identifier and the key looks like a library item, then we pretend like + # the identifier was set. + # + if identifier is None: # Modified from Roku code which had no check for None with iPhoto - is that right? + if self.key.startswith('/library/metadata'): + identifier = "com.plexapp.plugins.library" + elif self.isIPhoto(): + identifier = "com.plexapp.plugins.iphoto" + + return identifier + + def getQualityType(self, server=None): + if self.isOnlineItem(): + return util.QUALITY_ONLINE + + if not server: + server = self.getServer() + + return util.QUALITY_LOCAL if server.isLocalConnection() else util.QUALITY_REMOTE + + def delete(self): + if not self.ratingKey: + return + + from . import plexrequest + req = plexrequest.PlexRequest(self.server, '/library/metadata/{0}'.format(self.ratingKey), method='DELETE') + req.getToStringWithTimeout(10) + self.deleted = req.wasOK() + return self.deleted + + def exists(self): + if self.deleted or self.deletedAt: + return False + + data = self.server.query('/library/metadata/{0}'.format(self.ratingKey)) + return data is not None and data.attrib.get('size') != '0' + # req = plexrequest.PlexRequest(self.server, '/library/metadata/{0}'.format(self.ratingKey), method='HEAD') + # req.getToStringWithTimeout(10) + # return not req.wasNotFound() + + def fixedDuration(self): + duration = self.duration.asInt() + if duration < 1000: + duration *= 60000 + return duration + + +class Media(plexobjects.PlexObject): + TYPE = 'Media' + + def __init__(self, data, initpath=None, server=None, video=None): + plexobjects.PlexObject.__init__(self, data, initpath=initpath, server=server) + self.video = video + self.parts = [MediaPart(elem, initpath=self.initpath, server=self.server, media=self) for elem in data] + + def __repr__(self): + title = self.video.title.replace(' ', '.')[0:20] + return '<%s:%s>' % (self.__class__.__name__, title.encode('utf8')) + + +class MediaPart(plexobjects.PlexObject): + TYPE = 'Part' + + def __init__(self, data, initpath=None, server=None, media=None): + plexobjects.PlexObject.__init__(self, data, initpath=initpath, server=server) + self.media = media + self.streams = [MediaPartStream.parse(e, initpath=self.initpath, server=server, part=self) for e in data if e.tag == 'Stream'] + + def __repr__(self): + return '<%s:%s>' % (self.__class__.__name__, self.id) + + def selectedStream(self, stream_type): + streams = [x for x in self.streams if stream_type == x.type] + selected = list([x for x in streams if x.selected is True]) + if len(selected) == 0: + return None + return selected[0] + + +class MediaPartStream(plexstream.PlexStream): + TYPE = None + STREAMTYPE = None + + def __init__(self, data, initpath=None, server=None, part=None): + plexobjects.PlexObject.__init__(self, data, initpath, server) + self.part = part + + @staticmethod + def parse(data, initpath=None, server=None, part=None): + STREAMCLS = { + 1: VideoStream, + 2: AudioStream, + 3: SubtitleStream + } + stype = int(data.attrib.get('streamType')) + cls = STREAMCLS.get(stype, MediaPartStream) + return cls(data, initpath=initpath, server=server, part=part) + + def __repr__(self): + return '<%s:%s>' % (self.__class__.__name__, self.id) + + +class VideoStream(MediaPartStream): + TYPE = 'videostream' + STREAMTYPE = plexstream.PlexStream.TYPE_VIDEO + + +class AudioStream(MediaPartStream): + TYPE = 'audiostream' + STREAMTYPE = plexstream.PlexStream.TYPE_AUDIO + + +class SubtitleStream(MediaPartStream): + TYPE = 'subtitlestream' + STREAMTYPE = plexstream.PlexStream.TYPE_SUBTITLE + + +class TranscodeSession(plexobjects.PlexObject): + TYPE = 'TranscodeSession' + + +class MediaTag(plexobjects.PlexObject): + TYPE = None + ID = 'None' + + def __repr__(self): + tag = self.tag.replace(' ', '.')[0:20] + return '<%s:%s:%s>' % (self.__class__.__name__, self.id, tag) + + def __eq__(self, other): + if other.__class__ != self.__class__: + return False + + return self.id == other.id + + def __ne__(self, other): + return not self.__eq__(other) + + +class Collection(MediaTag): + TYPE = 'Collection' + FILTER = 'collection' + + +class Country(MediaTag): + TYPE = 'Country' + FILTER = 'country' + + +class Director(MediaTag): + TYPE = 'Director' + FILTER = 'director' + ID = '4' + + +class Genre(MediaTag): + TYPE = 'Genre' + FILTER = 'genre' + ID = '1' + + +class Mood(MediaTag): + TYPE = 'Mood' + FILTER = 'mood' + + +class Producer(MediaTag): + TYPE = 'Producer' + FILTER = 'producer' + + +class Role(MediaTag): + TYPE = 'Role' + FILTER = 'actor' + ID = '6' + + def sectionRoles(self): + hubs = self.server.hubs(count=10, search_query=self.tag) + for hub in hubs: + if hub.type == 'actor': + break + else: + return None + + roles = [] + + for actor in hub.items: + if actor.id == self.id: + roles.append(actor) + + return roles or None + + +class Similar(MediaTag): + TYPE = 'Similar' + FILTER = 'similar' + + +class Writer(MediaTag): + TYPE = 'Writer' + FILTER = 'writer' + + +class Chapter(MediaTag): + TYPE = 'Chapter' + + def startTime(self): + return self.get('startTimeOffset', -1).asInt() + + +class Bandwidth(plexobjects.PlexObject): + TYPE = 'Bandwidth' + + +class Marker(MediaTag): + TYPE = 'Marker' + FILTER = 'Marker' + + +class Review(MediaTag): + TYPE = 'Review' + FILTER = 'Review' + + def ratingImage(self): + # only rottentomatoes currently supported + img = str(self.image) + if not img or not img.startswith("rottentomatoes://"): + return '' + + return img.split('rottentomatoes://')[1] diff --git a/script.plexmod/lib/_included_packages/plexnet/mediachoice.py b/script.plexmod/lib/_included_packages/plexnet/mediachoice.py new file mode 100644 index 000000000..a41f5c7c8 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/mediachoice.py @@ -0,0 +1,55 @@ +from __future__ import absolute_import +from . import plexstream +from . import util + + +class MediaChoice(object): + SUBTITLES_DEFAULT = 0 + SUBTITLES_BURN = 1 + SUBTITLES_SOFT_DP = 2 + SUBTITLES_SOFT_ANY = 3 + + def __init__(self, media=None, partIndex=0): + self.media = media + self.part = None + self.forceTranscode = False + self.isDirectPlayable = False + self.videoStream = None + self.audioStream = None + self.subtitleStream = None + self.isSelected = False + self.subtitleDecision = self.SUBTITLES_DEFAULT + + self.sorts = util.AttributeDict() + + if media: + self.indirectHeaders = media.indirectHeaders + self.part = media.parts[partIndex] + if not self.part: + for part in media.parts: + if part.isAccessible(): + self.part = part + + if self.part: + # We generally just rely on PMS to have told us selected streams, so + # initialize our streams accordingly. + + self.videoStream = self.part.getSelectedStreamOfType(plexstream.PlexStream.TYPE_VIDEO) + self.audioStream = self.part.getSelectedStreamOfType(plexstream.PlexStream.TYPE_AUDIO) + self.subtitleStream = self.part.getSelectedStreamOfType(plexstream.PlexStream.TYPE_SUBTITLE) + else: + util.WARN_LOG("Media does not contain a valid part") + + util.LOG("Choice media: {0} part:{1}".format(media, partIndex)) + for streamType in ("videoStream", "audioStream", "subtitleStream"): + attr = getattr(self, streamType) + if attr: + util.LOG("Choice {0}: {1}".format(streamType, repr(attr))) + else: + util.WARN_LOG("Could not create media choice for invalid media") + + def __str__(self): + return "direct playable={0} version={1}".format(self.isDirectPlayable, self.media) + + def __repr__(self): + return self.__str__() diff --git a/script.plexmod/lib/_included_packages/plexnet/mediadecisionengine.py b/script.plexmod/lib/_included_packages/plexnet/mediadecisionengine.py new file mode 100644 index 000000000..ffda4ef5a --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/mediadecisionengine.py @@ -0,0 +1,510 @@ +from __future__ import absolute_import +from . import mediachoice +from . import serverdecision +from . import plexapp +from . import util +import six +from six.moves import range + + +class MediaDecisionEngine(object): + proxyTypes = util.AttributeDict({ + 'NORMAL': 0, + 'LOCAL': 42, + 'CLOUD': 43 + }) + + def __init__(self): + self.softSubLanguages = None + + # TODO(schuyler): Do we need to allow this to be async? We may have to request + # the media again to fetch details, and we may need to make multiple requests to + # resolve an indirect. We can do it all async, we can block, or we can allow + # both. + + def chooseMedia(self, item, forceUpdate=False): + # If we've already evaluated this item, use our previous choice. + if not forceUpdate and item.mediaChoice is not None and item.mediaChoice.media is not None and not item.mediaChoice.media.isIndirect(): + return item.mediaChoice + + # See if we're missing media/stream details for this item. + if item.isLibraryItem() and item.isVideoItem() and len(item.media) > 0 and not item.media[0].hasStreams(): + # TODO(schuyler): Fetch the details + util.WARN_LOG("Can't make media choice, missing details") + + # Take a first pass through the media items to create an array of candidates + # that we'll evaluate more completely. If we find a forced item, we use it. + # If we find an indirect, we only keep a single candidate. + indirect = False + candidates = [] + maxResolution = item.settings.getMaxResolution(item.getQualityType()) + for mediaIndex in range(len(item.media)): + media = item.media[mediaIndex] + media.mediaIndex = mediaIndex + if media.isSelected(): + candidates = [] + candidates.append(media) + break + if media.isIndirect(): + # Only add indirect media if the resolution fits. We cannot + # exit early as the user may have selected media. + + indirect = True + if media.getVideoResolution() <= maxResolution: + candidates.append(media) + + elif media.isAccessible(): + # Only consider testing available media + candidates.append(media) + + # Only use the first indirect media item + if indirect and candidates: + candidates = candidates[0] + + # Make sure we have at least one valid item, regardless of availability + if len(candidates) == 0: + candidates.append(item.media[0]) + + # Now that we have an array of candidates, evaluate them completely. + choices = [] + for media in candidates: + choice = None + if media is not None: + if item.isVideoItem(): + choice = self.evaluateMediaVideo(item, media) + elif item.isMusicItem(): + choice = self.evaluateMediaMusic(item, media) + else: + choice = mediachoice.MediaChoice(media) + choices.append(choice) + item.mediaChoice = self.sortChoices(choices)[-1] + util.LOG("MDE: MediaChoice: {0}".format(item.mediaChoice)) + return item.mediaChoice + + def sortChoices(self, choices): + if choices is None: + return [] + + if len(choices) > 1: + self.sort(choices, "bitrate") + self.sort(choices, "audioChannels") + self.sort(choices, "audioDS") + self.sort(choices, "resolution") + self.sort(choices, "videoDS") + self.sort(choices, "directPlay") + self.sort(choices, self.higherResIfCapable) + self.sort(choices, self.cloudIfRemote) + + return choices + + def evaluateMediaVideo(self, item, media, partIndex=0): + # Resolve indirects before doing anything else. + if media.isIndirect(): + util.LOG("Resolve indirect media for {0}".format(item)) + media = media.resolveIndirect() + + choice = mediachoice.MediaChoice(media, partIndex) + server = item.getServer() + + if not media: + return choice + + choice.isSelected = media.isSelected() + choice.protocol = media.protocol("http") + + maxResolution = item.settings.getMaxResolution(item.getQualityType(), self.isSupported4k(media, choice.videoStream)) + maxBitrate = item.settings.getMaxBitrate(item.getQualityType()) + + choice.resolution = media.getVideoResolution() + if choice.resolution > maxResolution or media.bitrate.asInt() > maxBitrate: + choice.forceTranscode = True + + if choice.subtitleStream: + choice.subtitleDecision = self.evaluateSubtitles(choice.subtitleStream) + choice.hasBurnedInSubtitles = (choice.subtitleDecision != choice.SUBTITLES_SOFT_DP and choice.subtitleDecision != choice.SUBTITLES_SOFT_ANY) + else: + choice.hasBurnedInSubtitles = False + + # For evaluation purposes, we only care about the first part + part = media.parts[partIndex] + if not part: + return choice + + # Although PMS has already told us which streams are selected, we can't + # necessarily tell the video player which streams we want. So we need to + # iterate over the streams and see if there are any red flags that would + # prevent direct play. If there are multiple video streams, we're hosed. + # For audio streams, we have a fighting chance if the selected stream can + # be selected by language, but we need to be careful about guessing which + # audio stream the Roku will pick for a given language. + + numVideoStreams = 0 + problematicAudioStream = False + + if part.get('hasChapterVideoStream').asBool(): + numVideoStreams = 1 + + for stream in part.streams: + streamType = stream.streamType.asInt() + if streamType == stream.TYPE_VIDEO: + numVideoStreams = numVideoStreams + 1 + + if stream.codec == "h264" or ( + stream.codec == "hevc" and item.settings.getPreference("allow_hevc", True) + ) or ( + stream.codec == "av1" and item.settings.getPreference("allow_av1", False) + ) or ( + stream.codec == "vp9" and item.settings.getGlobal("vp9Support") + ): + choice.sorts.videoDS = 1 + + # Special cases to force direct play + forceDirectPlay = False + if choice.protocol == "hls": + util.LOG("MDE: Assuming HLS is direct playable") + forceDirectPlay = True + elif not server.supportsVideoTranscoding: + # See if we can use another server to transcode, otherwise force direct play + transcodeServer = item.getTranscodeServer(True, "video") + if not transcodeServer or not transcodeServer.supportsVideoTranscoding: + util.LOG("MDE: force direct play because the server does not support video transcoding") + forceDirectPlay = True + + # See if we found any red flags based on the streams. Otherwise, go ahead + # with our codec checks. + + if forceDirectPlay: + # Consider the choice DP, but continue to allow the + # choice to have the sorts set properly. + choice.isDirectPlayable = True + elif choice.hasBurnedInSubtitles: + util.LOG("MDE: Need to burn in subtitles") + elif choice.protocol != "http": + util.LOG("MDE: " + choice.protocol + " not supported") + # elif numVideoStreams > 1: + # util.LOG("MDE: Multiple video streams, won't try to direct play") + elif problematicAudioStream: + util.LOG("MDE: Problematic AAC stream with more than 2 channels prevents direct play") + elif self.canDirectPlay(item, choice): + choice.isDirectPlayable = True + elif item.isMediaSynthesized: + util.LOG("MDE: assuming synthesized media can direct play") + choice.isDirectPlayable = True + + # Check for a server decision. This is authority as it's the only playback type + # the server will allow. This will also support forcing direct play, overriding + # only our local MDE checks based on the user pref, and only if the server + # agrees. + decision = part.get("decision") + if decision: + if decision != serverdecision.ServerDecision.DECISION_DIRECT_PLAY: + util.LOG("MDE: Server has decided this cannot direct play") + choice.isDirectPlayable = False + else: + util.LOG("MDE: Server has allowed direct play") + choice.isDirectPlayable = True + + # Setup sorts + if choice.videoStream is not None: + choice.sorts.bitrate = choice.videoStream.bitrate.asInt() + elif choice.media is not None: + choice.sorts.bitrate = choice.media.bitrate.asInt() + else: + choice.sorts.bitrate = 0 + + if choice.audioStream is not None: + choice.sorts.audioChannels = choice.audioStream.channels.asInt() + elif choice.media is not None: + choice.sorts.audioChannels = choice.media.audioChannels.asInt() + else: + choice.sorts.audioChannels = 0 + + AC3Cond = item.settings.getPreference("audio_force_ac3_cond", 'never') + + if AC3Cond != 'never': + allowed = ["ac3"] + if item.settings.getPreference("audio_ac3dts", False): + allowed.append("dca") + + if AC3Cond == 'always' and choice.audioStream.codec not in allowed: + util.LOG("MDE: Codec {} can't be direct played due to user settings".format(choice.audioStream.codec)) + choice.isDirectPlayable = False + + elif AC3Cond in ('2', '5'): + ch = int(AC3Cond) + ach = choice.sorts.audioChannels + + # got AC3/DTS but channels don't match + if choice.audioStream.codec in allowed and ach > ch: + util.LOG("MDE: {}-channel AC3/DTS can't be direct played due " + "to user settings ({} ch)".format(ach, ch)) + choice.isDirectPlayable = False + # other codec and channels don't match + elif ach > ch: + util.LOG("MDE: {}-channel {} can't be direct played due to " + "user settings ({} ch)".format(ach, choice.audioStream.codec, ch)) + choice.isDirectPlayable = False + + choice.sorts.videoDS = not ( + choice.sorts.videoDS is None or choice.forceTranscode is True) and choice.sorts.videoDS or 0 + choice.sorts.resolution = choice.resolution + + # Server properties probably don't need to be associated with each choice + choice.sorts.canTranscode = server.supportsVideoTranscoding and 1 or 0 + choice.sorts.canRemuxOnly = server.supportsVideoRemuxOnly and 1 or 0 + choice.sorts.directPlay = (choice.isDirectPlayable is True and choice.forceTranscode is not True) and 1 or 0 + choice.sorts.proxyType = choice.media.proxyType and choice.media.proxyType or self.proxyTypes.NORMAL + + return choice + + def canDirectPlay(self, item, choice): + maxResolution = item.settings.getMaxResolution(item.getQualityType(), self.isSupported4k(choice.media, choice.videoStream)) + height = choice.media.getVideoResolution() + if height > maxResolution: + util.LOG("MDE: (DP) Video height is greater than max allowed: {0} > {1}".format(height, maxResolution)) + if height > 1088 and item.settings.getPreference("allow_4k", True): + util.LOG("MDE: (DP) Unsupported 4k media") + return False + + maxBitrate = item.settings.getMaxBitrate(item.getQualityType()) + bitrate = choice.media.bitrate.asInt() + if bitrate > maxBitrate: + util.LOG("MDE: (DP) Video bitrate is greater than the allowed max: {0} > {1}".format(bitrate, maxBitrate)) + return False + + if choice.videoStream is None: + util.ERROR_LOG("MDE: (DP) No video stream") + return True + + if not item.settings.getGlobal("supports1080p60"): + videoFrameRate = choice.videoStream.asInt() + if videoFrameRate > 30 and height >= 1080: + util.LOG("MDE: (DP) Frame rate is not supported for resolution: {0}@{1}".format(height, videoFrameRate)) + return False + + if choice.videoStream.codec == "hevc" and not item.settings.getPreference("allow_hevc", True): + util.LOG("MDE: (DP) Codec is HEVC, which is disabled") + return False + + if choice.videoStream.codec == "av1" and not item.settings.getPreference("allow_av1", False): + util.LOG("MDE: (DP) Codec is AV1, which is disabled") + return False + + return True + + # container = choice.media.get('container') + # videoCodec = choice.videoStream.codec + # if choice.audioStream is None: + # audioCodec = None + # numChannels = 0 + # else: + # audioCodec = choice.audioStream.codec + # numChannels = choice.audioStream.channels.asInt() + + # Formats: https://support.roku.com/hc/en-us/articles/208754908-Roku-Media-Player-Playing-your-personal-videos-music-photos + # All Models: H.264/AVC (MKV, MP4, MOV), + # Roku 4 only: H.265/HEVC (MKV, MP4, MOV); VP9 (.MKV) + + # if True: # container in ("mp4", "mov", "m4v", "mkv"): + # util.LOG("MDE: {0} container looks OK, checking streams".format(container)) + + # isHEVC = videoCodec == "hevc" and item.settings.getPreference("allow_hevc", False) + # isVP9 = videoCodec == "vp9" and container == "mkv" and item.settings.getGlobal("vp9Support") + + # if videoCodec != "h264" and videoCodec != "mpeg4" and not isHEVC and not isVP9: + # util.LOG("MDE: Unsupported video codec: {0}".format(videoCodec)) + # return False + + # # TODO(schuyler): Fix ref frames check. It's more nuanced than this. + # if choice.videoStream.refFrames.asInt() > 8: + # util.LOG("MDE: Too many ref frames: {0}".format(choice.videoStream.refFrames)) + # return False + + # # HEVC supports a bitDepth of 10, otherwise 8 is the limit + # if choice.videoStream.bitDepth.asInt() > (isHEVC and 10 or 8): + # util.LOG("MDE: Bit depth too high: {0}".format(choice.videoStream.bitDepth)) + # return False + + # # We shouldn't have to whitelist particular audio codecs, we can just + # # check to see if the Roku can decode this codec with the number of channels. + # if not item.settings.supportsAudioStream(audioCodec, numChannels): + # util.LOG("MDE: Unsupported audio track: {0} ({1} channels)".format(audioCodec, numChannels)) + # return False + + # # # TODO(schuyler): We've reported this to Roku, they may fix it. If/when + # # # they do, we should move this behind a firmware version check. + # # if container == "mkv" and choice.videoStream.headerStripping.asBool() and audioCodec == "ac3": + # # util.ERROR_LOG("MDE: Header stripping with AC3 audio") + # # return False + + # # Those were our problems, everything else should be OK. + # return True + # else: + # util.LOG("MDE: Unsupported container: {0}".format(container)) + + # return False + + def evaluateSubtitles(self, stream): + if util.INTERFACE.getPreference("burn_subtitles") == "always": + # If the user prefers them burned, always burn + return mediachoice.MediaChoice.SUBTITLES_BURN + # elif stream.codec != "srt": + # # We only support soft subtitles for SRT. Anything else has to use the + # # transcoder, and we defer to it on whether the subs will have to be + # # burned or can be converted to SRT and muxed. + + # return mediachoice.MediaChoice.SUBTITLES_DEFAULT + elif stream.key is None: + # Embedded subs don't have keys and can only be direct played + result = mediachoice.MediaChoice.SUBTITLES_SOFT_DP + else: + # Sidecar subs can be direct played or used alongside a transcode + result = mediachoice.MediaChoice.SUBTITLES_SOFT_ANY + + # # TODO(schuyler) If Roku adds support for non-Latin characters, remove + # # this hackery. To the extent that we continue using this hackery, it + # # seems that the Roku requires UTF-8 subtitles but only supports characters + # # from Windows-1252. This should be the full set of languages that are + # # completely representable in Windows-1252. PMS should specifically be + # # returning ISO 639-2/B language codes. + # # Update: Roku has added support for additional characters, but still only + # # Latin characters. We can now basically support anything from the various + # # ISO-8859 character sets, but nothing non-Latin. + + # if not self.softSubLanguages: + # self.softSubLanguages = frozenset(( + # 'afr', + # 'alb', + # 'baq', + # 'bre', + # 'cat', + # 'cze', + # 'dan', + # 'dut', + # 'eng', + # 'epo', + # 'est', + # 'fao', + # 'fin', + # 'fre', + # 'ger', + # 'gla', + # 'gle', + # 'glg', + # 'hrv', + # 'hun', + # 'ice', + # 'ita', + # 'lat', + # 'lav', + # 'lit', + # 'ltz', + # 'may', + # 'mlt', + # 'nno', + # 'nob', + # 'nor', + # 'oci', + # 'pol', + # 'por', + # 'roh', + # 'rum', + # 'slo', + # 'slv', + # 'spa', + # 'srd', + # 'swa', + # 'swe', + # 'tur', + # 'vie', + # 'wel', + # 'wln' + # )) + + # if not (stream.languageCode or 'eng') in self.softSubLanguages: + # # If the language is unsupported,: we need to force burning + # result = mediachoice.MediaChoice.SUBTITLES_BURN + + return result + + def evaluateMediaMusic(self, item, media): + # Resolve indirects before doing anything else. + if media.isIndirect(): + util.LOG("Resolve indirect media for {0}".format(item)) + media = media.resolveIndirect() + + choice = mediachoice.MediaChoice(media) + if media is None: + return choice + + # Verify the server supports audio transcoding, otherwise force direct play + if not item.getServer().supportsAudioTranscoding: + util.LOG("MDE: force direct play because the server does not support audio transcoding") + choice.isDirectPlayable = True + return choice + + # See if this part has a server decision to transcode and obey it + if choice.part and choice.part.get( + "decision", serverdecision.ServerDecision.DECISION_DIRECT_PLAY + ) != serverdecision.ServerDecision.DECISION_DIRECT_PLAY: + util.WARN_LOG("MDE: Server has decided this cannot direct play") + return choice + + # Verify the codec and container are compatible + codec = media.audioCodec + container = media.get('container') + canPlayCodec = item.settings.supportsAudioStream(codec, media.audioChannels.asInt()) + canPlayContainer = (codec == container) or True # (container in ("mp4", "mka", "mkv")) + + choice.isDirectPlayable = (canPlayCodec and canPlayContainer) + if choice.isDirectPlayable: + # Inspect the audio stream attributes if the codec/container can direct + # play. For now we only need to verify the sample rate. + + if choice.audioStream is not None and choice.audioStream.samplingRate.asInt() >= 192000: + util.LOG("MDE: sampling rate is not compatible") + choice.isDirectPlayable = False + else: + util.LOG("MDE: container or codec is incompatible") + + return choice + + # Simple Quick sort function modeled after roku sdk function + def sort(self, choices, key=None): + if not isinstance(choices, list): + return + + if key is None: + choices.sort() + elif isinstance(key, six.string_types): + choices.sort(key=lambda x: getattr(x.media, key)) + elif hasattr(key, '__call__'): + choices.sort(key=key) + + def higherResIfCapable(self, choice): + if choice.media is not None: + server = choice.media.getServer() + if server.supportsVideoTranscoding and not server.supportsVideoRemuxOnly and (choice.sorts.directPlay == 1 or choice.sorts.videoDS == 1): + return util.validInt(choice.sorts.resolution) + + return 0 + + def cloudIfRemote(self, choice): + if choice.media is not None and choice.media.getServer().isLocalConnection() and choice.media.proxyType != self.proxyTypes.CLOUD: + return 1 + + return 0 + + def isSupported4k(self, media, videoStream): + if videoStream is None or not util.INTERFACE.getPreference("allow_4k", True): + return False + + # # Roku 4 only: H.265/HEVC (MKV, MP4, MOV); VP9 (.MKV) + # if media.get('container') in ("mp4", "mov", "m4v", "mkv"): + # isHEVC = (videoStream.codec == "hevc" and util.INTERFACE.getPreference("allow_hevc")) + # isVP9 = (videoStream.codec == "vp9" and media.get('container') == "mkv" and util.INTERFACE.getGlobal("vp9Support")) + # return (isHEVC or isVP9) + + # return False + + return True diff --git a/script.plexmod/lib/_included_packages/plexnet/myplex.py b/script.plexmod/lib/_included_packages/plexnet/myplex.py new file mode 100644 index 000000000..94b88e962 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/myplex.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from . import util +from . import http +from threading import Thread +from xml.etree import ElementTree +import time + +from . import exceptions + +from . import video +from . import audio +from . import photo +from . import plexobjects + +video, audio, photo # Hides warning message + + +class PinLogin(object): + INIT = 'https://plex.tv/pins.xml' + POLL = 'https://plex.tv/pins/{0}.xml' + POLL_INTERVAL = 1 + + def __init__(self, callback=None): + self._callback = callback + self.id = None + self.pin = None + self.authenticationToken = None + self._finished = False + self._abort = False + self._expired = False + self._init() + + def _init(self): + response = http.POST(self.INIT) + if response.status_code != http.codes.created: + codename = http.status_codes.get(response.status_code)[0] + raise exceptions.BadRequest('({0}) {1}'.format(response.status_code, codename)) + data = ElementTree.fromstring(response.text.encode('utf-8')) + self.pin = data.find('code').text + self.id = data.find('id').text + + def _poll(self): + try: + start = time.time() + while not self._abort and time.time() - start < 300: + try: + response = http.GET(self.POLL.format(self.id)) + except Exception as e: + util.ERROR('PinLogin connection error: {0}'.format(e.__class__), err=e) + time.sleep(self.POLL_INTERVAL) + continue + + if response.status_code != http.codes.ok: + self._expired = True + break + try: + data = ElementTree.fromstring(response.text.encode('utf-8')) + except Exception as e: + util.ERROR('PinLogin data error: {0}'.format(e.__class__), err=e) + time.sleep(self.POLL_INTERVAL) + continue + + token = data.find('auth_token').text + if token: + self.authenticationToken = token + break + time.sleep(self.POLL_INTERVAL) + + if self._callback: + self._callback(self.authenticationToken) + finally: + self._finished = True + + def finished(self): + return self._finished + + def expired(self): + return self._expired + + def startTokenPolling(self): + t = Thread(target=self._poll, name='PIN-LOGIN:Token-Poll') + t.start() + return t + + def waitForToken(self): + t = self.startTokenPolling() + t.join() + return self.authenticationToken + + def abort(self): + self._abort = True diff --git a/script.plexmod/lib/_included_packages/plexnet/myplexaccount.py b/script.plexmod/lib/_included_packages/plexnet/myplexaccount.py new file mode 100644 index 000000000..6eb1d65bb --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/myplexaccount.py @@ -0,0 +1,323 @@ +from __future__ import absolute_import +import json +import time +import hashlib +from xml.etree import ElementTree + +from . import plexapp +from . import myplexrequest +from . import locks +from . import callback +from . import asyncadapter + +from . import util + +ACCOUNT = None + + +class HomeUser(util.AttributeDict): + pass + + +class MyPlexAccount(object): + def __init__(self): + # Strings + self.ID = None + self.title = None + self.username = None + self.thumb = None + self.email = None + self.authToken = None + self.pin = None + self.thumb = None + + # Booleans + self.isAuthenticated = util.INTERFACE.getPreference('auto_signin', False) + self.isSignedIn = False + self.isOffline = False + self.isExpired = False + self.isPlexPass = False + self.isManaged = False + self.isSecure = False + self.hasQueue = False + + self.isAdmin = False + self.switchUser = False + + self.adminHasPlexPass = False + + self.lastHomeUserUpdate = None + self.homeUsers = [] + + def init(self): + self.loadState() + + def saveState(self): + obj = { + 'ID': self.ID, + 'title': self.title, + 'username': self.username, + 'email': self.email, + 'authToken': self.authToken, + 'pin': self.pin, + 'isPlexPass': self.isPlexPass, + 'isManaged': self.isManaged, + 'isAdmin': self.isAdmin, + 'isSecure': self.isSecure, + 'adminHasPlexPass': self.adminHasPlexPass, + 'thumb': self.thumb + } + + util.INTERFACE.setRegistry("MyPlexAccount", json.dumps(obj), "myplex") + + def loadState(self): + # Look for the new JSON serialization. If it's not there, look for the + # old token and Plex Pass values. + + util.APP.addInitializer("myplex") + + jstring = util.INTERFACE.getRegistry("MyPlexAccount", None, "myplex") + + if jstring: + try: + obj = json.loads(jstring) + except: + util.ERROR() + obj = None + + if obj: + self.ID = obj.get('ID') or self.ID + self.title = obj.get('title') or self.title + self.username = obj.get('username') or self.username + self.email = obj.get('email') or self.email + self.authToken = obj.get('authToken') or self.authToken + self.pin = obj.get('pin') or self.pin + self.isPlexPass = obj.get('isPlexPass') or self.isPlexPass + self.isManaged = obj.get('isManaged') or self.isManaged + self.isAdmin = obj.get('isAdmin') or self.isAdmin + self.isSecure = obj.get('isSecure') or self.isSecure + self.isProtected = bool(obj.get('pin')) + self.adminHasPlexPass = obj.get('adminHasPlexPass') or self.adminHasPlexPass + self.thumb = obj.get('thumb') + + def verifyAccount(self): + if self.authToken: + request = myplexrequest.MyPlexRequest("/users/account") + context = request.createRequestContext("account", callback.Callable(self.onAccountResponse), + timeout=util.LONG_TIMEOUT) + util.APP.startRequest(request, context) + else: + util.APP.clearInitializer("myplex") + + def logState(self): + util.LOG("Authenticated as {0}:{1}".format(self.ID, repr(self.title))) + util.LOG("SignedIn: {0}".format(self.isSignedIn)) + util.LOG("Offline: {0}".format(self.isOffline)) + util.LOG("Authenticated: {0}".format(self.isAuthenticated)) + util.LOG("PlexPass: {0}".format(self.isPlexPass)) + util.LOG("Managed: {0}".format(self.isManaged)) + util.LOG("Protected: {0}".format(self.isProtected)) + util.LOG("Admin: {0}".format(self.isAdmin)) + util.LOG("AdminPlexPass: {0}".format(self.adminHasPlexPass)) + + def onAccountResponse(self, request, response, context): + oldId = self.ID + + if response.isSuccess(): + data = response.getBodyXml() + + # The user is signed in + self.isSignedIn = True + self.isOffline = False + self.ID = data.attrib.get('id') + self.title = data.attrib.get('title') + self.username = data.attrib.get('username') + self.email = data.attrib.get('email') + self.thumb = data.attrib.get('thumb') + self.authToken = data.attrib.get('authenticationToken') + self.isPlexPass = (data.find('subscription') is not None and data.find('subscription').attrib.get('active') == '1') + self.isManaged = data.attrib.get('restricted') == '1' + self.isSecure = data.attrib.get('secure') == '1' + self.hasQueue = bool(data.attrib.get('queueEmail')) + + # PIN + if data.attrib.get('pin'): + self.pin = data.attrib.get('pin') + else: + self.pin = None + self.isProtected = bool(self.pin) + + # update the list of users in the home + self.updateHomeUsers() + + # set admin attribute for the user + self.isAdmin = False + if self.homeUsers: + for user in self.homeUsers: + if self.ID == user.id: + self.isAdmin = str(user.admin) == "1" + break + + if self.isAdmin and self.isPlexPass: + self.adminHasPlexPass = True + + # consider a single, unprotected user authenticated + if not self.isAuthenticated and not self.isProtected and len(self.homeUsers) <= 1: + self.isAuthenticated = True + + self.logState() + + self.saveState() + util.MANAGER.publish() + + if oldId != self.ID or self.switchUser: + util.DEBUG_LOG("User changed, deferring refresh resources (force=False)") + else: + util.DEBUG_LOG("User selected, refreshing resources (force=False)") + plexapp.refreshResources() + + elif response.getStatus() >= 400 and response.getStatus() < 500: + # The user is specifically unauthorized, clear everything + util.WARN_LOG("Sign Out: User is unauthorized") + self.signOut(True) + else: + # Unexpected error, keep using whatever we read from the registry + util.WARN_LOG("Unexpected response from plex.tv ({0}), switching to OFFLINE mode".format(response.getStatus())) + self.logState() + self.isOffline = True + # consider a single, unprotected user authenticated + if not self.isAuthenticated and not self.isProtected: + self.isAuthenticated = True + + util.APP.clearInitializer("myplex") + # Logger().UpdateSyslogHeader() # TODO: ------------------------------------------------------------------------------------------------------IMPLEMENT + + if oldId != self.ID or self.switchUser: + self.switchUser = None + util.APP.trigger("change:user", account=self, reallyChanged=oldId != self.ID) + + util.APP.trigger("account:response") + + def signOut(self, expired=False): + # Strings + self.ID = None + self.title = None + self.username = None + self.email = None + self.authToken = None + self.pin = None + self.lastHomeUserUpdate = None + + # Booleans + self.isSignedIn = False + self.isPlexPass = False + self.adminHasPlexPass = False + self.isManaged = False + self.isSecure = False + self.isExpired = expired + + # Clear the saved resources + util.INTERFACE.clearRegistry("mpaResources", "xml_cache") + + # Remove all saved servers + plexapp.SERVERMANAGER.clearServers() + + # Enable the welcome screen again + util.INTERFACE.setPreference("show_welcome", True) + + util.APP.trigger("change:user", account=self, reallyChanged=True) + + self.saveState() + + def hasPlexPass(self): + return self.isPlexPass or self.adminHasPlexPass + + def validateToken(self, token, switchUser=False): + self.authToken = token + self.switchUser = switchUser + + request = myplexrequest.MyPlexRequest("/users/sign_in.xml") + context = request.createRequestContext("sign_in", callback.Callable(self.onAccountResponse), + timeout=util.LONG_TIMEOUT) + if self.isOffline: + context.timeout = self.isOffline and asyncadapter.AsyncTimeout(1).setConnectTimeout(1) + util.APP.startRequest(request, context, {}) + + def refreshAccount(self): + if not self.authToken: + return + self.validateToken(self.authToken, False) + + def updateHomeUsers(self): + # Ignore request and clear any home users we are not signed in + if not self.isSignedIn: + self.homeUsers = [] + if self.isOffline: + self.homeUsers.append(MyPlexAccount()) + + self.lastHomeUserUpdate = None + return + + # Cache home users for 60 seconds, mainly to stop back to back tests + epoch = time.time() + if not self.lastHomeUserUpdate: + self.lastHomeUserUpdate = epoch + elif self.lastHomeUserUpdate + 60 > epoch: + util.DEBUG_LOG("Skipping home user update (updated {0} seconds ago)".format(epoch - self.lastHomeUserUpdate)) + return + + req = myplexrequest.MyPlexRequest("/api/home/users") + xml = req.getToStringWithTimeout(seconds=util.LONG_TIMEOUT) + data = ElementTree.fromstring(xml) + if data.attrib.get('size') and data.find('User') is not None: + self.homeUsers = [] + for user in data.findall('User'): + homeUser = HomeUser(user.attrib) + homeUser.isAdmin = homeUser.admin == "1" + homeUser.isManaged = homeUser.restricted == "1" + homeUser.isProtected = homeUser.protected == "1" + self.homeUsers.append(homeUser) + + self.lastHomeUserUpdate = epoch + + util.LOG("home users: {0}".format(self.homeUsers)) + + def switchHomeUser(self, userId, pin=''): + if userId == self.ID and self.isAuthenticated: + return True + + # Offline support + if self.isOffline: + hashed = 'NONE' + if pin and self.authToken: + hashed = hashlib.sha256(pin + self.authToken).digest() + + if not self.isProtected or self.isAuthenticated or hashed == (self.pin or ""): + util.DEBUG_LOG("OFFLINE access granted") + self.isAuthenticated = True + self.validateToken(self.authToken, True) + return True + else: + # build path and post to myplex to swith the user + path = '/api/home/users/{0}/switch'.format(userId) + req = myplexrequest.MyPlexRequest(path) + xml = req.postToStringWithTimeout({'pin': pin}, seconds=util.LONG_TIMEOUT) + try: + data = ElementTree.fromstring(xml) + except: + return False + + if data.attrib.get('authenticationToken'): + self.isAuthenticated = True + # validate the token (trigger change:user) on user change or channel startup + if userId != self.ID or not locks.LOCKS.isLocked("idleLock"): + self.validateToken(data.attrib.get('authenticationToken'), True) + return True + + return False + + def isActive(self): + return self.isSignedIn or self.isOffline + + +ACCOUNT = MyPlexAccount() diff --git a/script.plexmod/lib/_included_packages/plexnet/myplexmanager.py b/script.plexmod/lib/_included_packages/plexnet/myplexmanager.py new file mode 100644 index 000000000..72c2ebb9c --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/myplexmanager.py @@ -0,0 +1,79 @@ +from __future__ import absolute_import +from xml.etree import ElementTree +import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error + +from . import plexapp +from . import plexconnection +from . import plexserver +from . import myplexrequest +from . import callback +from . import util + + +class MyPlexManager(object): + def publish(self): + util.LOG('MyPlexManager().publish() - NOT IMPLEMENTED') + return # TODO: ----------------------------------------------------------------------------------------------------------------------------- IMPLEMENT? + request = myplexrequest.MyPlexRequest("/devices/" + util.INTERFACE.getGlobal("clientIdentifier")) + context = request.createRequestContext("publish") + + addrs = util.INTERFACE.getGlobal("roDeviceInfo").getIPAddrs() + + for iface in addrs: + request.addParam(six.moves.urllib.parse.quote("Connection[][uri]"), "http://{0):8324".format(addrs[iface])) + + util.APP.startRequest(request, context, "_method=PUT") + + def refreshResources(self, force=False): + util.LOG('MyPlexManager().refreshResources() - Force: {}'.format(force)) + if force: + plexapp.SERVERMANAGER.resetLastTest() + + request = myplexrequest.MyPlexRequest("/pms/resources") + context = request.createRequestContext("resources", callback.Callable(self.onResourcesResponse), + timeout=util.LONG_TIMEOUT) + + if plexapp.ACCOUNT.isSecure: + request.addParam("includeHttps", "1") + + util.APP.startRequest(request, context) + + def onResourcesResponse(self, request, response, context): + servers = [] + + response.parseResponse() + + # Save the last successful response to cache + if response.isSuccess() and response.event: + util.INTERFACE.setRegistry("mpaResources", response.event.text.encode('utf-8'), "xml_cache") + util.DEBUG_LOG("Saved resources response to registry") + # Load the last successful response from cache + elif util.INTERFACE.getRegistry("mpaResources", None, "xml_cache"): + data = ElementTree.fromstring(util.INTERFACE.getRegistry("mpaResources", None, "xml_cache")) + response.parseFakeXMLResponse(data) + util.DEBUG_LOG("Using cached resources") + + if response.container: + for resource in response.container: + util.DEBUG_LOG( + "Parsed resource from plex.tv: type:{0} clientIdentifier:{1} name:{2} product:{3} provides:{4}".format( + resource.type, + resource.clientIdentifier, + resource.name.encode('utf-8'), + resource.product.encode('utf-8'), + resource.provides.encode('utf-8') + ) + ) + + for conn in resource.connections: + util.DEBUG_LOG(' {0}'.format(conn)) + + if 'server' in resource.provides: + server = plexserver.createPlexServerForResource(resource) + util.DEBUG_LOG(' {0}'.format(server)) + servers.append(server) + + plexapp.SERVERMANAGER.updateFromConnectionType(servers, plexconnection.PlexConnection.SOURCE_MYPLEX) + + +MANAGER = MyPlexManager() diff --git a/script.plexmod/lib/_included_packages/plexnet/myplexrequest.py b/script.plexmod/lib/_included_packages/plexnet/myplexrequest.py new file mode 100644 index 000000000..5f560afe9 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/myplexrequest.py @@ -0,0 +1,13 @@ +# We don't particularly need a class definition here (yet?), it's just a +# PlexRequest where the server is fixed. +from __future__ import absolute_import +from . import plexrequest + + +class MyPlexRequest(plexrequest.PlexServerRequest): + def __init__(self, path): + from . import myplexserver + plexrequest.PlexServerRequest.__init__(self, myplexserver.MyPlexServer(), path) + + # Make sure we're always getting XML + self.addHeader("Accept", "application/xml") diff --git a/script.plexmod/lib/_included_packages/plexnet/myplexserver.py b/script.plexmod/lib/_included_packages/plexnet/myplexserver.py new file mode 100644 index 000000000..aad8e3f03 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/myplexserver.py @@ -0,0 +1,36 @@ +from __future__ import absolute_import +from . import plexapp +from . import plexconnection +from . import plexserver +from . import plexresource +from . import plexservermanager + + +class MyPlexServer(plexserver.PlexServer): + TYPE = 'MYPLEXSERVER' + + def __init__(self): + plexserver.PlexServer.__init__(self) + self.uuid = 'myplex' + self.name = 'plex.tv' + conn = plexconnection.PlexConnection(plexresource.ResourceConnection.SOURCE_MYPLEX, "https://plex.tv", False, None) + self.connections.append(conn) + self.activeConnection = conn + + def getToken(self): + return plexapp.ACCOUNT.authToken + + def buildUrl(self, path, includeToken=False): + if "://node.plexapp.com" in path: + # Locate the best fit server that supports channels, otherwise we'll + # continue to use the node urls. Service code between the node and + # PMS differs sometimes, so it's a toss up which one is actually + # more accurate. Either way, we try to offload work from the node. + + server = plexservermanager.MANAGER.getChannelServer() + if server: + url = server.swizzleUrl(path, includeToken) + if url: + return url + + return plexserver.PlexServer.buildUrl(self, path, includeToken) diff --git a/script.plexmod/lib/_included_packages/plexnet/netif/__init__.py b/script.plexmod/lib/_included_packages/plexnet/netif/__init__.py new file mode 100644 index 000000000..03c29ea03 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/netif/__init__.py @@ -0,0 +1,217 @@ +from __future__ import absolute_import +import socket +import struct +import os +from six.moves import range + + +class Interface: + def __init__(self): + self.name = '' + self.ip = '' + self.mask = '' + + @property + def broadcast(self): + if self.name == 'FALLBACK': return '' + if not self.ip or not self.mask: return None + return calcBroadcast(self.ip,self.mask) + + +def getInterfaces(): + if os.name == "nt": + try: + ret = _getInterfacesWin() + if ret: + return ret + except: + raise + + try: + return _getInterfacesWinPS() + except: + pass + + try: + return _getInterfaces() + except: + pass + + try: + return _getInterfacesBSD() + except: + pass + + i = Interface() + i.name = 'FALLBACK' + return [i] + + +def _getInterfaces(): + vals = all_interfaces() + interfaces = [] + for name,ip in vals: + i = Interface() + i.name = name.decode() + i.ip = ip + try: + mask = getSubnetMask(i.name) + i.mask = mask + except: + i.mask = '' + interfaces.append(i) + return interfaces + + +def _getInterfacesBSD(): + #name flags family address netmask + interfaces = [] + from . import getifaddrs + for info in getifaddrs.getifaddrs(): + if info.family == 2: + i = Interface() + i.name = info.name + i.ip = info.address + i.mask = info.netmask + interfaces.append(i) + return interfaces + + +def _getInterfacesWin(): + from . import ipconfig + interfaces = [] + adapters = ipconfig.parse() + for a in adapters: + if not 'IPv4 Address' in a: continue + if not 'Subnet Mask' in a: continue + i = Interface() + i.name = a.get('name','UNKNOWN') + i.ip = a['IPv4 Address'] + i.mask = a['Subnet Mask'] + interfaces.append(i) + return interfaces + + +def _getInterfacesWinPS(): + from . import winpsif + interfaces = [] + + for (name, ip, subnet) in winpsif.getInterfaces(): + i = Interface() + i.name = name + i.ip = ip + i.mask = subnet + interfaces.append(i) + + return interfaces + + +def all_interfaces(): + import sys + import array + import fcntl + + is_64bits = sys.maxsize > 2**32 + struct_size = 40 if is_64bits else 32 + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + max_possible = 8 # initial value + while True: + bytes = max_possible * struct_size + names = array.array('B', b'\0' * bytes) + outbytes = struct.unpack('iL', fcntl.ioctl( + s.fileno(), + 0x8912, # SIOCGIFCONF + struct.pack('iL', bytes, names.buffer_info()[0]) + ))[0] + if outbytes == bytes: + max_possible *= 2 + else: + break + namestr = names.tobytes() + return [(namestr[i:i+16].split(b'\0', 1)[0], + socket.inet_ntoa(namestr[i+20:i+24])) + for i in range(0, outbytes, struct_size)] + +def getSubnetMask(name): + import fcntl + return socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', name))[20:24]) + +def calcIPValue(ipaddr): + """ + Calculates the binary + value of the ip addresse + """ + ipaddr = ipaddr.split('.') + value = 0 + for i in range(len(ipaddr)): + value = value | (int(ipaddr[i]) << ( 8*(3-i) )) + return value + +def calcIPNotation(value): + """ + Calculates the notation + of the ip addresse given its value + """ + notat = [] + for i in range(4): + shift = 255 << ( 8*(3-i) ) + part = value & shift + part = part >> ( 8*(3-i) ) + notat.append(str(part)) + notat = '.'.join(notat) + return notat + +def calcSubnet(cidr): + """ + Calculates the Subnet + based on the CIDR + """ + subn = 4294967295 << (32-cidr) # 4294967295 = all bits set to 1 + subn = subn % 4294967296 # round it back to be 4 bytes + subn = calcIPNotation(subn) + return subn + +def calcCIDR(subnet): + """ + Calculates the CIDR + based on the SUbnet + """ + cidr = 0 + subnet = calcIPValue(subnet) + while subnet != 0: + subnet = subnet << 1 + subnet = subnet % 4294967296 + cidr += 1 + return cidr + +def calcNetpart(ipaddr,subnet): + ipaddr = calcIPValue(ipaddr) + subnet = calcIPValue(subnet) + netpart = ipaddr & subnet + netpart = calcIPNotation(netpart) + return netpart + +def calcMacpart(subnet): + macpart = ~calcIPValue(subnet) + macpart = calcIPNotation(macpart) + return macpart + +def calcBroadcast(ipaddr,subnet): + netpart = calcNetpart(ipaddr,subnet) + macpart = calcMacpart(subnet) + netpart = calcIPValue(netpart) + macpart = calcIPValue(macpart) + broadcast = netpart | macpart + broadcast = calcIPNotation(broadcast) + return broadcast + +def calcDefaultGate(ipaddr,subnet): + defaultgw = calcNetpart(ipaddr,subnet) + defaultgw = calcIPValue(defaultgw) + 1 + defaultgw = calcIPNotation(defaultgw) + return defaultgw + +def calcHostNum(subnet): + macpart = calcMacpart(subnet) + hostnum = calcIPValue(macpart) - 1 + return hostnum \ No newline at end of file diff --git a/script.plexmod/lib/_included_packages/plexnet/netif/getifaddrs.py b/script.plexmod/lib/_included_packages/plexnet/netif/getifaddrs.py new file mode 100644 index 000000000..16f227bd9 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/netif/getifaddrs.py @@ -0,0 +1,192 @@ +""" +Wrapper for getifaddrs(3). +""" + +from __future__ import absolute_import +from __future__ import print_function +import socket +import sys + +from collections import namedtuple +from ctypes import * +from six.moves import map + +class sockaddr_in(Structure): + _fields_ = [ + ('sin_len', c_uint8), + ('sin_family', c_uint8), + ('sin_port', c_uint16), + ('sin_addr', c_uint8 * 4), + ('sin_zero', c_uint8 * 8) + ] + + def __str__(self): + try: + assert self.sin_len >= sizeof(sockaddr_in) + data = ''.join(map(chr, self.sin_addr)) + return socket.inet_ntop(socket.AF_INET, data) + except: + return '' + +class sockaddr_in6(Structure): + _fields_ = [ + ('sin6_len', c_uint8), + ('sin6_family', c_uint8), + ('sin6_port', c_uint16), + ('sin6_flowinfo', c_uint32), + ('sin6_addr', c_uint8 * 16), + ('sin6_scope_id', c_uint32) + ] + + def __str__(self): + try: + assert self.sin6_len >= sizeof(sockaddr_in6) + data = ''.join(map(chr, self.sin6_addr)) + return socket.inet_ntop(socket.AF_INET6, data) + except: + return '' + +class sockaddr_dl(Structure): + _fields_ = [ + ('sdl_len', c_uint8), + ('sdl_family', c_uint8), + ('sdl_index', c_short), + ('sdl_type', c_uint8), + ('sdl_nlen', c_uint8), + ('sdl_alen', c_uint8), + ('sdl_slen', c_uint8), + ('sdl_data', c_uint8 * 12) + ] + + def __str__(self): + assert self.sdl_len >= sizeof(sockaddr_dl) + addrdata = self.sdl_data[self.sdl_nlen:self.sdl_nlen+self.sdl_alen] + return ':'.join('%02x' % x for x in addrdata) + +class sockaddr_storage(Structure): + _fields_ = [ + ('sa_len', c_uint8), + ('sa_family', c_uint8), + ('sa_data', c_uint8 * 254) + ] + +class sockaddr(Union): + _anonymous_ = ('sa_storage', ) + _fields_ = [ + ('sa_storage', sockaddr_storage), + ('sa_sin', sockaddr_in), + ('sa_sin6', sockaddr_in6), + ('sa_sdl', sockaddr_dl), + ] + + def family(self): + return self.sa_storage.sa_family + + def __str__(self): + family = self.family() + if family == socket.AF_INET: + return str(self.sa_sin) + elif family == socket.AF_INET6: + return str(self.sa_sin6) + elif family == 18: # AF_LINK + return str(self.sa_sdl) + else: + print(family) + raise NotImplementedError("address family %d not supported" % family) + + +class ifaddrs(Structure): + pass + +ifaddrs._fields_ = [ + ('ifa_next', POINTER(ifaddrs)), + ('ifa_name', c_char_p), + ('ifa_flags', c_uint), + ('ifa_addr', POINTER(sockaddr)), + ('ifa_netmask', POINTER(sockaddr)), + ('ifa_dstaddr', POINTER(sockaddr)), + ('ifa_data', c_void_p) +] + +# Define constants for the most useful interface flags (from if.h). +IFF_UP = 0x0001 +IFF_BROADCAST = 0x0002 +IFF_LOOPBACK = 0x0008 +IFF_POINTTOPOINT = 0x0010 +IFF_RUNNING = 0x0040 +if sys.platform == 'darwin' or 'bsd' in sys.platform: + IFF_MULTICAST = 0x8000 +elif sys.platform == 'linux': + IFF_MULTICAST = 0x1000 + +# Load library implementing getifaddrs and freeifaddrs. +if sys.platform == 'darwin': + libc = cdll.LoadLibrary('libc.dylib') +else: + libc = cdll.LoadLibrary('libc.so') + +# Tell ctypes the argument and return types for the getifaddrs and +# freeifaddrs functions so it can do marshalling for us. +libc.getifaddrs.argtypes = [POINTER(POINTER(ifaddrs))] +libc.getifaddrs.restype = c_int +libc.freeifaddrs.argtypes = [POINTER(ifaddrs)] + + +def getifaddrs(): + """ + Get local interface addresses. + + Returns generator of tuples consisting of interface name, interface flags, + address family (e.g. socket.AF_INET, socket.AF_INET6), address, and netmask. + The tuple members can also be accessed via the names 'name', 'flags', + 'family', 'address', and 'netmask', respectively. + """ + # Get address information for each interface. + addrlist = POINTER(ifaddrs)() + if libc.getifaddrs(pointer(addrlist)) < 0: + raise OSError + + X = namedtuple('ifaddrs', 'name flags family address netmask') + + # Iterate through the address information. + ifaddr = addrlist + while ifaddr and ifaddr.contents: + # The following is a hack to workaround a bug in FreeBSD + # (PR kern/152036) and MacOSX wherein the netmask's sockaddr may be + # truncated. Specifically, AF_INET netmasks may have their sin_addr + # member truncated to the minimum number of bytes necessary to + # represent the netmask. For example, a sockaddr_in with the netmask + # 255.255.254.0 may be truncated to 7 bytes (rather than the normal + # 16) such that the sin_addr field only contains 0xff, 0xff, 0xfe. + # All bytes beyond sa_len bytes are assumed to be zero. Here we work + # around this truncation by copying the netmask's sockaddr into a + # zero-filled buffer. + if ifaddr.contents.ifa_netmask: + netmask = sockaddr() + memmove(byref(netmask), ifaddr.contents.ifa_netmask, + ifaddr.contents.ifa_netmask.contents.sa_len) + if netmask.sa_family == socket.AF_INET and netmask.sa_len < sizeof(sockaddr_in): + netmask.sa_len = sizeof(sockaddr_in) + else: + netmask = None + + try: + yield X(ifaddr.contents.ifa_name, + ifaddr.contents.ifa_flags, + ifaddr.contents.ifa_addr.contents.family(), + str(ifaddr.contents.ifa_addr.contents), + str(netmask) if netmask else None) + except NotImplementedError: + # Unsupported address family. + yield X(ifaddr.contents.ifa_name, + ifaddr.contents.ifa_flags, + None, + None, + None) + ifaddr = ifaddr.contents.ifa_next + + # When we are done with the address list, ask libc to free whatever memory + # it allocated for the list. + libc.freeifaddrs(addrlist) + +__all__ = ['getifaddrs'] + [n for n in dir() if n.startswith('IFF_')] \ No newline at end of file diff --git a/script.plexmod/lib/_included_packages/plexnet/netif/ipconfig.py b/script.plexmod/lib/_included_packages/plexnet/netif/ipconfig.py new file mode 100644 index 000000000..24804348c --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/netif/ipconfig.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import print_function +import subprocess +import sys + +def parse(data=None): + kwa = {} + if sys.version_info[0] >= 3: + kwa = {"encoding": "latin-1"} + + data = data or subprocess.check_output('ipconfig /all',startupinfo=getStartupInfo(), **kwa) + dlist = [d.rstrip() for d in data.split('\n')] + mode = None + sections = [] + while dlist: + d = dlist.pop(0) + try: + if not d: + continue + elif not d.startswith(' '): + sections.append({'name':d.strip('.: ')}) + elif d.startswith(' '): + if d.endswith(':'): + k = d.strip(':. ') + mode = 'VALUE:' + k + sections[-1][k] = '' + elif ':' in d: + k,v = d.split(':',1) + k = k.strip(':. ') + mode = 'VALUE:' + k + v = v.replace('(Preferred)','') + sections[-1][k] = v.strip() + elif mode and mode.startswith('VALUE:'): + if not d.startswith(' '): + mode = None + dlist.insert(0,d) + continue + k = mode.split(':',1)[-1] + v = d.replace('(Preferred)','') + sections[-1][k] += ',' + v.strip() + except: + print(d) + raise + + return sections[1:] + +def getStartupInfo(): + if hasattr(subprocess,'STARTUPINFO'): #Windows + startupinfo = subprocess.STARTUPINFO() + try: + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW #Suppress terminal window + except: + startupinfo.dwFlags |= 1 + return startupinfo + + return None \ No newline at end of file diff --git a/script.plexmod/lib/_included_packages/plexnet/netif/winpsif.py b/script.plexmod/lib/_included_packages/plexnet/netif/winpsif.py new file mode 100644 index 000000000..db13eca88 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/netif/winpsif.py @@ -0,0 +1,22 @@ +# coding=utf-8 + +import subprocess +import re +import sys + +PS_RE = re.compile(r'(?mu)^Description\s+: (?P[^\n]+)\nIPAddress\s+: {(?P[0-9.]+),' + r'.+\nIPSubnet\s+: {(?P[0-9.]+),.+\n') + + +def getInterfaces(): + """ + Use powershell to retrieve interfaces; parse using PS_RE, returning tuples of (name, ipaddress, subnet) + """ + kwa = {} + if sys.version_info[0] >= 3: + kwa = {"encoding": "windows-1252"} + + return PS_RE.findall(subprocess.check_output( + 'powershell "Get-WmiObject -Class Win32_NetworkAdapterConfiguration | ' + 'Select-Object Description, IPAddress, IPSubnet | Format-List"', + shell=True, **kwa)) diff --git a/script.plexmod/lib/_included_packages/plexnet/nowplayingmanager.py b/script.plexmod/lib/_included_packages/plexnet/nowplayingmanager.py new file mode 100644 index 000000000..6d043f24c --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/nowplayingmanager.py @@ -0,0 +1,215 @@ +# Most of this is ported from Roku code and much of it is currently unused +# TODO: Perhaps remove unnecessary code +from __future__ import absolute_import +import time + +from . import util +from six import moves +import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error +import six.moves.urllib.parse +from . import plexrequest +from . import callback +from . import http + + +class ServerTimeline(util.AttributeDict): + def reset(self): + self.expires = time.time() + 15 + + def isExpired(self): + return time.time() > self.get('expires', 0) + + +class TimelineData(util.AttributeDict): + def __init__(self, timelineType, *args, **kwargs): + util.AttributeDict.__init__(self, *args, **kwargs) + self.type = timelineType + self.state = "stopped" + self.item = None + self.choice = None + self.playQueue = None + + self.controllable = util.AttributeDict() + self.controllableStr = None + + self.attrs = util.AttributeDict() + + # Set default controllable for all content. Other controllable aspects + # will be set based on the players content. + # + self.setControllable("playPause", True) + self.setControllable("stop", True) + + def setControllable(self, name, isControllable): + if isControllable: + self.controllable[name] = "" + else: + if name in self.controllable: + del self.controllable[name] + + self.controllableStr = None + + def updateControllableStr(self): + if not self.controllableStr: + self.controllableStr = "" + prependComma = False + + for name in self.controllable: + if prependComma: + self.controllableStr += ',' + else: + prependComma = True + self.controllableStr += name + + def toXmlAttributes(self, elem): + self.updateControllableStr() + elem.attrib["type"] = self.type + elem.attrib["start"] = self.state + elem.attrib["controllable"] = self.controllableStr + + if self.item: + if self.item.duration: + elem.attrib['duration'] = self.item.duration + if self.item.ratingKey: + elem.attrib['ratingKey'] = self.item.ratingKey + if self.item.key: + elem.attrib['key'] = self.item.key + if self.item.container.address: + elem.attrib['containerKey'] = self.item.container.address + + # Send the audio, video and subtitle choice if it's available + if self.choice: + for stream in ("audioStream", "videoStream", "subtitleStream"): + if self.choice.get(stream) and self.choice[stream].id: + elem.attrib[stream + "ID"] = self.choice[stream].id + + server = self.item.getServer() + if server: + elem.attrib["machineIdentifier"] = server.uuid + + if server.activeConnection: + parts = six.moves.urllib.parse.uslparse(server.activeConnection.address) + elem.attrib["protocol"] = parts.scheme + elem.attrib["address"] = parts.netloc.split(':', 1)[0] + if ':' in parts.netloc: + elem.attrib["port"] = parts.netloc.split(':', 1)[-1] + elif parts.scheme == 'https': + elem.attrib["port"] = '443' + else: + elem.attrib["port"] = '80' + + if self.playQueue: + elem.attrib["playQueueID"] = str(self.playQueue.id) + elem.attrib["playQueueItemID"] = str(self.playQueue.selectedId) + elem.attrib["playQueueVersion"] = str(self.playQueue.version) + + for key, val in self.attrs.items(): + elem.attrib[key] = val + + +class NowPlayingManager(object): + def __init__(self): + # Constants + self.NAVIGATION = "navigation" + self.FULLSCREEN_VIDEO = "fullScreenVideo" + self.FULLSCREEN_MUSIC = "fullScreenMusic" + self.FULLSCREEN_PHOTO = "fullScreenPhoto" + self.TIMELINE_TYPES = ["video", "music", "photo"] + + # Members + self.serverTimelines = util.AttributeDict() + self.subscribers = util.AttributeDict() + self.pollReplies = util.AttributeDict() + self.timelines = util.AttributeDict() + self.location = self.NAVIGATION + + self.textFieldName = None + self.textFieldContent = None + self.textFieldSecure = None + + # Initialization + for timelineType in self.TIMELINE_TYPES: + self.timelines[timelineType] = TimelineData(timelineType) + + def updatePlaybackState(self, timelineType, playerObject, state, time, playQueue=None, duration=0): + timeline = self.timelines[timelineType] + timeline.state = state + timeline.item = playerObject.item + timeline.choice = playerObject.choice + timeline.playQueue = playQueue + timeline.attrs["time"] = str(time) + timeline.duration = duration + + # self.sendTimelineToAll() + + self.sendTimelineToServer(timelineType, timeline, time) + + def sendTimelineToServer(self, timelineType, timeline, time): + if not hasattr(timeline.item, 'getServer') or not timeline.item.getServer(): + return + + serverTimeline = self.getServerTimeline(timelineType) + + # Only send timeline if it's the first, item changes, playstate changes or timer pops + itemsEqual = timeline.item and serverTimeline.item and timeline.item.ratingKey == serverTimeline.item.ratingKey + if itemsEqual and timeline.state == serverTimeline.state and not serverTimeline.isExpired(): + return + + serverTimeline.reset() + serverTimeline.item = timeline.item + serverTimeline.state = timeline.state + + # Ignore sending timelines for multi part media with no duration + obj = timeline.choice + if obj and obj.part and obj.part.duration.asInt() == 0 and obj.media.parts and len(obj.media.parts) > 1: + util.WARN_LOG("Timeline not supported: the current part doesn't have a valid duration") + return + + # It's possible with timers and in player seeking for the time to be greater than the + # duration, which causes a 400, so in that case we'll set the time to the duration. + duration = timeline.item.duration.asInt() or timeline.duration + if time > duration: + time = duration + + params = util.AttributeDict() + params["time"] = time + params["duration"] = duration + params["state"] = timeline.state + params["guid"] = timeline.item.guid + params["ratingKey"] = timeline.item.ratingKey + params["url"] = timeline.item.url + params["key"] = timeline.item.key + params["containerKey"] = timeline.item.container.address + if timeline.playQueue: + params["playQueueItemID"] = timeline.playQueue.selectedId + + path = "/:/timeline" + for paramKey in params: + if params[paramKey]: + path = http.addUrlParam(path, paramKey + "=" + six.moves.urllib.parse.quote(str(params[paramKey]))) + + request = plexrequest.PlexRequest(timeline.item.getServer(), path) + + context = request.createRequestContext("timelineUpdate", callback.Callable(self.onTimelineResponse)) + context.playQueue = timeline.playQueue + util.APP.startRequest(request, context) + + def getServerTimeline(self, timelineType): + if not self.serverTimelines.get(timelineType): + serverTL = ServerTimeline() + serverTL.reset() + + self.serverTimelines[timelineType] = serverTL + + return self.serverTimelines[timelineType] + + def nowPlayingSetControllable(self, timelineType, name, isControllable): + self.timelines[timelineType].setControllable(name, isControllable) + + def onTimelineResponse(self, request, response, context): + context.request.server.trigger("np:timelineResponse", response=response) + + if not context.playQueue or not context.playQueue.refreshOnTimeline: + return + context.playQueue.refreshOnTimeline = False + context.playQueue.refresh(False) diff --git a/script.plexmod/lib/_included_packages/plexnet/photo.py b/script.plexmod/lib/_included_packages/plexnet/photo.py new file mode 100644 index 000000000..d3a66ca68 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/photo.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from . import media +from . import plexobjects +from . import plexmedia + + +class Photo(media.MediaItem): + TYPE = 'photo' + + def _setData(self, data): + self.art = plexobjects.PlexValue('') + media.MediaItem._setData(self, data) + + if self.isFullObject(): + self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, + initpath=self.initpath, server=self.server, media=self) + + def analyze(self): + """ The primary purpose of media analysis is to gather information about that media + item. All of the media you add to a Library has properties that are useful to + know–whether it's a video file, a music track, or one of your photos. + """ + self.server.query('/%s/analyze' % self.key) + + def markWatched(self): + path = '/:/scrobble?key=%s&identifier=com.plexapp.plugins.library' % self.ratingKey + self.server.query(path) + self.reload() + + def markUnwatched(self): + path = '/:/unscrobble?key=%s&identifier=com.plexapp.plugins.library' % self.ratingKey + self.server.query(path) + self.reload() + + def play(self, client): + client.playMedia(self) + + def refresh(self): + self.server.query('%s/refresh' % self.key, method=self.server.session.put) + + def isPhotoOrDirectoryItem(self): + return True + + +class PhotoDirectory(media.MediaItem): + TYPE = 'photodirectory' + + def all(self): + path = self.key + return plexobjects.listItems(self.server, path) + + def isPhotoOrDirectoryItem(self): + return True + + +@plexobjects.registerLibFactory('photo') +@plexobjects.registerLibFactory('image') +def PhotoFactory(data, initpath=None, server=None, container=None): + if data.tag == 'Photo': + return Photo(data, initpath=initpath, server=server, container=container) + else: + return PhotoDirectory(data, initpath=initpath, server=server, container=container) diff --git a/script.plexmod/lib/_included_packages/plexnet/playlist.py b/script.plexmod/lib/_included_packages/plexnet/playlist.py new file mode 100644 index 000000000..b06358dd7 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/playlist.py @@ -0,0 +1,183 @@ +from __future__ import absolute_import +import random + +from . import plexobjects +from . import signalsmixin +from six.moves import range + + +class BasePlaylist(plexobjects.PlexObject, signalsmixin.SignalsMixin): + TYPE = 'baseplaylist' + + isRemote = False + + def __init__(self, *args, **kwargs): + plexobjects.PlexObject.__init__(self, *args, **kwargs) + signalsmixin.SignalsMixin.__init__(self) + self._items = [] + self._shuffle = None + self.pos = 0 + self.startShuffled = False + self.isRepeat = False + self.isRepeatOne = False + + def __getitem__(self, idx): + if self._shuffle: + return self._items[self._shuffle[idx]] + else: + return self._items[idx] + + def __iter__(self): + if self._shuffle: + for i in self._shuffle: + yield self._items[i] + else: + for i in self._items: + yield i + + def __len__(self): + return len(self._items) + + def items(self): + if self._shuffle: + return [i for i in self] + else: + return self._items + + def setRepeat(self, repeat, one=False): + if self.isRepeat == repeat and self.isRepeatOne == one: + return + + self.isRepeat = repeat + self.isRepeatOne = one + + def hasNext(self): + if len(self._items) < 2: + return False + if self.isRepeatOne: + return False + if self.isRepeat: + return True + return self.pos < len(self._items) - 1 + + def hasPrev(self): + if len(self._items) < 2: + return False + if self.isRepeatOne: + return False + if self.isRepeat: + return True + return self.pos > 0 + + def next(self): + if not self.hasNext(): + return False + + if self.isRepeatOne: + return True + + self.pos += 1 + if self.pos >= len(self._items): + self.pos = 0 + + return True + + __next__ = next + + def prev(self): + if not self.hasPrev(): + return False + + if self.isRepeatOne: + return True + + self.pos -= 1 + if self.pos < 0: + self.pos = len(self._items) - 1 + + return True + + def getPosFromItem(self, item): + if item not in self._items: + return -1 + return self._items.index(item) + + def setCurrent(self, pos): + if not isinstance(pos, int): + item = pos + pos = self.getPosFromItem(item) + self._items[pos] = item + + if pos < 0 or pos >= len(self._items): + return False + + self.pos = pos + return True + + def current(self): + return self[self.pos] + + def userCurrent(self): + for item in self._items: + if not item.isWatched or item.viewOffset.asInt(): + return item + else: + return self.current() + + def prevItem(self): + if self.pos < 1: + return None + return self[self.pos - 1] + + def shuffle(self, on=True, first=False): + if on and self._items: + self._shuffle = list(range(len(self._items))) + random.shuffle(self._shuffle) + if not first: + self.pos = self._shuffle.index(self.pos) + else: + if self._shuffle: + self.pos = self._shuffle[self.pos] + if not first: + self._shuffle = None + self.trigger('items.changed') + self.refresh() + + def setShuffle(self, shuffle=None): + if shuffle is None: + shuffle = not self.isShuffled + + self.shuffle(shuffle) + + @property + def isShuffled(self): + return bool(self._shuffle) + + def refresh(self, *args, **kwargs): + self.trigger('change') + + +class LocalPlaylist(BasePlaylist): + TYPE = 'localplaylist' + + def __init__(self, items, server, media_item=None): + BasePlaylist.__init__(self, None, server=server) + self._items = items + self._mediaItem = media_item + + def __getattr__(self, name): + if not self._mediaItem: + return BasePlaylist.__getattr__(self, name) + return getattr(self._mediaItem, name) + + def get(self, name, default=''): + if not self._mediaItem: + return BasePlaylist.get(self, name, default) + + return self._mediaItem.get(name, default) + + @property + def defaultArt(self): + if not self._mediaItem: + return super(LocalPlaylist, self).defaultArt + return self._mediaItem.defaultArt diff --git a/script.plexmod/lib/_included_packages/plexnet/playqueue.py b/script.plexmod/lib/_included_packages/plexnet/playqueue.py new file mode 100644 index 000000000..a7adc3b0c --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/playqueue.py @@ -0,0 +1,786 @@ +from __future__ import absolute_import +import re +import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error +import time + +from . import plexapp +from . import plexrequest +from . import callback +from . import plexobjects +from . import util +from . import signalsmixin +from six.moves import range + + +class AudioUsage(object): + def __init__(self, skipsPerHour, playQueueId): + self.HOUR = 3600 + self.skipsPerHour = skipsPerHour + self.playQueueId = playQueueId + self.skips = [] + + def allowSkip(self): + if self.skipsPerHour < 0: + return True + self.updateSkips() + return len(self.skips) < self.skipsPerHour + + def updateSkips(self, reset=False): + if reset or len(self.skips) == 0: + if reset: + self.skips = [] + return + + # Remove old skips if applicable + epoch = util.now() + if self.skips[0] + self.HOUR < epoch: + newSkips = [] + for skip in self.skips: + if skip + self.HOUR > epoch: + newSkips.append(skip) + self.skips = newSkips + self.log("updated skips") + + def registerSkip(self): + self.skips.append(util.now()) + self.updateSkips() + self.log("registered skip") + + def allowSkipMessage(self): + if self.skipsPerHour < 0 or self.allowSkip(): + return None + return "You can skip {0} songs an hour per mix.".format(self.skipsPerHour) + + def log(self, prefix): + util.DEBUG_LOG("AudioUsage {0}: total skips={1}, allowed skips={2}".format(prefix, len(self.skips), self.skipsPerHour)) + + +class UsageFactory(object): + def __init__(self, play_queue): + self.playQueue = play_queue + self.type = play_queue.type + self.usage = play_queue.usage + + @classmethod + def createUsage(cls, playQueue): + obj = cls(playQueue) + + if obj.type: + if obj.type == "audio": + return obj.createAudioUsage() + + util.DEBUG_LOG("Don't know how to usage for " + str(obj.type)) + return None + + def createAudioUsage(self): + skips = self.playQueue.container.stationSkipsPerHour.asInt(-1) + if skips == -1: + return None + + # Create new usage if invalid, or if we start a new PQ, otherwise + # we'll return the existing usage for the PQ. + if not self.usage or self.usage.playQueueId != self.playQueue.id: + self.usage = AudioUsage(skips, self.playQueue.id) + + return self.usage + + +class PlayOptions(util.AttributeDict): + def __init__(self, *args, **kwargs): + util.AttributeDict.__init__(self, *args, **kwargs) + # At the moment, this is really just a glorified struct. But the + # expected fields include key, shuffle, extraPrefixCount, + # and unwatched. We may give this more definition over time. + + # These aren't widely used yet, but half inspired by a PMS discussion... + self.CONTEXT_AUTO = 0 + self.CONTEXT_SELF = 1 + self.CONTEXT_PARENT = 2 + self.CONTEXT_CONTAINER = 3 + + self.context = self.CONTEXT_AUTO + + +def createLocalPlayQueue(item, children, contentType, options): + pass + + +class PlayQueueFactory(object): + def getContentType(self, item): + if item.isMusicOrDirectoryItem(): + return "audio" + elif item.isVideoOrDirectoryItem(): + return "video" + elif item.isPhotoOrDirectoryItem(): + return "photo" + + return None + + def canCreateRemotePlayQueue(self): + if self.item.getServer().isSecondary(): + reason = "Server is secondary" + elif not (self.item.isLibraryItem() or self.item.isGracenoteCollection() or self.item.isLibraryPQ or self.item.isCollection): + reason = "Item is not a library item or gracenote collection" + else: + return True + + util.DEBUG_LOG("Requires local play queue: " + reason) + return False + + def itemRequiresRemotePlayQueue(self): + # TODO(rob): handle entire section? (if we create PQ's of sections) + # return item instanceof PlexSection || item.type == PlexObject.Type.artist; + return self.item.type == "artist" + + +def createPlayQueueForItem(item, children=None, options=None, args=None): + obj = PlayQueueFactory() + + contentType = obj.getContentType(item) + if not contentType: + # TODO(schuyler): We may need to try harder, but I'm not sure yet. For + # example, what if we're shuffling an entire library? + # + # No reason to crash here. We can safely return None and move on. + # We'll stop if we're in dev mode to catch and debug. + # + util.DEBUG_LOG("Don't know how to create play queue for item " + repr(item)) + return None + + obj.item = item + + options = PlayOptions(options or {}) + + if obj.canCreateRemotePlayQueue(): + return createRemotePlayQueue(item, contentType, options, args) + else: + if obj.itemRequiresRemotePlayQueue(): + util.DEBUG_LOG("Can't create remote PQs and item does not support local PQs") + return None + else: + return createLocalPlayQueue(item, children, contentType, options) + + +class PlayQueue(signalsmixin.SignalsMixin): + TYPE = 'playqueue' + + isRemote = True + + def __init__(self, server, contentType, options=None): + signalsmixin.SignalsMixin.__init__(self) + self.id = None + self.selectedId = None + self.version = -1 + self.isShuffled = False + self.isRepeat = False + self.isRepeatOne = False + self.isLocalPlayQueue = False + self.isMixed = None + self.totalSize = 0 + self.windowSize = 0 + self.forcedWindow = False + self.container = None + + # Forced limitations + self.allowShuffle = False + self.allowSeek = True + self.allowRepeat = False + self.allowSkipPrev = False + self.allowSkipNext = False + self.allowAddToQueue = False + + self.refreshOnTimeline = False + + self.server = server + self.type = contentType + self._items = [] + self.options = options or util.AttributeDict() + + self.usage = None + + self.refreshTimer = None + + self.canceled = False + self.responded = False + self.initialized = False + + self.composite = plexobjects.PlexValue('', parent=self) + + # Add a few default options for specific PQ types + if self.type == "audio": + self.options.includeRelated = True + elif self.type == "photo": + self.setRepeat(True) + + def get(self, name): + return getattr(self, name, plexobjects.PlexValue('', parent=self)) + + @property + def defaultArt(self): + return self.current().defaultArt + + def waitForInitialization(self): + start = time.time() + timeout = util.TIMEOUT + util.DEBUG_LOG('Waiting for playQueue to initialize...') + while not self.canceled and not self.initialized: + if not self.responded and time.time() - start > timeout: + util.DEBUG_LOG('PlayQueue timed out wating for initialization') + return self.initialized + time.sleep(0.1) + + if self.initialized: + util.DEBUG_LOG('PlayQueue initialized in {0:.2f} secs: {1}'.format(time.time() - start, self)) + else: + util.DEBUG_LOG('PlayQueue failed to initialize') + + return self.initialized + + def onRefreshTimer(self): + self.refreshTimer = None + self.refresh(True, False) + + def refresh(self, force=True, delay=False, wait=False): + # Ignore refreshing local PQs + if self.isLocal(): + return + + if wait: + self.responded = False + self.initialized = False + # We refresh our play queue if the caller insists or if we only have a + # portion of our play queue loaded. In particular, this means that we don't + # refresh the play queue if we're asked to refresh because a new track is + # being played but we have the entire album loaded already. + + if force or self.isWindowed(): + if delay: + # We occasionally want to refresh the PQ in response to moving to a + # new item and starting playback, but if we refresh immediately: + # we probably end up refreshing before PMS realizes we've moved on. + # There's no great solution, but delaying our refresh by just a few + # seconds makes us much more likely to get an accurate window (and + # accurate selected IDs) from PMS. + + if not self.refreshTimer: + self.refreshTimer = plexapp.createTimer(5000, self.onRefreshTimer) + util.APP.addTimer(self.refreshTimer) + else: + request = plexrequest.PlexRequest(self.server, "/playQueues/" + str(self.id)) + self.addRequestOptions(request) + context = request.createRequestContext("refresh", callback.Callable(self.onResponse)) + util.APP.startRequest(request, context) + + if wait: + return self.waitForInitialization() + + def shuffle(self, shuffle=True): + self.setShuffle(shuffle) + + def setShuffle(self, shuffle=None): + if shuffle is None: + shuffle = not self.isShuffled + + if self.isShuffled == shuffle: + return + + if shuffle: + command = "/shuffle" + else: + command = "/unshuffle" + + # Don't change self.isShuffled, it'll be set in OnResponse if all goes well + + request = plexrequest.PlexRequest(self.server, "/playQueues/" + str(self.id) + command, "PUT") + self.addRequestOptions(request) + context = request.createRequestContext("shuffle", callback.Callable(self.onResponse)) + util.APP.startRequest(request, context) + + def setRepeat(self, repeat, one=False): + if self.isRepeat == repeat and self.isRepeatOne == one: + return + + self.options.repeat = repeat + self.isRepeat = repeat + self.isRepeatOne = one + + def moveItemUp(self, item): + for index in range(1, len(self._items)): + if self._items[index].get("playQueueItemID") == item.get("playQueueItemID"): + if index > 1: + after = self._items[index - 2] + else: + after = None + + self.swapItem(index, -1) + self.moveItem(item, after) + return True + + return False + + def moveItemDown(self, item): + for index in range(len(self._items) - 1): + if self._items[index].get("playQueueItemID") == item.get("playQueueItemID"): + after = self._items[index + 1] + self.swapItem(index) + self.moveItem(item, after) + return True + + return False + + def moveItem(self, item, after): + if after: + query = "?after=" + after.get("playQueueItemID", "-1") + else: + query = "" + + request = plexrequest.PlexRequest(self.server, "/playQueues/" + str(self.id) + "/items/" + item.get("playQueueItemID", "-1") + "/move" + query, "PUT") + self.addRequestOptions(request) + context = request.createRequestContext("move", callback.Callable(self.onResponse)) + util.APP.startRequest(request, context) + + def swapItem(self, index, delta=1): + before = self._items[index] + after = self._items[index + delta] + + self._items[index] = after + self._items[index + delta] = before + + def removeItem(self, item): + request = plexrequest.PlexRequest(self.server, "/playQueues/" + str(self.id) + "/items/" + item.get("playQueueItemID", "-1"), "DELETE") + self.addRequestOptions(request) + context = request.createRequestContext("delete", callback.Callable(self.onResponse)) + util.APP.startRequest(request, context) + + def addItem(self, item, addNext=False, excludeSeedItem=False): + request = plexrequest.PlexRequest(self.server, "/playQueues/" + str(self.id), "PUT") + request.addParam("uri", item.getItemUri()) + request.addParam("next", addNext and "1" or "0") + request.addParam("excludeSeedItem", excludeSeedItem and "1" or "0") + self.addRequestOptions(request) + context = request.createRequestContext("add", callback.Callable(self.onResponse)) + util.APP.startRequest(request, context) + + def onResponse(self, request, response, context): + # Close any loading modal regardless of response status + # Application().closeLoadingModal() + util.DEBUG_LOG('playQueue: Received response') + self.responded = True + if response.parseResponse(): + util.DEBUG_LOG('playQueue: {0} items'.format(len(response.items))) + self.container = response.container + # Handle an empty PQ if we have specified an pqEmptyCallable + if self.options and self.options.pqEmptyCallable: + callable = self.options.pqEmptyCallable + del self.options["pqEmptyCallable"] + if len(response.items) == 0: + callable.call() + return + + self.id = response.container.playQueueID.asInt() + self.isShuffled = response.container.playQueueShuffled.asBool() + self.totalSize = response.container.playQueueTotalCount.asInt() + self.windowSize = len(response.items) + self.version = response.container.playQueueVersion.asInt() + + itemsChanged = False + if len(response.items) == len(self._items): + for i in range(len(self._items)): + if self._items[i] != response.items[i]: + itemsChanged = True + break + else: + itemsChanged = True + + if itemsChanged: + self._items = response.items + + # Process any forced limitations + self.allowSeek = response.container.allowSeek.asBool() + self.allowShuffle = ( + self.totalSize > 1 and response.container.allowShuffle.asBool() and not response.container.playQueueLastAddedItemID + ) + self.allowRepeat = response.container.allowRepeat.asBool() + self.allowSkipPrev = self.totalSize > 1 and response.container.allowSkipPrevious != "0" + self.allowSkipNext = self.totalSize > 1 and response.container.allowSkipNext != "0" + + # Figure out the selected track index and offset. PMS tries to make some + # of this easy, but it might not realize that we've advanced to a new + # track, so we can't blindly trust it. On the other hand, it's possible + # that PMS completely changed the PQ item IDs (e.g. upon shuffling), so + # we might need to use its values. We iterate through the items and try + # to find the item that we believe is selected, only settling for what + # PMS says if we fail. + + playQueueOffset = None + selectedId = None + pmsSelectedId = response.container.playQueueSelectedItemID.asInt() + self.deriveIsMixed() + + # lastItem = None # Not used + for index in range(len(self._items)): + item = self._items[index] + + if not playQueueOffset and item.playQueueItemID.asInt() == pmsSelectedId: + playQueueOffset = response.container.playQueueSelectedItemOffset.asInt() - index + 1 + + # Update the index of everything we've already past, and handle + # wrapping indexes (repeat). + for i in range(index): + pqIndex = playQueueOffset + i + if pqIndex < 1: + pqIndex = pqIndex + self.totalSize + + self._items[i].playQueueIndex = plexobjects.PlexValue(str(pqIndex), parent=self._items[i]) + + if playQueueOffset: + pqIndex = playQueueOffset + index + if pqIndex > self.totalSize: + pqIndex = pqIndex - self.totalSize + + item.playQueueIndex = plexobjects.PlexValue(str(pqIndex), parent=item) + + # If we found the item that we believe is selected: we should + # continue to treat it as selected. + # TODO(schuyler): Should we be checking the metadata ID (rating key) + # instead? I don't think it matters in practice, but it may be + # more correct. + + if not selectedId and item.playQueueItemID.asInt() == self.selectedId: + selectedId = self.selectedId + + if not selectedId: + self.selectedId = pmsSelectedId + + # TODO(schuyler): Set repeat as soon as PMS starts returning it + + # Fix up the container for all our items + response.container.address = "/playQueues/" + str(self.id) + + # Create usage limitations + self.usage = UsageFactory.createUsage(self) + + self.initialized = True + self.trigger("change") + + if itemsChanged: + self.trigger("items.changed") + + def isWindowed(self): + return (not self.isLocal() and (self.totalSize > self.windowSize or self.forcedWindow)) + + def hasNext(self): + if self.isRepeatOne: + return True + + if not self.allowSkipNext and -1 < list(self.items()).index(self.current()) < (len(list(self.items())) - 1): # TODO: Was 'or' - did change cause issues? + return self.isRepeat and not self.isWindowed() + + return True + + def hasPrev(self): + # return self.allowSkipPrev or self.items().index(self.current()) > 0 + return list(self.items()).index(self.current()) > 0 + + def next(self): + if self.isRepeatOne: + return self.current() + + item = self.getNext() + if not item: + return None + + self.selectedId = item.playQueueItemID.asInt() + return item + + __next__ = next + + def prev(self): + if self.isRepeatOne: + return self.current() + + item = self.getPrev() + if not item: + return None + + self.selectedId = item.playQueueItemID.asInt() + return item + + def getPrev(self): + if not self.hasPrev(): + return None + + pos = list(self.items()).index(self.current()) - 1 + return list(self.items())[pos] + + def getNext(self): + if not self.hasNext(): + return None + + pos = list(self.items()).index(self.current()) + 1 + if pos >= len(self.items()): + if not self.isRepeat or self.isWindowed(): + return None + pos = 0 + + return list(self.items())[pos] + + + def setCurrent(self, pos): + if pos < 0 or pos >= len(list(self.items())): + return False + + item = list(self.items())[pos] + self.selectedId = item.playQueueItemID.asInt() + return item + + def setCurrentItem(self, item): + self.selectedId = item.playQueueItemID.asInt() + + def __eq__(self, other): + if not other: + return False + if self.__class__ != other.__class__: + return False + return self.id == other.id and self.type == other.type + + def __ne__(self, other): + return not self.__eq__(other) + + def addRequestOptions(self, request): + boolOpts = ["repeat", "includeRelated"] + for opt in boolOpts: + if self.options.get(opt): + request.addParam(opt, "1") + + intOpts = ["extrasPrefixCount"] + for opt in intOpts: + if self.options.get(opt): + request.addParam(opt, str(self.options.get(opt))) + + includeChapters = self.options.get('includeChapters') is not None and self.options.includeChapters or 1 + request.addParam("includeChapters", str(includeChapters)) + + def __repr__(self): + return ( + str(self.__class__.__name__) + " " + + str(self.type) + " windowSize=" + + str(self.windowSize) + " totalSize=" + + str(self.totalSize) + " selectedId=" + + str(self.selectedId) + " shuffled=" + + str(self.isShuffled) + " repeat=" + + str(self.isRepeat) + " mixed=" + + str(self.isMixed) + " allowShuffle=" + + str(self.allowShuffle) + " version=" + + str(self.version) + " id=" + str(self.id) + ) + + def isLocal(self): + return self.isLocalPlayQueue + + def deriveIsMixed(self): + if self.isMixed is None: + self.isMixed = False + + lastItem = None + for item in self._items: + if not self.isMixed: + if not item.get("parentKey"): + self.isMixed = True + else: + self.isMixed = lastItem and item.get("parentKey") != lastItem.get("parentKey") + + lastItem = item + + def items(self): + return self._items + + def current(self): + for item in self.items(): + if item.playQueueItemID.asInt() == self.selectedId: + return item + + return None + + def prevItem(self): + last = None + for item in self.items(): + if item.playQueueItemID.asInt() == self.selectedId: + return last + last = item + + return None + + +def createRemotePlayQueue(item, contentType, options, args): + util.DEBUG_LOG('Creating remote playQueue request...') + obj = PlayQueue(item.getServer(), contentType, options) + + # The item's URI is made up of the library section UUID, a descriptor of + # the item type (item or directory), and the item's path, URL-encoded. + + uri = "library://" + item.getLibrarySectionUuid() + "/" + itemType = item.isDirectory() and "directory" or "item" + path = None + + if not options.key: + # if item.onDeck and len(item.onDeck) > 0: + # options.key = item.onDeck[0].getAbsolutePath("key") + # el + if not item.isDirectory(): + options.key = item.get("key") + + # If we're asked to play unwatched, ignore the option unless we are unwatched. + options.unwatched = options.unwatched and item.isUnwatched() + + # TODO(schuyler): Until we build postplay, we're not allowed to queue containers for episodes. + if item.type == "episode": + options.context = options.CONTEXT_SELF + elif item.type == "movie": + if not options.extrasPrefixCount and not options.resume: + options.extrasPrefixCount = util.INTERFACE.getPreference("cinema_trailers", 0) + + # How exactly to construct the item URI depends on the metadata type, though + # whenever possible we simply use /library/metadata/:id. + + if item.isLibraryItem() and not item.isLibraryPQ: + path = "/library/metadata/" + item.ratingKey + else: + path = item.getAbsolutePath("key") + + if options.context == options.CONTEXT_SELF: + # If the context is specifically for just this item,: just use the + # item's key and get out. + pass + elif item.type == "playlist": + path = None + uri = item.get("ratingKey") + options.isPlaylist = True + elif item.type == "track": + # TODO(rob): Is there ever a time the container address is wrong? If we + # expect to play a single track,: use options.CONTEXT_SELF. + path = item.container.address or "/library/metadata/" + item.get("parentRatingKey", "") + itemType = "directory" + elif item.isPhotoOrDirectoryItem(): + if item.type == "photoalbum" or item.parentKey: + path = item.getParentPath(item.type == "photoalbum" and "key" or "parentKey") + itemType = "item" + elif item.isDirectory(): + path = item.getAbsolutePath("key") + else: + path = item.container.address + itemType = "directory" + options.key = item.getAbsolutePath("key") + + elif item.type == "episode": + path = "/library/metadata/" + item.get("grandparentRatingKey", "") + itemType = "directory" + options.key = item.getAbsolutePath("key") + # elif item.type == "show": + # path = "/library/metadata/" + item.get("ratingKey", "") + + if path: + if args: + path += util.joinArgs(args) + + util.DEBUG_LOG("playQueue path: " + str(path)) + + if "/search" not in path: + # Convert a few params to the PQ spec + convert = { + 'type': "sourceType", + 'unwatchedLeaves': "unwatched" + } + + for key in convert: + regex = re.compile("(?i)([?&])" + key + "=") + path = regex.sub("\1" + convert[key] + "=", path) + + util.DEBUG_LOG("playQueue path: " + str(path)) + uri = uri + itemType + "/" + six.moves.urllib.parse.quote_plus(path) + + util.DEBUG_LOG("playQueue uri: " + str(uri)) + + # Create the PQ request + request = plexrequest.PlexRequest(obj.server, "/playQueues") + + request.addParam(not options.isPlaylist and "uri" or "playlistID", uri) + request.addParam("type", contentType) + # request.addParam('X-Plex-Client-Identifier', util.INTERFACE.getGlobal('clientIdentifier')) + + # Add options we pass once during PQ creation + if options.shuffle: + request.addParam("shuffle", "1") + options.key = None + else: + request.addParam("shuffle", "0") + + if options.key: + request.addParam("key", options.key) + + # Add options we pass every time querying PQs + obj.addRequestOptions(request) + + util.DEBUG_LOG('Initial playQueue request started...') + context = request.createRequestContext("create", callback.Callable(obj.onResponse)) + util.APP.startRequest(request, context, body='') + + return obj + + +def createPlayQueueForId(id, server=None, contentType=None): + obj = PlayQueue(server, contentType) + obj.id = id + + request = plexrequest.PlexRequest(server, "/playQueues/" + str(id)) + request.addParam("own", "1") + obj.addRequestOptions(request) + context = request.createRequestContext("own", callback.Callable(obj.onResponse)) + util.APP.startRequest(request, context) + + return obj + + +class AudioPlayer(): + pass + + +class VideoPlayer(): + pass + + +class PhotoPlayer(): + pass + + +def addItemToPlayQueue(item, addNext=False): + # See if we have an active play queue for this self.dia type or if we need to + # create one. + + if item.isMusicOrDirectoryItem(): + player = AudioPlayer() + elif item.isVideoOrDirectoryItem(): + player = VideoPlayer() + elif item.isPhotoOrDirectoryItem(): + player = PhotoPlayer() + else: + player = None + + if not player: + util.ERROR_LOG("Don't know how to add item to play queue: " + str(item)) + return None + elif not player.allowAddToQueue(): + util.DEBUG_LOG("Not allowed to add to this player") + return None + + if player.playQueue: + playQueue = player.playQueue + playQueue.addItem(item, addNext) + else: + options = PlayOptions() + options.context = options.CONTEXT_SELF + playQueue = createPlayQueueForItem(item, None, options) + if playQueue: + player.setPlayQueue(playQueue, False) + + return playQueue diff --git a/script.plexmod/lib/_included_packages/plexnet/plexapp.py b/script.plexmod/lib/_included_packages/plexnet/plexapp.py new file mode 100644 index 000000000..cc7d087b1 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexapp.py @@ -0,0 +1,403 @@ +from __future__ import print_function, absolute_import +import threading +import platform +import uuid +import sys + +from . import callback +from . import signalsmixin +from . import simpleobjects +from . import util +import six + +Res = simpleobjects.Res +SERVERMANAGER = None +ACCOUNT = None +MANAGER = None + +PLATFORM = util.X_PLEX_DEVICE + + +def init(): + global MANAGER, SERVERMANAGER, ACCOUNT + from . import myplexaccount + ACCOUNT = myplexaccount.ACCOUNT + ACCOUNT.init() + from . import plexservermanager + SERVERMANAGER = plexservermanager.MANAGER + from . import myplexmanager + util.MANAGER = MANAGER = myplexmanager.MANAGER + ACCOUNT.verifyAccount() + + +class App(signalsmixin.SignalsMixin): + def __init__(self): + signalsmixin.SignalsMixin.__init__(self) + self.pendingRequests = {} + self.initializers = {} + self.timers = [] + from . import nowplayingmanager + self.nowplayingmanager = nowplayingmanager.NowPlayingManager() + + def addTimer(self, timer): + self.timers.append(timer) + + def startRequest(self, request, context, body=None, contentType=None): + context.request = request + + started = request.startAsync(body=body, contentType=contentType, context=context) + + if started: + requestID = context.request.getIdentity() + self.pendingRequests[requestID] = context + elif context.callback: + context.callback(None, context) + + return started + + def onRequestTimeout(self, context): + requestID = context.request.getIdentity() + + if requestID not in self.pendingRequests: + return + + context.request.cancel() + + util.WARN_LOG("Request to {0} timed out after {1} sec".format(util.cleanToken(context.request.url), context.timeout)) + + if context.callback: + context.callback(None, context) + + def delRequest(self, request): + requestID = request.getIdentity() + if requestID not in self.pendingRequests: + return + + del self.pendingRequests[requestID] + + def addInitializer(self, name): + self.initializers[name] = True + + def clearInitializer(self, name): + if name in self.initializers: + del self.initializers[name] + if self.isInitialized(): + self.onInitialized() + + def isInitialized(self): + return not self.initializers + + def onInitialized(self): + # Wire up a few of our own listeners + # PlexServerManager() + # self.on("change:user", callback.Callable(self.onAccountChange)) + + self.trigger('init') + + def cancelAllTimers(self): + for timer in self.timers: + timer.cancel() + + def preShutdown(self): + from . import http + http.HttpRequest._cancel = True + if self.pendingRequests: + util.DEBUG_LOG('Closing down {0} App() requests...'.format(len(self.pendingRequests))) + for k in list(self.pendingRequests.keys()): + p = self.pendingRequests.get(k) + if p: + p.request.cancel() + + if self.timers: + util.DEBUG_LOG('Canceling App() timers...') + self.cancelAllTimers() + + if SERVERMANAGER.selectedServer: + util.DEBUG_LOG('Closing server...') + SERVERMANAGER.selectedServer.close() + + def shutdown(self): + if self.timers: + util.DEBUG_LOG('Waiting for {0} App() timers: Started'.format(len(self.timers))) + + self.cancelAllTimers() + + for timer in self.timers: + timer.join() + + util.DEBUG_LOG('Waiting for App() timers: Finished') + + +class DeviceInfo(object): + def getCaptionsOption(self, key): + return None + + +class AppInterface(object): + QUALITY_LOCAL = 0 + QUALITY_REMOTE = 1 + QUALITY_ONLINE = 2 + + _globals = {} + + def __init__(self): + self.setQualities() + + def setQualities(self): + # Calculate the max quality based on 4k support + if self._globals.get("supports4k"): + maxQuality = simpleobjects.AttributeDict({ + 'height': 2160, + 'maxHeight': 2160, + 'origHeight': 1080 + }) + maxResolution = self._globals.get("Is4k") and "4k" or "1080p" + else: + maxQuality = simpleobjects.AttributeDict({ + 'height': 1080, + 'maxHeight': 1088 + }) + maxResolution = "1080p" + + self._globals['qualities'] = [ + simpleobjects.AttributeDict({'title': "Original", 'index': 13, 'maxBitrate': 1000000}), + simpleobjects.AttributeDict({'title': "20 Mbps " + maxResolution, 'index': 12, 'maxBitrate': 20000}), + simpleobjects.AttributeDict({'title': "12 Mbps " + maxResolution, 'index': 11, 'maxBitrate': 12000}), + simpleobjects.AttributeDict({'title': "10 Mbps " + maxResolution, 'index': 10, 'maxBitrate': 10000}), + simpleobjects.AttributeDict({'title': "8 Mbps " + maxResolution, 'index': 9, 'maxBitrate': 8000}), + simpleobjects.AttributeDict({'title': "4 Mbps 720p", 'index': 8, 'maxBitrate': 4000, 'maxHeight': 720}), + simpleobjects.AttributeDict({'title': "3 Mbps 720p", 'index': 7, 'maxBitrate': 3000, 'maxHeight': 720}), + simpleobjects.AttributeDict({'title': "2 Mbps 720p", 'index': 6, 'maxBitrate': 2000, 'maxHeight': 720}), + simpleobjects.AttributeDict({'title': "1.5 Mbps 480p", 'index': 5, 'maxBitrate': 1500, 'maxHeight': 480}), + simpleobjects.AttributeDict({'title': "720 Kbps", 'index': 4, 'maxBitrate': 720, 'maxHeight': 360}), + simpleobjects.AttributeDict({'title': "320 Kbps", 'index': 3, 'maxBitrate': 320, 'maxHeight': 360}), + maxQuality + ] + + for quality in self._globals['qualities']: + if quality.index is not None and quality.index >= 9: + quality.update(maxQuality) + + def getPreference(self, pref, default=None): + raise NotImplementedError + + def setPreference(self, pref, value): + raise NotImplementedError + + def clearRegistry(self, reg, sec=None): + raise NotImplementedError + + def getRegistry(self, reg, default=None, sec=None): + raise NotImplementedError + + def setRegistry(self, reg, value, sec=None): + raise NotImplementedError + + def getGlobal(self, glbl, default=None): + raise NotImplementedError + + def getCapabilities(self): + raise NotImplementedError + + def LOG(self, msg): + raise NotImplementedError + + def DEBUG_LOG(self, msg): + self.LOG(msg) + + def WARN_LOG(self, msg): + self.LOG(msg) + + def ERROR_LOG(self, msg): + self.LOG(msg) + + def ERROR(self, msg=None, err=None): + self.LOG(msg) + + def FATAL(self, msg=None): + self.ERROR_LOG('FATAL: {0}'.format(msg)) + + def supportsAudioStream(self, codec, channels): + return False + + def supportsSurroundSound(self): + return False + + def getMaxResolution(self, quality_type, allow4k=False): + return 480 + + def getQualityIndex(self, qualityType): + if qualityType == self.QUALITY_LOCAL: + return self.getPreference("local_quality", 13) + elif qualityType == self.QUALITY_ONLINE: + return self.getPreference("online_quality", 13) + else: + return self.getPreference("remote_quality", 13) + + def settingsGetMaxResolution(self, qualityType, allow4k): + qualityIndex = self.getQualityIndex(qualityType) + + if qualityIndex >= 9: + return allow4k and 2160 or 1088 + elif qualityIndex >= 6: + return 720 + elif qualityIndex >= 5: + return 480 + else: + return 360 + + def getMaxBitrate(self, qualityType): + qualityIndex = self.getQualityIndex(qualityType) + + qualities = self.getGlobal("qualities", []) + for quality in qualities: + if quality.index == qualityIndex: + return util.validInt(quality.maxBitrate) + + return 0 + + +class PlayerSettingsInterface(object): + def __init__(self): + self.prefOverrides = {} + + def __getattr__(self, name): + return getattr(util.INTERFACE, name) + + def setPrefOverride(self, key, val): + self.prefOverrides[key] = val + + def getPrefOverride(self, key, default=None): + return self.prefOverrides.get(key, default) + + def getQualityIndex(self, qualityType): + if qualityType == util.INTERFACE.QUALITY_LOCAL: + return self.getPreference("local_quality", 13) + elif qualityType == util.INTERFACE.QUALITY_ONLINE: + return self.getPreference("online_quality", 13) + else: + return self.getPreference("remote_quality", 13) + + def getPreference(self, key, default=None): + if key in self.prefOverrides: + return self.prefOverrides[key] + else: + return util.INTERFACE.getPreference(key, default) + + def getMaxResolution(self, quality_type, allow4k=False): + qualityIndex = self.getQualityIndex(quality_type) + + if qualityIndex >= 9: + return allow4k and 2160 or 1088 + elif qualityIndex >= 6: + return 720 + elif qualityIndex >= 5: + return 480 + else: + return 360 + + def getMaxBitrate(self, qualityType): + qualityIndex = self.getQualityIndex(qualityType) + + qualities = self.getGlobal("qualities", []) + for quality in qualities: + if quality.index == qualityIndex: + return util.validInt(quality.maxBitrate) + + return 0 + + +class DumbInterface(AppInterface): + _prefs = {} + _regs = { + None: {} + } + _globals = { + 'platform': platform.uname()[0], + 'appVersionStr': '0.0.0a1', + 'clientIdentifier': str(hex(uuid.getnode())), + 'platformVersion': platform.uname()[2], + 'product': 'PlexNet.API', + 'provides': 'player', + 'device': platform.uname()[0], + 'model': 'Unknown', + 'friendlyName': 'PlexNet.API', + 'deviceInfo': DeviceInfo() + } + + def getPreference(self, pref, default=None): + return self._prefs.get(pref, default) + + def setPreference(self, pref, value): + self._prefs[pref] = value + + def getRegistry(self, reg, default=None, sec=None): + section = self._regs.get(sec) + if section: + return section.get(reg, default) + + return default + + def setRegistry(self, reg, value, sec=None): + if sec and sec not in self._regs: + self._regs[sec] = {} + self._regs[sec][reg] = value + + def clearRegistry(self, reg, sec=None): + del self._regs[sec][reg] + + def getGlobal(self, glbl, default=None): + return self._globals.get(glbl, default) + + def getCapabilities(self): + return '' + + def LOG(self, msg): + print('PlexNet.API: {0}'.format(msg)) + + def DEBUG_LOG(self, msg): + self.LOG('DEBUG: {0}'.format(msg)) + + def WARN_LOG(self, msg): + self.LOG('WARNING: {0}'.format(msg)) + + def ERROR_LOG(self, msg): + self.LOG('ERROR: {0}'.format(msg)) + + def ERROR(self, msg=None, err=None): + if err: + self.LOG('ERROR: {0} - {1}'.format(msg, err.message)) + else: + import traceback + traceback.print_exc() + + +def createTimer(timeout, function, repeat=False, *args, **kwargs): + if isinstance(function, six.string_types): + def dummy(*args, **kwargs): + pass + dummy.__name__ = function + function = dummy + timer = util.TIMER(timeout / 1000.0, function, repeat=repeat, *args, **kwargs) + return timer + + +def setUserAgent(agent): + util.USER_AGENT = agent + util.BASE_HEADERS = util.resetBaseHeaders() + + +def setAbortFlagFunction(func): + from . import asyncadapter + asyncadapter.ABORT_FLAG_FUNCTION = func + + +def refreshResources(force=False): + from . import gdm + gdm.DISCOVERY.discover() + util.MANAGER.refreshResources(force) + SERVERMANAGER.refreshManualConnections() + + +util.setApp(App()) +util.setInterface(DumbInterface()) diff --git a/script.plexmod/lib/_included_packages/plexnet/plexconnection.py b/script.plexmod/lib/_included_packages/plexnet/plexconnection.py new file mode 100644 index 000000000..617a2d146 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexconnection.py @@ -0,0 +1,284 @@ +from __future__ import absolute_import +import random +import socket + +from . import http +from . import callback +from . import util + +HAS_ICMPLIB = False +try: + from icmplib import ping, resolve, ICMPLibError +except: + pass +else: + HAS_ICMPLIB = True + from urllib.parse import urlparse + from ipaddress import IPv4Address, IPv4Network, IPv6Address, IPv6Network + + # local networks + LOCAL_NETWORKS = { + 4: [IPv4Network('10.0.0.0/8'), IPv4Network('192.168.0.0/16'), IPv4Network('127.0.0.0/8')], + 6: [IPv6Network('fd00::/8')] + } + + +class ConnectionSource(int): + def init(self, name): + self.name = name + return self + + def __repr__(self): + return self.name + + +class PlexConnection(object): + # Constants + STATE_UNKNOWN = "unknown" + STATE_UNREACHABLE = "unreachable" + STATE_REACHABLE = "reachable" + STATE_UNAUTHORIZED = "unauthorized" + STATE_INSECURE = "insecure_untested" + + SOURCE_MANUAL = ConnectionSource(1).init('MANUAL') + SOURCE_DISCOVERED = ConnectionSource(2).init('DISCOVERED') + SOURCE_MANUAL_AND_DISCOVERED = ConnectionSource(3).init('MANUAL, DISCOVERED') + SOURCE_MYPLEX = ConnectionSource(4).init('MYPLEX') + SOURCE_MANUAL_AND_MYPLEX = ConnectionSource(5).init('MANUAL, MYPLEX') + SOURCE_DISCOVERED_AND_MYPLEX = ConnectionSource(6).init('DISCOVERED, MYPLEX') + SOURCE_ALL = ConnectionSource(7).init('ALL') + + SCORE_REACHABLE = 4 + SCORE_LOCAL = 2 + SCORE_SECURE = 1 + + SOURCE_BY_VAL = { + 1: SOURCE_MANUAL, + 2: SOURCE_DISCOVERED, + 3: SOURCE_MANUAL_AND_DISCOVERED, + 4: SOURCE_MYPLEX, + 5: SOURCE_MANUAL_AND_MYPLEX, + 6: SOURCE_DISCOVERED_AND_MYPLEX, + 7: SOURCE_ALL + } + + def __init__(self, source, address, isLocal, token, isFallback=False, skipLocalCheck=False): + self.state = self.STATE_UNKNOWN + self.sources = source + self.address = address + self.isLocal = isLocal + self.isSecure = address[:5] == 'https' + self.isFallback = isFallback + self.token = token + self.refreshed = True + self.score = 0 + self.request = None + + self.lastTestedAt = 0 + self.hasPendingRequest = False + + self.isSecureButLocal = False + + if not HAS_ICMPLIB: + util.WARN_LOG("icmplib not found, can't check local connectivity") + + # check whether hostname is on LAN + if HAS_ICMPLIB and util.CHECK_LOCAL and not skipLocalCheck: + self.checkLocal() + + self.getScore(True) + + def __eq__(self, other): + if not other: + return False + if self.__class__ != other.__class__: + return False + return self.address == other.address + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return "Connection: {0} local: {1} token: {2} sources: {3} state: {4} score: {5}".format( + self.address, + self.isLocal, + util.hideToken(self.token), + repr(self.sources), + self.state, + self.getScore() + ) + + def __repr__(self): + return self.__str__() + + def ipInLocalNet(self, ip): + key = ":" in ip and 6 or 4 + addr = key == 4 and IPv4Address(ip) or IPv6Address(ip) + for network in LOCAL_NETWORKS[key]: + if addr in network: + return network + return False + + def checkLocal(self): + pUrl = urlparse(self.address) + hostname = pUrl.hostname + try: + ips = resolve(hostname) + except (socket.gaierror, ICMPLibError): + return False + + for ip in ips: + if ip == hostname: + continue + + network = self.ipInLocalNet(ip) + if not network: + continue + + try: + host = ping(ip, count=1, interval=1, timeout=util.LAN_REACHABILITY_TIMEOUT, privileged=False) + except: + continue + + if host.is_alive: + self.isLocal = True + util.LOG("Found IP {0} in local network ({1}) when checking {2}. Ping: {3}ms (max: {4}ms)" + .format(ip, network, self.address, host.max_rtt, int(util.LAN_REACHABILITY_TIMEOUT * 1000))) + + if self.isSecure: + # alert the server that we've found the IP locally, so we can test non-secure connectivity + self.isSecureButLocal = (ip, pUrl.port) + + return False + + def merge(self, other): + # plex.tv trumps all, otherwise assume newer is better + # ROKU: if (other.sources and self.SOURCE_MYPLEX) <> 0 then + if other.sources == self.SOURCE_MYPLEX: + self.token = other.token + else: + self.token = self.token or other.token + + self.address = other.address + self.sources = self.SOURCE_BY_VAL[self.sources | other.sources] + self.isLocal = self.isLocal | other.isLocal + self.isSecure = other.isSecure + self.isFallback = self.isFallback or other.isFallback + self.refreshed = True + + self.getScore(True) + + def testReachability(self, server, allowFallback=False): + # Check if we will allow the connection test. If this is a fallback connection, + # then we will defer it until we "allowFallback" (test insecure connections + # after secure tests have completed and failed). Insecure connections will be + # tested if the policy "always" allows them, or if set to "same_network" and + # the current connection is local and server has (publicAddressMatches=1). + insecurePolicy = util.INTERFACE.getPreference("allow_insecure") + insecureAllowed = insecurePolicy == "always" or (insecurePolicy == "same_network" and + server.sameNetwork and self.isLocal) + + allowConnectionTest = not self.isFallback or (util.LOCAL_OVER_SECURE and insecureAllowed) + if not allowConnectionTest: + if insecureAllowed: + allowConnectionTest = allowFallback + server.hasFallback = not allowConnectionTest + util.LOG( + '{0} for {1}'.format( + allowConnectionTest and "Continuing with insecure connection testing" or "Insecure connection testing is deferred", server + ) + ) + else: + util.LOG("Insecure connections not allowed. Ignore insecure connection test for {0}".format(server)) + self.state = self.STATE_INSECURE + callable = callback.Callable(server.onReachabilityResult, [self], random.randint(0, 256)) + callable.deferCall() + return True + + if allowConnectionTest: + if not self.isSecure and not util.LOCAL_OVER_SECURE and ( + not allowFallback and + server.hasSecureConnections() or + server.activeConnection and + server.activeConnection.state != self.STATE_REACHABLE and + server.activeConnection.isSecure + ): + util.DEBUG_LOG("Invalid insecure connection test in progress") + self.request = http.HttpRequest(self.buildUrl(server, "/")) + context = self.request.createRequestContext("reachability", callback.Callable(self.onReachabilityResponse), + timeout=util.CONN_CHECK_TIMEOUT) + context.server = server + util.addPlexHeaders(self.request, server.getToken()) + self.hasPendingRequest = util.APP.startRequest(self.request, context) + util.DEBUG_LOG("Testing insecure connection test for: {0}".format(server)) + return True + + return False + + def cancelReachability(self): + if self.request: + self.request.ignoreResponse = True + self.request.cancel() + + def onReachabilityResponse(self, request, response, context): + self.hasPendingRequest = False + # It's possible we may have a result pending before we were able + # to cancel it, so we'll just ignore it. + + # if request.ignoreResponse: + # return + + if response.isSuccess(): + data = response.getBodyXml() + if data is not None and context.server.collectDataFromRoot(data): + self.state = self.STATE_REACHABLE + else: + # This is unexpected, but treat it as unreachable + util.ERROR_LOG("Unable to parse root response from {0}".format(context.server)) + self.state = self.STATE_UNREACHABLE + elif response.getStatus() == 401: + self.state = self.STATE_UNAUTHORIZED + else: + self.state = self.STATE_UNREACHABLE + + self.getScore(True) + + context.server.onReachabilityResult(self) + + def buildUrl(self, server, path, includeToken=False): + if '://' in path: + url = path + else: + url = self.address + path + + if includeToken: + # If we have a token, use it. Otherwise see if any other connections + # for this server have one. That will let us use a plex.tv token for + # something like a manually configured connection. + + token = self.token or server.getToken() + + if token: + url = http.addUrlParam(url, "X-Plex-Token=" + token) + + return url + + def simpleBuildUrl(self, server, path): + token = (self.token or server.getToken()) + param = '' + if token: + param = '&X-Plex-Token={0}'.format(token) + + return '{0}{1}{2}'.format(self.address, path, param) + + def getScore(self, recalc=False): + if recalc: + self.score = 0 + if self.state == self.STATE_REACHABLE: + self.score += self.SCORE_REACHABLE + if self.isSecure: + self.score += self.SCORE_SECURE + if self.isLocal: + self.score += self.SCORE_LOCAL + (not self.isSecure and util.LOCAL_OVER_SECURE and 2 or 0) + + return self.score diff --git a/script.plexmod/lib/_included_packages/plexnet/plexlibrary.py b/script.plexmod/lib/_included_packages/plexnet/plexlibrary.py new file mode 100644 index 000000000..9d93d557c --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexlibrary.py @@ -0,0 +1,634 @@ +# -*- coding: utf-8 -*- +""" +PlexLibrary +""" +from __future__ import absolute_import +import re +from . import plexobjects +from . import playlist +from . import media +from . import exceptions +from . import util +from . import signalsmixin +from six.moves import map + + +class Library(plexobjects.PlexObject): + def __repr__(self): + return ''.format(self.title1.encode('utf8')) + + def sections(self): + items = [] + + path = '/library/sections' + for elem in self.server.query(path): + stype = elem.attrib['type'] + if stype in SECTION_TYPES: + cls = SECTION_TYPES[stype] + items.append(cls(elem, initpath=path, server=self.server, container=self)) + return items + + def section(self, title=None): + for item in self.sections(): + if item.title == title: + return item + raise exceptions.NotFound('Invalid library section: %s' % title) + + def all(self): + return plexobjects.listItems(self.server, '/library/all') + + def onDeck(self): + return plexobjects.listItems(self.server, '/library/onDeck') + + def recentlyAdded(self): + return plexobjects.listItems(self.server, '/library/recentlyAdded') + + def get(self, title): + return plexobjects.findItem(self.server, '/library/all', title) + + def getByKey(self, key): + return plexobjects.findKey(self.server, key) + + def search(self, title, libtype=None, **kwargs): + """ Searching within a library section is much more powerful. It seems certain attributes on the media + objects can be targeted to filter this search down a bit, but I havent found the documentation for + it. For example: "studio=Comedy%20Central" or "year=1999" "title=Kung Fu" all work. Other items + such as actor= seem to work, but require you already know the id of the actor. + TLDR: This is untested but seems to work. Use library section search when you can. + """ + args = {} + if title: + args['title'] = title + if libtype: + args['type'] = plexobjects.searchType(libtype) + for attr, value in kwargs.items(): + args[attr] = value + query = '/library/all%s' % util.joinArgs(args) + return plexobjects.listItems(self.server, query) + + def cleanBundles(self): + self.server.query('/library/clean/bundles') + + def emptyTrash(self): + for section in self.sections(): + section.emptyTrash() + + def optimize(self): + self.server.query('/library/optimize') + + def refresh(self): + self.server.query('/library/sections/all/refresh') + + def randomArts(self): + return plexobjects.listItems(self.server, '/library/arts?sort=random&type=1%2c2%2c8&X-Plex-Container-Start=0&X-Plex-Container-Size=50') + + +class LibrarySection(plexobjects.PlexObject): + ALLOWED_FILTERS = () + ALLOWED_SORT = () + BOOLEAN_FILTERS = ('unwatched', 'duplicate') + + isLibraryPQ = True + + def __repr__(self): + title = self.title.replace(' ', '.')[0:20] + return '<%s:%s>' % (self.__class__.__name__, title.encode('utf8')) + + @staticmethod + def fromFilter(filter_): + cls = SECTION_IDS.get(filter_.getLibrarySectionType()) + if not cls: + return + section = cls(None, initpath=filter_.initpath, server=filter_.server, container=filter_.container) + section.key = filter_.getLibrarySectionId() + section.title = filter_.reasonTitle + section.type = cls.TYPE + return section + + def reload(self, **kwargs): + """ Reload the data for this object from PlexServer XML. """ + initpath = '/library/sections/{0}'.format(self.key) + key = self.key + try: + data = self.server.query(initpath, params=kwargs) + except Exception as e: + import traceback + traceback.print_exc() + util.ERROR(err=e) + self.initpath = self.key + return + + self._setData(data[0]) + self.initpath = self.key = key + + def isDirectory(self): + return True + + def isLibraryItem(self): + return True + + def getAbsolutePath(self, key): + if key == 'key': + return '/library/sections/{0}/all'.format(self.key) + + return plexobjects.PlexObject.getAbsolutePath(self, key) + + def all(self, start=None, size=None, filter_=None, sort=None, unwatched=False, type_=None): + if self.key.startswith('/'): + path = '{0}/all'.format(self.key) + else: + path = '/library/sections/{0}/all'.format(self.key) + + return self.items(path, start, size, filter_, sort, unwatched, type_, False) + + def folder(self, start=None, size=None, subDir=False): + if self.key.startswith('/'): + path = self.key + else: + path = '/library/sections/{0}'.format(self.key) + + if not subDir: + path = '{0}/folder'.format(path) + + return self.items(path, start, size, None, None, False, None, True) + + def items(self, path, start, size, filter_, sort, unwatched, type_, tag_fallback): + + args = {"includeCollections" : "1"} + + if size is not None: + args['X-Plex-Container-Start'] = start + args['X-Plex-Container-Size'] = size + + if filter_: + args[filter_[0]] = filter_[1] + + if sort: + args['sort'] = '{0}:{1}'.format(*sort) + + if type_: + args['type'] = str(type_) + + if unwatched: + args[self.TYPE == 'movie' and 'unwatched' or 'unwatchedLeaves'] = 1 + + if args: + path += util.joinArgs(args, '?' not in path) + + return plexobjects.listItems(self.server, path, tag_fallback=tag_fallback) + + def jumpList(self, filter_=None, sort=None, unwatched=False, type_=None): + if self.key.startswith('/'): + path = '{0}/firstCharacter'.format(self.key) + else: + path = '/library/sections/{0}/firstCharacter'.format(self.key) + + args = {"includeCollections" : "1"} + + if filter_: + args[filter_[0]] = filter_[1] + + if sort: + args['sort'] = '{0}:{1}'.format(*sort) + + if type_: + args['type'] = str(type_) + + if unwatched: + args[self.TYPE == 'movie' and 'unwatched' or 'unwatchedLeaves'] = 1 + + if args: + path += util.joinArgs(args) + + try: + return plexobjects.listItems(self.server, path, bytag=True) + except exceptions.BadRequest: + util.ERROR('jumpList() request error for path: {0}'.format(repr(path))) + return None + + @property + def onDeck(self): + return plexobjects.listItems(self.server, '/library/sections/%s/onDeck' % self.key) + + def analyze(self): + self.server.query('/library/sections/%s/analyze' % self.key) + + def emptyTrash(self): + self.server.query('/library/sections/%s/emptyTrash' % self.key) + + def refresh(self): + self.server.query('/library/sections/%s/refresh' % self.key) + + def listChoices(self, category, libtype=None, **kwargs): + """ List choices for the specified filter category. kwargs can be any of the same + kwargs in self.search() to help narrow down the choices to only those that + matter in your current context. + """ + if category in kwargs: + raise exceptions.BadRequest('Cannot include kwarg equal to specified category: %s' % category) + args = {} + for subcategory, value in kwargs.items(): + args[category] = self._cleanSearchFilter(subcategory, value) + if libtype is not None: + args['type'] = plexobjects.searchType(libtype) + query = '/library/sections/%s/%s%s' % (self.key, category, util.joinArgs(args)) + + return plexobjects.listItems(self.server, query, bytag=True) + + def search(self, title=None, sort=None, maxresults=999999, libtype=None, **kwargs): + """ Search the library. If there are many results, they will be fetched from the server + in batches of X_PLEX_CONTAINER_SIZE amounts. If you're only looking for the first + results, it would be wise to set the maxresults option to that amount so this functions + doesn't iterate over all results on the server. + title: General string query to search for. + sort: column:dir; column can be any of {addedAt, originallyAvailableAt, lastViewedAt, + titleSort, rating, mediaHeight, duration}. dir can be asc or desc. + maxresults: Only return the specified number of results + libtype: Filter results to a spcifiec libtype {movie, show, episode, artist, album, track} + kwargs: Any of the available filters for the current library section. Partial string + matches allowed. Multiple matches OR together. All inputs will be compared with the + available options and a warning logged if the option does not appear valid. + 'unwatched': Display or hide unwatched content (True, False). [all] + 'duplicate': Display or hide duplicate items (True, False). [movie] + 'actor': List of actors to search ([actor_or_id, ...]). [movie] + 'collection': List of collections to search within ([collection_or_id, ...]). [all] + 'contentRating': List of content ratings to search within ([rating_or_key, ...]). [movie, tv] + 'country': List of countries to search within ([country_or_key, ...]). [movie, music] + 'decade': List of decades to search within ([yyy0, ...]). [movie] + 'director': List of directors to search ([director_or_id, ...]). [movie] + 'genre': List Genres to search within ([genere_or_id, ...]). [all] + 'network': List of TV networks to search within ([resolution_or_key, ...]). [tv] + 'resolution': List of video resolutions to search within ([resolution_or_key, ...]). [movie] + 'studio': List of studios to search within ([studio_or_key, ...]). [music] + 'year': List of years to search within ([yyyy, ...]). [all] + """ + # Cleanup the core arguments + args = {} + for category, value in kwargs.items(): + args[category] = self._cleanSearchFilter(category, value, libtype) + if title is not None: + args['title'] = title + if sort is not None: + args['sort'] = self._cleanSearchSort(sort) + if libtype is not None: + args['type'] = plexobjects.searchType(libtype) + # Iterate over the results + results, subresults = [], '_init' + args['X-Plex-Container-Start'] = 0 + args['X-Plex-Container-Size'] = min(util.X_PLEX_CONTAINER_SIZE, maxresults) + while subresults and maxresults > len(results): + query = '/library/sections/%s/all%s' % (self.key, util.joinArgs(args)) + subresults = plexobjects.listItems(self.server, query) + results += subresults[:maxresults - len(results)] + args['X-Plex-Container-Start'] += args['X-Plex-Container-Size'] + return results + + def _cleanSearchFilter(self, category, value, libtype=None): + # check a few things before we begin + if category not in self.ALLOWED_FILTERS: + raise exceptions.BadRequest('Unknown filter category: %s' % category) + if category in self.BOOLEAN_FILTERS: + return '1' if value else '0' + if not isinstance(value, (list, tuple)): + value = [value] + # convert list of values to list of keys or ids + result = set() + choices = self.listChoices(category, libtype) + lookup = {} + for c in choices: + lookup[c.title.lower()] = c.key + + allowed = set(c.key for c in choices) + for item in value: + item = str(item.id if isinstance(item, media.MediaTag) else item).lower() + # find most logical choice(s) to use in url + if item in allowed: + result.add(item) + continue + if item in lookup: + result.add(lookup[item]) + continue + matches = [k for t, k in lookup.items() if item in t] + if matches: + list(map(result.add, matches)) + continue + # nothing matched; use raw item value + util.LOG('Filter value not listed, using raw item value: {0}'.format(item)) + result.add(item) + return ','.join(result) + + def _cleanSearchSort(self, sort): + sort = '%s:asc' % sort if ':' not in sort else sort + scol, sdir = sort.lower().split(':') + lookup = {} + for s in self.ALLOWED_SORT: + lookup[s.lower()] = s + if scol not in lookup: + raise exceptions.BadRequest('Unknown sort column: %s' % scol) + if sdir not in ('asc', 'desc'): + raise exceptions.BadRequest('Unknown sort dir: %s' % sdir) + return '%s:%s' % (lookup[scol], sdir) + + +class MovieSection(LibrarySection): + ALLOWED_FILTERS = ( + 'unwatched', 'duplicate', 'year', 'decade', 'genre', 'contentRating', 'collection', + 'director', 'actor', 'country', 'studio', 'resolution' + ) + ALLOWED_SORT = ( + 'addedAt', 'originallyAvailableAt', 'lastViewedAt', 'titleSort', 'rating', 'audienceRating', 'userRating', + 'contentRating', 'mediaHeight', 'duration' + ) + TYPE = 'movie' + ID = '1' + + +class ShowSection(LibrarySection): + ALLOWED_FILTERS = ('unwatched', 'year', 'genre', 'contentRating', 'network', 'collection') + ALLOWED_SORT = ('addedAt', 'lastViewedAt', 'originallyAvailableAt', 'titleSort', 'rating', 'audienceRating', + 'userRating', 'contentRating', 'unwatched') + TYPE = 'show' + ID = '2' + + def searchShows(self, **kwargs): + return self.search(libtype='show', **kwargs) + + def searchEpisodes(self, **kwargs): + return self.search(libtype='episode', **kwargs) + + +class MusicSection(LibrarySection): + ALLOWED_FILTERS = ('genre', 'country', 'collection') + ALLOWED_SORT = ('addedAt', 'lastViewedAt', 'viewCount', 'titleSort') + TYPE = 'artist' + ID = '8' + + def searchShows(self, **kwargs): + return self.search(libtype='artist', **kwargs) + + def searchEpisodes(self, **kwargs): + return self.search(libtype='album', **kwargs) + + def searchTracks(self, **kwargs): + return self.search(libtype='track', **kwargs) + + +class PhotoSection(LibrarySection): + ALLOWED_FILTERS = () + ALLOWED_SORT = ('addedAt', 'lastViewedAt', 'viewCount', 'titleSort') + TYPE = 'photo' + ID = 'None' + + def isPhotoOrDirectoryItem(self): + return True + + +@plexobjects.registerLibType +class Collection(media.MediaItem): + TYPE = 'collection' + + def __repr__(self): + title = self.title.replace(' ', '.')[0:20] + return '<{0}:{1}:{2}>'.format(self.__class__.__name__, self.key, title) + + def all(self, *args, **kwargs): + items = plexobjects.listItems(self.server, self.key) + items.totalSize = items.size + return items + + def isMusicOrDirectoryItem(self): + return self.container.viewGroup in ('artist', 'album', 'track') + + def isVideoOrDirectoryItem(self): + return self.container.viewGroup in ('movie', 'show', 'episode') + + def isCollection(self): + return True + + +@plexobjects.registerLibType +class Generic(plexobjects.PlexObject): + TYPE = 'Directory' + + def __repr__(self): + title = self.title.replace(' ', '.')[0:20] + return '<{0}:{1}:{2}>'.format(self.__class__.__name__, self.key, title) + +#@plexobjects.registerLibType +#class Collection(Generic): +# TYPE = 'collection' + +@plexobjects.registerLibType +class Playlist(playlist.BasePlaylist, signalsmixin.SignalsMixin): + TYPE = 'playlist' + + def __init__(self, *args, **kwargs): + playlist.BasePlaylist.__init__(self, *args, **kwargs) + signalsmixin.SignalsMixin.__init__(self) + self._itemsLoaded = False + + def __repr__(self): + title = self.title.replace(' ', '.')[0:20] + return '<{0}:{1}:{2}>'.format(self.__class__.__name__, self.key, title) + + def exists(self): + try: + self.server.query('/playlists/{0}'.format(self.ratingKey)) + return True + except exceptions.BadRequest: + return False + + def isMusicOrDirectoryItem(self): + return self.playlistType == 'audio' + + def isVideoOrDirectoryItem(self): + return self.playlistType == 'video' + + def items(self): + if not self._itemsLoaded: + path = '/playlists/{0}/items'.format(self.ratingKey) + self._items = plexobjects.listItems(self.server, path) + self._itemsLoaded = True + + return playlist.BasePlaylist.items(self) + + def extend(self, start=0, size=0): + if not self._items: + self._items = [None] * self.leafCount.asInt() + + args = {} + + if size is not None: + args['X-Plex-Container-Start'] = start + args['X-Plex-Container-Size'] = size + + path = '/playlists/{0}/items'.format(self.ratingKey) + if args: + path += util.joinArgs(args) if '?' not in path else '&' + util.joinArgs(args).lstrip('?') + + items = plexobjects.listItems(self.server, path) + self._items[start:start + len(items)] = items + + self.trigger('items.added') + + return items + + def unshuffledItems(self): + if not self._itemsLoaded: + list(self.items()) + return self._items + + @property + def defaultThumb(self): + return self.composite + + def buildComposite(self, **kwargs): + if kwargs: + params = '?' + '&'.join('{0}={1}'.format(k, v) for k, v in kwargs.items()) + else: + params = '' + + path = self.composite + params + return self.getServer().buildUrl(path, True) + + +class BaseHub(plexobjects.PlexObject): + def reset(self): + self.set('offset', 0) + self.set('size', len(self.items)) + totalSize = self.items[0].container.totalSize.asInt() + if totalSize: # Hubs from a list of hubs don't have this, so it it's not here this is intital and we can leave as is + self.set( + 'more', + (self.items[0].container.offset.asInt() + self.items[0].container.size.asInt() < totalSize) and '1' or '' + ) + + +class Hub(BaseHub): + TYPE = "Hub" + + def init(self, data): + self.items = [] + + container = plexobjects.PlexContainer(data, self.key, self.server, self.key or '') + + if self.type == 'genre': + self.items = [media.Genre(elem, initpath='/hubs', server=self.server, container=container) for elem in data] + elif self.type == 'director': + self.items = [media.Director(elem, initpath='/hubs', server=self.server, container=container) for elem in data] + elif self.type == 'actor': + self.items = [media.Role(elem, initpath='/hubs', server=self.server, container=container) for elem in data] + else: + for elem in data: + try: + self.items.append(plexobjects.buildItem(self.server, elem, '/hubs', container=container, tag_fallback=True)) + except exceptions.UnknownType: + util.DEBUG_LOG('Unkown hub item type({1}): {0}'.format(elem, elem.attrib.get('type'))) + + def __repr__(self): + return '<{0}:{1}>'.format(self.__class__.__name__, self.hubIdentifier) + + def getCleanHubIdentifier(self): + return re.sub(r'\.\d+$', '', re.sub(r'\.\d+$', '', self.hubIdentifier)) + + def reload(self, **kwargs): + """ Reload the data for this object from PlexServer XML. """ + try: + data = self.server.query(self.key, params=kwargs) + except Exception as e: + import traceback + traceback.print_exc() + util.ERROR(err=e) + self.initpath = self.key + return + + self.initpath = self.key + self._setData(data) + self.init(data) + + def extend(self, start=None, size=None): + path = self.key + + args = {} + + if size is not None: + args['X-Plex-Container-Start'] = start + args['X-Plex-Container-Size'] = size + + if args: + path += util.joinArgs(args) if '?' not in path else '&' + util.joinArgs(args).lstrip('?') + + items = plexobjects.listItems(self.server, path) + self.offset = plexobjects.PlexValue(start) + self.size = plexobjects.PlexValue(len(items)) + self.more = plexobjects.PlexValue('') + if items: + self.more = plexobjects.PlexValue( + (items[0].container.offset.asInt() + items[0].container.size.asInt() < items[0].container.totalSize.asInt()) and '1' or '' + ) + return items + + +class PlaylistHub(BaseHub): + TYPE = "Hub" + type = None + hubIdentifier = None + + def init(self, data): + try: + self.items = self.extend(0, 10) + except exceptions.BadRequest: + util.DEBUG_LOG('AudioPlaylistHub: Bad request: {0}'.format(self)) + self.items = [] + + def getCleanHubIdentifier(self): + return re.sub(r'\.\d+$', '', re.sub(r'\.\d+$', '', self.hubIdentifier)) + + def extend(self, start=None, size=None): + path = '/playlists/all?playlistType={0}'.format(self.type) + + args = {"includeMarkers": 1} + + if size is not None: + args['X-Plex-Container-Start'] = start + args['X-Plex-Container-Size'] = size + else: + start = 0 + + if args: + path += '&' + util.joinArgs(args).lstrip('?') + + items = plexobjects.listItems(self.server, path) + + if not items: + return + + self.set('offset', start) + self.set('size', len(items)) + self.set('more', (items[0].container.offset.asInt() + items[0].container.size.asInt() < items[0].container.totalSize.asInt()) and '1' or '') + return items + + +class AudioPlaylistHub(PlaylistHub): + type = 'audio' + hubIdentifier = 'playlists.audio' + + +class VideoPlaylistHub(PlaylistHub): + type = 'video' + hubIdentifier = 'playlists.video' + + +SECTION_TYPES = { + MovieSection.TYPE: MovieSection, + ShowSection.TYPE: ShowSection, + MusicSection.TYPE: MusicSection, + PhotoSection.TYPE: PhotoSection +} + +SECTION_IDS = { + MovieSection.ID: MovieSection, + ShowSection.ID: ShowSection, + MusicSection.ID: MusicSection, + PhotoSection.ID: PhotoSection +} diff --git a/script.plexmod/lib/_included_packages/plexnet/plexmedia.py b/script.plexmod/lib/_included_packages/plexnet/plexmedia.py new file mode 100644 index 000000000..bbbc51825 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexmedia.py @@ -0,0 +1,154 @@ +from __future__ import absolute_import +from . import locks +from . import http +from . import plexobjects +from . import plexpart +from . import plexrequest +from . import util +from six.moves import filter +import six + + +class PlexMedia(plexobjects.PlexObject): + def __init__(self, data, initpath=None, server=None, container=None): + self._data = data.attrib + plexobjects.PlexObject.__init__(self, data, initpath, server) + self.container_ = self.get('container') + self.container = container + self.indirectHeaders = None + self.parts = [] + # If we weren't given any data, this is a synthetic media + if data is not None: + self.parts = [plexpart.PlexPart(elem, initpath=self.initpath, server=self.server, media=self) for elem in data] + + def get(self, key, default=None): + return self._data.get(key, default) + + def hasStreams(self): + return len(self.parts) > 0 and self.parts[0].hasStreams() + + def isIndirect(self): + return self.get('indirect') == '1' + + def isAccessible(self): + return any(p.isAccessible() for p in self.parts) + + def isAvailable(self): + return any(p.isAvailable() for p in self.parts) + + def resolveIndirect(self): + if not self.isIndirect() or locks.LOCKS.isLocked("resolve_indirect"): + return self + + part = self.parts[0] + if part is None: + util.DEBUG("Failed to resolve indirect media: missing valid part") + return None + + postBody = None + postUrl = part.postURL + request = plexrequest.PlexRequest(self.getServer(), part.key, postUrl is not None and "POST" or "GET") + + if postUrl is not None: + util.DEBUG("Fetching content for indirect media POST URL: {0}".format(postUrl)) + # Force setting the certificate to handle following https redirects + postRequest = http.HttpRequest(postUrl, None, True) + postResponse = postRequest.getToStringWithTimeout(30) + if len(postResponse) > 0 and type(postRequest.event) == "roUrlEvent": + util.DEBUG("Retrieved data from postURL, posting to resolve container") + crlf = chr(13) + chr(10) + postBody = "" + for header in postRequest.event.getResponseHeadersArray(): + for name in header: + postBody = postBody + name + ": " + header[name] + crlf + postBody = postBody + crlf + postResponse + else: + util.DEBUG("Failed to resolve indirect media postUrl") + self.Set("indirect", "-1") + return self + + request.addParam("postURL", postUrl) + + response = request.doRequestWithTimeout(30, postBody) + + item = response.items[0] + if item is None or item.mediaItems[0] is None: + util.DEBUG("Failed to resolve indirect media: no media items") + self.indirect = -1 + return self + + media = item.mediaItems[0] + + # Add indirect headers to the media item + media.indirectHeaders = util.AttributeDict() + for header in (item.container.httpHeaders or '').split("&"): + arr = header.split("=") + if len(arr) == 2: + media.indirectHeaders[arr[0]] = arr[1] + + # Reset the fallback media id if applicable + if self.id.asInt() < 0: + media.id = self.id + + return media.resolveIndirect() + + def __str__(self): + extra = [] + attrs = ("videoCodec", "audioCodec", "audioChannels", "protocol", "id") + if self.get('container'): + extra.append("container={0}".format(self.get('container'))) + + for astr in attrs: + if hasattr(self, astr): + attr = getattr(self, astr) + if attr and not attr.NA: + extra.append("{0}={1}".format(astr, attr)) + + return self.versionString(log_safe=True) + " " + ' '.join(extra) + + def versionString(self, log_safe=False): + details = [] + details.append(self.getVideoResolutionString()) + if self.bitrate.asInt() > 0: + details.append(util.bitrateToString(self.bitrate.asInt() * 1000)) + + detailString = ', '.join(details) + return (log_safe and ' * ' or u" \u2022 ").join([_f for _f in [self.title, detailString] if _f]) + + def __eq__(self, other): + if not other: + return False + + if self.__class__ != other.__class__: + return False + + return self.id == other.id + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return self.__str__() + + def getVideoResolution(self): + if self.videoResolution: + standardDefinitionHeight = 480 + if str(util.validInt(list(filter(six.text_type.isdigit, self.videoResolution)))) != self.videoResolution: + return self.height.asInt() > standardDefinitionHeight and self.height.asInt() or standardDefinitionHeight + else: + return self.videoResolution.asInt(standardDefinitionHeight) + + return self.height.asInt() + + def getVideoResolutionString(self): + resNumber = util.validInt(list(filter(six.text_type.isdigit, self.videoResolution))) + if resNumber > 0 and str(resNumber) == self.videoResolution: + return self.videoResolution + "p" + + return self.videoResolution.upper() + + def isSelected(self): + from . import plexapp + return self.selected.asBool() or self.id == util.INTERFACE.getPreference("local_mediaId") + + # TODO(schuyler): getParts diff --git a/script.plexmod/lib/_included_packages/plexnet/plexobjects.py b/script.plexmod/lib/_included_packages/plexnet/plexobjects.py new file mode 100644 index 000000000..6d5c01f2d --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexobjects.py @@ -0,0 +1,572 @@ +from __future__ import absolute_import +from datetime import datetime + +from . import exceptions +from . import util +import json +import six +import time + +# Search Types - Plex uses these to filter specific media types when searching. +SEARCHTYPES = { + 'movie': 1, + 'show': 2, + 'season': 3, + 'episode': 4, + 'artist': 8, + 'album': 9, + 'track': 10 +} + +LIBRARY_TYPES = {} + + +def registerLibType(cls): + LIBRARY_TYPES[cls.TYPE] = cls + return cls + + +def registerLibFactory(ftype): + def wrap(func): + LIBRARY_TYPES[ftype] = func + return func + return wrap + + +class PlexValue(six.text_type): + def __new__(cls, value, parent=None): + self = super(PlexValue, cls).__new__(cls, value) + self.parent = parent + self.NA = False + return self + + def __call__(self, default): + return not self.NA and self or PlexValue(default, self.parent) + + def asBool(self): + return self == '1' + + def asInt(self, default=0): + return int(self or default) + + def asFloat(self, default=0): + return float(self or default) + + def asDatetime(self, format_=None): + if not self: + return None + + if self.isdigit(): + dt = datetime.fromtimestamp(int(self)) + else: + # dt = datetime.strptime(self, '%Y-%m-%d') + # Avoid datetime.strptime to avoid + # https://github.com/python/cpython/issues/71587 + try: + dt = datetime.fromtimestamp(time.mktime(time.strptime(self, '%Y-%m-%d'))) + except OverflowError: + # special case for dates before 1970-01-02 (yes, there are shows that old), mktime fails on those + year, month, day = (int(p) for p in str(self).split("-")) + dt = datetime(year=year, month=month, day=day) + + if not format_: + return dt + + return dt.strftime(format_) + + def asURL(self, includeToken=False): + return self.parent.server.buildUrl(self, includeToken) + + def asTranscodedImageURL(self, w, h, **extras): + return self.parent.server.getImageTranscodeURL(self, w, h, **extras) + + +class JEncoder(json.JSONEncoder): + def default(self, o): + try: + return json.JSONEncoder.default(self, o) + except: + return None + + +def asFullObject(func): + def wrap(self, *args, **kwargs): + if not self.isFullObject(): + self.reload() + return func(self, *args, **kwargs) + + return wrap + + +class Checks(object): + def isLibraryItem(self): + return "/library/metadata" in self.get('key', '') or ("/playlists/" in self.get('key', '') and self.get("type", "") == "playlist") + + def isVideoItem(self): + return False + + def isMusicItem(self): + return False + + def isOnlineItem(self): + return self.isChannelItem() or self.isMyPlexItem() or self.isVevoItem() or self.isIvaItem() + + def isMyPlexItem(self): + return self.container.server.TYPE == 'MYPLEXSERVER' or self.container.identifier == 'com.plexapp.plugins.myplex' + + def isChannelItem(self): + identifier = self.getIdentifier() or "com.plexapp.plugins.library" + return not self.isLibraryItem() and not self.isMyPlexItem() and identifier != "com.plexapp.plugins.library" + + def isVevoItem(self): + return 'vevo://' in self.get('guid') + + def isIvaItem(self): + return 'iva://' in self.get('guid') + + def isGracenoteCollection(self): + return False + + def isIPhoto(self): + return (self.title == "iPhoto" or self.container.title == "iPhoto" or (self.mediaType == "Image" or self.mediaType == "Movie")) + + def isDirectory(self): + return self.name == "Directory" or self.name == "Playlist" + + def isPhotoOrDirectoryItem(self): + return self.type == "photoalbum" # or self.isPhotoItem() + + def isMusicOrDirectoryItem(self): + return self.type in ('artist', 'album', 'track') + + def isVideoOrDirectoryItem(self): + return self.type in ('movie', 'show', 'episode') + + def isSettings(self): + return False + + +class PlexObject(Checks): + def __init__(self, data, initpath=None, server=None, container=None): + self.initpath = initpath + self.key = None + self.server = server + self.container = container + self.mediaChoice = None + self.titleSort = PlexValue('') + self.deleted = False + self._reloaded = False + self.data = data + + if data is None: + return + + self._setData(data) + + self.init(data) + + def _setData(self, data): + if data is False: + return + + self.name = data.tag + for k, v in data.attrib.items(): + if k in ("container",): + k = "attrib_%s" % k + + setattr(self, k, PlexValue(v, self)) + + def __getattr__(self, attr): + a = PlexValue('', self) + a.NA = True + + try: + setattr(self, attr, a) + except AttributeError: + util.LOG('Failed to set attribute: {0} ({1})'.format(attr, self.__class__)) + + return a + + def exists(self): + # Used for media items - for others we just return True + return True + + def get(self, attr, default=''): + ret = self.__dict__.get(attr) + return ret is not None and ret or PlexValue(default, self) + + def set(self, attr, value): + setattr(self, attr, PlexValue(six.text_type(value), self)) + + def init(self, data): + pass + + def isFullObject(self): + return self.initpath is None or self.key is None or self.initpath == self.key + + def getAddress(self): + return self.server.activeConnection.address + + @property + def defaultTitle(self): + return self.get('title') + + @property + def defaultThumb(self): + return self.__dict__.get('thumb') and self.thumb or PlexValue('', self) + + @property + def defaultArt(self): + return self.__dict__.get('art') and self.art or PlexValue('', self) + + def refresh(self): + import requests + self.server.query('%s/refresh' % self.key, method=requests.put) + + def reload(self, _soft=False, **kwargs): + """ Reload the data for this object from PlexServer XML. """ + if _soft and self._reloaded: + return self + + kwargs["includeMarkers"] = 1 + + try: + if self.get('ratingKey'): + data = self.server.query('/library/metadata/{0}'.format(self.ratingKey), params=kwargs) + else: + data = self.server.query(self.key, params=kwargs) + self._reloaded = True + except Exception as e: + import traceback + traceback.print_exc() + util.ERROR(err=e) + self.initpath = self.key + return self + + self.initpath = self.key + + try: + self._setData(data[0]) + except (IndexError, TypeError, AttributeError): + util.DEBUG_LOG('No data on reload: {0}'.format(self)) + return self + + return self + + def softReload(self, **kwargs): + return self.reload(_soft=True, **kwargs) + + def getLibrarySectionId(self): + ID = self.get('librarySectionID') + + if not ID: + ID = self.container.get("librarySectionID", '') + + return ID + + def getLibrarySectionTitle(self): + title = self.get('librarySectionTitle') + + if not title: + title = self.container.get("librarySectionTitle", '') + + if not title: + lsid = self.getLibrarySectionId() + if lsid: + data = self.server.query('/library/sections/{0}'.format(lsid)) + title = data.attrib.get('title1') + if title: + self.librarySectionTitle = title + return str(title) + + def getLibrarySectionType(self): + type_ = self.get('librarySectionType') + + if not type_: + type_ = self.container.get("librarySectionType", '') + + if not type_: + lsid = self.getLibrarySectionId() + if lsid: + data = self.server.query('/library/sections/{0}'.format(lsid)) + type_ = data.attrib.get('type') + if type_: + self.librarySectionTitle = type_ + return type_ + + def getLibrarySectionUuid(self): + uuid = self.get("uuid") or self.get("librarySectionUUID") + + if not uuid: + uuid = self.container.get("librarySectionUUID", "") + + return uuid + + def _findLocation(self, data): + elem = data.find('Location') + if elem is not None: + return elem.attrib.get('path') + return None + + def _findPlayer(self, data): + elem = data.find('Player') + if elem is not None: + return PlexObject(elem, server=self.server) + return None + + def _findTranscodeSession(self, data): + elem = data.find('TranscodeSession') + if elem is not None: + from . import media + return media.TranscodeSession(elem, server=self.server) + return None + + def _findBandwidths(self, data): + elem = data.find("Bandwidths") + if elem is not None: + from . import media + return PlexItemList(elem, media.Bandwidth, media.Bandwidth.TYPE, server=self.server) + return [] + + def _findUser(self, data): + elem = data.find('User') + if elem is not None: + return PlexObject(elem, self.initpath) + return None + + def _findSession(self, data): + elem = data.find('Session') + if elem is not None: + return PlexObject(elem, self.initpath, server=self.server) + return None + + def getAbsolutePath(self, attr): + path = getattr(self, attr, None) + if path is None: + return None + else: + return self.container._getAbsolutePath(path) + + def _getAbsolutePath(self, path): + if path.startswith('/'): + return path + elif "://" in path: + return path + else: + return self.getAddress() + "/" + path + + def getParentPath(self, key): + # Some containers have /children on its key while others (such as playlists) use /items + path = self.getAbsolutePath(key) + if path is None: + return "" + + for suffix in ("/children", "/items"): + path = path.replace(suffix, "") + + return path + + def getServer(self): + return self.server + + def getTranscodeServer(self, localServerRequired=False, transcodeType=None): + server = self.server + + # If the server is myPlex, try to use a different PMS for transcoding + from . import myplexserver + from . import plexapp + if server == myplexserver.MyPlexServer: + fallbackServer = plexapp.SERVERMANAGER.getChannelServer() + + if fallbackServer: + server = fallbackServer + elif localServerRequired: + return None + + return server + + @classmethod + def deSerialize(cls, jstring): + from . import plexserver + obj = json.loads(jstring) + server = plexserver.PlexServer.deSerialize(obj['server']) + server.identifier = None + ad = util.AttributeDict() + ad.attrib = obj['obj'] + ad.find = lambda x: None + po = buildItem(server, ad, ad.initpath, container=server) + + return po + + def serialize(self, full=False): + import json + odict = {} + if full: + for k, v in self.__dict__.items(): + if k not in ('server', 'container', 'media', 'initpath', '_data') and v: + odict[k] = v + else: + odict['key'] = self.key + odict['type'] = self.type + + odict['initpath'] = '/none' + obj = {'obj': odict, 'server': self.server.serialize(full=full)} + + return json.dumps(obj, cls=JEncoder) + + +class PlexContainer(PlexObject): + def __init__(self, data, initpath=None, server=None, address=None): + PlexObject.__init__(self, data, initpath, server) + self.setAddress(address) + + def setAddress(self, address): + if address != "/" and address.endswith("/"): + self.address = address[:-1] + else: + self.address = address + + # TODO(schuyler): Do we need to make sure that we only hang onto the path here and not a full URL? + if not self.address.startswith("/") and "node.plexapp.com" not in self.address: + util.FATAL("Container address is not an expected path: {0}".format(address)) + + def getAbsolutePath(self, path): + if path.startswith('/'): + return path + elif "://" in path: + return path + else: + return self.address + "/" + path + + +class PlexServerContainer(PlexContainer): + def __init__(self, data, initpath=None, server=None, address=None): + PlexContainer.__init__(self, data, initpath, server, address) + from . import plexserver + self.resources = [plexserver.PlexServer(elem) for elem in data] + + def __getitem__(self, idx): + return self.resources[idx] + + def __iter__(self): + for i in self.resources: + yield i + + def __len__(self): + return len(self.resources) + + +class PlexItemList(object): + def __init__(self, data, item_cls, tag, server=None, container=None): + self._data = data + self._itemClass = item_cls + self._itemTag = tag + self._server = server + self._container = container + self._items = None + + def __iter__(self): + for i in self.items: + yield i + + def __getitem__(self, idx): + return self.items[idx] + + @property + def items(self): + if self._items is None: + if self._data is not None: + if self._server: + self._items = [self._itemClass(elem, server=self._server, container=self._container) for elem in self._data if elem.tag == self._itemTag] + else: + self._items = [self._itemClass(elem) for elem in self._data if elem.tag == self._itemTag] + else: + self._items = [] + + return self._items + + def __call__(self, *args): + return self.items + + def __len__(self): + return len(self.items) + + def append(self, item): + self.items.append(item) + + +class PlexMediaItemList(PlexItemList): + def __init__(self, data, item_cls, tag, initpath=None, server=None, media=None): + PlexItemList.__init__(self, data, item_cls, tag, server) + self._initpath = initpath + self._media = media + self._items = None + + @property + def items(self): + if self._items is None: + if self._data is not None: + self._items = [self._itemClass(elem, self._initpath, self._server, self._media) for elem in self._data if elem.tag == self._itemTag] + else: + self._items = [] + + return self._items + + +def findItem(server, path, title): + for elem in server.query(path): + if elem.attrib.get('title').lower() == title.lower(): + return buildItem(server, elem, path) + raise exceptions.NotFound('Unable to find item: {0}'.format(title)) + + +def buildItem(server, elem, initpath, bytag=False, container=None, tag_fallback=False): + libtype = elem.tag if bytag else elem.attrib.get('type') + if not libtype and tag_fallback: + libtype = elem.tag + + if libtype in LIBRARY_TYPES: + cls = LIBRARY_TYPES[libtype] + return cls(elem, initpath=initpath, server=server, container=container) + raise exceptions.UnknownType('Unknown library type: {0}'.format(libtype)) + + +class ItemContainer(list): + def __getattr__(self, attr): + return getattr(self.container, attr) + + def init(self, container): + self.container = container + return self + + +def listItems(server, path, libtype=None, watched=None, bytag=False, data=None, container=None, offset=None, + limit=None, tag_fallback=False, **kwargs): + data = data if data is not None else server.query(path, offset=offset, limit=limit, **kwargs) + container = container or PlexContainer(data, path, server, path) + items = ItemContainer().init(container) + + if data: + for elem in data: + if libtype and elem.attrib.get('type') != libtype: + continue + if watched is True and elem.attrib.get('viewCount', 0) == 0: + continue + if watched is False and elem.attrib.get('viewCount', 0) >= 1: + continue + try: + items.append(buildItem(server, elem, path, bytag, container, tag_fallback)) + except exceptions.UnknownType: + pass + + return items + + +def searchType(libtype): + searchtypesstrs = [str(k) for k in SEARCHTYPES.keys()] + if libtype in SEARCHTYPES + searchtypesstrs: + return libtype + stype = SEARCHTYPES.get(libtype.lower()) + if not stype: + raise exceptions.NotFound('Unknown libtype: %s' % libtype) + return stype diff --git a/script.plexmod/lib/_included_packages/plexnet/plexpart.py b/script.plexmod/lib/_included_packages/plexnet/plexpart.py new file mode 100644 index 000000000..7fd0c138c --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexpart.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +from . import plexobjects +from . import plexstream +from . import plexrequest +from . import util + + +class PlexPart(plexobjects.PlexObject): + def reload(self): + self.initpath = self.key + + def __init__(self, data, initpath=None, server=None, media=None): + plexobjects.PlexObject.__init__(self, data, initpath, server) + self.container_ = self.container + self.container = media + self.streams = [] + + # If we weren't given any data, this is a synthetic part + if data is not None: + self.streams = [plexstream.PlexStream(e, initpath=self.initpath, server=self.server) for e in data if e.tag == 'Stream'] + if self.indexes: + indexKeys = self.indexes('').split(",") + self.indexes = util.AttributeDict() + for indexKey in indexKeys: + self.indexes[indexKey] = True + + def getAddress(self): + address = self.key + + if address != "": + # TODO(schuyler): Do we need to add a token? Or will it be taken care of via header else:where? + address = self.container.getAbsolutePath(address) + + return address + + def isAccessible(self): + # If we haven't fetched accessibility info, assume it's accessible. + return self.accessible.asBool() if self.accessible else True + + def isAvailable(self): + # If we haven't fetched availability info, assume it's available + return not self.exists or self.exists.asBool() + + def getStreamsOfType(self, streamType): + streams = [] + + foundSelected = False + + for stream in self.streams: + if stream.streamType.asInt() == streamType: + streams.append(stream) + + if stream.isSelected(): + foundSelected = True + + # If this is subtitles, add the none option + if streamType == plexstream.PlexStream.TYPE_SUBTITLE: + none = plexstream.NoneStream() + streams.insert(0, none) + none.setSelected(not foundSelected) + + return streams + + # def getSelectedStreamStringOfType(self, streamType): + # default = None + # availableStreams = 0 + # for stream in self.streams: + # if stream.streamType.asInt() == streamType: + # availableStreams = availableStreams + 1 + # if stream.isSelected() or (default is None and streamType != stream.TYPE_SUBTITLE): + # default = stream + + # if default is not None: + # availableStreams = availableStreams - 1 + # title = default.getTitle() + # suffix = "More" + # else: + # title = "None" + # suffix = "Available" + + # if availableStreams > 0 and streamType != stream.TYPE_VIDEO: + # # Indicate available streams to choose from, excluding video + # # streams until the server supports multiple videos streams. + + # return u"{0} : {1} {2}".format(title, availableStreams, suffix) + # else: + # return title + + def getSelectedStreamOfType(self, streamType): + # Video streams, in particular, may not be selected. Pretend like the + # first one was selected. + + default = None + + for stream in self.streams: + if stream.streamType.asInt() == streamType: + if stream.isSelected(): + return stream + elif default is None and streamType != stream.TYPE_SUBTITLE: + default = stream + + return default + + def setSelectedStream(self, streamType, streamId, _async): + if streamType == plexstream.PlexStream.TYPE_AUDIO: + typeString = "audio" + elif streamType == plexstream.PlexStream.TYPE_SUBTITLE: + typeString = "subtitle" + elif streamType == plexstream.PlexStream.TYPE_VIDEO: + typeString = "video" + else: + return None + + path = "/library/parts/{0}?{1}StreamID={2}".format(self.id(''), typeString, streamId) + + if self.getServer().supportsFeature("allPartsStreamSelection"): + path = path + "&allParts=1" + + request = plexrequest.PlexRequest(self.getServer(), path, "PUT") + + if _async: + context = request.createRequestContext("ignored") + from . import plexapp + util.APP.startRequest(request, context, "") + else: + request.postToStringWithTimeout() + + matching = plexstream.NoneStream() + + # Update any affected streams + for stream in self.streams: + if stream.streamType.asInt() == streamType: + if stream.id == streamId: + stream.setSelected(True) + matching = stream + elif stream.isSelected(): + stream.setSelected(False) + + return matching + + def isIndexed(self): + return bool(self.indexes) + + def getIndexUrl(self, indexKey): + path = self.getIndexPath(indexKey) + if path is not None: + return self.container.server.buildUrl(path + "?interval=10000", True) + else: + return None + + def getIndexPath(self, indexKey, interval=None): + if self.indexes is not None and indexKey in self.indexes: + return "/library/parts/{0}/indexes/{1}".format(self.id, indexKey) + else: + return None + + def hasStreams(self): + return bool(self.streams) + + def __str__(self): + return "PlexPart {0} {1}".format(self.id("NaN"), self.key) + + def __eq__(self, other): + if other is None: + return False + + if self.__class__ != other.__class__: + return False + + return self.id == other.id + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return self.__str__() + + # TODO(schuyler): getStreams, getIndexThumbUrl diff --git a/script.plexmod/lib/_included_packages/plexnet/plexplayer.py b/script.plexmod/lib/_included_packages/plexnet/plexplayer.py new file mode 100644 index 000000000..e90a01025 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexplayer.py @@ -0,0 +1,934 @@ +from __future__ import absolute_import +import re +from . import util +from . import captions +from . import http +from . import plexrequest +from . import mediadecisionengine +from . import serverdecision +from lib.util import CACHE_SIZE, advancedSettings, KODI_VERSION_MAJOR + +from six.moves import range + +DecisionFailure = serverdecision.DecisionFailure + + +class PlexPlayer(object): + DECISION_ENDPOINT = "/video/:/transcode/universal/decision" + + def __init__(self, item, seekValue=0, forceUpdate=False): + self.decision = None + self.seekValue = seekValue + self.metadata = None + self.init(item, forceUpdate) + + def init(self, item, forceUpdate=False): + self.item = item + self.choice = mediadecisionengine.MediaDecisionEngine().chooseMedia(item, forceUpdate=forceUpdate) + if self.choice: + self.media = self.choice.media + + def terminate(self, code, reason): + util.LOG('TERMINATE PLAYER: ({0}, {1})'.format(code, reason)) + # TODO: Handle this? ---------------------------------------------------------------------------------------------------------- TODO + + @property + def audioChannels(self): + """ + Parse Kodi channel setting into channel count + """ + channelDef = self.item.settings.getGlobal("audioChannels", "2.0") + major, minor = channelDef.split(".") if "." in channelDef else (channelDef, 0) + return int(major) + int(minor) + + def rebuild(self, item, decision=None): + # item.settings = self.item.settings + oldChoice = self.choice + self.init(item, True) + util.LOG("Replacing '{0}' with '{1}' and rebuilding.".format(oldChoice, self.choice)) + self.build() + self.decision = decision + + def build(self, forceTranscode=False): + if self.item.settings.getPreference("playback_directplay", True): + directPlayPref = self.item.settings.getPreference("playback_directplay_force", False) and 'forced' or 'allow' + else: + directPlayPref = 'disabled' + + if forceTranscode or directPlayPref == "disabled" or self.choice.hasBurnedInSubtitles is True: + directPlay = False + else: + directPlay = directPlayPref == "forced" and True or None + + return self._build(directPlay, self.item.settings.getPreference("playback_remux", True)) + + def _build(self, directPlay=None, directStream=True, currentPartIndex=None): + isForced = directPlay is not None + if isForced: + util.LOG(directPlay and "Forced Direct Play" or "Forced Transcode; allowDirectStream={0}".format(directStream)) + + directPlay = False if directPlay is False else self.choice.isDirectPlayable + + server = self.item.getServer() + + # A lot of our content metadata is independent of the direct play decision. + # Add that first. + + obj = util.AttributeDict() + obj.duration = self.media.duration.asInt() + + videoRes = self.media.getVideoResolution() + obj.fullHD = videoRes >= 1080 + obj.streamQualities = (videoRes >= 480 and self.item.settings.getGlobal("IsHD")) and ["HD"] or ["SD"] + + frameRate = self.media.videoFrameRate or "24p" + if frameRate == "24p": + obj.frameRate = 24 + elif frameRate == "NTSC": + obj.frameRate = 30 + + # Add soft subtitle info + if self.choice.subtitleDecision == self.choice.SUBTITLES_SOFT_ANY: + obj.subtitleUrl = server.buildUrl(self.choice.subtitleStream.getSubtitlePath(), True) + elif self.choice.subtitleDecision == self.choice.SUBTITLES_SOFT_DP: + obj.subtitleConfig = {'TrackName': "mkv/" + str(self.choice.subtitleStream.index.asInt() + 1)} + + # Create one content metadata object for each part and store them as a + # linked list. We probably want a doubly linked list, except that it + # becomes a circular reference nuisance, so we make the current item the + # base object and singly link in each direction from there. + + baseObj = obj + prevObj = None + startOffset = 0 + + startPartIndex = currentPartIndex or 0 + for partIndex in range(startPartIndex, len(self.media.parts)): + isCurrentPart = (currentPartIndex is not None and partIndex == currentPartIndex) + partObj = util.AttributeDict() + partObj.update(baseObj) + + partObj.live = False + partObj.partIndex = partIndex + partObj.startOffset = startOffset + + part = self.media.parts[partIndex] + + partObj.partDuration = part.duration.asInt() + partObj.path = str(part.file) + partObj.size = part.size and int(part.size) or '' + + if part.isIndexed(): + partObj.sdBifPath = part.getIndexPath("sd") + partObj.hdBifPath = part.getIndexPath("hd") + + # We have to evaluate every part before playback. Normally we'd expect + # all parts to be identical, but in reality they can be different. + + if partIndex > 0 and (not isForced and directPlay or not isCurrentPart): + choice = mediadecisionengine.MediaDecisionEngine().evaluateMediaVideo(self.item, self.media, partIndex) + canDirectPlay = (choice.isDirectPlayable is True) + else: + canDirectPlay = directPlay + + if canDirectPlay: + partObj = self.buildDirectPlay(partObj, partIndex) + else: + transcodeServer = self.item.getTranscodeServer(True, "video") + if transcodeServer is None: + return None + partObj = self.buildTranscode(transcodeServer, partObj, partIndex, directStream, isCurrentPart) + + # Set up our linked list references. If we couldn't build an actual + # object: fail fast. Otherwise, see if we're at our start offset + # yet in order to decide if we need to link forwards or backwards. + # We also need to account for parts missing a duration, by verifying + # the prevObj is None or if the startOffset has incremented. + + if partObj is None: + obj = None + break + elif prevObj is None or (startOffset > 0 and int(self.seekValue / 1000) >= startOffset): + obj = partObj + partObj.prevObj = prevObj + elif prevObj is not None: + prevObj.nextPart = partObj + + startOffset = startOffset + int(part.duration.asInt() / 1000) + + prevObj = partObj + + # Only set PlayStart for the initial part, and adjust for the part's offset + if obj is not None: + if obj.live: + # Start the stream at the end. Per Roku, this can be achieved using + # a number higher than the duration. Using the current time should + # ensure it's definitely high enough. + + obj.playStart = util.now() + 1800 + else: + obj.playStart = int(self.seekValue / 1000) - obj.startOffset + + self.metadata = obj + + util.LOG("Constructed video item for playback: {0}".format(dict(obj))) + + return self.metadata + + @property + def startOffset(self): + return self.metadata and self.metadata.startOffset or 0 + + def offsetIsValid(self, offset_seconds): + return self.metadata.startOffset <= offset_seconds < self.metadata.startOffset + (self.metadata.partDuration / 1000) + + def isLiveHls(url=None, headers=None): + # Check to see if this is a live HLS playlist to fix two issues. One is a + # Roku workaround since it doesn't obey the absence of EXT-X-ENDLIST to + # start playback at the END of the playlist. The second is for us to know + # if it's live to modify the functionality and player UI. + + # if IsString(url): + # request = createHttpRequest(url, "GET", true) + # AddRequestHeaders(request.request, headers) + # response = request.GetToStringWithTimeout(10) + + # ' Inspect one of the media playlist streams if this is a master playlist. + # if response.instr("EXT-X-STREAM-INF") > -1 then + # Info("Identify live HLS: inspecting the master playlist") + # mediaUrl = CreateObject("roRegex", "(^https?://.*$)", "m").Match(response)[1] + # if mediaUrl <> invalid then + # request = createHttpRequest(mediaUrl, "GET", true) + # AddRequestHeaders(request.request, headers) + # response = request.GetToStringWithTimeout(10) + # end if + # end if + + # isLiveHls = (response.Trim().Len() > 0 and response.instr("EXT-X-ENDLIST") = -1 and response.instr("EXT-X-STREAM-INF") = -1) + # Info("Identify live HLS: live=" + isLiveHls.toStr()) + # return isLiveHls + + return False + + def getServerDecision(self): + directPlay = not (self.metadata and self.metadata.isTranscoded) + decisionPath = self.getDecisionPath(directPlay) + newDecision = None + + if decisionPath: + server = self.metadata.transcodeServer or self.item.getServer() + request = plexrequest.PlexRequest(server, decisionPath) + response = request.getWithTimeout(10) + + if response.isSuccess() and response.container: + decision = serverdecision.ServerDecision(self, response, self) + + if decision.isSuccess(): + util.LOG("MDE: Server was happy with client's original decision. {0}".format(decision)) + return self + elif decision.isDecision(True): + util.WARN_LOG("MDE: Server was unhappy with client's original decision. {0}".format(decision)) + return decision.getDecision() + else: + util.LOG("MDE: Server was unbiased about the decision. {0}".format(decision)) + + # Check if the server has provided a new media item to use it. If + # there is no item, then we'll continue along as if there was no + # decision made. + newDecision = decision.getDecision(False) + else: + util.WARN_LOG("MDE: Server failed to provide a decision") + else: + util.WARN_LOG("MDE: Server or item does not support decisions") + + return newDecision or self + + def getDecisionPath(self, directPlay=False): + if not self.item or not self.metadata: + return None + + decisionPath = self.metadata.decisionPath + if not decisionPath: + server = self.metadata.transcodeServer or self.item.getServer() + decisionPath = self.buildTranscode(server, util.AttributeDict(), self.metadata.partIndex, True, False).decisionPath + + # Modify the decision params based on the transcode url + if decisionPath: + if directPlay: + decisionPath = decisionPath.replace("directPlay=0", "directPlay=1") + + # Clear all subtitle parameters and add the a valid subtitle type based + # on the video player. This will let the server decide if it can supply + # sidecar subs, burn or embed w/ an optional transcode. + for key in ("subtitles", "advancedSubtitles"): + decisionPath = re.sub('([?&]{0}=)\w+'.format(key), '', decisionPath) + subType = 'sidecar' # AppSettings().getBoolPreference("custom_video_player"), "embedded", "sidecar") + decisionPath = http.addUrlParam(decisionPath, "subtitles=" + subType) + + # Global variables for all decisions + # Kodi default is 20971520 (20MB) + decisionPath = http.addUrlParam(decisionPath, + "mediaBufferSize={}".format(str(CACHE_SIZE * 1024))) + decisionPath = http.addUrlParam(decisionPath, "hasMDE=1") + + if not advancedSettings.oldprofile: + decisionPath = http.addUrlParam(decisionPath, 'X-Plex-Client-Profile-Name=Generic') + else: + decisionPath = http.addUrlParam(decisionPath, 'X-Plex-Client-Profile-Name=Chrome') + + return decisionPath + + def getTranscodeReason(self): + # Combine the server and local MDE decisions + obj = [] + if self.decision: + obj.append(self.decision.getDecisionText()) + if self.item: + obj.append(self.item.transcodeReason) + reason = ' '.join(obj) + if not reason: + return None + + return reason + + def buildTranscodeHls(self, obj): + util.DEBUG_LOG('buildTranscodeHls()') + obj.streamFormat = "hls" + obj.streamBitrates = [0] + obj.switchingStrategy = "no-adaptation" + obj.transcodeEndpoint = "/video/:/transcode/universal/start.m3u8" + + builder = http.HttpRequest(obj.transcodeServer.buildUrl(obj.transcodeEndpoint, True)) + builder.extras = [] + builder.addParam("protocol", "hls") + + # TODO: This should be Generic, but will need to re-evaluate the augmentations with that change + if not advancedSettings.oldprofile: + builder.addParam("X-Plex-Client-Profile-Name", "Generic") + else: + builder.addParam("X-Plex-Client-Profile-Name", "Chrome") + + if self.choice.subtitleDecision == self.choice.SUBTITLES_SOFT_ANY: + builder.addParam("skipSubtitles", "1") + else: # elif self.choice.hasBurnedInSubtitles is True: # Must burn transcoded because we can't set offset + captionSize = captions.CAPTIONS.getBurnedSize() + if captionSize is not None: + builder.addParam("subtitleSize", captionSize) + + # Augment the server's profile for things that depend on the Roku's configuration. + if self.item.settings.supportsAudioStream("ac3", 6): + builder.extras.append("append-transcode-target-audio-codec(type=videoProfile&context=streaming&protocol=hls&audioCodec=ac3)") + if not advancedSettings.oldprofile: + builder.extras.append("add-direct-play-profile(type=videoProfile&container=mkv&videoCodec=*&audioCodec=ac3)") + else: + builder.extras.append( + "add-direct-play-profile(type=videoProfile&container=matroska&videoCodec=*&audioCodec=ac3)") + + return builder + + def buildTranscodeMkv(self, obj, directStream=True): + util.DEBUG_LOG('buildTranscodeMkv()') + obj.streamFormat = "mkv" + obj.streamBitrates = [0] + obj.transcodeEndpoint = "/video/:/transcode/universal/start.mkv" + + builder = http.HttpRequest(obj.transcodeServer.buildUrl(obj.transcodeEndpoint, True)) + builder.extras = [] + builder.addParam("protocol", "http") + builder.addParam("copyts", "1") + if not advancedSettings.oldprofile: + builder.addParam("X-Plex-Client-Profile-Name", "Generic") + else: + builder.addParam("X-Plex-Client-Profile-Name", "Chrome") + + obj.subtitleUrl = None + + clampToOrig = self.item.settings.getPreference("audio_clamp_to_orig", True) + useKodiAudio = self.item.settings.getPreference("audio_channels_kodi", False) + AC3Cond = self.item.settings.getPreference("audio_force_ac3_cond", 'never') + dtsIsAC3 = self.item.settings.getPreference("audio_ac3dts", True) + hasAudioChoice = self.choice.audioStream is not None + forceAC3 = AC3Cond != 'never' + + ach = None + if AC3Cond in ('2', '5'): + ach = int(AC3Cond) + + # fixme: still necessary? + if self.choice.subtitleDecision == self.choice.SUBTITLES_BURN: + builder.addParam("subtitles", "burn") + captionSize = captions.CAPTIONS.getBurnedSize() + if captionSize is not None: + builder.addParam("subtitleSize", captionSize) + + else: + # TODO(rob): can we safely assume the id will also be 3 (one based index). + # If not, we will have to get tricky and select the subtitle stream after + # video playback starts via roCaptionRenderer: GetSubtitleTracks() and + # ChangeSubtitleTrack() + + obj.subtitleConfig = {'TrackName': "mkv/3" if hasAudioChoice else "mkv/2"} + + # Allow text conversion of subtitles if we only burn image formats + #if self.item.settings.getPreference("burn_subtitles") == "image": + if not self.item.settings.getPreference("burn_ssa", True): + builder.addParam("advancedSubtitles", "text") + + builder.addParam("subtitles", "auto") + + if not forceAC3: + if directStream: + audioCodecs = "eac3,ac3,dca,aac,mp3,mp2,pcm,flac,alac,wmav2,wmapro,wmavoice,opus,vorbis,truehd" + else: + audioCodecs = "mp3,ac3,dca,aac,opus" + else: + if dtsIsAC3: + audioCodecs = "ac3,dca" + else: + audioCodecs = "ac3" + + subtitleCodecs = "srt,ssa,ass,mov_text,tx3g,ttxt,text,pgs,vobsub,smi,subrip,eia_608_embedded," \ + "eia_708_embedded,dvb_subtitle" + (",webvtt" if KODI_VERSION_MAJOR > 19 else '') + + + util.LOG('MDE-prep: enabling codecs: {}'.format(audioCodecs)) + + # Allow virtually anything in Kodi playback. + + # DP might not do anything here + # builder.extras.append( + # "add-direct-play-profile(type=videoProfile&videoCodec=" + # "h264,mpeg1video,mpeg2video,mpeg4,msmpeg4v2,msmpeg4v3,vc1,wmv3&container=*&" + # "audioCodec="+audioCodecs+"&protocol=http)") + + builder.extras.append( + "add-transcode-target(type=videoProfile&videoCodec=" + "h264,mpeg1video,mpeg2video,mpeg4,msmpeg4v2,msmpeg4v3,vc1,wmv3&container=mkv&" + "audioCodec={}&subtitleCodec={}&protocol=http&context=streaming)".format(audioCodecs, subtitleCodecs)) + + # builder.extras.append( + # "append-transcode-target-audio-codec(type=videoProfile&context=streaming&protocol=http&audioCodec=" + + # audioCodecs + ")") + + # if self.item.settings.supportsSurroundSound(): + # if self.choice.audioStream is not None: + # numChannels = self.choice.audioStream.channels.asInt(8) + # else: + # numChannels = 8 + # + # for codec in ("ac3", "eac3", "dca"): + # if self.item.settings.supportsAudioStream(codec, numChannels): + # builder.extras.append("append-transcode-target-audio-codec(type=videoProfile&context=streaming&protocol=http&audioCodec=" + codec + ")") + # builder.extras.append("add-direct-play-profile(type=videoProfile&videoCodec=*&container=mkv&audioCodec=" + codec + ")") + # if codec == "dca": + # builder.extras.append( + # "add-limitation(scope=videoAudioCodec&scopeName=dca&type=upperBound&name=audio.channels&value=8&isRequired=false)" + # ) + # + # for codec in ("ac3", "eac3", "dca"): + # builder.extras.append("append-transcode-target-audio-codec(type=videoProfile&context=streaming&protocol=http&audioCodec=" + codec + ")") + # builder.extras.append("add-direct-play-profile(type=videoProfile&videoCodec=*&container=mkv&audioCodec=" + codec + ")") + + util.LOG('MDE-prep: settings: clampOrig: {}, kodiAudio: {}, forceAC3: {}, dtsIsAC3: {}' + .format(clampToOrig, useKodiAudio, forceAC3, dtsIsAC3)) + + # limit audio channels to original stream's audio channel amount + numChannels = self.choice.audioStream.channels.asInt(8) if hasAudioChoice and \ + self.choice.audioStream.channels else 8 + + # limit OPUS to 334kbit + if numChannels == 8: + # 7.1 + opusBitrate = 334 + elif numChannels >= 6: + # 5.1 + opusBitrate = 256 + else: + # 2 + opusBitrate = 128 + + # limit max audio channels to audio stream or kodi (whichever is lower) + maxAudioChannels = numChannels if not useKodiAudio else min(numChannels, self.audioChannels) + + # if we've got a channel limit for AC3/DTS, apply it + maxAudioChannels = maxAudioChannels if not ach else min(maxAudioChannels, ach) + + if forceAC3 and hasAudioChoice: + # limit max audio channels to the above or 6 for AC3 (whichever is lower) + if self.choice.audioStream.codec != "dca": + maxAudioChannels = min(6, maxAudioChannels) + else: + # allow DTS 6.1 ES + maxAudioChannels = min(7, maxAudioChannels) + + streamWasAC3 = hasAudioChoice and self.choice.audioStream.codec == "ac3" + + if not forceAC3 and hasAudioChoice: + # limit audio bitrate to the same bitrate as the current stream's codec + if clampToOrig and self.choice.audioStream.bitrate: + util.LOG('MDE-prep: limiting {} to {} kbit'.format(self.choice.audioStream.codec.upper(), + self.choice.audioStream.bitrate)) + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName={}&" + "type=upperBound&name=audio.bitrate&value={})".format( + self.choice.audioStream.codec, + self.choice.audioStream.bitrate + ) + ) + + # limit OPUS bitrate + if hasAudioChoice and self.choice.audioStream.codec != "opus": + util.LOG('MDE-prep: limiting OPUS bitrate to {} kbit'.format(opusBitrate)) + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName=opus&type=upperBound&name=audio.bitrate&" + "value={}&isRequired=false)".format(opusBitrate) + ) + + # limit AC3 + if not streamWasAC3 or forceAC3: + util.LOG('MDE-prep: limiting AC3 to 640 kbit') + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName=ac3&type=upperBound&name=audio.bitrate&value=640)" + ) + + util.LOG('MDE-prep: limiting audio channels to {}'.format(maxAudioChannels)) + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName=*&type=upperBound&" + "name=audio.channels&value={})".format(maxAudioChannels) + ) + + # AAC sample rate cannot be less than 22050hz (HLS is capable). + if self.choice.audioStream is not None and self.choice.audioStream.samplingRate.asInt(22050) < 22050: + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName=aac&type=lowerBound&" + "name=audio.samplingRate&value=22050&isRequired=false)") + + # HEVC + if self.item.settings.getPreference("allow_hevc", True): + builder.extras.append( + "append-transcode-target-codec(type=videoProfile&context=streaming&container=mkv&" + "protocol=http&videoCodec=hevc)") + # builder.extras.append( + # "add-direct-play-profile(type=videoProfile&videoCodec=hevc&container=*&audioCodec=*)") + + # VP9 + if self.item.settings.getGlobal("vp9Support"): + builder.extras.append( + "append-transcode-target-codec(type=videoProfile&context=streaming&container=mkv&" + "protocol=http&videoCodec=vp9)") + # builder.extras.append( + # "add-direct-play-profile(type=videoProfile&videoCodec=vp9&container=*&audioCodec=*)") + + # AV1 + if self.item.settings.getPreference("allow_av1", False): + builder.extras.append( + "append-transcode-target-codec(type=videoProfile&context=streaming&container=mkv&" + "protocol=http&videoCodec=av1)") + # builder.extras.append( + # "add-direct-play-profile(type=videoProfile&videoCodec=av1&container=*&audioCodec=*)") + + return builder + + def buildTranscodeMkvLegacy(self, obj, directStream=True): + util.DEBUG_LOG('buildTranscodeMkvLegacy()') + obj.streamFormat = "mkv" + obj.streamBitrates = [0] + obj.transcodeEndpoint = "/video/:/transcode/universal/start.mkv" + + builder = http.HttpRequest(obj.transcodeServer.buildUrl(obj.transcodeEndpoint, True)) + builder.extras = [] + builder.addParam("protocol", "http") + builder.addParam("copyts", "1") + builder.addParam("X-Plex-Client-Profile-Name", "Generic") + + obj.subtitleUrl = None + + # fixme: still necessary? + if True: # if self.choice.subtitleDecision == self.choice.SUBTITLES_BURN: # Must burn transcoded because we can't set offset + builder.addParam("subtitles", "burn") + captionSize = captions.CAPTIONS.getBurnedSize() + if captionSize is not None: + builder.addParam("subtitleSize", captionSize) + + else: + # TODO(rob): can we safely assume the id will also be 3 (one based index). + # If not, we will have to get tricky and select the subtitle stream after + # video playback starts via roCaptionRenderer: GetSubtitleTracks() and + # ChangeSubtitleTrack() + + obj.subtitleConfig = {'TrackName': "mkv/3"} + + # Allow text conversion of subtitles if we only burn image formats + if self.item.settings.getPreference("burn_subtitles") == "image": + builder.addParam("advancedSubtitles", "text") + + builder.addParam("subtitles", "auto") + + if directStream: + audioCodecs = "eac3,ac3,dca,aac,mp3,mp2,pcm,flac,alac,wmav2,wmapro,wmavoice,opus,vorbis,truehd" + else: + audioCodecs = "mp3,ac3,aac,opus" + + # Allow virtually anything in Kodi playback. + + # DP might not do anything here + # builder.extras.append( + # "add-direct-play-profile(type=videoProfile&videoCodec=" + # "h264,mpeg1video,mpeg2video,mpeg4,msmpeg4v2,msmpeg4v3,vc1,wmv3&container=*&" + # "audioCodec="+audioCodecs+"&protocol=http)") + + builder.extras.append( + "add-transcode-target(type=videoProfile&videoCodec=" + "h264,mpeg1video,mpeg2video,mpeg4,msmpeg4v2,msmpeg4v3,vc1,wmv3&container=mkv&" + "audioCodec="+audioCodecs+"&protocol=http&context=streaming)") + + # builder.extras.append( + # "append-transcode-target-audio-codec(type=videoProfile&context=streaming&protocol=http&audioCodec=" + + # audioCodecs + ")") + + # if self.item.settings.supportsSurroundSound(): + # if self.choice.audioStream is not None: + # numChannels = self.choice.audioStream.channels.asInt(8) + # else: + # numChannels = 8 + # + # for codec in ("ac3", "eac3", "dca"): + # if self.item.settings.supportsAudioStream(codec, numChannels): + # builder.extras.append("append-transcode-target-audio-codec(type=videoProfile&context=streaming&protocol=http&audioCodec=" + codec + ")") + # builder.extras.append("add-direct-play-profile(type=videoProfile&videoCodec=*&container=mkv&audioCodec=" + codec + ")") + # if codec == "dca": + # builder.extras.append( + # "add-limitation(scope=videoAudioCodec&scopeName=dca&type=upperBound&name=audio.channels&value=8&isRequired=false)" + # ) + # + # for codec in ("ac3", "eac3", "dca"): + # builder.extras.append("append-transcode-target-audio-codec(type=videoProfile&context=streaming&protocol=http&audioCodec=" + codec + ")") + # builder.extras.append("add-direct-play-profile(type=videoProfile&videoCodec=*&container=mkv&audioCodec=" + codec + ")") + + # limit OPUS to 334kbit + numChannels = self.choice.audioStream.channels.asInt(8) if self.choice.audioStream else 8 + + if numChannels == 8: + # 7.1 + opusBitrate = 334 + elif numChannels >= 6: + # 5.1 + opusBitrate = 256 + else: + # 2 + opusBitrate = 128 + + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName=opus&type=upperBound&name=audio.bitrate&" + "value={}&isRequired=false)".format(opusBitrate) + ) + + # limit AC3 + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName=ac3&type=upperBound&name=audio.bitrate&value=640)" + ) + + # limit audio to Kodi audio channels + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName=*&type=upperBound&" + "name=audio.channels&value={})".format(self.audioChannels) + ) + + # AAC sample rate cannot be less than 22050hz (HLS is capable). + if self.choice.audioStream is not None and self.choice.audioStream.samplingRate.asInt(22050) < 22050: + builder.extras.append( + "add-limitation(scope=videoAudioCodec&scopeName=aac&type=lowerBound&" + "name=audio.samplingRate&value=22050&isRequired=false)") + + # HEVC + if self.item.settings.getPreference("allow_hevc", True): + builder.extras.append( + "append-transcode-target-codec(type=videoProfile&context=streaming&container=mkv&" + "protocol=http&videoCodec=hevc)") + # builder.extras.append( + # "add-direct-play-profile(type=videoProfile&videoCodec=hevc&container=*&audioCodec=*)") + + # VP9 + if self.item.settings.getGlobal("vp9Support"): + builder.extras.append( + "append-transcode-target-codec(type=videoProfile&context=streaming&container=mkv&" + "protocol=http&videoCodec=vp9)") + # builder.extras.append( + # "add-direct-play-profile(type=videoProfile&videoCodec=vp9&container=*&audioCodec=*)") + + # AV1 + if self.item.settings.getPreference("allow_av1", False): + builder.extras.append( + "append-transcode-target-codec(type=videoProfile&context=streaming&container=mkv&" + "protocol=http&videoCodec=av1)") + # builder.extras.append( + # "add-direct-play-profile(type=videoProfile&videoCodec=av1&container=*&audioCodec=*)") + + return builder + + def buildDirectPlay(self, obj, partIndex): + util.DEBUG_LOG('buildDirectPlay()') + part = self.media.parts[partIndex] + + server = self.item.getServer() + + # Check if we should include our token or not for this request + obj.isRequestToServer = server.isRequestToServer(server.buildUrl(part.getAbsolutePath("key"))) + obj.streamUrls = [server.buildUrl(part.getAbsolutePath("key"), obj.isRequestToServer)] + obj.token = obj.isRequestToServer and server.getToken() or None + if self.media.protocol == "hls": + obj.streamFormat = "hls" + obj.switchingStrategy = "full-adaptation" + obj.live = self.isLiveHLS(obj.streamUrls[0], self.media.indirectHeaders) + else: + obj.streamFormat = self.media.get('container', 'mp4') + if obj.streamFormat == "mov" or obj.streamFormat == "m4v": + obj.streamFormat = "mp4" + + obj.streamBitrates = [self.media.bitrate.asInt()] + obj.isTranscoded = False + + if self.choice.audioStream is not None: + obj.audioLanguageSelected = self.choice.audioStream.languageCode + + return obj + + def hasMoreParts(self): + return (self.metadata is not None and self.metadata.nextPart is not None) + + def getNextPartOffset(self): + return self.metadata.nextPart.startOffset * 1000 + + def goToNextPart(self): + oldPart = self.metadata + if oldPart is None: + return + + newPart = oldPart.nextPart + if newPart is None: + return + + newPart.prevPart = oldPart + oldPart.nextPart = None + self.metadata = newPart + + util.LOG("Next part set for playback: {0}".format(self.metadata)) + + def getBifUrl(self, offset=0): + server = self.item.getServer() + startOffset = 0 + for part in self.media.parts: + duration = part.duration.asInt() + if startOffset <= offset < startOffset + duration: + bifUrl = part.getIndexPath("hd") or part.getIndexPath("sd") + if bifUrl is not None: + url = server.buildUrl('{0}/{1}'.format(bifUrl, offset - startOffset), True) + return url + + startOffset += duration + + return None + + def buildTranscode(self, server, obj, partIndex, directStream, isCurrentPart): + util.DEBUG_LOG('buildTranscode()') + obj.transcodeServer = server + obj.isTranscoded = True + + # if server.supportsFeature("mkvTranscode") and self.item.settings.getPreference("transcode_format", 'mkv') != "hls": + if server.supportsFeature("mkvTranscode"): + if not advancedSettings.oldprofile: + builder = self.buildTranscodeMkv(obj, directStream=directStream) + else: + builder = self.buildTranscodeMkvLegacy(obj, directStream=directStream) + else: + builder = self.buildTranscodeHls(obj) + + if self.item.getServer().TYPE == 'MYPLEXSERVER': + path = server.swizzleUrl(self.item.getAbsolutePath("key")) + else: + path = self.item.getAbsolutePath("key") + + builder.addParam("path", path) + + part = self.media.parts[partIndex] + seekOffset = int(self.seekValue / 1000) + startOffset = obj.get("startOffset", 0) + + # Disabled for HLS due to a Roku bug plexinc/roku-client-issues#776 + if True: # obj.streamFormat == "mkv": + # Trust our seekOffset for this part if it's the current part (now playing) or + # the seekOffset is within the time frame. We have to trust the current part + # as we may have to rebuild the transcode when seeking, and not all parts + # have a valid duration. + + if isCurrentPart or len(self.media.parts) <= 1 or ( + seekOffset >= startOffset and seekOffset <= startOffset + int(part.duration.asInt() / 1000) + ): + startOffset = seekOffset - startOffset + + # Avoid a perfect storm of PMS and Roku quirks. If we pass an offset to + # the transcoder,: it'll start transcoding from that point. But if + # we try to start a few seconds into the video, the Roku seems to want + # to grab the first segment. The first segment doesn't exist, so PMS + # returns a 404 (but only if the offset is <= 12s, otherwise it returns + # a blank segment). If the Roku gets a 404 for the first segment,: + # it'll fail. So, if we're going to start playing from less than 12 + # seconds, don't bother telling the transcoder. It's not worth the + # potential failure, let it transcode from the start so that the first + # segment will always exist. + + # TODO: Probably can remove this (Rick) + if startOffset <= 12: + startOffset = 0 + else: + startOffset = 0 + + builder.addParam("offset", str(startOffset)) + + builder.addParam("session", self.item.settings.getGlobal("clientIdentifier")) + builder.addParam("directStream", directStream and "1" or "0") + builder.addParam("directPlay", "0") + + qualityIndex = self.item.settings.getQualityIndex(self.item.getQualityType(server)) + builder.addParam("videoQuality", self.item.settings.getGlobal("transcodeVideoQualities")[qualityIndex]) + builder.addParam("videoResolution", str(self.item.settings.getGlobal("transcodeVideoResolutions")[qualityIndex])) + builder.addParam("maxVideoBitrate", self.item.settings.getGlobal("transcodeVideoBitrates")[qualityIndex]) + + if self.media.mediaIndex is not None: + builder.addParam("mediaIndex", str(self.media.mediaIndex)) + + builder.addParam("partIndex", str(partIndex)) + + # Augment the server's profile for things that depend on the Roku's configuration. + if self.item.settings.getPreference("h264_level", "auto") != "auto": + builder.extras.append( + "add-limitation(scope=videoCodec&scopeName=h264&type=upperBound&name=video.level&value={0}&isRequired=true)".format( + self.item.settings.getPreference("h264_level") + ) + ) + + if not self.item.settings.getGlobal("supports1080p60") and self.item.settings.getGlobal("transcodeVideoResolutions")[qualityIndex][0] >= 1920: + builder.extras.append("add-limitation(scope=videoCodec&scopeName=h264&type=upperBound&name=video.frameRate&value=30&isRequired=false)") + + if builder.extras: + builder.addParam("X-Plex-Client-Profile-Extra", '+'.join(builder.extras)) + + if server.isLocalConnection(): + builder.addParam("location", "lan") + + obj.streamUrls = [builder.getUrl()] + + # Build the decision path now that we have build our stream url, and only if the server supports it. + if server.supportsFeature("streamingBrain"): + decisionPath = builder.getRelativeUrl().replace(obj.transcodeEndpoint, self.DECISION_ENDPOINT) + if decisionPath.startswith(self.DECISION_ENDPOINT): + obj.decisionPath = decisionPath + + return obj + + +class PlexAudioPlayer(object): + def __init__(self, item): + self.containerFormats = { + 'aac': "es.aac-adts" + } + + self.item = item + self.choice = mediadecisionengine.MediaDecisionEngine().chooseMedia(item) + if self.choice: + self.media = self.choice.media + self.lyrics = None # createLyrics(item, self.media) + + def build(self, directPlay=None): + directPlay = directPlay or self.choice.isDirectPlayable + + obj = util.AttributeDict() + + # TODO(schuyler): Do we want/need to add anything generic here? Title? Duration? + + if directPlay: + obj = self.buildDirectPlay(obj) + else: + obj = self.buildTranscode(obj) + + self.metadata = obj + + util.LOG("Constructed audio item for playback: {0}".format(dict(obj))) + + return self.metadata + + def buildTranscode(self, obj): + transcodeServer = self.item.getTranscodeServer(True, "audio") + if not transcodeServer: + return None + + obj.streamFormat = "mp3" + obj.isTranscoded = True + obj.transcodeServer = transcodeServer + obj.transcodeEndpoint = "/music/:/transcode/universal/start.m3u8" + + builder = http.HttpRequest(transcodeServer.buildUrl(obj.transcodeEndpoint, True)) + # builder.addParam("protocol", "http") + builder.addParam("path", self.item.getAbsolutePath("key")) + builder.addParam("session", self.item.getGlobal("clientIdentifier")) + builder.addParam("directPlay", "0") + builder.addParam("directStream", "0") + + obj.url = builder.getUrl() + + return obj + + def buildDirectPlay(self, obj): + if self.choice.part: + obj.url = self.item.getServer().buildUrl(self.choice.part.getAbsolutePath("key"), True) + + # Set and override the stream format if applicable + obj.streamFormat = self.choice.media.get('container', 'mp3') + if self.containerFormats.get(obj.streamFormat): + obj.streamFormat = self.containerFormats[obj.streamFormat] + + # If we're direct playing a FLAC, bitrate can be required, and supposedly + # this is the only way to do it. plexinc/roku-client#48 + # + bitrate = self.choice.media.bitrate.asInt() + if bitrate > 0: + obj.streams = [{'url': obj.url, 'bitrate': bitrate}] + + return obj + + # We may as well fallback to transcoding if we could not direct play + return self.buildTranscode(obj) + + def getLyrics(self): + return self.lyrics + + def hasLyrics(self): + return False + return self.lyrics.isAvailable() + + +class PlexPhotoPlayer(object): + def __init__(self, item): + self.item = item + self.choice = item + self.media = item.media()[0] + self.metadata = None + + def build(self, item=None): + item = item or self.item + media = item.media()[0] + if media.parts and media.parts[0]: + obj = util.AttributeDict() + + part = media.parts[0] + path = part.key or part.thumb + server = item.getServer() + + obj.url = server.buildUrl(path, True) + obj.enableBlur = server.supportsPhotoTranscoding + + util.DEBUG_LOG("Constructed photo item for playback: {0}".format(dict(obj))) + + self.metadata = obj + + return self.metadata diff --git a/script.plexmod/lib/_included_packages/plexnet/plexrequest.py b/script.plexmod/lib/_included_packages/plexnet/plexrequest.py new file mode 100644 index 000000000..764ae1d58 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexrequest.py @@ -0,0 +1,46 @@ +from __future__ import absolute_import +from xml.etree import ElementTree + +from . import plexserver +from . import plexresult +from . import http +from . import util + + +class PlexRequest(http.HttpRequest): + def __init__(self, server, path, method=None): + server = server or plexserver.dummyPlexServer() + + http.HttpRequest.__init__(self, server.buildUrl(path, includeToken=True), method) + + self.server = server + self.path = path + + util.addPlexHeaders(self, server.getToken()) + + def onResponse(self, event, context): + if context.get('completionCallback'): + result = plexresult.PlexResult(self.server, self.path) + result.setResponse(event) + context['completionCallback'](self, result, context) + + def doRequestWithTimeout(self, timeout=10, postBody=None): + # non async request/response + if postBody: + data = ElementTree.fromstring(self.postToStringWithTimeout(postBody, timeout)) + else: + data = ElementTree.fromstring(self.getToStringWithTimeout(timeout)) + + response = plexresult.PlexResult(self.server, self.path) + response.setResponse(self.event) + response.parseFakeXMLResponse(data) + + return response + + +class PlexServerRequest(PlexRequest): + def onResponse(self, event, context): + if context.get('completionCallback'): + result = plexresult.PlexServerResult(self.server, self.path) + result.setResponse(event) + context['completionCallback'](self, result, context) diff --git a/script.plexmod/lib/_included_packages/plexnet/plexresource.py b/script.plexmod/lib/_included_packages/plexnet/plexresource.py new file mode 100644 index 000000000..11dd75f95 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexresource.py @@ -0,0 +1,231 @@ +from __future__ import absolute_import +from xml.etree import ElementTree + +from . import http +from . import exceptions +from . import plexobjects +from . import plexconnection +from . import util + +RESOURCES = 'https://plex.tv/api/resources?includeHttps=1' + + +class PlexResource(object): + def __init__(self, data): + self.connection = None + self.connections = [] + self.accessToken = None + self.sourceType = None + + if data is None: + return + + self.accessToken = data.attrib.get('accessToken') + self.httpsRequired = data.attrib.get('httpsRequired') == '1' + self.type = data.attrib.get('type') + self.clientIdentifier = data.attrib.get('clientIdentifier') + self.product = data.attrib.get('product') + self.provides = data.attrib.get('provides') + self.serverClass = data.attrib.get('serverClass') + self.sourceType = data.attrib.get('sourceType') + self.uuid = self.clientIdentifier + + hasSecureConn = False + + for conn in data.findall('Connection'): + if conn.attrib.get('protocol') == "https": + hasSecureConn = True + break + + addLocalConsFound = [] + for conn in data.findall('Connection'): + connection = plexconnection.PlexConnection( + plexconnection.PlexConnection.SOURCE_MYPLEX, + conn.attrib.get('uri'), + conn.attrib.get('local') == '1', + self.accessToken, + hasSecureConn and conn.attrib.get('protocol') != "https" + ) + + # Keep the secure connection on top + if connection.isSecure and not util.LOCAL_OVER_SECURE: + self.connections.insert(0, connection) + elif not connection.isSecure and util.LOCAL_OVER_SECURE: + self.connections.insert(0, connection) + else: + self.connections.append(connection) + + if connection.isSecureButLocal: + addLocalConsFound.append((connection.isSecureButLocal, connection.address)) + + # If the connection is one of our plex.direct secure connections, add + # the nonsecure variant as well, unless https is required. + # + if self.httpsRequired and conn.attrib.get('protocol') == "https" and conn.attrib.get('address') not in conn.attrib.get('uri'): + self.connections.append( + plexconnection.PlexConnection( + plexconnection.PlexConnection.SOURCE_MYPLEX, + "http://{0}:{1}".format(conn.attrib.get('address'), conn.attrib.get('port')), + conn.attrib.get('local') == '1', + self.accessToken, + True + ) + ) + + # add discovered local cons if necessary + for ipPort, origAddress in addLocalConsFound: + ip, port = ipPort + address = "http://" + ip + ":" + str(port) + for conn in self.connections: + if conn.address == address: + continue + + util.DEBUG_LOG( + "Secure connection {0} has a locally reachable IP, add it to the checklist".format(origAddress)) + lcon = plexconnection.PlexConnection( + plexconnection.PlexConnection.SOURCE_DISCOVERED, + "http://" + ip + ":" + str(port), + True, + self.accessToken, + not util.LOCAL_OVER_SECURE, + skipLocalCheck=True + ) + if util.LOCAL_OVER_SECURE: + self.connections.insert(0, lcon) + else: + self.connections.append(lcon) + + def __repr__(self): + return '<{0}:{1}>'.format(self.__class__.__name__, self.name.encode('utf8')) + + +class ResourceConnection(plexobjects.PlexObject): + # Constants + STATE_UNKNOWN = "unknown" + STATE_UNREACHABLE = "unreachable" + STATE_REACHABLE = "reachable" + STATE_UNAUTHORIZED = "unauthorized" + STATE_INSECURE = "insecure_untested" + + SOURCE_MANUAL = 1 + SOURCE_DISCOVERED = 2 + SOURCE_MYPLEX = 4 + + SCORE_REACHABLE = 4 + SCORE_LOCAL = 2 + SCORE_SECURE = 1 + + def init(self, data): + self.secure = True + self.reachable = False + self.data = None + + def __repr__(self): + return '<{0}:{1}>'.format(self.__class__.__name__, self.uri.encode('utf8')) + + @property + def http_uri(self): + return 'http://{0}:{1}'.format(self.address, self.port) + + @property + def URL(self): + if self.secure: + return self.uri + else: + return self.http_url + + def connect(self): + util.LOG('Connecting: {0}'.format(util.cleanToken(self.URL))) + try: + self.data = self.query('/') + self.reachable = True + return True + except Exception as err: + util.ERROR(util.cleanToken(self.URL), err) + + util.LOG('Connecting: Secure failed, trying insecure...') + self.secure = False + + try: + self.data = self.query('/') + self.reachable = True + return True + except Exception as err: + util.ERROR(util.cleanToken(self.URL), err) + + return False + + def headers(self, token=None): + headers = util.BASE_HEADERS.copy() + if token: + headers['X-Plex-Token'] = token + return headers + + def query(self, path, method=None, token=None, **kwargs): + method = method or http.requests.get + url = self.getURL(path) + util.LOG('{0} {1}'.format(method.__name__.upper(), url)) + response = method(url, headers=self.headers(token), timeout=util.TIMEOUT, **kwargs) + if response.status_code not in (200, 201): + codename = http.status_codes.get(response.status_code)[0] + raise exceptions.BadRequest('({0}) {1}'.format(response.status_code, codename)) + data = response.text.encode('utf8') + + return ElementTree.fromstring(data) if data else None + + def getURL(self, path, token=None): + if token: + delim = '&' if '?' in path else '?' + return '{base}{path}{delim}X-Plex-Token={token}'.format(base=self.URL, path=path, delim=delim, token=util.hideToken(token)) + return '{0}{1}'.format(self.URL, path) + + +class PlexResourceList(plexobjects.PlexItemList): + def __init__(self, data, initpath=None, server=None): + self._data = data + self.initpath = initpath + self._server = server + self._items = None + + @property + def items(self): + if self._items is None: + if self._data is not None: + self._items = [PlexResource(elem, initpath=self.initpath, server=self._server) for elem in self._data] + else: + self._items = [] + + return self._items + + +def fetchResources(token): + headers = util.BASE_HEADERS.copy() + headers['X-Plex-Token'] = token + util.LOG('GET {0}?X-Plex-Token={1}'.format(RESOURCES, util.hideToken(token))) + response = http.GET(RESOURCES) + data = ElementTree.fromstring(response.text.encode('utf8')) + from . import plexserver + return [plexserver.PlexServer(elem) for elem in data] + + +def findResource(resources, search, port=32400): + """ Searches server.name """ + search = search.lower() + util.LOG('Looking for server: {0}'.format(search)) + for server in resources: + if search == server.name.lower(): + util.LOG('Server found: {0}'.format(server)) + return server + util.LOG('Unable to find server: {0}'.format(search)) + raise exceptions.NotFound('Unable to find server: {0}'.format(search)) + + +def findResourceByID(resources, ID): + """ Searches server.clientIdentifier """ + util.LOG('Looking for server by ID: {0}'.format(ID)) + for server in resources: + if ID == server.clientIdentifier: + util.LOG('Server found by ID: {0}'.format(server)) + return server + util.LOG('Unable to find server by ID: {0}'.format(ID)) + raise exceptions.NotFound('Unable to find server by ID: {0}'.format(ID)) diff --git a/script.plexmod/lib/_included_packages/plexnet/plexresult.py b/script.plexmod/lib/_included_packages/plexnet/plexresult.py new file mode 100644 index 000000000..7d65d4f4b --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexresult.py @@ -0,0 +1,102 @@ +from __future__ import absolute_import +from . import http +from . import plexobjects + + +class PlexResult(http.HttpResponse): + def __init__(self, server, address): + self.server = server + self.address = address + self.container = None + self.parsed = None + self.items = [] + + def setResponse(self, event): + self.event = event + + def parseResponse(self): + if self.parsed: + return self.parsed + + self.parsed = False + + if self.isSuccess(): + data = self.getBodyXml() + if data is not None: + self.container = plexobjects.PlexContainer(data, initpath=self.address, server=self.server, address=self.address) + + for node in data: + self.addItem(self.container, node) + + self.parsed = True + + return self.parsed + + def parseFakeXMLResponse(self, data): + if self.parsed: + return self.parsed + + self.parsed = False + + if data is not None: + self.container = plexobjects.PlexContainer(data, initpath=self.address, server=self.server, address=self.address) + + for node in data: + self.addItem(self.container, node) + + self.parsed = True + + return self.parsed + + def addItem(self, container, node): + if node.attrib.get('type') in ('track', 'movie', 'episode', 'photo') and node.tag != 'PlayQueue': + item = plexobjects.buildItem(self.server, node, self.address, container=self.container) + else: + item = plexobjects.PlexObject(node, server=self.container.server, container=self.container) + + # TODO(rob): handle channel settings. We should be able to utilize + # the settings component with some modifications. + if not item.isSettings(): + self.items.append(item) + else: + # Decrement the size and total size if applicable + if self.container.get("size"): + self.container.size = plexobjects.PlexValue(str(self.container.size.asInt() - 1)) + if self.container.get("totalSize"): + self.container.totalSize = plexobjects.PlexValue(str(self.container.totalSize.asInt() - 1)) + + +class PlexServerResult(PlexResult): + def parseResponse(self): + if self.parsed: + return self.parsed + + self.parsed = False + + if self.isSuccess(): + data = self.getBodyXml() + if data is not None: + self.container = plexobjects.PlexServerContainer(data, initpath=self.address, server=self.server, address=self.address) + + for node in data: + self.addItem(self.container, node) + + self.parsed = True + + return self.parsed + + def parseFakeXMLResponse(self, data): + if self.parsed: + return self.parsed + + self.parsed = False + + if data is not None: + self.container = plexobjects.PlexServerContainer(data, initpath=self.address, server=self.server, address=self.address) + + for node in data: + self.addItem(self.container, node) + + self.parsed = True + + return self.parsed diff --git a/script.plexmod/lib/_included_packages/plexnet/plexserver.py b/script.plexmod/lib/_included_packages/plexnet/plexserver.py new file mode 100644 index 000000000..9bb4b6cd5 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexserver.py @@ -0,0 +1,700 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import time +import re +import json +import urllib3.exceptions + +from . import http +from . import util +from . import exceptions +from . import compat +from . import verlib + +from xml.etree import ElementTree +from . import signalsmixin +from . import plexobjects +from . import plexresource +from . import plexlibrary +from . import asyncadapter +from six.moves import range +# from plexapi.client import Client +# from plexapi.playqueue import PlayQueue + + +TOTAL_QUERIES = 0 +DEFAULT_BASEURI = 'http://localhost:32400' + + +class PlexServer(plexresource.PlexResource, signalsmixin.SignalsMixin): + TYPE = 'PLEXSERVER' + + def __init__(self, data=None): + signalsmixin.SignalsMixin.__init__(self) + plexresource.PlexResource.__init__(self, data) + self.accessToken = None + self.multiuser = False + self.isSupported = None + self.hasFallback = False + self.supportsAudioTranscoding = False + self.supportsVideoTranscoding = False + self.supportsPhotoTranscoding = False + self.supportsVideoRemuxOnly = False + self.supportsScrobble = True + self.allowsMediaDeletion = False + self.allowChannelAccess = False + self.activeConnection = None + self.serverClass = None + + self.pendingReachabilityRequests = 0 + self.pendingSecureRequests = 0 + + self.features = {} + self.librariesByUuid = {} + + self.server = self + self.session = http.Session() + + self.owner = None + self.owned = False + self.synced = False + self.sameNetwork = False + self.uuid = None + self.name = None + self.platform = None + self.versionNorm = None + self.rawVersion = None + self.transcodeSupport = False + + if data is None: + return + + self.owner = data.attrib.get('sourceTitle') + self.owned = data.attrib.get('owned') == '1' + self.synced = data.attrib.get('synced') == '1' + self.sameNetwork = data.attrib.get('publicAddressMatches') == '1' + self.uuid = data.attrib.get('clientIdentifier') + self.name = data.attrib.get('name') + self.platform = data.attrib.get('platform') + self.rawVersion = data.attrib.get('productVersion') + self.versionNorm = util.normalizedVersion(self.rawVersion) + self.transcodeSupport = data.attrib.get('transcodeSupport') == '1' + + def __eq__(self, other): + if not other: + return False + if self.__class__ != other.__class__: + + return False + return self.uuid == other.uuid and self.owner == other.owner + + def __ne__(self, other): + return not self.__eq__(other) + + def __str__(self): + return ""\ + .format(repr(self.name), self.owned, self.uuid, self.versionNorm, self.activeConnection) + + def __repr__(self): + return self.__str__() + + def close(self): + self.session.cancel() + + def get(self, attr, default=None): + return default + + @property + def isSecure(self): + if self.activeConnection: + return self.activeConnection.isSecure + + @property + def isLocal(self): + if self.activeConnection: + return self.activeConnection.isLocal + + def getObject(self, key): + data = self.query(key) + return plexobjects.buildItem(self, data[0], key, container=self) + + def hubs(self, section=None, count=None, search_query=None): + hubs = [] + + params = {"includeMarkers": 1} + if search_query: + q = '/hubs/search' + params['query'] = search_query.lower() + if section: + params['sectionId'] = section + + if count is not None: + params['limit'] = count + else: + q = '/hubs' + if section: + if section == 'playlists': + audio = plexlibrary.AudioPlaylistHub(False, server=self.server) + video = plexlibrary.VideoPlaylistHub(False, server=self.server) + if audio.items: + hubs.append(audio) + if video.items: + hubs.append(video) + return hubs + else: + q = '/hubs/sections/%s' % section + + if count is not None: + params['count'] = count + + data = self.query(q, params=params) + container = plexobjects.PlexContainer(data, initpath=q, server=self, address=q) + + for elem in data: + hubs.append(plexlibrary.Hub(elem, server=self, container=container)) + return hubs + + def playlists(self, start=0, size=10, hub=None): + try: + return plexobjects.listItems(self, '/playlists/all') + except exceptions.BadRequest: + return None + + @property + def library(self): + if self.platform == 'cloudsync': + return plexlibrary.Library(None, server=self) + else: + return plexlibrary.Library(self.query('/library/'), server=self) + + @property + def sessions(self): + if self.owned: + return plexobjects.listItems(self, '/status/sessions') + raise exceptions.ServerNotOwned + + def findVideoSession(self, client_id, rating_key): + for item in self.sessions: + if item.session and item.session.id == client_id and item.ratingKey == rating_key: + return item + + def buildUrl(self, path, includeToken=False): + if self.activeConnection: + return self.activeConnection.buildUrl(self, path, includeToken) + else: + util.WARN_LOG("Server connection is None, returning an empty url") + return "" + + def query(self, path, method=None, **kwargs): + method = method or self.session.get + + limit = kwargs.pop("limit", None) + params = kwargs.pop("params", None) + if params: + if limit is None: + limit = params.get("limit", None) + path += util.joinArgs(params, '?' not in path) + + offset = kwargs.pop("offset", None) + if kwargs: + path += util.joinArgs(kwargs, '?' not in path) + kwargs.clear() + + url = self.buildUrl(path, includeToken=True) + + # If URL is empty, try refresh resources and return empty set for now + if not url: + util.WARN_LOG("Empty server url, returning None and refreshing resources") + util.MANAGER.refreshResources(True) + return None + + # add offset/limit + offset = offset or 0 + + if limit is not None: + url = http.addUrlParam(url, "X-Plex-Container-Start=%s" % offset) + url = http.addUrlParam(url, "X-Plex-Container-Size=%s" % limit) + + util.LOG('{0} {1}'.format(method.__name__.upper(), re.sub('X-Plex-Token=[^&]+', 'X-Plex-Token=****', url))) + try: + response = method(url, **kwargs) + if response.status_code not in (200, 201): + codename = http.status_codes.get(response.status_code, ['Unknown'])[0] + raise exceptions.BadRequest('({0}) {1}'.format(response.status_code, codename)) + data = response.text.encode('utf8') + except asyncadapter.TimeoutException: + util.ERROR() + util.MANAGER.refreshResources(True) + return None + except (http.requests.ConnectionError, urllib3.exceptions.ProtocolError): + util.ERROR() + return None + except asyncadapter.CanceledException: + return None + + return ElementTree.fromstring(data) if data else None + + def getImageTranscodeURL(self, path, width, height, **extraOpts): + if not path: + return '' + + eOpts = {"minSize": 1, "upscale": 1} + eOpts.update(extraOpts) + + params = ("&width=%s&height=%s" % (width, height)) + ''.join(["&%s=%s" % (key, eOpts[key]) for key in eOpts]) + + if "://" in path: + imageUrl = self.convertUrlToLoopBack(path) + else: + imageUrl = "http://127.0.0.1:" + self.getLocalServerPort() + path + + path = "/photo/:/transcode?url=" + compat.quote_plus(imageUrl) + params + + # Try to use a better server to transcode for synced servers + if self.synced: + from . import plexservermanager + selectedServer = plexservermanager.MANAGER.getTranscodeServer("photo") + if selectedServer: + return selectedServer.buildUrl(path, True) + + if self.activeConnection: + return self.activeConnection.simpleBuildUrl(self, path) + else: + util.WARN_LOG("Server connection is None, returning an empty url") + return "" + + def isReachable(self, onlySupported=True): + if onlySupported and not self.isSupported: + return False + + return self.activeConnection and self.activeConnection.state == plexresource.ResourceConnection.STATE_REACHABLE + + def isLocalConnection(self): + return self.activeConnection and (self.sameNetwork or self.activeConnection.isLocal) + + def isRequestToServer(self, url): + if not self.activeConnection: + return False + + if ':' in self.activeConnection.address[8:]: + schemeAndHost = self.activeConnection.address.rsplit(':', 1)[0] + else: + schemeAndHost = self.activeConnection.address + + return url.startswith(schemeAndHost) + + def getToken(self): + # It's dangerous to use for each here, because it may reset the index + # on self.connections when something else was in the middle of an iteration. + + for i in range(len(self.connections)): + try: + conn = self.connections[i] + except IndexError: + continue + if conn.token: + return conn.token + + return None + + def getLocalServerPort(self): + # TODO(schuyler): The correct thing to do here is to iterate over local + # connections and pull out the port. For now, we're always returning 32400. + + return '32400' + + def collectDataFromRoot(self, data): + # Make sure we're processing data for our server, and not some other + # server that happened to be at the same IP. + if self.uuid != data.attrib.get('machineIdentifier'): + util.LOG("Got a reachability response, but from a different server") + return False + + self.serverClass = data.attrib.get('serverClass') + self.supportsAudioTranscoding = data.attrib.get('transcoderAudio') == '1' + self.supportsVideoTranscoding = data.attrib.get('transcoderVideo') == '1' or data.attrib.get('transcoderVideoQualities') + self.supportsVideoRemuxOnly = data.attrib.get('transcoderVideoRemuxOnly') == '1' + self.supportsPhotoTranscoding = data.attrib.get('transcoderPhoto') == '1' or ( + not data.attrib.get('transcoderPhoto') and not self.synced and not self.isSecondary() + ) + self.allowChannelAccess = data.attrib.get('allowChannelAccess') == '1' or ( + not data.attrib.get('allowChannelAccess') and self.owned and not self.synced and not self.isSecondary() + ) + self.supportsScrobble = not self.isSecondary() or self.synced + self.allowsMediaDeletion = not self.synced and self.owned and data.attrib.get('allowMediaDeletion') == '1' + self.multiuser = data.attrib.get('multiuser') == '1' + self.name = data.attrib.get('friendlyName') or self.name + self.platform = data.attrib.get('platform') + + # TODO(schuyler): Process transcoder qualities + + self.rawVersion = data.attrib.get('version') + if self.rawVersion: + self.versionNorm = util.normalizedVersion(self.rawVersion) + + features = { + 'mkvTranscode': '0.9.11.11', + 'themeTranscode': '0.9.14.0', + 'allPartsStreamSelection': '0.9.12.5', + 'claimServer': '0.9.14.2', + 'streamingBrain': '1.2.0' + } + + for f, v in features.items(): + if util.normalizedVersion(v) <= self.versionNorm: + self.features[f] = True + + appMinVer = util.INTERFACE.getGlobal('minServerVersionArr', '0.0.0.0') + self.isSupported = self.isSecondary() or util.normalizedVersion(appMinVer) <= self.versionNorm + + util.DEBUG_LOG("Server information updated from reachability check: {0}".format(self)) + + return True + + def updateReachability(self, force=True, allowFallback=False): + if not force and self.activeConnection and self.activeConnection.state != plexresource.ResourceConnection.STATE_UNKNOWN: + return + + util.LOG('Updating reachability for {0}: conns={1}, allowFallback={2}'.format(repr(self.name), len(self.connections), allowFallback)) + + epoch = time.time() + retrySeconds = 60 + minSeconds = 10 + for i in range(len(self.connections)): + conn = self.connections[i] + diff = epoch - (conn.lastTestedAt or 0) + if conn.hasPendingRequest: + util.DEBUG_LOG("Skip reachability test for {0} (has pending request)".format(conn)) + elif (diff < minSeconds or (not self.isSecondary() and self.isReachable() and diff < retrySeconds)) and \ + not conn.state == "unauthorized": + util.DEBUG_LOG("Skip reachability test for {0} (checked {1} secs ago)".format(conn, diff)) + elif conn.testReachability(self, allowFallback): + self.pendingReachabilityRequests += 1 + if conn.isSecure: + self.pendingSecureRequests += 1 + + if self.pendingReachabilityRequests == 1: + self.trigger("started:reachability") + + if self.pendingReachabilityRequests <= 0: + self.trigger("completed:reachability") + + def cancelReachability(self): + for i in range(len(self.connections)): + conn = self.connections[i] + conn.cancelReachability() + + def onReachabilityResult(self, connection): + connection.lastTestedAt = time.time() + connection.hasPendingRequest = None + self.pendingReachabilityRequests -= 1 + if connection.isSecure: + self.pendingSecureRequests -= 1 + + util.DEBUG_LOG("Reachability result for {0}: {1} is {2}".format(repr(self.name), connection.address, connection.state)) + + # Noneate active connection if the state is unreachable + if self.activeConnection and self.activeConnection.state != plexresource.ResourceConnection.STATE_REACHABLE: + self.activeConnection = None + + # Pick a best connection. If we already had an active connection and + # it's still reachable, stick with it. (replace with local if + # available) + best = self.activeConnection + for i in range(len(self.connections) - 1, -1, -1): + try: + conn = self.connections[i] + except IndexError: + continue + + util.DEBUG_LOG("Connection score: {0}, {1}".format(conn.address, conn.getScore(True))) + + if not best or conn.getScore() > best.getScore(): + best = conn + + if best and best.state == best.STATE_REACHABLE: + if (best.isSecure or util.LOCAL_OVER_SECURE) or self.pendingSecureRequests <= 0: + util.DEBUG_LOG("Using connection for {0} for now: {1}".format(repr(self.name), best.address)) + self.activeConnection = best + else: + util.DEBUG_LOG("Found a good connection for {0}, but holding out for better".format(repr(self.name))) + + if self.pendingReachabilityRequests <= 0: + # Retest the server with fallback enabled. hasFallback will only + # be True if there are available insecure connections and fallback + # is allowed. + + if self.hasFallback: + self.updateReachability(False, True) + else: + self.trigger("completed:reachability") + + util.LOG("Active connection for {0} is {1}".format(repr(self.name), self.activeConnection)) + + from . import plexservermanager + plexservermanager.MANAGER.updateReachabilityResult(self, bool(self.activeConnection)) + + def markAsRefreshing(self): + for i in range(len(self.connections)): + conn = self.connections[i] + conn.refreshed = False + + def markUpdateFinished(self, source): + # Any connections for the given source which haven't been refreshed should + # be removed. Since removing from a list is hard, we'll make a new list. + toKeep = [] + hasSecureConn = False + + for i in range(len(self.connections)): + try: + conn = self.connections[i] + except IndexError: + util.DEBUG_LOG("Connection lost during iteration") + continue + if not conn.refreshed: + conn.sources = conn.sources & (~source) + + # If we lost our plex.tv connection, don't remember the token. + if source == conn.SOURCE_MYPLEX: + conn.token = None + + if conn.sources: + if conn.address[:5] == "https": + hasSecureConn = True + toKeep.append(conn) + else: + util.DEBUG_LOG("Removed connection {0} for {1} after updating connections for {2}".format(conn, repr(self.name), source)) + if conn == self.activeConnection: + util.DEBUG_LOG("Active connection lost") + self.activeConnection = None + + # Update fallback flag if our connections have changed + if len(toKeep) != len(self.connections): + for conn in toKeep: + conn.isFallback = hasSecureConn and conn.address[:5] != "https" and not util.LOCAL_OVER_SECURE + + self.connections = toKeep + + return len(self.connections) > 0 + + def merge(self, other): + # Wherever this other server came from, assume its information is better + # except for manual connections. + + if other.sourceType != plexresource.ResourceConnection.SOURCE_MANUAL: + self.name = other.name + self.versionNorm = other.versionNorm + self.sameNetwork = other.sameNetwork + + if other.sourceType == plexresource.ResourceConnection.SOURCE_MANUAL and util.LOCAL_OVER_SECURE: + self.sameNetwork = other.sameNetwork + + # Merge connections + for otherConn in other.connections: + merged = False + for i in range(len(self.connections)): + myConn = self.connections[i] + if myConn == otherConn: + myConn.merge(otherConn) + merged = True + break + + if not merged: + self.connections.append(otherConn) + + # If the other server has a token, then it came from plex.tv, which + # means that its ownership information is better than ours. But if + # it was discovered, then it may incorrectly claim to be owned, so + # we stick with whatever we already had. + + if other.getToken(): + self.owned = other.owned + self.owner = other.owner + + def supportsFeature(self, feature): + return feature in self.features + + def getVersion(self): + if not self.versionNorm: + return '' + + return str(self.versionNorm) + + def convertUrlToLoopBack(self, url): + # If the URL starts with our server URL, replace it with 127.0.0.1:32400. + if self.isRequestToServer(url): + url = 'http://127.0.0.1:32400/' + url.split('://', 1)[-1].split('/', 1)[-1] + return url + + def resetLastTest(self): + for i in range(len(self.connections)): + conn = self.connections[i] + conn.lastTestedAt = None + + def isSecondary(self): + return self.serverClass == "secondary" + + def getLibrarySectionByUuid(self, uuid=None): + if not uuid: + return None + return self.librariesByUuid[uuid] + + def setLibrarySectionByUuid(self, uuid, library): + self.librariesByUuid[uuid] = library + + def hasInsecureConnections(self): + if util.INTERFACE.getPreference('allow_insecure') == 'always': + return False + + # True if we have any insecure connections we have disallowed + for i in range(len(self.connections)): + conn = self.connections[i] + if not conn.isSecure and conn.state == conn.STATE_INSECURE: + return True + + return False + + def hasSecureConnections(self): + for i in range(len(self.connections)): + conn = self.connections[i] + if conn.isSecure: + return True + + return False + + def getLibrarySectionPrefs(self, uuid): + # TODO: Make sure I did this right - ruuk + librarySection = self.getLibrarySectionByUuid(uuid) + + if librarySection and librarySection.key: + # Query and store the prefs only when asked for. We could just return the + # items, but it'll be more useful to store the pref ids in an associative + # array for ease of selecting the pref we need. + + if not librarySection.sectionPrefs: + path = "/library/sections/{0}/prefs".format(librarySection.key) + data = self.query(path) + if data: + librarySection.sectionPrefs = {} + for elem in data: + item = plexobjects.buildItem(self, elem, path) + if item.id: + librarySection.sectionPrefs[item.id] = item + + return librarySection.sectionPrefs + + return None + + def swizzleUrl(self, url, includeToken=False): + m = re.search(r"^\w+://.+?(/.+)", url) + newUrl = m and m.group(1) or None + return self.buildUrl(newUrl or url, includeToken) + + def hasHubs(self): + return self.platform != 'cloudsync' + + @property + def address(self): + return self.activeConnection.address + + @classmethod + def deSerialize(cls, jstring): + try: + serverObj = json.loads(jstring) + except: + util.ERROR() + util.ERROR_LOG("Failed to deserialize PlexServer JSON") + return + + from . import plexconnection + + server = createPlexServerForName(serverObj['uuid'], serverObj['name']) + server.owned = bool(serverObj.get('owned')) + server.sameNetwork = serverObj.get('sameNetwork') + + hasSecureConn = False + for i in range(len(serverObj.get('connections', []))): + conn = serverObj['connections'][i] + if conn['address'][:5] == "https": + hasSecureConn = True + break + + for i in range(len(serverObj.get('connections', []))): + conn = serverObj['connections'][i] + isFallback = hasSecureConn and conn['address'][:5] != "https" and not util.LOCAL_OVER_SECURE + sources = plexconnection.PlexConnection.SOURCE_BY_VAL[conn['sources']] + connection = plexconnection.PlexConnection(sources, conn['address'], conn['isLocal'], conn['token'], isFallback) + + # Keep the secure connection on top + if connection.isSecure and not util.LOCAL_OVER_SECURE: + server.connections.insert(0, connection) + elif not connection.isSecure and util.LOCAL_OVER_SECURE: + server.connections.insert(0, connection) + else: + server.connections.append(connection) + + if conn.get('active'): + server.activeConnection = connection + + return server + + def serialize(self, full=False): + serverObj = { + 'name': self.name, + 'uuid': self.uuid, + 'owned': self.owned, + 'connections': [] + } + + if full: + for conn in self.connections: + serverObj['connections'].append({ + 'sources': conn.sources, + 'address': conn.address, + 'isLocal': conn.isLocal, + 'isSecure': conn.isSecure, + 'token': conn.token + }) + if conn == self.activeConnection: + serverObj['connections'][-1]['active'] = True + else: + serverObj['connections'] = [{ + 'sources': self.activeConnection.sources, + 'address': self.activeConnection.address, + 'isLocal': self.activeConnection.isLocal, + 'isSecure': self.activeConnection.isSecure, + 'token': self.activeConnection.token or self.getToken(), + 'active': True + }] + + return json.dumps(serverObj) + + +def dummyPlexServer(): + return createPlexServer() + + +def createPlexServer(): + return PlexServer() + + +def createPlexServerForConnection(conn): + obj = createPlexServer() + obj.connections.append(conn) + obj.activeConnection = conn + return obj + + +def createPlexServerForName(uuid, name): + obj = createPlexServer() + obj.uuid = uuid + obj.name = name + return obj + + +def createPlexServerForResource(resource): + # resource.__class__ = PlexServer + # resource.server = resource + # resource.session = http.Session() + return resource diff --git a/script.plexmod/lib/_included_packages/plexnet/plexservermanager.py b/script.plexmod/lib/_included_packages/plexnet/plexservermanager.py new file mode 100644 index 000000000..4738a55ce --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexservermanager.py @@ -0,0 +1,651 @@ +from __future__ import absolute_import +import json + +from . import http +from . import plexconnection +from . import plexresource +from . import plexserver +from . import signalsmixin +from . import callback +from . import plexapp +from . import gdm +from . import util +from six.moves import range + + +class SearchContext(dict): + def __getattr__(self, attr): + return self.get(attr) + + def __setattr__(self, attr, value): + self[attr] = value + + +class PlexServerManager(signalsmixin.SignalsMixin): + def __init__(self): + signalsmixin.SignalsMixin.__init__(self) + # obj.Append(ListenersMixin()) + self.serversByUuid = {} + self.selectedServer = None + self.transcodeServer = None + self.channelServer = None + self.deferReachabilityTimer = None + + self.startSelectedServerSearch() + self.loadState() + + plexapp.util.APP.on("change:user", callback.Callable(self.onAccountChange)) + plexapp.util.APP.on("change:allow_insecure", callback.Callable(self.onSecurityChange)) + plexapp.util.APP.on("change:manual_connections", callback.Callable(self.onManualConnectionChange)) + + def getSelectedServer(self): + return self.selectedServer + + def setSelectedServer(self, server, force=False): + # Don't do anything if the server is already selected. + if self.selectedServer and self.selectedServer == server: + return False + + if server: + # Don't select servers that don't have connections. + if not server.activeConnection: + return False + + # Don't select servers that are not supported + if not server.isSupported: + return False + + if not self.selectedServer or force: + util.LOG("Setting selected server to {0}".format(server)) + self.selectedServer = server + + # Update our saved state. + self.saveState(setPreferred=True) + + # Notify anyone who might care. + util.APP.trigger("change:selectedServer", server=server) + + return True + + return False + + def getServer(self, uuid=None): + if uuid is None: + return None + elif uuid == "myplex": + from . import myplexserver + return myplexserver.MyPlexServer() + else: + return self.serversByUuid[uuid] + + def getServers(self): + servers = [] + for uuid in list(self.serversByUuid.keys()): + if uuid != "myplex": + servers.append(self.serversByUuid[uuid]) + + return servers + + def hasPendingRequests(self): + for server in self.getServers(): + if server.pendingReachabilityRequests: + return True + + return False + + def removeServer(self, server): + del self.serversByUuid[server.uuid] + + self.trigger('remove:server') + + if server == self.selectedServer: + util.LOG("The selected server went away") + self.setSelectedServer(None, force=True) + + if server == self.transcodeServer: + util.LOG("The selected transcode server went away") + self.transcodeServer = None + + if server == self.channelServer: + util.LOG("The selected channel server went away") + self.channelServer = None + + def updateFromConnectionType(self, servers, source): + self.markDevicesAsRefreshing() + + for server in servers: + self.mergeServer(server) + + if self.searchContext and source in self.searchContext.waitingForResources: + #self.searchContext.waitingForResources = False + self.searchContext.waitingForResources.remove(source) + + if not self.searchContext.waitingForResources: + self.deviceRefreshComplete(source) + self.updateReachability(True, True) + self.saveState() + + def updateFromDiscovery(self, server): + merged = self.mergeServer(server) + + if not merged.activeConnection: + merged.updateReachability(False, True) + else: + # self.notifyAboutDevice(merged, True) + pass + + def markDevicesAsRefreshing(self): + for uuid in list(self.serversByUuid.keys()): + self.serversByUuid[uuid].markAsRefreshing() + + def mergeServer(self, server): + if server.uuid in self.serversByUuid: + existing = self.serversByUuid[server.uuid] + existing.merge(server) + util.DEBUG_LOG("Merged {0}".format(repr(server.name))) + return existing + else: + self.serversByUuid[server.uuid] = server + util.DEBUG_LOG("Added new server {0}".format(repr(server.name))) + self.trigger("new:server", server=server) + return server + + def deviceRefreshComplete(self, source): + toRemove = [] + for uuid in list(self.serversByUuid.keys()): + if not self.serversByUuid[uuid].markUpdateFinished(source): + toRemove.append(uuid) + + for uuid in toRemove: + if uuid not in self.serversByUuid: + util.DEBUG_LOG("Server {} lost - removing".format(uuid)) + continue + + server = self.serversByUuid[uuid] + + util.DEBUG_LOG("Server {0} has no more connections - removing".format(repr(server.name))) + # self.notifyAboutDevice(server, False) + self.removeServer(server) + + def updateReachability(self, force=False, preferSearch=False, defer=False): + # We don't need to test any servers unless we are signed in and authenticated. + if not plexapp.ACCOUNT.isAuthenticated and plexapp.ACCOUNT.isActive(): + util.LOG("Ignore testing server reachability until we're authenticated") + return + + # To improve reachability performance and app startup, we'll try to test the + # preferred server first, and defer the connection tests for a few seconds. + + hasPreferredServer = bool(self.searchContext.preferredServer) + preferredServerExists = hasPreferredServer and self.searchContext.preferredServer in self.serversByUuid + + if preferSearch and hasPreferredServer and preferredServerExists: + # Update the preferred server immediately if requested and exits + util.LOG("Updating reachability for preferred server: force={0}".format(force)) + self.serversByUuid[self.searchContext.preferredServer].updateReachability(force) + self.deferUpdateReachability() + elif defer: + self.deferUpdateReachability() + elif hasPreferredServer and not preferredServerExists and gdm.DISCOVERY.isActive(): + # Defer the update if requested or if GDM discovery is enabled and + # active while the preferred server doesn't exist. + + util.LOG("Defer update reachability until GDM has finished to help locate the preferred server") + self.deferUpdateReachability(True, False) + else: + if self.deferReachabilityTimer: + self.deferReachabilityTimer.cancel() + self.deferReachabilityTimer = None + + util.LOG("Updating reachability for all devices: force={0}".format(force)) + for uuid in list(self.serversByUuid.keys()): + self.serversByUuid[uuid].updateReachability(force) + + def cancelReachability(self): + if self.deferReachabilityTimer: + self.deferReachabilityTimer.cancel() + self.deferReachabilityTimer = None + + for uuid in list(self.serversByUuid.keys()): + self.serversByUuid[uuid].cancelReachability() + + def updateReachabilityResult(self, server, reachable=False): + searching = not self.selectedServer and self.searchContext + + if reachable: + # If we're in the middle of a search for our selected server, see if + # this is a candidate. + self.trigger('reachable:server', server=server) + if searching: + # If this is what we were hoping for, select it + if server.uuid == self.searchContext.preferredServer: + self.setSelectedServer(server, True) + elif server.synced: + self.searchContext.fallbackServer = server + elif self.compareServers(self.searchContext.bestServer, server) < 0: + self.searchContext.bestServer = server + else: + # If this is what we were hoping for, see if there are any more pending + # requests to hope for. + + if searching and server.uuid == self.searchContext.preferredServer and server.pendingReachabilityRequests <= 0: + self.searchContext.preferredServer = None + + if server == self.selectedServer: + util.LOG("Selected server is not reachable") + self.setSelectedServer(None, True) + + if server == self.transcodeServer: + util.LOG("The selected transcode server is not reachable") + self.transcodeServer = None + + if server == self.channelServer: + util.LOG("The selected channel server is not reachable") + self.channelServer = None + + # See if we should settle for the best we've found so far. + self.checkSelectedServerSearch() + + def checkSelectedServerSearch(self, skip_preferred=False, skip_owned=False): + if self.selectedServer: + return self.selectedServer + elif self.searchContext: + # If we're still waiting on the resources response then there's no + # reason to settle, so don't even iterate over our servers. + + if self.searchContext.waitingForResources: + util.DEBUG_LOG("Still waiting for plex.tv resources") + return + + waitingForPreferred = False + waitingForOwned = False + waitingForAnything = False + waitingToTestAll = bool(self.deferReachabilityTimer) + + if skip_preferred: + self.searchContext.preferredServer = None + if self.deferReachabilityTimer: + self.deferReachabilityTimer.cancel() + self.deferReachabilityTimer = None + + if not skip_owned: + # Iterate over all our servers and see if we're waiting on any results + servers = self.getServers() + pendingCount = 0 + for server in servers: + if server.pendingReachabilityRequests > 0: + pendingCount += server.pendingReachabilityRequests + if server.uuid == self.searchContext.preferredServer: + waitingForPreferred = True + elif server.owned: + waitingForOwned = True + else: + waitingForAnything = True + + pendingString = "{0} pending reachability tests".format(pendingCount) + + if waitingForPreferred: + util.LOG("Still waiting for preferred server: " + pendingString) + elif waitingToTestAll: + util.LOG("Preferred server not reachable, testing all servers now") + self.updateReachability(True, False, False) + elif waitingForOwned and (not self.searchContext.bestServer or not self.searchContext.bestServer.owned): + util.LOG("Still waiting for an owned server: " + pendingString) + elif waitingForAnything and not self.searchContext.bestServer: + util.LOG("Still waiting for any server: {0}".format(pendingString)) + else: + # No hope for anything better, let's select what we found + util.LOG("Settling for the best server we found") + self.setSelectedServer(self.searchContext.bestServer or self.searchContext.fallbackServer, True) + return self.selectedServer + + def compareServers(self, first, second): + if not first or not first.isSupported: + return second and -1 or 0 + elif not second: + return 1 + elif first.owned != second.owned: + return first.owned and 1 or -1 + elif first.isLocalConnection() != second.isLocalConnection(): + return first.isLocalConnection() and 1 or -1 + else: + return 0 + + def loadState(self): + jstring = util.INTERFACE.getRegistry("PlexServerManager") + if not jstring: + return + + try: + obj = json.loads(jstring) + except: + util.ERROR() + obj = None + + if not obj: + util.ERROR_LOG("Failed to parse PlexServerManager JSON") + return + + for serverObj in obj['servers']: + server = plexserver.createPlexServerForName(serverObj['uuid'], serverObj['name']) + server.owned = bool(serverObj.get('owned')) + server.sameNetwork = serverObj.get('sameNetwork') + + hasSecureConn = False + for i in range(len(serverObj.get('connections', []))): + conn = serverObj['connections'][i] + if conn['address'][:5] == "https": + hasSecureConn = True + break + + for i in range(len(serverObj.get('connections', []))): + conn = serverObj['connections'][i] + isFallback = hasSecureConn and conn['address'][:5] != "https" and not util.LOCAL_OVER_SECURE + sources = plexconnection.PlexConnection.SOURCE_BY_VAL[conn['sources']] + connection = plexconnection.PlexConnection(sources, conn['address'], conn['isLocal'], conn['token'], isFallback) + + # Keep the secure connection on top + if connection.isSecure and not util.LOCAL_OVER_SECURE: + server.connections.insert(0, connection) + elif not connection.isSecure and util.LOCAL_OVER_SECURE: + server.connections.insert(0, connection) + else: + server.connections.append(connection) + + self.serversByUuid[server.uuid] = server + + util.LOG("Loaded {0} servers from registry".format(len(obj['servers']))) + self.updateReachability(False, True) + + def saveState(self, setPreferred=False): + # Serialize our important information to JSON and save it to the registry. + # We'll always update server info upon connecting, so we don't need much + # info here. We do have to use roArray instead of roList, because Brightscript. + + obj = {} + + servers = self.getServers() + obj['servers'] = [] + + for server in servers: + # Don't save secondary servers. They should be discovered through GDM or myPlex. + if not server.isSecondary(): + serverObj = { + 'name': server.name, + 'uuid': server.uuid, + 'owned': server.owned, + 'sameNetwork': server.sameNetwork, + 'connections': [] + } + + for i in range(len(server.connections)): + conn = server.connections[i] + serverObj['connections'].append({ + 'sources': conn.sources, + 'address': conn.address, + 'isLocal': conn.isLocal, + 'isSecure': conn.isSecure, + 'token': conn.token + }) + + obj['servers'].append(serverObj) + + if self.selectedServer and not self.selectedServer.synced and not self.selectedServer.isSecondary() \ + and setPreferred: + util.INTERFACE.setPreference("lastServerId.{}".format(plexapp.ACCOUNT.ID), self.selectedServer.uuid) + + util.INTERFACE.setRegistry("PlexServerManager", json.dumps(obj)) + + def clearState(self): + util.INTERFACE.setRegistry("PlexServerManager", '') + + def isValidForTranscoding(self, server): + return server and server.activeConnection and server.owned and not server.synced and not server.isSecondary() + + def getChannelServer(self): + if not self.channelServer or not self.channelServer.isReachable(): + self.channelServer = None + + # Attempt to find a server that supports channels and transcoding + for s in self.getServers(): + if s.supportsVideoTranscoding and s.allowChannelAccess and s.isReachable() and self.compareServers(self.channelServer, s) < 0: + self.channelServer = s + + # Fallback to any server that supports channels + if not self.channelServer: + for s in self.getServers(): + if s.allowChannelAccess and s.isReachable() and self.compareServers(self.channelServer, s) < 0: + self.channelServer = s + + if self.channelServer: + util.LOG("Setting channel server to {0}".format(self.channelServer)) + + return self.channelServer + + def getTranscodeServer(self, transcodeType=None): + if not self.selectedServer: + return None + + transcodeMap = { + 'audio': "supportsAudioTranscoding", + 'video': "supportsVideoTranscoding", + 'photo': "supportsPhotoTranscoding" + } + transcodeSupport = transcodeMap[transcodeType] + + # Try to use a better transcoding server for synced or secondary servers + if self.selectedServer.synced or self.selectedServer.isSecondary(): + if self.transcodeServer and self.transcodeServer.isReachable(): + return self.transcodeServer + + self.transcodeServer = None + for server in self.getServers(): + if not server.synced and server.isReachable() and self.compareServers(self.transcodeServer, server) < 0: + if not transcodeSupport or server.transcodeSupport: + self.transcodeServer = server + + if self.transcodeServer: + transcodeTypeString = transcodeType or '' + util.LOG("Found a better {0} transcode server than {1}, using: {2}".format(transcodeTypeString, self.selectedserver, self.transcodeServer)) + return self.transcodeServer + + return self.selectedServer + + def startSelectedServerSearch(self, reset=False, ID=None): + if reset: + self.selectedServer = None + self.transcodeServer = None + self.channelServer = None + + ID = ID is not None and ID or plexapp.ACCOUNT.ID + pServ = util.INTERFACE.getPreference("lastServerId.{}".format(ID), '') + util.DEBUG_LOG("Preferred server for {0} is: {1}".format(ID, pServ)) + # Keep track of some information during our search + + waitFor = [] + if plexapp.ACCOUNT.isSignedIn: + waitFor.append(plexresource.ResourceConnection.SOURCE_MYPLEX) + + if util.LOCAL_OVER_SECURE and self.getManualConnections(): + waitFor.append(plexresource.ResourceConnection.SOURCE_MANUAL) + + self.searchContext = SearchContext({ + 'bestServer': None, + 'preferredServer': pServ, + 'waitingForResources': waitFor + }) + + util.LOG("Starting selected server search, hoping for {0}".format(self.searchContext.preferredServer)) + if util.LOCAL_OVER_SECURE: + util.WARN_LOG("Preferring local server connections over secure ones!") + + def onAccountChange(self, account, reallyChanged=False): + # Clear any AudioPlayer data before invalidating the active server + if reallyChanged: + # AudioPlayer().Cleanup() + # PhotoPlayer().Cleanup() + + util.DEBUG_LOG("Account really changed, clearing all servers") + + # Clear selected and transcode servers on user change + self.selectedServer = None + self.transcodeServer = None + self.channelServer = None + self.cancelReachability() + + if account.isSignedIn: + # If the user didn't really change, such as selecting the previous user + # on the lock screen, then we don't need to clear anything. We can + # avoid a costly round of reachability checks. + + if not reallyChanged: + return + + # A request to refresh resources has already been kicked off. We need + # to clear out any connections for the previous user and then start + # our selected server search. + + self.updateFromConnectionType([], plexresource.ResourceConnection.SOURCE_MYPLEX) + self.updateFromConnectionType([], plexresource.ResourceConnection.SOURCE_DISCOVERED) + self.updateFromConnectionType([], plexresource.ResourceConnection.SOURCE_MANUAL) + + self.startSelectedServerSearch(True, ID=account.ID) + + if reallyChanged: + util.DEBUG_LOG("User really changed, refreshing resources now") + plexapp.refreshResources() + else: + # Clear servers/connections from plex.tv + self.updateFromConnectionType([], plexresource.ResourceConnection.SOURCE_MYPLEX) + + def deferUpdateReachability(self, addTimer=True, logInfo=True): + if addTimer and not self.deferReachabilityTimer: + self.deferReachabilityTimer = plexapp.createTimer(1000, callback.Callable(self.onDeferUpdateReachabilityTimer), repeat=True) + util.APP.addTimer(self.deferReachabilityTimer) + else: + if self.deferReachabilityTimer: + self.deferReachabilityTimer.reset() + + if self.deferReachabilityTimer and logInfo: + util.LOG('Defer update reachability for all devices a few seconds: GDMactive={0}'.format(gdm.DISCOVERY.isActive())) + + def onDeferUpdateReachabilityTimer(self): + if not self.selectedServer and self.searchContext: + for server in self.getServers(): + if server.pendingReachabilityRequests > 0 and server.uuid == self.searchContext.preferredServer: + util.DEBUG_LOG( + 'Still waiting on {0} responses from preferred server: {1}'.format( + server.pendingReachabilityRequests, self.searchContext.preferredServer + ) + ) + return + + if self.deferReachabilityTimer: + self.deferReachabilityTimer.cancel() + self.deferReachabilityTimer = None + self.updateReachability(True, False, False) + + def resetLastTest(self): + for uuid in list(self.serversByUuid.keys()): + self.serversByUuid[uuid].resetLastTest() + + def clearServers(self): + self.cancelReachability() + self.serversByUuid = {} + self.saveState() + + def onSecurityChange(self, value=None): + # If the security policy changes, then we will need to allow all + # connections to be retested by resetting the last test. We can + # simply call `self.resetLastTest()` to allow all connection to be + # tested when the server dropdown is enable, but we may as well + # test all the connections immediately. + + plexapp.refreshResources(True) + + def onManualConnectionChange(self, value=None): + # Clear all manual connections on change. We will keep the selected + # server around temporarily if it's a manual connection regardless + # if it's been removed. + + # Remember the current server in case it's removed + server = self.getSelectedServer() + activeConn = [] + if server and server.activeConnection: + activeConn.append(server.activeConnection) + + # Clear all manual connections + self.updateFromConnectionType([], plexresource.ResourceConnection.SOURCE_MANUAL) + + # Reused the previous selected server if our manual connection has gone away + if not self.getSelectedServer() and activeConn.sources == plexresource.ResourceConnection.SOURCE_MANUAL: + server.activeConnection = activeConn + server.connections.append(activeConn) + self.setSelectedServer(server, True) + + def refreshManualConnections(self): + manualConnections = self.getManualConnections() + if not manualConnections: + util.DEBUG_LOG("No manual connections.") + return + + util.LOG("Refreshing {0} manual connections".format(len(manualConnections))) + + for conn in manualConnections: + # Default to http, as the server will need to be signed in for https to work, + # so the client should too. We'd also have to allow hostname entry, instead of + # IP address for the cert to validate. + + proto = "http" + port = conn.port or "32400" + serverAddress = "{0}://{1}:{2}".format(proto, conn.connection, port) + + request = http.HttpRequest(serverAddress + "/identity") + context = request.createRequestContext("manual_connections", callback.Callable(self.onManualConnectionsResponse)) + context.serverAddress = serverAddress + context.address = conn.connection + context.proto = proto + context.port = port + util.APP.startRequest(request, context) + + def onManualConnectionsResponse(self, request, response, context): + if not response.isSuccess(): + return + + data = response.getBodyXml() + if data is not None: + serverAddress = context.serverAddress + util.DEBUG_LOG("Received manual connection response for {0}".format(serverAddress)) + + machineID = data.attrib.get('machineIdentifier') + name = context.address + if not name or not machineID: + return + + # TODO(rob): Do we NOT want to consider manual connections local? + conn = plexconnection.PlexConnection(plexresource.ResourceConnection.SOURCE_MANUAL, serverAddress, True, None) + server = plexserver.createPlexServerForConnection(conn) + server.uuid = machineID + server.name = name + server.sourceType = plexresource.ResourceConnection.SOURCE_MANUAL + self.updateFromConnectionType([server], plexresource.ResourceConnection.SOURCE_MANUAL) + + def getManualConnections(self): + manualConnections = [] + + jstring = util.INTERFACE.getPreference('manual_connections') + if jstring: + connections = json.loads(jstring) + if isinstance(connections, list): + for conn in connections: + conn = util.AttributeDict(conn) + if conn.connection: + manualConnections.append(conn) + + return manualConnections + +# TODO(schuyler): Notifications +# TODO(schuyler): Transcode (and primary) server selection + + +MANAGER = PlexServerManager() diff --git a/script.plexmod/lib/_included_packages/plexnet/plexstream.py b/script.plexmod/lib/_included_packages/plexnet/plexstream.py new file mode 100644 index 000000000..33b5352f6 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/plexstream.py @@ -0,0 +1,195 @@ +from __future__ import absolute_import +from . import plexobjects +from . import util + + +class PlexStream(plexobjects.PlexObject): + # Constants + TYPE_UNKNOWN = 0 + TYPE_VIDEO = 1 + TYPE_AUDIO = 2 + TYPE_SUBTITLE = 3 + TYPE_LYRICS = 4 + + streamTypeNames = ( + "Unknown", "VideoStream", "AudioStream", "SubtitleStream", "LyricsStream" + ) + + # We have limited font support, so make a very modest effort at using + # English names for common unsupported languages. + + SAFE_LANGUAGE_NAMES = { + 'ara': "Arabic", + 'arm': "Armenian", + 'bel': "Belarusian", + 'ben': "Bengali", + 'bul': "Bulgarian", + 'chi': "Chinese", + 'cze': "Czech", + 'gre': "Greek", + 'heb': "Hebrew", + 'hin': "Hindi", + 'jpn': "Japanese", + 'kor': "Korean", + 'rus': "Russian", + 'srp': "Serbian", + 'tha': "Thai", + 'ukr': "Ukrainian", + 'yid': "Yiddish" + } + + def reload(self): + pass + + def getTitle(self, translate_func=util.dummyTranslate): + streamType = self.streamType.asInt() + + if streamType == self.TYPE_SUBTITLE \ + and util.INTERFACE.getPreference('subtitle_use_extended_title', True) \ + and self.extendedDisplayTitle: + return self.extendedDisplayTitle + + title = self.getLanguageName(translate_func) + + if streamType == self.TYPE_VIDEO: + title = self.getCodec() or translate_func("Unknown") + elif streamType == self.TYPE_AUDIO: + codec = self.getCodec() + channels = self.getChannels(translate_func) + + if codec != "" and channels != "": + title += u" ({0} {1})".format(codec, channels) + elif codec != "" or channels != "": + title += u" ({0}{1})".format(codec, channels) + elif streamType == self.TYPE_SUBTITLE: + extras = [] + + codec = self.getCodec() + if codec: + extras.append(codec) + + if self.sdh: + title += " {}".format(translate_func("SDH")) + + if not self.key: + extras.append(translate_func("Embedded")) + + if self.forced.asBool(): + extras.append(translate_func("Forced")) + + if len(extras) > 0: + title += u" ({0})".format('/'.join(extras)) + elif streamType == self.TYPE_LYRICS: + title = translate_func("Lyrics") + if self.format: + title += u" ({0})".format(self.format) + + return title + + def getCodec(self): + codec = (self.codec or '').lower() + + if codec in ('dca', 'dca-ma', 'dts-hd', 'dts-es', 'dts-hra'): + codec = "DTS" + else: + codec = codec.upper() + + return codec + + def getChannels(self, translate_func=util.dummyTranslate): + channels = self.channels.asInt() + + if channels == 1: + return translate_func("Mono") + elif channels == 2: + return translate_func("Stereo") + elif channels > 0: + return "{0}.1".format(channels - 1) + else: + return "" + + def getLanguageName(self, translate_func=util.dummyTranslate): + code = self.languageCode + + if not code: + return translate_func("Unknown") + + return self.SAFE_LANGUAGE_NAMES.get(code) or self.language or "Unknown" + + def getSubtitlePath(self): + query = "?encoding=utf-8" + + if self.codec == "smi": + query += "&format=srt" + + return self.key + query + + def getSubtitleServerPath(self): + if not self.key: + return None + + return self.getServer().buildUrl(self.getSubtitlePath(), True) + + @property + def embedded(self): + return not bool(self.getSubtitleServerPath()) + + def isSelected(self): + return self.selected.asBool() + + def setSelected(self, selected): + self.selected = plexobjects.PlexValue(selected and '1' or '0') + + @property + def sdh(self): + return self.hearingImpaired or "SDH" in self.title or "SDH" in self.displayTitle \ + or "SDH" in self.extendedDisplayTitle + + @property + def videoCodecRendering(self): + render = "sdr" + + if self.colorTrc == "smpte2084": + if self.DOVIProfile == "8" and self.DOVIBLCompatID == "1": + render = "dv/hdr10" + elif self.DOVIProfile: + render = "dv" + else: + render = "hdr" + elif self.colorTrc == "arib-std-b67": + render = "hlg" + + return render.upper() + + def __str__(self): + return self.getTitle() + + def __repr__(self): + return '<{}: {}>'.format(self.streamTypeNames[self.streamType.asInt()], str(self)) + + def __eq__(self, other): + if not other: + return False + + if self.__class__ != other.__class__: + return False + + for attr in ("streamType", "language", "codec", "channels", "index", "key"): + if getattr(self, attr) != getattr(other, attr): + return False + return True + + +# Synthetic subtitle stream for 'none' + +class NoneStream(PlexStream): + def __init__(self, *args, **kwargs): + PlexStream.__init__(self, None, *args, **kwargs) + self.id = plexobjects.PlexValue("0") + self.streamType = plexobjects.PlexValue(str(self.TYPE_SUBTITLE)) + + def getTitle(self, translate_func=util.dummyTranslate): + return translate_func("None") + + +NONE_STREAM = NoneStream() diff --git a/script.plexmod/lib/_included_packages/plexnet/serverdecision.py b/script.plexmod/lib/_included_packages/plexnet/serverdecision.py new file mode 100644 index 000000000..e1a5344c6 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/serverdecision.py @@ -0,0 +1,102 @@ +from __future__ import absolute_import +from . import mediachoice +from . import util + + +class DecisionFailure(Exception): + def __init__(self, code, reason): + self.code = code + self.reason = reason + + +class ServerDecision(object): + DECISION_DIRECT_PLAY = "directplay" + DECISION_COPY = "copy" + DECISION_TRANSCODE = "transcode" + DIRECT_PLAY_OK = 1000 + TRANSCODE_OK = 1001 + + def __init__(self, original, response, player): + self.original = original + self.response = response + self.player = player + self.item = None + + self.init() + + def init(self): + self.isSupported = self.response.server.supportsFeature("streamingBrain") + for item in self.response.items: + if item and item.media: + self.item = item + self.original.transcodeDecision = mediachoice.MediaChoice(self.item.media[0]) + + # Decision codes and text + self.decisionsCodes = {} + self.decisionsTexts = {} + for key in ["directPlayDecision", "generalDecision", "mdeDecision", "transcodeDecision", "termination"]: + self.decisionsCodes[key] = self.response.container.get(key + "Code", "-1").asInt() + self.decisionsTexts[key] = self.response.container.get(key + "Text") + + util.DEBUG_LOG("Decision codes: {0}".format(self.decisionsCodes)) + + def __str__(self): + if self.isSupported: + obj = [] + for v in self.decisionsTexts.values(): + if v: + obj.append(v) + return ' '.join(obj) + else: + return "Server version does not support decisions." + + def __repr__(self): + return self.__str__() + + def getDecision(self, requireDecision=True): + if not self.item: + # Return no decision. The player will either continue with the original + # or terminate if a valid decision was required. + + if requireDecision: + # Terminate the player by default if there was no decision returned. + code = self.decisionsCodes["generalDecision"] + reason = ' '.join([self.decisionsTexts["transcodeDecision"], self.decisionsTexts["generalDecision"]]) + raise DecisionFailure(code, reason) + + return None + + # Rebuild the original item with the new item. + util.WARN_LOG("Server requested new playback decision: {0}".format(self)) + self.original.rebuild(self.item, self) + return self.original + + def isSuccess(self): + code = self.decisionsCodes["mdeDecision"] + return not self.isSupported or 1000 <= code < 2000 + + def isDecision(self, requireItem=False): + # Server has provided a valid decision if there was a valid decision code + # or if the response returned zero items (could not play). + return self.isSupported and (self.decisionsCodes["mdeDecision"] > -1 or requireItem and not self.item) + + def isTimelineDecision(self): + return self.isSupported and self.item + + def isTermination(self): + return self.isSupported and self.decisionsCodes["termination"] > -1 + + def directPlayOK(self): + return self.decisionsCodes["mdeDecision"] == 1000 + + def getTermination(self): + return { + 'code': str(self.decisionsCodes["termination"]), + 'text': self.decisionsTexts["termination"] or "Unknown" # TODO: Translate Unknown + } + + def getDecisionText(self): + for key in ["mdeDecision", "directPlayDecision", "generalDecision", "transcodeDecision"]: + if self.decisionsTexts.get(key): + return self.decisionsTexts[key] + return None diff --git a/script.plexmod/lib/_included_packages/plexnet/signalslot/__init__.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/__init__.py new file mode 100644 index 000000000..b9c234ff3 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalslot/__init__.py @@ -0,0 +1,11 @@ +from __future__ import absolute_import +try: + from .signal import Signal + from .slot import Slot + from .exceptions import * +except ImportError: # pragma: no cover + # Possible we are running from setup.py, in which case we're after + # the __version__ string only. + pass + +__version__ = '0.1.1' diff --git a/script.module.protobuf/resources/lib/google/__init__.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/__init__.py similarity index 100% rename from script.module.protobuf/resources/lib/google/__init__.py rename to script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/__init__.py diff --git a/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/__init__.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/__init__.py new file mode 100644 index 000000000..280e6a2ad --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/__init__.py @@ -0,0 +1 @@ +from .task import Task diff --git a/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/task.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/task.py new file mode 100644 index 000000000..b6c81c1d2 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/task.py @@ -0,0 +1,76 @@ +from __future__ import absolute_import +import sys +import eventlet +import contexter +import six + + +class Task(object): + @classmethod + def get_or_create(cls, signal, kwargs=None, logger=None): + if not hasattr(cls, '_registry'): + cls._registry = [] + + task = cls(signal, kwargs, logger=logger) + + if task not in cls._registry: + cls._registry.append(task) + + return cls._registry[cls._registry.index(task)] + + def __init__(self, signal, kwargs=None, logger=None): + self.signal = signal + self.kwargs = kwargs or {} + self.logger = logger + self.failures = 0 + self.task_semaphore = eventlet.semaphore.BoundedSemaphore(1) + + def __call__(self, semaphores=None): + semaphores = semaphores or [] + + with contexter.Contexter(self.task_semaphore, *semaphores): + result = self._do() + + if result: + self.failures = 0 + else: + self.failures += 1 + + return result + + def _do(self): + try: + self._emit() + except Exception: + self._exception(*sys.exc_info()) + return False + else: + self._completed() + return True + finally: + self._clean() + + def _clean(self): + pass + + def _completed(self): + if self.logger: + self.logger.info('[%s] Completed' % self) + + def _exception(self, e_type, e_value, e_traceback): + if self.logger: + self.logger.exception('[%s] Raised exception: %s' % ( + self, e_value)) + else: + six.reraise(e_type, e_value, e_traceback) + + def _emit(self): + if self.logger: + self.logger.info('[%s] Running' % self) + self.signal.emit(**self.kwargs) + + def __eq__(self, other): + return (self.signal == other.signal and self.kwargs == other.kwargs) + + def __str__(self): + return '%s: %s' % (self.signal.__class__.__name__, self.kwargs) diff --git a/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/test.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/test.py new file mode 100644 index 000000000..c35640872 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalslot/contrib/task/test.py @@ -0,0 +1,185 @@ +from __future__ import absolute_import +import pytest +import mock +import logging +import eventlet +import time +from signalslot import Signal +from signalslot.contrib.task import Task + +eventlet.monkey_patch(time=True) + + +class TestTask(object): + def setup_method(self, method): + self.signal = mock.Mock() + + def get_task_mock(self, *methods, **kwargs): + if kwargs.get('logger'): + log = logging.getLogger('TestTask') + else: + log = None + task_mock = Task(self.signal, logger=log) + + for method in methods: + setattr(task_mock, method, mock.Mock()) + + return task_mock + + def test_eq(self): + x = Task(self.signal, dict(some_kwarg='foo'), + logger=logging.getLogger('TaskX')) + y = Task(self.signal, dict(some_kwarg='foo'), + logger=logging.getLogger('TaskY')) + + assert x == y + + def test_not_eq(self): + x = Task(self.signal, dict(some_kwarg='foo', + logger=logging.getLogger('TaskX'))) + y = Task(self.signal, dict(some_kwarg='bar', + logger=logging.getLogger('TaskY'))) + + assert x != y + + def test_unicode(self): + t = Task(self.signal, dict(some_kwarg='foo'), + logger=logging.getLogger('TaskT')) + + assert str(t) == "Mock: {'some_kwarg': 'foo'}" + + def test_get_or_create_gets(self): + x = Task.get_or_create(self.signal, dict(some_kwarg='foo'), + logger=logging.getLogger('TaskX')) + y = Task.get_or_create(self.signal, dict(some_kwarg='foo'), + logger=logging.getLogger('TaskY')) + + assert x is y + + def test_get_or_create_creates(self): + x = Task.get_or_create(self.signal, dict(some_kwarg='foo'), + logger=logging.getLogger('TaskX')) + y = Task.get_or_create(self.signal, dict(some_kwarg='bar'), + logger=logging.getLogger('TaskY')) + + assert x is not y + + def test_get_or_create_without_kwargs(self): + t = Task.get_or_create(self.signal) + + assert t.kwargs == {} + + def test_get_or_create_uses_cls(self): + class Foo(Task): + pass + + assert isinstance(Foo.get_or_create(self.signal), Foo) + + def test_do_emit(self): + task_mock = self.get_task_mock('_clean', '_exception', '_completed') + + task_mock._do() + + self.signal.emit.assert_called_once_with() + + def test_do_emit_nolog(self): + task_mock = self.get_task_mock( + '_clean', '_exception', '_completed', logging=True) + + task_mock._do() + + self.signal.emit.assert_called_once_with() + + def test_do_emit_no_log(self): + task_mock = self.get_task_mock('_clean', '_exception', '_completed') + + task_mock._do() + + self.signal.emit.assert_called_once_with() + + def test_do_complete(self): + task_mock = self.get_task_mock('_clean', '_exception', '_completed') + + task_mock._do() + + task_mock._exception.assert_not_called() + task_mock._completed.assert_called_once_with() + task_mock._clean.assert_called_once_with() + + def test_do_success(self): + task_mock = self.get_task_mock() + assert task_mock._do() is True + + def test_do_failure_nolog(self): + # Our dummy exception + class DummyError(Exception): + pass + + task_mock = self.get_task_mock('_emit') + task_mock._emit.side_effect = DummyError() + + # This will throw an exception at us, be ready to catch it. + try: + task_mock._do() + assert False + except DummyError: + pass + + def test_do_failure_withlog(self): + task_mock = self.get_task_mock('_emit', logger=True) + task_mock._emit.side_effect = Exception() + assert task_mock._do() is False + + def test_do_exception(self): + task_mock = self.get_task_mock( + '_clean', '_exception', '_completed', '_emit') + + task_mock._emit.side_effect = Exception() + + task_mock._do() + + task_mock._exception.assert_called_once_with( + Exception, task_mock._emit.side_effect, mock.ANY) + + task_mock._completed.assert_not_called() + task_mock._clean.assert_called_once_with() + + @mock.patch('signalslot.signal.inspect') + def test_semaphore(self, inspect): + slot = mock.Mock() + slot.side_effect = lambda **k: time.sleep(.3) + + signal = Signal('tost') + signal.connect(slot) + + x = Task.get_or_create(signal, dict(some_kwarg='foo'), + logger=logging.getLogger('TaskX')) + y = Task.get_or_create(signal, dict(some_kwarg='foo'), + logger=logging.getLogger('TaskY')) + + eventlet.spawn(x) + time.sleep(.1) + eventlet.spawn(y) + time.sleep(.1) + + assert slot.call_count == 1 + time.sleep(.4) + assert slot.call_count == 2 + + def test_call_context(self): + task_mock = self.get_task_mock('_clean', '_exception', '_completed', + '_emit') + + task_mock._emit.side_effect = Exception() + + assert task_mock.failures == 0 + task_mock() + assert task_mock.failures == 1 + + def test_call_success(self): + task_mock = self.get_task_mock('_clean', '_exception', '_completed', + '_emit') + + assert task_mock.failures == 0 + task_mock() + assert task_mock.failures == 0 diff --git a/script.plexmod/lib/_included_packages/plexnet/signalslot/exceptions.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/exceptions.py new file mode 100644 index 000000000..272b1b347 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalslot/exceptions.py @@ -0,0 +1,28 @@ +class SignalSlotException(Exception): + """Base class for all exceptions of this module.""" + pass + + +class SlotMustAcceptKeywords(SignalSlotException): + """ + Raised when connecting a slot that does not accept ``**kwargs`` in its + signature. + """ + def __init__(self, signal, slot): + m = 'Cannot connect %s to %s because it does not accept **kwargs' % ( + slot, signal) + + super(SlotMustAcceptKeywords, self).__init__(m) + + +# Not yet being used. +class QueueCantQueueNonSignalInstance(SignalSlotException): # pragma: no cover + """ + Raised when trying to queue something else than a + :py:class:`~signalslot.signal.Signal` instance. + """ + def __init__(self, queue, arg): + m = 'Cannot queue %s to %s because it is not a Signal instance' % ( + arg, queue) + + super(QueueCantQueueNonSignalInstance, self).__init__(m) diff --git a/script.plexmod/lib/_included_packages/plexnet/signalslot/signal.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/signal.py new file mode 100644 index 000000000..435461ee0 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalslot/signal.py @@ -0,0 +1,176 @@ +""" +Module defining the Signal class. +""" + +from __future__ import absolute_import +import inspect +import threading + +from . import exceptions + + +class DummyLock(object): + """ + Class that implements a no-op instead of a re-entrant lock. + """ + + def __enter__(self): + pass + + def __exit__(self, exc_type=None, exc_value=None, traceback=None): + pass + + +class BaseSlot(object): + """ + Slot abstract class for type resolution purposes. + """ + pass + + +class Signal(object): + """ + Define a signal by instanciating a :py:class:`Signal` object, ie.: + + >>> conf_pre_load = Signal() + + Optionaly, you can declare a list of argument names for this signal, ie.: + + >>> conf_pre_load = Signal(args=['conf']) + + Any callable can be connected to a Signal, it **must** accept keywords + (``**kwargs``), ie.: + + >>> def yourmodule_conf(conf, **kwargs): + ... conf['yourmodule_option'] = 'foo' + ... + + Connect your function to the signal using :py:meth:`connect`: + + >>> conf_pre_load.connect(yourmodule_conf) + + Emit the signal to call all connected callbacks using + :py:meth:`emit`: + + >>> conf = {} + >>> conf_pre_load.emit(conf=conf) + >>> conf + {'yourmodule_option': 'foo'} + + Note that you may disconnect a callback from a signal if it is already + connected: + + >>> conf_pre_load.is_connected(yourmodule_conf) + True + >>> conf_pre_load.disconnect(yourmodule_conf) + >>> conf_pre_load.is_connected(yourmodule_conf) + False + """ + def __init__(self, args=None, name=None, threadsafe=False): + self._slots = [] + self._slots_lk = threading.RLock() if threadsafe else DummyLock() + self.args = args or [] + self.name = name + + @property + def slots(self): + """ + Return a list of slots for this signal. + """ + with self._slots_lk: + # Do a slot clean-up + slots = [] + for s in self._slots: + if isinstance(s, BaseSlot) and (not s.is_alive): + continue + slots.append(s) + self._slots = slots + return list(slots) + + def connect(self, slot): + """ + Connect a callback ``slot`` to this signal. + """ + if not isinstance(slot, BaseSlot): + if getattr(inspect, "getfullargspec", False): + try: + if inspect.getfullargspec(slot).varkw is None: + raise exceptions.SlotMustAcceptKeywords(self, slot) + except TypeError: + if inspect.getfullargspec(slot.__call__).varkw is None: + raise exceptions.SlotMustAcceptKeywords(self, slot) + else: + try: + if inspect.getargspec(slot).keywords is None: + raise exceptions.SlotMustAcceptKeywords(self, slot) + except TypeError: + if inspect.getargspec(slot.__call__).keywords is None: + raise exceptions.SlotMustAcceptKeywords(self, slot) + + with self._slots_lk: + if not self.is_connected(slot): + self._slots.append(slot) + + def is_connected(self, slot): + """ + Check if a callback ``slot`` is connected to this signal. + """ + with self._slots_lk: + return slot in self._slots + + def disconnect(self, slot): + """ + Disconnect a slot from a signal if it is connected else do nothing. + """ + with self._slots_lk: + if self.is_connected(slot): + self._slots.pop(self._slots.index(slot)) + + def emit(self, **kwargs): + """ + Emit this signal which will execute every connected callback ``slot``, + passing keyword arguments. + + If a slot returns anything other than None, then :py:meth:`emit` will + return that value preventing any other slot from being called. + + >>> need_something = Signal() + >>> def get_something(**kwargs): + ... return 'got something' + ... + >>> def make_something(**kwargs): + ... print('I will not be called') + ... + >>> need_something.connect(get_something) + >>> need_something.connect(make_something) + >>> need_something.emit() + 'got something' + """ + for slot in reversed(self.slots): + result = slot(**kwargs) + + if result is not None: + return result + + def __eq__(self, other): + """ + Return True if other has the same slots connected. + + >>> a = Signal() + >>> b = Signal() + >>> a == b + True + >>> def slot(**kwargs): + ... pass + ... + >>> a.connect(slot) + >>> a == b + False + >>> b.connect(slot) + >>> a == b + True + """ + return self.slots == other.slots + + def __repr__(self): + return '' % (self.name or 'NO_NAME') diff --git a/script.plexmod/lib/_included_packages/plexnet/signalslot/slot.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/slot.py new file mode 100644 index 000000000..18363e796 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalslot/slot.py @@ -0,0 +1,74 @@ +""" +Module defining the Slot class. +""" + +from __future__ import absolute_import +import types +import weakref +import sys + +from .signal import BaseSlot + +# We cannot test a branch for Python >= 3.4 in Python < 3.4. +if sys.version_info < (3, 4): # pragma: no cover + from weakrefmethod import WeakMethod +else: # pragma: no cover + from weakref import WeakMethod + + +class Slot(BaseSlot): + """ + A slot is a callable object that manages a connection to a signal. + If weak is true or the slot is a subclass of weakref.ref, the slot + is automatically de-referenced to the called function. + """ + def __init__(self, slot, weak=False): + self._weak = weak or isinstance(slot, weakref.ref) + if weak and not isinstance(slot, weakref.ref): + if isinstance(slot, types.MethodType): + slot = WeakMethod(slot) + else: + slot = weakref.ref(slot) + self._slot = slot + + @property + def is_alive(self): + """ + Return True if this slot is "alive". + """ + return (not self._weak) or (self._slot() is not None) + + @property + def func(self): + """ + Return the function that is called by this slot. + """ + if self._weak: + return self._slot() + else: + return self._slot + + def __call__(self, **kwargs): + """ + Execute this slot. + """ + func = self.func + if func is not None: + return func(**kwargs) + + def __eq__(self, other): + """ + Compare this slot to another. + """ + if isinstance(other, BaseSlot): + return self.func == other.func + else: + return self.func == other + + def __repr__(self): + fn = self.func + if fn is None: + fn = 'dead' + else: + fn = repr(fn) + return '' % fn diff --git a/script.plexmod/lib/_included_packages/plexnet/signalslot/tests.py b/script.plexmod/lib/_included_packages/plexnet/signalslot/tests.py new file mode 100644 index 000000000..87ff3dce8 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalslot/tests.py @@ -0,0 +1,206 @@ +from __future__ import absolute_import +import pytest +import mock + +from signalslot import Signal, SlotMustAcceptKeywords, Slot + + +@mock.patch('signalslot.signal.inspect') +class TestSignal(object): + def setup_method(self, method): + self.signal_a = Signal(threadsafe=True) + self.signal_b = Signal(args=['foo']) + + self.slot_a = mock.Mock(spec=lambda **kwargs: None) + self.slot_a.return_value = None + self.slot_b = mock.Mock(spec=lambda **kwargs: None) + self.slot_b.return_value = None + + def test_is_connected(self, inspect): + self.signal_a.connect(self.slot_a) + + assert self.signal_a.is_connected(self.slot_a) + assert not self.signal_a.is_connected(self.slot_b) + assert not self.signal_b.is_connected(self.slot_a) + assert not self.signal_b.is_connected(self.slot_b) + + def test_emit_one_slot(self, inspect): + self.signal_a.connect(self.slot_a) + + self.signal_a.emit() + + self.slot_a.assert_called_once_with() + assert self.slot_b.call_count == 0 + + def test_emit_two_slots(self, inspect): + self.signal_a.connect(self.slot_a) + self.signal_a.connect(self.slot_b) + + self.signal_a.emit() + + self.slot_a.assert_called_once_with() + self.slot_b.assert_called_once_with() + + def test_emit_one_slot_with_arguments(self, inspect): + self.signal_b.connect(self.slot_a) + + self.signal_b.emit(foo='bar') + + self.slot_a.assert_called_once_with(foo='bar') + assert self.slot_b.call_count == 0 + + def test_emit_two_slots_with_arguments(self, inspect): + self.signal_b.connect(self.slot_a) + self.signal_b.connect(self.slot_b) + + self.signal_b.emit(foo='bar') + + self.slot_a.assert_called_once_with(foo='bar') + self.slot_b.assert_called_once_with(foo='bar') + + def test_reconnect_does_not_duplicate(self, inspect): + self.signal_a.connect(self.slot_a) + self.signal_a.connect(self.slot_a) + self.signal_a.emit() + + self.slot_a.assert_called_once_with() + + def test_disconnect_does_not_fail_on_not_connected_slot(self, inspect): + self.signal_a.disconnect(self.slot_b) + + +def test_anonymous_signal_has_nice_repr(): + signal = Signal() + assert repr(signal) == '' + + +def test_named_signal_has_a_nice_repr(): + signal = Signal(name='update_stuff') + assert repr(signal) == '' + + +class TestSignalConnect(object): + def setup_method(self, method): + self.signal = Signal() + + def test_connect_with_kwargs(self): + def cb(**kwargs): + pass + + self.signal.connect(cb) + + def test_connect_without_kwargs(self): + def cb(): + pass + + with pytest.raises(SlotMustAcceptKeywords): + self.signal.connect(cb) + + +class MyTestError(Exception): + pass + + +class TestException(object): + def setup_method(self, method): + self.signal = Signal(threadsafe=False) + self.seen_exception = False + + def failing_slot(**args): + raise MyTestError('die!') + + self.signal.connect(failing_slot) + + def test_emit_exception(self): + try: + self.signal.emit() + except MyTestError: + self.seen_exception = True + + assert self.seen_exception + + +class TestStrongSlot(object): + def setup_method(self, method): + self.called = False + + def slot(**kwargs): + self.called = True + + self.slot = Slot(slot) + + def test_alive(self): + assert self.slot.is_alive + + def test_call(self): + self.slot(testing=1234) + assert self.called + + +class TestWeakFuncSlot(object): + def setup_method(self, method): + self.called = False + + def slot(**kwargs): + self.called = True + + self.slot = Slot(slot, weak=True) + self.slot_ref = slot + + def test_alive(self): + assert self.slot.is_alive + assert repr(self.slot) == '' % repr(self.slot_ref) + + def test_call(self): + self.slot(testing=1234) + assert self.called + + def test_gc(self): + self.slot_ref = None + assert not self.slot.is_alive + assert repr(self.slot) == '' + self.slot(testing=1234) + + +class TestWeakMethodSlot(object): + def setup_method(self, method): + + class MyObject(object): + + def __init__(self): + self.called = False + + def slot(self, **kwargs): + self.called = True + + self.obj_ref = MyObject() + self.slot = Slot(self.obj_ref.slot, weak=True) + self.signal = Signal() + self.signal.connect(self.slot) + + def test_alive(self): + assert self.slot.is_alive + + def test_call(self): + self.signal.emit(testing=1234) + assert self.obj_ref.called + + def test_gc(self): + self.obj_ref = None + assert not self.slot.is_alive + self.signal.emit(testing=1234) + + +class TestSlotEq(object): + def setup_method(self, method): + self.slot_a = Slot(self.slot, weak=False) + self.slot_b = Slot(self.slot, weak=True) + + def slot(self, **kwargs): + pass + + def test_eq_other(self): + assert self.slot_a == self.slot_b + + def test_eq_func(self): + assert self.slot_a == self.slot diff --git a/script.plexmod/lib/_included_packages/plexnet/signalsmixin.py b/script.plexmod/lib/_included_packages/plexnet/signalsmixin.py new file mode 100644 index 000000000..2efe9d6e6 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/signalsmixin.py @@ -0,0 +1,41 @@ +from __future__ import absolute_import +from . import signalslot + + +class SignalsMixin(object): + def __init__(self): + self._signals = {} + + def on(self, signalName, callback): + if signalName not in self._signals: + self._signals[signalName] = signalslot.Signal(threadsafe=True) + + signal = self._signals[signalName] + + signal.connect(callback) + + def off(self, signalName, callback): + if not self._signals: + return + + if not signalName: + if not callback: + self._signals = {} + else: + for name in self._signals: + self.off(name, callback) + else: + if not callback: + if signalName in self._signals: + del self._signals[signalName] + else: + self._signals[signalName].disconnect(callback) + + def trigger(self, signalName, **kwargs): + if not self._signals: + return + + if signalName not in self._signals: + return + + self._signals[signalName].emit(**kwargs) diff --git a/script.plexmod/lib/_included_packages/plexnet/simpleobjects.py b/script.plexmod/lib/_included_packages/plexnet/simpleobjects.py new file mode 100644 index 000000000..16b7b8a78 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/simpleobjects.py @@ -0,0 +1,21 @@ +class Res(tuple): + def __str__(self): + return '{0}x{1}'.format(*self[:2]) + + @classmethod + def fromString(cls, res_string): + try: + return cls([int(n) for n in res_string.split('x')]) + except: + return None + + +class AttributeDict(dict): + def __getattr__(self, attr): + return self.get(attr) + + def __setattr__(self, attr, value): + self[attr] = value + + def __repr__(self): + return '<{0}:{1}:{2}>'.format(self.__class__.__name__, self.id, self.get('title', 'None').encode('utf8')) diff --git a/script.plexmod/lib/_included_packages/plexnet/threadutils.py b/script.plexmod/lib/_included_packages/plexnet/threadutils.py new file mode 100644 index 000000000..fda46b4de --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/threadutils.py @@ -0,0 +1,94 @@ +# import inspect +# import ctypes +from __future__ import absolute_import +import threading +# import time + + +# def _async_raise(tid, exctype): +# '''Raises an exception in the threads with id tid''' +# if not inspect.isclass(exctype): +# raise TypeError("Only types can be raised (not instances)") + +# try: +# res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(exctype)) +# except AttributeError: +# # To catch: undefined symbol: PyThreadState_SetAsyncExc +# return + +# if res == 0: +# raise ValueError("invalid thread id") +# elif res != 1: +# # "if it returns a number greater than one, you're in trouble, +# # and you should call it again with exc=NULL to revert the effect" +# ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), 0) +# raise SystemError("PyThreadState_SetAsyncExc failed") + + +# class KillThreadException(Exception): +# pass + + +class KillableThread(threading.Thread): + pass + '''A thread class that supports raising exception in the thread from + another thread. + ''' + # def _get_my_tid(self): + # """determines this (self's) thread id + + # CAREFUL : this function is executed in the context of the caller + # thread, to get the identity of the thread represented by this + # instance. + # """ + # if not self.is_alive(): + # raise threading.ThreadError("the thread is not active") + + # return self.ident + + # def _raiseExc(self, exctype): + # """Raises the given exception type in the context of this thread. + + # If the thread is busy in a system call (time.sleep(), + # socket.accept(), ...), the exception is simply ignored. + + # If you are sure that your exception should terminate the thread, + # one way to ensure that it works is: + + # t = ThreadWithExc( ... ) + # ... + # t.raiseExc( SomeException ) + # while t.is_alive(): + # time.sleep( 0.1 ) + # t.raiseExc( SomeException ) + + # If the exception is to be caught by the thread, you need a way to + # check that your thread has caught it. + + # CAREFUL : this function is executed in the context of the + # caller thread, to raise an excpetion in the context of the + # thread represented by this instance. + # """ + # _async_raise(self._get_my_tid(), exctype) + + def kill(self, force_and_wait=False): + pass + # try: + # self._raiseExc(KillThreadException) + + # if force_and_wait: + # time.sleep(0.1) + # while self.is_alive(): + # self._raiseExc(KillThreadException) + # time.sleep(0.1) + # except threading.ThreadError: + # pass + + # def onKilled(self): + # pass + + # def run(self): + # try: + # self._Thread__target(*self._Thread__args, **self._Thread__kwargs) + # except KillThreadException: + # self.onKilled() diff --git a/script.plexmod/lib/_included_packages/plexnet/util.py b/script.plexmod/lib/_included_packages/plexnet/util.py new file mode 100644 index 000000000..031b36d49 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/util.py @@ -0,0 +1,311 @@ +from __future__ import absolute_import +from . import simpleobjects +import re +import sys +import time +import platform +import uuid +import threading +import six +from kodi_six import xbmcaddon + +from . import verlib +from . import compat + +if six.PY2: + Event = threading._Event +else: + Event = threading.Event + +BASE_HEADERS = '' + +# to maintain py2 compatibility, duplicate ADDON from lib.util to avoid circular import +ADDON = xbmcaddon.Addon() + + +def resetBaseHeaders(): + return { + 'X-Plex-Platform': X_PLEX_PLATFORM, + 'X-Plex-Platform-Version': X_PLEX_PLATFORM_VERSION, + 'X-Plex-Provides': X_PLEX_PROVIDES, + 'X-Plex-Product': "PM4K", + 'X-Plex-Version': ADDON.getAddonInfo('version'), + 'X-Plex-Device': X_PLEX_DEVICE, + 'X-Plex-Client-Identifier': X_PLEX_IDENTIFIER, + 'Accept-Encoding': 'gzip,deflate', + 'Accept-Language': ACCEPT_LANGUAGE, + 'User-Agent': '{0}/{1}'.format("PM4K", ADDON.getAddonInfo('version')) + } + + +# Core Settings +PROJECT = 'PlexNet' # name provided to plex server +VERSION = '0.0.0a1' # version of this api +TIMEOUT = 10 # request timeout +LONG_TIMEOUT = 20 # s +CONN_CHECK_TIMEOUT = 2.5 # s +LAN_REACHABILITY_TIMEOUT = 10 # ms +CHECK_LOCAL = False +LOCAL_OVER_SECURE = False +X_PLEX_CONTAINER_SIZE = 50 # max results to return in a single search page + +ACCEPT_LANGUAGE = 'en-US,en' + +# Plex Header Configuation +X_PLEX_PROVIDES = 'player,controller' # one or more of [player, controller, server] +X_PLEX_PLATFORM = platform.uname()[0] # Platform name, eg iOS, MacOSX, Android, LG, etc +X_PLEX_PLATFORM_VERSION = platform.uname()[2] # Operating system version, eg 4.3.1, 10.6.7, 3.2 +X_PLEX_PRODUCT = PROJECT # Plex application name, eg Laika, Plex Media Server, Media Link +X_PLEX_VERSION = VERSION # Plex application version number +USER_AGENT = '{0}/{1}'.format(PROJECT, VERSION) + +INTERFACE = None +TIMER = None +APP = None +MANAGER = None + +try: + _platform = platform.system() +except: + try: + _platform = platform.platform(terse=True) + except: + _platform = sys.platform + +X_PLEX_DEVICE = _platform # Device name and model number, eg iPhone3,2, Motorola XOOM, LG5200TV +X_PLEX_IDENTIFIER = str(hex(uuid.getnode())) # UUID, serial number, or other number unique per device + +BASE_HEADERS = resetBaseHeaders() + +QUALITY_LOCAL = 0 +QUALITY_REMOTE = 1 +QUALITY_ONLINE = 2 + +Res = simpleobjects.Res +AttributeDict = simpleobjects.AttributeDict + + +def setInterface(interface): + global INTERFACE + INTERFACE = interface + + +def setTimer(timer): + global TIMER + TIMER = timer + + +def setApp(app): + global APP + APP = app + + +def LOG(msg): + INTERFACE.LOG(msg) + + +def DEBUG_LOG(msg): + INTERFACE.DEBUG_LOG(msg) + + +def ERROR_LOG(msg): + INTERFACE.ERROR_LOG(msg) + + +def WARN_LOG(msg): + INTERFACE.WARN_LOG(msg) + + +def ERROR(msg=None, err=None): + INTERFACE.ERROR(msg, err) + + +def FATAL(msg=None): + INTERFACE.FATAL(msg) + + +def TEST(msg): + INTERFACE.LOG(' ---TEST: {0}'.format(msg)) + + +def userAgent(): + return INTERFACE.getGlobal("userAgent") + + +def dummyTranslate(string): + return string + + +def hideToken(token): + # return 'X' * len(token) + if not token: + return token + return '****' + token[-4:] + + +def cleanToken(url): + return re.sub('X-Plex-Token=[^&]+', 'X-Plex-Token=****', url) + + +def now(local=False): + if local: + return time.time() + else: + return time.mktime(time.gmtime()) + + +def joinArgs(args, includeQuestion=True): + if not args: + return '' + + arglist = [] + for key in sorted(args, key=lambda x: x.lower()): + value = str(args[key]) + arglist.append('{0}={1}'.format(key, compat.quote(value))) + + return '{0}{1}'.format(includeQuestion and '?' or '&', '&'.join(arglist)) + + +def addPlexHeaders(transferObj, token=None): + headers = {"X-Plex-Platform": INTERFACE.getGlobal("platform"), + "X-Plex-Version": INTERFACE.getGlobal("appVersionStr"), + "X-Plex-Client-Identifier": INTERFACE.getGlobal("clientIdentifier"), + "X-Plex-Platform-Version": INTERFACE.getGlobal("platformVersion", "unknown"), + "X-Plex-Product": INTERFACE.getGlobal("product"), + "X-Plex-Provides": not INTERFACE.getPreference("remotecontrol", False) and 'player' or '', + "X-Plex-Device": INTERFACE.getGlobal("device"), + "X-Plex-Model": INTERFACE.getGlobal("model"), + "X-Plex-Device-Name": INTERFACE.getGlobal("friendlyName"), + } + + transferObj.session.headers.update(headers) + + # Adding the X-Plex-Client-Capabilities header causes node.plexapp.com to 500 + if not type(transferObj) == "roUrlTransfer" or 'node.plexapp.com' not in transferObj.getUrl(): + transferObj.addHeader("X-Plex-Client-Capabilities", INTERFACE.getCapabilities()) + + addAccountHeaders(transferObj, token) + + +def addAccountHeaders(transferObj, token=None): + if token: + transferObj.addHeader("X-Plex-Token", token) + + # TODO(schuyler): Add username? + + +def validInt(int_str): + try: + return int(int_str) + except: + return 0 + + +def bitrateToString(bits): + if not bits: + return '' + + speed = bits / 1000000.0 + if speed < 1: + speed = int(round(bits / 1000.0)) + return '{0} Kbps'.format(speed) + else: + return '{0:.1f} Mbps'.format(speed) + + +def normalizedVersion(ver): + try: + modv = '.'.join(ver.split('.')[:4]).split('-', 1)[0] # Clean the version i.e. Turn 1.2.3.4-asdf8-ads7f into 1.2.3.4 + return verlib.NormalizedVersion(verlib.suggest_normalized_version(modv)) + except: + if ver: + ERROR() + return verlib.NormalizedVersion(verlib.suggest_normalized_version('0.0.0')) + + +class CompatEvent(Event): + def wait(self, timeout): + Event.wait(self, timeout) + return self.isSet() + + +class Timer(object): + def __init__(self, timeout, function, repeat=False, name=None, fname=None, *args, **kwargs): + self.function = function + self.timeout = timeout + self.repeat = repeat + self.args = args + self.kwargs = kwargs + self._reset = False + self.name = name or 'TIMER:{0}'.format(self.function) + self.fname = fname or repr(self.function) + self.event = CompatEvent() + self.start() + + def start(self): + self.event.clear() + self.thread = threading.Thread(target=self.run, name=self.name, *self.args, **self.kwargs) + self.thread.start() + + def run(self): + DEBUG_LOG('Timer {0}: {1}'.format(self.fname, self._reset and 'RESET'or 'STARTED')) + try: + while not self.event.isSet() and not self.shouldAbort(): + while not self.event.wait(self.timeout) and not self.shouldAbort(): + if self._reset: + return + + self.function(*self.args, **self.kwargs) + if not self.repeat: + return + finally: + if not self._reset: + if self in APP.timers: + APP.timers.remove(self) + + DEBUG_LOG('Timer {0}: FINISHED'.format(self.fname)) + + self._reset = False + + def cancel(self): + self.event.set() + + def reset(self): + self._reset = True + self.cancel() + if self.thread and self.thread.is_alive(): + self.thread.join() + self.start() + + def is_alive(self): + return self.thread and self.thread.is_alive() + + def shouldAbort(self): + return False + + def join(self): + if self.thread.is_alive(): + self.thread.join() + + def isExpired(self): + return self.event.isSet() + + +class RepeatingCounterTimer(Timer): + def __init__(self, timeout, function, repeat=True, *args, **kwargs): + self.ticks = 0 + self._function = function + super(RepeatingCounterTimer, self).__init__(timeout, self.count, repeat=repeat, + name='TIMER:{0}'.format(function), + fname=repr(function), *args, **kwargs) + + def count(self): + self.ticks += 1 + self._function(*self.args, **self.kwargs) + + def reset(self): + super(RepeatingCounterTimer, self).reset() + self.ticks = 0 + + +TIMER = Timer diff --git a/script.plexmod/lib/_included_packages/plexnet/verlib.py b/script.plexmod/lib/_included_packages/plexnet/verlib.py new file mode 100644 index 000000000..a06889031 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/verlib.py @@ -0,0 +1,329 @@ +""" +"Rational" version definition and parsing for DistutilsVersionFight +discussion at PyCon 2009. +""" +from __future__ import absolute_import +import re + + +class IrrationalVersionError(Exception): + """This is an irrational version.""" + pass + + +class HugeMajorVersionNumError(IrrationalVersionError): + """An irrational version because the major version number is huge + (often because a year or date was used). + + See `error_on_huge_major_num` option in `NormalizedVersion` for details. + This guard can be disabled by setting that option False. + """ + pass + +# A marker used in the second and third parts of the `parts` tuple, for +# versions that don't have those segments, to sort properly. An example +# of versions in sort order ('highest' last): +# 1.0b1 ((1,0), ('b',1), ('f',)) +# 1.0.dev345 ((1,0), ('f',), ('dev', 345)) +# 1.0 ((1,0), ('f',), ('f',)) +# 1.0.post256.dev345 ((1,0), ('f',), ('f', 'post', 256, 'dev', 345)) +# 1.0.post345 ((1,0), ('f',), ('f', 'post', 345, 'f')) +# ^ ^ ^ +# 'b' < 'f' ---------------------/ | | +# | | +# 'dev' < 'f' < 'post' -------------------/ | +# | +# 'dev' < 'f' ----------------------------------------------/ +# Other letters would do, but 'f' for 'final' is kind of nice. +FINAL_MARKER = ('f',) + +VERSION_RE = re.compile(r''' + ^ + (?P\d+\.\d+) # minimum 'N.N' + (?P(?:\.\d+)*) # any number of extra '.N' segments + (?: + (?P[abc]|rc) # 'a'=alpha, 'b'=beta, 'c'=release candidate + # 'rc'= alias for release candidate + (?P\d+(?:\.\d+)*) + )? + (?P(\.post(?P\d+))?(\.dev(?P\d+))?)? + $''', re.VERBOSE) + + +class NormalizedVersion(object): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # mininum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + + def __init__(self, s, error_on_huge_major_num=True): + """Create a NormalizedVersion instance from a version string. + + @param s {str} The version string. + @param error_on_huge_major_num {bool} Whether to consider an + apparent use of a year or full date as the major version number + an error. Default True. One of the observed patterns on PyPI before + the introduction of `NormalizedVersion` was version numbers like this: + 2009.01.03 + 20040603 + 2005.01 + This guard is here to strongly encourage the package author to + use an alternate version, because a release deployed into PyPI + and, e.g. downstream Linux package managers, will forever remove + the possibility of using a version number like "1.0" (i.e. + where the major number is less than that huge major number). + """ + self._parse(s, error_on_huge_major_num) + + @classmethod + def from_parts(cls, version, prerelease=FINAL_MARKER, + devpost=FINAL_MARKER): + return cls(cls.parts_to_str((version, prerelease, devpost))) + + def _parse(self, s, error_on_huge_major_num=True): + """Parses a string version into parts.""" + match = VERSION_RE.search(s) + if not match: + raise IrrationalVersionError(s) + + groups = match.groupdict() + parts = [] + + # main version + block = self._parse_numdots(groups['version'], s, False, 2) + extraversion = groups.get('extraversion') + if extraversion not in ('', None): + block += self._parse_numdots(extraversion[1:], s) + parts.append(tuple(block)) + + # prerelease + prerel = groups.get('prerel') + if prerel is not None: + block = [prerel] + block += self._parse_numdots(groups.get('prerelversion'), s, + pad_zeros_length=1) + parts.append(tuple(block)) + else: + parts.append(FINAL_MARKER) + + # postdev + if groups.get('postdev'): + post = groups.get('post') + dev = groups.get('dev') + postdev = [] + if post is not None: + postdev.extend([FINAL_MARKER[0], 'post', int(post)]) + if dev is None: + postdev.append(FINAL_MARKER[0]) + if dev is not None: + postdev.extend(['dev', int(dev)]) + parts.append(tuple(postdev)) + else: + parts.append(FINAL_MARKER) + self.parts = tuple(parts) + if error_on_huge_major_num and self.parts[0][0] > 1980: + raise HugeMajorVersionNumError("huge major version number, %r, " + "which might cause future problems: %r" % (self.parts[0][0], s)) + + def _parse_numdots(self, s, full_ver_str, drop_trailing_zeros=True, + pad_zeros_length=0): + """Parse 'N.N.N' sequences, return a list of ints. + + @param s {str} 'N.N.N..." sequence to be parsed + @param full_ver_str {str} The full version string from which this + comes. Used for error strings. + @param drop_trailing_zeros {bool} Whether to drop trailing zeros + from the returned list. Default True. + @param pad_zeros_length {int} The length to which to pad the + returned list with zeros, if necessary. Default 0. + """ + nums = [] + for n in s.split("."): + if len(n) > 1 and n[0] == '0': + raise IrrationalVersionError("cannot have leading zero in " + "version number segment: '%s' in %r" % (n, full_ver_str)) + nums.append(int(n)) + if drop_trailing_zeros: + while nums and nums[-1] == 0: + nums.pop() + while len(nums) < pad_zeros_length: + nums.append(0) + return nums + + def __str__(self): + return self.parts_to_str(self.parts) + + @classmethod + def parts_to_str(cls, parts): + """Transforms a version expressed in tuple into its string + representation.""" + # XXX This doesn't check for invalid tuples + main, prerel, postdev = parts + s = '.'.join(str(v) for v in main) + if prerel is not FINAL_MARKER: + s += prerel[0] + s += '.'.join(str(v) for v in prerel[1:]) + if postdev and postdev is not FINAL_MARKER: + if postdev[0] == 'f': + postdev = postdev[1:] + i = 0 + while i < len(postdev): + if i % 2 == 0: + s += '.' + s += str(postdev[i]) + i += 1 + return s + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self) + + def _cannot_compare(self, other): + raise TypeError("cannot compare %s and %s" + % (type(self).__name__, type(other).__name__)) + + def __eq__(self, other): + if not isinstance(other, NormalizedVersion): + self._cannot_compare(other) + return self.parts == other.parts + + def __lt__(self, other): + if not isinstance(other, NormalizedVersion): + self._cannot_compare(other) + return self.parts < other.parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__eq__(other) or self.__lt__(other) + + def __ge__(self, other): + return self.__eq__(other) or self.__gt__(other) + + +def suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + - with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + NormalizedVersion(s) + return s # already rational + except IrrationalVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is pobably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc|rc])[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + # TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.3.post17222 + # 0.9.33-r17222 -> 0.9.3.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.3.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + NormalizedVersion(rs) + return rs # already rational + except IrrationalVersionError: + pass + return None diff --git a/script.plexmod/lib/_included_packages/plexnet/video.py b/script.plexmod/lib/_included_packages/plexnet/video.py new file mode 100644 index 000000000..8adae39f7 --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/video.py @@ -0,0 +1,782 @@ +from __future__ import absolute_import +from functools import wraps + +from . import plexobjects +from . import media +from . import plexmedia +from . import plexstream +from . import exceptions +from . import compat +from . import plexlibrary +from . import util +from . import mediachoice + + +class PlexVideoItemList(plexobjects.PlexItemList): + def __init__(self, data, initpath=None, server=None, container=None): + self._data = data + self._initpath = initpath + self._server = server + self._container = container + self._items = None + + @property + def items(self): + if self._items is None: + if self._data is not None: + self._items = [plexobjects.buildItem(self._server, elem, self._initpath, container=self._container) for elem in self._data] + else: + self._items = [] + + return self._items + + +def forceMediaChoice(method): + @wraps(method) + def _impl(self, *method_args, **method_kwargs): + # set mediaChoice if we don't have any yet, or the one we have is incomplete and the new one isn't + media = method_kwargs.get("media", self.media()[0]) + partIndex = method_kwargs.get("partIndex", 0) + if not self.mediaChoice or (not self.mediaChoice.media.hasStreams() and media.hasStreams()): + self.setMediaChoice(media=media, partIndex=partIndex) + return method(self, *method_args, **method_kwargs) + return _impl + + +class Video(media.MediaItem): + TYPE = None + manually_selected_sub_stream = False + current_subtitle_is_embedded = False + _current_subtitle_idx = None + + def __init__(self, *args, **kwargs): + self._settings = None + media.MediaItem.__init__(self, *args, **kwargs) + + def __eq__(self, other): + return other and self.ratingKey == other.ratingKey + + def __ne__(self, other): + return not self.__eq__(other) + + @property + def settings(self): + if not self._settings: + from . import plexapp + self._settings = plexapp.PlayerSettingsInterface() + + return self._settings + + @settings.setter + def settings(self, value): + self._settings = value + + # overridden by Movie/Episode + @property + def subtitleStreams(self): + return [] + + @property + def videoStreams(self): + return [] + + @property + def audioStreams(self): + return [] + + def selectedVideoStream(self, fallback=False): + if self.videoStreams: + for stream in self.videoStreams: + if stream.isSelected(): + return stream + if fallback: + return self.videoStreams[0] + return None + + def selectedAudioStream(self, fallback=False): + if self.audioStreams: + for stream in self.audioStreams: + if stream.isSelected(): + return stream + if fallback: + return self.audioStreams[0] + return None + + def selectedSubtitleStream(self, forced_subtitles_override=False, fallback=False): + if self._current_subtitle_idx: + try: + return self.subtitleStreams[self._current_subtitle_idx] + except IndexError: + pass + + if self.subtitleStreams: + for stream in self.subtitleStreams: + if stream.isSelected(): + if forced_subtitles_override and \ + stream.forced.asBool() and self.manually_selected_sub_stream != stream.id: + # try finding a non-forced variant of this stream + possible_alt = None + for alt_stream in self.subtitleStreams: + if alt_stream.language == stream.language and alt_stream != stream \ + and not alt_stream.forced.asBool(): + if possible_alt and not possible_alt.key and alt_stream.key: + possible_alt = alt_stream + break + if not possible_alt: + possible_alt = alt_stream + if possible_alt: + util.DEBUG_LOG("Selecting stream %s instead of %s" % + (possible_alt, stream)) + stream.setSelected(False) + possible_alt.setSelected(True) + self.current_subtitle_is_embedded = possible_alt.embedded + if self._current_subtitle_idx != possible_alt.typeIndex: + self._current_subtitle_idx = possible_alt.typeIndex + return possible_alt + + if self._current_subtitle_idx != stream.typeIndex: + self._current_subtitle_idx = stream.typeIndex + self.current_subtitle_is_embedded = stream.embedded + return stream + if fallback: + stream = self.subtitleStreams[0] + if self._current_subtitle_idx != stream.typeIndex: + self._current_subtitle_idx = stream.typeIndex + return stream + return None + + def setMediaChoice(self, media=None, partIndex=0): + media = media or self.media()[0] + self.mediaChoice = mediachoice.MediaChoice(media, partIndex=partIndex) + + @forceMediaChoice + def selectStream(self, stream, _async=True): + self.mediaChoice.part.setSelectedStream(stream.streamType.asInt(), stream.id, _async) + # Update any affected streams + if stream.streamType.asInt() == plexstream.PlexStream.TYPE_AUDIO: + for audioStream in self.audioStreams: + if audioStream.id == stream.id: + audioStream.setSelected(True) + elif audioStream.isSelected(): + audioStream.setSelected(False) + elif stream.streamType.asInt() == plexstream.PlexStream.TYPE_SUBTITLE: + self._current_subtitle_idx = None + self.current_subtitle_is_embedded = False + for subtitleStream in self.subtitleStreams: + if subtitleStream.id == stream.id: + subtitleStream.setSelected(True) + self.current_subtitle_is_embedded = subtitleStream.embedded + self._current_subtitle_idx = subtitleStream.typeIndex + elif subtitleStream.isSelected(): + subtitleStream.setSelected(False) + + @forceMediaChoice + def cycleSubtitles(self, forward=True): + amount = len(self.subtitleStreams) + if not amount: + return False + cur = self.selectedSubtitleStream() + if not cur: + # use fallback + stream = self.selectedSubtitleStream(fallback=True) + else: + # set next if we're not at the end of the list + if forward: + if cur.typeIndex < len(self.subtitleStreams) - 1: + stream = self.subtitleStreams[cur.typeIndex+1] + else: + stream = self.subtitleStreams[0] + else: + if cur.typeIndex > 0: + stream = self.subtitleStreams[cur.typeIndex - 1] + else: + stream = self.subtitleStreams[-1] + + util.DEBUG_LOG("Selecting subtitle stream: {} (was: {})".format(stream, cur)) + self.selectStream(stream) + return stream + + @forceMediaChoice + def disableSubtitles(self): + self.selectStream(plexstream.NONE_STREAM) + + @property + def hasSubtitle(self): + return bool(self.selectedSubtitleStream()) + + @property + def hasSubtitles(self): + return bool(self.subtitleStreams) + + def isVideoItem(self): + return True + + @forceMediaChoice + def _findStreams(self, streamtype, withMC=True): + idx = 0 + streams = [] + source = [self.mediaChoice.media] if withMC else self.media() + for media_ in source: + parts = [self.mediaChoice.part] if withMC else media_.parts + for part in parts: + for stream in part.streams: + if stream.streamType.asInt() == streamtype: + stream.typeIndex = idx + streams.append(stream) + idx += 1 + return streams + + def analyze(self): + """ The primary purpose of media analysis is to gather information about that media + item. All of the media you add to a Library has properties that are useful to + know - whether it's a video file, a music track, or one of your photos. + """ + self.server.query('/%s/analyze' % self.key) + + def markWatched(self, **kwargs): + path = '/:/scrobble?key=%s&identifier=com.plexapp.plugins.library' % self.ratingKey + self.server.query(path) + self.reload(**kwargs) + + def markUnwatched(self, **kwargs): + path = '/:/unscrobble?key=%s&identifier=com.plexapp.plugins.library' % self.ratingKey + self.server.query(path) + self.reload(**kwargs) + + # def play(self, client): + # client.playMedia(self) + + def refresh(self): + self.server.query('%s/refresh' % self.key, method=self.server.session.put) + + def _getStreamURL(self, **params): + if self.TYPE not in ('movie', 'episode', 'track'): + raise exceptions.Unsupported('Fetching stream URL for %s is unsupported.' % self.TYPE) + mvb = params.get('maxVideoBitrate') + vr = params.get('videoResolution') + + # import plexapp + + params = { + 'path': self.key, + 'offset': params.get('offset', 0), + 'copyts': params.get('copyts', 1), + 'protocol': params.get('protocol', 'hls'), + 'mediaIndex': params.get('mediaIndex', 0), + 'directStream': '1', + 'directPlay': '0', + 'X-Plex-Platform': params.get('platform', ''), + # 'X-Plex-Platform': params.get('platform', util.INTERFACE.getGlobal('platform')), + 'maxVideoBitrate': max(mvb, 64) if mvb else None, + 'videoResolution': '{0}x{1}'.format(*vr) if vr else None + } + + final = {} + + for k, v in params.items(): + if v is not None: # remove None values + final[k] = v + + streamtype = 'audio' if self.TYPE in ('track', 'album') else 'video' + server = self.getTranscodeServer(True, self.TYPE) + + return server.buildUrl('/{0}/:/transcode/universal/start.m3u8?{1}'.format(streamtype, compat.urlencode(final)), includeToken=True) + # path = "/video/:/transcode/universal/" + command + "?session=" + AppSettings().GetGlobal("clientIdentifier") + + @forceMediaChoice + def resolutionString(self): + res = self.mediaChoice.media.videoResolution + if not res: + return '' + + if res.isdigit(): + return '{0}p'.format(self.mediaChoice.media.videoResolution) + else: + return res.upper() + + @forceMediaChoice + def audioCodecString(self): + codec = (self.mediaChoice.media.audioCodec or '').lower() + + if codec in ('dca', 'dca-ma', 'dts-hd', 'dts-es', 'dts-hra'): + codec = "DTS" + else: + codec = codec.upper() + + return codec + + @forceMediaChoice + def videoCodecString(self): + return (self.mediaChoice.media.videoCodec or '').upper() + + @property + @forceMediaChoice + def videoCodecRendering(self): + stream = self.mediaChoice.videoStream + + if not stream: + return '' + + return stream.videoCodecRendering + + @forceMediaChoice + def audioChannelsString(self, translate_func=util.dummyTranslate): + channels = self.mediaChoice.media.audioChannels.asInt() + + if channels == 1: + return translate_func("Mono") + elif channels == 2: + return translate_func("Stereo") + elif channels > 0: + return "{0}.1".format(channels - 1) + else: + return "" + + @property + def remainingTime(self): + if not self.viewOffset.asInt(): + return + return (self.duration.asInt() - self.viewOffset.asInt()) // 1000 + + @property + def remainingTimeString(self): + if not self.remainingTime: + return '' + seconds = self.remainingTime + hours = seconds // 3600 + minutes = (seconds - hours * 3600) // 60 + return (hours and "{}h ".format(hours) or '') + (minutes and "{}m".format(minutes) or "0m") + + def available(self): + return any(v.isAccessible() for v in self.media()) + + +class RelatedMixin(object): + _relatedCount = None + + @property + def relatedCount(self): + if self._relatedCount is None: + related = self.getRelated(0, 0) + if related is not None: + self._relatedCount = related.totalSize + else: + self._relatedCount = 0 + + return self._relatedCount + + @property + def related(self): + return self.getRelated(0, 8) + + def getRelated(self, offset=None, limit=None, _max=36): + path = '/library/metadata/%s/similar' % self.ratingKey + try: + return plexobjects.listItems(self.server, path, offset=offset, limit=limit, params={"count": _max}) + except exceptions.BadRequest: + util.DEBUG_LOG("Invalid related items response returned for %s" % self) + return None + + +class SectionOnDeckMixin(object): + _sectionOnDeckCount = None + + def sectionOnDeck(self, offset=None, limit=None): + query = '/library/sections/{0}/onDeck'.format(self.getLibrarySectionId()) + return plexobjects.listItems(self.server, query, offset=offset, limit=limit) + + @property + def sectionOnDeckCount(self): + if self._sectionOnDeckCount is None: + self._sectionOnDeckCount = self.sectionOnDeck(0, 0).totalSize + + return self._sectionOnDeckCount + + +class PlayableVideo(Video, RelatedMixin): + TYPE = None + _videoStreams = None + _audioStreams = None + _subtitleStreams = None + _current_subtitle_idx = None + + def _setData(self, data): + Video._setData(self, data) + if self.isFullObject(): + self.extras = PlexVideoItemList(data.find('Extras'), initpath=self.initpath, server=self.server, container=self) + self.chapters = plexobjects.PlexItemList(data, media.Chapter, media.Chapter.TYPE, server=self.server) + + self.resetStreams() + + def setMediaChoice(self, *args, **kwargs): + """ + Reset cached streams after setting a mediaChoice + """ + super(PlayableVideo, self).setMediaChoice(*args, **kwargs) + self.resetStreams() + + def resetStreams(self): + self._videoStreams = None + self._audioStreams = None + self._subtitleStreams = None + + def reload(self, *args, **kwargs): + if not kwargs.get('_soft'): + if self.get('viewCount'): + del self.viewCount + if self.get('viewOffset'): + del self.viewOffset + + fromMediaChoice = kwargs.get("fromMediaChoice", False) + + # capture current IDs + mediaID = None + partID = None + streamIDs = None + reSelect = False + if fromMediaChoice and self.mediaChoice: + reSelect = True + mediaID = self.mediaChoice.media.id + partID = self.mediaChoice.part.id + streamIDs = [] + if self.mediaChoice.media.hasStreams(): + subtitleStream = self.selectedSubtitleStream(fallback=False) + streamIDs = [self.selectedVideoStream(fallback=True).id, + self.selectedAudioStream(fallback=True).id] + if subtitleStream: + streamIDs.append(subtitleStream.id) + + Video.reload(self, *args, **kwargs) + + # re-select selected IDs + if reSelect: + selMedia = None + selPartIndex = 0 + for media in self.media: + if media.id == mediaID: + selMedia = media + media.set('selected', '1') + for index, part in enumerate(media.parts): + if part.id == partID: + selPartIndex = index + for stream in part.streams: + if stream.id in streamIDs: + stream.setSelected(True) + self.mediaChoice = mediachoice.MediaChoice(selMedia, partIndex=selPartIndex) + + return self + + def postPlay(self, **params): + query = '/hubs/metadata/{0}/postplay'.format(self.ratingKey) + data = self.server.query(query, params=params) + container = plexobjects.PlexContainer(data, initpath=query, server=self.server, address=query) + + hubs = {} + + for elem in data: + hub = plexlibrary.Hub(elem, server=self.server, container=container) + hubs[hub.hubIdentifier] = hub + return hubs + + +@plexobjects.registerLibType +class Movie(PlayableVideo): + TYPE = 'movie' + + def _setData(self, data): + PlayableVideo._setData(self, data) + if self.isFullObject(): + self.collections = plexobjects.PlexItemList(data, media.Collection, media.Collection.TYPE, + server=self.server) + self.countries = plexobjects.PlexItemList(data, media.Country, media.Country.TYPE, server=self.server) + self.directors = plexobjects.PlexItemList(data, media.Director, media.Director.TYPE, server=self.server) + self.genres = plexobjects.PlexItemList(data, media.Genre, media.Genre.TYPE, server=self.server) + self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, + initpath=self.initpath, server=self.server, media=self) + self.producers = plexobjects.PlexItemList(data, media.Producer, media.Producer.TYPE, server=self.server) + self.roles = plexobjects.PlexItemList(data, media.Role, media.Role.TYPE, server=self.server, + container=self.container) + self.reviews = plexobjects.PlexItemList(data, media.Review, media.Review.TYPE, server=self.server, + container=self.container) + self.writers = plexobjects.PlexItemList(data, media.Writer, media.Writer.TYPE, server=self.server) + #self.related = plexobjects.PlexItemList(data.find('Related'), plexlibrary.Hub, plexlibrary.Hub.TYPE, server=self.server, container=self) + else: + if data.find(media.Media.TYPE) is not None: + self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, initpath=self.initpath, server=self.server, media=self) + + self.markers = plexobjects.PlexItemList(data, media.Marker, media.Marker.TYPE, server=self.server) + + # data for active sessions + self.sessionKey = plexobjects.PlexValue(data.attrib.get('sessionKey', ''), self) + self.user = self._findUser(data) + self.player = self._findPlayer(data) + self.session = self._findSession(data) + self.transcodeSession = self._findTranscodeSession(data) + + @property + def defaultTitle(self): + title = self.title or '' + if self.editionTitle: + title = title + " \u2022 " + self.editionTitle + return title + + @property + def maxHeight(self): + height = 0 + for m in self.media: + if m.height.asInt() > height: + height = m.height.asInt() + return height + + @property + def videoStreams(self): + if self._videoStreams is None: + self._videoStreams = self._findStreams(plexstream.PlexStream.TYPE_VIDEO) + return self._videoStreams + + @property + def audioStreams(self): + if self._audioStreams is None: + self._audioStreams = self._findStreams(plexstream.PlexStream.TYPE_AUDIO) + return self._audioStreams + + @property + def subtitleStreams(self): + if self._subtitleStreams is None: + self._subtitleStreams = self._findStreams(plexstream.PlexStream.TYPE_SUBTITLE) + return self._subtitleStreams + + @property + def actors(self): + return self.roles + + @property + def isWatched(self): + return self.get('viewCount').asInt() > 0 or self.get('viewOffset').asInt() > 0 + + def getStreamURL(self, **params): + return self._getStreamURL(**params) + + +@plexobjects.registerLibType +class Show(Video, RelatedMixin, SectionOnDeckMixin): + TYPE = 'show' + + def _setData(self, data): + Video._setData(self, data) + if self.isFullObject(): + self.genres = plexobjects.PlexItemList(data, media.Genre, media.Genre.TYPE, server=self.server) + self.roles = plexobjects.PlexItemList(data, media.Role, media.Role.TYPE, server=self.server, container=self.container) + #self.related = plexobjects.PlexItemList(data.find('Related'), plexlibrary.Hub, plexlibrary.Hub.TYPE, server=self.server, container=self) + self.extras = PlexVideoItemList(data.find('Extras'), initpath=self.initpath, server=self.server, container=self) + + @property + def unViewedLeafCount(self): + return self.leafCount.asInt() - self.viewedLeafCount.asInt() + + @property + def isWatched(self): + return self.viewedLeafCount == self.leafCount + + @property + def playbackSettings(self): + return util.INTERFACE.playbackManager(self) + + def seasons(self): + path = self.key + return plexobjects.listItems(self.server, path, Season.TYPE) + + def season(self, title): + path = self.key + return plexobjects.findItem(self.server, path, title) + + def episodes(self, watched=None, offset=None, limit=None): + leavesKey = '/library/metadata/%s/allLeaves' % self.ratingKey + return plexobjects.listItems(self.server, leavesKey, watched=watched, offset=offset, limit=limit) + + def episode(self, title): + path = '/library/metadata/%s/allLeaves' % self.ratingKey + return plexobjects.findItem(self.server, path, title) + + def all(self): + return self.episodes() + + def watched(self): + return self.episodes(watched=True) + + def unwatched(self): + return self.episodes(watched=False) + + def refresh(self): + self.server.query('/library/metadata/%s/refresh' % self.ratingKey) + + +@plexobjects.registerLibType +class Season(Video): + TYPE = 'season' + + def _setData(self, data): + Video._setData(self, data) + if self.isFullObject(): + self.extras = PlexVideoItemList(data.find('Extras'), initpath=self.initpath, server=self.server, container=self) + + @property + def defaultTitle(self): + return self.parentTitle or self.title + + @property + def unViewedLeafCount(self): + return self.leafCount.asInt() - self.viewedLeafCount.asInt() + + @property + def isWatched(self): + return self.viewedLeafCount == self.leafCount + + def episodes(self, watched=None, offset=None, limit=None): + path = self.key + return plexobjects.listItems(self.server, path, watched=watched, offset=offset, limit=limit) + + def episode(self, title): + path = self.key + return plexobjects.findItem(self.server, path, title) + + def all(self): + return self.episodes() + + def show(self): + return plexobjects.listItems(self.server, self.parentKey)[0] + + def watched(self): + return self.episodes(watched=True) + + def unwatched(self): + return self.episodes(watched=False) + + +@plexobjects.registerLibType +class Episode(PlayableVideo, SectionOnDeckMixin): + TYPE = 'episode' + + def init(self, data): + self._show = None + self._season = None + + def _setData(self, data): + PlayableVideo._setData(self, data) + if self.isFullObject(): + self.directors = plexobjects.PlexItemList(data, media.Director, media.Director.TYPE, server=self.server) + self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, initpath=self.initpath, server=self.server, media=self) + self.writers = plexobjects.PlexItemList(data, media.Writer, media.Writer.TYPE, server=self.server) + else: + if data.find(media.Media.TYPE) is not None: + self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, initpath=self.initpath, server=self.server, media=self) + + self.markers = plexobjects.PlexItemList(data, media.Marker, media.Marker.TYPE, server=self.server) + + # data for active sessions + self.sessionKey = plexobjects.PlexValue(data.attrib.get('sessionKey', ''), self) + self.user = self._findUser(data) + self.player = self._findPlayer(data) + self.session = self._findSession(data) + self.transcodeSession = self._findTranscodeSession(data) + + @property + def defaultTitle(self): + return self.grandparentTitle or self.parentTitle or self.title + + @property + def defaultThumb(self): + return self.grandparentThumb or self.parentThumb or self.thumb + + @property + def videoStreams(self): + if self._videoStreams is None: + self._videoStreams = self._findStreams(plexstream.PlexStream.TYPE_VIDEO) + return self._videoStreams + + @property + def audioStreams(self): + if self._audioStreams is None: + self._audioStreams = self._findStreams(plexstream.PlexStream.TYPE_AUDIO) + return self._audioStreams + + @property + def subtitleStreams(self): + if self._subtitleStreams is None: + self._subtitleStreams = self._findStreams(plexstream.PlexStream.TYPE_SUBTITLE) + return self._subtitleStreams + + @property + def isWatched(self): + return self.get('viewCount').asInt() > 0 or self.get('viewOffset').asInt() > 0 + + @property + def playbackSettings(self): + return self.show().playbackSettings + + def getStreamURL(self, **params): + return self._getStreamURL(**params) + + def season(self): + skipParent = self.get('skipParent').asBool() + key = self.parentKey if not skipParent else self.grandparentKey + if not self._season: + items = plexobjects.listItems(self.server, key) + + if items: + self._season = items[0] + return self._season + + def show(self): + if not self._show: + self._show = plexobjects.listItems(self.server, self.grandparentKey)[0] + return self._show + + @property + def genres(self): + return self.show().genres + + @property + def roles(self): + return self.show().roles + + def getRelated(self, offset=None, limit=None, _max=36): + return self.show().getRelated(offset=offset, limit=limit, _max=_max) + + +@plexobjects.registerLibType +class Clip(PlayableVideo): + TYPE = 'clip' + + def _setData(self, data): + PlayableVideo._setData(self, data) + if self.isFullObject(): + self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, initpath=self.initpath, server=self.server, media=self) + else: + if data.find(media.Media.TYPE) is not None: + self.media = plexobjects.PlexMediaItemList(data, plexmedia.PlexMedia, media.Media.TYPE, initpath=self.initpath, server=self.server, media=self) + + @property + def isWatched(self): + return self.get('viewCount').asInt() > 0 or self.get('viewOffset').asInt() > 0 + + def getStreamURL(self, **params): + return self._getStreamURL(**params) + + @property + def videoStreams(self): + if self._videoStreams is None: + self._videoStreams = self._findStreams(plexstream.PlexStream.TYPE_VIDEO) + return self._videoStreams + + @property + def audioStreams(self): + if self._audioStreams is None: + self._audioStreams = self._findStreams(plexstream.PlexStream.TYPE_AUDIO) + return self._audioStreams + + @property + def subtitleStreams(self): + if self._subtitleStreams is None: + self._subtitleStreams = self._findStreams(plexstream.PlexStream.TYPE_SUBTITLE) + return self._subtitleStreams diff --git a/script.plexmod/lib/_included_packages/plexnet/videosession.py b/script.plexmod/lib/_included_packages/plexnet/videosession.py new file mode 100644 index 000000000..933dac0ed --- /dev/null +++ b/script.plexmod/lib/_included_packages/plexnet/videosession.py @@ -0,0 +1,416 @@ +# coding=utf-8 +import six +from collections import OrderedDict +from plexnet import plexapp + + +class MediaDetails: + """ + Gathers attributes from a MediaContainer + """ + details = None + attribute_map = { + "container": "part.attrib_container", + "partDecision": "part.decision", + "videoResolution": "media.videoResolution", + "videoBitrate": "video_stream.bitrate", + "videoCodec": "video_stream.codec", + "videoStreamDecision": "video_stream.decision", + "transcodeVideoDecision": "transcode_session.videoDecision", + "transcodeHWEncoding": "transcode_session.transcodeHwEncoding", + "audioCodec": "audio_stream.codec", + "audioBitrate": "audio_stream.bitrate", + "audioChannels": "audio_stream.channels", + "audioStreamDecision": "audio_stream.decision", + "subtitleCodec": "subtitle_stream.codec", + "subtitleStreamDecision": "subtitle_stream.decision", + "subtitleLocation": "subtitle_stream.location", + "subtitleBurn": "subtitle_stream.burn", + } + + def __init__(self, *args, **kwargs): + self.details = self.findMediaDetails(*args, **kwargs) + + def attributesFromInstance(self, map, reference_data): + # gather attribute values + final_data = {} + for attribute, dataPath in six.iteritems(map): + objName, attribName = dataPath.split(".") + if objName in reference_data: + obj = reference_data[objName] + final_data[attribute] = getattr(obj, attribName, None) or None + return final_data + + def findMediaDetails(self, mediaContainer, mediaChoice, transcodeSession=None): + """ + + """ + reference_data = { + "media": None, + "part": None, + "video_stream": None, + "audio_stream": None, + "subtitle_stream": None, + "transcode_session": transcodeSession or mediaContainer.transcodeSession + } + + # We can't use mediaChoice here directly, because it doesn't necessarily hold the newest data (in case of + # an actual MediaContainer from the Session endpoint that data is king) + # Instead find the media/part/streams which were selected and are held in MediaChoice inside the current + # mediaContainer + for media in mediaContainer.media: + if media.id == mediaChoice.media.id: + reference_data["media"] = media + + for part in media.parts: + if part.id == mediaChoice.part.id: + reference_data["part"] = part + + for stream in part.streams: + if mediaChoice.videoStream != None and stream.id == mediaChoice.videoStream.id: + reference_data["video_stream"] = stream + elif mediaChoice.audioStream != None and stream.id == mediaChoice.audioStream.id: + reference_data["audio_stream"] = stream + elif mediaChoice.subtitleStream != None and stream.id == mediaChoice.subtitleStream.id: + reference_data["subtitle_stream"] = stream + + final_data = { + "hasVideoStream": bool(reference_data["video_stream"]), + "hasAudioStream": bool(reference_data["audio_stream"]), + "hasSubtitleStream": bool(reference_data["subtitle_stream"]), + } + final_data.update(self.attributesFromInstance(self.attribute_map, reference_data)) + + del reference_data + + return final_data + + def __getattr__(self, item): + if self.details and item in self.details: + return self.details[item] + raise AttributeError("%r object has no attribute %r" % (self.__class__, item)) + + +class MediaDetailsIncomplete(MediaDetails): + """ + Gathers attributes from a TranscodeSession + """ + + incompleteAttribMap = { + "container": "transcode_session.attrib_container", + "videoCodec": "transcode_session.videoCodec", + "videoStreamDecision": "transcode_session.videoDecision", + "transcodeVideoDecision": "transcode_session.videoDecision", + "audioCodec": "transcode_session.audioCodec", + "audioChannels": "transcode_session.audioChannels", + "audioStreamDecision": "transcode_session.audioDecision", + "subtitleStreamDecision": "transcode_session.subtitleDecision", + } + + def findMediaDetails(self, mediaContainer, mediaChoice, incompleteSessionData=None): + transcodeSession = mediaContainer._findTranscodeSession(incompleteSessionData) + + # get base data from original mediaChoice media instance + data = MediaDetails.findMediaDetails(self, mediaContainer, mediaChoice, transcodeSession=transcodeSession) + + decision = "directplay" + bandwidths = mediaContainer._findBandwidths(incompleteSessionData) + + if transcodeSession: + decision = "transcode" + + data.update(self.attributesFromInstance(self.incompleteAttribMap, {"transcode_session": transcodeSession})) + + # fill remaining data + + for bw in bandwidths: + if bw.resolution: + data["videoResolution"] = bw.resolution + break + + if data["hasVideoStream"]: + # sadly we don't know the final bitrate for the video/audio streams with incomplete data + data["videoBitrate"] = "?" + + if data["hasAudioStream"]: + data["audioBitrate"] = "?" + + if data["hasSubtitleStream"]: + if data["subtitleStreamDecision"] == "burn": + data["subtitleBurn"] = True + data["subtitleCodec"] = "burn" + + data["partDecision"] = decision + + return data + + +class MediaDetailsHolder: + """ + Holds information about the currently selected MediaContainer (self.original) and the currently playing + MediaContainer (self.session) + """ + session = None + original = None + + def __init__(self, originalMedia, sessionMedia, mediaChoice, incompleteSessionData=None): + if incompleteSessionData: + self.session = MediaDetailsIncomplete(originalMedia, mediaChoice, + incompleteSessionData=incompleteSessionData) + else: + self.session = MediaDetails(sessionMedia, mediaChoice) + self.original = MediaDetails(originalMedia, mediaChoice) + + +ATTRIBUTE_TYPES = OrderedDict() + + +def registerAttributeType(cls): + ATTRIBUTE_TYPES[cls.name] = cls + return cls + + +def normRes(res): + try: + int(res) + except: + pass + else: + res += "p" + return res + + +class DPAttribute: + """ + An attribute reference to source.attr + """ + def __init__(self, attr, source="details.original"): + self.attr = attr + self.attrWithPath = "%s.%s" % (source, attr) if source else attr + + def __call__(self, *args, **kwargs): + return self.value(*args, **kwargs) + + def resolve(self, instance_or_value, obj): + """ + Resolve attribute to value based on the given type. + Returns value or Attribute.value() + + :param instance_or_value: Attribute instance or value + :param obj: VideoSessionInfo instance + :return: + """ + return instance_or_value.value(obj) if isinstance(instance_or_value, DPAttribute) else instance_or_value + + def value(self, obj): + """ + Returns value of the given path based on obj + + :param obj: VideoSessionInfo instance + :return: + """ + o = obj + for p in self.attrWithPath.split("."): + o = getattr(o, p, None) + + return o + + +class DPAttributeOriginal(DPAttribute): + pass + + +class DPAttributeSession(DPAttribute): + def __init__(self, attr): + DPAttribute.__init__(self, attr, source="details.session") + + +class DPAttributesDiffer(DPAttribute): + def __init__(self, attr, formatTrue=u"%(val1)s->%(val2)s", formatFalse=u"%(val1)s", + valueFormatter=lambda i, v1, v2: [v1, v2]): + DPAttribute.__init__(self, attr) + self.formatTrue = formatTrue + self.formatFalse = formatFalse + self.valueFormatter = valueFormatter + + def value(self, obj): + """ + Returns formatted value if values differ, otherwise the original value based on attr + + :param obj: VideoSessionInfo instance + :return: + """ + val1 = getattr(obj.details.original, self.attr, None) + val2 = getattr(obj.details.session, self.attr, None) + formatted_val1, formatted_val2 = self.valueFormatter(obj, val1, val2) + + if formatted_val2 and formatted_val1 != formatted_val2: + return self.formatTrue % {"val1": formatted_val1, "val2": formatted_val2} + if not formatted_val1: + return "" + return (self.formatFalse % {"val1": formatted_val1, "val2": formatted_val2}) if self.formatFalse else formatted_val1 + + +class DPAttributeExists(DPAttribute): + def __init__(self, attr, source="details.session", returnValue=None): + DPAttribute.__init__(self, attr, source=source) + self.returnValue = returnValue + + def value(self, obj): + """ + Returns returnValue, which may also be an Attribute instance, in case attr exists on obj + + :param obj: VideoSessionInfo instance + :return: + """ + result = DPAttribute.value(self, obj) + if self.returnValue and result: + return self.resolve(self.returnValue, obj) + + return result + + +class DPAttributeEqualsValue(DPAttribute): + def __init__(self, attr, compareTo, retVal, source="details.session"): + DPAttribute.__init__(self, attr, source=source) + self.compareTo = compareTo + self.retVal = retVal + + def value(self, obj): + """ + Returns retVal, which may also be an Attribute, if attr's value equals compareTo's value. compareTo may also + be an Attribute. + + :param obj: VideoSessionInfo instance + :return: + """ + result = DPAttribute.value(self, obj) + if result == self.resolve(self.compareTo, obj): + return self.resolve(self.retVal, obj) + + +class ComputedPPIValue: + """ + Holds the final computed attribute data for display + """ + name = None + data = None + displayCondition = None + dataPoints = [] + + @property + def label(self): + return self.name + + @property + def value(self): + return ", ".join([x for x in self.data if x not in (None, "")]) + + def __str__(self): + return "%s: %s" % (self.label, self.value) + + def __repr__(self): + return str(self) + + +@registerAttributeType +class ModePPI(ComputedPPIValue): + name = "Mode" + dataPoints = [ + DPAttributeSession("partDecision"), + DPAttributeExists("local", source="session.player", returnValue="local") + ] + + +@registerAttributeType +class ContainerPPI(ComputedPPIValue): + name = "Container" + dataPoints = [ + DPAttributesDiffer("container"), + ] + + +@registerAttributeType +class VideoPPI(ComputedPPIValue): + name = "Video" + displayCondition = DPAttributeExists("hasVideoStream", source="details.original") + dataPoints = [ + DPAttributesDiffer("videoCodec"), + DPAttributesDiffer("videoResolution", valueFormatter=lambda i, v1, v2: [normRes(v1), normRes(v2)]), + DPAttributesDiffer("videoBitrate", formatTrue=u"%(val1)s->%(val2)skbit", formatFalse=u"%(val1)skbit"), + lambda i: [ + (i.details.session.videoStreamDecision + " HW") + if i.details.session.transcodeVideoDecision == "transcode" and i.details.session.transcodeHWEncoding + else i.details.session.videoStreamDecision + ] + ] + + +@registerAttributeType +class AudioPPI(ComputedPPIValue): + name = "Audio" + displayCondition = DPAttributeExists("hasAudioStream", source="details.original") + dataPoints = [ + DPAttributesDiffer("audioCodec"), + DPAttributesDiffer("audioBitrate", formatTrue=u"%(val1)s->%(val2)skbit", formatFalse=u"%(val1)skbit"), + DPAttributesDiffer("audioChannels", formatTrue=u"%(val1)s->%(val2)sch", formatFalse=u"%(val1)sch"), + DPAttributeExists("audioStreamDecision") + ] + + +@registerAttributeType +class SubtitlesPPI(ComputedPPIValue): + name = "Subtitles" + displayCondition = DPAttributeExists("hasSubtitleStream", source="details.original") + dataPoints = [ + DPAttributesDiffer("subtitleCodec", valueFormatter=lambda i, v1, v2: [v1, + "burn" if i.details.session.subtitleBurn else v2]), + DPAttributeEqualsValue("subtitleStreamDecision", "burn", DPAttribute("subtitleStreamDecision")), + DPAttributeExists("subtitleLocation") + ] + + +@registerAttributeType +class UserPPI(ComputedPPIValue): + name = "User" + dataPoints = [ + lambda i: [u"%s @ %s" % (plexapp.ACCOUNT.title or plexapp.ACCOUNT.username or ' ', i.mediaItem.server.name)] + ] + + +class SessionAttributes(OrderedDict): + """ + Computes all the PPI instances' values + """ + def __init__(self, ref, *args, **kwargs): + self.ref = ref + OrderedDict.__init__(self, *args, **kwargs) + + for name, cls in six.iteritems(ATTRIBUTE_TYPES): + self[name] = instance = cls() + instance.data = [] + if not instance.displayCondition or instance.displayCondition(self.ref): + for dp in instance.dataPoints: + try: + # dataPoint may be a lambda or a DataPoint instance + result = dp(self.ref) + + # result may be list or value + if result is not None: + if isinstance(result, list): + instance.data += result + else: + instance.data.append(result) + except: + pass + + +class VideoSessionInfo: + def __init__(self, sessionMediaContainer, mediaContainer, incompleteSessionData=False): + self.mediaItem = mediaContainer + self.session = sessionMediaContainer + self.details = MediaDetailsHolder(self.mediaItem, self.session, mediaContainer.mediaChoice, + incompleteSessionData=incompleteSessionData) + + self.attributes = SessionAttributes(self) + diff --git a/script.plexmod/lib/backgroundthread.py b/script.plexmod/lib/backgroundthread.py new file mode 100644 index 000000000..7b69cd09d --- /dev/null +++ b/script.plexmod/lib/backgroundthread.py @@ -0,0 +1,255 @@ +from __future__ import absolute_import +import six.moves.queue +import heapq +from kodi_six import xbmc +from . import util +from plexnet import threadutils +from six.moves import range + + +class Tasks(list): + def add(self, task): + for t in self: + if not t.isValid(): + self.remove(t) + + if isinstance(task, list): + self += task + else: + self.append(task) + + def cancel(self): + while self: + self.pop().cancel() + + def kill(self): + self.cancel() + BGThreader.kill() + + +class Task: + def __init__(self, priority=None): + self._priority = priority + self._canceled = False + self.finished = False + + def __cmp__(self, other): + return self._priority - other._priority + + def __le__(self, other): + return self._priority < other._priority + + def __gt__(self, other): + return self._priority > other._priority + + def start(self): + BGThreader.addTask(self) + + def _run(self): + self.run() + self.finished = True + + def run(self): + pass + + def cancel(self): + self._canceled = True + + def isCanceled(self): + return self._canceled or util.MONITOR.abortRequested() + + def isValid(self): + return not self.finished and not self._canceled + + +class MutablePriorityQueue(six.moves.queue.PriorityQueue): + def _get(self, heappop=heapq.heappop): + self.queue.sort() + return heappop(self.queue) + + def lowest(self): + """Return the lowest priority item in the queue (not reliable!).""" + self.mutex.acquire() + try: + lowest = self.queue and min(self.queue) or None + except: + lowest = None + util.ERROR() + finally: + self.mutex.release() + return lowest + + +class BackgroundWorker: + def __init__(self, queue, name=None): + self._queue = queue + self.name = name + self._thread = None + self._abort = False + self._task = None + + def _runTask(self, task): + if task._canceled: + return + try: + task._run() + except: + util.ERROR() + + def abort(self): + self._abort = True + return self + + def aborted(self): + return self._abort or util.MONITOR.abortRequested() + + def start(self): + if self._thread and self._thread.is_alive(): + return + + self._thread = threadutils.KillableThread(target=self._queueLoop, name='BACKGROUND-WORKER({0})'.format(self.name)) + self._thread.start() + + def _queueLoop(self): + if self._queue.empty(): + return + + util.DEBUG_LOG('BGThreader: ({0}): Active'.format(self.name)) + try: + while not self.aborted(): + self._task = self._queue.get_nowait() + self._runTask(self._task) + self._queue.task_done() + self._task = None + except six.moves.queue.Empty: + util.DEBUG_LOG('BGThreader ({0}): Idle'.format(self.name)) + + def shutdown(self): + self.abort() + + if self._task: + self._task.cancel() + + if self._thread and self._thread.is_alive(): + util.DEBUG_LOG('BGThreader: thread ({0}): Waiting...'.format(self.name)) + self._thread.join() + util.DEBUG_LOG('BGThreader: thread ({0}): Done'.format(self.name)) + + def working(self): + return self._thread and self._thread.is_alive() + + def kill(self): + if self._thread and self._thread.is_alive(): + util.DEBUG_LOG('BGThreader: thread ({0}): Waiting...'.format(self.name)) + self._thread.join() + util.DEBUG_LOG('BGThreader: thread ({0}): Done'.format(self.name)) + + +class BackgroundThreader: + def __init__(self, name=None, worker_count=3): + self.name = name + self._queue = MutablePriorityQueue() + self._abort = False + self._priority = -1 + self.workers = [BackgroundWorker(self._queue, 'queue.{0}:worker.{1}'.format(self.name, x)) for x in range(worker_count)] + + def _nextPriority(self): + self._priority += 1 + return self._priority + + def abort(self): + self._abort = True + for w in self.workers: + w.abort() + return self + + def aborted(self): + return self._abort or util.MONITOR.abortRequested() + + def shutdown(self): + self.abort() + + for w in self.workers: + w.shutdown() + + def addTask(self, task): + task._priority = self._nextPriority() + self._queue.put(task) + self.startWorkers() + + def addTasks(self, tasks): + for t in tasks: + t._priority = self._nextPriority() + self._queue.put(t) + + self.startWorkers() + + def addTasksToFront(self, tasks): + lowest = self.getLowestPrority() + if lowest is None: + return self.addTasks(tasks) + + p = lowest - len(tasks) + for t in tasks: + t._priority = p + self._queue.put(t) + p += 1 + + self.startWorkers() + + def startWorkers(self): + for w in self.workers: + w.start() + + def working(self): + return not self._queue.empty() or self.hasTask() + + def hasTask(self): + return any([w.working() for w in self.workers]) + + def getLowestPrority(self): + lowest = self._queue.lowest() + if not lowest: + return None + + return lowest._priority + + def moveToFront(self, qitem): + lowest = self.getLowestPrority() + if lowest is None: + return + + qitem._priority = lowest - 1 + + def kill(self): + for w in self.workers: + w.kill() + + +class ThreaderManager: + def __init__(self): + self.index = 0 + self.abandoned = [] + self.threader = BackgroundThreader(str(self.index)) + + def __getattr__(self, name): + return getattr(self.threader, name) + + def reset(self): + if self.threader._queue.empty() and not self.threader.hasTask(): + return + + self.index += 1 + self.abandoned.append(self.threader.abort()) + self.threader = BackgroundThreader(str(self.index)) + + def shutdown(self): + self.threader.shutdown() + for a in self.abandoned: + a.shutdown() + + def kill(self): + self.threader.kill() + + +BGThreader = ThreaderManager() diff --git a/script.plexmod/lib/colors.py b/script.plexmod/lib/colors.py new file mode 100644 index 000000000..92d8d49df --- /dev/null +++ b/script.plexmod/lib/colors.py @@ -0,0 +1,79 @@ +# Constants +Background = 'FF111111' +BackgroundDark = 'FF0A0A0A' + +# OverlayVeryDark = GetAlpha(FF000000, 90), +# OverlayDark = GetAlpha(FF000000, 70), +# OverlayMed = GetAlpha(FF000000, 50), +# OverlayLht = GetAlpha(FF000000, 35), + +Border = 'FF1F1F1F' +Empty = 'FF1F1F1F' +Card = 'FF1F1F1F' +Button = 'FF1F1F1F' +ButtonDark = 'FF171717' +ButtonLht = 'FF555555' +ButtonMed = 'FF2D2D2D' +Indicator = 'FF999999' +Text = 'FFFFFFFF' +Subtitle = 'FF999999' + +# These are dependent on the regions background color +# TextLht = GetAlpha(FFFFFFFF, 90), +# TextMed = GetAlpha(FFFFFFFF, 75), +# TextDim = GetAlpha(FFFFFFFF, 50), +# TextDis = GetAlpha(FFFFFFFF, 30), +# TextDimDis = GetAlpha(FFFFFFFF, 10), + +Transparent = '00000000' +Black = 'FF000000' +Blue = 'FF0033CC' +Red = 'FFC23529' +RedAlt = 'FFD9534F' +Green = 'FF5CB85C' +Orange = 'FFCC7B19' +OrangeLight = 'FFF9BE03' + +# Component specific +# SettingsBg = 'FF2C2C2C' +# ScrollbarBg = GetAlpha(FFFFFFFF, 10), +# ScrollbarFgFocus = GetAlpha('Orange' 70), +# ScrollbarFg = GetAlpha(FFFFFFFF, 25), +# IndicatorBorder = 'FF000000' +# Separator = 'FF000000' +# Modal = GetAlpha(FF000000, 85), +# Focus = Orange, +# FocusToggle = OrangeLight, + +# ListFocusBg = GetAlpha(FF000000, 40), +# TrackActionsBg = GetAlpha(FF000000, 30), +# ListBg = GetAlpha(FFFFFFFF, 10), +# ListBgNoBlur = GetAlpha(FF666666, 40), +# ListImageBorder = 'FF595959' + +SearchBg = 'FF2D2D2D' +SearchButton = 'FF282828' +SearchButtonDark = 'FF1F1F1F' +SearchButtonLight = 'FF555555' + +InputBg = 'FF000000' +InputButton = 'FF282828' +InputButtonDark = 'FF1F1F1F' +InputButtonLight = 'FF555555' + + +class _noAlpha: + def __getattr__(self, name): + return globals()[name][2:] + +noAlpha = _noAlpha() + + +# def getAlpha(color, percent): +# if isinstance(color, basestring): +# color = COLORS[color] + +# if isinstance(color, int): +# util.ERROR_LOG(str(color) + " is not found in object") + +# return color and int((percent / 100 * 255) - 256) diff --git a/script.plexmod/lib/compat.py b/script.plexmod/lib/compat.py new file mode 100644 index 000000000..d7558a7cb --- /dev/null +++ b/script.plexmod/lib/compat.py @@ -0,0 +1,21 @@ +from __future__ import absolute_import +import time +import datetime + +try: + datetime.datetime.strptime('0', '%H') +except TypeError: + # Fix for datetime issues with XBMC/Kodi + class new_datetime(datetime.datetime): + @classmethod + def strptime(cls, dstring, dformat): + return datetime.datetime(*(time.strptime(dstring, dformat)[0:6])) + + datetime.datetime = new_datetime + + +def timedelta_total_seconds(td): + try: + return td.total_seconds() + except: + return ((float(td.seconds) + float(td.days) * 24 * 3600) * 10**6) / 10**6 diff --git a/script.plexmod/lib/distro.py b/script.plexmod/lib/distro.py new file mode 100644 index 000000000..89e186804 --- /dev/null +++ b/script.plexmod/lib/distro.py @@ -0,0 +1,1399 @@ +#!/usr/bin/env python +# Copyright 2015,2016,2017 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is the recommended replacement for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.8 removed it altogether. Its +predecessor function :py:func:`platform.dist` was already deprecated since +Python 2.6 and removed in Python 3.8. Still, there are many cases in which +access to OS distribution information is needed. See `Python issue 1322 +`_ for more information. +""" + +import argparse +import json +import logging +import os +import re +import shlex +import subprocess +import sys +import warnings +from typing import ( + Any, + Callable, + Dict, + Iterable, + Optional, + Sequence, + TextIO, + Tuple, + Type, +) + +try: + from typing import TypedDict +except ImportError: + # Python 3.7 + TypedDict = dict + +__version__ = "1.8.0" + + +class VersionDict(TypedDict): + major: str + minor: str + build_number: str + + +class InfoDict(TypedDict): + id: str + version: str + version_parts: VersionDict + like: str + codename: str + + +_UNIXCONFDIR = os.environ.get("UNIXCONFDIR", "/etc") +_UNIXUSRLIBDIR = os.environ.get("UNIXUSRLIBDIR", "/usr/lib") +_OS_RELEASE_BASENAME = "os-release" + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = { + "ol": "oracle", # Oracle Linux + "opensuse-leap": "opensuse", # Newer versions of OpenSuSE report as opensuse-leap +} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + "enterpriseenterpriseas": "oracle", # Oracle Enterprise Linux 4 + "enterpriseenterpriseserver": "oracle", # Oracle Linux 5 + "redhatenterpriseworkstation": "rhel", # RHEL 6, 7 Workstation + "redhatenterpriseserver": "rhel", # RHEL 6, 7 Server + "redhatenterprisecomputenode": "rhel", # RHEL 6 ComputeNode +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + "redhat": "rhel", # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r"(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)" +) + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile(r"(\w+)[-_](release|version)$") + +# Base file names to be looked up for if _UNIXCONFDIR is not readable. +_DISTRO_RELEASE_BASENAMES = [ + "SuSE-release", + "arch-release", + "base-release", + "centos-release", + "fedora-release", + "gentoo-release", + "mageia-release", + "mandrake-release", + "mandriva-release", + "mandrivalinux-release", + "manjaro-release", + "oracle-release", + "redhat-release", + "rocky-release", + "sl-release", + "slackware-version", +] + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + "debian_version", + "lsb-release", + "oem-release", + _OS_RELEASE_BASENAME, + "system-release", + "plesk-release", + "iredmail-release", +) + + +def linux_distribution(full_distribution_name: bool = True) -> Tuple[str, str, str]: + """ + .. deprecated:: 1.6.0 + + :func:`distro.linux_distribution()` is deprecated. It should only be + used as a compatibility shim with Python's + :py:func:`platform.linux_distribution()`. Please use :func:`distro.id`, + :func:`distro.version` and :func:`distro.name` instead. + + Return information about the current OS distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The extra item (usually in parentheses) after the + os-release version number, or the result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the OS distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular OS distributions. + """ + warnings.warn( + "distro.linux_distribution() is deprecated. It should only be used as a " + "compatibility shim with Python's platform.linux_distribution(). Please use " + "distro.id(), distro.version() and distro.name() instead.", + DeprecationWarning, + stacklevel=2, + ) + return _distro.linux_distribution(full_distribution_name) + + +def id() -> str: + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amzn" Amazon Linux + "arch" Arch Linux + "buildroot" Buildroot + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + "midnightbsd" MidnightBSD + "rocky" Rocky Linux + "aix" AIX + "guix" Guix System + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the OS distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty: bool = False) -> str: + """ + Return the name of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "" field of the distro release file, appended + with the value of the pretty version ("" and "" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty: bool = False, best: bool = False) -> str: + """ + Return the version of the current OS distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + Some other distributions may not provide this kind of information. In these + cases, an empty string would be returned. This behavior can be observed + with rolling releases distributions (e.g. Arch Linux). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best: bool = False) -> Tuple[str, str, str]: + """ + Return the version of the current OS distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best: bool = False) -> str: + """ + Return the major version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best: bool = False) -> str: + """ + Return the minor version of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best: bool = False) -> str: + """ + Return the build number of the current OS distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like() -> str: + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current OS distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + `_. + """ + return _distro.like() + + +def codename() -> str: + """ + Return the codename for the release of the current OS distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty: bool = False, best: bool = False) -> InfoDict: + """ + Return certain machine-readable information items about the current OS + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current OS distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current OS distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info() -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute: str) -> str: + """ + Return a single named information item from the os-release file data source + of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute: str) -> str: + """ + Return a single named information item from the lsb_release command output + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +def uname_attr(attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the current OS distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + """ + return _distro.uname_attr(attribute) + + +try: + from functools import cached_property +except ImportError: + # Python < 3.8 + class cached_property: # type: ignore + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + + def __init__(self, f: Callable[[Any], Any]) -> None: + self._fname = f.__name__ + self._f = f + + def __get__(self, obj: Any, owner: Type[Any]) -> Any: + assert obj is not None, f"call {self._fname} on an instance" + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution: + """ + Provides information about a OS distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current OS distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__( + self, + include_lsb: Optional[bool] = None, + os_release_file: str = "", + distro_release_file: str = "", + include_uname: Optional[bool] = None, + root_dir: Optional[str] = None, + include_oslevel: Optional[bool] = None, + ) -> None: + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + * ``include_uname`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command will + be empty. + + * ``root_dir`` (string): The absolute path to the root directory to use + to find distro-related information files. Note that ``include_*`` + parameters must not be enabled in combination with ``root_dir``. + + * ``include_oslevel`` (bool): Controls whether (AIX) oslevel command + output is included as a data source. If the oslevel command is not + available in the program execution path the data source will be + empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname information will + be loaded. + + * ``include_oslevel`` (bool): The result of the ``include_oslevel`` + parameter. This controls whether (AIX) oslevel information will be + loaded. + + * ``root_dir`` (string): The result of the ``root_dir`` parameter. + The absolute path to the root directory to use to find distro-related + information files. + + Raises: + + * :py:exc:`ValueError`: Initialization parameters combination is not + supported. + + * :py:exc:`OSError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.root_dir = root_dir + self.etc_dir = os.path.join(root_dir, "etc") if root_dir else _UNIXCONFDIR + self.usr_lib_dir = ( + os.path.join(root_dir, "usr/lib") if root_dir else _UNIXUSRLIBDIR + ) + + if os_release_file: + self.os_release_file = os_release_file + else: + etc_dir_os_release_file = os.path.join(self.etc_dir, _OS_RELEASE_BASENAME) + usr_lib_os_release_file = os.path.join( + self.usr_lib_dir, _OS_RELEASE_BASENAME + ) + + # NOTE: The idea is to respect order **and** have it set + # at all times for API backwards compatibility. + if os.path.isfile(etc_dir_os_release_file) or not os.path.isfile( + usr_lib_os_release_file + ): + self.os_release_file = etc_dir_os_release_file + else: + self.os_release_file = usr_lib_os_release_file + + self.distro_release_file = distro_release_file or "" # updated later + + is_root_dir_defined = root_dir is not None + if is_root_dir_defined and (include_lsb or include_uname or include_oslevel): + raise ValueError( + "Including subprocess data sources from specific root_dir is disallowed" + " to prevent false information" + ) + self.include_lsb = ( + include_lsb if include_lsb is not None else not is_root_dir_defined + ) + self.include_uname = ( + include_uname if include_uname is not None else not is_root_dir_defined + ) + self.include_oslevel = ( + include_oslevel if include_oslevel is not None else not is_root_dir_defined + ) + + def __repr__(self) -> str: + """Return repr of all info""" + return ( + "LinuxDistribution(" + "os_release_file={self.os_release_file!r}, " + "distro_release_file={self.distro_release_file!r}, " + "include_lsb={self.include_lsb!r}, " + "include_uname={self.include_uname!r}, " + "include_oslevel={self.include_oslevel!r}, " + "root_dir={self.root_dir!r}, " + "_os_release_info={self._os_release_info!r}, " + "_lsb_release_info={self._lsb_release_info!r}, " + "_distro_release_info={self._distro_release_info!r}, " + "_uname_info={self._uname_info!r}, " + "_oslevel_info={self._oslevel_info!r})".format(self=self) + ) + + def linux_distribution( + self, full_distribution_name: bool = True + ) -> Tuple[str, str, str]: + """ + Return information about the OS distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self._os_release_info.get("release_codename") or self.codename(), + ) + + def id(self) -> str: + """Return the distro ID of the OS distribution, as a string. + + For details, see :func:`distro.id`. + """ + + def normalize(distro_id: str, table: Dict[str, str]) -> str: + distro_id = distro_id.lower().replace(" ", "_") + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr("distributor_id") + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + distro_id = self.uname_attr("id") + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return "" + + def name(self, pretty: bool = False) -> str: + """ + Return the name of the OS distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = ( + self.os_release_attr("name") + or self.lsb_release_attr("distributor_id") + or self.distro_release_attr("name") + or self.uname_attr("name") + ) + if pretty: + name = self.os_release_attr("pretty_name") or self.lsb_release_attr( + "description" + ) + if not name: + name = self.distro_release_attr("name") or self.uname_attr("name") + version = self.version(pretty=True) + if version: + name = f"{name} {version}" + return name or "" + + def version(self, pretty: bool = False, best: bool = False) -> str: + """ + Return the version of the OS distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr("version_id"), + self.lsb_release_attr("release"), + self.distro_release_attr("version_id"), + self._parse_distro_release_content(self.os_release_attr("pretty_name")).get( + "version_id", "" + ), + self._parse_distro_release_content( + self.lsb_release_attr("description") + ).get("version_id", ""), + self.uname_attr("release"), + ] + if self.uname_attr("id").startswith("aix"): + # On AIX platforms, prefer oslevel command output. + versions.insert(0, self.oslevel_info()) + elif self.id() == "debian" or "debian" in self.like().split(): + # On Debian-like, add debian_version file content to candidates list. + versions.append(self._debian_version) + version = "" + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == "": + version = v + else: + for v in versions: + if v != "": + version = v + break + if pretty and version and self.codename(): + version = f"{version} ({self.codename()})" + return version + + def version_parts(self, best: bool = False) -> Tuple[str, str, str]: + """ + Return the version of the OS distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r"(\d+)\.?(\d+)?\.?(\d+)?") + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or "", build_number or "" + return "", "", "" + + def major_version(self, best: bool = False) -> str: + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best: bool = False) -> str: + """ + Return the minor version number of the current distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best: bool = False) -> str: + """ + Return the build number of the current distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self) -> str: + """ + Return the IDs of distributions that are like the OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr("id_like") or "" + + def codename(self) -> str: + """ + Return the codename of the OS distribution. + + For details, see :func:`distro.codename`. + """ + try: + # Handle os_release specially since distros might purposefully set + # this to empty string to have no codename + return self._os_release_info["codename"] + except KeyError: + return ( + self.lsb_release_attr("codename") + or self.distro_release_attr("codename") + or "" + ) + + def info(self, pretty: bool = False, best: bool = False) -> InfoDict: + """ + Return certain machine-readable information about the OS + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best), + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the OS distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the OS + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self) -> Dict[str, str]: + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + return self._uname_info + + def oslevel_info(self) -> str: + """ + Return AIX' oslevel command output. + """ + return self._oslevel_info + + def os_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the os-release file data + source of the OS distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, "") + + def lsb_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the lsb_release command + output data source of the OS distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, "") + + def distro_release_attr(self, attribute: str) -> str: + """ + Return a single named information item from the distro release file + data source of the OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, "") + + def uname_attr(self, attribute: str) -> str: + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_attr`. + """ + return self._uname_info.get(attribute, "") + + @cached_property + def _os_release_info(self) -> Dict[str, str]: + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file, encoding="utf-8") as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines: TextIO) -> Dict[str, str]: + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + # Ignore any tokens that are not variable assignments + if "=" in token: + k, v = token.split("=", 1) + props[k.lower()] = v + + if "version" in props: + # extract release codename (if any) from version attribute + match = re.search(r"\((\D+)\)|,\s*(\D+)", props["version"]) + if match: + release_codename = match.group(1) or match.group(2) + props["codename"] = props["release_codename"] = release_codename + + if "version_codename" in props: + # os-release added a version_codename field. Use that in + # preference to anything else Note that some distros purposefully + # do not have code names. They should be setting + # version_codename="" + props["codename"] = props["version_codename"] + elif "ubuntu_codename" in props: + # Same as above but a non-standard field name used on older Ubuntus + props["codename"] = props["ubuntu_codename"] + + return props + + @cached_property + def _lsb_release_info(self) -> Dict[str, str]: + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + try: + cmd = ("lsb_release", "-a") + stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + # Command not found or lsb_release returned error + except (OSError, subprocess.CalledProcessError): + return {} + content = self._to_str(stdout).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines: Iterable[str]) -> Dict[str, str]: + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip("\n").split(":", 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(" ", "_").lower(): v.strip()}) + return props + + @cached_property + def _uname_info(self) -> Dict[str, str]: + if not self.include_uname: + return {} + try: + cmd = ("uname", "-rs") + stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL) + except OSError: + return {} + content = self._to_str(stdout).splitlines() + return self._parse_uname_content(content) + + @cached_property + def _oslevel_info(self) -> str: + if not self.include_oslevel: + return "" + try: + stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL) + except (OSError, subprocess.CalledProcessError): + return "" + return self._to_str(stdout).strip() + + @cached_property + def _debian_version(self) -> str: + try: + with open( + os.path.join(self.etc_dir, "debian_version"), encoding="ascii" + ) as fp: + return fp.readline().rstrip() + except FileNotFoundError: + return "" + + @staticmethod + def _parse_uname_content(lines: Sequence[str]) -> Dict[str, str]: + if not lines: + return {} + props = {} + match = re.search(r"^([^\s]+)\s+([\d\.]+)", lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == "Linux": + return {} + props["id"] = name.lower() + props["name"] = name + props["release"] = version + return props + + @staticmethod + def _to_str(bytestring: bytes) -> str: + encoding = sys.getfilesystemencoding() + return bytestring.decode(encoding) + + @cached_property + def _distro_release_info(self) -> Dict[str, str]: + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file(self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + else: + try: + basenames = [ + basename + for basename in os.listdir(self.etc_dir) + if basename not in _DISTRO_RELEASE_IGNORE_BASENAMES + and os.path.isfile(os.path.join(self.etc_dir, basename)) + ] + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = _DISTRO_RELEASE_BASENAMES + for basename in basenames: + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match is None: + continue + filepath = os.path.join(self.etc_dir, basename) + distro_info = self._parse_distro_release_file(filepath) + # The name is always present if the pattern matches. + if "name" not in distro_info: + continue + self.distro_release_file = filepath + break + else: # the loop didn't "break": no candidate. + return {} + + if match is not None: + distro_info["id"] = match.group(1) + + # CloudLinux < 7: manually enrich info with proper id. + if "cloudlinux" in distro_info.get("name", "").lower(): + distro_info["id"] = "cloudlinux" + + return distro_info + + def _parse_distro_release_file(self, filepath: str) -> Dict[str, str]: + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath, encoding="utf-8") as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except OSError: + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/python-distro/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line: str) -> Dict[str, str]: + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match(line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info["name"] = matches.group(3)[::-1] + if matches.group(2): + distro_info["version_id"] = matches.group(2)[::-1] + if matches.group(1): + distro_info["codename"] = matches.group(1)[::-1] + elif line: + distro_info["name"] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main() -> None: + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="OS distro info tool") + parser.add_argument( + "--json", "-j", help="Output in machine readable format", action="store_true" + ) + + parser.add_argument( + "--root-dir", + "-r", + type=str, + dest="root_dir", + help="Path to the root filesystem directory (defaults to /)", + ) + + args = parser.parse_args() + + if args.root_dir: + dist = LinuxDistribution( + include_lsb=False, + include_uname=False, + include_oslevel=False, + root_dir=args.root_dir, + ) + else: + dist = _distro + + if args.json: + logger.info(json.dumps(dist.info(), indent=4, sort_keys=True)) + else: + logger.info("Name: %s", dist.name(pretty=True)) + distribution_version = dist.version(pretty=True) + logger.info("Version: %s", distribution_version) + distribution_codename = dist.codename() + logger.info("Codename: %s", distribution_codename) + + +if __name__ == "__main__": + main() diff --git a/script.plexmod/lib/exceptions.py b/script.plexmod/lib/exceptions.py new file mode 100644 index 000000000..847eb90fc --- /dev/null +++ b/script.plexmod/lib/exceptions.py @@ -0,0 +1,4 @@ +# coding=utf-8 + +class NoDataException(Exception): + pass diff --git a/script.plexmod/lib/image.py b/script.plexmod/lib/image.py new file mode 100644 index 000000000..09d778a3f --- /dev/null +++ b/script.plexmod/lib/image.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import +import os +from lib import util + +CACHE_PATH = os.path.join(util.PROFILE, 'avatars') + +if not os.path.exists(CACHE_PATH): + os.makedirs(CACHE_PATH) + + +def getImage(url, ID): + return url, '' diff --git a/script.plexmod/lib/kodijsonrpc.py b/script.plexmod/lib/kodijsonrpc.py new file mode 100644 index 000000000..86fdec219 --- /dev/null +++ b/script.plexmod/lib/kodijsonrpc.py @@ -0,0 +1,106 @@ +from __future__ import absolute_import +from kodi_six import xbmc +import json + + +class JSONRPCMethod: + + class Exception(Exception): + pass + + def __init__(self): + self.family = None + + def __getattr__(self, method): + def handler(**kwargs): + command = { + 'jsonrpc': '2.0', + 'id': 1, + 'method': '{0}.{1}'.format(self.family, method) + } + + if kwargs: + command['params'] = kwargs + + # xbmc.log(json.dumps(command)) + ret = json.loads(xbmc.executeJSONRPC(json.dumps(command))) + + if ret: + if 'error' in ret: + raise self.Exception(ret['error']) + else: + return ret['result'] + else: + return None + + return handler + + def __call__(self, family): + self.family = family + return self + + +class KodiJSONRPC: + def __init__(self): + self.methodHandler = JSONRPCMethod() + + def __getattr__(self, family): + return self.methodHandler(family) + + +rpc = KodiJSONRPC() + + +class BuiltInMethod: + + class Exception(Exception): + pass + + def __init__(self): + self.module = None + + def __getattr__(self, method): + def handler(*args, **kwargs): + args = [str(a).replace(',', r'\,') for a in args] + for k, v in kwargs.items(): + args.append('{0}={v}'.format(k, str(v).replace(',', r'\,'))) + + if args: + command = '{0}.{1}({2})'.format(self.module, method, ','.join(args)) + else: + command = '{0}.{1}'.format(self.module, method) + + xbmc.log(command, xbmc.LOGINFO) + + xbmc.executebuiltin(command) + + return handler + + def __call__(self, *args, **kwargs): + args = [str(a).replace(',', r'\,') for a in args] + for k, v in kwargs.items(): + args.append('{0}={v}'.format(k, str(v).replace(',', r'\,'))) + + if args: + command = '{0}({1})'.format(self.module, ','.join(args)) + else: + command = '{0}'.format(self.module) + + xbmc.log(command, xbmc.LOGINFO) + + xbmc.executebuiltin(command) + + def initModule(self, module): + self.module = module + return self + + +class KodiBuiltin: + def __init__(self): + self.methodHandler = BuiltInMethod() + + def __getattr__(self, module): + return self.methodHandler.initModule(module) + + +builtin = KodiBuiltin() diff --git a/script.plexmod/lib/main.py b/script.plexmod/lib/main.py new file mode 100644 index 000000000..bd7b5cf4e --- /dev/null +++ b/script.plexmod/lib/main.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +from kodi_six import xbmc + +if xbmc.getInfoLabel('Window(10000).Property(script.plex.running)') == "1": + xbmc.executebuiltin('NotifyAll({0},{1},{2})'.format('script.plexmod', 'RESTORE', '{}')) + raise SystemExit + +import gc +import atexit +import threading +import six + +from . import plex + +from plexnet import plexapp +from plexnet import threadutils +from .windows import background, userselect, home, windowutils +from . import player +from . import backgroundthread +from . import util + +BACKGROUND = None + + +if six.PY2: + _Timer = threading._Timer +else: + _Timer = threading.Timer + + +def waitForThreads(): + util.DEBUG_LOG('Main: Checking for any remaining threads') + while len(threading.enumerate()) > 1: + for t in threading.enumerate(): + if t != threading.currentThread(): + if t.is_alive(): + util.DEBUG_LOG('Main: Waiting on: {0}...'.format(t.name)) + if isinstance(t, _Timer): + t.cancel() + + try: + t.join() + except: + util.ERROR() + + +@atexit.register +def realExit(): + xbmc.log('Main: script.plex: REALLY FINISHED', xbmc.LOGINFO) + + +def signout(): + util.setSetting('auth.token', '') + util.DEBUG_LOG('Main: Signing out...') + plexapp.ACCOUNT.signOut() + + +def main(): + global BACKGROUND + try: + with util.Cron(0.1): + BACKGROUND = background.BackgroundWindow.create(function=_main) + + tries = 0 + while not BACKGROUND.isOpen and not util.MONITOR.waitForAbort(2) and tries < 60: + if tries == 0: + util.LOG("Couldn't start main loop, other dialog open? Retrying for 120s.") + BACKGROUND.show() + tries += 1 + + if BACKGROUND.isOpen: + util.setGlobalProperty('running', '1') + BACKGROUND.modal() + del BACKGROUND + else: + util.LOG("Couldn't start main loop, exiting.") + finally: + try: + util.setGlobalProperty('running', '') + util.setGlobalProperty('stop_running', '') + except: + pass + + +def _main(): + util.DEBUG_LOG('[ STARTED: {0} -------------------------------------------------------------------- ]'.format(util.ADDON.getAddonInfo('version'))) + util.DEBUG_LOG('USER-AGENT: {0}'.format(plex.defaultUserAgent())) + background.setSplash() + + try: + while not util.MONITOR.abortRequested() and not util.getGlobalProperty('stop_running'): + if plex.init(): + background.setSplash(False) + fromSwitch = False + while not util.MONITOR.abortRequested() and not util.getGlobalProperty('stop_running'): + if ( + not plexapp.ACCOUNT.isOffline and not + plexapp.ACCOUNT.isAuthenticated and + (len(plexapp.ACCOUNT.homeUsers) > 1 or plexapp.ACCOUNT.isProtected) + + ): + result = userselect.start() + if not result: + return + elif result == 'signout': + signout() + break + elif result == 'signin': + break + elif result == 'cancel' and fromSwitch: + util.DEBUG_LOG('Main: User selection canceled, reusing previous user') + plexapp.ACCOUNT.isAuthenticated = True + + if not fromSwitch: + util.DEBUG_LOG('Main: User selected') + + try: + selectedServer = plexapp.SERVERMANAGER.selectedServer + + if not selectedServer: + background.setBusy() + util.DEBUG_LOG('Main: Waiting for selected server...') + try: + for timeout, skip_preferred, skip_owned in ((10, False, False), (10, True, True)): + plex.CallbackEvent(plexapp.util.APP, 'change:selectedServer', timeout=timeout).wait() + + selectedServer = plexapp.SERVERMANAGER.checkSelectedServerSearch(skip_preferred=skip_preferred, skip_owned=skip_owned) + if selectedServer: + break + else: + util.DEBUG_LOG('Main: Finished waiting for selected server...') + finally: + background.setBusy(False) + + util.DEBUG_LOG('Main: STARTING WITH SERVER: {0}'.format(selectedServer)) + + windowutils.HOME = home.HomeWindow.open() + util.CRON.cancelReceiver(windowutils.HOME) + + if not windowutils.HOME.closeOption: + return + + closeOption = windowutils.HOME.closeOption + + windowutils.shutdownHome() + + if closeOption == 'signout': + signout() + break + elif closeOption == 'switch': + plexapp.ACCOUNT.isAuthenticated = False + fromSwitch = True + finally: + windowutils.shutdownHome() + BACKGROUND.activate() + gc.collect(2) + + else: + break + except: + util.ERROR() + finally: + util.DEBUG_LOG('Main: SHUTTING DOWN...') + background.setShutdown() + player.shutdown() + plexapp.util.APP.preShutdown() + util.CRON.stop() + backgroundthread.BGThreader.shutdown() + plexapp.util.APP.shutdown() + waitForThreads() + background.setBusy(False) + background.setSplash(False) + background.killMonitor() + + util.DEBUG_LOG('FINISHED') + util.shutdown() + + gc.collect(2) diff --git a/script.plexmod/lib/metadata.py b/script.plexmod/lib/metadata.py new file mode 100644 index 000000000..ffa33ff7b --- /dev/null +++ b/script.plexmod/lib/metadata.py @@ -0,0 +1,34 @@ +from __future__ import absolute_import +from plexnet import media +from .util import T + + +EXTRA_MAP = { + media.METADATA_RELATED_TRAILER: T(32201, 'Trailer'), + media.METADATA_RELATED_DELETED_SCENE: T(32202, 'Deleted Scene'), + media.METADATA_RELATED_INTERVIEW: T(32203, 'Interview'), + media.METADATA_RELATED_MUSIC_VIDEO: T(32204, 'Music Video'), + media.METADATA_RELATED_BEHIND_THE_SCENES: T(32205, 'Behind the Scenes'), + media.METADATA_RELATED_SCENE_OR_SAMPLE: T(32206, 'Scene/Sample'), + media.METADATA_RELATED_LIVE_MUSIC_VIDEO: T(32207, 'Live Music Video'), + media.METADATA_RELATED_LYRIC_MUSIC_VIDEO: T(32208, 'Lyric Music Video'), + media.METADATA_RELATED_CONCERT: T(32209, 'Concert'), + media.METADATA_RELATED_FEATURETTE: T(32210, 'Featurette'), + media.METADATA_RELATED_SHORT: T(32211, 'Short'), + media.METADATA_RELATED_OTHER: T(32212, 'Other') +} + + +API_TRANSLATION_MAP = { + 'Unknown': T(32441), + 'Embedded': T(32442), + 'Forced': T(32443), + 'Lyrics': T(32444), + 'Mono': T(32445), + 'Stereo': T(32446), + 'None': T(32447) +} + + +def apiTranslate(string): + return API_TRANSLATION_MAP.get(string) or string diff --git a/script.plexmod/lib/playback_utils.py b/script.plexmod/lib/playback_utils.py new file mode 100644 index 000000000..57c0edb25 --- /dev/null +++ b/script.plexmod/lib/playback_utils.py @@ -0,0 +1,201 @@ +# coding=utf-8 +import json +import os +from collections import namedtuple, OrderedDict + +from kodi_six import xbmc, xbmcaddon, xbmcvfs +from plexnet import plexapp + +from lib import util + + + +ADDON = xbmcaddon.Addon() + + +ATTR_MAP = { + "b": "binge_mode", + "i": "auto_skip_intro", + "c": "auto_skip_credits", + "e": "show_intro_skip_early" +} + +# I know dicts are ordered in py3, but we want to be compatible with py2. +TRANS_MAP = OrderedDict(( + ("binge_mode", 33618), + ("auto_skip_intro", 32522), + ("auto_skip_credits", 32526), + ("show_intro_skip_early", 33505) +)) + +ATTR_MAP_REV = dict((v, k) for k, v in ATTR_MAP.items()) + + +PlaybackSettings = namedtuple("PlaybackSettings", list(v for v in ATTR_MAP.values())) + + +class PlaybackManager(object): + """ + Manages the playback settings for individual shows; falls back to the global default if no specifics set + """ + version = 1 + _data = None + _currentServerUUID = None + _currentUserID = None + + transMap = TRANS_MAP + + dataPath = os.path.join(util.translatePath(ADDON.getAddonInfo("profile")), "playback_settings.json") + + # this could be a property, but w/e + glob = None + + def __init__(self): + self.reset() + # bind settings change signals + for v in ATTR_MAP.values(): + plexapp.util.APP.on('change:{}'.format(v), lambda **kwargs: self.setGlob(**kwargs)) + + plexapp.util.APP.on('change:selectedServer', lambda **kwargs: self.setServerUUID(**kwargs)) + plexapp.util.APP.on("change:user", lambda **kwargs: self.setUserID(**kwargs)) + plexapp.util.APP.on('init', lambda **kwargs: self.setUserID(**kwargs)) + + def __call__(self, obj, key=None, value=None, kv_dict=None): + # shouldn't happen + if not self._currentServerUUID or not self._currentUserID: + util.DEBUG_LOG("APP.PlaybackManager, something's wrong: ServerUUID: %s, UserID: %s" % ( + self._currentServerUUID, self._currentUserID)) + return + + csid = self._currentServerUUID + cuid = self._currentUserID + + # set + if (key is not None and value is not None) or kv_dict is not None: + # prepare value dict + if csid not in self._data: + self._data[csid] = {} + + if cuid not in self._data[csid]: + self._data[csid][cuid] = {} + + ukv = {key: value} if not kv_dict else kv_dict + + if obj.ratingKey not in self._data[csid][cuid]: + self._data[csid][cuid][obj.ratingKey] = {} + + for k, v in ukv.items(): + # don't write globals into the storage + if v != getattr(self.glob, k): + self._data[csid][cuid][obj.ratingKey][ATTR_MAP_REV[k]] = v + else: + # new val set to global default, delete specific val + if ATTR_MAP_REV[k] in self._data[csid][cuid][obj.ratingKey]: + del self._data[csid][cuid][obj.ratingKey][ATTR_MAP_REV[k]] + + # empty specific settings? clean up + if not self._data[csid][cuid][obj.ratingKey]: + del self._data[csid][cuid][obj.ratingKey] + + self.save() + return self.glob._replace(**ukv) + + if not obj.ratingKey: + return self.glob + + # get + data = self._data.get(csid, {}).get(cuid, {}).get(obj.ratingKey, None) + if data: + return self.glob._replace(**dict((ATTR_MAP[k], v) for k, v in data.items())) + return self.glob + + def reset(self): + self._data = self.load() + if plexapp.SERVERMANAGER and plexapp.SERVERMANAGER.selectedServer: + self.setServerUUID() + + if plexapp.ACCOUNT: + self.setUserID() + self.setGlob() + + def setGlob(self, skey=None, value=None, **kwargs): + if skey is not None and value is not None: + self.glob = self.glob._replace(**{skey: value}) + else: + self.glob = PlaybackSettings(**dict((k, util.getUserSetting(k, False)) for k in ATTR_MAP.values())) + + def setServerUUID(self, server=None): + if not server and not plexapp.SERVERMANAGER.selectedServer: + return + self._currentServerUUID = (server if server is not None else plexapp.SERVERMANAGER.selectedServer).uuid + + def setUserID(self, account=None, reallyChanged=False): + if not account and not plexapp.ACCOUNT: + return + self._currentUserID = (account if account is not None and reallyChanged else plexapp.ACCOUNT).ID + self.setGlob() + + def load(self): + # new load method, v1 + if os.path.isfile(self.dataPath): + try: + f = xbmcvfs.File(self.dataPath) + obj = json.loads(f.read()) + f.close() + + version = obj["version"] + data = obj["data"] + except: + util.ERROR("Couldn't load playback_settings.json") + return {} + + if version < self.version: + migratedAny = False + for v in range(version + 1, self.version + 1): + migFunc = "migrateV{}".format(v) + if hasattr(self, migFunc): + migResult, data = getattr(self, migFunc)(data) + if migResult: + util.DEBUG_LOG("Migrated playback_settings.json to format v{}".format(v)) + migratedAny = True + if migratedAny: + self.save(data=data) + + return data + + else: + # migrate legacy data + jstring = plexapp.util.INTERFACE.getRegistry("BingeModeSettings") + if not jstring: + # fallback + jstring = plexapp.util.INTERFACE.getRegistry("AutoSkipSettings") + if not jstring: + return {} + + try: + util.DEBUG_LOG("Loading old BingeModeSettings") + obj = json.loads(jstring) + migData = {} + # migrate old BM settings into new format + for serverID, userIDs in obj.items(): + migData[serverID] = {} + for userID, ratingKeys in userIDs.items(): + migData[serverID][userID] = {} + for ratingKey, value in ratingKeys.items(): + migData[serverID][userID][ratingKey] = {"b": value} + + # plexapp.util.INTERFACE.clearRegistry("BingeModeSettings") + self.save(data=migData) + return migData + except: + util.DEBUG_LOG("Couldn't parse old BingeModeSettings") + return {} + + def save(self, data=None): + try: + f = xbmcvfs.File(self.dataPath, "w") + f.write(json.dumps({"version": self.version, "data": data or self._data})) + f.close() + except: + util.ERROR("Couldn't write playback_settings.json") + return diff --git a/script.plexmod/lib/player.py b/script.plexmod/lib/player.py new file mode 100644 index 000000000..7fed192d4 --- /dev/null +++ b/script.plexmod/lib/player.py @@ -0,0 +1,1480 @@ +from __future__ import absolute_import +import base64 +import threading +import six +import re +import os + +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import backgroundthread +from . import kodijsonrpc +from . import colors +from .windows import seekdialog +from . import util +from plexnet import plexplayer +from plexnet import plexapp +from plexnet import signalsmixin +from plexnet import util as plexnetUtil +from six.moves import range + +FIVE_MINUTES_MILLIS = 300000 + + +class BasePlayerHandler(object): + def __init__(self, player, session_id=None): + self.player = player + self.media = None + self.baseOffset = 0 + self.timelineType = None + self.lastTimelineState = None + self.ignoreTimelines = False + self.queuingNext = False + self.playQueue = None + self.sessionID = session_id + + def onAVChange(self): + pass + + def onAVStarted(self): + pass + + def onPrePlayStarted(self): + pass + + def onPlayBackStarted(self): + pass + + def onPlayBackPaused(self): + pass + + def onPlayBackResumed(self): + pass + + def onPlayBackStopped(self): + pass + + def onPlayBackEnded(self): + pass + + def onPlayBackSeek(self, stime, offset): + pass + + def onPlayBackFailed(self): + pass + + def onVideoWindowOpened(self): + pass + + def onVideoWindowClosed(self): + pass + + def onVideoOSD(self): + pass + + def onSeekOSD(self): + pass + + def onMonitorInit(self): + pass + + def tick(self): + pass + + def close(self): + pass + + def setSubtitles(self, *args, **kwargs): + pass + + def getIntroOffset(self, offset=None, setSkipped=False): + pass + + def setup(self, duration, meta, offset, bif_url, **kwargs): + pass + + @property + def trueTime(self): + return self.baseOffset + self.player.currentTime + + def getCurrentItem(self): + if self.player.playerObject: + return self.player.playerObject.item + return None + + def shouldSendTimeline(self, item): + return item.ratingKey and item.getServer() + + def currentDuration(self): + if self.player.playerObject and self.player.isPlaying(): + try: + return int(self.player.getTotalTime() * 1000) + except RuntimeError: + pass + + return 0 + + def updateNowPlaying(self, force=False, refreshQueue=False, state=None, time=None): + util.DEBUG_LOG("UpdateNowPlaying: force: {0} refreshQueue: {1} state: {2}".format(force, refreshQueue, state)) + if self.ignoreTimelines: + util.DEBUG_LOG("UpdateNowPlaying: ignoring timeline as requested") + return + + item = self.getCurrentItem() + if not item: + return + + if not self.shouldSendTimeline(item): + return + + state = state or self.player.playState + # Avoid duplicates + if state == self.lastTimelineState and not force: + return + + self.lastTimelineState = state + # self.timelineTimer.reset() + + time = time or int(self.trueTime * 1000) + + # self.trigger("progress", [m, item, time]) + + if refreshQueue and self.playQueue: + self.playQueue.refreshOnTimeline = True + + plexapp.util.APP.nowplayingmanager.updatePlaybackState( + self.timelineType, self.player.playerObject, state, time, self.playQueue, duration=self.currentDuration() + ) + + def getVolume(self): + return util.rpc.Application.GetProperties(properties=["volume"])["volume"] + + +class SeekPlayerHandler(BasePlayerHandler): + NO_SEEK = 0 + SEEK_IN_PROGRESS = 2 + SEEK_PLAYLIST = 3 + SEEK_REWIND = 4 + SEEK_POST_PLAY = 5 + + MODE_ABSOLUTE = 0 + MODE_RELATIVE = 1 + + def __init__(self, player, session_id=None): + BasePlayerHandler.__init__(self, player, session_id) + self.dialog = None + self.playlist = None + self.playQueue = None + self.timelineType = 'video' + self.ended = False + self.bifURL = '' + self.title = '' + self.title2 = '' + self.seekOnStart = 0 + self.chapters = None + self.stoppedInBingeMode = False + self.inBingeMode = False + self.prePlayWitnessed = False + self.queuingNext = False + self.reset() + + def reset(self): + self.duration = 0 + self.offset = 0 + self.baseOffset = 0 + self.seeking = self.NO_SEEK + self.seekOnStart = 0 + self.mode = self.MODE_RELATIVE + self.ended = False + self.stoppedInBingeMode = False + self.prePlayWitnessed = False + self.queuingNext = False + + def setup(self, duration, meta, offset, bif_url, title='', title2='', seeking=NO_SEEK, chapters=None): + self.ended = False + self.baseOffset = offset / 1000.0 + self.seeking = seeking + self.duration = duration + self.bifURL = bif_url + self.title = title + self.title2 = title2 + self.chapters = chapters or [] + self.playedThreshold = plexapp.util.INTERFACE.getPlayedThresholdValue() + self.ignoreTimelines = False + self.queuingNext = False + self.stoppedInBingeMode = False + self.inBingeMode = False + self.prePlayWitnessed = False + self.getDialog(setup=True) + self.dialog.setup(self.duration, meta, int(self.baseOffset * 1000), self.bifURL, self.title, self.title2, + chapters=self.chapters, keepMarkerDef=seeking == self.SEEK_IN_PROGRESS) + + def getDialog(self, setup=False): + if not self.dialog: + self.dialog = seekdialog.SeekDialog.create(show=False, handler=self) + + return self.dialog + + @property + def isTranscoded(self): + return self.mode == self.MODE_RELATIVE + + @property + def isDirectPlay(self): + return self.mode == self.MODE_ABSOLUTE + + @property + def trueTime(self): + if self.isTranscoded: + return self.baseOffset + self.player.currentTime + else: + if self.seekOnStart: + return self.player.playerObject.startOffset + (self.seekOnStart / 1000) + else: + return self.player.currentTime + self.player.playerObject.startOffset + + def shouldShowPostPlay(self): + if self.playlist and self.playlist.TYPE == 'playlist': + return False + + if self.inBingeMode and not self.stoppedInBingeMode: + return False + + if (not util.advancedSettings.postplayAlways and self.player.video.duration.asInt() <= FIVE_MINUTES_MILLIS)\ + or util.advancedSettings.postplayTimeout <= 0: + return False + + return True + + def showPostPlay(self): + if not self.shouldShowPostPlay(): + util.DEBUG_LOG("SeekHandler: Not showing post-play") + return + util.DEBUG_LOG("SeekHandler: Showing post-play") + + self.seeking = self.SEEK_POST_PLAY + self.hideOSD(delete=True) + + self.player.trigger('post.play', video=self.player.video, playlist=self.playlist, handler=self, + stoppedInBingeMode=self.stoppedInBingeMode) + + self.stoppedInBingeMode = False + + return True + + def getIntroOffset(self, offset=None, setSkipped=False): + return self.getDialog().displayMarkers(onlyReturnIntroMD=True, offset=offset, setSkipped=setSkipped) + + def next(self, on_end=False): + if self.playlist and next(self.playlist): + self.seeking = self.SEEK_PLAYLIST + + if on_end: + if self.showPostPlay(): + return True + + if not self.playlist or self.stoppedInBingeMode: + return False + + xbmc.sleep(500) + + self.player.playVideoPlaylist(self.playlist, handler=self, resume=self.player.resume) + + return True + + def prev(self): + if not self.playlist or not self.playlist.prev(): + return False + + self.seeking = self.SEEK_PLAYLIST + xbmc.sleep(500) + self.player.playVideoPlaylist(self.playlist, handler=self, resume=self.player.resume) + + return True + + def playAt(self, pos): + if not self.playlist or not self.playlist.setCurrent(pos): + return False + + self.seeking = self.SEEK_PLAYLIST + self.player.playVideoPlaylist(self.playlist, handler=self, resume=self.player.resume) + + return True + + def onSeekAborted(self): + if self.seeking: + self.seeking = self.NO_SEEK + self.player.control('play') + + def showOSD(self, from_seek=False): + self.updateOffset() + if self.dialog: + self.dialog.update(self.offset, from_seek) + self.dialog.showOSD() + + def hideOSD(self, delete=False): + util.CRON.forceTick() + if self.dialog: + self.dialog.hideOSD(closing=delete) + if delete: + d = self.dialog + self.dialog = None + d.doClose() + del d + util.garbageCollect() + + def seek(self, offset, settings_changed=False, seeking=SEEK_IN_PROGRESS): + util.DEBUG_LOG( + "SeekHandler: offset={0}, settings_changed={1}, seeking={2}, state={3}".format(offset, + settings_changed, + seeking, + self.player.playState)) + if offset is None: + return + + self.offset = offset + + if self.isDirectPlay and not settings_changed: + util.DEBUG_LOG('New absolute player offset: {0}'.format(self.offset)) + + if self.player.playerObject.offsetIsValid(offset / 1000): + if self.seekAbsolute(offset): + return + + self.updateNowPlaying(state=self.player.STATE_PAUSED) # To for update after seek + + self.seeking = self.SEEK_IN_PROGRESS + + if self.player.playState == self.player.STATE_PAUSED: + self.player.pauseAfterPlaybackStarted = True + + util.DEBUG_LOG('New player offset: {0}, state: {1}'.format(self.offset, self.player.playState)) + self.player._playVideo(offset, seeking=self.seeking, force_update=settings_changed) + + def fastforward(self): + xbmc.executebuiltin('PlayerControl(forward)') + + def rewind(self): + if self.isDirectPlay: + xbmc.executebuiltin('PlayerControl(rewind)') + else: + self.seek(max(self.trueTime - 30, 0) * 1000, seeking=self.SEEK_REWIND) + + def seekAbsolute(self, seek=None): + self.seekOnStart = seek or (self.seekOnStart if self.seekOnStart else None) + if self.seekOnStart is not None: + seekSeconds = self.seekOnStart / 1000.0 + try: + if seekSeconds >= self.player.getTotalTime(): + util.DEBUG_LOG("SeekAbsolute: Bad offset: {0}".format(seekSeconds)) + return False + except RuntimeError: # Not playing a file + util.DEBUG_LOG("SeekAbsolute: runtime error") + return False + self.updateNowPlaying(state=self.player.STATE_PAUSED) # To for update after seek + + util.DEBUG_LOG("SeekAbsolute: Seeking to {0}".format(self.seekOnStart)) + self.player.seekTime(self.seekOnStart / 1000.0) + return True + + def onAVChange(self): + util.DEBUG_LOG('SeekHandler: onAVChange') + if self.dialog: + self.dialog.onAVChange() + + def onAVStarted(self): + util.DEBUG_LOG('SeekHandler: onAVStarted') + + if self.dialog: + self.dialog.onAVStarted() + + # check if embedded subtitle was set correctly + if self.isDirectPlay and self.player.video and self.player.video.current_subtitle_is_embedded: + try: + playerID = kodijsonrpc.rpc.Player.GetActivePlayers()[0]["playerid"] + currIdx = kodijsonrpc.rpc.Player.GetProperties(playerid=playerID, properties=['currentsubtitle'])[ + 'currentsubtitle']['index'] + if currIdx != self.player.video._current_subtitle_idx: + util.LOG("Embedded Subtitle index was incorrect ({}), setting to: {}". + format(currIdx, self.player.video._current_subtitle_idx)) + self.dialog.setSubtitles() + else: + util.DEBUG_LOG("Embedded subtitle was correctly set in Kodi") + except: + util.ERROR("Exception when trying to check for embedded subtitles") + + def onPrePlayStarted(self): + util.DEBUG_LOG('SeekHandler: onPrePlayStarted, DP: {}'.format(self.isDirectPlay)) + self.prePlayWitnessed = True + if self.isDirectPlay: + self.setSubtitles(do_sleep=False) + + def onPlayBackStarted(self): + util.DEBUG_LOG('SeekHandler: onPlayBackStarted, DP: {}'.format(self.isDirectPlay)) + self.updateNowPlaying(force=True, refreshQueue=True) + + if self.dialog: + self.dialog.onPlayBackStarted() + + #if not self.prePlayWitnessed and self.isDirectPlay: + if self.isDirectPlay: + self.setSubtitles(do_sleep=False) + + def onPlayBackResumed(self): + self.updateNowPlaying() + if self.dialog: + self.dialog.onPlayBackResumed() + + util.CRON.forceTick() + # self.hideOSD() + + def onPlayBackStopped(self): + util.DEBUG_LOG('SeekHandler: onPlayBackStopped - ' + 'Seeking={0}, QueueingNext={1}, BingeMode={2}'.format(self.seeking, self.queuingNext, + self.inBingeMode)) + + if self.dialog: + self.dialog.onPlayBackStopped() + + if self.queuingNext and self.inBingeMode: + if self.next(on_end=False): + return + + if self.seeking not in (self.SEEK_IN_PROGRESS, self.SEEK_REWIND): + self.updateNowPlaying() + + # show post play if possible, if an item has been watched (90% by Plex standards) + if self.seeking != self.SEEK_PLAYLIST and self.duration: + playedFac = self.trueTime * 1000 / float(self.duration) + util.DEBUG_LOG("Player - played-threshold: {}/{}".format(playedFac, self.playedThreshold)) + if playedFac >= self.playedThreshold and self.next(on_end=True): + return + + if self.seeking not in (self.SEEK_IN_PROGRESS, self.SEEK_PLAYLIST): + self.hideOSD(delete=True) + self.sessionEnded() + + def onPlayBackEnded(self): + util.DEBUG_LOG('SeekHandler: onPlayBackEnded - Seeking={0}'.format(self.seeking)) + + if self.dialog: + self.dialog.onPlayBackEnded() + + if self.player.playerObject.hasMoreParts(): + self.updateNowPlaying(state=self.player.STATE_PAUSED) # To for update after seek + self.seeking = self.SEEK_IN_PROGRESS + self.player._playVideo(self.player.playerObject.getNextPartOffset(), seeking=self.seeking) + return + + self.updateNowPlaying() + + if self.queuingNext: + util.DEBUG_LOG('SeekHandler: onPlayBackEnded - event ignored') + return + + if self.inBingeMode: + self.stoppedInBingeMode = False + + if self.playlist and self.playlist.hasNext(): + self.queuingNext = True + if self.next(on_end=True): + return + else: + self.queuingNext = False + + if not self.ended: + if self.seeking != self.SEEK_PLAYLIST: + self.hideOSD() + + if self.seeking not in (self.SEEK_IN_PROGRESS, self.SEEK_PLAYLIST): + self.sessionEnded() + + def onPlayBackPaused(self): + self.updateNowPlaying() + if self.dialog: + self.dialog.onPlayBackPaused() + + def onPlayBackSeek(self, stime, offset): + util.DEBUG_LOG('SeekHandler: onPlayBackSeek - {0}, {1}, {2}'.format(stime, offset, self.seekOnStart)) + if self.dialog: + self.dialog.onPlayBackSeek(stime, offset) + + if self.seekOnStart: + seeked = False + if self.dialog: + seeked = self.dialog.tick(stime) + + if seeked: + util.DEBUG_LOG("OnPlayBackSeek: Seeked on start to: {0}".format(stime)) + self.seekOnStart = 0 + return + + self.updateOffset() + # self.showOSD(from_seek=True) + + def setSubtitles(self, do_sleep=True, honor_forced_subtitles_override=True): + if not self.player.video: + util.LOG("Warning: SetSubtitles: no player.video object available") + return + + subs = self.player.video.selectedSubtitleStream( + forced_subtitles_override=honor_forced_subtitles_override and util.getSetting("forced_subtitles_override", + False)) + if subs: + if do_sleep: + xbmc.sleep(100) + + path = subs.getSubtitleServerPath() + if self.isDirectPlay: + self.player.showSubtitles(False) + if path: + util.DEBUG_LOG('Setting subtitle path: {0} ({1})'.format(path, subs)) + self.player.setSubtitles(path) + self.player.showSubtitles(True) + + else: + # u_til.TEST(subs.__dict__) + # u_til.TEST(self.player.video.mediaChoice.__dict__) + util.DEBUG_LOG('Enabling embedded subtitles at: {0} ({1})'.format(subs.typeIndex, subs)) + self.player.setSubtitleStream(subs.typeIndex) + self.player.showSubtitles(True) + + else: + self.player.showSubtitles(False) + + def setAudioTrack(self): + if self.isDirectPlay: + track = self.player.video.selectedAudioStream() + if track: + # only try finding the current audio stream when the BG music isn't playing and wasn't the last + # thing played, because currentaudiostream doesn't populate for audio-only items; in that case, + # always select the proper audio stream + if not self.player.lastPlayWasBGM: + try: + playerID = kodijsonrpc.rpc.Player.GetActivePlayers()[0]["playerid"] + currIdx = kodijsonrpc.rpc.Player.GetProperties(playerid=playerID, properties=['currentaudiostream'])['currentaudiostream']['index'] + if currIdx == track.typeIndex: + util.DEBUG_LOG('Audio track is correct index: {0}'.format(track.typeIndex)) + return + except: + util.ERROR() + + self.player.lastPlayWasBGM = False + + xbmc.sleep(100) + util.DEBUG_LOG('Switching audio track - index: {0}'.format(track.typeIndex)) + self.player.setAudioStream(track.typeIndex) + + def updateOffset(self): + try: + self.offset = int(self.player.getTime() * 1000) + except RuntimeError: + pass + + def initPlayback(self): + self.seeking = self.NO_SEEK + + #self.setSubtitles() + if self.isTranscoded and self.player.getAvailableSubtitleStreams(): + util.DEBUG_LOG('Enabling first subtitle stream, as we\'re in DirectStream') + self.player.showSubtitles(True) + self.setAudioTrack() + + if self.isDirectPlay: + self.seekAbsolute() + + def onPlayBackFailed(self): + if self.ended: + return False + + if self.dialog: + self.dialog.onPlayBackFailed() + + util.DEBUG_LOG('SeekHandler: onPlayBackFailed - Seeking={0}'.format(self.seeking)) + if self.seeking not in (self.SEEK_IN_PROGRESS, self.SEEK_PLAYLIST): + self.sessionEnded() + + if self.seeking == self.SEEK_IN_PROGRESS: + return False + else: + self.seeking = self.NO_SEEK + + return True + + # def onSeekOSD(self): + # self.dialog.activate() + + def onVideoWindowOpened(self): + util.DEBUG_LOG('SeekHandler: onVideoWindowOpened - Seeking={0}'.format(self.seeking)) + self.getDialog().show() + + self.initPlayback() + + def onVideoWindowClosed(self): + self.hideOSD() + util.DEBUG_LOG('SeekHandler: onVideoWindowClosed - Seeking={0}'.format(self.seeking)) + if not self.seeking: + if self.player.isPlaying(): + self.player.stop() + if not self.playlist or not self.playlist.hasNext(): + if not self.shouldShowPostPlay(): + self.sessionEnded() + + def onVideoOSD(self): + # xbmc.executebuiltin('Dialog.Close(seekbar,true)') # Doesn't work :) + self.showOSD() + + def tick(self): + if self.seeking != self.SEEK_IN_PROGRESS: + self.updateNowPlaying(force=True) + + if self.dialog: + self.dialog.tick() + + def close(self): + self.hideOSD(delete=True) + + def sessionEnded(self): + if self.ended: + return + self.ended = True + util.DEBUG_LOG('Player: Video session ended') + self.player.trigger('session.ended', session_id=self.sessionID) + self.hideOSD(delete=True) + + __next__ = next + + +class AudioPlayerHandler(BasePlayerHandler): + def __init__(self, player): + BasePlayerHandler.__init__(self, player) + self.timelineType = 'music' + util.setGlobalProperty('track.ID', '') + self.extractTrackInfo() + + def extractTrackInfo(self): + if not self.player.isPlayingAudio(): + return + + plexID = None + for x in range(10): # Wait a sec (if necessary) for this to become available + try: + item = kodijsonrpc.rpc.Player.GetItem(playerid=0, properties=['comment'])['item'] + plexID = item['comment'] + except: + util.ERROR() + + if plexID: + break + xbmc.sleep(100) + + if not plexID: + return + + if not plexID.startswith('PLEX-'): + return + + util.DEBUG_LOG('Extracting track info from comment') + try: + data = plexID.split(':', 1)[-1] + from plexnet import plexobjects + track = plexobjects.PlexObject.deSerialize(base64.urlsafe_b64decode(data.encode('utf-8'))) + track.softReload() + self.media = track + pobj = plexplayer.PlexAudioPlayer(track) + self.player.playerObject = pobj + self.updatePlayQueueTrack(track) + util.setGlobalProperty('track.ID', track.ratingKey) # This is used in the skins to match a listitem + except: + util.ERROR() + + def setPlayQueue(self, pq): + self.playQueue = pq + pq.on('items.changed', self.playQueueCallback) + + def playQueueCallback(self, **kwargs): + plist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) + # plist.clear() + try: + citem = kodijsonrpc.rpc.Player.GetItem(playerid=0, properties=['comment'])['item'] + plexID = citem['comment'].split(':', 1)[0] + except: + util.ERROR() + return + + current = plist.getposition() + size = plist.size() + + # Remove everything but the current track + for x in range(size - 1, current, -1): # First everything with a greater position + kodijsonrpc.rpc.Playlist.Remove(playlistid=xbmc.PLAYLIST_MUSIC, position=x) + for x in range(current): # Then anything with a lesser position + kodijsonrpc.rpc.Playlist.Remove(playlistid=xbmc.PLAYLIST_MUSIC, position=0) + + swap = None + for idx, track in enumerate(self.playQueue.items()): + tid = 'PLEX-{0}'.format(track.ratingKey) + if tid == plexID: + # Save the position of the current track in the pq + swap = idx + + url, li = self.player.createTrackListItem(track, index=idx + 1) + + plist.add(url, li) + + plist[0].setInfo('music', { + 'playcount': swap + 1, + }) + + # Now swap the track to the correct position. This seems to be the only way to update the kodi playlist position to the current track's new position + if swap is not None: + kodijsonrpc.rpc.Playlist.Swap(playlistid=xbmc.PLAYLIST_MUSIC, position1=0, position2=swap + 1) + kodijsonrpc.rpc.Playlist.Remove(playlistid=xbmc.PLAYLIST_MUSIC, position=0) + + self.player.trigger('playlist.changed') + + def updatePlayQueue(self, delay=False): + if not self.playQueue: + return + + self.playQueue.refresh(delay=delay) + + def updatePlayQueueTrack(self, track): + if not self.playQueue: + return + + self.playQueue.selectedId = track.playQueueItemID or None + + @property + def trueTime(self): + try: + return self.player.getTime() + except: + return self.player.currentTime + + def stampCurrentTime(self): + try: + self.player.currentTime = self.player.getTime() + except RuntimeError: # Not playing + pass + + def onMonitorInit(self): + self.extractTrackInfo() + self.updateNowPlaying(state='playing') + + def onPlayBackStarted(self): + self.player.lastPlayWasBGM = False + self.updatePlayQueue(delay=True) + self.extractTrackInfo() + self.updateNowPlaying(state='playing') + + def onPlayBackResumed(self): + self.updateNowPlaying(state='playing') + + def onPlayBackPaused(self): + self.updateNowPlaying(state='paused') + + def onPlayBackStopped(self): + self.updatePlayQueue() + self.updateNowPlaying(state='stopped') + self.finish() + + def onPlayBackEnded(self): + self.updatePlayQueue() + self.updateNowPlaying(state='stopped') + self.finish() + + def onPlayBackFailed(self): + return True + + def finish(self): + self.player.trigger('session.ended') + util.setGlobalProperty('track.ID', '') + + def tick(self): + if not self.player.isPlayingAudio() or util.MONITOR.abortRequested(): + return + + self.stampCurrentTime() + self.updateNowPlaying(force=True) + + +class BGMPlayerHandler(BasePlayerHandler): + def __init__(self, player, rating_key): + BasePlayerHandler.__init__(self, player) + self.timelineType = 'music' + self.currentlyPlaying = rating_key + util.setGlobalProperty('track.ID', '') + util.setGlobalProperty('theme_playing', '1') + + self.oldVolume = util.rpc.Application.GetProperties(properties=["volume"])["volume"] + + def onPlayBackStarted(self): + util.DEBUG_LOG("BGM: playing theme for %s" % self.currentlyPlaying) + self.player.bgmPlaying = True + + def _setVolume(self, vlm): + xbmc.executebuiltin("SetVolume({})".format(vlm)) + + def setVolume(self, volume=None, reset=False): + vlm = self.oldVolume if reset else volume + curVolume = self.getVolume() + + if curVolume != vlm: + util.DEBUG_LOG("BGM: {}setting volume to: {}".format("re-" if reset else "", vlm)) + self._setVolume(vlm) + else: + util.DEBUG_LOG("BGM: Volume already at {}".format(vlm)) + return + + waited = 0 + waitMax = 5 + while curVolume != vlm and waited < waitMax: + util.DEBUG_LOG("Waiting for volume to change from {} to {}".format(curVolume, vlm)) + xbmc.sleep(100) + waited += 1 + curVolume = self.getVolume() + + if waited == waitMax: + util.DEBUG_LOG("BGM: Timeout setting volume to {} (is: {}). Might have been externally changed in the " + "meantime".format(vlm, self.getVolume())) + + def resetVolume(self): + self.setVolume(reset=True) + + def onPlayBackStopped(self): + util.DEBUG_LOG("BGM: stopped theme for {}".format(self.currentlyPlaying)) + util.setGlobalProperty('theme_playing', '') + self.player.bgmPlaying = False + self.resetVolume() + + def onPlayBackEnded(self): + self.onPlayBackStopped() + + def onPlayBackFailed(self): + self.onPlayBackStopped() + + def close(self): + self.player.stopAndWait() + self.onPlayBackStopped() + + +class BGMPlayerTask(backgroundthread.Task): + def setup(self, source, player, *args, **kwargs): + self.source = source + self.player = player + return self + + def cancel(self): + self.player.stopAndWait() + self.player = None + backgroundthread.Task.cancel(self) + + def run(self): + if self.isCanceled(): + return + + self.player.play(self.source, windowed=True) + + +class PlexPlayer(xbmc.Player, signalsmixin.SignalsMixin): + STATE_STOPPED = "stopped" + STATE_PLAYING = "playing" + STATE_PAUSED = "paused" + STATE_BUFFERING = "buffering" + + OFFSET_RE = re.compile(r'(offset=)\d+') + + def __init__(self, *args, **kwargs): + xbmc.Player.__init__(self, *args, **kwargs) + signalsmixin.SignalsMixin.__init__(self) + self.handler = AudioPlayerHandler(self) + + def init(self): + self._closed = False + self._nextItem = None + self.started = False + self.bgmPlaying = False + self.lastPlayWasBGM = False + self.BGMTask = None + self.pauseAfterPlaybackStarted = False + self.video = None + self.hasOSD = False + self.hasSeekOSD = False + self.handler = AudioPlayerHandler(self) + self.playerObject = None + self.currentTime = 0 + self.thread = None + self.ignoreStopEvents = False + if xbmc.getCondVisibility('Player.HasMedia'): + self.started = True + self.resume = False + self.open() + + return self + + def open(self): + self._closed = False + self.monitor() + + def close(self, shutdown=False): + self._closed = True + + def reset(self): + self.video = None + self.started = False + self.bgmPlaying = False + self.playerObject = None + self.pauseAfterPlaybackStarted = False + self.ignoreStopEvents = False + #self.handler = AudioPlayerHandler(self) + self.currentTime = 0 + + def control(self, cmd): + if cmd == 'play': + self.pauseAfterPlaybackStarted = False + util.DEBUG_LOG('Player - Control: Command=Play') + if xbmc.getCondVisibility('Player.Paused | !Player.Playing'): + util.DEBUG_LOG('Player - Control: Playing') + xbmc.executebuiltin('PlayerControl(Play)') + elif cmd == 'pause': + util.DEBUG_LOG('Player - Control: Command=Pause') + if not xbmc.getCondVisibility('Player.Paused'): + util.DEBUG_LOG('Player - Control: Pausing') + xbmc.executebuiltin('PlayerControl(Play)') + + @property + def playState(self): + if xbmc.getCondVisibility('Player.Playing'): + return self.STATE_PLAYING + elif xbmc.getCondVisibility('Player.Caching'): + return self.STATE_BUFFERING + elif xbmc.getCondVisibility('Player.Paused'): + return self.STATE_PAUSED + + return self.STATE_STOPPED + + def videoIsFullscreen(self): + return xbmc.getCondVisibility('VideoPlayer.IsFullscreen') + + def currentTrack(self): + if self.handler.media and self.handler.media.type == 'track': + return self.handler.media + return None + + def playAt(self, path, ms): + """ + Plays the video specified by path. + Optionally set the start position with h,m,s,ms keyword args. + """ + seconds = ms / 1000.0 + + h = int(seconds / 3600) + m = int((seconds % 3600) / 60) + s = int(seconds % 60) + ms = int((seconds % 1) * 1000) + + kodijsonrpc.rpc.Player.Open( + item={'file': path}, + options={'resume': {'hours': h, 'minutes': m, 'seconds': s, 'milliseconds': ms}} + ) + + def play(self, *args, **kwargs): + self.started = False + xbmc.Player.play(self, *args, **kwargs) + + def playBackgroundMusic(self, source, volume, rating_key, *args, **kwargs): + if self.isPlaying(): + if not self.lastPlayWasBGM: + return + + else: + # don't re-queue the currently playing theme + if self.handler.currentlyPlaying == rating_key: + return + + # cancel any currently playing theme before starting the new one + else: + self.stopAndWait() + + if self.BGMTask and self.BGMTask.isValid(): + self.BGMTask.cancel() + + self.started = False + self.handler = BGMPlayerHandler(self, rating_key) + + # store current volume if it's different from the BGM volume + curVol = self.handler.getVolume() + if volume < curVol: + util.setSetting('last_good_volume', curVol) + + self.lastPlayWasBGM = True + + self.handler.setVolume(volume) + + self.BGMTask = BGMPlayerTask().setup(source, self, *args, **kwargs) + backgroundthread.BGThreader.addTask(self.BGMTask) + + def playVideo(self, video, resume=False, force_update=False, session_id=None, handler=None): + if self.bgmPlaying: + self.stopAndWait() + + self.handler = handler if handler and isinstance(handler, SeekPlayerHandler) \ + else SeekPlayerHandler(self, session_id) + + self.video = video + self.resume = resume + self.open() + self._playVideo(resume and video.viewOffset.asInt() or 0, force_update=force_update) + + def getOSSPathHint(self, meta): + # only hint the path one folder above for a movie, two folders above for TV + try: + head1, tail1 = os.path.split(meta.path) + head2, tail2 = os.path.split(head1) + if self.video.type == "episode": + head3, tail3 = os.path.split(head2) + cleaned_path = os.path.join(tail3, tail2, tail1) + else: + cleaned_path = os.path.join(tail2, tail1) + except: + cleaned_path = "" + return cleaned_path + + def _playVideo(self, offset=0, seeking=0, force_update=False, playerObject=None): + self.trigger('new.video', video=self.video) + self.trigger( + 'change.background', + url=self.video.defaultArt.asTranscodedImageURL(1920, 1080, opacity=60, background=colors.noAlpha.Background) + ) + try: + if not playerObject: + self.playerObject = plexplayer.PlexPlayer(self.video, offset, forceUpdate=force_update) + self.playerObject.build() + self.playerObject = self.playerObject.getServerDecision() + except plexplayer.DecisionFailure as e: + util.showNotification(e.reason, header=util.T(32448, 'Playback Failed!')) + return + except: + util.ERROR(notify=True) + return + + meta = self.playerObject.metadata + + # Kodi 19 will try to look for subtitles in the directory containing the file. '/' and `/file.mkv` both point + # to the file, and Kodi will happily try to read the whole file without recognizing it isn't a directory. + # To get around that, we omit the filename here since it is unnecessary. + url = meta.streamUrls[0].replace("file.mkv", "").replace("file.mp4", "") + + bifURL = self.playerObject.getBifUrl() + util.DEBUG_LOG('Playing URL(+{1}ms): {0}{2}'.format(plexnetUtil.cleanToken(url), offset, bifURL and ' - indexed' or '')) + + self.ignoreStopEvents = True + self.stopAndWait() # Stop before setting up the handler to prevent player events from causing havoc + self.ignoreStopEvents = False + + self.handler.setup(self.video.duration.asInt(), meta, offset, bifURL, title=self.video.grandparentTitle, + title2=self.video.title, seeking=seeking, chapters=self.video.chapters) + + # try to get an early intro offset so we can skip it if necessary + introOffset = None + if not offset: + # in case we're transcoded, instruct the marker handler to set the marker a skipped, so we don't re-skip it + # after seeking + probOff = self.handler.getIntroOffset(offset, setSkipped=meta.isTranscoded) + if probOff: + introOffset = probOff + + if meta.isTranscoded: + self.handler.mode = self.handler.MODE_RELATIVE + + if introOffset: + # cheat our way into an early intro skip by modifying the offset in the stream URL + util.DEBUG_LOG("Immediately seeking behind intro: {}".format(introOffset)) + url = self.OFFSET_RE.sub(r"\g<1>{}".format(introOffset // 1000), url) + self.handler.dialog.baseOffset = introOffset + + # probably not necessary + meta.playStart = introOffset // 1000 + else: + if offset: + util.DEBUG_LOG("Using as SeekOnStart: {0}; offset: {1}".format(meta.playStart, offset)) + self.handler.seekOnStart = meta.playStart * 1000 + elif introOffset: + util.DEBUG_LOG("Seeking behind intro after playstart: {}".format(introOffset)) + self.handler.seekOnStart = introOffset + + self.handler.mode = self.handler.MODE_ABSOLUTE + + url = util.addURLParams(url, { + 'X-Plex-Client-Profile-Name': 'Generic', + 'X-Plex-Client-Identifier': plexapp.util.INTERFACE.getGlobal('clientIdentifier') + }) + li = xbmcgui.ListItem(self.video.title, path=url) + vtype = self.video.type if self.video.type in ('movie', 'episode', 'musicvideo') else 'video' + + util.setGlobalProperty("current_path", self.getOSSPathHint(meta), base='videoinfo.{0}') + util.setGlobalProperty("current_size", str(meta.size), base='videoinfo.{0}') + li.setInfo('video', { + 'mediatype': vtype, + 'title': self.video.title, + 'originaltitle': self.video.title, + 'tvshowtitle': self.video.grandparentTitle, + 'episode': vtype == "episode" and self.video.index.asInt() or '', + 'season': vtype == "episode" and self.video.parentIndex.asInt() or '', + #'year': self.video.year.asInt(), + 'plot': self.video.summary, + 'path': meta.path, + 'size': meta.size, + }) + li.setArt({ + 'poster': self.video.defaultThumb.asTranscodedImageURL(347, 518), + 'fanart': self.video.defaultArt.asTranscodedImageURL(1920, 1080), + 'thumb': self.video.defaultThumb.asTranscodedImageURL(256, 256), + }) + + self.play(url, li) + + def playVideoPlaylist(self, playlist, resume=False, handler=None, session_id=None): + if self.bgmPlaying: + self.stopAndWait() + + if handler and isinstance(handler, SeekPlayerHandler): + self.handler = handler + else: + self.handler = SeekPlayerHandler(self, session_id) + + self.handler.playlist = playlist + if playlist.isRemote: + self.handler.playQueue = playlist + self.video = playlist.current() + self.video.softReload(includeChapters=1) + self.resume = resume + self.open() + self._playVideo(resume and self.video.viewOffset.asInt() or 0, seeking=handler and handler.SEEK_PLAYLIST or 0, force_update=True) + + # def createVideoListItem(self, video, index=0): + # url = 'plugin://script.plex/play?{0}'.format(base64.urlsafe_b64encode(video.serialize())) + # li = xbmcgui.ListItem(self.video.title, path=url, thumbnailImage=self.video.defaultThumb.asTranscodedImageURL(256, 256)) + # vtype = self.video.type if self.video.vtype in ('movie', 'episode', 'musicvideo') else 'video' + # li.setInfo('video', { + # 'mediatype': vtype, + # 'playcount': index, + # 'title': video.title, + # 'tvshowtitle': video.grandparentTitle, + # 'episode': video.index.asInt(), + # 'season': video.parentIndex.asInt(), + # 'year': video.year.asInt(), + # 'plot': video.summary + # }) + # li.setArt({ + # 'poster': self.video.defaultThumb.asTranscodedImageURL(347, 518), + # 'fanart': self.video.defaultArt.asTranscodedImageURL(1920, 1080), + # }) + + # return url, li + + def playAudio(self, track, fanart=None, **kwargs): + if self.bgmPlaying: + self.stopAndWait() + + self.handler = AudioPlayerHandler(self) + url, li = self.createTrackListItem(track, fanart) + self.stopAndWait() + self.play(url, li, **kwargs) + + def playAlbum(self, album, startpos=-1, fanart=None, **kwargs): + if self.bgmPlaying: + self.stopAndWait() + + self.handler = AudioPlayerHandler(self) + plist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) + plist.clear() + index = 1 + for track in album.tracks(): + url, li = self.createTrackListItem(track, fanart, index=index) + plist.add(url, li) + index += 1 + xbmc.executebuiltin('PlayerControl(RandomOff)') + self.stopAndWait() + self.play(plist, startpos=startpos, **kwargs) + + def playAudioPlaylist(self, playlist, startpos=-1, fanart=None, **kwargs): + if self.bgmPlaying: + self.stopAndWait() + + self.handler = AudioPlayerHandler(self) + plist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) + plist.clear() + index = 1 + for track in playlist.items(): + url, li = self.createTrackListItem(track, fanart, index=index) + plist.add(url, li) + index += 1 + + if playlist.isRemote: + self.handler.setPlayQueue(playlist) + else: + if playlist.startShuffled: + plist.shuffle() + xbmc.executebuiltin('PlayerControl(RandomOn)') + else: + xbmc.executebuiltin('PlayerControl(RandomOff)') + self.stopAndWait() + self.play(plist, startpos=startpos, **kwargs) + + def createTrackListItem(self, track, fanart=None, index=0): + data = base64.urlsafe_b64encode(track.serialize().encode("utf8")).decode("utf8") + url = 'plugin://script.plexmod/play?{0}'.format(data) + li = xbmcgui.ListItem(track.title, path=url) + li.setInfo('music', { + 'artist': six.text_type(track.originalTitle or track.grandparentTitle), + 'title': six.text_type(track.title), + 'album': six.text_type(track.parentTitle), + 'discnumber': track.parentIndex.asInt(), + 'tracknumber': track.get('index').asInt(), + 'duration': int(track.duration.asInt() / 1000), + 'playcount': index, + 'comment': 'PLEX-{0}:{1}'.format(track.ratingKey, data) + }) + art = fanart or track.defaultArt + li.setArt({ + 'fanart': art.asTranscodedImageURL(1920, 1080), + 'landscape': util.backgroundFromArt(art), + 'thumb': track.defaultThumb.asTranscodedImageURL(800, 800), + }) + if fanart: + li.setArt({'fanart': fanart}) + return (url, li) + + def onPrePlayStarted(self): + util.DEBUG_LOG('Player - PRE-PLAY; handler: %r' % self.handler) + self.trigger('preplay.started') + if not self.handler: + return + self.handler.onPrePlayStarted() + + def onPlayBackStarted(self): + util.DEBUG_LOG('Player - STARTED') + self.trigger('playback.started') + self.started = True + if self.pauseAfterPlaybackStarted: + self.control('pause') + self.pauseAfterPlaybackStarted = False + + if not self.handler: + return + self.handler.onPlayBackStarted() + + def onAVChange(self): + util.DEBUG_LOG('Player - AVChange') + if not self.handler: + return + self.handler.onAVChange() + + def onAVStarted(self): + util.DEBUG_LOG('Player - AVStarted: {}'.format(self.handler)) + self.trigger('av.started') + if not self.handler: + return + self.handler.onAVStarted() + + def onPlayBackPaused(self): + util.DEBUG_LOG('Player - PAUSED') + if not self.handler: + return + self.handler.onPlayBackPaused() + + def onPlayBackResumed(self): + util.DEBUG_LOG('Player - RESUMED') + if not self.handler: + return + + self.handler.onPlayBackResumed() + + def onPlayBackStopped(self): + util.DEBUG_LOG('Player - STOPPED' + (not self.started and ': FAILED' or '')) + if self.ignoreStopEvents: + return + + if not self.started: + self.onPlayBackFailed() + + if not self.handler: + return + self.handler.onPlayBackStopped() + + def onPlayBackEnded(self): + util.DEBUG_LOG('Player - ENDED' + (not self.started and ': FAILED' or '')) + if self.ignoreStopEvents: + return + + if not self.started: + self.onPlayBackFailed() + + if not self.handler: + return + self.handler.onPlayBackEnded() + + def onPlayBackSeek(self, time, offset): + util.DEBUG_LOG('Player - SEEK: %i' % offset) + if not self.handler: + return + self.handler.onPlayBackSeek(time, offset) + + def onPlayBackFailed(self): + util.DEBUG_LOG('Player - FAILED: {}'.format(self.handler)) + if not self.handler: + return + + if self.handler.onPlayBackFailed(): + util.showNotification(util.T(32448, 'Playback Failed!')) + self.stopAndWait() + self.close() + # xbmcgui.Dialog().ok('Failed', 'Playback failed') + + def onVideoWindowOpened(self): + util.DEBUG_LOG('Player: Video window opened') + try: + self.handler.onVideoWindowOpened() + except: + util.ERROR() + + def onVideoWindowClosed(self): + util.DEBUG_LOG('Player: Video window closed') + try: + self.handler.onVideoWindowClosed() + # self.stop() + except: + util.ERROR() + + def onVideoOSD(self): + util.DEBUG_LOG('Player: Video OSD opened') + try: + self.handler.onVideoOSD() + except: + util.ERROR() + + def onSeekOSD(self): + util.DEBUG_LOG('Player: Seek OSD opened') + try: + self.handler.onSeekOSD() + except: + util.ERROR() + + def stopAndWait(self): + if self.isPlaying(): + util.DEBUG_LOG('Player: Stopping and waiting...') + self.stop() + while not util.MONITOR.waitForAbort(0.1) and self.isPlaying(): + pass + util.MONITOR.waitForAbort(0.2) + util.DEBUG_LOG('Player: Stopping and waiting...Done') + + def monitor(self): + if not self.thread or not self.thread.is_alive(): + self.thread = threading.Thread(target=self._monitor, name='PLAYER:MONITOR') + self.thread.start() + + def _monitor(self): + try: + while not util.MONITOR.abortRequested() and not self._closed: + if not self.isPlaying(): + util.DEBUG_LOG('Player: Idling...') + + while not self.isPlaying() and not util.MONITOR.abortRequested() and not self._closed: + util.MONITOR.waitForAbort(0.1) + + if self.isPlayingVideo(): + util.DEBUG_LOG('Monitoring video...') + self._videoMonitor() + elif self.isPlayingAudio(): + util.DEBUG_LOG('Monitoring audio...') + self._audioMonitor() + elif self.isPlaying(): + util.DEBUG_LOG('Monitoring pre-play...') + + # note: this might never be triggered depending on how fast the video playback starts. + # don't rely on it in any way. + self._preplayMonitor() + + self.handler.close() + self.close() + util.DEBUG_LOG('Player: Closed') + finally: + self.trigger('session.ended') + + def _preplayMonitor(self): + self.onPrePlayStarted() + while self.isPlaying() and not self.isPlayingVideo() and not self.isPlayingAudio() and not util.MONITOR.abortRequested() and not self._closed: + util.MONITOR.waitForAbort(0.1) + + if not self.isPlayingVideo() and not self.isPlayingAudio(): + self.onPlayBackFailed() + + def _videoMonitor(self): + hasFullScreened = False + + ct = 0 + while self.isPlayingVideo() and not util.MONITOR.abortRequested() and not self._closed: + try: + self.currentTime = self.getTime() + except RuntimeError: + break + + util.MONITOR.waitForAbort(0.1) + if xbmc.getCondVisibility('Window.IsActive(videoosd)'): + if not self.hasOSD: + self.hasOSD = True + self.onVideoOSD() + else: + self.hasOSD = False + + if xbmc.getCondVisibility('Window.IsActive(seekbar)'): + if not self.hasSeekOSD: + self.hasSeekOSD = True + self.onSeekOSD() + else: + self.hasSeekOSD = False + + if xbmc.getCondVisibility('VideoPlayer.IsFullscreen'): + if not hasFullScreened: + hasFullScreened = True + self.onVideoWindowOpened() + elif hasFullScreened and not xbmc.getCondVisibility('Window.IsVisible(busydialog)'): + hasFullScreened = False + self.onVideoWindowClosed() + + ct += 1 + if ct > 9: + ct = 0 + self.handler.tick() + + if hasFullScreened: + self.onVideoWindowClosed() + + def _audioMonitor(self): + self.started = True + self.handler.onMonitorInit() + ct = 0 + while self.isPlayingAudio() and not util.MONITOR.abortRequested() and not self._closed: + try: + self.currentTime = self.getTime() + except RuntimeError: + break + + util.MONITOR.waitForAbort(0.1) + + ct += 1 + if ct > 9: + ct = 0 + self.handler.tick() + + +def shutdown(): + global PLAYER + PLAYER.close(shutdown=True) + del PLAYER + + +PLAYER = PlexPlayer().init() diff --git a/script.plexmod/lib/plex.py b/script.plexmod/lib/plex.py new file mode 100644 index 000000000..0576f537b --- /dev/null +++ b/script.plexmod/lib/plex.py @@ -0,0 +1,454 @@ +from __future__ import absolute_import +import sys +import platform +import traceback +import uuid +import json +import threading +import time +import requests +import six + +from kodi_six import xbmc, xbmcaddon + +from plexnet import plexapp, myplex, util as plexnet_util, asyncadapter, http as pnhttp + +from .playback_utils import PlaybackManager +from . windows.settings import PlayedThresholdSetting +from . import util +from six.moves import range + +if six.PY2: + _Event = threading._Event +else: + _Event = threading.Event + + +class PlexTimer(plexapp.util.Timer): + def shouldAbort(self): + return util.MONITOR.abortRequested() + + +def abortFlag(): + return util.MONITOR.abortRequested() + + +plexapp.util.setTimer(PlexTimer) +plexapp.setAbortFlagFunction(abortFlag) + +maxVideoRes = plexapp.Res((3840, 2160)) # INTERFACE.globals["supports4k"] and plexapp.Res((3840, 2160)) or plexapp.Res((1920, 1080)) + +CLIENT_ID = util.getSetting('client.ID') +if not CLIENT_ID: + CLIENT_ID = str(uuid.uuid4()) + util.setSetting('client.ID', CLIENT_ID) + + +def defaultUserAgent(): + """Return a string representing the default user agent.""" + _implementation = platform.python_implementation() + + if _implementation == 'CPython': + _implementation_version = platform.python_version() + elif _implementation == 'PyPy': + _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel]) + elif _implementation == 'Jython': + _implementation_version = platform.python_version() # Complete Guess + elif _implementation == 'IronPython': + _implementation_version = platform.python_version() # Complete Guess + else: + _implementation_version = 'Unknown' + + try: + p_system = platform.system() + p_release = platform.release() + except IOError: + p_system = 'Unknown' + p_release = 'Unknown' + + return " ".join(['%s/%s' % ('PM4K', util.ADDON.getAddonInfo('version')), + '%s/%s' % ('Kodi', xbmc.getInfoLabel('System.BuildVersion').replace(' ', '-')), + '%s/%s' % (_implementation, _implementation_version), + '%s/%s' % (p_system, p_release)]) + + +class PlexInterface(plexapp.AppInterface): + _regs = { + None: {}, + } + _globals = { + 'platform': 'Kodi', + 'appVersionStr': util.ADDON.getAddonInfo('version'), + 'clientIdentifier': CLIENT_ID, + 'platformVersion': xbmc.getInfoLabel('System.BuildVersion'), + 'product': 'PM4K', + 'provides': 'player', + 'device': util.getPlatform() or plexapp.PLATFORM, + 'model': 'Unknown', + 'friendlyName': util.rpc.Settings.GetSettingValue(setting='services.devicename').get('value') or 'Kodi', + 'supports1080p60': True, + 'vp9Support': True, + 'audioChannels': '2.0', + 'transcodeVideoQualities': [ + "10", "20", "30", "30", "40", "60", "60", "75", "100", "60", "75", "90", "100", "100" + ], + 'transcodeVideoResolutions': [ + plexapp.Res((220, 180)), + plexapp.Res((220, 128)), + plexapp.Res((284, 160)), + plexapp.Res((420, 240)), + plexapp.Res((576, 320)), + plexapp.Res((720, 480)), + plexapp.Res((1024, 768)), + plexapp.Res((1280, 720)), + plexapp.Res((1280, 720)), + maxVideoRes, maxVideoRes, maxVideoRes, maxVideoRes, maxVideoRes + ], + 'transcodeVideoBitrates': [ + "64", "96", "208", "320", "720", "1500", "2000", "3000", "4000", "8000", "10000", "12000", "20000", "400000" + ], + 'deviceInfo': plexapp.DeviceInfo() + } + + bingeModeManager = None + + def getPreference(self, pref, default=None): + if pref == 'manual_connections': + return self.getManualConnections() + else: + return util.getSetting(pref, default) + + def getManualConnections(self): + conns = [] + for i in range(2): + ip = util.getSetting('manual_ip_{0}'.format(i)) + if not ip: + continue + port = util.getSetting('manual_port_{0}'.format(i), 32400) + conns.append({'connection': ip, 'port': port}) + return json.dumps(conns) + + def setPreference(self, pref, value): + util.setSetting(pref, value) + + def getRegistry(self, reg, default=None, sec=None): + if sec == 'myplex' and reg == 'MyPlexAccount': + ret = util.getSetting('{0}.{1}'.format(sec, reg), default) + if ret: + return ret + return json.dumps({'authToken': util.getSetting('auth.token')}) + else: + return util.getSetting('{0}.{1}'.format(sec, reg), default) + + def setRegistry(self, reg, value, sec=None): + util.setSetting('{0}.{1}'.format(sec, reg), value) + + def clearRegistry(self, reg, sec=None): + util.setSetting('{0}.{1}'.format(sec, reg), '') + + def addInitializer(self, sec): + pass + + def clearInitializer(self, sec): + pass + + def getGlobal(self, glbl, default=None): + if glbl == 'transcodeVideoResolutions': + maxres = self.getPreference('allow_4k', True) and plexapp.Res((3840, 2160)) or plexapp.Res((1920, 1080)) + self._globals['transcodeVideoResolutions'][-5:] = [maxres] * 5 + elif glbl == 'audioChannels': + try: + self._globals['audioChannels'] = \ + util.CHANNELMAPPING[util.rpc.Settings.GetSettingValue(setting='audiooutput.channels').get('value')] + except: + util.DEBUG_LOG("Limiting audio channel definition to 2.0 due to error: %s" % traceback.format_exc()) + self._globals['audioChannels'] = "2.0" + + return self._globals.get(glbl, default) + + def getCapabilities(self): + return '' + + def LOG(self, msg): + util.DEBUG_LOG('API: {0}'.format(msg)) + + def DEBUG_LOG(self, msg): + self.LOG('DEBUG: {0}'.format(msg)) + + def WARN_LOG(self, msg): + self.LOG('WARNING: {0}'.format(msg)) + + def ERROR_LOG(self, msg): + self.LOG('ERROR: {0}'.format(msg)) + + def ERROR(self, msg=None, err=None): + if err: + self.LOG('ERROR: {0} - {1}'.format(msg, getattr(err, "message", "Unknown Error"))) + else: + util.ERROR() + + def supportsAudioStream(self, codec, channels): + return True + # if codec = invalid then return true + + # canDownmix = (m.globals["audioDownmix"][codec] <> invalid) + # supportsSurroundSound = m.SupportsSurroundSound() + + # if not supportsSurroundSound and canDownmix then + # maxChannels = m.globals["audioDownmix"][codec] + # else + # maxChannels = firstOf(m.globals["audioDecoders"][codec], 0) + # end if + + # if maxChannels > 2 and not canDownmix and not supportsSurroundSound then + # ' It's a surround sound codec and we can't do surround sound + # supported = false + # else if maxChannels = 0 or maxChannels < channels then + # ' The codec is either unsupported or can't handle the requested channels + # supported = false + # else + # supported = true + + # return supported + + def supportsSurroundSound(self): + return True + + def getQualityIndex(self, qualityType): + if qualityType == self.QUALITY_LOCAL: + return self.getPreference("local_quality", 13) + elif qualityType == self.QUALITY_ONLINE: + return self.getPreference("online_quality", 13) + else: + return self.getPreference("remote_quality", 13) + + def getMaxResolution(self, quality_type, allow4k=False): + qualityIndex = self.getQualityIndex(quality_type) + + if qualityIndex >= 9: + if self.getPreference('allow_4k', True): + return allow4k and 2160 or 1088 + else: + return 1088 + elif qualityIndex >= 6: + return 720 + elif qualityIndex >= 5: + return 480 + else: + return 360 + + def getThemeMusicValue(self): + index = 10 - self.getPreference("theme_music", 5) + if index > 0: + return index * 10 + return 0 + + def getPlayedThresholdValue(self): + values = list(reversed(PlayedThresholdSetting.options)) + return int(values[self.getPreference("played_threshold", 1)].replace(" %", "")) / 100.0 + + +def onSmartDiscoverLocalChange(value=None, **kwargs): + plexnet_util.CHECK_LOCAL = value + plexapp.refreshResources(True) + + +def onPreferLANChange(value=None, **kwargs): + plexnet_util.LOCAL_OVER_SECURE = value + plexapp.refreshResources(True) + + +def onPreferLocalChange(**kwargs): + plexapp.refreshResources(True) + + +def onManualIPChange(**kwargs): + plexapp.refreshResources(True) + + +plexapp.util.setInterface(PlexInterface()) +plexapp.util.INTERFACE.playbackManager = PlaybackManager() +plexapp.util.APP.on('change:smart_discover_local', onSmartDiscoverLocalChange) +plexapp.util.APP.on('change:prefer_local', onPreferLANChange) +plexapp.util.APP.on('change:same_network', onPreferLocalChange) +plexapp.util.APP.on('change:manual_ip_0', onManualIPChange) +plexapp.util.APP.on('change:manual_ip_1', onManualIPChange) +plexapp.util.APP.on('change:manual_port_0', onManualIPChange) +plexapp.util.APP.on('change:manual_port_1', onManualIPChange) + +plexapp.util.CHECK_LOCAL = util.getSetting('smart_discover_local', True) +plexapp.util.LOCAL_OVER_SECURE = util.getSetting('prefer_local', False) + +# set requests timeout +TIMEOUT = float(util.advancedSettings.requestsTimeout) +CONNCHECK_TIMEOUT = float(util.advancedSettings.connCheckTimeout) +plexapp.util.TIMEOUT = TIMEOUT +plexapp.util.CONN_CHECK_TIMEOUT = asyncadapter.AsyncTimeout(CONNCHECK_TIMEOUT).setConnectTimeout(CONNCHECK_TIMEOUT) +plexapp.util.LAN_REACHABILITY_TIMEOUT = util.advancedSettings.localReachTimeout / 1000.0 +pnhttp.DEFAULT_TIMEOUT = asyncadapter.AsyncTimeout(TIMEOUT).setConnectTimeout(TIMEOUT) +asyncadapter.DEFAULT_TIMEOUT = pnhttp.DEFAULT_TIMEOUT +plexapp.util.ACCEPT_LANGUAGE = util.ACCEPT_LANGUAGE_CODE +plexapp.setUserAgent(defaultUserAgent()) + + +class CallbackEvent(plexapp.util.CompatEvent): + def __init__(self, context, signal, timeout=15, *args, **kwargs): + plexnet_util.Event.__init__(self, *args, **kwargs) + self.start = time.time() + self.context = context + self.signal = signal + self.timeout = timeout + self.context.on(self.signal, self.set) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.wait() + + def __repr__(self): + return '<{0}:{1}>'.format(self.__class__.__name__, self.signal) + + def set(self, **kwargs): + plexnet_util.Event.set(self) + + def wait(self): + if not plexnet_util.Event.wait(self, self.timeout): + util.DEBUG_LOG('{0}: TIMED-OUT'.format(self)) + self.close() + + def triggeredOrTimedOut(self, timeout=None): + try: + if time.time() - self.start > self.timeout: + util.DEBUG_LOG('{0}: TIMED-OUT'.format(self)) + return True + + if timeout: + plexnet_util.Event.wait(self, timeout) + finally: + return self.isSet() + + def close(self): + self.set() + self.context.off(self.signal, self.set) + + +def init(): + util.DEBUG_LOG('Initializing...') + + with CallbackEvent(plexapp.util.APP, 'init'): + plexapp.init() + util.DEBUG_LOG('Waiting for account initialization...') + + util.DEBUG_LOG('Account initialized: {}'.format(plexapp.ACCOUNT.ID)) + + retry = True + + while retry: + retry = False + if not plexapp.ACCOUNT.authToken: + util.DEBUG_LOG("No auth token, authorizing") + token = authorize() + + if not token: + util.DEBUG_LOG('FAILED TO AUTHORIZE') + return False + + with CallbackEvent(plexapp.util.APP, 'account:response'): + plexapp.ACCOUNT.validateToken(token) + util.DEBUG_LOG('Waiting for account initialization...') + + # if not PLEX: + # util.messageDialog('Connection Error', u'Unable to connect to any servers') + # util.DEBUG_LOG('SIGN IN: Failed to connect to any servers') + # return False + + # util.DEBUG_LOG('SIGN IN: Connected to server: {0} - {1}'.format(PLEX.friendlyName, PLEX.baseuri)) + success = requirePlexPass() + if success == 'RETRY': + retry = True + continue + + return success + + +def requirePlexPass(): + return True + # if not plexapp.ACCOUNT.hasPlexPass(): + # from windows import signin, background + # background.setSplash(False) + # w = signin.SignInPlexPass.open() + # retry = w.retry + # del w + # util.DEBUG_LOG('PlexPass required. Signing out...') + # plexapp.ACCOUNT.signOut() + # plexapp.SERVERMANAGER.clearState() + # if retry: + # return 'RETRY' + # else: + # return False + + # return True + + +def authorize(): + from .windows import signin, background + + background.setSplash(False) + + back = signin.Background.create() + + pre = signin.PreSignInWindow.open() + try: + if not pre.doSignin: + return None + finally: + del pre + + try: + while True: + pinLoginWindow = signin.PinLoginWindow.create() + try: + pl = myplex.PinLogin() + except requests.ConnectionError: + util.ERROR() + util.messageDialog(util.T(32427, 'Failed'), util.T(32449, 'Sign-in failed. Cound not connect to plex.tv')) + return + + pinLoginWindow.setPin(pl.pin) + + try: + pl.startTokenPolling() + while not pl.finished(): + if pinLoginWindow.abort: + util.DEBUG_LOG('SIGN IN: Pin login aborted') + pl.abort() + return None + xbmc.sleep(100) + else: + if not pl.expired(): + if pl.authenticationToken: + pinLoginWindow.setLinking() + return pl.authenticationToken + else: + return None + finally: + pinLoginWindow.doClose() + del pinLoginWindow + + if pl.expired(): + util.DEBUG_LOG('SIGN IN: Pin expired') + expiredWindow = signin.ExpiredWindow.open() + try: + if not expiredWindow.refresh: + util.DEBUG_LOG('SIGN IN: Pin refresh aborted') + return None + finally: + del expiredWindow + finally: + back.doClose() + del back diff --git a/script.plexmod/lib/util.py b/script.plexmod/lib/util.py new file mode 100644 index 000000000..cd7a2d5d7 --- /dev/null +++ b/script.plexmod/lib/util.py @@ -0,0 +1,1009 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +import gc +import sys +import re +import binascii +import json +import threading +import math +import time +import datetime +import contextlib +import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error +import six +import os +import struct +import requests + +from .kodijsonrpc import rpc +from kodi_six import xbmc +from kodi_six import xbmcgui +from kodi_six import xbmcaddon +from kodi_six import xbmcvfs + +from . import colors +from plexnet import signalsmixin, plexapp + +DEBUG = True +_SHUTDOWN = False + +ADDON = xbmcaddon.Addon() + +SETTINGS_LOCK = threading.Lock() + +_build = None +# buildversion looks like: XX.X[-TAG] (a+.b+.c+) (.+); there are kodi builds that don't set the build version +sys_ver = xbmc.getInfoLabel('System.BuildVersion') +_ver = sys_ver +if ' ' in sys_ver and '(' in sys_ver: + _ver, _build = sys_ver.split()[:2] + +_splitver = _ver.split(".") +KODI_VERSION_MAJOR, KODI_VERSION_MINOR = int(_splitver[0].split("-")[0].strip()), \ + int(_splitver[1].split("-")[0].strip()) + +_bmajor, _bminor, _bpatch = (KODI_VERSION_MAJOR, KODI_VERSION_MINOR, 0) +if _build: + _bmajor, _bminor, _bpatch = _build[1:-1].split(".") +else: + xbmc.log('script.plex: Couldn\'t determine build version, falling back to Kodi version', xbmc.LOGINFO) + +# calculate a comparable build number +KODI_BUILD_NUMBER = int("{0}{1:02d}{2:03d}".format(_bmajor, int(_bminor), int(_bpatch))) +xbmc.log('script.plex: Kodi {0}.{1} (build {2})'.format(KODI_VERSION_MAJOR, KODI_VERSION_MINOR, KODI_BUILD_NUMBER), + xbmc.LOGINFO) + + +if KODI_VERSION_MAJOR > 18: + translatePath = xbmcvfs.translatePath +else: + translatePath = xbmc.translatePath + +PROFILE = translatePath(ADDON.getAddonInfo('profile')) + + +def getChannelMapping(): + data = rpc.Settings.GetSettings(filter={"section": "system", "category": "audio"})["settings"] + return list(filter(lambda i: i["id"] == "audiooutput.channels", data))[0]["options"] + + +# retrieve labels for mapping audio channel settings values +try: + CHANNELMAPPING = dict((t["value"], t["label"]) for t in getChannelMapping()) +except: + CHANNELMAPPING = None + + +def getLanguageCode(add_def=None): + data = rpc.Settings.GetSettingValue(setting='locale.language')['value'].replace('resource.language.', '') + lang = "" + if "_" in data: + base, variant = data.split("_") + lang += "{}-{},{}".format(base, variant.upper(), base) + else: + lang = data + if add_def and lang not in add_def: + lang += ",{}".format(add_def) + return lang + + +try: + ACCEPT_LANGUAGE_CODE = getLanguageCode(add_def='en-US,en') +except: + ACCEPT_LANGUAGE_CODE = 'en-US,en' + + +def getSetting(key, default=None): + with SETTINGS_LOCK: + setting = ADDON.getSetting(key) + return _processSetting(setting, default) + + +def getUserSetting(key, default=None): + if not plexapp.ACCOUNT: + return default + + key = '{}.{}'.format(key, plexapp.ACCOUNT.ID) + with SETTINGS_LOCK: + setting = ADDON.getSetting(key) + return _processSetting(setting, default) + + +def _processSetting(setting, default): + if not setting: + return default + if isinstance(default, bool): + return setting.lower() == 'true' + elif isinstance(default, float): + return float(setting) + elif isinstance(default, int): + return int(float(setting or 0)) + elif isinstance(default, list): + if setting: + return json.loads(binascii.unhexlify(setting)) + else: + return default + + return setting + + +class AdvancedSettings(object): + """ + @DynamicAttrs + """ + + _proxiedSettings = ( + ("debug", False), + ("kodi_skip_stepping", False), + ("auto_seek", True), + ("auto_seek_delay", 1), + ("dynamic_timeline_seek", False), + ("fast_back", False), + ("dynamic_backgrounds", True), + ("background_art_blur_amount2", 0), + ("background_art_opacity_amount2", 20), + ("screensaver_quiz", False), + ("postplay_always", False), + ("postplay_timeout", 16), + ("skip_intro_button_timeout", 10), + ("skip_credits_button_timeout", 10), + ("playlist_visit_media", True), + ("intro_skip_early", False), + ("show_media_ends_info", True), + ("show_media_ends_label", True), + ("background_colour", None), + ("oldprofile", False), + ("skip_intro_button_show_early_threshold1", 60), + ("requests_timeout", 5.0), + ("local_reach_timeout", 10), + ("auto_skip_offset", 2.5), + ("conn_check_timeout", 2.5), + ("postplayCancel", True), + ("skip_marker_timer_cancel", True), + ("skip_marker_timer_immediate", False), + ("low_drift_timer", True), + ("player_show_buffer", True), + ("buffer_wait_max", 120), + ("buffer_insufficient_wait", 10), + ("continue_use_thumb", True), + ("use_bg_fallback", False), + ("dbg_crossfade", True), + ("subtitle_use_extended_title", True), + ("dialog_flicker_fix", True), + ("poster_resolution_scale_perc", 100), + ) + + def __init__(self): + # register every known setting camelCased as an attribute to this instance + for setting, default in self._proxiedSettings: + name_split = setting.split("_") + setattr(self, name_split[0] + ''.join(x.capitalize() or '_' for x in name_split[1:]), + getSetting(setting, default)) + + +advancedSettings = AdvancedSettings() + + +def LOG(msg, level=xbmc.LOGINFO): + xbmc.log('script.plex: {0}'.format(msg), level) + + +def DEBUG_LOG(msg): + if _SHUTDOWN: + return + + if not advancedSettings.debug and not xbmc.getCondVisibility('System.GetBool(debug.showloginfo)'): + return + + LOG(msg) + + +def ERROR(txt='', hide_tb=False, notify=False, time_ms=3000): + short = str(sys.exc_info()[1]) + if hide_tb: + xbmc.log('script.plex: ERROR: {0} - {1}'.format(txt, short), xbmc.LOGERROR) + return short + + import traceback + tb = traceback.format_exc() + xbmc.log("_________________________________________________________________________________", xbmc.LOGERROR) + xbmc.log('script.plex: ERROR: ' + txt, xbmc.LOGERROR) + for l in tb.splitlines(): + xbmc.log(' ' + l, xbmc.LOGERROR) + xbmc.log("_________________________________________________________________________________", xbmc.LOGERROR) + xbmc.log("`", xbmc.LOGERROR) + if notify: + showNotification('ERROR: {0}'.format(txt or short), time_ms=time_ms) + return short + + +def TEST(msg): + xbmc.log('---TEST: {0}'.format(msg), xbmc.LOGINFO) + + +class UtilityMonitor(xbmc.Monitor, signalsmixin.SignalsMixin): + def __init__(self, *args, **kwargs): + xbmc.Monitor.__init__(self, *args, **kwargs) + signalsmixin.SignalsMixin.__init__(self) + + def watchStatusChanged(self): + self.trigger('changed.watchstatus') + + def actionStop(self): + self.stopPlayback() + + def actionQuit(self): + LOG('OnSleep: Exit Kodi') + xbmc.executebuiltin('Quit') + + def actionReboot(self): + LOG('OnSleep: Reboot') + xbmc.restart() + + def actionShutdown(self): + LOG('OnSleep: Shutdown') + xbmc.shutdown() + + def actionHibernate(self): + LOG('OnSleep: Hibernate') + xbmc.executebuiltin('Hibernate') + + def actionSuspend(self): + LOG('OnSleep: Suspend') + xbmc.executebuiltin('Suspend') + + def actionCecstandby(self): + LOG('OnSleep: CEC Standby') + xbmc.executebuiltin('CECStandby') + + def actionLogoff(self): + LOG('OnSleep: Sign Out') + xbmc.executebuiltin('System.LogOff') + + def onNotification(self, sender, method, data): + LOG("Notification: {} {} {}".format(sender, method, data)) + if sender == 'script.plexmod' and method.endswith('RESTORE'): + from .windows import kodigui + if not kodigui.BaseFunctions.lastWinID: + ERROR("Addon never properly started, can't reactivate") + setGlobalProperty('stop_running', '1') + return + if kodigui.BaseFunctions.lastWinID > 13000: + xbmc.executebuiltin('ActivateWindow({0})'.format(kodigui.BaseFunctions.lastWinID)) + else: + ERROR("Addon never properly started, can't reactivate") + setGlobalProperty('stop_running', '1') + return + + getAdvancedSettings() + populateTimeFormat() + + elif sender == "xbmc" and method == "System.OnSleep" and getSetting('action_on_sleep', "none") != "none": + getattr(self, "action{}".format(getSetting('action_on_sleep', "none").capitalize()))() + + def stopPlayback(self): + LOG('Monitor: Stopping media playback') + xbmc.Player().stop() + + def onScreensaverActivated(self): + DEBUG_LOG("Monitor: OnScreensaverActivated") + if getSetting('player_stop_on_screensaver', True) and xbmc.Player().isPlayingVideo(): + self.stopPlayback() + + def onDPMSActivated(self): + DEBUG_LOG("Monitor: OnDPMSActivated") + #self.stopPlayback() + + +MONITOR = UtilityMonitor() + +ADV_MSIZE_RE = re.compile(r'(\d+)') +ADV_RFACT_RE = re.compile(r'(\d+)') +ADV_CACHE_RE = re.compile(r'\s*.*', re.S | re.I) + + +class KodiCacheManager(object): + """ + A pretty cheap approach at managing the section of advancedsettings.xml + + Starting with build 20.90.821 (Kodi 21.0-BETA2) a lot of caching issues have been fixed and + readfactor behaves better. We need to adjust for that. + """ + _cleanData = None + useModernAPI = False + memorySize = 20 # in MB + readFactor = 4 + defRF = 4 + defRFSM = 20 + recRFRange = (4, 10) + template = None + orig_tpl_path = os.path.join(ADDON.getAddonInfo('path'), "pm4k_cache_template.xml") + custom_tpl_path = "special://profile/pm4k_cache_template.xml" + translated_ctpl_path = translatePath(custom_tpl_path) + + # give Android a little more leeway with its sometimes weird memory management; otherwise stick with 23% of free mem + safeFactor = .20 if xbmc.getCondVisibility('System.Platform.Android') else .23 + + def __init__(self): + if KODI_BUILD_NUMBER >= 2090821: + self.memorySize = rpc.Settings.GetSettingValue(setting='filecache.memorysize')['value'] + self.readFactor = rpc.Settings.GetSettingValue(setting='filecache.readfactor')['value'] / 100.0 + if self.readFactor % 1 == 0: + self.readFactor = int(self.readFactor) + DEBUG_LOG("Not using advancedsettings.xml for cache/buffer management, we're at least Kodi 21 non-alpha") + self.useModernAPI = True + self.defRFSM = 7 + self.recRFRange = (1.5, 4) + + else: + self.load() + self.template = self.getTemplate() + + plexapp.util.APP.on('change:slow_connection', + lambda value=None, **kwargs: self.write(readFactor=value and self.defRFSM or self.defRF)) + + def getTemplate(self): + if xbmcvfs.exists(self.custom_tpl_path): + try: + f = xbmcvfs.File(self.custom_tpl_path) + data = f.read() + f.close() + if data: + return data + except: + pass + + DEBUG_LOG("Custom pm4k_cache_template.xml not found, using default") + f = xbmcvfs.File(self.orig_tpl_path) + data = f.read() + f.close() + return data + + def load(self): + try: + f = xbmcvfs.File("special://profile/advancedsettings.xml") + data = f.read() + f.close() + except: + LOG('script.plex: No advancedsettings.xml found') + else: + cachexml_match = ADV_CACHE_RE.search(data) + if cachexml_match: + cachexml = cachexml_match.group(0) + + try: + self.memorySize = int(ADV_MSIZE_RE.search(cachexml).group(1)) // 1024 // 1024 + except (ValueError, IndexError, TypeError): + DEBUG_LOG("script.plex: invalid or not found memorysize in advancedsettings.xml") + + try: + self.readFactor = int(ADV_RFACT_RE.search(cachexml).group(1)) + except (ValueError, IndexError, TypeError): + DEBUG_LOG("script.plex: invalid or not found readfactor in advancedsettings.xml") + + self._cleanData = data.replace(cachexml, "") + else: + self._cleanData = data + + def write(self, memorySize=None, readFactor=None): + memorySize = self.memorySize = memorySize if memorySize is not None else self.memorySize + readFactor = self.readFactor = readFactor if readFactor is not None else self.readFactor + + if self.useModernAPI: + # kodi cache settings have moved to Services>Caching + try: + rpc.Settings.SetSettingValue(setting='filecache.memorysize', value=self.memorySize) + rpc.Settings.SetSettingValue(setting='filecache.readfactor', value=int(self.readFactor * 100)) + except: + pass + return + + cd = self._cleanData + if not cd: + cd = "\n" + + finalxml = "{}\n".format( + cd.replace("", self.template.format(memorysize=memorySize * 1024 * 1024, + readfactor=readFactor)) + ) + + try: + f = xbmcvfs.File("special://profile/advancedsettings.xml", "w") + f.write(finalxml) + f.close() + except: + ERROR("Couldn't write advancedsettings.xml") + + def clamp16(self, x): + return x - x % 16 + + @property + def viableOptions(self): + default = list(filter(lambda x: x < self.recMax, + [16, 20, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024])) + + # add option to overcommit slightly + overcommit = [] + if xbmc.getCondVisibility('System.Platform.Android'): + overcommit.append(min(self.clamp16(int(self.free * 0.23)), 2048)) + + overcommit.append(min(self.clamp16(int(self.free * 0.26)), 2048)) + overcommit.append(min(self.clamp16(int(self.free * 0.3)), 2048)) + + # re-append current memorySize here, as recommended max might have changed + return list(sorted(list(set(default + [self.memorySize, self.recMax] + overcommit)))) + + @property + def readFactorOpts(self): + return list(sorted(list(set([1.25, 1.5, 1.75, 2, 2.5, 3, 4, 5, 7, 10, 15, 20, 30, 50] + [self.readFactor])))) + + @property + def free(self): + return float(xbmc.getInfoLabel('System.Memory(free)')[:-2]) + + @property + def recMax(self): + freeMem = self.free + recMem = min(int(freeMem * self.safeFactor), 2048) + LOG("Free memory: {} MB, recommended max: {} MB".format(freeMem, recMem)) + return recMem + + +kcm = KodiCacheManager() + +CACHE_SIZE = kcm.memorySize + + +def T(ID, eng=''): + return ADDON.getLocalizedString(ID) + + +hasCustomBGColour = False +if KODI_VERSION_MAJOR > 18: + hasCustomBGColour = not advancedSettings.dynamicBackgrounds and advancedSettings.backgroundColour and \ + advancedSettings.backgroundColour != "-" + + +def getAdvancedSettings(): + # yes, global, hang me! + global advancedSettings + advancedSettings = AdvancedSettings() + + +def setSetting(key, value): + with SETTINGS_LOCK: + value = _processSettingForWrite(value) + ADDON.setSetting(key, value) + + +def _processSettingForWrite(value): + if isinstance(value, list): + value = binascii.hexlify(json.dumps(value)) + elif isinstance(value, bool): + value = value and 'true' or 'false' + return str(value) + + +def setGlobalProperty(key, val, base='script.plex.{0}'): + xbmcgui.Window(10000).setProperty(base.format(key), val) + + +def setGlobalBoolProperty(key, boolean, base='script.plex.{0}'): + xbmcgui.Window(10000).setProperty(base.format(key), boolean and '1' or '') + + +def getGlobalProperty(key): + return xbmc.getInfoLabel('Window(10000).Property(script.plex.{0})'.format(key)) + + +def showNotification(message, time_ms=3000, icon_path=None, header=ADDON.getAddonInfo('name')): + try: + icon_path = icon_path or translatePath(ADDON.getAddonInfo('icon')) + xbmc.executebuiltin('Notification({0},{1},{2},{3})'.format(header, message, time_ms, icon_path)) + except RuntimeError: # Happens when disabling the addon + LOG(message) + + +def videoIsPlaying(): + return xbmc.getCondVisibility('Player.HasVideo') + + +def messageDialog(heading='Message', msg=''): + from .windows import optionsdialog + optionsdialog.show(heading, msg, 'OK') + + +def showTextDialog(heading, text): + t = TextBox() + t.setControls(heading, text) + + +def sortTitle(title): + return title.startswith('The ') and title[4:] or title + + +def durationToText(seconds): + """ + Converts seconds to a short user friendly string + Example: 143 -> 2m 23s + """ + days = int(seconds / 86400000) + if days: + return '{0} day{1}'.format(days, days > 1 and 's' or '') + left = seconds % 86400000 + hours = int(left / 3600000) + if hours: + hours = '{0} hr{1} '.format(hours, hours > 1 and 's' or '') + else: + hours = '' + left = left % 3600000 + mins = int(left / 60000) + if mins: + return hours + '{0} min{1}'.format(mins, mins > 1 and 's' or '') + elif hours: + return hours.rstrip() + secs = int(left % 60000) + if secs: + secs /= 1000 + return '{0} sec{1}'.format(secs, secs > 1 and 's' or '') + return '0 seconds' + + +def durationToShortText(seconds): + """ + Converts seconds to a short user friendly string + Example: 143 -> 2m 23s + """ + days = int(seconds / 86400000) + if days: + return '{0} d'.format(days) + left = seconds % 86400000 + hours = int(left / 3600000) + if hours: + hours = '{0} h '.format(hours) + else: + hours = '' + left = left % 3600000 + mins = int(left / 60000) + if mins: + return hours + '{0} m'.format(mins) + elif hours: + return hours.rstrip() + secs = int(left % 60000) + if secs: + secs /= 1000 + return '{0} s'.format(secs) + return '0 s' + + +def cleanLeadingZeros(text): + if not text: + return '' + return re.sub(r'(?<= )0(\d)', r'\1', text) + + +def removeDups(dlist): + return [ii for n, ii in enumerate(dlist) if ii not in dlist[:n]] + + +SIZE_NAMES = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") + + +def simpleSize(size): + """ + Converts bytes to a short user friendly string + Example: 12345 -> 12.06 KB + """ + s = 0 + if size > 0: + i = int(math.floor(math.log(size, 1024))) + p = math.pow(1024, i) + s = round(size / p, 2) + if (s > 0): + return '%s %s' % (s, SIZE_NAMES[i]) + else: + return '0B' + + +def timeDisplay(ms, cutHour=False): + h = ms / 3600000 + m = (ms % 3600000) / 60000 + s = (ms % 60000) / 1000 + if h >= 1 or not cutHour: + return '{0:0>2}:{1:0>2}:{2:0>2}'.format(int(h), int(m), int(s)) + return '{0:0>2}:{1:0>2}'.format(int(m), int(s)) + + +def simplifiedTimeDisplay(ms): + left, right = timeDisplay(ms).rsplit(':', 1) + left = left.lstrip('0:') or '0' + return left + ':' + right + + +def shortenText(text, size): + if len(text) < size: + return text + + return u'{0}\u2026'.format(text[:size - 1]) + + +def scaleResolution(w, h, by=None): + if by is None: + by = advancedSettings.posterResolutionScalePerc + + if 0 < by != 100.0: + px = w * h * (by / 100.0) + wratio = h / float(w) + hratio = w / float(h) + return int(round((px / wratio) ** .5)), int(round((px / hratio) ** .5)) + return w, h + + +class TextBox: + # constants + WINDOW = 10147 + CONTROL_LABEL = 1 + CONTROL_TEXTBOX = 5 + + def __init__(self, *args, **kwargs): + # activate the text viewer window + xbmc.executebuiltin("ActivateWindow(%d)" % (self.WINDOW, )) + # get window + self.win = xbmcgui.Window(self.WINDOW) + # give window time to initialize + xbmc.sleep(1000) + + def setControls(self, heading, text): + # set heading + self.win.getControl(self.CONTROL_LABEL).setLabel(heading) + # set text + self.win.getControl(self.CONTROL_TEXTBOX).setText(text) + + +class SettingControl: + def __init__(self, setting, log_display, disable_value=''): + self.setting = setting + self.logDisplay = log_display + self.disableValue = disable_value + self._originalMode = None + self.store() + + def disable(self): + rpc.Settings.SetSettingValue(setting=self.setting, value=self.disableValue) + DEBUG_LOG('{0}: DISABLED'.format(self.logDisplay)) + + def set(self, value): + rpc.Settings.SetSettingValue(setting=self.setting, value=value) + DEBUG_LOG('{0}: SET={1}'.format(self.logDisplay, value)) + + def store(self): + try: + self._originalMode = rpc.Settings.GetSettingValue(setting=self.setting).get('value') + DEBUG_LOG('{0}: Mode stored ({1})'.format(self.logDisplay, self._originalMode)) + except: + ERROR() + + def restore(self): + if self._originalMode is None: + return + rpc.Settings.SetSettingValue(setting=self.setting, value=self._originalMode) + DEBUG_LOG('{0}: RESTORED'.format(self.logDisplay)) + + @contextlib.contextmanager + def suspend(self): + self.disable() + yield + self.restore() + + @contextlib.contextmanager + def save(self): + yield + self.restore() + + +def timeInDayLocalSeconds(): + now = datetime.datetime.now() + sod = datetime.datetime(year=now.year, month=now.month, day=now.day) + sod = int(time.mktime(sod.timetuple())) + return int(time.time() - sod) + + +def getKodiSkipSteps(): + try: + return rpc.Settings.GetSettingValue(setting="videoplayer.seeksteps")["value"] + except: + return + + +def getKodiSlideshowInterval(): + try: + return rpc.Settings.GetSettingValue(setting="slideshow.staytime")["value"] + except: + return 3 + + +kodiSkipSteps = getKodiSkipSteps() +slideshowInterval = getKodiSlideshowInterval() + + +CRON = None + + +class CronReceiver(): + def tick(self): + pass + + def halfHour(self): + pass + + def day(self): + pass + + +class Cron(threading.Thread): + def __init__(self, interval): + threading.Thread.__init__(self, name='CRON') + self.stopped = threading.Event() + self.force = threading.Event() + self.interval = interval + self._lastHalfHour = self._getHalfHour() + self._receivers = [] + + global CRON + + CRON = self + + def __enter__(self): + self.start() + DEBUG_LOG('Cron started') + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.stop() + self.join() + + def _wait(self): + ct = 0 + while ct < self.interval: + xbmc.sleep(100) + ct += 0.1 + if self.force.isSet(): + self.force.clear() + return True + if MONITOR.abortRequested() or self.stopped.isSet(): + return False + return True + + def forceTick(self): + self.force.set() + + def stop(self): + self.stopped.set() + + def run(self): + while self._wait(): + self._tick() + DEBUG_LOG('Cron stopped') + + def _getHalfHour(self): + tid = timeInDayLocalSeconds() / 60 + return tid - (tid % 30) + + def _tick(self): + receivers = list(self._receivers) + receivers = self._halfHour(receivers) + for r in receivers: + try: + r.tick() + except: + ERROR() + + def _halfHour(self, receivers): + hh = self._getHalfHour() + if hh == self._lastHalfHour: + return receivers + try: + receivers = self._day(receivers, hh) + ret = [] + for r in receivers: + try: + if not r.halfHour(): + ret.append(r) + except: + ret.append(r) + ERROR() + return ret + finally: + self._lastHalfHour = hh + + def _day(self, receivers, hh): + if hh >= self._lastHalfHour: + return receivers + ret = [] + for r in receivers: + try: + if not r.day(): + ret.append(r) + except: + ret.append(r) + ERROR() + return ret + + def registerReceiver(self, receiver): + if receiver not in self._receivers: + DEBUG_LOG('Cron: Receiver added: {0}'.format(receiver)) + self._receivers.append(receiver) + + def cancelReceiver(self, receiver): + if receiver in self._receivers: + DEBUG_LOG('Cron: Receiver canceled: {0}'.format(receiver)) + self._receivers.pop(self._receivers.index(receiver)) + + +def getTimeFormat(): + """ + Generic: + Use locale.timeformat setting to get and make use of the format. + + Possible values: + HH:mm:ss -> %H:%M:%S + regional -> legacy + H:mm:ss -> %-H:%M:%S + + Legacy: Not necessarily true for Omega?; regional spices things up (depending on Kodi version?) + Get global time format. + Kodi's time format handling is weird, as they return incompatible formats for strftime. + %H%H can be returned for manually set zero-padded values, in case of a regional zero-padded hour component, + only %H is returned. + + For now, sail around that by testing the current time for padded hour values. + + Tests of the values returned by xbmc.getRegion("time") as of Kodi Nexus (I believe): + %I:%M:%S %p = h:mm:ss, non-zero-padded, 12h PM + %I:%M:%S = 12h, h:mm:ss, non-zero-padded, regional + %I%I:%M:%S = 12h, zero padded, hh:mm:ss + %H%H:%M:%S = 24h, zero padded, hh:mm:ss + %H:%M:%S = 24h, zero padded, regional, regional (central europe) + + :return: tuple of strftime-compatible format, boolean padHour + """ + + fmt = None + nonPadHF = "%-H" if sys.platform != "win32" else "%#H" + nonPadIF = "%-I" if sys.platform != "win32" else "%#I" + + try: + fmt = rpc.Settings.GetSettingValue(setting="locale.timeformat")["value"] + except: + DEBUG_LOG("Couldn't get locale.timeformat setting, falling back to legacy detection") + + if fmt and fmt != "regional": + # HH = padded 24h + # hh = padded 12h + # H = unpadded 24h + # h = unpadded 12h + + # handle non-padded hour first + if fmt.startswith("H:") or fmt.startswith("h:"): + adjustedFmt = fmt.replace("H", nonPadHF).replace("h", nonPadIF) + else: + adjustedFmt = fmt.replace("HH", "%H").replace("hh", "%I") + + padHour = adjustedFmt.startswith("%H") or adjustedFmt.startswith("%I") + + else: + DEBUG_LOG("Regional time format detected, falling back to legacy detection of hour-padding") + # regional is weirdly always unpadded (unless the broken %H%H/%I%I notation is used + origFmt = xbmc.getRegion('time') + + adjustedFmt = origFmt.replace("%H%H", "%H").replace("%I%I", "%I") + + # Checking for %H%H or %I%I only would be the obvious way here to determine whether the hour should be padded, + # but the formats returned for regional settings with padding might only have %H in them. + # Use a fallback (unreliable). + currentTime = xbmc.getInfoLabel('System.Time') + padHour = "%H%H" in origFmt or "%I%I" in origFmt or (currentTime[0] == "0" and currentTime[1] != ":") + + # Kodi Omega on Android seems to have borked the regional format returned separately + # (not happening on Windows at least). Format returned can be "%H:mm:ss", which is incompatible with strftime; fix. + adjustedFmt = adjustedFmt.replace("mm", "%M").replace("ss", "%S").replace("xx", "%p") + adjustedFmtKN = adjustedFmt.replace("%M", "mm").replace("%H", "hh").replace("%I", "h").replace("%S", "ss").\ + replace("%p", "xx").replace(nonPadIF, "h").replace(nonPadHF, "h") + + return adjustedFmt, adjustedFmtKN, padHour + + +timeFormat, timeFormatKN, padHour = getTimeFormat() + + +def populateTimeFormat(): + global timeFormat, timeFormatKN, padHour + timeFormat, timeFormatKN, padHour = getTimeFormat() + + +def getPlatform(): + for key in [ + 'System.Platform.Android', + 'System.Platform.Linux.RaspberryPi', + 'System.Platform.Linux', + 'System.Platform.Windows', + 'System.Platform.OSX', + 'System.Platform.IOS', + 'System.Platform.Darwin', + 'System.Platform.ATV2' + ]: + if xbmc.getCondVisibility(key): + return key.rsplit('.', 1)[-1] + + +def getProgressImage(obj): + if not obj.get('viewOffset') or not obj.get('duration'): + return '' + pct = int((obj.viewOffset.asInt() / obj.duration.asFloat()) * 100) + pct = pct - pct % 2 # Round to even number - we have even numbered progress only + pct = max(pct, 2) + return 'script.plex/progress/{0}.png'.format(pct) + + +def backgroundFromArt(art, width=1920, height=1080, background=colors.noAlpha.Background): + if not art: + return + return art.asTranscodedImageURL( + width, height, + blur=advancedSettings.backgroundArtBlurAmount2, + opacity=advancedSettings.backgroundArtOpacityAmount2, + background=background + ) + + +def trackIsPlaying(track): + return xbmc.getCondVisibility('String.StartsWith(MusicPlayer.Comment,{0})'.format('PLEX-{0}:'.format(track.ratingKey))) + + +def addURLParams(url, params): + if '?' in url: + url += '&' + else: + url += '?' + url += six.moves.urllib.parse.urlencode(params) + return url + + +OSS_CHUNK = 65536 + + +def getOpenSubtitlesHash(size, url): + long_long_format = "q" # long long + byte_size = struct.calcsize(long_long_format) + hash_ = filesize = size + if filesize < OSS_CHUNK * 2: + return + + buffer = b'' + for _range in ((0, OSS_CHUNK), (filesize-OSS_CHUNK, filesize)): + try: + r = requests.get(url, headers={"range": "bytes={0}-{1}".format(*_range)}, stream=True) + except: + return '' + buffer += r.raw.read(OSS_CHUNK) + + for x in range(int(OSS_CHUNK / byte_size) * 2): + size = x * byte_size + (l_value,) = struct.unpack(long_long_format, buffer[size:size + byte_size]) + hash_ += l_value + hash_ = hash_ & 0xFFFFFFFFFFFFFFFF + + return format(hash_, "016x") + + +def garbageCollect(): + gc.collect(2) + + +def shutdown(): + global MONITOR, ADDON, T, _SHUTDOWN + _SHUTDOWN = True + del MONITOR + del T + del ADDON diff --git a/script.plexmod/lib/windows/__init__.py b/script.plexmod/lib/windows/__init__.py new file mode 100644 index 000000000..f96b69008 --- /dev/null +++ b/script.plexmod/lib/windows/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import +from . import kodigui +from lib import util + +kodigui.MONITOR = util.MONITOR diff --git a/script.plexmod/lib/windows/background.py b/script.plexmod/lib/windows/background.py new file mode 100644 index 000000000..8940d1c6b --- /dev/null +++ b/script.plexmod/lib/windows/background.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import +from . import kodigui +from lib import util + +util.setGlobalProperty('background.busy', '') +util.setGlobalProperty('background.shutdown', '') +util.setGlobalProperty('background.splash', '') + + +class BackgroundWindow(kodigui.BaseWindow): + xmlFile = 'script-plex-background.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + def __init__(self, *args, **kwargs): + kodigui.BaseWindow.__init__(self, *args, **kwargs) + self.function = kwargs.get('function') + + def onFirstInit(self): + self.function() + self.doClose() + + def onAction(self, action): + pass + + +def setBusy(on=True): + util.setGlobalProperty('background.busy', on and '1' or '') + + +def setSplash(on=True): + util.setGlobalProperty('background.splash', on and '1' or '') + + +def setShutdown(on=True): + util.setGlobalProperty('background.shutdown', on and '1' or '') + + +def killMonitor(): + kodigui.MONITOR = None diff --git a/script.plexmod/lib/windows/busy.py b/script.plexmod/lib/windows/busy.py new file mode 100644 index 000000000..1f128c5ec --- /dev/null +++ b/script.plexmod/lib/windows/busy.py @@ -0,0 +1,142 @@ +from __future__ import absolute_import +from . import kodigui +from lib import util +from kodi_six import xbmcgui +import threading + + +class BusyWindow(kodigui.BaseDialog): + xmlFile = 'script-plex-busy.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + +class BusyClosableWindow(BusyWindow): + ctx = None + + def onAction(self, action): + if action in (xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_STOP): + self.ctx.shouldClose = True + + +class BusyClosableMsgWindow(BusyClosableWindow): + xmlFile = 'script-plex-busy_msg.xml' + + def setMessage(self, msg): + self.setProperty("message", msg) + + +def dialog(msg='LOADING', condition=None, delay=True): + def methodWrap(func): + def inner(*args, **kwargs): + timer = None + w = BusyWindow.create(show=not delay) + + if delay: + timer = threading.Timer(0.5, w.show) + timer.start() + + try: + return func(*args, **kwargs) + finally: + if timer and timer.is_alive(): + timer.cancel() + timer.join() + del timer + w.doClose() + try: + del w + except: + pass + util.garbageCollect() + + if condition is not None: + return condition() and inner or func + return inner + + return methodWrap + + +def widthDialog(method, msg, *args, **kwargs): + return dialog(msg or 'LOADING')(method)(*args, **kwargs) + + +class BusyContext(object): + w = None + timer = None + shouldClose = False + window_cls = BusyWindow + delay = False + + def __enter__(self): + self.w = self.window_cls.create(show=not self.delay) + if self.delay: + self.timer = threading.Timer(0.5, lambda: self.w.show()) + self.w.ctx = self + return self + + def __exit__(self, exc_type, exc_value, tb): + if exc_type is not None: + util.ERROR() + + if self.timer and self.timer.is_alive(): + self.timer.cancel() + self.timer.join() + + self.w.doClose() + del self.w + self.w = None + util.garbageCollect() + return True + + +class BusyMsgContext(BusyContext): + window_cls = BusyClosableMsgWindow + + def setMessage(self, msg): + self.w.setMessage(msg) + + +class BusySignalContext(BusyMsgContext): + """ + Duplicates functionality of plex.CallbackEvent to a certain degree + """ + window_cls = BusyWindow + delay = True + + def __init__(self, context, signal, wait_max=10, delay=True): + self.wfSignal = signal + self.signalEmitter = context + self.waitMax = wait_max + self.ignoreSignal = False + self.signalReceived = False + self.delay = delay + + super(BusySignalContext, self).__init__() + + context.on(signal, self.onSignal) + + def onSignal(self, *args, **kwargs): + self.signalReceived = True + + def __exit__(self, exc_type, exc_val, exc_tb): + if exc_type is not None: + util.ERROR() + + try: + if not self.ignoreSignal: + waited = 0 + while not self.signalReceived and waited < self.waitMax: + util.MONITOR.waitForAbort(0.1) + waited += 0.1 + finally: + self.signalEmitter.off(self.wfSignal, self.onSignal) + + return super(BusySignalContext, self).__exit__(exc_type, exc_val, exc_tb) + + +class BusyClosableMsgContext(BusyMsgContext): + pass diff --git a/script.plexmod/lib/windows/currentplaylist.py b/script.plexmod/lib/windows/currentplaylist.py new file mode 100644 index 000000000..91dffd23a --- /dev/null +++ b/script.plexmod/lib/windows/currentplaylist.py @@ -0,0 +1,337 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from . import busy +from . import windowutils +from . import dropdown +from . import opener + +from lib import util +from lib import player +from lib import kodijsonrpc + +from lib.util import T + + +class CurrentPlaylistWindow(kodigui.ControlledWindow, windowutils.UtilMixin): + xmlFile = 'script-plex-music_current_playlist.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + LI_THUMB_DIM = (64, 64) + ALBUM_THUMB_DIM = util.scaleResolution(639, 639) + + PLAYLIST_LIST_ID = 101 + + SEEK_BUTTON_ID = 500 + SEEK_IMAGE_ID = 510 + + POSITION_IMAGE_ID = 201 + SELECTION_INDICATOR = 202 + SELECTION_BOX = 203 + + REPEAT_BUTTON_ID = 401 + SHUFFLE_BUTTON_ID = 402 + SHUFFLE_REMOTE_BUTTON_ID = 422 + SKIP_PREV_BUTTON_ID = 404 + SKIP_NEXT_BUTTON_ID = 409 + PLAYLIST_BUTTON_ID = 410 + OPTIONS_BUTTON_ID = 411 + STOP_BUTTON_ID = 407 + + SEEK_IMAGE_WIDTH = 819 + SELECTION_BOX_WIDTH = 101 + SELECTION_INDICATOR_Y = 896 + + BAR_X = 0 + BAR_Y = 921 + BAR_RIGHT = 819 + BAR_BOTTOM = 969 + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + self.selectedOffset = 0 + self.setDuration() + self.exitCommand = None + self.musicPlayerWinID = kwargs.get('winID') + + def doClose(self, **kwargs): + player.PLAYER.off('playback.started', self.onPlayBackStarted) + player.PLAYER.off('playlist.changed', self.playQueueCallback) + if player.PLAYER.handler.playQueue and player.PLAYER.handler.playQueue.isRemote: + player.PLAYER.handler.playQueue.off('change', self.updateProperties) + kodigui.ControlledWindow.doClose(self) + + def onFirstInit(self): + self.playlistListControl = kodigui.ManagedControlList(self, self.PLAYLIST_LIST_ID, 9) + self.setupSeekbar() + + self.fillPlaylist() + self.selectPlayingItem() + self.setFocusId(self.PLAYLIST_LIST_ID) + + self.updateProperties() + if player.PLAYER.handler.playQueue and player.PLAYER.handler.playQueue.isRemote: + player.PLAYER.handler.playQueue.on('change', self.updateProperties) + player.PLAYER.on('playlist.changed', self.playQueueCallback) + + def onAction(self, action): + try: + controlID = self.getFocusId() + if self.checkSeekActions(action, controlID): + return + except: + util.ERROR() + + kodigui.ControlledWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.PLAYLIST_LIST_ID: + self.playlistListClicked() + elif controlID == self.SEEK_BUTTON_ID: + self.seekButtonClicked() + elif controlID == self.SHUFFLE_BUTTON_ID: + self.fillPlaylist() + elif controlID == self.SHUFFLE_REMOTE_BUTTON_ID: + player.PLAYER.handler.playQueue.setShuffle() + elif controlID == self.REPEAT_BUTTON_ID: + self.repeatButtonClicked() + elif controlID == self.SKIP_PREV_BUTTON_ID: + self.skipPrevButtonClicked() + elif controlID == self.SKIP_NEXT_BUTTON_ID: + self.skipNextButtonClicked() + elif controlID == self.OPTIONS_BUTTON_ID: + self.optionsButtonClicked() + elif controlID == self.STOP_BUTTON_ID: + self.stopButtonClicked() + + def onFocus(self, controlID): + if controlID == self.SEEK_BUTTON_ID: + try: + if player.PLAYER.isPlaying(): + self.selectedOffset = player.PLAYER.getTime() * 1000 + else: + self.selectedOffset = 0 + except RuntimeError: + self.selectedOffset = 0 + + self.updateSelectedProgress() + + def onPlayBackStarted(self, **kwargs): + xbmc.sleep(2000) + self.setDuration() + + def repeatButtonClicked(self): + if player.PLAYER.handler.playQueue and player.PLAYER.handler.playQueue.isRemote: + if xbmc.getCondVisibility('Playlist.IsRepeatOne'): + xbmc.executebuiltin('PlayerControl(RepeatOff)') + elif player.PLAYER.handler.playQueue.isRepeat: + player.PLAYER.handler.playQueue.setRepeat(False) + player.PLAYER.handler.playQueue.refresh(force=True) + xbmc.executebuiltin('PlayerControl(RepeatOne)') + else: + player.PLAYER.handler.playQueue.setRepeat(True) + player.PLAYER.handler.playQueue.refresh(force=True) + else: + xbmc.executebuiltin('PlayerControl(Repeat)') + + def skipPrevButtonClicked(self): + if not xbmc.getCondVisibility('MusicPlayer.HasPrevious') and player.PLAYER.handler.playQueue and player.PLAYER.handler.playQueue.isRemote: + util.DEBUG_LOG('MusicPlayer: No previous in Kodi playlist - refreshing remote PQ') + if not player.PLAYER.handler.playQueue.refresh(force=True, wait=True): + return + + xbmc.executebuiltin('PlayerControl(Previous)') + + def skipNextButtonClicked(self): + if not xbmc.getCondVisibility('MusicPlayer.HasNext') and player.PLAYER.handler.playQueue and player.PLAYER.handler.playQueue.isRemote: + util.DEBUG_LOG('MusicPlayer: No next in Kodi playlist - refreshing remote PQ') + if not player.PLAYER.handler.playQueue.refresh(force=True, wait=True): + return + + xbmc.executebuiltin('PlayerControl(Next)') + + def optionsButtonClicked(self, pos=(670, 1060)): + track = player.PLAYER.currentTrack() + if not track: + return + + options = [] + + options.append({'key': 'to_album', 'display': T(32300, 'Go to Album')}) + options.append({'key': 'to_artist', 'display': T(32301, 'Go to Artist')}) + options.append({'key': 'to_section', 'display': T(32302, u'Go to {0}').format(track.getLibrarySectionTitle())}) + + choice = dropdown.showDropdown(options, pos, close_direction='down', pos_is_bottom=True, close_on_playback_ended=True) + if not choice: + return + + if choice['key'] == 'to_album': + self.processCommand(opener.open(track.parentRatingKey)) + elif choice['key'] == 'to_artist': + self.processCommand(opener.open(track.grandparentRatingKey)) + elif choice['key'] == 'to_section': + self.goHome(track.getLibrarySectionId()) + + def stopButtonClicked(self): + xbmc.executebuiltin('Action(Back, {})'.format(self.musicPlayerWinID)) + xbmc.sleep(500) + self.doClose() + + def selectPlayingItem(self): + for mli in self.playlistListControl: + if xbmc.getCondVisibility('String.StartsWith(MusicPlayer.Comment,{0})'.format(mli.dataSource['comment'].split(':', 1)[0])): + self.playlistListControl.selectItem(mli.pos()) + break + + def playQueueCallback(self, **kwargs): + self.setProperty('pq.isshuffled', player.PLAYER.handler.playQueue.isShuffled and '1' or '') + mli = self.playlistListControl.getSelectedItem() + pi = mli.dataSource + plexID = pi['comment'].split(':', 1)[0] + viewPos = self.playlistListControl.getViewPosition() + + self.fillPlaylist() + + for ni in self.playlistListControl: + if ni.dataSource['comment'].split(':', 1)[0] == plexID: + self.playlistListControl.selectItem(ni.pos()) + break + + xbmc.sleep(100) + + newViewPos = self.playlistListControl.getViewPosition() + if viewPos != newViewPos: + diff = newViewPos - viewPos + self.playlistListControl.shiftView(diff, True) + + def seekButtonClicked(self): + player.PLAYER.seekTime(self.selectedOffset / 1000.0) + + def playlistListClicked(self): + mli = self.playlistListControl.getSelectedItem() + if not mli: + return + player.PLAYER.playselected(mli.pos()) + + def createListItem(self, pi, idx): + label2 = '{0} / {1}'.format(pi['artist'][0], pi['album']) + plexInfo = pi['comment'] + mli = kodigui.ManagedListItem(pi['title'], label2, thumbnailImage=pi['thumbnail'], data_source=pi) + mli.setProperty('track.duration', util.simplifiedTimeDisplay(pi['duration'] * 1000)) + if plexInfo.startswith('PLEX-'): + mli.setProperty('track.ID', plexInfo.split('-', 1)[-1].split(':', 1)[0]) + mli.setProperty('track.number', str(pi['playcount'])) + else: + mli.setProperty('track.ID', '!NONE!') + mli.setProperty('track.number', str(pi['track'])) + mli.setProperty('playlist.position', str(idx)) + + mli.setProperty('file', pi['file']) + return mli + + @busy.dialog() + def fillPlaylist(self): + items = [] + idx = 1 + for pi in kodijsonrpc.rpc.PlayList.GetItems( + playlistid=xbmc.PLAYLIST_MUSIC, properties=['title', 'artist', 'album', 'track', 'thumbnail', 'duration', 'playcount', 'comment', 'file'] + )['items']: + mli = self.createListItem(pi, idx) + if mli: + mli.setProperty('index', str(idx)) + items.append(mli) + idx += 1 + + self.playlistListControl.reset() + self.playlistListControl.addItems(items) + + def setupSeekbar(self): + self.seekbarControl = self.getControl(self.SEEK_IMAGE_ID) + self.selectionIndicator = self.getControl(self.SELECTION_INDICATOR) + self.selectionBox = self.getControl(self.SELECTION_BOX) + self.selectionBoxHalf = self.SELECTION_BOX_WIDTH // 2 + self.selectionBoxMax = self.SEEK_IMAGE_WIDTH + player.PLAYER.on('playback.started', self.onPlayBackStarted) + + def checkSeekActions(self, action, controlID): + if controlID == self.SEEK_BUTTON_ID: + if action == xbmcgui.ACTION_MOUSE_MOVE: + self.seekMouse(action) + return True + elif action in (xbmcgui.ACTION_MOVE_RIGHT, xbmcgui.ACTION_NEXT_ITEM): + self.seekForward(3000) + return True + elif action in (xbmcgui.ACTION_MOVE_LEFT, xbmcgui.ACTION_PREV_ITEM): + self.seekBack(3000) + return True + # elif action == xbmcgui.ACTION_MOVE_UP: + # self.seekForward(60000) + # elif action == xbmcgui.ACTION_MOVE_DOWN: + # self.seekBack(60000) + elif action == xbmcgui.ACTION_STOP: + self.stopButtonClicked() + return True + + def setDuration(self): + try: + self.duration = player.PLAYER.getTotalTime() * 1000 + except RuntimeError: # Not playing + self.duration = 0 + + def seekForward(self, offset): + self.selectedOffset += offset + if self.selectedOffset > self.duration: + self.selectedOffset = self.duration + + self.updateSelectedProgress() + + def seekBack(self, offset): + self.selectedOffset -= offset + if self.selectedOffset < 0: + self.selectedOffset = 0 + + self.updateSelectedProgress() + + def seekMouse(self, action): + x = self.mouseXTrans(action.getAmount1()) + y = self.mouseYTrans(action.getAmount2()) + if not (self.BAR_Y <= y <= self.BAR_BOTTOM): + return + + if not (self.BAR_X <= x <= self.BAR_RIGHT): + return + + self.selectedOffset = int((x - self.BAR_X) / float(self.SEEK_IMAGE_WIDTH) * self.duration) + self.updateSelectedProgress() + + def updateSelectedProgress(self): + ratio = self.selectedOffset / float(self.duration) + w = int(ratio * self.SEEK_IMAGE_WIDTH) + self.seekbarControl.setWidth(w or 1) + + self.selectionIndicator.setPosition(w, self.SELECTION_INDICATOR_Y) + if w < self.selectionBoxHalf - 3: + self.selectionBox.setPosition((-self.selectionBoxHalf + (self.selectionBoxHalf - w)) - 3, 0) + elif w > self.selectionBoxMax: + self.selectionBox.setPosition((-self.SELECTION_BOX_WIDTH + (self.SEEK_IMAGE_WIDTH - w)) + 3, 0) + else: + self.selectionBox.setPosition(-self.selectionBoxHalf, 0) + self.setProperty('time.selection', util.simplifiedTimeDisplay(int(self.selectedOffset))) + + def updateProperties(self, **kwargs): + pq = player.PLAYER.handler.playQueue + if pq: + if pq.isRemote: + self.setProperty('pq.isRemote', '1') + self.setProperty('pq.hasnext', pq.allowSkipNext and '1' or '') + self.setProperty('pq.hasprev', pq.allowSkipPrev and '1' or '') + self.setProperty('pq.repeat', pq.isRepeat and '1' or '') + self.setProperty('pq.shuffled', pq.isShuffled and '1' or '') + else: + self.setProperties(('pq.isRemote', 'pq.hasnext', 'pq.hasprev', 'pq.repeat', 'pq.shuffled'), '') diff --git a/script.plexmod/lib/windows/dropdown.py b/script.plexmod/lib/windows/dropdown.py new file mode 100644 index 000000000..dc973b02b --- /dev/null +++ b/script.plexmod/lib/windows/dropdown.py @@ -0,0 +1,247 @@ +from __future__ import absolute_import +from kodi_six import xbmc, xbmcgui +from . import kodigui + +from lib import util + +SEPARATOR = None + + +class DropdownDialog(kodigui.BaseDialog): + xmlFile = 'script-plex-dropdown.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + GROUP_ID = 100 + OPTIONS_LIST_ID = 250 + + def __init__(self, *args, **kwargs): + kodigui.BaseDialog.__init__(self, *args, **kwargs) + self.options = kwargs.get('options') + self.pos = kwargs.get('pos') + self.lastSelectedItem = None + self.optionsList = None + self.roundRobin = kwargs.get('round_robin', True) + self.posIsBottom = kwargs.get('pos_is_bottom') + self.closeDirection = kwargs.get('close_direction') + self.setDropdownProp = kwargs.get('set_dropdown_prop', False) + self.withIndicator = kwargs.get('with_indicator', False) + self.suboptionCallback = kwargs.get('suboption_callback') + self.closeOnPlaybackEnded = kwargs.get('close_on_playback_ended', False) + self.closeOnlyWithBack = kwargs.get('close_only_with_back', False) + self.alignItems = kwargs.get('align_items', 'center') + self.optionsCallback = kwargs.get('options_callback', None) + self.header = kwargs.get('header') + self.selectIndex = kwargs.get('select_index') + self.onCloseCallback = kwargs.get('onclose_callback') + self.choice = None + + @property + def x(self): + return min(self.width - 360, self.pos[0]) + + @property + def y(self): + y = self.pos[1] + if self.posIsBottom: + y -= (len(self.options) * 66) + 80 + return y + + def onFirstInit(self): + self.setProperty('dropdown', self.setDropdownProp and '1' or '') + self.setProperty('header', self.header) + self.optionsList = kodigui.ManagedControlList(self, self.OPTIONS_LIST_ID, 8) + self.showOptions() + height = min(66 * 14, (len(self.options) * 66)) + 80 + self.getControl(100).setPosition(self.x, self.y) + + shadowControl = self.getControl(110) + if self.header: + shadowControl.setHeight(height + 86) + self.getControl(111).setHeight(height + 6) + else: + shadowControl.setHeight(height) + + self.setProperty('show', '1') + self.setProperty('close.direction', self.closeDirection) + if self.closeOnPlaybackEnded: + from lib import player + player.PLAYER.on('session.ended', self.playbackSessionEnded) + + def onAction(self, action): + try: + pass + except: + util.ERROR() + + if self.roundRobin and action in (xbmcgui.ACTION_MOVE_UP, xbmcgui.ACTION_MOVE_DOWN) and \ + self.getFocusId() == self.OPTIONS_LIST_ID: + to_pos = None + last_index = self.optionsList.size() - 1 + + if last_index > 0: + if action == xbmcgui.ACTION_MOVE_UP and self.lastSelectedItem in (0, None) \ + and self.optionsList.topHasFocus(): + to_pos = last_index + + elif action == xbmcgui.ACTION_MOVE_DOWN and self.lastSelectedItem == last_index \ + and self.optionsList.bottomHasFocus(): + to_pos = 0 + + if to_pos is not None: + self.optionsList.setSelectedItemByPos(to_pos) + self.lastSelectedItem = to_pos + return + + self.lastSelectedItem = self.optionsList.control.getSelectedPosition() + + kodigui.BaseDialog.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.OPTIONS_LIST_ID: + self.setChoice() + else: + self.doClose() + + def playbackSessionEnded(self, **kwargs): + self.doClose() + + def doClose(self): + if self.closeOnPlaybackEnded: + from lib import player + player.PLAYER.off('session.ended', self.playbackSessionEnded) + + self.optionsList.reset() + self.optionsList = None + + self.setProperty('show', '') + + super(DropdownDialog, self).doClose() + + def onClosed(self): + if self.onCloseCallback: + self.onCloseCallback(self.choice) + + def setChoice(self): + mli = self.optionsList.getSelectedItem() + if not mli: + return + + choice = self.options[self.optionsList.getSelectedPosition()] + + if choice.get('ignore'): + return + + if self.suboptionCallback: + options = self.suboptionCallback(choice) + if options: + sub = showDropdown(options, (self.x + 290, self.y + 10), close_direction='left', with_indicator=True) + if not sub: + return + + choice['sub'] = sub + + self.choice = choice + if self.optionsCallback: + self.optionsCallback(self.optionsList, mli) + + del mli + + if not self.closeOnlyWithBack: + self.doClose() + + def showOptions(self): + items = [] + options = [] + for oo in self.options: + if oo: + o = oo.copy() + item = kodigui.ManagedListItem(o['display'], thumbnailImage=o.get('indicator', ''), data_source=o) + item.setProperty('with.indicator', self.withIndicator and '1' or '') + item.setProperty('align', self.alignItems) + items.append(item) + options.append(o) + else: + if items: + items[-1].setProperty('separator', '1') + + self.options = options + + if len(items) > 1: + items[0].setProperty('first', '1') + items[-1].setProperty('last', '1') + elif items: + items[0].setProperty('only', '1') + + self.optionsList.reset() + self.optionsList.addItems(items) + + self.setFocusId(self.OPTIONS_LIST_ID) + + if self.selectIndex is not None: + self.optionsList.setSelectedItemByPos(self.selectIndex) + self.lastSelectedItem = self.selectIndex + + +class DropdownHeaderDialog(DropdownDialog): + xmlFile = 'script-plex-dropdown_header.xml' + + +def showDropdown( + options, pos=None, + pos_is_bottom=False, + close_direction='top', + set_dropdown_prop=True, + with_indicator=False, + suboption_callback=None, + close_on_playback_ended=False, + close_only_with_back=False, + align_items='center', + options_callback=None, + header=None, + select_index=None, + onclose_callback=None, +): + + if header: + pos = pos or (660, 400) + w = DropdownHeaderDialog.open( + options=options, pos=pos, + pos_is_bottom=pos_is_bottom, + close_direction=close_direction, + set_dropdown_prop=set_dropdown_prop, + with_indicator=with_indicator, + suboption_callback=suboption_callback, + close_on_playback_ended=close_on_playback_ended, + close_only_with_back=close_only_with_back, + align_items=align_items, + options_callback=options_callback, + header=header, + select_index=select_index, + onclose_callback=onclose_callback, + ) + else: + pos = pos or (810, 400) + w = DropdownDialog.open( + options=options, pos=pos, + pos_is_bottom=pos_is_bottom, + close_direction=close_direction, + set_dropdown_prop=set_dropdown_prop, + with_indicator=with_indicator, + suboption_callback=suboption_callback, + close_on_playback_ended=close_on_playback_ended, + close_only_with_back=close_only_with_back, + align_items=align_items, + options_callback=options_callback, + header=header, + select_index=select_index, + onclose_callback=onclose_callback, + ) + choice = w.choice + w = None + del w + util.garbageCollect() + return choice diff --git a/script.plexmod/lib/windows/episodes.py b/script.plexmod/lib/windows/episodes.py new file mode 100644 index 000000000..65af08754 --- /dev/null +++ b/script.plexmod/lib/windows/episodes.py @@ -0,0 +1,1202 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from lib import util +from lib import backgroundthread +from lib import metadata +from lib import player + +from plexnet import plexapp, playlist, plexplayer +from plexnet.util import INTERFACE + +from . import busy +from . import videoplayer +from . import dropdown +from . import windowutils +from . import opener +from . import search +from . import playersettings +from . import info +from . import optionsdialog +from . import preplayutils +from . import pagination +from . import playbacksettings + +from lib.util import T +from .mixins import SeasonsMixin + +VIDEO_RELOAD_KW = dict(includeExtras=1, includeExtrasCount=10, includeChapters=1) + + +class EpisodeReloadTask(backgroundthread.Task): + def setup(self, episode, callback, with_progress=False): + self.episode = episode + self.callback = callback + self.withProgress = with_progress + return self + + def run(self): + if self.isCanceled(): + return + + if not plexapp.SERVERMANAGER.selectedServer: + # Could happen during sign-out for instance + return + + try: + self.episode.reload(checkFiles=1, includeChapters=1, fromMediaChoice=self.episode.mediaChoice is not None) + if self.isCanceled(): + return + self.callback(self, self.episode, with_progress=self.withProgress) + except: + util.ERROR() + + +class EpisodesPaginator(pagination.MCLPaginator): + thumbFallback = 'script.plex/thumb_fallbacks/show.png' + _currentEpisode = None + + def reset(self): + super(EpisodesPaginator, self).reset() + self._currentEpisode = None + + def getData(self, offset, amount): + return (self.parentWindow.season or self.parentWindow.show_).episodes(offset=offset, limit=amount) + + def createListItem(self, data): + mli = super(EpisodesPaginator, self).createListItem(data) + self.parentWindow.setItemInfo(data, mli) + return mli + + def prepareListItem(self, data, mli): + if not mli.dataSource.isWatched: + mli.setProperty('unwatched.count', str(mli.dataSource.unViewedLeafCount)) + mli.setProperty('progress', util.getProgressImage(mli.dataSource)) + + def setEpisode(self, ep): + self._currentEpisode = ep + + @property + def initialPage(self): + episode = self.parentWindow.episode + offset = 0 + amount = self.initialPageSize + if episode: + self.setEpisode(episode) + # try cutting the query short while not querying all episodes, to find the slice with the currently + # selected episode in it + episodes = [] + _amount = self.initialPageSize + self.orphans + epSeasonIndex = int(episode.index or 1) - 1 # .index is 1-based + if _amount < self.leafCount: + _amount = self.initialPageSize * 2 + notFound = False + while episode not in episodes: + offset = int(max(0, epSeasonIndex - _amount / 2)) + episodes = self.getData(offset, int(_amount)) + + if _amount >= self.leafCount: + # ep not found? + notFound = True + break + + # in case the episode wasn't found inside the slice, increase the slice's size + _amount *= 2 + + if notFound: + # search conservatively + util.DEBUG_LOG("Episode not found with intelligent index-based search, re-trying conservatively") + _amount = self.initialPageSize * 2 + offset = 0 + episodes = self.getData(offset, int(_amount)) + while episode not in episodes: + offset = _amount + episodes = self.getData(offset, int(_amount)) + + if _amount >= self.leafCount: + break + + _amount *= 2 + else: + # shortcut for short seasons + episodes = self.getData(offset, int(_amount)) + + else: + return super(EpisodesPaginator, self).initialPage + + episodeFound = episode and episode in episodes + if episodeFound: + if self.initialPageSize + self.orphans < self.leafCount: + # slice around the episode + # Clamp the left side dynamically based on the item index and how many items are left in the season. + # The episodes list might be longer than our limit, because the season doesn't necessarily have all the + # episodes in it and we're basing the initial load on the current episode's index, which is the actual + # index of the episode in the season, not what's physically there. To find the episode, we're + # dynamically increasing the window size above. Re-clamp to :amount:, adding slack to both sides if + # the remaining episodes would fit inside half of :amount:. + tmpEpIdx = episodes.index(episode) + leftBoundary = self.initialPageSize - len(episodes[tmpEpIdx:tmpEpIdx + self.orphans]) + + left = max(tmpEpIdx - leftBoundary, 0) + offset += left + epsLeft = self.leafCount - offset + # avoid short pages on the right end + if epsLeft <= self.initialPageSize + self.orphans: + amount = epsLeft + + # avoid short pages on the left end + if offset < self.orphans and amount + offset < self.initialPageSize + self.orphans: + amount += offset + left = 0 + offset = 0 + + episodes = episodes[left:left + amount] + + self.offset = offset + self._currentAmount = len(episodes) + + return episodes + + def selectItem(self, amount, more_left=False, more_right=False, items=None): + if not super(EpisodesPaginator, self).selectItem(amount, more_left): + if (self._currentEpisode and items) and self._currentEpisode in items: + self.control.selectItem(items.index(self._currentEpisode) + (1 if more_left else 0)) + + +class RelatedPaginator(pagination.BaseRelatedPaginator): + def getData(self, offset, amount): + return self.parentWindow.show_.getRelated(offset=offset, limit=amount) + + +class EpisodesWindow(kodigui.ControlledWindow, windowutils.UtilMixin, SeasonsMixin, + playbacksettings.PlaybackSettingsMixin): + xmlFile = 'script-plex-episodes.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + THUMB_AR16X9_DIM = util.scaleResolution(657, 393) + POSTER_DIM = util.scaleResolution(420, 630) + RELATED_DIM = util.scaleResolution(268, 397) + EXTRA_DIM = util.scaleResolution(329, 185) + ROLES_DIM = util.scaleResolution(334, 334) + + LIST_OPTIONS_BUTTON_ID = 111 + + EPISODE_LIST_ID = 400 + SEASONS_LIST_ID = 401 + EXTRA_LIST_ID = 402 + RELATED_LIST_ID = 403 + ROLES_LIST_ID = 404 + + OPTIONS_GROUP_ID = 200 + + HOME_BUTTON_ID = 201 + SEARCH_BUTTON_ID = 202 + PLAYER_STATUS_BUTTON_ID = 204 + + PROGRESS_IMAGE_ID = 250 + + PLAY_BUTTON_ID = 301 + SHUFFLE_BUTTON_ID = 302 + OPTIONS_BUTTON_ID = 303 + INFO_BUTTON_ID = 304 + SETTINGS_BUTTON_ID = 305 + MEDIA_BUTTON_ID = 307 + + SEASONS_CONTROL_ATTR = "seasonsListControl" + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + windowutils.UtilMixin.__init__(self) + self.episode = None + self.reset(kwargs.get('episode'), kwargs.get('season'), kwargs.get('show')) + self.initialEpisode = kwargs.get('episode') + self.parentList = kwargs.get('parentList') + self.lastItem = None + self.lastFocusID = None + self.lastNonOptionsFocusID = None + self.episodesPaginator = None + self.relatedPaginator = None + self.cameFrom = kwargs.get('came_from') + self.tasks = backgroundthread.Tasks() + self.initialized = False + self.closing = False + self._reloadVideos = [] + + def reset(self, episode, season=None, show=None): + self.episode = episode + self.season = season if season is not None else self.episode.season() + try: + self.show_ = show or (self.episode or self.season).show().reload(includeExtras=1, includeExtrasCount=10) + except IndexError: + raise util.NoDataException + + self.parentList = None + self.seasons = None + self._reloadVideos = [] + #self.initialized = False + + def doClose(self): + self.closing = True + self.episodesPaginator = None + self.relatedPaginator = None + kodigui.ControlledWindow.doClose(self) + if self.tasks: + self.tasks.cancel() + self.tasks = None + try: + player.PLAYER.off('new.video', self.onNewVideo) + except KeyError: + pass + + @busy.dialog() + def _onFirstInit(self): + self.episodeListControl = kodigui.ManagedControlList(self, self.EPISODE_LIST_ID, 5) + self.progressImageControl = self.getControl(self.PROGRESS_IMAGE_ID) + + self.extraListControl = kodigui.ManagedControlList(self, self.EXTRA_LIST_ID, 5) + self.relatedListControl = kodigui.ManagedControlList(self, self.RELATED_LIST_ID, 5) + self.rolesListControl = kodigui.ManagedControlList(self, self.ROLES_LIST_ID, 5) + self.seasonsListControl = kodigui.ManagedControlList(self, self.SEASONS_LIST_ID, 5) + + self._setup() + self.postSetup() + + def doAutoPlay(self): + # First reload the video to get all the other info + self.initialEpisode.reload(checkFiles=1, **VIDEO_RELOAD_KW) + return self.playButtonClicked(force_episode=self.initialEpisode) + + def onFirstInit(self): + self._onFirstInit() + + if self.show_ and self.show_.theme and not util.getSetting("slow_connection", False) and \ + (not self.cameFrom or self.cameFrom != self.show_.ratingKey): + volume = self.show_.settings.getThemeMusicValue() + if volume > 0: + player.PLAYER.playBackgroundMusic(self.show_.theme.asURL(True), volume, + self.show_.ratingKey) + + @busy.dialog() + def onReInit(self): + if not self.tasks: + self.tasks = backgroundthread.Tasks() + + try: + self.selectEpisode() + except AttributeError: + raise util.NoDataException + + mli = self.episodeListControl.getSelectedItem() + if not mli or not self.episodesPaginator: + return + + reloadItems = [mli] + for v in self._reloadVideos: + for m in self.episodeListControl: + if m.dataSource == v: + reloadItems.append(m) + self.episodesPaginator.prepareListItem(v, m) + + # re-set current item's progress to a loading state + if util.getSetting("slow_connection", False): + self.progressImageControl.setWidth(1) + mli.setProperty('remainingTime', T(32914, "Loading")) + + self.reloadItems(items=reloadItems, with_progress=True) + self.episodesPaginator.setEpisode(self._reloadVideos and self._reloadVideos[-1] or mli) + self._reloadVideos = [] + self.fillRelated() + + def postSetup(self, from_select_episode=False): + self.selectEpisode(from_select_episode=from_select_episode) + self.checkForHeaderFocus(xbmcgui.ACTION_MOVE_DOWN) + self.setFocusId(self.PLAY_BUTTON_ID) + self.initialized = True + + @busy.dialog() + def setup(self): + self._setup() + + def _setup(self, from_select_episode=False): + player.PLAYER.on('new.video', self.onNewVideo) + (self.season or self.show_).reload(checkFiles=1, **VIDEO_RELOAD_KW) + + if not from_select_episode or not self.episodesPaginator: + self.episodesPaginator = EpisodesPaginator(self.episodeListControl, + leaf_count=int(self.season.leafCount) if self.season else 0, + parent_window=self) + + if not from_select_episode or not self.episodesPaginator: + self.relatedPaginator = RelatedPaginator(self.relatedListControl, leaf_count=int(self.show_.relatedCount), + parent_window=self) + + self.updateProperties() + self.setBoolProperty("initialized", True) + self.fillEpisodes() + hasSeasons = self.fillSeasons(self.show_, seasonsFilter=lambda x: len(x) > 1, selectSeason=self.season) + hasPrev = self.fillExtras(hasSeasons) + + if not hasPrev and hasSeasons: + hasPrev = True + hasPrev = self.fillRelated(hasPrev) + self.fillRoles(hasPrev) + + def selectEpisode(self, from_select_episode=False): + if not self.episode: + return + + for mli in self.episodeListControl: + if mli.dataSource == self.episode: + self.episodeListControl.selectItem(mli.pos()) + self.episodesPaginator.setEpisode(self.episode) + break + else: + if not from_select_episode: + self.reset(self.episode) + self._setup(from_select_episode=True) + self.postSetup(from_select_episode=True) + + self.episode = None + + def onAction(self, action): + try: + controlID = self.getFocusId() + + if not controlID and self.lastFocusID and not action == xbmcgui.ACTION_MOUSE_MOVE: + self.setFocusId(self.lastFocusID) + + if action == xbmcgui.ACTION_LAST_PAGE and xbmc.getCondVisibility('ControlGroup(300).HasFocus(0)'): + next(self) + elif action == xbmcgui.ACTION_NEXT_ITEM: + next(self) + elif action == xbmcgui.ACTION_FIRST_PAGE and xbmc.getCondVisibility('ControlGroup(300).HasFocus(0)'): + self.prev() + elif action == xbmcgui.ACTION_PREV_ITEM: + self.prev() + + if action == xbmcgui.ACTION_MOVE_UP and controlID in (self.EPISODE_LIST_ID, self.SEASONS_LIST_ID): + self.updateBackgroundFrom((self.show_ or self.season.show())) + + if controlID == self.EPISODE_LIST_ID: + if self.checkForHeaderFocus(action): + return + + elif controlID == self.RELATED_LIST_ID: + if self.relatedPaginator.boundaryHit: + self.relatedPaginator.paginate() + return + elif action in (xbmcgui.ACTION_MOVE_LEFT, xbmcgui.ACTION_MOVE_RIGHT): + self.updateBackgroundFrom(self.relatedListControl.getSelectedItem().dataSource) + + if controlID == self.LIST_OPTIONS_BUTTON_ID and self.checkOptionsAction(action): + return + elif action == xbmcgui.ACTION_CONTEXT_MENU: + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + self.lastNonOptionsFocusID = self.lastFocusID + self.setFocusId(self.OPTIONS_GROUP_ID) + return + else: + if self.lastNonOptionsFocusID: + self.setFocusId(self.lastNonOptionsFocusID) + self.lastNonOptionsFocusID = None + return + + elif action == xbmcgui.ACTION_NAV_BACK: + if (not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format( + self.OPTIONS_GROUP_ID)) or not controlID) and \ + not util.advancedSettings.fastBack: + if self.getProperty('on.extras'): + self.setFocusId(self.OPTIONS_GROUP_ID) + return + + if action in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_PREVIOUS_MENU): + self.doClose() + except: + util.ERROR() + + kodigui.ControlledWindow.onAction(self, action) + + def onNewVideo(self, video=None, **kwargs): + if not video: + return + + if not video.type == 'episode': + return + + util.DEBUG_LOG('Updating selected episode: {0}'.format(video)) + self.episode = video + self._reloadVideos.append(video) + + return True + + def checkOptionsAction(self, action): + if action == xbmcgui.ACTION_MOVE_UP: + mli = self.episodeListControl.getSelectedItem() + if not mli or mli.getProperty("is.boundary"): + return False + pos = mli.pos() - 1 + if self.episodeListControl.positionIsValid(pos): + self.setFocusId(self.EPISODE_LIST_ID) + self.episodeListControl.selectItem(pos) + return True + elif action == xbmcgui.ACTION_MOVE_DOWN: + mli = self.episodeListControl.getSelectedItem() + if not mli or mli.getProperty("is.boundary"): + return False + pos = mli.pos() + 1 + if self.episodeListControl.positionIsValid(pos): + self.setFocusId(self.EPISODE_LIST_ID) + self.episodeListControl.selectItem(pos) + return True + + return False + + def onClick(self, controlID): + if controlID == self.HOME_BUTTON_ID: + self.goHome() + elif controlID == self.EPISODE_LIST_ID: + self.episodeListClicked() + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif controlID == self.PLAY_BUTTON_ID: + self.playButtonClicked() + elif controlID == self.SHUFFLE_BUTTON_ID: + self.shuffleButtonClicked() + elif controlID == self.OPTIONS_BUTTON_ID: + self.optionsButtonClicked() + elif controlID == self.SETTINGS_BUTTON_ID: + self.settingsButtonClicked() + elif controlID == self.MEDIA_BUTTON_ID: + self.mediaButtonClicked() + elif controlID == self.INFO_BUTTON_ID: + self.infoButtonClicked() + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + elif controlID == self.SEASONS_LIST_ID: + mli = self.seasonsListControl.getSelectedItem() + if not mli: + return + item = mli.dataSource + if item != self.season: + self.openItem(self.seasonsListControl, came_from=self.season.parentRatingKey) + else: + self.setFocusId(self.EPISODE_LIST_ID) + elif controlID == self.EXTRA_LIST_ID: + self.openItem(self.extraListControl) + elif controlID == self.RELATED_LIST_ID: + self.openItem(self.relatedListControl) + elif controlID == self.ROLES_LIST_ID: + self.roleClicked() + + def onFocus(self, controlID): + self.lastFocusID = controlID + + if 399 < controlID < 500: + self.setProperty('hub.focus', str(controlID - 400)) + if controlID == self.RELATED_LIST_ID: + self.updateBackgroundFrom(self.relatedListControl.getSelectedItem().dataSource) + if xbmc.getCondVisibility('ControlGroup(50).HasFocus(0) + ControlGroup(300).HasFocus(0)'): + self.setProperty('on.extras', '') + elif xbmc.getCondVisibility('ControlGroup(50).HasFocus(0) + !ControlGroup(300).HasFocus(0)'): + self.setProperty('on.extras', '1') + + if player.PLAYER.bgmPlaying and player.PLAYER.handler.currentlyPlaying != self.season.show().ratingKey: + player.PLAYER.stopAndWait() + + def openItem(self, control=None, item=None, came_from=None): + if not item: + mli = control.getSelectedItem() + if not mli: + return + item = mli.dataSource + + self.processCommand(opener.open(item, came_from=came_from)) + + def roleClicked(self): + mli = self.rolesListControl.getSelectedItem() + if not mli: + return + + sectionRoles = busy.widthDialog(mli.dataSource.sectionRoles, '') + + if not sectionRoles: + util.DEBUG_LOG('No sections found for actor') + return + + if len(sectionRoles) > 1: + x, y = self.getRoleItemDDPosition() + + options = [{'role': r, 'display': r.reasonTitle} for r in sectionRoles] + choice = dropdown.showDropdown(options, (x, y), pos_is_bottom=True, close_direction='bottom') + + if not choice: + return + + role = choice['role'] + else: + role = sectionRoles[0] + + self.processCommand(opener.open(role)) + + def getRoleItemDDPosition(self): + y = 980 + if xbmc.getCondVisibility('Control.IsVisible(500)'): + y += 360 + if xbmc.getCondVisibility('Control.IsVisible(501)'): + y += 520 + if xbmc.getCondVisibility('Control.IsVisible(502)'): + y += 520 + if xbmc.getCondVisibility('!String.IsEmpty(Window.Property(on.extras))'): + y -= 125 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),0) + Control.IsVisible(500)'): + y -= 500 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),1) + Control.IsVisible(501)'): + y -= 500 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),1) + Control.IsVisible(502)'): + y -= 500 + + focus = int(xbmc.getInfoLabel('Container(403).Position')) + + x = ((focus + 1) * 304) - 100 + return x, y + + def getSeasons(self): + if not self.seasons: + self.seasons = self.show_.seasons() + + if not self.seasons: + return False + + return True + + def next(self): + if not self._next(): + return + self.setup() + + __next__ = next + + @busy.dialog() + def _next(self): + if self.parentList: + mli = self.parentList.getListItemByDataSource(self.season) + if not mli: + return False + + pos = mli.pos() + 1 + if not self.parentList.positionIsValid(pos): + pos = 0 + + self.season = self.parentList.getListItem(pos).dataSource + else: + if not self.getSeasons(): + return False + + if self.season not in self.seasons: + return False + + pos = self.seasons.index(self.season) + pos += 1 + if pos >= len(self.seasons): + pos = 0 + + self.season = self.seasons[pos] + + return True + + def prev(self): + if not self._prev(): + return + self.setup() + + @busy.dialog() + def _prev(self): + if self.parentList: + mli = self.parentList.getListItemByDataSource(self.season) + if not mli: + return False + + pos = mli.pos() - 1 + if pos < 0: + pos = self.parentList.size() - 1 + + self.season = self.parentList.getListItem(pos).dataSource + else: + if not self.getSeasons(): + return False + + if self.season not in self.seasons: + return False + + pos = self.seasons.index(self.season) + pos -= 1 + if pos < 0: + pos = len(self.seasons) - 1 + + self.season = self.seasons[pos] + + return True + + def searchButtonClicked(self): + section_id = self.show_.getLibrarySectionId() + self.processCommand(search.dialog(self, section_id=section_id or None)) + + def playButtonClicked(self, shuffle=False, force_episode=None): + if shuffle: + seasonOrShow = self.season or self.show_ + items = seasonOrShow.all() + pl = playlist.LocalPlaylist(items, seasonOrShow.getServer()) + + pl.shuffle(shuffle, first=True) + videoplayer.play(play_queue=pl) + return True + + else: + return self.episodeListClicked(force_episode=force_episode) + + def shuffleButtonClicked(self): + self.playButtonClicked(shuffle=True) + + def settingsButtonClicked(self): + mli = self.episodeListControl.getSelectedItem() + if not mli or mli.getProperty("is.boundary"): + return + + episode = mli.dataSource + + if not episode.mediaChoice: + playerObject = plexplayer.PlexPlayer(episode) + playerObject.build() + playersettings.showDialog(video=episode, non_playback=True) + self.setItemAudioAndSubtitleInfo(episode, mli) + + def infoButtonClicked(self): + mli = self.episodeListControl.getSelectedItem() + if not mli or mli.getProperty("is.boundary"): + return + + episode = mli.dataSource + + if episode.index: + subtitle = u'{0} {1} {2} {3}'.format(T(32303, 'Season'), episode.parentIndex, T(32304, 'Episode'), episode.index) + else: + subtitle = episode.originallyAvailableAt.asDatetime('%B %d, %Y') + + opener.handleOpen( + info.InfoWindow, + title=episode.title, + sub_title=subtitle, + thumb=episode.thumb, + thumb_fallback='script.plex/thumb_fallbacks/show.png', + info=episode.summary, + background=self.getProperty('background'), + is_16x9=True, + video=episode + ) + + def episodeListClicked(self, force_episode=None): + if not force_episode: + mli = self.episodeListControl.getSelectedItem() + if not mli or mli.getProperty("is.boundary"): + return + + episode = mli.dataSource + else: + episode = force_episode + + if not episode.available(): + util.messageDialog(T(32312, 'unavailable'), T(32332, 'This item is currently unavailable.')) + return + + resume = False + if episode.viewOffset.asInt(): + choice = dropdown.showDropdown( + options=[ + {'key': 'resume', 'display': T(32429, 'Resume from {0}').format(util.timeDisplay(episode.viewOffset.asInt()).lstrip('0').lstrip(':'))}, + {'key': 'play', 'display': T(32317, 'Play from beginning')} + ], + pos=(660, 441), + close_direction='none', + set_dropdown_prop=False, + header=T(32314, 'In Progress') + ) + + if not choice: + return + + if choice['key'] == 'resume': + resume = True + if util.advancedSettings.dialogFlickerFix: + xbmc.sleep(750) + + self._reloadVideos.append(episode) + + pl = playlist.LocalPlaylist(self.show_.all(), self.show_.getServer()) + try: + if len(pl): # Don't use playlist if it's only this video + pl.setCurrent(episode) + self.processCommand(videoplayer.play(play_queue=pl, resume=resume)) + return True + + self.processCommand(videoplayer.play(video=episode, resume=resume)) + return True + except util.NoDataException: + util.ERROR("No data - disconnected?", notify=True, time_ms=5000) + self.doClose() + + def optionsButtonClicked(self, from_item=False): + options = [] + + mli = self.episodeListControl.getSelectedItem() + + if mli and not mli.getProperty("is.boundary"): + inProgress = mli.dataSource.viewOffset.asInt() + if not mli.dataSource.isWatched or inProgress: + options.append({'key': 'mark_watched', 'display': T(32319, 'Mark Played')}) + if mli.dataSource.isWatched or inProgress: + options.append({'key': 'mark_unwatched', 'display': T(32318, 'Mark Unplayed')}) + + # if True: + # options.append({'key': 'add_to_playlist', 'display': '[COLOR FF808080]Add To Playlist[/COLOR]'}) + + if xbmc.getCondVisibility('Player.HasAudio + MusicPlayer.HasNext'): + options.append({'key': 'play_next', 'display': T(32325, 'Play Next')}) + + if self.season: + if self.season.isWatched: + options.append({'key': 'mark_season_unwatched', 'display': T(32320, 'Mark Season Unplayed')}) + else: + options.append({'key': 'mark_season_watched', 'display': T(32321, 'Mark Season Played')}) + + if self.show_: + if options: + options.append(dropdown.SEPARATOR) + + options.append({'key': 'playback_settings', 'display': T(32925, 'Playback Settings')}) + options.append(dropdown.SEPARATOR) + + if mli.dataSource.server.allowsMediaDeletion: + options.append({'key': 'delete', 'display': T(32322, 'Delete')}) + + # if xbmc.getCondVisibility('Player.HasAudio') and self.section.TYPE == 'artist': + # options.append({'key': 'add_to_queue', 'display': 'Add To Queue'}) + + if options: + options.append(dropdown.SEPARATOR) + + options.append({'key': 'to_show', 'display': T(32323, 'Go To Show')}) + options.append({'key': 'to_section', 'display': T(32324, u'Go to {0}').format( + self.show_.getLibrarySectionTitle())}) + + pos = (500, 620) + bottom = False + setDropdownProp = False + if from_item: + viewPos = self.episodeListControl.getViewPosition() + if viewPos > 6: + pos = (1490, 312 + (viewPos * 100)) + bottom = True + else: + pos = (1490, 167 + (viewPos * 100)) + bottom = False + setDropdownProp = True + + choice = dropdown.showDropdown(options, pos, pos_is_bottom=bottom, close_direction='left', + set_dropdown_prop=setDropdownProp) + if not choice: + return + + if choice['key'] == 'play_next': + xbmc.executebuiltin('PlayerControl(Next)') + elif choice['key'] == 'mark_watched': + mli.dataSource.markWatched() + self.updateItems(mli) + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'mark_unwatched': + mli.dataSource.markUnwatched() + self.updateItems(mli) + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'mark_season_watched': + self.season.markWatched() + self.updateItems() + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'mark_season_unwatched': + self.season.markUnwatched() + self.updateItems() + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'to_show': + if util.advancedSettings.dialogFlickerFix: + xbmc.sleep(750) + self.processCommand(opener.open( + self.season.parentRatingKey, + came_from=self.season.parentRatingKey) + ) + elif choice['key'] == 'to_section': + self.goHome(self.show_.getLibrarySectionId()) + elif choice['key'] == 'delete': + self.delete() + elif choice['key'] == 'playback_settings': + self.playbackSettings(self.show_, pos, bottom) + + def mediaButtonClicked(self): + options = [] + mli = self.episodeListControl.getSelectedItem() + ds = mli.dataSource + for media in ds.media: + ind = '' + if ds.mediaChoice and media.id == ds.mediaChoice.media.id: + ind = 'script.plex/home/device/check.png' + options.append({'key': media, 'display': media.versionString(), 'indicator': ind}) + choice = dropdown.showDropdown(options, header=T(32450, 'Choose Version'), with_indicator=True) + if not choice: + return False + + for media in ds.media: + media.set('selected', '') + + ds.setMediaChoice(choice['key']) + choice['key'].set('selected', 1) + self.setPostReloadItemInfo(ds, mli) + + def delete(self): + button = optionsdialog.show( + T(32326, 'Really delete?'), + T(32327, 'Are you sure you really want to delete this media?'), + T(32328, 'Yes'), + T(32329, 'No') + ) + + if button != 0: + return + + if not self._delete(): + util.messageDialog(T(32330, 'Message'), T(32331, 'There was a problem while attempting to delete the media.')) + + @busy.dialog() + def _delete(self): + mli = self.episodeListControl.getSelectedItem() + if not mli or mli.getProperty("is.boundary"): + return + + video = mli.dataSource + success = video.delete() + util.LOG('Media DELETE: {0} - {1}'.format(video, success and 'SUCCESS' or 'FAILED')) + if success: + self.episodeListControl.removeItem(mli.pos()) + if not self.episodeListControl.size(): + self.doClose() + else: + (self.season or self.show_).reload() + return success + + def checkForHeaderFocus(self, action): + # don't continue if we're still waiting for tasks + if self.tasks or not self.episodesPaginator: + if self.tasks: + util.DEBUG_LOG("Episodes: Moving too fast through paginator, throttling.") + return + + if self.episodesPaginator.boundaryHit: + items = self.episodesPaginator.paginate() + self.reloadItems(items) + return True + + mli = self.episodeListControl.getSelectedItem() + if not mli or mli.getProperty("is.boundary"): + return + + lastItem = self.lastItem + + if action in (xbmcgui.ACTION_MOVE_RIGHT, xbmcgui.ACTION_MOVE_LEFT) and lastItem: + items = self.episodesPaginator.wrap(mli, lastItem, action) + xbmc.sleep(100) + mli = self.episodeListControl.getSelectedItem() + if items: + self.reloadItems(items) + return True + + if mli != self.lastItem and not mli.getProperty("is.boundary"): + self.lastItem = mli + self.setProgress(mli) + + if action in (xbmcgui.ACTION_MOVE_UP, xbmcgui.ACTION_PAGE_UP): + if mli.getProperty('is.header'): + xbmc.executebuiltin('Action(up)') + if action in (xbmcgui.ACTION_MOVE_DOWN, xbmcgui.ACTION_PAGE_DOWN, xbmcgui.ACTION_MOVE_LEFT, xbmcgui.ACTION_MOVE_RIGHT): + if mli.getProperty('is.header'): + xbmc.executebuiltin('Action(down)') + + def updateProperties(self): + showTitle = self.show_ and self.show_.title or '' + + self.updateBackgroundFrom(self.show_ or self.season.show()) + self.setProperty('season.thumb', (self.season or self.show_).thumb.asTranscodedImageURL(*self.POSTER_DIM)) + self.setProperty('show.title', showTitle) + self.setProperty('season.title', (self.season or self.show_).title) + + if self.season: + self.setProperty('episodes.header', u'{0} \u2022 {1} {2}'.format(showTitle, T(32303, 'Season'), self.season.index)) + self.setProperty('extras.header', u'{0} \u2022 {1} {2}'.format(T(32305, 'Extras'), T(32303, 'Season'), self.season.index)) + else: + self.setProperty('episodes.header', u'Episodes') + self.setProperty('extras.header', u'Extras') + + self.setProperty('seasons.header', + u'{0} \u2022 {1}'.format(showTitle, T(32942, 'Seasons'))) + self.setProperty('related.header', T(32306, 'Related Shows')) + self.genre = self.show_.genres() and self.show_.genres()[0].tag or '' + + @busy.dialog() + def updateItems(self, item=None): + if item: + item.setProperty('unwatched', not item.dataSource.isWatched and '1' or '') + self.setProgress(item) + item.setProperty('progress', util.getProgressImage(item.dataSource)) + (self.season or self.show_).reload() + else: + self.fillEpisodes(update=True) + + if self.episode: + self.episode.reload() + + def setItemInfo(self, video, mli): + # video.reload(checkFiles=1) + mli.setProperty('background', util.backgroundFromArt(video.art, width=self.width, height=self.height)) + mli.setProperty('title', video.title) + mli.setProperty('show.title', video.grandparentTitle or (self.show_.title if self.show_ else '')) + mli.setProperty('duration', util.durationToText(video.duration.asInt())) + mli.setProperty('summary', video.summary.strip().replace('\t', ' ')) + mli.setProperty('video.rendering', video.videoCodecRendering) + + if video.index: + mli.setProperty('season', u'{0} {1}'.format(T(32303, 'Season'), video.parentIndex)) + mli.setProperty('episode', u'{0} {1}'.format(T(32304, 'Episode'), video.index)) + else: + mli.setProperty('season', '') + mli.setProperty('episode', '') + + mli.setProperty('date', util.cleanLeadingZeros(video.originallyAvailableAt.asDatetime('%B %d, %Y'))) + + # mli.setProperty('related.header', 'Related Shows') + mli.setProperty('year', video.year) + mli.setProperty('content.rating', video.contentRating.split('/', 1)[-1]) + mli.setProperty('genre', self.genre) + + if video.get('userRating'): + stars = str(int(round((video.userRating.asFloat() / 10) * 5))) + mli.setProperty('rating.stars', stars) + # elif video.rating: + # stars = str(int(round((video.rating.asFloat() / 10) * 5))) + # mli.setProperty('rating.stars', stars) + + if video.get('ratingImage'): + rating = video.rating + audienceRating = video.audienceRating + if video.ratingImage.startswith('rottentomatoes:'): + rating = '{0}%'.format(int(rating.asFloat() * 10)) + if audienceRating: + audienceRating = '{0}%'.format(int(audienceRating.asFloat() * 10)) + + mli.setProperty('rating', rating) + mli.setProperty('rating.image', 'script.plex/ratings/{0}.png'.format(video.ratingImage.replace('://', '/'))) + if video.get('audienceRatingImage'): + mli.setProperty('rating2', audienceRating) + mli.setProperty('rating2.image', 'script.plex/ratings/{0}.png'.format(video.audienceRatingImage.replace('://', '/'))) + else: + mli.setProperty('rating', video.rating) + + def setPostReloadItemInfo(self, video, mli): + self.setItemAudioAndSubtitleInfo(video, mli) + mli.setProperty('unwatched', not video.isWatched and '1' or '') + mli.setProperty('video.res', video.resolutionString()) + mli.setProperty('audio.codec', video.audioCodecString()) + mli.setProperty('video.codec', video.videoCodecString()) + mli.setProperty('audio.channels', video.audioChannelsString(metadata.apiTranslate)) + mli.setProperty('video.rendering', video.videoCodecRendering) + mli.setBoolProperty('unavailable', not video.available()) + + defW = 176 + defH = 140 + ids = [301, 302, 303, 304, 305] + if len(list(filter(lambda x: x.isAccessible(), video.media()))) > 1: + mli.setBoolProperty('media.multiple', True) + # adjust button sizes + ids.append(307) + for id in ids: + ctrl = self.getControl(id) + ctrl.setWidth(161) + ctrl.setHeight(125) + del ctrl + else: + mli.setBoolProperty('media.multiple', False) + # reset button sizes + for id in ids: + ctrl = self.getControl(id) + ctrl.setWidth(defW) + ctrl.setHeight(defH) + del ctrl + + def setItemAudioAndSubtitleInfo(self, video, mli): + sas = video.selectedAudioStream() + mli.setProperty('audio', sas and sas.getTitle(metadata.apiTranslate) or T(32309, 'None')) + + sss = video.selectedSubtitleStream(forced_subtitles_override= + util.getSetting("forced_subtitles_override", False)) + if sss: + if len(video.subtitleStreams) > 1: + mli.setProperty( + 'subtitles', u'{0} \u2022 {1} {2}'.format(sss.getTitle(metadata.apiTranslate), len(video.subtitleStreams) - 1, T(32307, 'More')) + ) + else: + mli.setProperty('subtitles', sss.getTitle(metadata.apiTranslate)) + else: + if video.subtitleStreams: + mli.setProperty('subtitles', u'{0} \u2022 {1} {2}'.format(T(32309, 'None'), len(video.subtitleStreams), T(32308, 'Available'))) + else: + mli.setProperty('subtitles', T(32309, 'None')) + + def setProgress(self, mli): + video = mli.dataSource + if video.viewOffset.asInt(): + width = video.viewOffset.asInt() and (1 + int((video.viewOffset.asInt() / video.duration.asFloat()) * self.width)) or 1 + self.progressImageControl.setWidth(width) + else: + self.progressImageControl.setWidth(1) + + if video.viewOffset.asInt(): + mli.setProperty('remainingTime', T(33615, "{time} left").format(time=video.remainingTimeString)) + else: + mli.setProperty('remainingTime', '') + + def createListItem(self, episode): + if episode.index: + subtitle = u'{0}{1} \u2022 {2}{3}'.format(T(32310, 'S'), episode.parentIndex, T(32311, 'E'), episode.index) + else: + subtitle = episode.originallyAvailableAt.asDatetime('%m/%d/%y') + + mli = kodigui.ManagedListItem( + episode.title, + subtitle, + thumbnailImage=episode.thumb.asTranscodedImageURL(*self.THUMB_AR16X9_DIM), + data_source=episode + ) + mli.setProperty('episode.number', str(episode.index) or '') + mli.setProperty('episode.duration', util.durationToText(episode.duration.asInt())) + mli.setProperty('unwatched', not episode.isWatched and '1' or '') + # mli.setProperty('progress', util.getProgressImage(obj)) + return mli + + def fillEpisodes(self, update=False): + items = self.episodesPaginator.paginate() + self.reloadItems(items) + + def reloadItems(self, items, with_progress=False): + tasks = [] + for mli in items: + if not mli.dataSource: + continue + + task = EpisodeReloadTask().setup(mli.dataSource, self.reloadItemCallback, with_progress=with_progress) + self.tasks.add(task) + tasks.append(task) + + backgroundthread.BGThreader.addTasks(tasks) + + def reloadItemCallback(self, task, episode, with_progress=False): + self.tasks.remove(task) + del task + + if self.closing: + return + + selected = self.episodeListControl.getSelectedItem() + + for mli in self.episodeListControl: + if mli.dataSource == episode: + if not episode.mediaChoice: + episode.setMediaChoice() + + self.setPostReloadItemInfo(episode, mli) + if with_progress: + self.episodesPaginator.prepareListItem(None, mli) + if mli == selected: + self.lastItem = mli + self.setProgress(mli) + return + + def fillExtras(self, has_prev=False): + items = [] + idx = 0 + + seasonOrShow = self.season or self.show_ + + if not seasonOrShow.extras: + self.extraListControl.reset() + return False + + for extra in seasonOrShow.extras(): + mli = kodigui.ManagedListItem( + extra.title or '', + metadata.EXTRA_MAP.get(extra.extraType.asInt(), ''), + thumbnailImage=extra.thumb.asTranscodedImageURL(*self.EXTRA_DIM), + data_source=extra + ) + + if mli: + mli.setProperty('index', str(idx)) + mli.setProperty( + 'thumb.fallback', 'script.plex/thumb_fallbacks/{0}.png'.format(extra.type in ('show', 'season', 'episode') and 'show' or 'movie') + ) + items.append(mli) + idx += 1 + + if not items: + return False + + self.extraListControl.reset() + self.extraListControl.addItems(items) + + self.setProperty('divider.{0}'.format(self.EXTRA_LIST_ID), has_prev and '1' or '') + return True + + def fillRelated(self, has_prev=False): + if not self.relatedPaginator.leafCount: + self.relatedListControl.reset() + return has_prev + + items = self.relatedPaginator.paginate() + if not items: + return False + + self.setProperty('divider.{0}'.format(self.RELATED_LIST_ID), has_prev and '1' or '') + + return True + + def fillRoles(self, has_prev=False): + items = [] + idx = 0 + + if not self.show_.roles: + self.rolesListControl.reset() + return False + + for role in self.show_.roles(): + mli = kodigui.ManagedListItem(role.tag, role.role, thumbnailImage=role.thumb.asTranscodedImageURL(*self.ROLES_DIM), data_source=role) + mli.setProperty('index', str(idx)) + items.append(mli) + idx += 1 + + if not items: + return False + + self.setProperty('divider.{0}'.format(self.ROLES_LIST_ID), has_prev and '1' or '') + + self.rolesListControl.reset() + self.rolesListControl.addItems(items) + return True diff --git a/script.plexmod/lib/windows/home.py b/script.plexmod/lib/windows/home.py new file mode 100644 index 000000000..0e0584cbb --- /dev/null +++ b/script.plexmod/lib/windows/home.py @@ -0,0 +1,1388 @@ +from __future__ import absolute_import +import time +import threading +import re + +from kodi_six import xbmc +from kodi_six import xbmcgui + +from . import kodigui +from lib import util +from lib import backgroundthread +from lib import colors +from lib import player + +import plexnet +from plexnet import plexapp + +from . import windowutils +from . import playlists +from . import busy +from . import opener +from . import search +from . import optionsdialog + +from lib.util import T +from six.moves import range + + +HUBS_REFRESH_INTERVAL = 300 # 5 Minutes +HUB_PAGE_SIZE = 10 + +MOVE_SET = frozenset( + ( + xbmcgui.ACTION_MOVE_LEFT, + xbmcgui.ACTION_MOVE_RIGHT, + xbmcgui.ACTION_MOVE_UP, + xbmcgui.ACTION_MOVE_DOWN, + xbmcgui.ACTION_MOUSE_MOVE, + xbmcgui.ACTION_PAGE_UP, + xbmcgui.ACTION_PAGE_DOWN, + xbmcgui.ACTION_FIRST_PAGE, + xbmcgui.ACTION_LAST_PAGE, + xbmcgui.ACTION_MOUSE_WHEEL_DOWN, + xbmcgui.ACTION_MOUSE_WHEEL_UP + ) +) + + +class HubsList(list): + def init(self): + self.lastUpdated = time.time() + return self + + +class SectionHubsTask(backgroundthread.Task): + def setup(self, section, callback): + self.section = section + self.callback = callback + return self + + def run(self): + if self.isCanceled(): + return + + if not plexapp.SERVERMANAGER.selectedServer: + # Could happen during sign-out for instance + return + + try: + hubs = HubsList(plexapp.SERVERMANAGER.selectedServer.hubs(self.section.key, count=HUB_PAGE_SIZE)).init() + if self.isCanceled(): + return + self.callback(self.section, hubs) + except plexnet.exceptions.BadRequest: + util.DEBUG_LOG('404 on section: {0}'.format(repr(self.section.title))) + self.callback(self.section, False) + except TypeError: + util.ERROR("No data - disconnected?", notify=True, time_ms=5000) + self.cancel() + + +class UpdateHubTask(backgroundthread.Task): + def setup(self, hub, callback): + self.hub = hub + self.callback = callback + return self + + def run(self): + if self.isCanceled(): + return + + if not plexapp.SERVERMANAGER.selectedServer: + # Could happen during sign-out for instance + return + + try: + self.hub.reload(limit=HUB_PAGE_SIZE) + if self.isCanceled(): + return + self.callback(self.hub) + except plexnet.exceptions.BadRequest: + util.DEBUG_LOG('404 on section: {0}'.format(repr(self.section.title))) + + +class ExtendHubTask(backgroundthread.Task): + def setup(self, hub, callback, canceledCallback=None): + self.hub = hub + self.callback = callback + self.canceledCallback = canceledCallback + return self + + def run(self): + if self.isCanceled(): + if self.canceledCallback: + self.canceledCallback(self.hub) + return + + if not plexapp.SERVERMANAGER.selectedServer: + # Could happen during sign-out for instance + return + + try: + start = self.hub.offset.asInt() + self.hub.size.asInt() + items = self.hub.extend(start=start, size=HUB_PAGE_SIZE) + if self.isCanceled(): + if self.canceledCallback: + self.canceledCallback(self.hub) + return + self.callback(self.hub, items) + except plexnet.exceptions.BadRequest: + util.DEBUG_LOG('404 on hub: {0}'.format(repr(self.hub.hubIdentifier))) + if self.canceledCallback: + self.canceledCallback(self.hub) + + +class HomeSection(object): + key = None + type = 'home' + title = T(32332, 'Home') + + +class PlaylistsSection(object): + key = 'playlists' + type = 'playlists' + title = T(32333, 'Playlists') + + +class ServerListItem(kodigui.ManagedListItem): + uuid = None + + def hookSignals(self): + self.dataSource.on('completed:reachability', self.onReachability) + self.dataSource.on('started:reachability', self.onReachability) + + def unHookSignals(self): + try: + self.dataSource.off('completed:reachability', self.onReachability) + self.dataSource.off('started:reachability', self.onReachability) + except: + pass + + def setRefreshing(self): + self.safeSetProperty('status', 'refreshing.gif') + + def safeSetProperty(self, key, value): + # For if we catch the item in the middle of being removed + try: + self.setProperty(key, value) + return True + except AttributeError: + pass + + return False + + def safeSetLabel(self, value, func="setLabel"): + if value is None: + return False + try: + getattr(self, func)(value) + return True + except AttributeError: + pass + + return False + + def safeGetDSProperty(self, prop): + return getattr(self.dataSource, prop, None) + + def onReachability(self, **kwargs): + plexapp.util.APP.trigger('sli:reachability:received') + return self.onUpdate(**kwargs) + + def onUpdate(self, **kwargs): + if not self.listItem: # ex. can happen on Kodi shutdown + return + + if self.dataSource == kodigui.DUMMY_DATA_SOURCE: + return + + # this looks a little ridiculous, but we're experiencing timing issues here + isSupported = self.safeGetDSProperty("isSupported") + isReachable = False + isReachableFunc = self.safeGetDSProperty("isReachable") + isSecure = self.safeGetDSProperty("isSecure") + isLocal = self.safeGetDSProperty("isLocal") + name = self.safeGetDSProperty("name") + pendingReachabilityRequests = self.safeGetDSProperty("pendingReachabilityRequests") + owned = not self.safeGetDSProperty("owned") and self.safeGetDSProperty("owner") or '' + if isReachableFunc: + isReachable = isReachableFunc() + + if not isSupported or not isReachable: + if pendingReachabilityRequests is not None and pendingReachabilityRequests > 0: + self.safeSetProperty('status', 'refreshing.gif') + else: + self.safeSetProperty('status', 'unreachable.png') + else: + self.safeSetProperty('status', isSecure and 'secure.png' or '') + self.safeSetProperty('secure', isSecure and '1' or '') + self.safeSetProperty('local', isLocal and '1' or '') + + self.safeSetProperty('current', plexapp.SERVERMANAGER.selectedServer.uuid == self.uuid and '1' or '') + if name: + self.safeSetLabel(name) + + if owned: + self.safeSetLabel(owned, func="setLabel2") + + def onDestroy(self): + self.unHookSignals() + + +class HomeWindow(kodigui.BaseWindow, util.CronReceiver): + xmlFile = 'script-plex-home.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + OPTIONS_GROUP_ID = 200 + + SECTION_LIST_ID = 101 + SERVER_BUTTON_ID = 201 + + USER_BUTTON_ID = 202 + USER_LIST_ID = 250 + + SEARCH_BUTTON_ID = 203 + SERVER_LIST_ID = 260 + REFRESH_SL_ID = 262 + + PLAYER_STATUS_BUTTON_ID = 204 + + HUB_AR16X9_00 = 400 + HUB_POSTER_01 = 401 + HUB_POSTER_02 = 402 + HUB_POSTER_03 = 403 + HUB_POSTER_04 = 404 + HUB_SQUARE_05 = 405 + HUB_AR16X9_06 = 406 + HUB_POSTER_07 = 407 + HUB_POSTER_08 = 408 + HUB_SQUARE_09 = 409 + HUB_SQUARE_10 = 410 + HUB_SQUARE_11 = 411 + HUB_SQUARE_12 = 412 + HUB_POSTER_13 = 413 + HUB_POSTER_14 = 414 + HUB_POSTER_15 = 415 + HUB_POSTER_16 = 416 + HUB_AR16X9_17 = 417 + HUB_AR16X9_18 = 418 + HUB_AR16X9_19 = 419 + + HUB_SQUARE_20 = 420 + HUB_SQUARE_21 = 421 + HUB_SQUARE_22 = 422 + + HUB_AR16X9_23 = 423 + + HUBMAP = { + # HOME + 'home.continue': {'index': 0, 'with_progress': True, 'with_art': True, 'do_updates': True, 'text2lines': True}, + 'home.ondeck': {'index': 1, 'with_progress': True, 'do_updates': True, 'text2lines': True}, + 'home.television.recent': {'index': 2, 'do_updates': True, 'with_progress': True, 'text2lines': True}, + 'home.movies.recent': {'index': 4, 'do_updates': True, 'with_progress': True, 'text2lines': True}, + 'home.music.recent': {'index': 5, 'text2lines': True}, + 'home.videos.recent': {'index': 6, 'with_progress': True, 'ar16x9': True}, + #'home.playlists': {'index': 9}, # No other Plex home screen shows playlists so removing it from here + 'home.photos.recent': {'index': 10, 'text2lines': True}, + # SHOW + 'tv.ondeck': {'index': 1, 'with_progress': True, 'do_updates': True, 'text2lines': True}, + 'tv.recentlyaired': {'index': 2, 'do_updates': True, 'with_progress': True, 'text2lines': True}, + 'tv.recentlyadded': {'index': 3, 'do_updates': True, 'with_progress': True, 'text2lines': True}, + 'tv.inprogress': {'index': 4, 'with_progress': True, 'do_updates': True, 'text2lines': True}, + 'tv.startwatching': {'index': 7, 'with_progress': True, 'do_updates': True}, + 'tv.rediscover': {'index': 8, 'with_progress': True, 'do_updates': True}, + 'tv.morefromnetwork': {'index': 13, 'with_progress': True, 'do_updates': True}, + 'tv.toprated': {'index': 14, 'with_progress': True, 'do_updates': True}, + 'tv.moreingenre': {'index': 15, 'with_progress': True, 'do_updates': True}, + 'tv.recentlyviewed': {'index': 16, 'with_progress': True, 'text2lines': True, 'do_updates': True}, + # MOVIE + 'movie.inprogress': {'index': 0, 'with_progress': True, 'with_art': True, 'do_updates': True, 'text2lines': True}, + 'movie.recentlyreleased': {'index': 1, 'do_updates': True, 'with_progress': True, 'text2lines': True}, + 'movie.recentlyadded': {'index': 2, 'do_updates': True, 'with_progress': True, 'text2lines': True}, + 'movie.genre': {'index': 3, 'with_progress': True, 'text2lines': True, 'do_updates': True}, + 'movie.by.actor.or.director': {'index': 7, 'with_progress': True, 'text2lines': True, 'do_updates': True}, + 'movie.topunwatched': {'index': 13, 'text2lines': True, 'do_updates': True}, + 'movie.recentlyviewed': {'index': 14, 'with_progress': True, 'text2lines': True, 'do_updates': True}, + # ARTIST + 'music.recent.played': {'index': 5, 'do_updates': True}, + 'music.recent.added': {'index': 9, 'text2lines': True}, + 'music.recent.artist': {'index': 10, 'text2lines': True}, + 'music.recent.genre': {'index': 11, 'text2lines': True}, + 'music.top.period': {'index': 12, 'text2lines': True}, + 'music.popular': {'index': 20, 'text2lines': True}, + 'music.recent.label': {'index': 21, 'text2lines': True}, + 'music.touring': {'index': 22}, + 'music.videos.popular.new': {'index': 18}, + 'music.videos.new': {'index': 19}, + 'music.videos.recent.artists': {'index': 23}, + # PHOTO + 'photo.recent': {'index': 5, 'text2lines': True}, + 'photo.random.year': {'index': 9, 'text2lines': True}, + 'photo.random.decade': {'index': 10, 'text2lines': True}, + 'photo.random.dayormonth': {'index': 11, 'text2lines': True}, + # VIDEO + 'video.recent': {'index': 0, 'with_progress': True, 'ar16x9': True}, + 'video.random.year': {'index': 6, 'with_progress': True, 'ar16x9': True}, + 'video.random.decade': {'index': 17, 'with_progress': True, 'ar16x9': True}, + 'video.inprogress': {'index': 18, 'with_progress': True, 'ar16x9': True}, + 'video.unwatched.random': {'index': 19, 'ar16x9': True}, + 'video.recentlyviewed': {'index': 23, 'with_progress': True, 'ar16x9': True}, + # PLAYLISTS + 'playlists.audio': {'index': 5, 'text2lines': True, 'title': T(32048, 'Audio')}, + 'playlists.video': {'index': 6, 'text2lines': True, 'ar16x9': True, 'title': T(32053, 'Video')}, + } + + THUMB_POSTER_DIM = util.scaleResolution(244, 361) + THUMB_AR16X9_DIM = util.scaleResolution(532, 299) + THUMB_SQUARE_DIM = util.scaleResolution(244, 244) + + def __init__(self, *args, **kwargs): + kodigui.BaseWindow.__init__(self, *args, **kwargs) + self.lastSection = HomeSection + self.tasks = [] + self.closeOption = None + self.hubControls = None + self.backgroundSet = False + self.sectionChangeThread = None + self.sectionChangeTimeout = 0 + self.lastFocusID = None + self.lastNonOptionsFocusID = None + self.sectionHubs = {} + self.updateHubs = {} + self.changingServer = False + self._shuttingDown = False + windowutils.HOME = self + + self.lock = threading.Lock() + + util.setGlobalBoolProperty('off.sections', '') + + def onFirstInit(self): + # set last BG image if possible + if util.advancedSettings.dynamicBackgrounds: + bgUrl = util.getSetting("last_bg_url") + if bgUrl: + self.windowSetBackground(bgUrl) + + # set good volume if we've missed re-setting BGM volume before + lastGoodVlm = util.getSetting('last_good_volume', 0) + BGMVlm = plexapp.util.INTERFACE.getThemeMusicValue() + if lastGoodVlm and BGMVlm and util.rpc.Application.GetProperties(properties=["volume"])["volume"] == BGMVlm: + util.DEBUG_LOG("Setting volume to {}, we probably missed the " + "re-set on the last BGM encounter".format(lastGoodVlm)) + xbmc.executebuiltin("SetVolume({})".format(lastGoodVlm)) + + self.sectionList = kodigui.ManagedControlList(self, self.SECTION_LIST_ID, 7) + self.serverList = kodigui.ManagedControlList(self, self.SERVER_LIST_ID, 10) + self.userList = kodigui.ManagedControlList(self, self.USER_LIST_ID, 3) + + self.hubControls = ( + kodigui.ManagedControlList(self, self.HUB_AR16X9_00, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_01, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_02, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_03, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_04, 5), + kodigui.ManagedControlList(self, self.HUB_SQUARE_05, 5), + kodigui.ManagedControlList(self, self.HUB_AR16X9_06, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_07, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_08, 5), + kodigui.ManagedControlList(self, self.HUB_SQUARE_09, 5), + kodigui.ManagedControlList(self, self.HUB_SQUARE_10, 5), + kodigui.ManagedControlList(self, self.HUB_SQUARE_11, 5), + kodigui.ManagedControlList(self, self.HUB_SQUARE_12, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_13, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_14, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_15, 5), + kodigui.ManagedControlList(self, self.HUB_POSTER_16, 5), + kodigui.ManagedControlList(self, self.HUB_AR16X9_17, 5), + kodigui.ManagedControlList(self, self.HUB_AR16X9_18, 5), + kodigui.ManagedControlList(self, self.HUB_AR16X9_19, 5), + kodigui.ManagedControlList(self, self.HUB_SQUARE_20, 5), + kodigui.ManagedControlList(self, self.HUB_SQUARE_21, 5), + kodigui.ManagedControlList(self, self.HUB_SQUARE_22, 5), + kodigui.ManagedControlList(self, self.HUB_AR16X9_23, 5), + ) + + self.hubFocusIndexes = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 16, 17, 18, 19, 20, 21, 22, 13, 14, 15, 23) + + self.bottomItem = 0 + if self.serverRefresh(): + self.setFocusId(self.SECTION_LIST_ID) + + self.hookSignals() + util.CRON.registerReceiver(self) + + def onReInit(self): + if self.lastFocusID: + # try focusing the last focused ID. if that's a hub and it's empty (=not focusable), try focusing the + # next best hub + if 399 < self.lastFocusID < 500: + hubControlIndex = self.lastFocusID - 400 + + if hubControlIndex in self.hubFocusIndexes and self.hubControls[hubControlIndex]: + # this is basically just used for setting the background upon reinit + # fixme: declutter, separation of concerns + self.checkHubItem(self.lastFocusID) + else: + util.DEBUG_LOG("Focus requested on {}, which can't focus. Trying next hub".format(self.lastFocusID)) + self.focusFirstValidHub(hubControlIndex) + + else: + self.setFocusId(self.lastFocusID) + + def focusFirstValidHub(self, startIndex=None): + indices = self.hubFocusIndexes + if startIndex is not None: + try: + indices = self.hubFocusIndexes[self.hubFocusIndexes.index(startIndex):] + util.DEBUG_LOG("Trying to focus the next best hub after: %i" % (400 + startIndex)) + except IndexError: + pass + + for index in indices: + if self.hubControls[index]: + util.DEBUG_LOG("Focusing hub: %i" % (400 + index)) + self.setFocusId(400+index) + self.checkHubItem(400+index) + return + + if startIndex is not None: + util.DEBUG_LOG("Tried all possible hubs after %i. Continuing from the top" % (400 + startIndex)) + else: + util.DEBUG_LOG("Can't find any suitable hub to focus. This is bad.") + self.setFocusId(self.SECTION_LIST_ID) + return + + return self.focusFirstValidHub() + + def hookSignals(self): + plexapp.SERVERMANAGER.on('new:server', self.onNewServer) + plexapp.SERVERMANAGER.on('remove:server', self.onRemoveServer) + plexapp.SERVERMANAGER.on('reachable:server', self.onReachableServer) + plexapp.SERVERMANAGER.on('reachable:server', self.displayServerAndUser) + + plexapp.util.APP.on('change:selectedServer', self.onSelectedServerChange) + plexapp.util.APP.on('account:response', self.displayServerAndUser) + plexapp.util.APP.on('sli:reachability:received', self.displayServerAndUser) + + player.PLAYER.on('session.ended', self.updateOnDeckHubs) + util.MONITOR.on('changed.watchstatus', self.updateOnDeckHubs) + + def unhookSignals(self): + plexapp.SERVERMANAGER.off('new:server', self.onNewServer) + plexapp.SERVERMANAGER.off('remove:server', self.onRemoveServer) + plexapp.SERVERMANAGER.off('reachable:server', self.onReachableServer) + plexapp.SERVERMANAGER.off('reachable:server', self.displayServerAndUser) + + plexapp.util.APP.off('change:selectedServer', self.onSelectedServerChange) + plexapp.util.APP.off('account:response', self.displayServerAndUser) + + player.PLAYER.off('session.ended', self.updateOnDeckHubs) + util.MONITOR.off('changed.watchstatus', self.updateOnDeckHubs) + + def tick(self): + if not self.lastSection: + return + + hubs = self.sectionHubs.get(self.lastSection.key) + if not hubs: + return + + if time.time() - hubs.lastUpdated > HUBS_REFRESH_INTERVAL: + self.showHubs(self.lastSection, update=True) + + def shutdown(self): + self._shuttingDown = True + try: + self.serverList.reset() + except AttributeError: + pass + + self.unhookSignals() + + if util.advancedSettings.dynamicBackgrounds: + # store BG url of first hub, first item, as this is most likely to be the one we're focusing on the + # next start + try: + indices = self.hubFocusIndexes + for index in indices: + if self.hubControls[index]: + ds = self.hubControls[index][0].dataSource + util.setSetting("last_bg_url", + util.backgroundFromArt(ds.art, width=self.width, height=self.height)) + return + except: + util.LOG("Couldn't store last background") + + def onAction(self, action): + controlID = self.getFocusId() + + try: + if not controlID and not action == xbmcgui.ACTION_MOUSE_MOVE: + if self.lastFocusID: + self.setFocusId(self.lastFocusID) + + if controlID == self.SECTION_LIST_ID: + self.checkSectionItem(action=action) + + if controlID == self.SERVER_BUTTON_ID: + if action == xbmcgui.ACTION_SELECT_ITEM: + self.showServers() + return + elif action == xbmcgui.ACTION_MOUSE_LEFT_CLICK: + self.showServers(mouse=True) + self.setBoolProperty('show.servers', True) + return + elif controlID == self.USER_BUTTON_ID: + if action == xbmcgui.ACTION_SELECT_ITEM: + self.showUserMenu() + return + elif action == xbmcgui.ACTION_MOUSE_LEFT_CLICK: + self.showUserMenu(mouse=True) + self.setBoolProperty('show.options', True) + return + elif controlID == self.SERVER_LIST_ID: + if action == xbmcgui.ACTION_SELECT_ITEM: + self.setFocusId(self.SERVER_BUTTON_ID) + return + + if controlID == self.SERVER_BUTTON_ID and action == xbmcgui.ACTION_MOVE_RIGHT: + self.setFocusId(self.USER_BUTTON_ID) + elif controlID == self.USER_BUTTON_ID and action == xbmcgui.ACTION_MOVE_LEFT: + self.setFocusId(self.SERVER_BUTTON_ID) + elif controlID == self.SEARCH_BUTTON_ID and action == xbmcgui.ACTION_MOVE_RIGHT: + if xbmc.getCondVisibility('Player.HasMedia + Control.IsVisible({0})'.format(self.PLAYER_STATUS_BUTTON_ID)): + self.setFocusId(self.PLAYER_STATUS_BUTTON_ID) + else: + self.setFocusId(self.SERVER_BUTTON_ID) + elif controlID == self.PLAYER_STATUS_BUTTON_ID and action == xbmcgui.ACTION_MOVE_RIGHT: + self.setFocusId(self.SERVER_BUTTON_ID) + elif 399 < controlID < 500: + if action.getId() in MOVE_SET: + self.checkHubItem(controlID) + elif action.getId() == xbmcgui.ACTION_PLAYER_PLAY: + self.hubItemClicked(controlID, auto_play=True) + return + + if action in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_CONTEXT_MENU): + optionsFocused = xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)) + offSections = util.getGlobalProperty('off.sections') + if action in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_PREVIOUS_MENU): + # fixme: cheap way of avoiding an early exit after a server change + if self.changingServer: + return + + if self.getFocusId() == self.USER_LIST_ID: + self.setFocusId(self.USER_BUTTON_ID) + return + elif self.getFocusId() == self.SERVER_LIST_ID: + self.setFocusId(self.SERVER_BUTTON_ID) + return + + if util.advancedSettings.fastBack and not optionsFocused and offSections \ + and self.lastFocusID not in (self.USER_BUTTON_ID, self.SERVER_BUTTON_ID, + self.SEARCH_BUTTON_ID, self.SECTION_LIST_ID): + self.setProperty('hub.focus', '0') + self.setFocusId(self.SECTION_LIST_ID) + return + + if action in(xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_CONTEXT_MENU): + if not optionsFocused and offSections \ + and (not util.advancedSettings.fastBack or action == xbmcgui.ACTION_CONTEXT_MENU): + self.lastNonOptionsFocusID = self.lastFocusID + self.setFocusId(self.OPTIONS_GROUP_ID) + return + elif action == xbmcgui.ACTION_CONTEXT_MENU and optionsFocused and offSections \ + and self.lastNonOptionsFocusID: + self.setFocusId(self.lastNonOptionsFocusID) + self.lastNonOptionsFocusID = None + return + + if action in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_PREVIOUS_MENU): + ex = self.confirmExit() + # 0 = exit; 1 = minimize; 2 = cancel + if ex in (2, None): + return + elif ex == 1: + xbmc.executebuiltin('ActivateWindow(10000)') + return + elif ex == 0: + self._shuttingDown = True + # 0 passes the action to the BaseWindow and exits HOME + except: + util.ERROR() + + kodigui.BaseWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.SECTION_LIST_ID: + self.sectionClicked() + # elif controlID == self.SERVER_BUTTON_ID: + # self.showServers() + elif controlID == self.SERVER_LIST_ID: + self.setBoolProperty('show.servers', False) + self.selectServer() + # elif controlID == self.USER_BUTTON_ID: + # self.showUserMenu() + elif controlID == self.USER_LIST_ID: + self.doUserOption() + self.setBoolProperty('show.options', False) + self.setFocusId(self.USER_BUTTON_ID) + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif 399 < controlID < 500: + self.hubItemClicked(controlID) + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + + def onFocus(self, controlID): + if controlID != 204 and controlID < 500: + # don't store focus for mini music player + self.lastFocusID = controlID + + if 399 < controlID < 500: + self.setProperty('hub.focus', str(self.hubFocusIndexes[controlID - 400])) + + if controlID == self.SECTION_LIST_ID and not self.changingServer: + self.checkSectionItem() + + if xbmc.getCondVisibility('ControlGroup(50).HasFocus(0) + ControlGroup(100).HasFocus(0)'): + util.setGlobalBoolProperty('off.sections', '') + elif controlID != 250 and xbmc.getCondVisibility('ControlGroup(50).HasFocus(0) + !ControlGroup(100).HasFocus(0)'): + util.setGlobalBoolProperty('off.sections', '1') + + if player.PLAYER.bgmPlaying: + player.PLAYER.stopAndWait() + + def confirmExit(self): + button = optionsdialog.show( + T(32334, 'Confirm Exit'), + T(32335, 'Are you ready to exit Plex?'), + T(32336, 'Exit'), + T(32924, 'Minimize'), + T(32337, 'Cancel') + ) + + return button + + def searchButtonClicked(self): + self.processCommand(search.dialog(self)) + + def updateOnDeckHubs(self, **kwargs): + if util.getSetting("speedy_home_hubs2", False): + util.DEBUG_LOG("Using alternative home hub refresh") + sections = set() + for mli in self.sectionList: + if mli.dataSource is not None and mli.dataSource != self.lastSection: + sections.add(mli.dataSource) + tasks = [SectionHubsTask().setup(s, self.sectionHubsCallback) for s in [self.lastSection] + list(sections)] + else: + tasks = [UpdateHubTask().setup(hub, self.updateHubCallback) for hub in self.updateHubs.values()] + self.tasks += tasks + backgroundthread.BGThreader.addTasks(tasks) + + def showBusy(self, on=True): + self.setProperty('busy', on and '1' or '') + + @busy.dialog() + def serverRefresh(self): + backgroundthread.BGThreader.reset() + if self.tasks: + for task in self.tasks: + task.cancel() + + with self.lock: + self.setProperty('hub.focus', '') + self.displayServerAndUser() + if not plexapp.SERVERMANAGER.selectedServer: + self.setFocusId(self.USER_BUTTON_ID) + return False + + self.showSections() + self.backgroundSet = False + self.showHubs(HomeSection) + return True + + def hubItemClicked(self, hubControlID, auto_play=False): + control = self.hubControls[hubControlID - 400] + mli = control.getSelectedItem() + if not mli: + return + + if mli.dataSource is None: + return + + try: + command = opener.open(mli.dataSource, auto_play=auto_play) + if command == "NODATA": + raise util.NoDataException + except util.NoDataException: + util.ERROR("No data - disconnected?", notify=True, time_ms=5000) + return + + self.updateListItem(mli) + + if not mli: + return + + if not mli.dataSource.exists(): + try: + control.removeItem(mli.pos()) + except (ValueError, TypeError): + # fixme: why? + pass + + if not control.size(): + idx = self.hubFocusIndexes[hubControlID - 400] + while idx > 0: + idx -= 1 + controlID = 400 + self.hubFocusIndexes.index(idx) + control = self.hubControls[self.hubFocusIndexes.index(idx)] + if control.size(): + self.setFocusId(controlID) + break + else: + self.setFocusId(self.SECTION_LIST_ID) + + self.processCommand(command) + + def processCommand(self, command): + if command.startswith('HOME:'): + sectionID = command.split(':', 1)[-1] + for mli in self.sectionList: + if mli.dataSource and mli.dataSource.key == sectionID: + self.sectionList.selectItem(mli.pos()) + self.lastSection = mli.dataSource + self.sectionChanged() + + def checkSectionItem(self, force=False, action=None): + item = self.sectionList.getSelectedItem() + if not item: + return + + if not item.getProperty('item'): + if action and action == xbmcgui.ACTION_MOVE_RIGHT: + self.sectionList.selectItem(0) + item = self.sectionList[0] + else: + self.sectionList.selectItem(self.bottomItem) + item = self.sectionList[self.bottomItem] + + if item.dataSource != self.lastSection: + self.lastSection = item.dataSource + self.sectionChanged(force) + + def checkHubItem(self, controlID): + control = self.hubControls[controlID - 400] + mli = control.getSelectedItem() + is_valid_mli = mli and mli.getProperty('is.end') != '1' + + if util.advancedSettings.dynamicBackgrounds and is_valid_mli: + self.updateBackgroundFrom(mli.dataSource) + + if not mli or not mli.getProperty('is.end') or mli.getProperty('is.updating') == '1': + return + + mli.setBoolProperty('is.updating', True) + self.cleanTasks() + task = ExtendHubTask().setup(control.dataSource, self.extendHubCallback, + canceledCallback=lambda hub: mli.setBoolProperty('is.updating', False)) + self.tasks.append(task) + backgroundthread.BGThreader.addTask(task) + + def displayServerAndUser(self, **kwargs): + title = plexapp.ACCOUNT.title or plexapp.ACCOUNT.username or ' ' + self.setProperty('user.name', title) + self.setProperty('user.avatar', plexapp.ACCOUNT.thumb) + self.setProperty('user.avatar.letter', title[0].upper()) + + if plexapp.SERVERMANAGER.selectedServer: + self.setProperty('server.name', plexapp.SERVERMANAGER.selectedServer.name) + self.setProperty('server.icon', + 'script.plex/home/device/plex.png') # TODO: Set dynamically to whatever it should be if that's how it even works :) + self.setProperty('server.iconmod', + plexapp.SERVERMANAGER.selectedServer.isSecure and 'script.plex/home/device/lock.png' or '') + self.setProperty('server.iconmod2', + plexapp.SERVERMANAGER.selectedServer.isLocal and 'script.plex/home/device/home_small.png' + or '') + else: + self.setProperty('server.name', T(32338, 'No Servers Found')) + self.setProperty('server.icon', 'script.plex/home/device/error.png') + self.setProperty('server.iconmod', '') + self.setProperty('server.iconmod2', '') + + def cleanTasks(self): + self.tasks = [t for t in self.tasks if t.isValid()] + + def sectionChanged(self, force=False): + self.sectionChangeTimeout = time.time() + 0.3 + if not self.sectionChangeThread or not self.sectionChangeThread.is_alive() or force: + self.sectionChangeThread = threading.Thread(target=self._sectionChanged, name="sectionchanged") + self.sectionChangeThread.start() + + def _sectionChanged(self): + while not util.MONITOR.waitForAbort(0.1): + if time.time() >= self.sectionChangeTimeout: + break + + self._sectionReallyChanged() + + def _sectionReallyChanged(self): + with self.lock: + section = self.lastSection + self.setProperty('hub.focus', '') + if util.advancedSettings.dynamicBackgrounds: + self.backgroundSet = False + + util.DEBUG_LOG('Section changed ({0}): {1}'.format(section.key, repr(section.title))) + self.showHubs(section) + self.lastSection = section + self.checkSectionItem(force=True) + + def sectionHubsCallback(self, section, hubs): + with self.lock: + update = bool(self.sectionHubs.get(section.key)) + self.sectionHubs[section.key] = hubs + if self.lastSection == section: + self.showHubs(section, update=update) + + def updateHubCallback(self, hub, items=None): + with self.lock: + for mli in self.sectionList: + section = mli.dataSource + if not section: + continue + + hubs = self.sectionHubs.get(section.key, ()) + for idx, ihub in enumerate(hubs): + if ihub == hub: + if self.lastSection == section: + util.DEBUG_LOG('Hub {0} updated - refreshing section: {1}'.format(hub.hubIdentifier, repr(section.title))) + hubs[idx] = hub + self.showHub(hub, items=items) + return + + def extendHubCallback(self, hub, items): + util.DEBUG_LOG('ExtendHub called: {0} [{1}]'.format(hub.hubIdentifier, len(hub.items))) + self.updateHubCallback(hub, items) + + def showSections(self): + self.sectionHubs = {} + items = [] + + homemli = kodigui.ManagedListItem(T(32332, 'Home'), data_source=HomeSection) + homemli.setProperty('is.home', '1') + homemli.setProperty('item', '1') + items.append(homemli) + + pl = plexapp.SERVERMANAGER.selectedServer.playlists() + if pl: + plli = kodigui.ManagedListItem('Playlists', thumbnailImage='script.plex/home/type/playlists.png', data_source=PlaylistsSection) + plli.setProperty('is.playlists', '1') + plli.setProperty('item', '1') + items.append(plli) + + try: + sections = plexapp.SERVERMANAGER.selectedServer.library.sections() + except plexnet.exceptions.BadRequest: + self.setFocusId(self.SERVER_BUTTON_ID) + util.messageDialog("Error", "Bad request") + return + + if plexapp.SERVERMANAGER.selectedServer.hasHubs(): + self.tasks = [SectionHubsTask().setup(s, self.sectionHubsCallback) for s in [HomeSection, PlaylistsSection] + sections] + backgroundthread.BGThreader.addTasks(self.tasks) + + for section in sections: + mli = kodigui.ManagedListItem(section.title, thumbnailImage='script.plex/home/type/{0}.png'.format(section.type), data_source=section) + mli.setProperty('item', '1') + items.append(mli) + + self.bottomItem = len(items) - 1 + + for x in range(len(items), 8): + mli = kodigui.ManagedListItem() + items.append(mli) + + self.lastSection = HomeSection + self.sectionList.reset() + self.sectionList.addItems(items) + + if items: + self.setFocusId(self.SECTION_LIST_ID) + else: + self.setFocusId(self.SERVER_BUTTON_ID) + + def showHubs(self, section=None, update=False): + self.setBoolProperty('no.content', False) + if not update: + self.setProperty('drawing', '1') + try: + self._showHubs(section=section, update=update) + finally: + self.setProperty('drawing', '') + + def _showHubs(self, section=None, update=False): + if not update: + self.clearHubs() + + if not plexapp.SERVERMANAGER.selectedServer.hasHubs(): + return + + if section.key is False: + self.showBusy(False) + return + + self.showBusy(True) + + hubs = self.sectionHubs.get(section.key) + if hubs is False: + self.showBusy(False) + self.setBoolProperty('no.content', True) + return + + if not hubs: + for task in self.tasks: + if task.section == section: + backgroundthread.BGThreader.moveToFront(task) + break + + if section.type != "home": + self.showBusy(False) + self.setBoolProperty('no.content', True) + return + + if time.time() - hubs.lastUpdated > HUBS_REFRESH_INTERVAL: + util.DEBUG_LOG('Section is stale: REFRESHING - update: {0}'.format(update)) + hubs.lastUpdated = time.time() + self.cleanTasks() + if not update: + if section.key in self.sectionHubs: + self.sectionHubs[section.key] = None + self.tasks.append(SectionHubsTask().setup(section, self.sectionHubsCallback)) + backgroundthread.BGThreader.addTask(self.tasks[-1]) + return + + util.DEBUG_LOG('Showing hubs - Section: {0} - Update: {1}'.format(section.key, update)) + try: + hasContent = False + skip = {} + for hub in hubs: + identifier = hub.getCleanHubIdentifier() + + if identifier not in self.HUBMAP: + util.DEBUG_LOG('UNHANDLED - Hub: {0} [{1}]({2})'.format(hub.hubIdentifier, identifier, len(hub.items))) + continue + + skip[self.HUBMAP[identifier]['index']] = 1 + + if self.showHub(hub): + if hub.items: + hasContent = True + if self.HUBMAP[identifier].get('do_updates'): + self.updateHubs[identifier] = hub + + if not hasContent: + self.setBoolProperty('no.content', True) + + lastSkip = 0 + if skip: + lastSkip = min(skip.keys()) + + focus = None + if update: + for i, control in enumerate(self.hubControls): + if i in skip: + lastSkip = i + continue + if self.getFocusId() == control.getId(): + focus = lastSkip + control.reset() + + if focus is not None: + self.setFocusId(focus) + finally: + self.showBusy(False) + + def showHub(self, hub, items=None): + identifier = hub.getCleanHubIdentifier() + + if identifier in self.HUBMAP: + util.DEBUG_LOG('HUB: {0} [{1}]({2}, {3})'.format(hub.hubIdentifier, + identifier, + len(hub.items), + len(items) if items else None)) + self._showHub(hub, hubitems=items, **self.HUBMAP[identifier]) + return True + else: + util.DEBUG_LOG('UNHANDLED - Hub: {0} [{1}]({1})'.format(hub.hubIdentifier, identifier, len(hub.items))) + return + + def createGrandparentedListItem(self, obj, thumb_w, thumb_h, with_grandparent_title=False): + if with_grandparent_title and obj.get('grandparentTitle') and obj.title: + title = u'{0} - {1}'.format(obj.grandparentTitle, obj.title) + else: + title = obj.get('grandparentTitle') or obj.get('parentTitle') or obj.title or '' + mli = kodigui.ManagedListItem(title, thumbnailImage=obj.defaultThumb.asTranscodedImageURL(thumb_w, thumb_h), data_source=obj) + return mli + + def createParentedListItem(self, obj, thumb_w, thumb_h, with_parent_title=False): + if with_parent_title and obj.parentTitle and obj.title: + title = u'{0} - {1}'.format(obj.parentTitle, obj.title) + else: + title = obj.parentTitle or obj.title or '' + mli = kodigui.ManagedListItem(title, thumbnailImage=obj.defaultThumb.asTranscodedImageURL(thumb_w, thumb_h), data_source=obj) + return mli + + def createSimpleListItem(self, obj, thumb_w, thumb_h): + mli = kodigui.ManagedListItem(obj.title or '', thumbnailImage=obj.defaultThumb.asTranscodedImageURL(thumb_w, thumb_h), data_source=obj) + return mli + + def createEpisodeListItem(self, obj, wide=False): + mli = self.createGrandparentedListItem(obj, *self.THUMB_POSTER_DIM) + if obj.index: + subtitle = u'{0}{1} \u2022 {2}{3}'.format(T(32310, 'S'), obj.parentIndex, T(32311, 'E'), obj.index) + else: + subtitle = obj.originallyAvailableAt.asDatetime('%m/%d/%y') + + if wide: + mli.setLabel2(u'{0} - {1}'.format(util.shortenText(obj.title, 35), subtitle)) + else: + mli.setLabel2(subtitle) + + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/show.png') + if not obj.isWatched: + mli.setProperty('unwatched', '1') + return mli + + def createSeasonListItem(self, obj, wide=False): + mli = self.createParentedListItem(obj, *self.THUMB_POSTER_DIM) + # mli.setLabel2('Season {0}'.format(obj.index)) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/show.png') + if not obj.isWatched: + mli.setProperty('unwatched.count', str(obj.unViewedLeafCount)) + return mli + + def createMovieListItem(self, obj, wide=False): + mli = kodigui.ManagedListItem(obj.defaultTitle, obj.year, thumbnailImage=obj.defaultThumb.asTranscodedImageURL(*self.THUMB_POSTER_DIM), data_source=obj) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/movie.png') + if not obj.isWatched: + mli.setProperty('unwatched', '1') + return mli + + def createShowListItem(self, obj, wide=False): + mli = self.createSimpleListItem(obj, *self.THUMB_POSTER_DIM) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/show.png') + if not obj.isWatched: + mli.setProperty('unwatched.count', str(obj.unViewedLeafCount)) + return mli + + def createAlbumListItem(self, obj, wide=False): + mli = self.createParentedListItem(obj, *self.THUMB_SQUARE_DIM) + mli.setLabel2(obj.title) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/music.png') + return mli + + def createTrackListItem(self, obj, wide=False): + mli = self.createGrandparentedListItem(obj, *self.THUMB_SQUARE_DIM) + mli.setLabel2(obj.title) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/music.png') + return mli + + def createPhotoListItem(self, obj, wide=False): + mli = self.createSimpleListItem(obj, *self.THUMB_SQUARE_DIM) + if obj.type == 'photo': + mli.setLabel2(obj.originallyAvailableAt.asDatetime('%d %B %Y')) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/photo.png') + return mli + + def createClipListItem(self, obj, wide=False): + mli = self.createGrandparentedListItem(obj, *self.THUMB_AR16X9_DIM, with_grandparent_title=True) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/movie16x9.png') + return mli + + def createArtistListItem(self, obj, wide=False): + mli = self.createSimpleListItem(obj, *self.THUMB_SQUARE_DIM) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/music.png') + return mli + + def createPlaylistListItem(self, obj, wide=False): + if obj.playlistType == 'audio': + w, h = self.THUMB_SQUARE_DIM + thumb = obj.buildComposite(width=w, height=h, media='thumb') + else: + w, h = self.THUMB_AR16X9_DIM + thumb = obj.buildComposite(width=w, height=h, media='art') + + mli = kodigui.ManagedListItem( + obj.title or '', + util.durationToText(obj.duration.asInt()), + # thumbnailImage=obj.composite.asTranscodedImageURL(*self.THUMB_DIMS[obj.playlistType]['item.thumb']), + thumbnailImage=thumb, + data_source=obj + ) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/{0}.png'.format(obj.playlistType == 'audio' and 'music' or 'movie')) + return mli + + def unhandledHub(self, self2, obj, wide=False): + util.DEBUG_LOG('Unhandled Hub item: {0}'.format(obj.type)) + + CREATE_LI_MAP = { + 'episode': createEpisodeListItem, + 'season': createSeasonListItem, + 'movie': createMovieListItem, + 'show': createShowListItem, + 'album': createAlbumListItem, + 'track': createTrackListItem, + 'photo': createPhotoListItem, + 'photodirectory': createPhotoListItem, + 'clip': createClipListItem, + 'artist': createArtistListItem, + 'playlist': createPlaylistListItem + } + + def createListItem(self, obj, wide=False): + return self.CREATE_LI_MAP.get(obj.type, self.unhandledHub)(self, obj, wide) + + def clearHubs(self): + for control in self.hubControls: + control.reset() + + def _showHub(self, hub, hubitems=None, index=None, with_progress=False, with_art=False, ar16x9=False, + text2lines=False, **kwargs): + control = self.hubControls[index] + control.dataSource = hub + + if not hub.items and not hubitems: + control.reset() + return + + if not hubitems: + hub.reset() + + self.setProperty('hub.4{0:02d}'.format(index), hub.title or kwargs.get('title')) + self.setProperty('hub.text2lines.4{0:02d}'.format(index), text2lines and '1' or '') + + items = [] + + for obj in hubitems or hub.items: + if not self.backgroundSet: + if self.updateBackgroundFrom(obj): + self.backgroundSet = True + mli = self.createListItem(obj, wide=with_art) + if mli: + items.append(mli) + + if with_progress: + for mli in items: + mli.setProperty('progress', util.getProgressImage(mli.dataSource)) + if with_art: + for mli in items: + thumb = (util.advancedSettings.continueUseThumb + and mli.dataSource.type == 'episode' + and mli.dataSource.thumb + ) \ + or mli.dataSource.art + mli.setThumbnailImage(thumb.asTranscodedImageURL(*self.THUMB_AR16X9_DIM)) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/movie16x9.png') + if ar16x9: + for mli in items: + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/movie16x9.png') + + if hub.more.asBool(): + end = kodigui.ManagedListItem('') + end.setBoolProperty('is.end', True) + items.append(end) + + if hubitems: + end = control.size() - 1 + control.replaceItem(end, items[0]) + control.addItems(items[1:]) + control.selectItem(end) + else: + control.replaceItems(items) + + def updateListItem(self, mli): + if not mli or not mli.dataSource: # May have become invalid + return + + obj = mli.dataSource + if obj.type in ('episode', 'movie'): + mli.setProperty('unwatched', not obj.isWatched and '1' or '') + elif obj.type in ('season', 'show', 'album'): + if obj.isWatched: + mli.setProperty('unwatched.count', '') + else: + mli.setProperty('unwatched.count', str(obj.unViewedLeafCount)) + + def sectionClicked(self): + item = self.sectionList.getSelectedItem() + if not item: + return + + section = item.dataSource + + if section.type in ('show', 'movie', 'artist', 'photo'): + self.processCommand(opener.sectionClicked(section)) + elif section.type in ('playlists',): + self.processCommand(opener.handleOpen(playlists.PlaylistsWindow)) + + def onNewServer(self, **kwargs): + self.showServers(from_refresh=True) + + def onRemoveServer(self, **kwargs): + self.onNewServer() + + def onReachableServer(self, server=None, **kwargs): + for mli in self.serverList: + if mli.uuid == server.uuid: + mli.unHookSignals() + mli.dataSource = server + mli.hookSignals() + mli.onUpdate() + return + else: + self.onNewServer() + + def onSelectedServerChange(self, **kwargs): + if self.serverRefresh(): + self.setFocusId(self.SECTION_LIST_ID) + self.changingServer = False + + def showServers(self, from_refresh=False, mouse=False): + with self.lock: + selection = None + if from_refresh: + mli = self.serverList.getSelectedItem() + if mli: + selection = mli.uuid + + servers = sorted( + plexapp.SERVERMANAGER.getServers(), + key=lambda x: (x.owned and '0' or '1') + x.name.lower() + ) + + items = [] + for s in servers: + item = ServerListItem(s.name, not s.owned and s.owner or '', data_source=s) + item.uuid = s.uuid + item.onUpdate() + item.setProperty('current', plexapp.SERVERMANAGER.selectedServer.uuid == s.uuid and '1' or '') + items.append(item) + + if len(items) > 1: + items[0].setProperty('first', '1') + elif items: + items[0].setProperty('only', '1') + + self.serverList.replaceItems(items) + + self.getControl(800).setHeight((min(len(items), 9) * 100) + 80) + + for item in items: + if item.dataSource != kodigui.DUMMY_DATA_SOURCE: + item.hookSignals() + + if selection: + for mli in self.serverList: + if mli.uuid == selection: + self.serverList.selectItem(mli.pos()) + + if not from_refresh and items and not mouse: + self.setFocusId(self.SERVER_LIST_ID) + + if not from_refresh: + plexapp.refreshResources() + + def selectServer(self): + if self._shuttingDown: + return + + mli = self.serverList.getSelectedItem() + if not mli: + return + + self.changingServer = True + + # this is broken + with busy.BusySignalContext(plexapp.util.APP, "change:selectedServer") as bc: + self.setFocusId(self.SECTION_LIST_ID) + + server = mli.dataSource + + # fixme: this might still trigger a dialog, re-triggering the previously opened windows + if not self._shuttingDown and not server.isReachable(): + if server.pendingReachabilityRequests > 0: + util.messageDialog(T(32339, 'Server is not accessible'), T(32340, 'Connection tests are in ' + 'progress. Please wait.')) + else: + util.messageDialog( + T(32339, 'Server is not accessible'), T(32341, 'Server is not accessible. Please sign into ' + 'your server and check your connection.') + ) + bc.ignoreSignal = True + return + + changed = plexapp.SERVERMANAGER.setSelectedServer(server, force=True) + if not changed: + bc.ignoreSignal = True + self.changingServer = False + + def showUserMenu(self, mouse=False): + items = [] + if plexapp.ACCOUNT.isSignedIn: + if len(plexapp.ACCOUNT.homeUsers) > 1: + items.append(kodigui.ManagedListItem(T(32342, 'Switch User'), data_source='switch')) + items.append(kodigui.ManagedListItem(T(32343, 'Settings'), data_source='settings')) + if plexapp.ACCOUNT.isSignedIn: + items.append(kodigui.ManagedListItem(T(32344, 'Sign Out'), data_source='signout')) + elif plexapp.ACCOUNT.isOffline: + items.append(kodigui.ManagedListItem(T(32459, 'Offline Mode'), data_source='go_online')) + else: + items.append(kodigui.ManagedListItem(T(32460, 'Sign In'), data_source='signin')) + + if len(items) > 1: + items[0].setProperty('first', '1') + items[-1].setProperty('last', '1') + else: + items[0].setProperty('only', '1') + + self.userList.reset() + self.userList.addItems(items) + + self.getControl(801).setHeight((len(items) * 66) + 80) + + if not mouse: + self.setFocusId(self.USER_LIST_ID) + + def doUserOption(self): + mli = self.userList.getSelectedItem() + if not mli: + return + + option = mli.dataSource + + self.setFocusId(self.USER_BUTTON_ID) + + if option == 'settings': + from . import settings + settings.openWindow() + elif option == 'go_online': + plexapp.ACCOUNT.refreshAccount() + else: + self.closeOption = option + self.doClose() + + def showAudioPlayer(self): + from . import musicplayer + self.processCommand(opener.handleOpen(musicplayer.MusicPlayerWindow)) + + def finished(self): + if self.tasks: + for task in self.tasks: + task.cancel() diff --git a/script.plexmod/lib/windows/info.py b/script.plexmod/lib/windows/info.py new file mode 100644 index 000000000..4c3374cd2 --- /dev/null +++ b/script.plexmod/lib/windows/info.py @@ -0,0 +1,149 @@ +from __future__ import absolute_import +from . import kodigui +from . import windowutils +from lib import util +from plexnet.video import Episode, Movie, Clip + +import os + + +def split2len(s, n): + def _f(s, n): + while s: + yield s[:n] + s = s[n:] + return list(_f(s, n)) + + +class InfoWindow(kodigui.ControlledWindow, windowutils.UtilMixin): + xmlFile = 'script-plex-info.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + PLAYER_STATUS_BUTTON_ID = 204 + + THUMB_DIM_POSTER = util.scaleResolution(519, 469) + THUMB_DIM_SQUARE = util.scaleResolution(519, 519) + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + self.title = kwargs.get('title') + self.subTitle = kwargs.get('sub_title') + self.thumb = kwargs.get('thumb') + self.thumbFallback = kwargs.get('thumb_fallback') + self.info = kwargs.get('info') + self.background = kwargs.get('background') + self.isSquare = kwargs.get('is_square') + self.is16x9 = kwargs.get('is_16x9') + self.isPoster = not (self.isSquare or self.is16x9) + self.thumbDim = self.isSquare and self.THUMB_DIM_SQUARE or self.THUMB_DIM_POSTER + self.video = kwargs.get('video') + + def getVideoInfo(self): + """ + Append media/part/stream info to summary + """ + if not isinstance(self.video, (Episode, Movie, Clip)): + return self.info + + summary = [self.info] + medias = self.video.media() + mediaCount = len(medias) + onlyOneMedia = mediaCount == 1 + partCount = sum(len(m.parts) for m in medias) + pcInfo = [] + if not onlyOneMedia: + pcInfo.append("Files: {}".format(mediaCount)) + if partCount > 1: + pcInfo.append("Parts: {}".format(partCount)) + pcInfoStr = ", ".join(pcInfo) + + addMedia = ["\n\n\n\nMedia{}\n".format(" ({})".format(pcInfoStr) if pcInfoStr else "")] + for media_ in medias: + if not media_.isAccessible(): + addMedia.append("Unavailable: {}\n\n".format(", ".join(os.path.basename(pf.file) for pf in media_.parts))) + continue + + for part in media_.parts: + if not part: + addMedia.append("Unavailable: {}".format(os.path.basename(part.file))) + continue + + addMedia.append("File: ") + splitFnAt = 74 + fnLen = len(os.path.basename(part.file)) + appended = False + for s in split2len(os.path.basename(part.file), splitFnAt): + if fnLen > splitFnAt and not appended: + addMedia.append("{}\n".format(s)) + appended = True + continue + addMedia.append("{}\n".format(s)) + addMedia.append("Duration: {}, Size: {}\n".format(util.durationToShortText(int(part.duration)), + util.simpleSize(int(part.size)))) + + subs = [] + subsOver = 0 + for stream in part.streams: + streamtype = stream.streamType.asInt() + # video + if streamtype == 1: + addMedia.append("Video: {}x{}, {} {}/{}bit/{}/{}@{} kBit, {} fps\n".format( + stream.width, stream.height, stream.videoCodecRendering, stream.codec.upper(), + stream.bitDepth, stream.chromaSubsampling, stream.colorPrimaries, stream.bitrate, + stream.frameRate)) + # audio + elif streamtype == 2: + addMedia.append("Audio: {}{}, {}/{}ch@{} kBit, {} Hz\n".format( + stream.language, + " (default)" if stream.default else "", + stream.codec.upper(), + stream.channels, stream.bitrate, + stream.samplingRate)) + # subtitle + elif streamtype == 3: + if len(subs) > 4: + subsOver += 1 + continue + subs.append("{} ({})".format(stream.language, stream.codec.upper())) + + if subs: + addMedia.append("Subtitles: {}{}\n".format(", ".join(subs), + subsOver and " (+{})".format(subsOver) or '')) + if not onlyOneMedia: + addMedia.append("--------------\n") + + chapters = [] + chOver = 0 + for index, chapter in enumerate(self.video.chapters): + if len(chapters) > 4: + chOver += 1 + continue + chapters.append(chapter.tag or "Chapter #{}".format(str(index+1))) + + if chapters: + addMedia.append("Chapters: {}{}\n".format(", ".join(chapters), chOver and " (+{})".format(chOver) or '')) + + if self.video.markers: + addMedia.append("Markers: {}".format(", ".join(name for off, name in sorted( + (int(marker.startTimeOffset), marker.type) for marker in self.video.markers)))) + + return "".join(summary + addMedia) + + def onFirstInit(self): + self.setProperty('is.poster', self.isPoster and '1' or '') + self.setProperty('is.square', self.isSquare and '1' or '') + self.setProperty('is.16x9', self.is16x9 and '1' or '') + self.setProperty('title.main', self.title) + self.setProperty('title.sub', self.subTitle) + self.setProperty('thumb.fallback', self.thumbFallback) + self.setProperty('thumb', self.thumb.asTranscodedImageURL(*self.thumbDim)) + self.setProperty('info', self.getVideoInfo()) + self.setProperty('background', self.background) + + def onClick(self, controlID): + if controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() diff --git a/script.plexmod/lib/windows/kodigui.py b/script.plexmod/lib/windows/kodigui.py new file mode 100644 index 000000000..379633920 --- /dev/null +++ b/script.plexmod/lib/windows/kodigui.py @@ -0,0 +1,1105 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +import time +import threading +import traceback +from six.moves import range +from six.moves import zip +from .. import util + +MONITOR = None + + +class BaseFunctions: + xmlFile = '' + path = '' + theme = '' + res = '720p' + width = 1280 + height = 720 + + usesGenerate = False + lastWinID = None + lastDialogID = None + + def __init__(self): + self.isOpen = True + + def onWindowFocus(self): + # Not automatically called. Can be used by an external window manager + pass + + def onClosed(self): + pass + + @classmethod + def open(cls, **kwargs): + window = cls(cls.xmlFile, cls.path, cls.theme, cls.res, **kwargs) + window.modal() + return window + + @classmethod + def create(cls, show=True, **kwargs): + window = cls(cls.xmlFile, cls.path, cls.theme, cls.res, **kwargs) + if show: + window.show() + if xbmcgui.getCurrentWindowId() < 13000: + window.isOpen = False + return window + + window.isOpen = xbmcgui.getCurrentWindowId() >= 13000 + return window + + def modal(self): + self.isOpen = True + try: + self.doModal() + except SystemExit: + pass + self.onClosed() + self.isOpen = False + + def activate(self): + if not self._winID: + self._winID = xbmcgui.getCurrentWindowId() + xbmc.executebuiltin('ReplaceWindow({0})'.format(self._winID)) + + def mouseXTrans(self, val): + return int((val / self.getWidth()) * self.width) + + def mouseYTrans(self, val): + return int((val / self.getHeight()) * self.height) + + def closing(self): + return self._closing + + @classmethod + def generate(self): + return None + + def setProperties(self, prop_list, val_list_or_val): + if isinstance(val_list_or_val, list) or isinstance(val_list_or_val, tuple): + val_list = val_list_or_val + else: + val_list = [val_list_or_val] * len(prop_list) + + for prop, val in zip(prop_list, val_list): + self.setProperty(prop, val) + + def propertyContext(self, prop, val='1'): + return WindowProperty(self, prop, val) + + def setBoolProperty(self, key, boolean): + self.setProperty(key, boolean and '1' or '') + + +LAST_BG_URL = None + + +class BaseWindow(xbmcgui.WindowXML, BaseFunctions): + def __init__(self, *args, **kwargs): + BaseFunctions.__init__(self) + self._closing = False + self._winID = None + self.started = False + self.finishedInit = False + + def onInit(self): + global LAST_BG_URL + self._winID = xbmcgui.getCurrentWindowId() + BaseFunctions.lastWinID = self._winID + self.setProperty('use_solid_background', util.hasCustomBGColour and '1' or '') + if util.hasCustomBGColour: + bgColour = util.advancedSettings.backgroundColour if util.advancedSettings.backgroundColour != "-" \ + else "ff000000" + self.setProperty('background_colour', "0x%s" % bgColour.lower()) + self.setProperty('background_colour_opaque', "0x%s" % bgColour.lower()) + else: + # set background color to 0 to avoid kodi UI BG clearing, improves performance + if util.advancedSettings.dbgCrossfade: + self.setProperty('background_colour', "0x00000000") + else: + self.setProperty('background_colour', "0xff111111") + self.setProperty('background_colour_opaque', "0xff111111") + + self.setBoolProperty('use_bg_fallback', util.advancedSettings.useBgFallback) + + try: + if self.started: + self.onReInit() + else: + self.started = True + if LAST_BG_URL: + self.windowSetBackground(LAST_BG_URL) + self.onFirstInit() + self.finishedInit = True + except util.NoDataException: + self.exitCommand = "NODATA" + self.doClose() + + def onFirstInit(self): + pass + + def onReInit(self): + pass + + def setProperty(self, key, value): + if self._closing: + return + + if not self._winID: + self._winID = xbmcgui.getCurrentWindowId() + + try: + xbmcgui.Window(self._winID).setProperty(key, value) + xbmcgui.WindowXML.setProperty(self, key, value) + except RuntimeError: + xbmc.log('kodigui.BaseWindow.setProperty: Missing window', xbmc.LOGDEBUG) + + def updateBackgroundFrom(self, ds): + if util.advancedSettings.dynamicBackgrounds: + return self.windowSetBackground(util.backgroundFromArt(ds.art, width=self.width, + height=self.height)) + + def windowSetBackground(self, value): + if not util.advancedSettings.dbgCrossfade: + if not value: + return + self.setProperty("background_static", value) + return value + + global LAST_BG_URL + + if not value: + if LAST_BG_URL: + self.setProperty("background_static", LAST_BG_URL) + return LAST_BG_URL + return + + cur1 = self.getProperty('background') + if not cur1: + self.setProperty("background_static", value) + self.setProperty("background", value) + + elif LAST_BG_URL != value: + self.setProperty("background_static", LAST_BG_URL) + self.setProperty("background", value) + + LAST_BG_URL = value + return value + + def doClose(self): + if not self.isOpen: + return + self._closing = True + self.isOpen = False + self.close() + + def show(self): + self._closing = False + #self.isOpen = True + xbmcgui.WindowXML.show(self) + self.isOpen = xbmcgui.getCurrentWindowId() >= 13000 + + def onClosed(self): + pass + + +class BaseDialog(xbmcgui.WindowXMLDialog, BaseFunctions): + def __init__(self, *args, **kwargs): + BaseFunctions.__init__(self) + self._closing = False + self._winID = '' + self.started = False + + def onInit(self): + self._winID = xbmcgui.getCurrentWindowDialogId() + BaseFunctions.lastDialogID = self._winID + if self.started: + self.onReInit() + else: + self.started = True + self.onFirstInit() + + def onFirstInit(self): + pass + + def onReInit(self): + pass + + def setProperty(self, key, value): + if self._closing: + return + + if not self._winID: + self._winID = xbmcgui.getCurrentWindowId() + + try: + xbmcgui.Window(self._winID).setProperty(key, value) + xbmcgui.WindowXMLDialog.setProperty(self, key, value) + except RuntimeError: + xbmc.log('kodigui.BaseDialog.setProperty: Missing window', xbmc.LOGDEBUG) + + def doClose(self): + self._closing = True + self.close() + self.isOpen = False + + def show(self): + self._closing = False + xbmcgui.WindowXMLDialog.show(self) + self.isOpen = True + + def onClosed(self): + pass + + +class ControlledBase: + def doModal(self): + self.show() + self.wait() + + def wait(self): + while not self._closing and not MONITOR.waitForAbort(0.1): + pass + + def close(self): + self._closing = True + + +class ControlledWindow(ControlledBase, BaseWindow): + def onAction(self, action): + try: + if action in (xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK): + self.doClose() + return + except: + traceback.print_exc() + + BaseWindow.onAction(self, action) + + +class ControlledDialog(ControlledBase, BaseDialog): + def onAction(self, action): + try: + if action in (xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK): + self.doClose() + return + except: + traceback.print_exc() + + BaseDialog.onAction(self, action) + + +DUMMY_LIST_ITEM = xbmcgui.ListItem() + + +class DummyDataSource(object): + def __nonzero__(self): + return False + + __bool__ = __nonzero__ + + def exists(self): + return False + + +DUMMY_DATA_SOURCE = DummyDataSource() + + +class ManagedListItem(object): + def __init__(self, label='', label2='', iconImage='', thumbnailImage='', path='', data_source=None, properties=None): + self._listItem = xbmcgui.ListItem(label, label2, path=path) + self._listItem.setArt({"thumb": thumbnailImage, "icon": iconImage}) + self.dataSource = data_source + self.properties = {} + self.label = label + self.label2 = label2 + self.iconImage = iconImage + self.thumbnailImage = thumbnailImage + self.path = path + self._ID = None + self._manager = None + self._valid = True + if properties: + for k, v in properties.items(): + self.setProperty(k, v) + + def __nonzero__(self): + return self._valid + + @property + def listItem(self): + if not self._listItem: + if not self._manager: + return None + + try: + self._listItem = self._manager.getListItemFromManagedItem(self) + except RuntimeError: + return None + + return self._listItem + + def invalidate(self): + self._valid = False + self._listItem = DUMMY_LIST_ITEM + self.dataSource = DUMMY_DATA_SOURCE + + def _takeListItem(self, manager, lid): + self._manager = manager + self._ID = lid + self._listItem.setProperty('__ID__', lid) + li = self._listItem + self._listItem = None + self._manager._properties.update(self.properties) + return li + + def _updateListItem(self): + self.listItem.setProperty('__ID__', self._ID) + self.listItem.setLabel(self.label) + self.listItem.setLabel2(self.label2) + self.listItem.setArt({"thumb": self.thumbnailImage, "icon": self.iconImage}) + self.listItem.setPath(self.path) + for k in self._manager._properties.keys(): + self.listItem.setProperty(k, self.properties.get(k) or '') + + def clear(self): + self.label = '' + self.label2 = '' + self.iconImage = '' + self.thumbnailImage = '' + self.path = '' + for k in self.properties: + self.properties[k] = '' + self._updateListItem() + + def pos(self): + if not self._manager: + return None + return self._manager.getManagedItemPosition(self) + + def addContextMenuItems(self, items, replaceItems=False): + self.listItem.addContextMenuItems(items, replaceItems) + + def addStreamInfo(self, stype, values): + self.listItem.addStreamInfo(stype, values) + + def getLabel(self): + return self.label + + def getLabel2(self): + return self.label2 + + def getProperty(self, key): + return self.properties.get(key, '') + + def getdescription(self): + return self.listItem.getdescription() + + def getduration(self): + return self.listItem.getduration() + + def getfilename(self): + return self.listItem.getfilename() + + def isSelected(self): + return self.listItem.isSelected() + + def select(self, selected): + return self.listItem.select(selected) + + def setArt(self, values): + return self.listItem.setArt(values) + + def setIconImage(self, icon): + self.iconImage = icon + return self.listItem.setArt({"icon": self.iconImage}) + + def setInfo(self, itype, infoLabels): + return self.listItem.setInfo(itype, infoLabels) + + def setLabel(self, label): + self.label = label + return self.listItem.setLabel(label) + + def setLabel2(self, label): + self.label2 = label + return self.listItem.setLabel2(label) + + def setMimeType(self, mimetype): + return self.listItem.setMimeType(mimetype) + + def setPath(self, path): + self.path = path + return self.listItem.setPath(path) + + def setProperty(self, key, value): + if self._manager: + self._manager._properties[key] = 1 + self.properties[key] = value + self.listItem.setProperty(key, value) + return self + + def setBoolProperty(self, key, boolean): + return self.setProperty(key, boolean and '1' or '') + + def setSubtitles(self, subtitles): + return self.listItem.setSubtitles(subtitles) # List of strings - HELIX + + def setThumbnailImage(self, thumb): + self.thumbnailImage = thumb + return self.listItem.setArt({"thumb": self.thumbnailImage}) + + def onDestroy(self): + pass + + +class ManagedControlList(object): + def __init__(self, window, control_id, max_view_index, data_source=None): + self.controlID = control_id + self.control = window.getControl(control_id) + self.items = [] + self._sortKey = None + self._idCounter = 0 + self._maxViewIndex = max_view_index + self._properties = {} + self.dataSource = data_source + + def __getattr__(self, name): + return getattr(self.control, name) + + def __getitem__(self, idx): + if isinstance(idx, slice): + return self.items[idx] + else: + return self.getListItem(idx) + + def __iter__(self): + for i in self.items: + yield i + + def __len__(self): + return self.size() + + def _updateItems(self, bottom=None, top=None): + if bottom is None: + bottom = 0 + top = self.size() + + try: + for idx in range(bottom, top): + try: + li = self.control.getListItem(idx) + except RuntimeError: + continue + + mli = self.items[idx] + self._properties.update(mli.properties) + mli._manager = self + mli._listItem = li + mli._updateListItem() + mli.setProperty('index', str(idx)) + except RuntimeError: + #xbmc.log('kodigui.ManagedControlList._updateItems: Runtime error', xbmc.LOGINFO) + util.ERROR('kodigui.ManagedControlList._updateItems: Runtime error') + return False + + return True + + def _nextID(self): + self._idCounter += 1 + return str(self._idCounter) + + def reInit(self, window, control_id): + self.controlID = control_id + self.control = window.getControl(control_id) + self.control.addItems([i._takeListItem(self, self._nextID()) for i in self.items]) + + def setSort(self, sort): + self._sortKey = sort + + def addItem(self, managed_item): + self.items.append(managed_item) + self.control.addItem(managed_item._takeListItem(self, self._nextID())) + + def addItems(self, managed_items): + self.items += managed_items + self.control.addItems([i._takeListItem(self, self._nextID()) for i in managed_items]) + + def replaceItem(self, pos, mli): + self[pos].onDestroy() + self[pos].invalidate() + self.items[pos] = mli + li = self.control.getListItem(pos) + mli._manager = self + mli._listItem = li + mli._updateListItem() + + def replaceItems(self, managed_items): + if not self.items: + self.addItems(managed_items) + return True + + oldSize = self.size() + + for i in self.items: + i.onDestroy() + i.invalidate() + + self.items = managed_items + size = self.size() + if size != oldSize: + pos = self.getSelectedPosition() + + if size > oldSize: + for i in range(0, size - oldSize): + self.control.addItem(xbmcgui.ListItem()) + elif size < oldSize: + diff = oldSize - size + idx = oldSize - 1 + while diff: + self.control.removeItem(idx) + idx -= 1 + diff -= 1 + + if self.positionIsValid(pos): + self.selectItem(pos) + elif pos >= size: + self.selectItem(size - 1) + + return self._updateItems(0, self.size()) + + def getListItem(self, pos): + li = self.control.getListItem(pos) + mli = self.items[pos] + mli._listItem = li + return mli + + def getListItemByDataSource(self, data_source): + for mli in self: + if data_source == mli.dataSource: + return mli + return None + + def getSelectedItem(self): + pos = self.control.getSelectedPosition() + if not self.positionIsValid(pos): + pos = self.size() - 1 + + if pos < 0: + return None + return self.getListItem(pos) + + def setSelectedItemByPos(self, pos): + if self.positionIsValid(pos): + self.control.selectItem(pos) + + def removeItem(self, index): + old = self.items.pop(index) + old.onDestroy() + old.invalidate() + + self.control.removeItem(index) + top = self.control.size() - 1 + if top < 0: + return + if top < index: + index = top + self.control.selectItem(index) + + def removeManagedItem(self, mli): + self.removeItem(mli.pos()) + + def insertItem(self, index, managed_item): + pos = self.getSelectedPosition() + 1 + + if index >= self.size() or index < 0: + self.addItem(managed_item) + else: + self.items.insert(index, managed_item) + self.control.addItem(managed_item._takeListItem(self, self._nextID())) + self._updateItems(index, self.size()) + + if self.positionIsValid(pos): + self.selectItem(pos) + + def moveItem(self, mli, dest_idx): + source_idx = mli.pos() + if source_idx < dest_idx: + rstart = source_idx + rend = dest_idx + 1 + # dest_idx-=1 + else: + rstart = dest_idx + rend = source_idx + 1 + mli = self.items.pop(source_idx) + self.items.insert(dest_idx, mli) + + self._updateItems(rstart, rend) + + def swapItems(self, pos1, pos2): + if not self.positionIsValid(pos1) or not self.positionIsValid(pos2): + return False + + item1 = self.items[pos1] + item2 = self.items[pos2] + li1 = item1._listItem + li2 = item2._listItem + item1._listItem = li2 + item2._listItem = li1 + + item1._updateListItem() + item2._updateListItem() + self.items[pos1] = item2 + self.items[pos2] = item1 + + return True + + def shiftView(self, shift, hold_selected=False): + if not self._maxViewIndex: + return + selected = self.getSelectedItem() + selectedPos = selected.pos() + viewPos = self.getViewPosition() + + if shift > 0: + pushPos = selectedPos + (self._maxViewIndex - viewPos) + shift + if pushPos >= self.size(): + pushPos = self.size() - 1 + self.selectItem(pushPos) + newViewPos = self._maxViewIndex + elif shift < 0: + pushPos = (selectedPos - viewPos) + shift + if pushPos < 0: + pushPos = 0 + self.selectItem(pushPos) + newViewPos = 0 + + if hold_selected: + self.selectItem(selected.pos()) + else: + diff = newViewPos - viewPos + fix = pushPos - diff + # print '{0} {1} {2}'.format(newViewPos, viewPos, fix) + if self.positionIsValid(fix): + self.selectItem(fix) + + def reset(self): + self.dataSource = None + for i in self.items: + i.onDestroy() + i.invalidate() + self.items = [] + self.control.reset() + + def size(self): + return len(self.items) + + def getViewPosition(self): + try: + return int(xbmc.getInfoLabel('Container({0}).Position'.format(self.controlID))) + except: + return 0 + + def getViewRange(self): + viewPosition = self.getViewPosition() + selected = self.getSelectedPosition() + return list(range(max(selected - viewPosition, 0), min(selected + (self._maxViewIndex - viewPosition) + 1, self.size() - 1))) + + def positionIsValid(self, pos): + return 0 <= pos < self.size() + + def sort(self, sort=None, reverse=False): + sort = sort or self._sortKey + + self.items.sort(key=sort, reverse=reverse) + + self._updateItems(0, self.size()) + + def reverse(self): + self.items.reverse() + self._updateItems(0, self.size()) + + def getManagedItemPosition(self, mli): + return self.items.index(mli) + + def isLastItem(self, mli=None): + return self.getManagedItemPosition(mli or self.getSelectedItem()) + 1 == len(self) + + def getListItemFromManagedItem(self, mli): + pos = self.items.index(mli) + return self.control.getListItem(pos) + + def topHasFocus(self): + return self.getSelectedPosition() == 0 + + def bottomHasFocus(self): + return self.getSelectedPosition() == self.size() - 1 + + def invalidate(self): + for item in self.items: + item._listItem = DUMMY_LIST_ITEM + + def newControl(self, window=None, control_id=None): + self.controlID = control_id or self.controlID + self.control = window.getControl(self.controlID) + self.control.addItems([xbmcgui.ListItem() for i in range(self.size())]) + self._updateItems() + + +class _MWBackground(ControlledWindow): + def __init__(self, *args, **kwargs): + self._multiWindow = kwargs.get('multi_window') + self.started = False + BaseWindow.__init__(self, *args, **kwargs) + + def onInit(self): + if self.started: + return + self.started = True + self._multiWindow._open() + self.close() + + +class MultiWindow(object): + def __init__(self, windows=None, default_window=None, **kwargs): + self._windows = windows + self._next = default_window or self._windows[0] + self._properties = {} + self._current = None + self._allClosed = False + self.exitCommand = None + + def __getattr__(self, name): + return getattr(self._current, name) + + def setWindows(self, windows): + self._windows = windows + + def setDefault(self, default): + self._next = default or self._windows[0] + + def windowIndex(self, window): + if hasattr(window, 'MULTI_WINDOW_ID'): + for i, w in enumerate(self._windows): + if window.MULTI_WINDOW_ID == w.MULTI_WINDOW_ID: + return i + return 0 + else: + return self._windows.index(window.__class__) + + def nextWindow(self, window=None): + if window is False: + window = self._windows[self.windowIndex(self._current)] + + if window: + if window.__class__ == self._current.__class__: + return None + else: + idx = self.windowIndex(self._current) + idx += 1 + if idx >= len(self._windows): + idx = 0 + window = self._windows[idx] + + self._next = window + self._current.doClose() + return self._next + + def _setupCurrent(self, cls): + self._current = cls(cls.xmlFile, cls.path, cls.theme, cls.res) + self._current.onFirstInit = self._onFirstInit + self._current.onReInit = self.onReInit + self._current.onClick = self.onClick + self._current.onFocus = self.onFocus + + self._currentOnAction = self._current.onAction + self._current.onAction = self.onAction + + @classmethod + def open(cls, **kwargs): + mw = cls(**kwargs) + b = _MWBackground(mw.bgXML, mw.path, mw.theme, mw.res, multi_window=mw) + b.modal() + del b + import gc + gc.collect(2) + return mw + + def _open(self): + while not MONITOR.abortRequested() and not self._allClosed: + self._setupCurrent(self._next) + self._current.modal() + + self._current.doClose() + del self._current + del self._next + del self._currentOnAction + + def setProperty(self, key, value): + self._properties[key] = value + self._current.setProperty(key, value) + + def _onFirstInit(self): + for k, v in self._properties.items(): + self._current.setProperty(k, v) + self.onFirstInit() + + def doClose(self): + self._allClosed = True + self._current.doClose() + + def onFirstInit(self): + pass + + def onReInit(self): + pass + + def onAction(self, action): + if action == xbmcgui.ACTION_PREVIOUS_MENU or action == xbmcgui.ACTION_NAV_BACK: + self.doClose() + self._currentOnAction(action) + + def onClick(self, controlID): + pass + + def onFocus(self, controlID): + pass + + +class SafeControlEdit(object): + CHARS_LOWER = 'abcdefghijklmnopqrstuvwxyz' + CHARS_UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + CHARS_NUMBERS = '0123456789' + CURSOR = '[COLOR FFCC7B19]|[/COLOR]' + + def __init__(self, control_id, label_id, window, key_callback=None, grab_focus=False): + self.controlID = control_id + self.labelID = label_id + self._win = window + self._keyCallback = key_callback + self.grabFocus = grab_focus + self._text = '' + self._compatibleMode = False + self.setup() + + def setup(self): + self._labelControl = self._win.getControl(self.labelID) + self._winOnAction = self._win.onAction + self._win.onAction = self.onAction + self.updateLabel() + + def setCompatibleMode(self, on): + self._compatibleMode = on + + def onAction(self, action): + try: + controlID = self._win.getFocusId() + if controlID == self.controlID: + if self.processAction(action.getId()): + return + elif self.grabFocus: + if self.processOffControlAction(action.getButtonCode()): + self._win.setFocusId(self.controlID) + return + except: + traceback.print_exc() + + self._winOnAction(action) + + def processAction(self, action_id): + if not self._compatibleMode: + oldVal = self._text + self._text = self._win.getControl(self.controlID).getText() + + if self._keyCallback: + self._keyCallback(action_id, oldVal, self._text) + + self.updateLabel() + + return True + oldVal = self.getText() + + if 61793 <= action_id <= 61818: # Lowercase + self.processChar(self.CHARS_LOWER[action_id - 61793]) + elif 61761 <= action_id <= 61786: # Uppercase + self.processChar(self.CHARS_UPPER[action_id - 61761]) + elif 61744 <= action_id <= 61753: + self.processChar(self.CHARS_NUMBERS[action_id - 61744]) + elif action_id == 61728: # Space + self.processChar(' ') + elif action_id == 61448: + self.delete() + else: + return False + + if self._keyCallback: + self._keyCallback(action_id, oldVal, self.getText()) + + return True + + def processOffControlAction(self, action_id): + oldVal = self.getText() if self._compatibleMode else self._text + if 61505 <= action_id <= 61530: # Lowercase + self.processChar(self.CHARS_LOWER[action_id - 61505]) + elif 192577 <= action_id <= 192602: # Uppercase + self.processChar(self.CHARS_UPPER[action_id - 192577]) + elif 61488 <= action_id <= 61497: + self.processChar(self.CHARS_NUMBERS[action_id - 61488]) + elif 61552 <= action_id <= 61561: + self.processChar(self.CHARS_NUMBERS[action_id - 61552]) + elif action_id == 61472: # Space + self.processChar(' ') + else: + return False + + if self._keyCallback: + self._keyCallback(action_id, oldVal, self.getText()) + + return True + + def _setText(self, text): + self._text = text + + if not self._compatibleMode: + self._win.getControl(self.controlID).setText(text) + self.updateLabel() + + def _getText(self): + if not self._compatibleMode and self._win.getFocusId() == self.controlID: + return self._win.getControl(self.controlID).getText() + else: + return self._text + + def updateLabel(self): + self._labelControl.setLabel(self._getText() + self.CURSOR) + + def processChar(self, char): + self._setText(self.getText() + char) + + def setText(self, text): + self._setText(text) + + def getText(self): + return self._getText() + + def append(self, text): + self._setText(self.getText() + text) + + def delete(self): + self._setText(self.getText()[:-1]) + + +class PropertyTimer(): + def __init__(self, window_id, timeout, property_, value='', init_value='1', addon_id=None, callback=None): + self._winID = window_id + self._timeout = timeout + self._property = property_ + self._value = value + self._initValue = init_value + self._endTime = 0 + self._thread = None + self._addonID = addon_id + self._closeWin = None + self._closed = False + self._callback = callback + + def _onTimeout(self): + self._endTime = 0 + xbmcgui.Window(self._winID).setProperty(self._property, self._value) + if self._addonID: + xbmcgui.Window(10000).setProperty('{0}.{1}'.format(self._addonID, self._property), self._value) + if self._closeWin: + self._closeWin.doClose() + if self._callback: + self._callback() + + def _wait(self): + while not MONITOR.abortRequested() and time.time() < self._endTime: + xbmc.sleep(100) + if MONITOR.abortRequested(): + return + if self._endTime == 0: + return + self._onTimeout() + + def _stopped(self): + return not self._thread or not self._thread.is_alive() + + def _reset(self): + self._endTime = time.time() + self._timeout + + def _start(self): + self.init(self._initValue) + self._thread = threading.Thread(target=self._wait) + self._thread.start() + + def stop(self, trigger=False): + self._endTime = trigger and 1 or 0 + if not self._stopped(): + self._thread.join() + + def close(self): + self._closed = True + self.stop() + + def init(self, val): + if val is False: + return + elif val is None: + val = self._initValue + + xbmcgui.Window(self._winID).setProperty(self._property, val) + if self._addonID: + xbmcgui.Window(10000).setProperty('{0}.{1}'.format(self._addonID, self._property), val) + + def reset(self, close_win=None, init=None): + self.init(init) + + if self._closed: + return + + if not self._timeout: + return + + self._closeWin = close_win + self._reset() + + if self._stopped: + self._start() + + +class WindowProperty(): + def __init__(self, win, prop, val='1', end=None): + self.win = win + self.prop = prop + self.val = val + self.end = end + self.old = self.win.getProperty(self.prop) + + def __enter__(self): + self.win.setProperty(self.prop, self.val) + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.win.setProperty(self.prop, self.end or self.old) + + +class GlobalProperty(): + def __init__(self, prop, val='1', end=None): + from kodi_six import xbmcaddon + self._addonID = xbmcaddon.Addon().getAddonInfo('id') + self.prop = prop + self.val = val + self.end = end + self.old = xbmc.getInfoLabel('Window(10000).Property({0}}.{1})'.format(self._addonID, prop)) + + def __enter__(self): + xbmcgui.Window(10000).setProperty('{0}.{1}'.format(self._addonID, self.prop), self.val) + return self + + def __exit__(self, exc_type, exc_value, traceback): + xbmcgui.Window(10000).setProperty('{0}.{1}'.format(self._addonID, self.prop), self.end or self.old) diff --git a/script.plexmod/lib/windows/library.py b/script.plexmod/lib/windows/library.py new file mode 100644 index 000000000..62245203a --- /dev/null +++ b/script.plexmod/lib/windows/library.py @@ -0,0 +1,1868 @@ +from __future__ import absolute_import +import os +import random +import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error +import json +import time +import threading + +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from lib import util +from lib import backgroundthread +from lib import player + +from . import busy +from . import subitems +from . import preplay +from . import search +import plexnet +from . import dropdown +from . import opener +from . import windowutils + +from plexnet import playqueue + +from lib.util import T +import six +from six.moves import range + +CHUNK_SIZE = 200 +# CHUNK_SIZE = 30 + +KEYS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +MOVE_SET = frozenset( + ( + xbmcgui.ACTION_MOVE_LEFT, + xbmcgui.ACTION_MOVE_RIGHT, + xbmcgui.ACTION_MOVE_UP, + xbmcgui.ACTION_MOVE_DOWN, + xbmcgui.ACTION_MOUSE_MOVE, + xbmcgui.ACTION_PAGE_UP, + xbmcgui.ACTION_PAGE_DOWN, + xbmcgui.ACTION_FIRST_PAGE, + xbmcgui.ACTION_LAST_PAGE, + xbmcgui.ACTION_MOUSE_WHEEL_DOWN, + xbmcgui.ACTION_MOUSE_WHEEL_UP + ) +) + +THUMB_POSTER_DIM = util.scaleResolution(268, 397) +THUMB_AR16X9_DIM = util.scaleResolution(619, 348) +THUMB_SQUARE_DIM = util.scaleResolution(355, 355) +ART_AR16X9_DIM = util.scaleResolution(630, 355) + +TYPE_KEYS = { + 'episode': { + 'fallback': 'show', + 'thumb_dim': THUMB_POSTER_DIM, + }, + 'season': { + 'fallback': 'show', + 'thumb_dim': THUMB_POSTER_DIM + }, + 'movie': { + 'fallback': 'movie', + 'thumb_dim': THUMB_POSTER_DIM, + 'art_dim': ART_AR16X9_DIM + }, + 'show': { + 'fallback': 'show', + 'thumb_dim': THUMB_POSTER_DIM, + 'art_dim': ART_AR16X9_DIM + }, + 'collection': { + 'fallback': 'movie', + 'thumb_dim': THUMB_POSTER_DIM, + 'art_dim': ART_AR16X9_DIM + }, + 'album': { + 'fallback': 'music', + 'thumb_dim': THUMB_SQUARE_DIM + }, + 'artist': { + 'fallback': 'music', + 'thumb_dim': THUMB_SQUARE_DIM + }, + 'track': { + 'fallback': 'music', + 'thumb_dim': THUMB_SQUARE_DIM + }, + 'photo': { + 'fallback': 'photo', + 'thumb_dim': THUMB_SQUARE_DIM + }, + 'clip': { + 'fallback': 'movie16x9', + 'thumb_dim': THUMB_POSTER_DIM + }, +} + +TYPE_PLURAL = { + 'artist': T(32347, 'artists'), + 'album': T(32461, 'albums'), + 'movie': T(32348, 'Movies'), + 'photo': T(32349, 'photos'), + 'show': T(32350, 'Shows'), + 'episode': T(32458, 'Episodes'), + 'collection': T(32490, 'Collections'), + 'folder': T(32491, 'Folders'), +} + +SORT_KEYS = { + 'movie': { + 'titleSort': {'title': T(32357, 'By Name'), 'display': T(32358, 'Name'), 'defSortDesc': False}, + 'addedAt': {'title': T(32351, 'By Date Added'), 'display': T(32352, 'Date Added'), 'defSortDesc': True}, + 'originallyAvailableAt': {'title': T(32353, 'By Release Date'), 'display': T(32354, 'Release Date'), + 'defSortDesc': True}, + 'lastViewedAt': {'title': T(32355, 'By Date Viewed'), 'display': T(32356, 'Date Viewed'), 'defSortDesc': True}, + 'rating': {'title': T(33107, 'By Critic Rating'), 'display': T(33108, ' Critic Rating'), 'defSortDesc': True}, + 'audienceRating': {'title': T(33101, 'By Audience Rating'), 'display': T(33102, 'Audience Rating'), + 'defSortDesc': True}, + # called "Rating" in PlexWeb, using more obvious "This is this user's rating" here + 'userRating': {'title': T(33103, 'By my Rating'), 'display': T(33104, 'My Rating'), 'defSortDesc': True}, + 'contentRating': {'title': T(33105, 'By Content Rating'), 'display': T(33106, 'Content Rating'), + 'defSortDesc': True}, + 'resolution': {'title': T(32361, 'By Resolution'), 'display': T(32362, 'Resolution'), 'defSortDesc': True}, + 'duration': {'title': T(32363, 'By Duration'), 'display': T(32364, 'Duration'), 'defSortDesc': True}, + 'unwatched': {'title': T(32367, 'By Unplayed'), 'display': T(32368, 'Unplayed'), 'defSortDesc': False}, + 'viewCount': {'title': T(32371, 'By Play Count'), 'display': T(32372, 'Play Count'), 'defSortDesc': True} + }, + 'show': { + 'titleSort': {'title': T(32357, 'By Name'), 'display': T(32358, 'Name'), 'defSortDesc': False}, + 'show.titleSort': {'title': T(32457, 'By Show'), 'display': T(32456, 'Show'), 'defSortDesc': False}, + 'originallyAvailableAt': {'title': T(32365, 'By First Aired'), 'display': T(32366, 'First Aired'), + 'defSortDesc': False}, + 'unviewedLeafCount': {'title': T(32367, 'By Unplayed'), 'display': T(32368, 'Unplayed'), 'defSortDesc': True}, + 'rating': {'title': T(33107, 'By Critic Rating'), 'display': T(33108, ' Critic Rating'), 'defSortDesc': True}, + 'audienceRating': {'title': T(33101, 'By Audience Rating'), 'display': T(33102, 'Audience Rating'), + 'defSortDesc': True}, + # called "Rating" in PlexWeb, using more obvious "This is this user's rating" here + 'userRating': {'title': T(33103, 'By my Rating'), 'display': T(33104, 'My Rating'), 'defSortDesc': True}, + 'contentRating': {'title': T(33105, 'By Content Rating'), 'display': T(33106, 'Content Rating'), + 'defSortDesc': True}, + }, + 'artist': { + 'titleSort': {'title': T(32357, 'By Name'), 'display': T(32358, 'Name'), 'defSortDesc': False}, + 'artist.titleSort': {'title': T(32463, 'By Artist'), 'display': T(32462, 'Artist'), 'defSortDesc': False}, + 'lastViewedAt': {'title': T(32369, 'By Date Played'), 'display': T(32370, 'Date Played'), 'defSortDesc': False}, + }, + 'photo': { + 'titleSort': {'title': T(32357, 'By Name'), 'display': T(32358, 'Name'), 'defSortDesc': False}, + 'originallyAvailableAt': {'title': T(32373, 'By Date Taken'), 'display': T(32374, 'Date Taken'), + 'defSortDesc': True} + }, + 'photodirectory': {}, + 'collection': {} +} + +ITEM_TYPE = None + + +def setItemType(type_=None): + assert type_ is not None, "Invalid type: None" + global ITEM_TYPE + ITEM_TYPE = type_ + util.setGlobalProperty('item.type', str(ITEM_TYPE)) + + +class ChunkRequestTask(backgroundthread.Task): + def setup(self, section, start, size, callback, filter_=None, sort=None, unwatched=False, subDir=False): + self.section = section + self.start = start + self.size = size + self.callback = callback + self.filter = filter_ + self.sort = sort + self.unwatched = unwatched + self.subDir = subDir + return self + + def contains(self, pos): + return self.start <= pos <= (self.start + self.size) + + def run(self): + if self.isCanceled(): + return + + try: + type_ = None + if ITEM_TYPE == 'episode': + type_ = 4 + elif ITEM_TYPE == 'album': + type_ = 9 + elif ITEM_TYPE == 'collection': + type_ = 18 + + if ITEM_TYPE == 'folder': + items = self.section.folder(self.start, self.size, self.subDir) + else: + items = self.section.all(self.start, self.size, self.filter, self.sort, self.unwatched, type_=type_) + + if self.isCanceled(): + return + self.callback(items, self.start) + except plexnet.exceptions.BadRequest: + util.DEBUG_LOG('404 on section: {0}'.format(repr(self.section.title))) + + +class PhotoPropertiesTask(backgroundthread.Task): + def setup(self, photo, callback): + self.photo = photo + self.callback = callback + return self + + def run(self): + if self.isCanceled(): + return + + try: + self.photo.reload() + self.callback(self.photo) + except plexnet.exceptions.BadRequest: + util.DEBUG_LOG('404 on photo reload: {0}'.format(self.photo)) + + +class LibrarySettings(object): + def __init__(self, section_or_server_id, ignoreLibrarySettings=False): + self.ignoreLibrarySettings = ignoreLibrarySettings + if isinstance(section_or_server_id, six.string_types): + self.serverID = section_or_server_id + self.sectionID = None + else: + self.serverID = section_or_server_id.getServer().uuid + self.sectionID = section_or_server_id.key + + self._loadSettings() + + def _loadSettings(self): + if self.ignoreLibrarySettings: + self._settings = {} + return + + if not self.sectionID: + return + + jsonString = util.getSetting('library.settings.{0}'.format(self.serverID), '') + self._settings = {} + try: + self._settings = json.loads(jsonString) + except ValueError: + pass + except: + util.ERROR() + + setItemType(self.getItemType() or ITEM_TYPE) + + def getItemType(self): + if not self._settings or self.sectionID not in self._settings: + return None + + return self._settings[self.sectionID].get('ITEM_TYPE') + + def setItemType(self, item_type): + setItemType(item_type) + + if self.sectionID not in self._settings: + self._settings[self.sectionID] = {} + + self._settings[self.sectionID]['ITEM_TYPE'] = item_type + + self._saveSettings() + + def _saveSettings(self): + jsonString = json.dumps(self._settings) + util.setSetting('library.settings.{0}'.format(self.serverID), jsonString) + + def setSection(self, section_id): + self.sectionID = section_id + + def getSetting(self, setting, default=None): + if not self._settings or self.sectionID not in self._settings: + return default + + if ITEM_TYPE not in self._settings[self.sectionID]: + return default + + return self._settings[self.sectionID][ITEM_TYPE].get(setting, default) + + def setSetting(self, setting, value): + if self.sectionID not in self._settings: + self._settings[self.sectionID] = {} + + if ITEM_TYPE not in self._settings[self.sectionID]: + self._settings[self.sectionID][ITEM_TYPE] = {} + + self._settings[self.sectionID][ITEM_TYPE][setting] = value + + self._saveSettings() + + +class ChunkedWrapList(kodigui.ManagedControlList): + LIST_MAX = CHUNK_SIZE * 3 + + def __getitem__(self, idx): + # if isinstance(idx, slice): + # return self.items[idx] + # else: + idx = idx % self.LIST_MAX + return self.items[idx] + # return self.getListItem(idx) + + +class ChunkModeWrapped(object): + ALL_MAX = CHUNK_SIZE * 2 + + def __init__(self): + self.reset() + + def reset(self): + self.midStart = 0 + self.itemCount = 0 + self.keys = {} + + def addKeyRange(self, key, krange): + self.keys[key] = krange + + def getKey(self, pos): + for k, krange in self.keys.items(): + if krange[0] <= pos <= krange[1]: + return k + + def isAtBeginning(self): + return self.midStart == 0 + + def posIsForward(self, pos): + if self.itemCount <= self.ALL_MAX: + return False + return pos >= self.midStart + CHUNK_SIZE + + def posIsBackward(self, pos): + if self.itemCount <= self.ALL_MAX: + return False + return pos < self.midStart + + def posIsValid(self, pos): + return self.midStart - CHUNK_SIZE <= pos < self.midStart + (CHUNK_SIZE * 2) + + def shift(self, mod): + if mod < 0 and self.midStart == 0: + return None + elif mod > 0 and self.midStart + CHUNK_SIZE >= self.itemCount: + return None + + offset = CHUNK_SIZE * mod + self.midStart += offset + start = self.midStart + offset + + return start + + def shiftToKey(self, key, keyStart=None): + if keyStart is None: + if key not in self.keys: + util.DEBUG_LOG('CHUNK MODE: NO ITEMS FOR KEY') + return + + keyStart = self.keys[key][0] + self.midStart = keyStart - keyStart % CHUNK_SIZE + return keyStart, max(self.midStart - CHUNK_SIZE, 0) + + def addObjects(self, pos, objects): + if not self.posIsValid(pos): + return + + if pos == self.midStart - CHUNK_SIZE: + self.objects = objects + self.objects[CHUNK_SIZE:] + elif pos == self.midStart: + self.objects = self.objects[:CHUNK_SIZE] + objects + self.objects[CHUNK_SIZE * 2:] + elif pos == self.midStart + CHUNK_SIZE: + self.objects = self.objects[:CHUNK_SIZE * 2] + objects + + +class CustomScrollBar(object): + def __init__(self, window, bar_group_id, bar_image_id, bar_image_focus_id, button_id, min_bar_height=20): + self._barGroup = window.getControl(bar_group_id) + self._barImage = window.getControl(bar_image_id) + self._barImageFocus = window.getControl(bar_image_focus_id) + self._button = window.getControl(button_id) + self.height = self._button.getHeight() + self.x, self.y = self._barGroup.getPosition() + self._minBarHeight = min_bar_height + self._barHeight = min_bar_height + self.reset() + + def reset(self): + self.size = 0 + self.count = 0 + self.pos = 0 + + def setSizeAndCount(self, size, count): + self.size = size + self.count = count + self._barHeight = min(self.height, max(self._minBarHeight, int(self.height * (count / float(size))))) + self._moveHeight = self.height - self._barHeight + self._barImage.setHeight(self._barHeight) + self._barImageFocus.setHeight(self._barHeight) + self.setPosition(0) + + def setPosition(self, pos): + self.pos = pos + offset = int((pos / float(max(self.size, 2) - 1)) * self._moveHeight) + self._barGroup.setPosition(self.x, self.y + offset) + + def getPosFromY(self, y): + y -= int(self._barHeight / 2) + 150 + y = min(max(y, 0), self._moveHeight) + return int((self.size - 1) * (y / float(self._moveHeight))) + + def onMouseDrag(self, window, action): + y = window.mouseYTrans(action.getAmount2()) + y -= int(self._barHeight / 2) + 150 + y = min(max(y, 0), self._moveHeight) + self._barGroup.setPosition(self.x, self.y) + + +class LibraryWindow(kodigui.MultiWindow, windowutils.UtilMixin): + bgXML = 'script-plex-blank.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + + def __init__(self, *args, **kwargs): + kodigui.MultiWindow.__init__(self, *args, **kwargs) + windowutils.UtilMixin.__init__(self) + self.section = kwargs.get('section') + self.filter = kwargs.get('filter_') + self.subDir = kwargs.get('subDir') + self.keyItems = {} + self.firstOfKeyItems = {} + self.tasks = backgroundthread.Tasks() + self.backgroundSet = False + self.showPanelControl = None + self.keyListControl = None + self.lastItem = None + self.lastFocusID = None + self.lastNonOptionsFocusID = None + self.refill = False + + self.dcpjPos = 0 + self.dcpjThread = None + self.dcpjTimeout = 0 + + self.dragging = False + + self.cleared = True + self.librarySettings = LibrarySettings(self.section, + ignoreLibrarySettings=kwargs.get("ignoreLibrarySettings", False)) + self.reset() + + self.lock = threading.Lock() + + def reset(self): + util.setGlobalProperty('sort', '') + self.filterUnwatched = self.librarySettings.getSetting('filter.unwatched', False) + self.sort = self.librarySettings.getSetting('sort', 'titleSort') + self.sortDesc = self.librarySettings.getSetting('sort.desc', False) + + self.chunkMode = None + #if ITEM_TYPE in ('episode', 'album'): + # self.chunkMode = ChunkModeWrapped() + + key = self.section.key + if not key.isdigit(): + key = self.section.getLibrarySectionId() + viewtype = util.getSetting('viewtype.{0}.{1}'.format(self.section.server.uuid, key)) + + if self.chunkMode: + if self.section.TYPE in ('artist', 'photo', 'photodirectory'): + self.setWindows(VIEWS_SQUARE_CHUNKED.get('all')) + self.setDefault(VIEWS_SQUARE_CHUNKED.get(viewtype)) + else: + self.setWindows(VIEWS_POSTER_CHUNKED.get('all')) + self.setDefault(VIEWS_POSTER_CHUNKED.get(viewtype)) + else: + if self.section.TYPE in ('artist', 'photo', 'photodirectory'): + self.setWindows(VIEWS_SQUARE.get('all')) + self.setDefault(VIEWS_SQUARE.get(viewtype)) + else: + self.setWindows(VIEWS_POSTER.get('all')) + self.setDefault(VIEWS_POSTER.get(viewtype)) + + @busy.dialog() + def doClose(self): + self.tasks.kill() + kodigui.MultiWindow.doClose(self) + + def onFirstInit(self): + self.scrollBar = None + #if ITEM_TYPE in ('episode', 'album'): + # self.scrollBar = CustomScrollBar(self, 950, 952, 953, 951) + + if self.showPanelControl and not self.refill: + self.showPanelControl.newControl(self) + self.keyListControl.newControl(self) + self.showPanelControl.selectItem(0) + self.setFocusId(self.VIEWTYPE_BUTTON_ID) + self.setBoolProperty("initialized", True) + else: + if self.chunkMode: + self.showPanelControl = ChunkedWrapList(self, self.POSTERS_PANEL_ID, 5) + else: + self.showPanelControl = kodigui.ManagedControlList(self, self.POSTERS_PANEL_ID, 5) + + hideFilterOptions = self.section.TYPE == 'photodirectory' or self.section.TYPE == 'collection' + + self.keyListControl = kodigui.ManagedControlList(self, self.KEY_LIST_ID, 27) + self.setProperty('subDir', self.subDir and '1' or '') + self.setProperty('no.options', self.section.TYPE != 'photodirectory' and '1' or '') + self.setProperty('unwatched.hascount', self.section.TYPE == 'show' and '1' or '') + util.setGlobalProperty('sort', self.sort) + self.setProperty('filter1.display', self.filterUnwatched and T(32368, 'UNPLAYED') or T(32345, 'All')) + self.setProperty('sort.display', SORT_KEYS[self.section.TYPE].get(self.sort, SORT_KEYS['movie'].get(self.sort))['title']) + self.setProperty('media.itemType', ITEM_TYPE or self.section.TYPE) + self.setProperty('media.type', TYPE_PLURAL.get(ITEM_TYPE or self.section.TYPE, self.section.TYPE)) + self.setProperty('media', self.section.TYPE) + self.setProperty('hide.filteroptions', hideFilterOptions and '1' or '') + + self.setTitle() + self.setBoolProperty("initialized", True) + self.fill() + self.refill = False + if self.getProperty('no.content') or self.getProperty('no.content.filtered'): + self.setFocusId(self.HOME_BUTTON_ID) + else: + self.setFocusId(self.POSTERS_PANEL_ID) + + def onAction(self, action): + try: + if self.dragging: + if not action == xbmcgui.ACTION_MOUSE_DRAG: + self.dragging = False + self.setBoolProperty('dragging', self.dragging) + + if action.getId() in MOVE_SET: + if util.advancedSettings.dynamicBackgrounds: + mli = self.showPanelControl.getSelectedItem() + if mli and mli.dataSource: + self.updateBackgroundFrom(mli.dataSource) + + controlID = self.getFocusId() + if controlID == self.POSTERS_PANEL_ID or controlID == self.SCROLLBAR_ID: + self.updateKey() + self.checkChunkedNav(action) + elif controlID == self.CUSTOM_SCOLLBAR_BUTTON_ID: + if action == xbmcgui.ACTION_MOVE_UP: + self.shiftSelection(-12) + elif action == xbmcgui.ACTION_MOVE_DOWN: + self.shiftSelection(12) + # elif action == xbmcgui.KEY_MOUSE_DRAG_START: + # self.onMouseDragStart(action) + # elif action == xbmcgui.KEY_MOUSE_DRAG_END: + # self.onMouseDragEnd(action) + elif action == xbmcgui.ACTION_MOUSE_DRAG: + self.onMouseDrag(action) + elif action == xbmcgui.ACTION_CONTEXT_MENU: + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + self.lastNonOptionsFocusID = self.lastFocusID + self.setFocusId(self.OPTIONS_GROUP_ID) + return + else: + if self.lastNonOptionsFocusID: + self.setFocusId(self.lastNonOptionsFocusID) + self.lastNonOptionsFocusID = None + return + + elif action in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_CONTEXT_MENU): + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)) and \ + (not util.advancedSettings.fastBack or action == xbmcgui.ACTION_CONTEXT_MENU): + if xbmc.getCondVisibility('Integer.IsGreater(Container(101).ListItem.Property(index),5)'): + self.showPanelControl.selectItem(0) + return + + self.updateItem() + + except: + util.ERROR() + + kodigui.MultiWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.HOME_BUTTON_ID: + self.goHome() + elif controlID == self.POSTERS_PANEL_ID: + self.showPanelClicked() + elif controlID == self.KEY_LIST_ID: + self.keyClicked() + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif controlID == self.PLAY_BUTTON_ID: + self.playButtonClicked() + elif controlID == self.SHUFFLE_BUTTON_ID: + self.shuffleButtonClicked() + elif controlID == self.OPTIONS_BUTTON_ID: + self.optionsButtonClicked() + elif controlID == self.VIEWTYPE_BUTTON_ID: + self.viewTypeButtonClicked() + elif controlID == self.SORT_BUTTON_ID: + self.sortButtonClicked() + elif controlID == self.FILTER1_BUTTON_ID: + self.filter1ButtonClicked() + elif controlID == self.ITEM_TYPE_BUTTON_ID: + self.itemTypeButtonClicked() + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + + def onFocus(self, controlID): + self.lastFocusID = controlID + + if controlID == self.KEY_LIST_ID: + self.selectKey() + + if player.PLAYER.bgmPlaying: + player.PLAYER.stopAndWait() + + def onItemChanged(self, mli): + if not mli: + return + + if not mli.dataSource or not mli.dataSource.TYPE == 'photo': + return + + self.showPhotoItemProperties(mli.dataSource) + + def onMouseDragStart(self, action): + if not self.scrollBar: + return + + controlID = self.getFocusId() + if controlID != self.CUSTOM_SCOLLBAR_BUTTON_ID: + return + + self.dragging = True + self.setBoolProperty('dragging', self.dragging) + + def onMouseDragEnd(self, action): + if not self.scrollBar: + return + + if not self.dragging: + return + + self.dragging = False + self.setBoolProperty('dragging', self.dragging) + + y = self.mouseYTrans(action.getAmount2()) + + pos = self.scrollBar.getPosFromY(y) + self.shiftSelection(pos=pos) + + def onMouseDrag(self, action): + if not self.scrollBar: + return + + if not self.dragging: + controlID = self.getFocusId() + if controlID != self.CUSTOM_SCOLLBAR_BUTTON_ID: + return + + self.onMouseDragStart(action) + if not self.dragging: + return + + # self.scrollBar.onMouseDrag(self, action) + + y = self.mouseYTrans(action.getAmount2()) + + pos = self.scrollBar.getPosFromY(y) + if self.chunkMode.posIsForward(pos) or self.chunkMode.posIsBackward(pos): + self.shiftSelection(pos=pos) + else: + self.showPanelControl.selectItem(pos) + self.checkChunkedNav() + + def shiftSelection(self, offset=0, pos=None): + if pos is not None: + self.scrollBar.setPosition(pos) + return self.delayedChunkedPosJump(pos) + else: + mli = self.showPanelControl.getSelectedItem() + + try: + idx = int(mli.getProperty('index')) + except ValueError: + return + + target = idx + offset + if target >= self.chunkMode.itemCount: + pos = self.chunkMode.itemCount - 1 + elif target < 0: + pos = 0 + else: + pos = self.showPanelControl.getSelectedPosition() + pos += offset + + if pos < 0 or pos >= self.showPanelControl.size(): + pos = pos % self.showPanelControl.size() + + self.showPanelControl.selectItem(pos) + self.checkChunkedNav(idx=pos) + + def updateKey(self, mli=None): + mli = mli or self.showPanelControl.getSelectedItem() + if not mli: + return + + if self.lastItem != mli: + self.lastItem = mli + self.onItemChanged(mli) + + util.setGlobalProperty('key', mli.getProperty('key')) + + self.selectKey(mli) + + def checkChunkedNav(self, action=None, idx=None): + if not self.chunkMode: + return + + # if action == xbmcgui.ACTION_PAGE_DOWN: + # idx = self.showPanelControl.getSelectedPosition() - 5 + # if idx < 0: + # idx += self.showPanelControl.size() + # mli = self.showPanelControl.getListItem(idx) + # self.showPanelControl.selectItem(idx) + # elif action == xbmcgui.ACTION_PAGE_UP: + # idx = self.showPanelControl.getSelectedPosition() + 5 + # if idx >= self.showPanelControl.size(): + # idx %= self.showPanelControl.size() + # mli = self.showPanelControl.getListItem(idx) + # self.showPanelControl.selectItem(idx) + # else: + mli = self.showPanelControl.getSelectedItem() + + try: + if idx is not None: + pos = int(self.showPanelControl[idx].getProperty('index')) + else: + pos = int(mli.getProperty('index')) + + if pos >= self.chunkMode.itemCount: + raise ValueError + except ValueError: + if self.chunkMode.isAtBeginning() and action not in (xbmcgui.ACTION_MOVE_DOWN, xbmcgui.ACTION_PAGE_DOWN): + idx = 0 + else: + idx = ((self.chunkMode.itemCount - 1) % self.showPanelControl.LIST_MAX) + + self.showPanelControl.selectItem(idx) + mli = self.showPanelControl[idx] + self.updateKey(mli) + if self.scrollBar: + try: + pos = int(mli.getProperty('index')) + self.scrollBar.setPosition(pos) + except ValueError: + pass + + if idx == 0 and action == xbmcgui.ACTION_MOVE_UP: + self.setFocusId(600) + + return + + if self.scrollBar: + self.scrollBar.setPosition(pos) + + if self.chunkMode.posIsForward(pos): + self.shiftChunks() + elif self.chunkMode.posIsBackward(pos): + self.shiftChunks(-1) + + def shiftChunks(self, mod=1): + start = self.chunkMode.shift(mod) + if start is None: + return + + if start < 0: + self.chunkCallback([None] * CHUNK_SIZE, -CHUNK_SIZE) + else: + self.chunkCallback([False] * CHUNK_SIZE, start) + task = ChunkRequestTask().setup( + self.section, start, CHUNK_SIZE, self.chunkCallback, filter_=self.getFilterOpts(), sort=self.getSortOpts(), unwatched=self.filterUnwatched, subDir=self.subDir + ) + + self.tasks.add(task) + backgroundthread.BGThreader.addTasksToFront([task]) + + def selectKey(self, mli=None): + if not mli: + mli = self.showPanelControl.getSelectedItem() + if not mli: + return + + li = self.keyItems.get(mli.getProperty('key')) + if not li: + return + self.keyListControl.selectItem(li.pos()) + + def searchButtonClicked(self): + self.processCommand(search.dialog(self, section_id=self.section.key)) + + def delayedChunkedPosJump(self, pos): + if not self.cleared: + self.chunkCallback(None, None, clear=True) + self.dcpjTimeout = time.time() + 0.5 + self.dcpjPos = pos + if not self.dcpjThread or not self.dcpjThread.is_alive(): + self.dcpjThread = threading.Thread(target=self._chunkedPosJump) + self.dcpjThread.start() + + def _chunkedPosJump(self): + while not util.MONITOR.waitForAbort(0.1): + if time.time() >= self.dcpjTimeout: + break + else: + return + + keyStart_start = self.chunkMode.shiftToKey(None, keyStart=self.dcpjPos) + if not keyStart_start: + return + + keyStart, start = keyStart_start + pos = keyStart % self.showPanelControl.LIST_MAX + self.chunkedPosJump(pos, start) + self.showPanelControl.selectItem(pos) + + def chunkedPosJump(self, pos, start=None): + if start is None: + start = max(pos - CHUNK_SIZE, 0) + + mul = 3 + if not start: + mul = 2 + + tasks = [] + for x in range(mul): + task = ChunkRequestTask().setup( + self.section, + start + (CHUNK_SIZE * x), + CHUNK_SIZE, + self.chunkCallback, + filter_=self.getFilterOpts(), + sort=self.getSortOpts(), + unwatched=self.filterUnwatched, + subDir=self.subDir + ) + + self.tasks.add(task) + tasks.append(task) + + mid = tasks.pop(1) + backgroundthread.BGThreader.addTasksToFront([mid] + tasks) + + def keyClicked(self): + li = self.keyListControl.getSelectedItem() + if not li: + return + + if self.chunkMode: + keyStart_start = self.chunkMode.shiftToKey(li.dataSource) + if not keyStart_start: + return + keyStart, start = keyStart_start + + pos = keyStart % self.showPanelControl.LIST_MAX + self.chunkedPosJump(pos, start) + else: + mli = self.firstOfKeyItems.get(li.dataSource) + if not mli: + return + pos = mli.pos() + + self.showPanelControl.selectItem(pos) + self.setFocusId(self.POSTERS_PANEL_ID) + util.setGlobalProperty('key', li.dataSource) + + def playButtonClicked(self, shuffle=False): + filter_ = self.getFilterOpts() + sort = self.getSortOpts() + args = {} + if filter_: + args[filter_[0]] = filter_[1] + + if sort: + args['sort'] = '{0}:{1}'.format(*sort) + + if self.section.TYPE == 'movie': + args['sourceType'] = '1' + elif self.section.TYPE == 'show': + args['sourceType'] = '2' + elif self.section.TYPE != 'collection': + args['sourceType'] = '8' + + # When the list is filtered by unwatched, play and shuffle button should only play unwatched videos + if self.filterUnwatched: + args['unwatched'] = '1' + + pq = playqueue.createPlayQueueForItem(self.section, options={'shuffle': shuffle}, args=args) + opener.open(pq) + + def shuffleButtonClicked(self): + self.playButtonClicked(shuffle=True) + + def optionsButtonClicked(self): + options = [] + if xbmc.getCondVisibility('Player.HasAudio + MusicPlayer.HasNext'): + options.append({'key': 'play_next', 'display': T(32325, 'Play Next')}) + + # if self.section.TYPE not in ('artist', 'photo', 'photodirectory'): + # options.append({'key': 'mark_watched', 'display': 'Mark All Watched'}) + # options.append({'key': 'mark_unwatched', 'display': 'Mark All Unwatched'}) + + # if xbmc.getCondVisibility('Player.HasAudio') and self.section.TYPE == 'artist': + # options.append({'key': 'add_to_queue', 'display': 'Add To Queue'}) + + # if False: + # options.append({'key': 'add_to_playlist', 'display': 'Add To Playlist'}) + + if self.section.TYPE == 'photodirectory': + if options: + options.append(dropdown.SEPARATOR) + options.append({'key': 'to_section', 'display': T(32324, u'Go to {0}').format(self.section.getLibrarySectionTitle())}) + + choice = dropdown.showDropdown(options, (255, 205)) + if not choice: + return + + if choice['key'] == 'play_next': + xbmc.executebuiltin('PlayerControl(Next)') + elif choice['key'] == 'to_section': + self.goHome(self.section.getLibrarySectionId()) + + def itemTypeButtonClicked(self): + options = [] + + if self.section.TYPE == 'show': + for t in ('show', 'episode', 'collection'): + options.append({'type': t, 'display': TYPE_PLURAL.get(t, t)}) + elif self.section.TYPE == 'movie': + for t in ('movie', 'collection', 'folder'): + options.append({'type': t, 'display': TYPE_PLURAL.get(t, t)}) + elif self.section.TYPE == 'artist': + for t in ('artist', 'album', 'collection'): + options.append({'type': t, 'display': TYPE_PLURAL.get(t, t)}) + else: + return + + result = dropdown.showDropdown(options, (1280, 106), with_indicator=True) + if not result: + return + + choice = result['type'] + + if choice == ITEM_TYPE: + return + + self.tasks.cancel() + + self.showPanelControl = None # TODO: Need to do some check here I think + + self.librarySettings.setItemType(choice) + + self.reset() + + self.clearFilters() + self.resetSort() + + if not self.nextWindow(False): + self.setProperty('media.type', TYPE_PLURAL.get(ITEM_TYPE or self.section.TYPE, self.section.TYPE)) + self.setProperty('sort.display', SORT_KEYS[self.section.TYPE].get(self.sort, SORT_KEYS['movie'].get(self.sort))['title']) + self.fill() + + def sortButtonClicked(self): + desc = 'script.plex/indicators/arrow-down.png' + asc = 'script.plex/indicators/arrow-up.png' + ind = self.sortDesc and desc or asc + + options = [] + defSortByOption = {} + + if self.section.TYPE == 'movie': + searchTypes = ['titleSort', 'addedAt', 'originallyAvailableAt', 'lastViewedAt', 'rating', 'audienceRating', + 'userRating', 'contentRating', 'resolution', 'duration'] + if ITEM_TYPE == 'collection': + searchTypes = ['titleSort', 'addedAt', 'contentRating'] + + for stype in searchTypes: + option = SORT_KEYS['movie'].get(stype).copy() + option['type'] = stype + option['indicator'] = self.sort == stype and ind or '' + defSortByOption[stype] = option.get('defSortDesc') + options.append(option) + elif self.section.TYPE == 'show': + searchTypes = ['titleSort', 'addedAt', 'lastViewedAt', 'originallyAvailableAt', 'rating', + 'audienceRating', 'userRating', 'contentRating', 'unviewedLeafCount'] + if ITEM_TYPE == 'episode': + searchTypes = ['titleSort', 'show.titleSort', 'addedAt', 'originallyAvailableAt', 'lastViewedAt', 'rating', + 'audienceRating', 'userRating'] + elif ITEM_TYPE == 'collection': + searchTypes = ['titleSort', 'addedAt'] + + for stype in searchTypes: + option = SORT_KEYS['show'].get(stype, SORT_KEYS['movie'].get(stype)).copy() + option['type'] = stype + option['indicator'] = self.sort == stype and ind or '' + defSortByOption[stype] = option.get('defSortDesc') + options.append(option) + elif self.section.TYPE == 'artist': + searchTypes = ['titleSort', 'addedAt', 'lastViewedAt', 'viewCount'] + if ITEM_TYPE == 'album': + searchTypes = ['titleSort', 'artist.titleSort', 'addedAt', 'lastViewedAt', 'viewCount', 'originallyAvailableAt', 'rating'] + elif ITEM_TYPE == 'collection': + searchTypes = ['titleSort', 'addedAt'] + + for stype in searchTypes: + option = SORT_KEYS['artist'].get(stype, SORT_KEYS['movie'].get(stype)).copy() + option['type'] = stype + option['indicator'] = self.sort == stype and ind or '' + defSortByOption[stype] = option.get('defSortDesc') + options.append(option) + elif self.section.TYPE == 'photo': + searchTypes = ['titleSort', 'addedAt', 'originallyAvailableAt', 'rating'] + for stype in searchTypes: + option = SORT_KEYS['photo'].get(stype, SORT_KEYS['movie'].get(stype)).copy() + option['type'] = stype + option['indicator'] = self.sort == stype and ind or '' + defSortByOption[stype] = option.get('defSortDesc') + options.append(option) + else: + return + + result = dropdown.showDropdown(options, (1280, 106), with_indicator=True) + if not result: + return + + choice = result['type'] + + forceRefresh = False + if choice == self.sort: + self.sortDesc = not self.sortDesc + else: + self.sortDesc = defSortByOption.get(choice, False) + if choice == 'titleSort': + forceRefresh = True + + self.sort = choice + + self.librarySettings.setSetting('sort', self.sort) + self.librarySettings.setSetting('sort.desc', self.sortDesc) + + util.setGlobalProperty('sort', choice) + self.setProperty('sort.display', result['title']) + + self.sortShowPanel(choice, forceRefresh) + + def viewTypeButtonClicked(self): + for task in self.tasks: + if task.isValid(): + task.cancel() + self.refill = True + + with self.lock: + self.showPanelControl.invalidate() + win = self.nextWindow() + + key = self.section.key + if not key.isdigit(): + key = self.section.getLibrarySectionId() + util.setSetting('viewtype.{0}.{1}'.format(self.section.server.uuid, key), win.VIEWTYPE) + + def sortShowPanel(self, choice, force_refresh=False): + if force_refresh or self.chunkMode or self.showPanelControl.size() == 0: + self.fillShows() + return + + if choice == 'addedAt': + self.showPanelControl.sort(lambda i: i.dataSource.addedAt, reverse=self.sortDesc) + elif choice == 'originallyAvailableAt': + self.showPanelControl.sort(lambda i: i.dataSource.get('originallyAvailableAt'), reverse=self.sortDesc) + elif choice == 'lastViewedAt': + self.showPanelControl.sort(lambda i: i.dataSource.get('lastViewedAt'), reverse=self.sortDesc) + elif choice == 'viewCount': + self.showPanelControl.sort(lambda i: i.dataSource.get('titleSort') or i.dataSource.title) + self.showPanelControl.sort(lambda i: i.dataSource.get('viewCount').asInt(), reverse=self.sortDesc) + elif choice == 'titleSort': + self.showPanelControl.sort(lambda i: i.dataSource.get('titleSort') or i.dataSource.title, reverse=self.sortDesc) + self.keyListControl.sort(lambda i: i.getProperty('original'), reverse=self.sortDesc) + elif choice == 'show.titleSort': + self.showPanelControl.sort(lambda i: i.label, reverse=self.sortDesc) + self.keyListControl.sort(lambda i: i.getProperty('original'), reverse=self.sortDesc) + elif choice == 'artist.titleSort': + self.showPanelControl.sort(lambda i: i.label, reverse=self.sortDesc) + self.keyListControl.sort(lambda i: i.getProperty('original'), reverse=self.sortDesc) + elif choice == 'rating': + self.showPanelControl.sort(lambda i: i.dataSource.get('titleSort') or i.dataSource.title) + self.showPanelControl.sort(lambda i: i.dataSource.get('rating').asFloat(), reverse=self.sortDesc) + elif choice == 'audienceRating': + self.showPanelControl.sort(lambda i: i.dataSource.get('titleSort') or i.dataSource.title) + self.showPanelControl.sort(lambda i: i.dataSource.get('audienceRating').asFloat(), reverse=self.sortDesc) + elif choice == 'userRating': + self.showPanelControl.sort(lambda i: i.dataSource.get('titleSort') or i.dataSource.title) + self.showPanelControl.sort(lambda i: i.dataSource.get('userRating').asFloat(), reverse=self.sortDesc) + elif choice == 'contentRating': + self.showPanelControl.sort(lambda i: i.dataSource.get('titleSort') or i.dataSource.title) + self.showPanelControl.sort(lambda i: i.dataSource.get('contentRating'), reverse=self.sortDesc) + elif choice == 'resolution': + self.showPanelControl.sort(lambda i: i.dataSource.maxHeight, reverse=self.sortDesc) + elif choice == 'duration': + self.showPanelControl.sort(lambda i: i.dataSource.duration.asInt(), reverse=self.sortDesc) + elif choice == 'unviewedLeafCount': + self.showPanelControl.sort(lambda i: i.dataSource.unViewedLeafCount, reverse=self.sortDesc) + + self.showPanelControl.selectItem(0) + self.setFocusId(self.POSTERS_PANEL_ID) + self.backgroundSet = False + self.setBackground([item.dataSource for item in self.showPanelControl], 0, randomize=not util.advancedSettings.dynamicBackgrounds) + + def subOptionCallback(self, option): + check = 'script.plex/home/device/check.png' + options = None + subKey = None + if self.filter: + if self.filter.get('sub'): + subKey = self.filter['sub']['val'] + + if option['type'] in ( + 'year', 'decade', 'genre', 'contentRating', 'collection', 'director', 'actor', 'country', 'studio', 'resolution', 'labels', + 'make', 'model', 'aperture', 'exposure', 'iso', 'lens' + ): + options = [{'val': o.key, 'display': o.title, 'indicator': o.key == subKey and check or ''} for o in self.section.listChoices(option['type'])] + if not options: + options = [{'val': None, 'display': T(32375, 'No filters available'), 'ignore': True}] + + return options + + def hasFilter(self, ftype): + if not self.filter: + return False + + return self.filter['type'] == ftype + + def filter1ButtonClicked(self): + check = 'script.plex/home/device/check.png' + + options = [] + + if self.section.TYPE in ('movie', 'show'): + options.append({'type': 'unwatched', 'display': T(32368, 'UNPLAYED').upper(), 'indicator': self.filterUnwatched and check or ''}) + + if self.filter: + options.append({'type': 'clear_filter', 'display': T(32376, 'CLEAR FILTER').upper(), 'indicator': 'script.plex/indicators/remove.png'}) + + if options: + options.append(None) # Separator + + optionsMap = { + 'year': {'type': 'year', 'display': T(32377, 'Year'), 'indicator': self.hasFilter('year') and check or ''}, + 'decade': {'type': 'decade', 'display': T(32378, 'Decade'), 'indicator': self.hasFilter('decade') and check or ''}, + 'genre': {'type': 'genre', 'display': T(32379, 'Genre'), 'indicator': self.hasFilter('genre') and check or ''}, + 'contentRating': {'type': 'contentRating', 'display': T(32380, 'Content Rating'), 'indicator': self.hasFilter('contentRating') and check or ''}, + 'network': {'type': 'studio', 'display': T(32381, 'Network'), 'indicator': self.hasFilter('studio') and check or ''}, + 'collection': {'type': 'collection', 'display': T(32382, 'Collection'), 'indicator': self.hasFilter('collection') and check or ''}, + 'director': {'type': 'director', 'display': T(32383, 'Director'), 'indicator': self.hasFilter('director') and check or ''}, + 'actor': {'type': 'actor', 'display': T(32384, 'Actor'), 'indicator': self.hasFilter('actor') and check or ''}, + 'country': {'type': 'country', 'display': T(32385, 'Country'), 'indicator': self.hasFilter('country') and check or ''}, + 'studio': {'type': 'studio', 'display': T(32386, 'Studio'), 'indicator': self.hasFilter('studio') and check or ''}, + 'resolution': {'type': 'resolution', 'display': T(32362, 'Resolution'), 'indicator': self.hasFilter('resolution') and check or ''}, + 'labels': {'type': 'labels', 'display': T(32387, 'Labels'), 'indicator': self.hasFilter('labels') and check or ''}, + + 'make': {'type': 'make', 'display': T(32388, 'Camera Make'), 'indicator': self.hasFilter('make') and check or ''}, + 'model': {'type': 'model', 'display': T(32389, 'Camera Model'), 'indicator': self.hasFilter('model') and check or ''}, + 'aperture': {'type': 'aperture', 'display': T(32390, 'Aperture'), 'indicator': self.hasFilter('aperture') and check or ''}, + 'exposure': {'type': 'exposure', 'display': T(32391, 'Shutter Speed'), 'indicator': self.hasFilter('exposure') and check or ''}, + 'iso': {'type': 'iso', 'display': 'ISO', 'indicator': self.hasFilter('iso') and check or ''}, + 'lens': {'type': 'lens', 'display': T(32392, 'Lens'), 'indicator': self.hasFilter('lens') and check or ''} + } + + if self.section.TYPE == 'movie': + for k in ('year', 'decade', 'genre', 'contentRating', 'collection', 'director', 'actor', 'country', 'studio', 'resolution', 'labels'): + options.append(optionsMap[k]) + elif self.section.TYPE == 'show': + if ITEM_TYPE == 'episode': + for k in ('year', 'collection', 'resolution'): + options.append(optionsMap[k]) + elif ITEM_TYPE == 'album': + for k in ('genre', 'year', 'decade', 'collection', 'labels'): + options.append(optionsMap[k]) + else: + for k in ('year', 'genre', 'contentRating', 'network', 'collection', 'actor', 'labels'): + options.append(optionsMap[k]) + elif self.section.TYPE == 'artist': + for k in ('genre', 'country', 'collection'): + options.append(optionsMap[k]) + elif self.section.TYPE == 'photo': + for k in ('year', 'make', 'model', 'aperture', 'exposure', 'iso', 'lens', 'labels'): + options.append(optionsMap[k]) + + result = dropdown.showDropdown(options, (980, 106), with_indicator=True, suboption_callback=self.subOptionCallback) + if not result: + return + + choice = result['type'] + + if choice == 'clear_filter': + self.filter = None + elif choice == 'unwatched': + self.filterUnwatched = not self.filterUnwatched + self.librarySettings.setSetting('filter.unwatched', self.filterUnwatched) + else: + self.filter = result + + self.updateFilterDisplay() + + if self.filter or choice in ('clear_filter', 'unwatched'): + self.fill() + + def clearFilters(self): + self.filter = None + self.filterUnwatched = False + self.librarySettings.setSetting('filter.unwatched', self.filterUnwatched) + self.updateFilterDisplay() + + def resetSort(self): + self.sort = 'titleSort' + self.sortDesc = False + + self.librarySettings.setSetting('sort', self.sort) + self.librarySettings.setSetting('sort.desc', self.sortDesc) + + util.setGlobalProperty('sort', self.sort) + self.setProperty('sort.display', SORT_KEYS[self.section.TYPE].get(self.sort, SORT_KEYS['movie'].get(self.sort))['title']) + + def updateFilterDisplay(self): + if self.filter: + disp = self.filter['display'] + if self.filter.get('sub'): + disp = u'{0}: {1}'.format(disp, self.filter['sub']['display']) + self.setProperty('filter1.display', disp) + self.setProperty('filter2.display', self.filterUnwatched and T(32368, 'Unplayed') or '') + else: + self.setProperty('filter2.display', '') + self.setProperty('filter1.display', self.filterUnwatched and T(32368, 'Unplayed') or T(32345, 'All')) + + def showPanelClicked(self): + mli = self.showPanelControl.getSelectedItem() + if not mli or not mli.dataSource: + return + + sectionType = self.section.TYPE + + updateUnwatchedAndProgress = False + + if mli.dataSource.TYPE == 'collection': + prevItemType = self.librarySettings.getItemType() + self.processCommand(opener.open(mli.dataSource)) + self.librarySettings.setItemType(prevItemType) + elif self.section.TYPE == 'show' or mli.dataSource.TYPE == 'show' or mli.dataSource.TYPE == 'season' or mli.dataSource.TYPE == 'episode': + if ITEM_TYPE == 'episode' or mli.dataSource.TYPE == 'episode' or mli.dataSource.TYPE == 'season': + self.openItem(mli.dataSource) + else: + self.processCommand(opener.handleOpen(subitems.ShowWindow, media_item=mli.dataSource, parent_list=self.showPanelControl)) + if mli.dataSource.TYPE != 'season': # NOTE: A collection with Seasons doesn't have the leafCount/viewedLeafCount until you actually go into the season so we can't update the unwatched count here + updateUnwatchedAndProgress = True + elif self.section.TYPE == 'movie' or mli.dataSource.TYPE == 'movie': + datasource = mli.dataSource + if datasource.isDirectory(): + cls = self.section.__class__ + section = cls(self.section.data, self.section.initpath, self.section.server, self.section.container) + sectionId = section.key + if not sectionId.isdigit(): + sectionId = section.getLibrarySectionId() + + section.set('librarySectionID', sectionId) + section.key = datasource.key + section.title = datasource.title + + self.processCommand(opener.handleOpen(LibraryWindow, windows=self._windows, default_window=self._next, section=section, filter_=self.filter, subDir=True)) + self.librarySettings.setItemType(self.librarySettings.getItemType()) + else: + self.processCommand(opener.handleOpen(preplay.PrePlayWindow, video=datasource, parent_list=self.showPanelControl)) + updateUnwatchedAndProgress = True + elif self.section.TYPE == 'artist' or mli.dataSource.TYPE == 'artist' or mli.dataSource.TYPE == 'album' or mli.dataSource.TYPE == 'track': + if ITEM_TYPE == 'album' or mli.dataSource.TYPE == 'album' or mli.dataSource.TYPE == 'track': + self.openItem(mli.dataSource) + else: + self.processCommand(opener.handleOpen(subitems.ArtistWindow, media_item=mli.dataSource, parent_list=self.showPanelControl)) + elif self.section.TYPE in ('photo', 'photodirectory'): + self.showPhoto(mli.dataSource) + + if not mli: + return + + if mli.dataSource and not mli.dataSource.exists(): + self.showPanelControl.removeItem(mli.pos()) + return + + if updateUnwatchedAndProgress: + self.updateUnwatchedAndProgress(mli) + + def showPhoto(self, photo): + if isinstance(photo, plexnet.photo.Photo) or photo.TYPE == 'clip': + self.processCommand(opener.open(photo)) + else: + self.processCommand(opener.sectionClicked(photo)) + + def updateUnwatchedAndProgress(self, mli): + mli.dataSource.reload() + if mli.dataSource.isWatched: + mli.setProperty('unwatched', '') + mli.setProperty('unwatched.count', '') + else: + if self.section.TYPE == 'show' or mli.dataSource.TYPE == 'show' or mli.dataSource.TYPE == 'season': + mli.setProperty('unwatched.count', str(mli.dataSource.unViewedLeafCount)) + else: + mli.setProperty('unwatched', '1') + mli.setProperty('progress', util.getProgressImage(mli.dataSource)) + + def setTitle(self): + if self.section.TYPE == 'artist': + self.setProperty('screen.title', T(32394, 'MUSIC').upper()) + elif self.section.TYPE in ('photo', 'photodirectory'): + self.setProperty('screen.title', T(32349, 'photos').upper()) + elif self.section.TYPE == 'collection': + self.setProperty('screen.title', T(32382, 'COLLECTION').upper()) + else: + self.setProperty('screen.title', self.section.TYPE == 'show' and T(32393, 'TV SHOWS').upper() or T(32348, 'movies').upper()) + + self.updateFilterDisplay() + + def updateItem(self, mli=None): + mli = mli or self.showPanelControl.getSelectedItem() + if not mli or mli.dataSource: + return + + for task in self.tasks: + if task.contains(mli.pos()): + util.DEBUG_LOG('Moving task to front: {0}'.format(task)) + backgroundthread.BGThreader.moveToFront(task) + break + + def setBackground(self, items, position, randomize=True): + if self.backgroundSet: + return + + if randomize: + item = random.choice(items) + self.updateBackgroundFrom(item) + else: + # we want the first item of the first chunk + if position != 0: + return + + self.updateBackgroundFrom(items[0]) + self.backgroundSet = True + + def fill(self): + if self.chunkMode: + self.chunkMode.reset() + + self.backgroundSet = False + + if self.section.TYPE in ('photo', 'photodirectory'): + self.fillPhotos() + else: + self.fillShows() + + def getFilterOpts(self): + if not self.filter: + return None + + if not self.filter.get('sub'): + util.DEBUG_LOG('Filter missing sub-filter data') + return None + + return (self.filter['type'], six.moves.urllib.parse.unquote_plus(self.filter['sub']['val'])) + + def getSortOpts(self): + if not self.sort: + return None + + return (self.sort, self.sortDesc and 'desc' or 'asc') + + @busy.dialog() + def fillShows(self): + self.setBoolProperty('no.content', False) + self.setBoolProperty('no.content.filtered', False) + items = [] + jitems = [] + self.keyItems = {} + self.firstOfKeyItems = {} + totalSize = 0 + + type_ = None + if ITEM_TYPE == 'episode': + type_ = 4 + elif ITEM_TYPE == 'album': + type_ = 9 + elif ITEM_TYPE == 'collection': + type_ = 18 + + idx = 0 + fallback = 'script.plex/thumb_fallbacks/{0}.png'.format(TYPE_KEYS.get(self.section.type, TYPE_KEYS['movie'])['fallback']) + + if self.sort != 'titleSort' or ITEM_TYPE == 'folder' or self.subDir or self.section.TYPE == "collection": + if ITEM_TYPE == 'folder': + sectionAll = self.section.folder(0, 0, self.subDir) + else: + sectionAll = self.section.all(0, 0, filter_=self.getFilterOpts(), sort=self.getSortOpts(), unwatched=self.filterUnwatched, type_=type_) + + totalSize = sectionAll.totalSize.asInt() + + if not totalSize: + self.showPanelControl.reset() + self.keyListControl.reset() + + if self.filter or self.filterUnwatched: + self.setBoolProperty('no.content.filtered', True) + else: + self.setBoolProperty('no.content', True) + else: + if not self.chunkMode: + for x in range(totalSize): + mli = kodigui.ManagedListItem('') + mli.setProperty('thumb.fallback', fallback) + mli.setProperty('index', str(x)) + items.append(mli) + else: + jumpList = self.section.jumpList(filter_=self.getFilterOpts(), sort=self.getSortOpts(), unwatched=self.filterUnwatched, type_=type_) + + if not jumpList: + self.showPanelControl.reset() + self.keyListControl.reset() + + if self.filter or self.filterUnwatched: + self.setBoolProperty('no.content.filtered', True) + else: + self.setBoolProperty('no.content', True) + + if jumpList is None: + util.messageDialog("Error", "There was an error.") + + return + + for kidx, ji in enumerate(jumpList): + mli = kodigui.ManagedListItem(ji.title, data_source=ji.key) + mli.setProperty('key', ji.key) + mli.setProperty('original', '{0:02d}'.format(kidx)) + self.keyItems[ji.key] = mli + jitems.append(mli) + totalSize += ji.size.asInt() + + if self.chunkMode: + self.chunkMode.addKeyRange(ji.key, (idx, (idx + ji.size.asInt()) - 1)) + idx += ji.size.asInt() + else: + for x in range(ji.size.asInt()): + mli = kodigui.ManagedListItem('') + mli.setProperty('key', ji.key) + mli.setProperty('thumb.fallback', fallback) + mli.setProperty('index', str(idx)) + items.append(mli) + if not x: # i.e. first item + self.firstOfKeyItems[ji.key] = mli + idx += 1 + + util.setGlobalProperty('key', jumpList[0].key) + + if self.scrollBar: + self.scrollBar.setSizeAndCount(totalSize, 12) + + if self.chunkMode: + self.chunkMode.itemCount = totalSize + items = [ + kodigui.ManagedListItem('', properties={'index': str(i)}) for i in range(CHUNK_SIZE * 2) + ] + [ + kodigui.ManagedListItem('') for i in range(CHUNK_SIZE) + ] + + self.showPanelControl.reset() + self.keyListControl.reset() + + self.showPanelControl.addItems(items) + self.keyListControl.addItems(jitems) + + self.showPanelControl.selectItem(0) + self.setFocusId(self.POSTERS_PANEL_ID) + + tasks = [] + ct = 0 + for start in range(0, totalSize, CHUNK_SIZE): + tasks.append( + ChunkRequestTask().setup( + self.section, start, CHUNK_SIZE, self.chunkCallback, filter_=self.getFilterOpts(), sort=self.getSortOpts(), unwatched=self.filterUnwatched, subDir=self.subDir + ) + ) + ct += 1 + + if self.chunkMode and ct > 1: + break + + self.tasks.add(tasks) + backgroundthread.BGThreader.addTasksToFront(tasks) + + def showPhotoItemProperties(self, photo): + if photo.isFullObject(): + return + + task = PhotoPropertiesTask().setup(photo, self._showPhotoItemProperties) + self.tasks.add(task) + backgroundthread.BGThreader.addTasksToFront([task]) + + def _showPhotoItemProperties(self, photo): + mli = self.showPanelControl.getSelectedItem() + if not mli or not mli.dataSource.TYPE == 'photo': + for mli in self.showPanelControl: + if mli.dataSource == photo: + break + else: + return + + mli.setProperty('camera.model', photo.media[0].model) + mli.setProperty('camera.lens', photo.media[0].lens) + + attrib = [] + if photo.media[0].height: + attrib.append(u'{0} x {1}'.format(photo.media[0].width, photo.media[0].height)) + + orientation = photo.media[0].parts[0].orientation + if orientation: + attrib.append(u'{0} Mo'.format(orientation)) + + container = photo.media[0].container_ or os.path.splitext(photo.media[0].parts[0].file)[-1][1:].lower() + if container == 'jpg': + container = 'jpeg' + attrib.append(container.upper()) + if attrib: + mli.setProperty('photo.dims', u' \u2022 '.join(attrib)) + + settings = [] + if photo.media[0].iso: + settings.append('ISO {0}'.format(photo.media[0].iso)) + if photo.media[0].aperture: + settings.append('{0}'.format(photo.media[0].aperture)) + if photo.media[0].exposure: + settings.append('{0}'.format(photo.media[0].exposure)) + mli.setProperty('camera.settings', u' \u2022 '.join(settings)) + mli.setProperty('photo.summary', photo.get('summary')) + + @busy.dialog() + def fillPhotos(self): + self.setBoolProperty('no.content', False) + self.setBoolProperty('no.content.filtered', False) + items = [] + keys = [] + self.firstOfKeyItems = {} + idx = 0 + + if self.section.TYPE == 'photodirectory': + photos = self.section.all() + else: + photos = self.section.all(filter_=self.getFilterOpts(), sort=self.getSortOpts(), unwatched=self.filterUnwatched) + + if not photos: + return + + photo = random.choice(photos) + self.updateBackgroundFrom(photo) + thumbDim = TYPE_KEYS.get(self.section.type, TYPE_KEYS['movie'])['thumb_dim'] + fallback = 'script.plex/thumb_fallbacks/{0}.png'.format(TYPE_KEYS.get(self.section.type, TYPE_KEYS['movie'])['fallback']) + + if not photos: + if self.filter or self.filterUnwatched: + self.setBoolProperty('no.content.filtered', True) + else: + self.setBoolProperty('no.content', True) + return + + for photo in photos: + title = photo.title + if photo.TYPE == 'photodirectory': + thumb = photo.composite.asTranscodedImageURL(*thumbDim) + mli = kodigui.ManagedListItem(title, thumbnailImage=thumb, data_source=photo) + mli.setProperty('is.folder', '1') + else: + thumb = photo.defaultThumb.asTranscodedImageURL(*thumbDim) + label2 = util.cleanLeadingZeros(photo.originallyAvailableAt.asDatetime('%d %B %Y')) + mli = kodigui.ManagedListItem(title, label2, thumbnailImage=thumb, data_source=photo) + + mli.setProperty('thumb.fallback', fallback) + mli.setProperty('index', str(idx)) + + key = title[0].upper() + if key not in KEYS: + key = '#' + if key not in keys: + self.firstOfKeyItems[key] = mli + keys.append(key) + mli.setProperty('key', str(key)) + items.append(mli) + idx += 1 + + litems = [] + self.keyItems = {} + for i, key in enumerate(keys): + mli = kodigui.ManagedListItem(key, data_source=key) + mli.setProperty('key', key) + mli.setProperty('original', '{0:02d}'.format(i)) + self.keyItems[key] = mli + litems.append(mli) + + self.showPanelControl.reset() + self.keyListControl.reset() + + self.showPanelControl.addItems(items) + self.keyListControl.addItems(litems) + + if keys: + util.setGlobalProperty('key', keys[0]) + + def chunkCallback(self, items, start, clear=False): + if clear: + with self.lock: + items = [kodigui.ManagedListItem('') for i in range(CHUNK_SIZE * 3)] + + self.showPanelControl.reset() + self.showPanelControl.addItems(items) + + self.cleared = True + return + + if self.cleared: + self.cleared = False + busy.widthDialog(self._chunkCallback, self, items, start) + else: + self._chunkCallback(items, start) + + def _chunkCallback(self, items, start): + if self.chunkMode and not self.chunkMode.posIsValid(start): + return + + with self.lock: + if self.chunkMode and not self.chunkMode.posIsValid(start): + return + pos = start + self.setBackground(items, pos, randomize=not util.advancedSettings.dynamicBackgrounds) + + thumbDim = TYPE_KEYS.get(self.section.type, TYPE_KEYS['movie'])['thumb_dim'] + artDim = TYPE_KEYS.get(self.section.type, TYPE_KEYS['movie']).get('art_dim', (256, 256)) + + showUnwatched = False + if (self.section.TYPE in ('movie', 'show') and items[0].TYPE != 'collection') or (self.section.TYPE == 'collection' and items[0].TYPE in ('movie', 'show', 'episode')): # NOTE: A collection with Seasons doesn't have the leafCount/viewedLeafCount until you actually go into the season so we can't update the unwatched count here + showUnwatched = True + + if self.chunkMode and len(items) < CHUNK_SIZE: + items += [None] * (CHUNK_SIZE - len(items)) + + if ITEM_TYPE == 'episode': + for offset, obj in enumerate(items): + mli = self.showPanelControl[pos] + if obj: + mli.dataSource = obj + mli.setProperty('index', str(pos)) + if obj.index: + subtitle = u'{0}{1} \u2022 {2}{3}'.format(T(32310, 'S'), obj.parentIndex, T(32311, 'E'), obj.index) + mli.setProperty('subtitle', subtitle) + subtitle = "\n" + subtitle + else: + subtitle = ' - ' + obj.originallyAvailableAt.asDatetime('%m/%d/%y') + mli.setLabel((obj.defaultTitle or '') + subtitle) + + mli.setThumbnailImage(obj.defaultThumb.asTranscodedImageURL(*thumbDim)) + + mli.setProperty('summary', obj.summary) + + # # mli.setProperty('key', self.chunkMode.getKey(pos)) + + mli.setLabel2(util.durationToText(obj.fixedDuration())) + mli.setProperty('art', obj.defaultArt.asTranscodedImageURL(*artDim)) + if not obj.isWatched: + mli.setProperty('unwatched', '1') + else: + mli.clear() + if obj is False: + mli.setProperty('index', str(pos)) + else: + mli.setProperty('index', '') + + pos += 1 + + elif ITEM_TYPE == 'album': + for offset, obj in enumerate(items): + mli = self.showPanelControl[pos] + if obj: + mli.dataSource = obj + mli.setProperty('index', str(pos)) + mli.setLabel(u'{0}\n{1}'.format(obj.parentTitle, obj.title)) + + mli.setThumbnailImage(obj.defaultThumb.asTranscodedImageURL(*thumbDim)) + + mli.setProperty('summary', obj.summary) + + # # mli.setProperty('key', self.chunkMode.getKey(pos)) + + mli.setLabel2(obj.year) + + if self.chunkMode: + mli.setProperty('key', self.chunkMode.getKey(pos)) + + else: + mli.clear() + if obj is False: + mli.setProperty('index', str(pos)) + else: + mli.setProperty('index', '') + + pos += 1 + else: + for offset, obj in enumerate(items): + mli = self.showPanelControl[pos] + if obj: + mli.setProperty('index', str(pos)) + mli.setLabel(obj.defaultTitle or '') + mli.setThumbnailImage(obj.defaultThumb.asTranscodedImageURL(*thumbDim)) + mli.dataSource = obj + mli.setProperty('summary', obj.get('summary')) + + #if self.chunkMode: + # mli.setProperty('key', self.chunkMode.getKey(pos)) + #else: + # mli.setProperty('key', obj.key) + + if showUnwatched and obj.TYPE != 'collection': + if not obj.isDirectory(): + mli.setLabel2(util.durationToText(obj.fixedDuration())) + mli.setProperty('art', obj.defaultArt.asTranscodedImageURL(*artDim)) + if not obj.isWatched and obj.TYPE != "Directory": + if self.section.TYPE == 'show' or obj.TYPE == 'show' or obj.TYPE == 'season': + mli.setProperty('unwatched.count', str(obj.unViewedLeafCount)) + else: + mli.setProperty('unwatched', '1') + + mli.setProperty('progress', util.getProgressImage(obj)) + else: + mli.clear() + if obj is False: + mli.setProperty('index', str(pos)) + else: + mli.setProperty('index', '') + + pos += 1 + + +class PostersWindow(kodigui.ControlledWindow): + xmlFile = 'script-plex-posters.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + POSTERS_PANEL_ID = 101 + KEY_LIST_ID = 151 + SCROLLBAR_ID = 152 + + OPTIONS_GROUP_ID = 200 + + HOME_BUTTON_ID = 201 + SEARCH_BUTTON_ID = 202 + PLAYER_STATUS_BUTTON_ID = 204 + + SORT_BUTTON_ID = 210 + FILTER1_BUTTON_ID = 211 + FILTER2_BUTTON_ID = 212 + ITEM_TYPE_BUTTON_ID = 312 + + PLAY_BUTTON_ID = 301 + SHUFFLE_BUTTON_ID = 302 + OPTIONS_BUTTON_ID = 303 + VIEWTYPE_BUTTON_ID = 304 + + VIEWTYPE = 'panel' + MULTI_WINDOW_ID = 0 + + CUSTOM_SCOLLBAR_BUTTON_ID = 951 + + +class PostersSmallWindow(PostersWindow): + xmlFile = 'script-plex-posters-small.xml' + VIEWTYPE = 'panel2' + MULTI_WINDOW_ID = 1 + + +class PostersChunkedWindow(PostersWindow): + xmlFile = 'script-plex-listview-16x9-chunked.xml' + VIEWTYPE = 'list' + MULTI_WINDOW_ID = 0 + + +class ListView16x9Window(PostersWindow): + xmlFile = 'script-plex-listview-16x9.xml' + VIEWTYPE = 'list' + MULTI_WINDOW_ID = 2 + + +class ListView16x9ChunkedWindow(PostersWindow): + xmlFile = 'script-plex-listview-16x9-chunked.xml' + VIEWTYPE = 'list' + MULTI_WINDOW_ID = 1 + + +class SquaresWindow(PostersWindow): + xmlFile = 'script-plex-squares.xml' + VIEWTYPE = 'panel' + MULTI_WINDOW_ID = 0 + + +class SquaresChunkedWindow(PostersWindow): + xmlFile = 'script-plex-listview-square-chunked.xml' + VIEWTYPE = 'list' + MULTI_WINDOW_ID = 0 + + +class ListViewSquareWindow(PostersWindow): + xmlFile = 'script-plex-listview-square.xml' + VIEWTYPE = 'list' + MULTI_WINDOW_ID = 1 + + +class ListViewSquareChunkedWindow(PostersWindow): + xmlFile = 'script-plex-listview-square-chunked.xml' + VIEWTYPE = 'list' + MULTI_WINDOW_ID = 1 + + +VIEWS_POSTER = { + 'panel': PostersWindow, + 'panel2': PostersSmallWindow, + 'list': ListView16x9Window, + 'all': (PostersWindow, PostersSmallWindow, ListView16x9Window) +} + +VIEWS_POSTER_CHUNKED = { + 'panel': PostersChunkedWindow, + 'list': ListView16x9ChunkedWindow, + 'all': (PostersChunkedWindow, ListView16x9ChunkedWindow) +} + +VIEWS_SQUARE = { + 'panel': SquaresWindow, + 'list': ListViewSquareWindow, + 'all': (SquaresWindow, ListViewSquareWindow) +} + +VIEWS_SQUARE_CHUNKED = { + 'panel': SquaresChunkedWindow, + 'list': ListViewSquareChunkedWindow, + 'all': (SquaresChunkedWindow, ListViewSquareChunkedWindow) +} \ No newline at end of file diff --git a/script.plexmod/lib/windows/mixins.py b/script.plexmod/lib/windows/mixins.py new file mode 100644 index 000000000..1e3586847 --- /dev/null +++ b/script.plexmod/lib/windows/mixins.py @@ -0,0 +1,61 @@ +# coding=utf-8 + +from lib import util + +from . import kodigui + + +class SeasonsMixin(): + SEASONS_CONTROL_ATTR = "subItemListControl" + + THUMB_DIMS = { + 'show': { + 'main.thumb': util.scaleResolution(347, 518), + 'item.thumb': util.scaleResolution(174, 260) + }, + 'episode': { + 'main.thumb': util.scaleResolution(347, 518), + 'item.thumb': util.scaleResolution(198, 295) + }, + 'artist': { + 'main.thumb': util.scaleResolution(519, 519), + 'item.thumb': util.scaleResolution(215, 215) + } + } + + def _createListItem(self, mediaItem, obj): + mli = kodigui.ManagedListItem( + obj.title or '', + thumbnailImage=obj.defaultThumb.asTranscodedImageURL(*self.THUMB_DIMS[mediaItem.type]['item.thumb']), + data_source=obj + ) + return mli + + def fillSeasons(self, mediaItem, update=False, seasonsFilter=None, selectSeason=None): + seasons = mediaItem.seasons() + if not seasons or (seasonsFilter and not seasonsFilter(seasons)): + return False + + items = [] + idx = 0 + for season in seasons: + if selectSeason and season == selectSeason: + continue + + mli = self._createListItem(mediaItem, season) + if mli: + mli.setProperty('index', str(idx)) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/show.png') + mli.setProperty('unwatched.count', not season.isWatched and str(season.unViewedLeafCount) or '') + items.append(mli) + idx += 1 + + subItemListControl = getattr(self, self.SEASONS_CONTROL_ATTR) + if update: + subItemListControl.replaceItems(items) + else: + subItemListControl.reset() + subItemListControl.addItems(items) + + return True + diff --git a/script.plexmod/lib/windows/musicplayer.py b/script.plexmod/lib/windows/musicplayer.py new file mode 100644 index 000000000..d2277eb5e --- /dev/null +++ b/script.plexmod/lib/windows/musicplayer.py @@ -0,0 +1,169 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui +from . import currentplaylist +from . import opener + +from lib import player +from lib import util + + +def timeDisplay(ms): + h = ms / 3600000 + m = (ms % 3600000) / 60000 + s = (ms % 60000) / 1000 + return '{0:0>2}:{1:0>2}:{2:0>2}'.format(h, m, s) + + +def simplifiedTimeDisplay(ms): + left, right = timeDisplay(ms).rsplit(':', 1) + left = left.lstrip('0:') or '0' + return left + ':' + right + + +class MusicPlayerWindow(currentplaylist.CurrentPlaylistWindow): + xmlFile = 'script-plex-music_player.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + SEEK_BUTTON_ID = 100 + SEEK_IMAGE_ID = 200 + SHUFFLE_REMOTE_BUTTON_ID = 422 + REPEAT_BUTTON_ID = 401 + SKIP_PREV_BUTTON_ID = 404 + SKIP_NEXT_BUTTON_ID = 409 + STOP_BUTTON_ID = 407 + + SEEK_IMAGE_WIDTH = 1920 + + BAR_RIGHT = 1920 + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + self.track = kwargs.get('track') + self.playlist = kwargs.get('playlist') + self.album = kwargs.get('album') + self.selectedOffset = 0 + self.exitCommand = None + + if self.track: + self.duration = self.track.duration.asInt() + else: + self.setDuration() + + def onFirstInit(self): + if self.playlist and self.playlist.isRemote: + self.playlist.on('change', self.updateProperties) + self.setupSeekbar() + self.selectionBoxMax = self.SEEK_IMAGE_WIDTH - (self.selectionBoxHalf - 3) + + self.updateProperties() + self.play() + self.setFocusId(406) + + def doClose(self, **kwargs): + player.PLAYER.off('playback.started', self.onPlayBackStarted) + if self.playlist and self.playlist.isRemote: + self.playlist.off('change', self.updateProperties) + kodigui.ControlledWindow.doClose(self) + + def onAction(self, action): + try: + if action == xbmcgui.ACTION_STOP: + self.stopButtonClicked() + return + except: + util.ERROR() + + super().onAction(action) + + def onClick(self, controlID): + if controlID == self.PLAYLIST_BUTTON_ID: + self.showPlaylist() + elif controlID == self.SEEK_BUTTON_ID: + self.seekButtonClicked() + elif controlID == self.SHUFFLE_REMOTE_BUTTON_ID: + self.playlist.setShuffle() + elif controlID == self.REPEAT_BUTTON_ID: + self.repeatButtonClicked() + elif controlID == self.SKIP_PREV_BUTTON_ID: + self.skipPrevButtonClicked() + elif controlID == self.SKIP_NEXT_BUTTON_ID: + self.skipNextButtonClicked() + elif controlID == self.OPTIONS_BUTTON_ID: + self.optionsButtonClicked((1240, 1060)) + elif controlID == self.STOP_BUTTON_ID: + self.stopButtonClicked() + + def repeatButtonClicked(self): + if self.playlist and self.playlist.isRemote: + if xbmc.getCondVisibility('Playlist.IsRepeatOne'): + xbmc.executebuiltin('PlayerControl(RepeatOff)') + elif self.playlist.isRepeat: + self.playlist.setRepeat(False) + self.playlist.refresh(force=True) + xbmc.executebuiltin('PlayerControl(RepeatOne)') + else: + self.playlist.setRepeat(True) + self.playlist.refresh(force=True) + else: + xbmc.executebuiltin('PlayerControl(Repeat)') + + def skipPrevButtonClicked(self): + if not xbmc.getCondVisibility('MusicPlayer.HasPrevious') and self.playlist and self.playlist.isRemote: + util.DEBUG_LOG('MusicPlayer: No previous in Kodi playlist - refreshing remote PQ') + if not self.playlist.refresh(force=True, wait=True): + return + + xbmc.executebuiltin('PlayerControl(Previous)') + + def skipNextButtonClicked(self): + if not xbmc.getCondVisibility('MusicPlayer.HasNext') and self.playlist and self.playlist.isRemote: + util.DEBUG_LOG('MusicPlayer: No next in Kodi playlist - refreshing remote PQ') + if not self.playlist.refresh(force=True, wait=True): + return + + xbmc.executebuiltin('PlayerControl(Next)') + + def showPlaylist(self): + self.processCommand(opener.handleOpen(currentplaylist.CurrentPlaylistWindow, winID=xbmcgui.getCurrentWindowId())) + + def stopButtonClicked(self): + self.doClose() + + def updateProperties(self, **kwargs): + if self.playlist: + if self.playlist.isRemote: + self.setProperty('pq.isRemote', '1') + self.setProperty('pq.hasnext', self.playlist.allowSkipNext and '1' or '') + self.setProperty('pq.hasprev', self.playlist.allowSkipPrev and '1' or '') + self.setProperty('pq.repeat', self.playlist.isRepeat and '1' or '') + self.setProperty('pq.shuffled', self.playlist.isShuffled and '1' or '') + else: + self.setProperties(('pq.isRemote', 'pq.hasnext', 'pq.hasprev', 'pq.repeat', 'pq.shuffled'), '') + + def play(self): + if not self.track: + return + + if util.trackIsPlaying(self.track): + return + + fanart = None + if self.playlist: + fanart = self.playlist.get('composite') or self.playlist.defaultArt + # player.PLAYER.playAudio(self.track, fanart=self.getProperty('background')) + if self.album: + index = 0 + for i, track in enumerate(self.album.tracks()): + if track == self.track: + index = i + player.PLAYER.playAlbum(self.album, startpos=index, fanart=fanart) + elif self.playlist: + player.PLAYER.playAudioPlaylist(self.playlist, startpos=list(self.playlist.items()).index(self.track), fanart=fanart) + else: + player.PLAYER.playAudio(self.track) diff --git a/script.plexmod/lib/windows/opener.py b/script.plexmod/lib/windows/opener.py new file mode 100644 index 000000000..4aed06b2d --- /dev/null +++ b/script.plexmod/lib/windows/opener.py @@ -0,0 +1,169 @@ +from __future__ import absolute_import +from . import busy + +from plexnet import playqueue, plexapp, plexlibrary +from lib import util +import six + + +def open(obj, **kwargs): + if isinstance(obj, playqueue.PlayQueue): + if busy.widthDialog(obj.waitForInitialization, None): + if obj.type == 'audio': + from . import musicplayer + return handleOpen(musicplayer.MusicPlayerWindow, track=obj.current(), playlist=obj) + elif obj.type == 'photo': + from . import photos + return handleOpen(photos.PhotoWindow, play_queue=obj) + else: + from . import videoplayer + videoplayer.play(play_queue=obj) + return '' + elif isinstance(obj, six.string_types): + key = obj + if not obj.startswith('/'): + key = '/library/metadata/{0}'.format(obj) + return open(plexapp.SERVERMANAGER.selectedServer.getObject(key), **kwargs) + elif obj.TYPE == 'episode': + return episodeClicked(obj, **kwargs) + elif obj.TYPE == 'movie': + return playableClicked(obj, **kwargs) + elif obj.TYPE in ('show'): + return showClicked(obj, **kwargs) + elif obj.TYPE in ('artist'): + return artistClicked(obj, **kwargs) + elif obj.TYPE in ('season'): + return seasonClicked(obj, **kwargs) + elif obj.TYPE in ('album'): + return albumClicked(obj, **kwargs) + elif obj.TYPE in ('photo',): + return photoClicked(obj, **kwargs) + elif obj.TYPE in ('photodirectory'): + return photoDirectoryClicked(obj, **kwargs) + elif obj.TYPE in ('track'): + return trackClicked(obj, **kwargs) + elif obj.TYPE in ('playlist'): + return playlistClicked(obj, **kwargs) + elif obj.TYPE in ('clip'): + from . import videoplayer + return videoplayer.play(video=obj) + elif obj.TYPE in ('collection'): + return collectionClicked(obj, **kwargs) + elif obj.TYPE in ('Genre'): + return genreClicked(obj, **kwargs) + elif obj.TYPE in ('Director'): + return directorClicked(obj, **kwargs) + elif obj.TYPE in ('Role'): + return actorClicked(obj, **kwargs) + + +def handleOpen(winclass, **kwargs): + w = None + try: + autoPlay = kwargs.pop("auto_play", False) + if autoPlay and hasattr(winclass, "doAutoPlay"): + w = winclass.create(show=False, **kwargs) + if w.doAutoPlay(): + w.modal() + else: + w = winclass.open(**kwargs) + return w.exitCommand or '' + except AttributeError: + pass + except util.NoDataException: + raise + finally: + del w + util.garbageCollect() + + return '' + + +def playableClicked(playable, **kwargs): + from . import preplay + return handleOpen(preplay.PrePlayWindow, video=playable, **kwargs) + + +def episodeClicked(episode, **kwargs): + from . import episodes + return handleOpen(episodes.EpisodesWindow, episode=episode, **kwargs) + + +def showClicked(show, **kwargs): + from . import subitems + return handleOpen(subitems.ShowWindow, media_item=show, **kwargs) + + +def artistClicked(artist, **kwargs): + from . import subitems + return handleOpen(subitems.ArtistWindow, media_item=artist, **kwargs) + + +def seasonClicked(season, **kwargs): + from . import episodes + return handleOpen(episodes.EpisodesWindow, season=season, **kwargs) + + +def albumClicked(album, **kwargs): + from . import tracks + return handleOpen(tracks.AlbumWindow, album=album, **kwargs) + + +def photoClicked(photo, **kwargs): + from . import photos + return handleOpen(photos.PhotoWindow, photo=photo, **kwargs) + + +def trackClicked(track, **kwargs): + from . import musicplayer + return handleOpen(musicplayer.MusicPlayerWindow, track=track, **kwargs) + + +def photoDirectoryClicked(photodirectory, **kwargs): + return sectionClicked(photodirectory, **kwargs) + + +def playlistClicked(pl, **kwargs): + from . import playlist + return handleOpen(playlist.PlaylistWindow, playlist=pl, **kwargs) + + +def collectionClicked(collection, **kwargs): + return sectionClicked(collection, **kwargs) + + +def sectionClicked(section, filter_=None, **kwargs): + from . import library + library.ITEM_TYPE = section.TYPE + key = section.key + if not key.isdigit(): + key = section.getLibrarySectionId() + viewtype = util.getSetting('viewtype.{0}.{1}'.format(section.server.uuid, key)) + if section.TYPE in ('artist', 'photo', 'photodirectory'): + default = library.VIEWS_SQUARE.get(viewtype) + return handleOpen( + library.LibraryWindow, windows=library.VIEWS_SQUARE.get('all'), default_window=default, section=section, filter_=filter_, **kwargs + ) + else: + default = library.VIEWS_POSTER.get(viewtype) + return handleOpen( + library.LibraryWindow, windows=library.VIEWS_POSTER.get('all'), default_window=default, section=section, filter_=filter_, **kwargs + ) + + +def genreClicked(genre, **kwargs): + section = plexlibrary.LibrarySection.fromFilter(genre) + filter_ = {'type': genre.FILTER, 'display': 'Genre', 'sub': {'val': genre.id, 'display': genre.tag}} + return sectionClicked(section, filter_, **kwargs) + + +def directorClicked(director, **kwargs): + section = plexlibrary.LibrarySection.fromFilter(director) + filter_ = {'type': director.FILTER, 'display': 'Director', 'sub': {'val': director.id, 'display': director.tag}} + return sectionClicked(section, filter_, **kwargs) + + +def actorClicked(actor, **kwargs): + section = plexlibrary.LibrarySection.fromFilter(actor) + filter_ = {'type': actor.FILTER, 'display': 'Actor', 'sub': {'val': actor.id, 'display': actor.tag}} + return sectionClicked(section, filter_, ignoreLibrarySettings=True, **kwargs) diff --git a/script.plexmod/lib/windows/optionsdialog.py b/script.plexmod/lib/windows/optionsdialog.py new file mode 100644 index 000000000..dbbd0961e --- /dev/null +++ b/script.plexmod/lib/windows/optionsdialog.py @@ -0,0 +1,55 @@ +from __future__ import absolute_import +from . import kodigui + +from lib import util + + +class OptionsDialog(kodigui.BaseDialog): + xmlFile = 'script-plex-options_dialog.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + GROUP_ID = 100 + BUTTON_IDS = (1001, 1002, 1003) + + def __init__(self, *args, **kwargs): + kodigui.BaseDialog.__init__(self, *args, **kwargs) + self.header = kwargs.get('header') + self.info = kwargs.get('info') + self.button0 = kwargs.get('button0') + self.button1 = kwargs.get('button1') + self.button2 = kwargs.get('button2') + self.buttonChoice = None + + def onFirstInit(self): + self.setProperty('header', self.header) + self.setProperty('info', self.info) + + if self.button2: + self.setProperty('button.2', self.button2) + + if self.button1: + self.setProperty('button.1', self.button1) + + if self.button0: + self.setProperty('button.0', self.button0) + + self.setBoolProperty('initialized', True) + util.MONITOR.waitForAbort(0.1) + self.setFocusId(self.BUTTON_IDS[0]) + + def onClick(self, controlID): + if controlID in self.BUTTON_IDS: + self.buttonChoice = self.BUTTON_IDS.index(controlID) + self.doClose() + + +def show(header, info, button0=None, button1=None, button2=None): + w = OptionsDialog.open(header=header, info=info, button0=button0, button1=button1, button2=button2) + choice = w.buttonChoice + del w + util.garbageCollect() + return choice diff --git a/script.plexmod/lib/windows/pagination.py b/script.plexmod/lib/windows/pagination.py new file mode 100644 index 000000000..474be481c --- /dev/null +++ b/script.plexmod/lib/windows/pagination.py @@ -0,0 +1,274 @@ +from __future__ import absolute_import +from . import kodigui +from kodi_six import xbmcgui +from lib import util + + +class MCLPaginator(object): + """ + A paginator for ManagedControlList instances + """ + control = None + pageSize = 8 + initialPageSize = 18 # + orphans = 26 + + # the amount of overhang allowed for both sides; don't show pagination when the overhang fits the current item count + orphans = pageSize + offset = 0 + leafCount = None + parentWindow = None + thumbFallback = None + + _direction = None + _currentAmount = None + _lastAmount = None + _boundaryHit = False + + def __init__(self, control, parent_window, page_size=None, orphans=None, leaf_count=None): + self.control = control + self.pageSize = page_size if page_size is not None else self.pageSize + self.orphans = orphans if orphans is not None else self.orphans + self.leafCount = leaf_count + self.parentWindow = parent_window + + self.reset() + + def reset(self): + self.offset = 0 + self._currentAmount = 0 + self._lastAmount = None + self._boundaryHit = False + self._direction = None + + def getData(self, offset, amount): + raise NotImplementedError + + def createListItem(self, data): + return self.parentWindow.createListItem(data) + + def prepareListItem(self, data, mli): + pass + + def readyForPaging(self): + return self.parentWindow.initialized + + @property + def _readyForPaging(self): + return self.readyForPaging() + + @property + def boundaryHit(self): + self._boundaryHit = False + + if not self._readyForPaging: + return + + mli = self.control.getSelectedItem() + if mli and mli.getProperty("is.boundary") and not mli.getProperty("is.updating"): + direction = "left" if mli.getProperty("left.boundary") else "right" + mli.setBoolProperty("is.updating", True) + self.offset = int(mli.getProperty("orig.index")) + self._direction = direction + self._boundaryHit = True + + return self._boundaryHit + + @property + def nextPage(self): + leafCount = self.leafCount + offset = self.offset + amount = self.pageSize + + if self._direction == "left": + if offset <= self.initialPageSize: + # return to initial page + offset = 0 + amount = self.initialPageSize + else: + # move the slice to the left by :amount: based on :offset: + amount = min(offset, self.pageSize) + offset -= amount + + # avoid short pages on the left end + if 0 < offset < self.orphans: + amount += offset + offset = 0 + + else: + # move the slice to the right + itemsLeft = leafCount - offset + # avoid short pages on the right end + if itemsLeft <= self.pageSize + self.orphans: + amount = self.pageSize + self.orphans + + self.offset = offset + data = self.getData(offset, amount) + self._lastAmount = self._currentAmount + self._currentAmount = len(data) + return data + + @property + def initialPage(self): + amount = self.initialPageSize + if self.initialPageSize + self.orphans >= self.leafCount: + amount = self.initialPageSize + self.orphans + + data = self.getData(self.offset, amount) + if data: + self._lastAmount = self._currentAmount + self._currentAmount = len(data) + return data + + def populate(self, items): + """ + Populates the current page to the bound Control List. Adds prev/next MLIs and selects the correct control + after doing so. + :param items: + :return: + """ + idx = 0 + moreLeft = self.offset > 0 + moreRight = self.offset + self._currentAmount < self.leafCount + + finalItems = [] + thumbFallback = self.thumbFallback + + if items: + for item in items: + mli = self.createListItem(item) + + if mli: + mli.setProperty('index', str(idx)) + self.prepareListItem(item, mli) + if thumbFallback: + if callable(thumbFallback): + mli.setProperty('thumb.fallback', thumbFallback(item)) + else: + mli.setProperty('thumb.fallback', thumbFallback) + + finalItems.append(mli) + idx += 1 + + if moreRight: + end = kodigui.ManagedListItem('') + end.setBoolProperty('is.boundary', True) + end.setBoolProperty('right.boundary', True) + end.setProperty("orig.index", str(int(self.offset + self._currentAmount))) + finalItems.append(end) + else: + # no boundary, rightmost item + finalItems[-1].setBoolProperty('last.item', True) + + if moreLeft: + start = kodigui.ManagedListItem('') + start.setBoolProperty('is.boundary', True) + start.setBoolProperty('left.boundary', True) + start.setProperty("orig.index", str(int(self.offset))) + finalItems.insert(0, start) + + self.control.replaceItems(finalItems) + self.selectItem(self._currentAmount, more_left=moreLeft, more_right=moreRight, items=items) + + return finalItems + + def selectItem(self, amount, more_left=False, more_right=False, items=None): + if self._direction: + if self._direction == "left": + self.control.selectItem(amount - (1 if not more_left else 0)) + return True + + elif self._direction == "right": + self.control.selectItem(1) + return True + + def paginate(self, force_page=False): + """ + Triggers the pagination for the currently selected view. In case of a hit boundary, show the next or previous + page, otherwise show the initial page. + :return: + """ + if self._boundaryHit or force_page: + items = self.nextPage + + else: + items = self.initialPage + + return self.populate(items) + + @property + def canSimpleWrap(self): + return self.initialPageSize + self.orphans >= self.leafCount + + def wrap(self, mli, last_mli, action): + """ + Wraps around the list if the first or last item is currently selected and the user requests to round robin. + :param mli: current item + :param last_mli: previous item + :param action: xbmcgui action + :return: + """ + + index = int(mli.getProperty("index")) + last_mli_index = int(last_mli.getProperty("index")) + + # special case for our absolute last item + is_rightmost = action == xbmcgui.ACTION_MOVE_RIGHT \ + and mli.getProperty('last.item') \ + and last_mli.getProperty('last.item') + + # _lastAmount is used to immediately wrap again after a wrap has happened; potentially an issue + if not is_rightmost and last_mli_index not in \ + (0, self._currentAmount - 1, (self._lastAmount - 1) if self._lastAmount else None) \ + or self._currentAmount < 2: + return + + onlyTwo = self._currentAmount == 2 + + items = None + if action == xbmcgui.ACTION_MOVE_LEFT and index == 0: + if onlyTwo and last_mli_index == self._currentAmount - 1: + return + + if not self.canSimpleWrap: + self._direction = "right" + self.offset = self.leafCount - self.orphans - self.pageSize + items = self.paginate(force_page=True) + self.control.selectItem(self._currentAmount) + else: + self.control.selectItem(self.leafCount - 1) + elif action == xbmcgui.ACTION_MOVE_RIGHT and (index == self._currentAmount - 1 or is_rightmost): + if onlyTwo and last_mli_index == 0: + return + + if not self.canSimpleWrap: + self._direction = "left" + self.offset = 0 + items = self.paginate() + self.control.selectItem(0) + + if items: + return items + + +class BaseRelatedPaginator(MCLPaginator): + initialPageSize = 8 + pageSize = initialPageSize + orphans = initialPageSize // 2 + + thumbFallback = lambda self, rel: 'script.plex/thumb_fallbacks/{0}.png'.format( + rel.type in ('show', 'season', 'episode') and 'show' or 'movie') + + def createListItem(self, rel): + return kodigui.ManagedListItem( + rel.title or '', + thumbnailImage=rel.defaultThumb.asTranscodedImageURL(*self.parentWindow.RELATED_DIM), + data_source=rel + ) + + def prepareListItem(self, data, mli): + if data.type in ('season', 'show'): + if not mli.dataSource.isWatched: + mli.setProperty('unwatched.count', str(mli.dataSource.unViewedLeafCount)) + else: + mli.setProperty('unwatched', not mli.dataSource.isWatched and '1' or '') + mli.setProperty('progress', util.getProgressImage(mli.dataSource)) diff --git a/script.plexmod/lib/windows/photos.py b/script.plexmod/lib/windows/photos.py new file mode 100644 index 000000000..df43a7e93 --- /dev/null +++ b/script.plexmod/lib/windows/photos.py @@ -0,0 +1,530 @@ +from __future__ import absolute_import +import threading +import time +import os +import tempfile +import shutil +import hashlib +import requests + +from kodi_six import xbmc, xbmcvfs +from kodi_six import xbmcgui + +from . import kodigui +from . import busy + +from lib import util, colors +from plexnet import plexapp, plexplayer, playqueue + + +class PhotoWindow(kodigui.BaseWindow): + xmlFile = 'script-plex-photo.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + OVERLAY_BUTTON_ID = 250 + OSD_GROUP_ID = 200 + + OSD_BUTTONS_GROUP_ID = 400 + REPEAT_BUTTON_ID = 401 + SHUFFLE_BUTTON_ID = 402 + ROTATE_BUTTON_ID = 403 + PREV_BUTTON_ID = 404 + PLAY_PAUSE_BUTTON_ID = 406 + STOP_BUTTON_ID = 407 + NEXT_BUTTON_ID = 409 + PQUEUE_BUTTON_ID = 412 + + PQUEUE_LIST_ID = 500 + PQUEUE_LIST_OVERLAY_BUTTON_ID = 501 + + SLIDESHOW_INTERVAL = util.slideshowInterval + + PHOTO_STACK_SIZE = 10 + tempSubFolder = ("p4k", "photos") + + def __init__(self, *args, **kwargs): + kodigui.BaseWindow.__init__(self, *args, **kwargs) + self.photo = kwargs.get('photo') + self.playQueue = kwargs.get('play_queue') + self.playerObject = None + self.timelineType = 'photo' + self.lastTimelineState = None + self.ignoreTimelines = False + self.trueTime = 0 + self.slideshowThread = None + self.slideshowRunning = False + self.slideshowNext = 0 + self.osdTimer = None + self.lastItem = None + self.showPhotoThread = None + self.showPhotoTimeout = 0 + self.rotate = 0 + self.tempFolder = None + self.photoStack = [] + self.initialLoad = True + + def onFirstInit(self): + self.tempFolder = os.path.join(util.translatePath("special://temp/"), *self.tempSubFolder) + + if not os.path.exists(self.tempFolder): + try: + os.makedirs(self.tempFolder) + except OSError: + if not os.path.isdir(self.tempFolder): + util.ERROR() + + self.pqueueList = kodigui.ManagedControlList(self, self.PQUEUE_LIST_ID, 14) + #self.setProperty('photo', 'script.plex/indicators/busy-photo.gif') + try: + self.getPlayQueue() + except AttributeError: + raise util.NoDataException + self.start() + self.osdTimer = kodigui.PropertyTimer(self._winID, 4, 'OSD', '', init_value=False, callback=self.osdTimerCallback) + self.imageControl = self.getControl(600) + + def osdTimerCallback(self): + self.setFocusId(self.OVERLAY_BUTTON_ID) + + def onAction(self, action): + try: + # controlID = self.getFocusId() + if action == xbmcgui.ACTION_MOVE_LEFT: + if not self.osdVisible() or self.getFocusId() == self.PQUEUE_LIST_OVERLAY_BUTTON_ID: + self.prev() + elif action == xbmcgui.ACTION_MOVE_RIGHT: + if not self.osdVisible() or self.getFocusId() == self.PQUEUE_LIST_OVERLAY_BUTTON_ID: + self.next() + elif action == xbmcgui.ACTION_MOVE_UP: + if self.osdVisible(): + if self.getFocusId() == self.OVERLAY_BUTTON_ID: + self.hideOSD() + else: + self.showOSD() + elif action == xbmcgui.ACTION_MOVE_DOWN: + if self.osdVisible(): + if self.getFocusId() == self.OVERLAY_BUTTON_ID: + self.hideOSD() + else: + self.showOSD() + elif action == xbmcgui.ACTION_STOP: + self.stop() + elif action in (xbmcgui.ACTION_PLAYER_PLAY, xbmcgui.ACTION_PAUSE): + if self.isPlaying(): + self.pause() + else: + self.play() + elif action == xbmcgui.ACTION_PREV_ITEM: + self.prev() + elif action == xbmcgui.ACTION_NEXT_ITEM: + self.next() + elif action in (xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK): + if self.osdVisible(): + self.hideOSD() + return + self.doClose() + return + + self.osdTimer.reset(init=False) + except: + util.ERROR() + + kodigui.BaseWindow.onAction(self, action) + + def checkPqueueListChanged(self): + item = self.pqueueList.getSelectedItem() + if item == self.lastItem: + return + + self.lastItem = item + self.onPqueueListChanged() + + def onClick(self, controlID): + if controlID == self.PREV_BUTTON_ID: + self.prev() + elif controlID == self.NEXT_BUTTON_ID: + next(self) + elif controlID == self.PLAY_PAUSE_BUTTON_ID: + if self.isPlaying(): + self.pause() + else: + self.play() + elif controlID == self.STOP_BUTTON_ID: + self.stop() + elif controlID == self.OVERLAY_BUTTON_ID: + self.showOSD() + elif controlID == self.SHUFFLE_BUTTON_ID: + self.shuffleButtonClicked() + elif controlID == self.REPEAT_BUTTON_ID: + self.repeatButtonClicked() + elif controlID == self.ROTATE_BUTTON_ID: + self.setRotation() + + def shuffleButtonClicked(self): + self.playQueue.setShuffle() + + def repeatButtonClicked(self): + if self.playQueue.isRepeat: + self.playQueue.setRepeat(False) + self.playQueue.refresh(force=True) + else: + self.playQueue.setRepeat(True) + self.playQueue.refresh(force=True) + + def setRotation(self, angle=None): + if angle is None: + self.resetSlideshowTimeout() + self.rotate += 90 + if self.rotate > 270: + self.rotate = 0 + else: + self.rotate = angle + + if self.rotate == 90: + self.imageControl.setPosition(420, -420) + self.imageControl.setWidth(1080) + self.imageControl.setHeight(1920) + elif self.rotate == 180: + self.imageControl.setPosition(0, 0) + self.imageControl.setWidth(1920) + self.imageControl.setHeight(1080) + elif self.rotate == 270: + self.imageControl.setPosition(420, -420) + self.imageControl.setWidth(1080) + self.imageControl.setHeight(1920) + else: + self.imageControl.setPosition(0, 0) + self.imageControl.setWidth(1920) + self.imageControl.setHeight(1080) + + self.setProperty('rotate', str(self.rotate)) + + def isPlaying(self): + return bool(self.getProperty('playing')) + + def getPlayQueue(self, shuffle=False): + if self.playQueue: + self.playQueue.on('items.changed', self.fillPqueueList) + self.playQueue.on('change', self.updateProperties) + self.updateProperties() + self.fillPqueueList() + else: + self.playQueue = playqueue.createPlayQueueForItem(self.photo, options={'shuffle': shuffle}) + self.playQueue.on('items.changed', self.fillPqueueList) + self.playQueue.on('change', self.updateProperties) + + util.DEBUG_LOG('waiting for playQueue to initialize') + if busy.widthDialog(self.playQueue.waitForInitialization, None): + util.DEBUG_LOG('playQueue initialized: {0}'.format(self.playQueue)) + else: + util.DEBUG_LOG('playQueue timed out wating for initialization') + + self.showPhoto() + + def fillPqueueList(self, **kwargs): + items = [] + for qi in self.playQueue.items(): + mli = kodigui.ManagedListItem(thumbnailImage=qi.thumb.asTranscodedImageURL(123, 123), data_source=qi) + items.append(mli) + + self.pqueueList.replaceItems(items) + self.updatePqueueListSelection() + + def updatePqueueListSelection(self, current=None): + selected = self.pqueueList.getListItemByDataSource(current or self.playQueue.current()) + if not selected or not selected.pos(): + return + + self.pqueueList.selectItem(selected.pos()) + + def showPhoto(self, trigger=None, **kwargs): + self.slideshowNext = 0 + + if not self.showPhotoThread or not self.showPhotoThread.is_alive(): + # if trigger is given, trigger it. trigger loads the next or prev item, depending on what was requested + # doing this here, this late prevents erratic behaviour when multiple next/prev calls were made but we were + # still loading images + if trigger: + trigger() + self.updateProperties() + + photo = self.playQueue.current() + + # fixme: video should work. + # bad temporary fix for videos in photo playqueues + if photo.type != "photo": + self.next() + util.DEBUG_LOG("SKIPPING PHOTO: %s" % photo) + return + + self.updatePqueueListSelection(photo) + + self.showPhotoTimeout = time.time() + 0.2 + if not self.showPhotoThread or not self.showPhotoThread.is_alive(): + self.showPhotoThread = threading.Thread(target=self._showPhoto, name="showphoto") + self.showPhotoThread.start() + + # wait for the current thread to end, which might still be loading the surrounding images, for 10 seconds + elif self.showPhotoThread.is_alive(): + waitedFor = 0 + self.setBoolProperty('is.updating', True) + while waitedFor < 100: + if not self.showPhotoThread.is_alive() and not util.MONITOR.abortRequested(): + return self.showPhoto(trigger=trigger, **kwargs) + elif util.MONITOR.abortRequested(): + self.setBoolProperty('is.updating', False) + return + + util.MONITOR.waitForAbort(0.1) + waitedFor += 0.1 + + # fixme raise error here + + def _showPhoto(self): + """ + load the current photo, preload the previous and the next one + :return: + """ + photo = self.playQueue.current() + next = self.playQueue.getNext() + loadItems = (photo, next, self.playQueue.getPrev()) + for item in loadItems: + if item is not None: + item.softReload() + + self.playerObject = plexplayer.PlexPhotoPlayer(photo) + + addToStack = [] + currentFailed = False + try: + for item in loadItems: + if not item: + continue + + if item.type != "photo": + continue + + meta = self.playerObject.build(item=item) + url = photo.server.getImageTranscodeURL(meta.get('url', ''), self.width, self.height) + bgURL = item.thumb.asTranscodedImageURL(self.width, self.height, blur=128, opacity=60, + background=colors.noAlpha.Background) + + isCurrent = currentFailed or item == photo + if isCurrent and not self.initialLoad: + self.setBoolProperty('is.updating', True) + + path, background = self.getCachedPhotoData(url, bgURL) + if not (path and background): + currentFailed = True + continue + + if (path, background) not in self.photoStack: + if item == next: + # move the next image to the top of the stack + addToStack.insert(0, (path, background)) + else: + addToStack.append((path, background)) + + if isCurrent: + self._reallyShowPhoto(item, path, background) + self.setBoolProperty('is.updating', False) + self.initialLoad = False + + # maintain cache folder + self.photoStack = addToStack + self.photoStack + if len(self.photoStack) > self.PHOTO_STACK_SIZE: + clean = self.photoStack[self.PHOTO_STACK_SIZE:] + self.photoStack = self.photoStack[:self.PHOTO_STACK_SIZE] + for remList in clean: + for rem in remList: + try: + os.remove(rem) + except: + pass + finally: + self.setBoolProperty('is.updating', False) + + def getCachedPhotoData(self, url, bgURL): + if not url: + return + + basename = hashlib.sha1(url.encode('utf-8')).hexdigest() + tmpPath = os.path.join(self.tempFolder, basename) + tmpBgPath = os.path.join(self.tempFolder, "%s_bg" % basename) + + for p, url in ((tmpPath, url), (tmpBgPath, bgURL)): + if not os.path.exists(p):# and not xbmc.getCacheThumbName(tmpFn): + try: + r = requests.get(url, allow_redirects=True, timeout=10.0) + r.raise_for_status() + except Exception as e: + util.ERROR("Couldn't load image: %s" % e, notify=True) + return None, None + else: + try: + with open(p, 'wb') as f: + f.write(r.content) + except: + return None, None + + return tmpPath, tmpBgPath + + def _reallyShowPhoto(self, photo, path, background): + self.setRotation(0) + self.setProperty('photo', path) + self.setProperty('background', background) + + self.setProperty('photo.title', photo.title) + self.setProperty('photo.date', util.cleanLeadingZeros(photo.originallyAvailableAt.asDatetime('%d %B %Y'))) + self.setProperty('camera.model', photo.media[0].model) + self.setProperty('camera.lens', photo.media[0].lens) + + if photo.media[0].height: + dims = u'{0} x {1}{2}'.format( + photo.media[0].width, + photo.media[0].height, + photo.media[0].parts[0].orientation and u' \u2022 {0} Mo'.format(photo.media[0].parts[0].orientation) or '' + ) + self.setProperty('photo.dims', dims) + settings = [] + if photo.media[0].iso: + settings.append('ISO {0}'.format(photo.media[0].iso)) + if photo.media[0].aperture: + settings.append('{0}'.format(photo.media[0].aperture)) + if photo.media[0].exposure: + settings.append('{0}'.format(photo.media[0].exposure)) + self.setProperty('camera.settings', u' \u2022 '.join(settings)) + self.setProperty('photo.summary', photo.summary) + container = photo.media[0].container_ or os.path.splitext(photo.media[0].parts[0].file)[-1][1:].lower() + if container == 'jpg': + container = 'jpeg' + self.setProperty('photo.container', container) + self.updateNowPlaying(force=True, refreshQueue=True) + self.resetSlideshowTimeout() + + def updateProperties(self, **kwargs): + self.setProperty('pq.shuffled', self.playQueue.isShuffled and '1' or '') + self.setProperty('pq.repeat', self.playQueue.isRepeat and '1' or '') + if not self.getProperty('hide.prev') and not self.playQueue.hasPrev(): + if self.playQueue.hasNext(): + self.setFocusId(self.NEXT_BUTTON_ID) + else: + self.setFocusId(self.PLAY_PAUSE_BUTTON_ID) + self.setProperty('hide.prev', not self.playQueue.hasPrev() and '1' or '') + if not self.getProperty('hide.next') and not self.playQueue.hasNext(): + if self.playQueue.hasPrev(): + self.setFocusId(self.PREV_BUTTON_ID) + else: + self.setFocusId(self.PLAY_PAUSE_BUTTON_ID) + self.setProperty('hide.next', not self.playQueue.hasNext() and '1' or '') + + def slideshow(self): + util.DEBUG_LOG('Slideshow: STARTED') + self.slideshowRunning = True + + # inhibit screensaver in matrix and above + if util.KODI_VERSION_MAJOR > 18: + xbmc.executebuiltin('InhibitScreensaver(true)') + + self.resetSlideshowTimeout() + while not util.MONITOR.waitForAbort(0.1) and self.slideshowRunning: + if not self.slideshowNext or time.time() < self.slideshowNext: + continue + self.next() + + if util.KODI_VERSION_MAJOR > 18: + xbmc.executebuiltin('InhibitScreensaver(false)') + + util.DEBUG_LOG('Slideshow: STOPPED') + + def resetSlideshowTimeout(self): + self.slideshowNext = time.time() + self.SLIDESHOW_INTERVAL + + def osdVisible(self): + return self.getProperty('OSD') + + def pqueueVisible(self): + return self.getProperty('show.pqueue') + + def start(self): + self.setFocusId(self.OVERLAY_BUTTON_ID) + + def prev(self): + if not self.playQueue.getPrev(): + return + self.showPhoto(trigger=lambda: self.playQueue.prev()) + + def next(self): + if not self.playQueue.getNext(): + return + self.showPhoto(trigger=lambda: self.playQueue.next()) + + __next__ = next + + def play(self): + self.setProperty('playing', '1') + if self.slideshowThread and self.slideshowThread.is_alive(): + return + + self.slideshowThread = threading.Thread(target=self.slideshow, name='slideshow') + self.slideshowThread.start() + + def pause(self): + self.setProperty('playing', '') + self.slideshowRunning = False + + def stop(self): + self.doClose() + + def doClose(self): + self.pause() + shutil.rmtree(self.tempFolder, ignore_errors=True) + + kodigui.BaseWindow.doClose(self) + + def getCurrentItem(self): + if self.playerObject: + return self.playerObject.item + return None + + def shouldSendTimeline(self, item): + return item.ratingKey and item.getServer() + + def updateNowPlaying(self, force=False, refreshQueue=False, state=None): + if self.ignoreTimelines: + return + + item = self.getCurrentItem() + + if not item: + return + + if not self.shouldSendTimeline(item): + return + + state = state or 'paused' + # Avoid duplicates + if state == self.lastTimelineState and not force: + return + + self.lastTimelineState = state + # self.timelineTimer.reset() + + time = int(self.trueTime * 1000) + + # self.trigger("progress", [m, item, time]) + + if refreshQueue and self.playQueue: + self.playQueue.refreshOnTimeline = True + + plexapp.util.APP.nowplayingmanager.updatePlaybackState(self.timelineType, self.playerObject, state, time, self.playQueue) + + def showOSD(self): + self.osdTimer.reset(init=False) + + def hideOSD(self, closing=False): + self.osdTimer.stop(trigger=True) diff --git a/script.plexmod/lib/windows/playbacksettings.py b/script.plexmod/lib/windows/playbacksettings.py new file mode 100644 index 000000000..5e614e1ae --- /dev/null +++ b/script.plexmod/lib/windows/playbacksettings.py @@ -0,0 +1,64 @@ +# coding=utf-8 +from lib import util +from lib.util import T + +from plexnet.util import INTERFACE + +from . import dropdown + + +class PlaybackSettingsMixin(object): + def playbackSettings(self, show, pos, bottom): + pbs = INTERFACE.playbackManager(show) + pbOpts = [] + transEnabled = T(33507) + transDisabled = T(33508) + + currentSettings = {} + for key, transID in INTERFACE.playbackManager.transMap.items(): + state = getattr(pbs, key) + stateTrans = state and transEnabled or transDisabled + pbOpts.append({'key': key, 'display': "{}: {}".format(stateTrans, T(transID))}) + currentSettings[key] = state + + # create a new dict which we can freely change while the dropdown is open + newSettings = currentSettings.copy() + + # fixme: not sure if garbage collection is necessary here + + def callback(opts, mli, force_off=False): + choice = mli.dataSource + oc = newSettings[choice["key"]] + ic = (not oc) if not force_off else False + + # invalidate any other setting if bingemode enabled + if choice["key"] == "binge_mode" and ic: + for m in opts.items: + if m.dataSource["key"] != "binge_mode": + callback(opts, m, force_off=True) + del m + + # disable bingeMode if any other setting is enabled + elif choice["key"] != "binge_mode" and newSettings["binge_mode"]: + m = opts.getListItem(0) + callback(opts, m, force_off=True) + del m + + newSettings[choice["key"]] = ic + label = choice["display"].replace("{}: ".format(oc and transEnabled or transDisabled), + "{}: ".format(ic and transEnabled or transDisabled)) + mli.setLabel(label) + mli.dataSource["display"] = label + del mli + + # fixme: not sure if garbage collection is necessary here + util.garbageCollect() + pbChoice = dropdown.showDropdown(pbOpts, pos, pos_is_bottom=bottom, close_direction='left', + set_dropdown_prop=True, + header="{}: {}".format(T(32925, 'Playback Settings'), show.defaultTitle), + close_only_with_back=True, align_items='left', + options_callback=callback) + + # write new settings for item if necessary + if newSettings != currentSettings: + INTERFACE.playbackManager(show, kv_dict=newSettings) diff --git a/script.plexmod/lib/windows/playerbackground.py b/script.plexmod/lib/windows/playerbackground.py new file mode 100644 index 000000000..e34073b15 --- /dev/null +++ b/script.plexmod/lib/windows/playerbackground.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +import contextlib +from . import kodigui +from lib import util + + +class PlayerBackground(kodigui.BaseWindow): + xmlFile = 'script-plex-player_background.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + def __init__(self, *args, **kwargs): + kodigui.BaseWindow.__init__(self, *args, **kwargs) + self.background = kwargs.get('background', '') + self._closedSet = False + + def onFirstInit(self): + self.setProperty('background', self.background) + + def onReInit(self): + if self._closedSet: + self._closedSet = False + self.doClose() + + @contextlib.contextmanager + def asContext(self): + self.show() + yield + self.doClose() + + def setClosed(self): + self._closedSet = True + self.doClose() + + +class PlayerBackgroundContext(object): + def __init__(self, **kwargs): + self.kwargs = kwargs + self.window = None + + def __enter__(self): + self.window = PlayerBackground.create(**self.kwargs) + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + + def close(self): + if self.window: + self.window.doClose() + del self.window + self.window = None diff --git a/script.plexmod/lib/windows/playersettings.py b/script.plexmod/lib/windows/playersettings.py new file mode 100644 index 000000000..0ad1c58ed --- /dev/null +++ b/script.plexmod/lib/windows/playersettings.py @@ -0,0 +1,340 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from lib import util +from lib import metadata +from lib.util import T + +import plexnet + + +class VideoSettingsDialog(kodigui.BaseDialog, util.CronReceiver): + xmlFile = 'script-plex-video_settings_dialog.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + SETTINGS_LIST_ID = 100 + + def __init__(self, *args, **kwargs): + kodigui.BaseDialog.__init__(self, *args, **kwargs) + self.video = kwargs.get('video') + self.viaOSD = kwargs.get('via_osd') + self.nonPlayback = kwargs.get('non_playback') + self.parent = kwargs.get('parent') + self.roundRobin = kwargs.get('round_robin', True) + self.lastSelectedItem = 0 + + if not self.video.mediaChoice: + playerObject = plexnet.plexplayer.PlexPlayer(self.video) + playerObject.build() + + def onFirstInit(self): + self.settingsList = kodigui.ManagedControlList(self, self.SETTINGS_LIST_ID, 6) + self.setProperty('heading', T(32343, 'Settings')) + if self.viaOSD: + self.setProperty('via.OSD', '1') + self.showSettings(True) + util.CRON.registerReceiver(self) + + def onAction(self, action): + try: + if not xbmc.getCondVisibility('Player.HasMedia') and not self.nonPlayback: + self.doClose() + return + except: + util.ERROR() + + if self.roundRobin and action in (xbmcgui.ACTION_MOVE_UP, xbmcgui.ACTION_MOVE_DOWN) and \ + self.getFocusId() == self.SETTINGS_LIST_ID: + to_pos = None + last_index = self.settingsList.size() - 1 + if action == xbmcgui.ACTION_MOVE_UP and self.lastSelectedItem == 0 and self.settingsList.topHasFocus(): + to_pos = last_index + + elif action == xbmcgui.ACTION_MOVE_DOWN and self.lastSelectedItem == last_index \ + and self.settingsList.bottomHasFocus(): + to_pos = 0 + + if to_pos is not None: + self.settingsList.setSelectedItemByPos(to_pos) + self.lastSelectedItem = to_pos + return + + self.lastSelectedItem = self.settingsList.control.getSelectedPosition() + + kodigui.BaseDialog.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.SETTINGS_LIST_ID: + self.editSetting() + + def onClosed(self): + util.CRON.cancelReceiver(self) + + def tick(self): + if self.nonPlayback: + return + + if not xbmc.getCondVisibility('Player.HasMedia'): + self.doClose() + return + + def showSettings(self, init=False): + video = self.video + override = video.settings.getPrefOverride('local_quality') + if override is not None and override < 13: + current = T((32001, 32002, 32003, 32004, 32005, 32006, 32007, 32008, 32009, 32010, 32011, 32012, 32013, 32014)[13 - override]) + else: + current = u'{0} {1} ({2})'.format( + plexnet.util.bitrateToString(video.mediaChoice.media.bitrate.asInt() * 1000), + video.mediaChoice.media.getVideoResolutionString(), + video.mediaChoice.media.title or 'Original' + ) + + audio, subtitle = self.getAudioAndSubtitleInfo() + + options = [ + ('audio', T(32395, 'Audio'), audio), + ('subs', T(32396, 'Subtitles'), subtitle), + ('quality', T(32397, 'Quality'), u'{0}'.format(current)) + ] + + if not self.nonPlayback: + options += [ + ('kodi_video', T(32398, 'Kodi Video Settings'), ''), + ('kodi_audio', T(32399, 'Kodi Audio Settings'), ''), + ] + if util.KODI_VERSION_MAJOR >= 18: + options.append(('kodi_subtitle', T(32492, 'Kodi Subtitle Settings'), '')) + + if self.viaOSD: + if self.parent.getProperty("show.PPI"): + options += [ + ('stream_info', T(32483, 'Hide Stream Info'), ''), + ] + else: + options += [ + ('stream_info', T(32484, 'Show Stream Info'), ''), + ] + + items = [] + for o in options: + item = kodigui.ManagedListItem(o[1], o[2], data_source=o[0]) + items.append(item) + if init: + self.settingsList.reset() + self.settingsList.addItems(items) + else: + self.settingsList.replaceItems(items) + + self.setFocusId(self.SETTINGS_LIST_ID) + + def getAudioAndSubtitleInfo(self): + sas = self.video.selectedAudioStream() + audio = sas and sas.getTitle(metadata.apiTranslate) or T(32309, 'None') + + sss = self.video.selectedSubtitleStream( + forced_subtitles_override=util.getSetting("forced_subtitles_override", False)) + if sss: + if len(self.video.subtitleStreams) > 1: + subtitle = u'{0} \u2022 {1} {2}'.format(sss.getTitle(metadata.apiTranslate), len(self.video.subtitleStreams) - 1, T(32307, 'More')) + else: + subtitle = sss.getTitle(metadata.apiTranslate) + else: + if self.video.subtitleStreams: + subtitle = u'{0} \u2022 {1} {2}'.format(T(32309, 'None'), len(self.video.subtitleStreams), T(32308, 'Available')) + else: + subtitle = T(32309, 'None') + + return audio, subtitle + + def editSetting(self): + mli = self.settingsList.getSelectedItem() + if not mli: + return + + result = mli.dataSource + + if result == 'audio': + showAudioDialog(self.video, non_playback=self.nonPlayback) + elif result == 'subs': + showSubtitlesDialog(self.video, non_playback=self.nonPlayback) + elif result == 'quality': + idx = None + override = self.video.settings.getPrefOverride('local_quality') + if override is not None and override < 13: + idx = 13 - override + showQualityDialog(self.video, non_playback=self.nonPlayback, selected_idx=idx) + elif result == 'kodi_video': + xbmc.executebuiltin('ActivateWindow(OSDVideoSettings)') + elif result == 'kodi_audio': + xbmc.executebuiltin('ActivateWindow(OSDAudioSettings)') + elif result == 'kodi_subtitle': + xbmc.executebuiltin('ActivateWindow(OSDSubtitleSettings)') + elif result == "stream_info": + if self.parent: + if self.parent.getProperty("show.PPI"): + self.parent.hidePPIDialog() + else: + #xbmc.executebuiltin('Action(PlayerProcessInfo)') + self.parent.showPPIDialog() + self.doClose() + return + + self.showSettings() + + +class SelectDialog(kodigui.BaseDialog, util.CronReceiver): + xmlFile = 'script-plex-settings_select_dialog.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + OPTIONS_LIST_ID = 100 + + def __init__(self, *args, **kwargs): + kodigui.BaseDialog.__init__(self, *args, **kwargs) + self.heading = kwargs.get('heading') + self.options = kwargs.get('options') + self.selectedIdx = kwargs.get('selected_idx') + self.choice = None + self.nonPlayback = kwargs.get('non_playback') + self.lastSelectedItem = self.selectedIdx if self.selectedIdx is not None else 0 + self.roundRobin = kwargs.get('round_robin', True) + + def onFirstInit(self): + self.optionsList = kodigui.ManagedControlList(self, self.OPTIONS_LIST_ID, 8) + self.setProperty('heading', self.heading) + self.showOptions() + util.CRON.registerReceiver(self) + + def onAction(self, action): + try: + if not xbmc.getCondVisibility('Player.HasMedia') and not self.nonPlayback: + self.doClose() + return + except: + util.ERROR() + + if self.roundRobin and action in (xbmcgui.ACTION_MOVE_UP, xbmcgui.ACTION_MOVE_DOWN) and \ + self.getFocusId() == self.OPTIONS_LIST_ID: + to_pos = None + last_index = self.optionsList.size() - 1 + + if last_index > 0: + if action == xbmcgui.ACTION_MOVE_UP and self.lastSelectedItem == 0 and self.optionsList.topHasFocus(): + to_pos = last_index + + elif action == xbmcgui.ACTION_MOVE_DOWN and self.lastSelectedItem == last_index \ + and self.optionsList.bottomHasFocus(): + to_pos = 0 + + if to_pos is not None: + self.optionsList.setSelectedItemByPos(to_pos) + self.lastSelectedItem = to_pos + return + + self.lastSelectedItem = self.optionsList.control.getSelectedPosition() + + kodigui.BaseDialog.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.OPTIONS_LIST_ID: + self.setChoice() + + def onClosed(self): + util.CRON.cancelReceiver(self) + + def tick(self): + if self.nonPlayback: + return + + if not xbmc.getCondVisibility('Player.HasMedia'): + self.doClose() + return + + def setChoice(self): + mli = self.optionsList.getSelectedItem() + if not mli: + return + + self.choice = self.options[self.optionsList.getSelectedPosition()][0] + self.doClose() + + def showOptions(self): + items = [] + for o in self.options: + item = kodigui.ManagedListItem(o[1], data_source=o[0]) + items.append(item) + + self.optionsList.reset() + self.optionsList.addItems(items) + + if self.selectedIdx is not None: + self.optionsList.selectItem(self.selectedIdx) + + self.setFocusId(self.OPTIONS_LIST_ID) + + +def showOptionsDialog(heading, options, non_playback=False, selected_idx=None): + w = SelectDialog.open(heading=heading, options=options, non_playback=non_playback, selected_idx=selected_idx) + choice = w.choice + del w + util.garbageCollect() + return choice + + +def showAudioDialog(video, non_playback=False): + options = [] + idx = None + for i, s in enumerate(video.audioStreams): + if s.isSelected(): + idx = i + options.append((s, s.getTitle(metadata.apiTranslate))) + choice = showOptionsDialog(T(32395, 'Audio'), options, non_playback=non_playback, selected_idx=idx) + if choice is None: + return + + video.selectStream(choice) + + +def showSubtitlesDialog(video, non_playback=False): + options = [(plexnet.plexstream.NoneStream(), 'None')] + idx = None + for i, s in enumerate(video.subtitleStreams): + if s.isSelected(): + idx = i + 1 + options.append((s, s.getTitle(metadata.apiTranslate))) + + choice = showOptionsDialog(T(32396, 'Subtitle'), options, non_playback=non_playback, selected_idx=idx) + if choice is None: + return + + video.selectStream(choice) + video.manually_selected_sub_stream = choice.id + + +def showQualityDialog(video, non_playback=False, selected_idx=None): + options = [(13 - i, T(l)) for (i, l) in enumerate((32001, 32002, 32003, 32004, 32005, 32006, 32007, 32008, 32009, + 32010, 32011))] + + choice = showOptionsDialog('Quality', options, non_playback=non_playback, selected_idx=selected_idx) + if choice is None: + return + + video.settings.setPrefOverride('local_quality', choice) + video.settings.setPrefOverride('remote_quality', choice) + video.settings.setPrefOverride('online_quality', choice) + + +def showDialog(video, non_playback=False, via_osd=False, parent=None): + w = VideoSettingsDialog.open(video=video, non_playback=non_playback, via_osd=via_osd, parent=parent) + del w + util.garbageCollect() diff --git a/script.plexmod/lib/windows/playlist.py b/script.plexmod/lib/windows/playlist.py new file mode 100644 index 000000000..705fed372 --- /dev/null +++ b/script.plexmod/lib/windows/playlist.py @@ -0,0 +1,325 @@ +from __future__ import absolute_import +import threading + +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from . import busy +from . import videoplayer +from . import windowutils +from . import dropdown +from . import search +import plexnet +from . import opener + +from lib import colors +from lib import util +from lib import player +from lib import backgroundthread + +from lib.util import T +from six.moves import range + +PLAYLIST_PAGE_SIZE = 500 +PLAYLIST_INITIAL_SIZE = 100 + + +class ChunkRequestTask(backgroundthread.Task): + WINDOW = None + + @classmethod + def reset(cls): + del cls.WINDOW + cls.WINDOW = None + + def setup(self, start, size): + self.start = start + self.size = size + return self + + def contains(self, pos): + return self.start <= pos <= (self.start + self.size) + + def run(self): + if self.isCanceled(): + return + + try: + items = self.WINDOW.playlist.extend(self.start, self.size) + if self.isCanceled(): + return + + if not self.WINDOW: # Window is closed + return + + self.WINDOW.chunkCallback(items, self.start) + except AttributeError: + util.DEBUG_LOG('Playlist window closed, ignoring chunk at index {0}'.format(self.start)) + except plexnet.exceptions.BadRequest: + util.DEBUG_LOG('404 on playlist: {0}'.format(repr(self.WINDOW.playlist.title))) + + +class PlaylistWindow(kodigui.ControlledWindow, windowutils.UtilMixin): + xmlFile = 'script-plex-playlist.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + OPTIONS_GROUP_ID = 200 + HOME_BUTTON_ID = 201 + SEARCH_BUTTON_ID = 202 + PLAYER_STATUS_BUTTON_ID = 204 + + PLAY_BUTTON_ID = 301 + SHUFFLE_BUTTON_ID = 302 + OPTIONS_BUTTON_ID = 303 + + LI_AR16X9_THUMB_DIM = util.scaleResolution(178, 100) + LI_SQUARE_THUMB_DIM = util.scaleResolution(100, 100) + + ALBUM_THUMB_DIM = util.scaleResolution(630, 630) + + PLAYLIST_LIST_ID = 101 + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + self.playlist = kwargs.get('playlist') + self.exitCommand = None + self.tasks = backgroundthread.Tasks() + self.isPlaying = False + ChunkRequestTask.WINDOW = self + + def onFirstInit(self): + self.playlistListControl = kodigui.ManagedControlList(self, self.PLAYLIST_LIST_ID, 5) + self.setProperties() + + self.fillPlaylist() + self.setFocusId(self.PLAYLIST_LIST_ID) + + # def onAction(self, action): + # try: + # if action in(xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_CONTEXT_MENU): + # if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + # self.setFocusId(self.OPTIONS_GROUP_ID) + # return + # except: + # util.ERROR() + + # kodigui.ControlledWindow.onAction(self, action) + + def onAction(self, action): + try: + if action in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_PREVIOUS_MENU): + self.doClose() + except: + util.ERROR() + + kodigui.ControlledWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.HOME_BUTTON_ID: + self.goHome() + elif controlID == self.PLAYLIST_LIST_ID: + self.playlistListClicked() + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif controlID == self.PLAY_BUTTON_ID: + self.playlistListClicked(no_item=True, shuffle=False) + elif controlID == self.SHUFFLE_BUTTON_ID: + self.playlistListClicked(no_item=True, shuffle=True) + elif controlID == self.OPTIONS_BUTTON_ID: + self.optionsButtonClicked() + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + + def doClose(self): + kodigui.ControlledWindow.doClose(self) + self.tasks.cancel() + ChunkRequestTask.reset() + + def searchButtonClicked(self): + self.processCommand(search.dialog(self)) + + def playlistListClicked(self, no_item=False, shuffle=False): + if no_item: + mli = None + else: + mli = self.playlistListControl.getSelectedItem() + if not mli or not mli.dataSource: + return + + try: + self.isPlaying = True + self.tasks.cancel() + player.PLAYER.stop() # Necessary because if audio is already playing, it will close the window when that is stopped + if self.playlist.playlistType == 'audio': + if self.playlist.leafCount.asInt() <= PLAYLIST_INITIAL_SIZE: + self.playlist.setShuffle(shuffle) + self.playlist.setCurrent(mli and mli.pos() or 0) + self.showAudioPlayer(track=mli and mli.dataSource or self.playlist.current(), playlist=self.playlist) + else: + args = {'sourceType': '8', 'shuffle': shuffle} + if mli: + args['key'] = mli.dataSource.key + pq = plexnet.playqueue.createPlayQueueForItem(self.playlist, options=args) + opener.open(pq) + elif self.playlist.playlistType == 'video': + if not util.advancedSettings.playlistVisitMedia: + if self.playlist.leafCount.asInt() <= PLAYLIST_INITIAL_SIZE: + self.playlist.setShuffle(shuffle) + self.playlist.setCurrent(mli and mli.pos() or 0) + videoplayer.play(play_queue=self.playlist) + else: + args = {'shuffle': shuffle} + if mli: + args['key'] = mli.dataSource.key + pq = plexnet.playqueue.createPlayQueueForItem(self.playlist, options=args) + opener.open(pq) + else: + if not mli: + firstItem = 0 + if shuffle: + import random + firstItem = random.randint(0, self.playlistListControl.size()-1) + mli = self.playlistListControl.getListItem(firstItem) + self.openItem(mli.dataSource) + + finally: + self.isPlaying = False + self.restartFill() + + def restartFill(self): + threading.Thread(target=self._restartFill).start() + + def _restartFill(self): + util.DEBUG_LOG('Checking if playlist list is full...') + for idx, mli in enumerate(self.playlistListControl): + if self.isPlaying or not self.isOpen or util.MONITOR.abortRequested(): + break + + if not mli.dataSource: + if self.playlist[idx]: + self.updateListItem(idx, self.playlist[idx]) + else: + break + # Update the progress for videos + elif mli.dataSource.type in ('episode', 'movie', 'clip'): + mli.dataSource.reload() + self.updateListItem(idx, mli.dataSource) + else: + util.DEBUG_LOG('Playlist list is full - nothing to do') + return + + util.DEBUG_LOG('Playlist list is not full - finishing') + total = self.playlist.leafCount.asInt() + for start in range(idx, total, PLAYLIST_PAGE_SIZE): + if util.MONITOR.abortRequested(): + break + self.tasks.add(ChunkRequestTask().setup(start, PLAYLIST_PAGE_SIZE)) + + backgroundthread.BGThreader.addTasksToFront(self.tasks) + + def optionsButtonClicked(self): + options = [] + if xbmc.getCondVisibility('Player.HasAudio + MusicPlayer.HasNext'): + options.append({'key': 'play_next', 'display': T(32325, 'Play Next')}) + + if not options: + return + + choice = dropdown.showDropdown(options, (440, 1020), close_direction='down', pos_is_bottom=True, close_on_playback_ended=True) + if not choice: + return + + if choice['key'] == 'play_next': + xbmc.executebuiltin('PlayerControl(Next)') + + def setProperties(self): + self.setProperty( + 'background', + util.backgroundFromArt(self.playlist.composite, width=self.width, height=self.height) + ) + self.setProperty('playlist.thumb', self.playlist.composite.asTranscodedImageURL(*self.ALBUM_THUMB_DIM)) + self.setProperty('playlist.title', self.playlist.title) + self.setProperty('playlist.duration', util.durationToText(self.playlist.duration.asInt())) + + def updateListItem(self, idx, pi, mli=None): + mli = mli or self.playlistListControl.getListItem(idx) + mli.setLabel(pi.title) + mli.setProperty('track.ID', pi.ratingKey) + mli.setProperty('track.number', str(idx + 1)) + mli.dataSource = pi + + if pi.type == 'track': + self.createTrackListItem(mli, pi) + elif pi.type == 'episode': + self.createEpisodeListItem(mli, pi) + elif pi.type in ('movie', 'clip'): + self.createMovieListItem(mli, pi) + + if pi.type in ('episode', 'movie', 'clip'): + mli.setProperty('progress', util.getProgressImage(mli.dataSource)) + + return mli + + def createTrackListItem(self, mli, track): + mli.setLabel2(u'{0} / {1}'.format(track.grandparentTitle, track.parentTitle)) + mli.setThumbnailImage(track.defaultThumb.asTranscodedImageURL(*self.LI_SQUARE_THUMB_DIM)) + mli.setProperty('track.duration', util.simplifiedTimeDisplay(track.duration.asInt())) + + def createEpisodeListItem(self, mli, episode): + label2 = u'{0} \u2022 {1}'.format( + episode.grandparentTitle, u'{0}{1} \u2022 {2}{3}'.format(T(32310, 'S'), episode.parentIndex, T(32311, 'E'), episode.index) + ) + mli.setLabel2(label2) + mli.setThumbnailImage(episode.thumb.asTranscodedImageURL(*self.LI_AR16X9_THUMB_DIM)) + mli.setProperty('track.duration', util.durationToShortText(episode.duration.asInt())) + mli.setProperty('video', '1') + mli.setProperty('watched', episode.isWatched and '1' or '') + + def createMovieListItem(self, mli, movie): + mli.setLabel(movie.defaultTitle) + mli.setLabel2(movie.year) + mli.setThumbnailImage(movie.art.asTranscodedImageURL(*self.LI_AR16X9_THUMB_DIM)) + mli.setProperty('track.duration', util.durationToShortText(movie.duration.asInt())) + mli.setProperty('video', '1') + mli.setProperty('watched', movie.isWatched and '1' or '') + + @busy.dialog() + def fillPlaylist(self): + total = self.playlist.leafCount.asInt() + + # leafCount is clamped to 6 when coming from Home/PlaylistsHub + actualPlaylistLength = len(self.playlist.items()) + + if total < len(self.playlist): + total = actualPlaylistLength + + endoffirst = min(PLAYLIST_INITIAL_SIZE, PLAYLIST_PAGE_SIZE, total) + items = [self.updateListItem(i, pi, kodigui.ManagedListItem()) for i, pi in enumerate(self.playlist.extend(0, endoffirst))] + + items += [kodigui.ManagedListItem() for i in range(total - endoffirst)] + + self.playlistListControl.reset() + self.playlistListControl.addItems(items) + + if total <= min(PLAYLIST_INITIAL_SIZE, PLAYLIST_PAGE_SIZE): + return + + for start in range(endoffirst, total, PLAYLIST_PAGE_SIZE): + if util.MONITOR.abortRequested(): + break + self.tasks.add(ChunkRequestTask().setup(start, PLAYLIST_PAGE_SIZE)) + + backgroundthread.BGThreader.addTasksToFront(self.tasks) + + def chunkCallback(self, items, start): + for i, pi in enumerate(items): + if self.isPlaying or not self.isOpen or util.MONITOR.abortRequested(): + break + + idx = start + i + self.updateListItem(idx, pi) diff --git a/script.plexmod/lib/windows/playlists.py b/script.plexmod/lib/windows/playlists.py new file mode 100644 index 000000000..12d22bb1f --- /dev/null +++ b/script.plexmod/lib/windows/playlists.py @@ -0,0 +1,138 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from . import busy +from . import playlist +from . import windowutils +from . import search + +from lib import util +from lib import colors + +from plexnet import plexapp + + +class PlaylistsWindow(kodigui.ControlledWindow, windowutils.UtilMixin): + xmlFile = 'script-plex-playlists.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + THUMB_DIMS = { + 'audio': { + 'item.thumb': util.scaleResolution(270, 270) + }, + 'video': { + 'item.thumb': util.scaleResolution(610, 344) + } + } + + AUDIO_PL_LIST_ID = 101 + VIDEO_PL_LIST_ID = 301 + + OPTIONS_GROUP_ID = 200 + + HOME_BUTTON_ID = 201 + SEARCH_BUTTON_ID = 202 + PLAYER_STATUS_BUTTON_ID = 204 + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + self.exitCommand = None + + def onFirstInit(self): + self.audioPLListControl = kodigui.ManagedControlList(self, self.AUDIO_PL_LIST_ID, 5) + self.videoPLListControl = kodigui.ManagedControlList(self, self.VIDEO_PL_LIST_ID, 5) + + self.fill() + if self.audioPLListControl.size(): + self.setFocusId(self.AUDIO_PL_LIST_ID) + else: + self.setFocusId(self.VIDEO_PL_LIST_ID) + + def onAction(self, action): + try: + if action == xbmcgui.ACTION_CONTEXT_MENU: + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + self.setFocusId(self.OPTIONS_GROUP_ID) + return + # elif action in(xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_CONTEXT_MENU): + # if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + # self.setFocusId(self.OPTIONS_GROUP_ID) + # return + + except: + util.ERROR() + + kodigui.ControlledWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.HOME_BUTTON_ID: + self.goHome() + elif controlID == self.AUDIO_PL_LIST_ID: + self.playlistListClicked(self.audioPLListControl) + elif controlID == self.VIDEO_PL_LIST_ID: + self.playlistListClicked(self.videoPLListControl) + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + + def searchButtonClicked(self): + self.processCommand(search.dialog(self)) + + def playlistListClicked(self, list_control): + mli = list_control.getSelectedItem() + if not mli: + return + + self.openWindow(playlist.PlaylistWindow, playlist=mli.dataSource) + + def createListItem(self, obj): + dimensions = self.THUMB_DIMS.get(obj.playlistType) + + if not dimensions: + return + + w, h = dimensions['item.thumb'] + + if obj.playlistType == 'audio': + thumb = obj.buildComposite(width=w, height=h, media='thumb') + else: + thumb = obj.buildComposite(width=w, height=h, media='art') + + mli = kodigui.ManagedListItem( + obj.title or '', + util.durationToText(obj.duration.asInt()), + # thumbnailImage=obj.composite.asTranscodedImageURL(*self.THUMB_DIMS[obj.playlistType]['item.thumb']), + thumbnailImage=thumb, + data_source=obj + ) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/{0}.png'.format(obj.playlistType == 'audio' and 'music' or 'movie')) + + return mli + + @busy.dialog() + def fill(self): + items = { + 'audio': [], + 'video': [] + } + playlists = plexapp.SERVERMANAGER.selectedServer.playlists() + + self.setProperty( + 'background', + util.backgroundFromArt(playlists[0].composite, width=self.width, height=self.height) + ) + + for pl in playlists: + mli = self.createListItem(pl) + if mli: + items[pl.playlistType].append(mli) + + self.audioPLListControl.addItems(items['audio']) + self.videoPLListControl.addItems(items['video']) diff --git a/script.plexmod/lib/windows/preplay.py b/script.plexmod/lib/windows/preplay.py new file mode 100644 index 000000000..5b8228b36 --- /dev/null +++ b/script.plexmod/lib/windows/preplay.py @@ -0,0 +1,720 @@ +from __future__ import absolute_import + +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from . import busy +from . import opener +from . import info +from . import videoplayer +from . import playersettings +from . import search +from . import dropdown +from . import windowutils +from . import optionsdialog +from . import preplayutils +from . import pagination + +from plexnet import plexplayer, media + +from lib import util +from lib import metadata + +from lib.util import T + + +VIDEO_RELOAD_KW = dict(includeExtras=1, includeExtrasCount=10, includeChapters=1, includeReviews=1) + + +class RelatedPaginator(pagination.BaseRelatedPaginator): + def getData(self, offset, amount): + return self.parentWindow.video.getRelated(offset=offset, limit=amount) + + +class PrePlayWindow(kodigui.ControlledWindow, windowutils.UtilMixin): + xmlFile = 'script-plex-pre_play.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + THUMB_POSTER_DIM = util.scaleResolution(347, 518) + RELATED_DIM = util.scaleResolution(268, 397) + EXTRA_DIM = util.scaleResolution(329, 185) + ROLES_DIM = util.scaleResolution(334, 334) + PREVIEW_DIM = util.scaleResolution(343, 193) + + ROLES_LIST_ID = 400 + REVIEWS_LIST_ID = 401 + EXTRA_LIST_ID = 402 + RELATED_LIST_ID = 403 + + OPTIONS_GROUP_ID = 200 + PROGRESS_IMAGE_ID = 250 + + HOME_BUTTON_ID = 201 + SEARCH_BUTTON_ID = 202 + + INFO_BUTTON_ID = 304 + PLAY_BUTTON_ID = 302 + TRAILER_BUTTON_ID = 303 + SETTINGS_BUTTON_ID = 305 + OPTIONS_BUTTON_ID = 306 + MEDIA_BUTTON_ID = 307 + + PLAYER_STATUS_BUTTON_ID = 204 + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + self.video = kwargs.get('video') + self.parentList = kwargs.get('parent_list') + self.videos = None + self.exitCommand = None + self.trailer = None + self.lastFocusID = None + self.lastNonOptionsFocusID = None + self.initialized = False + self.relatedPaginator = None + + def doClose(self): + self.relatedPaginator = None + kodigui.ControlledWindow.doClose(self) + + def onFirstInit(self): + self.extraListControl = kodigui.ManagedControlList(self, self.EXTRA_LIST_ID, 5) + self.relatedListControl = kodigui.ManagedControlList(self, self.RELATED_LIST_ID, 5) + self.rolesListControl = kodigui.ManagedControlList(self, self.ROLES_LIST_ID, 5) + self.reviewsListControl = kodigui.ManagedControlList(self, self.REVIEWS_LIST_ID, 5) + + self.progressImageControl = self.getControl(self.PROGRESS_IMAGE_ID) + self.setup() + self.initialized = True + + def doAutoPlay(self): + # First reload the video to get all the other info + self.video.reload(checkFiles=1, **VIDEO_RELOAD_KW) + return self.playVideo() + + @busy.dialog() + def onReInit(self): + self.initialized = False + if util.getSetting("slow_connection", False): + self.progressImageControl.setWidth(1) + self.setProperty('remainingTime', T(32914, "Loading")) + self.video.reload(checkFiles=1, fromMediaChoice=self.video.mediaChoice is not None, **VIDEO_RELOAD_KW) + self.refreshInfo(from_reinit=True) + self.initialized = True + + def refreshInfo(self, from_reinit=False): + oldFocusId = self.getFocusId() + + util.setGlobalProperty('hide.resume', '' if self.video.viewOffset.asInt() else '1') + # skip setting background when coming from reinit (other window) if we've focused something other than main + self.setInfo(skip_bg=from_reinit and not (self.PLAY_BUTTON_ID <= oldFocusId <= self.MEDIA_BUTTON_ID)) + self.fillRelated() + xbmc.sleep(100) + + if oldFocusId == self.PLAY_BUTTON_ID: + self.focusPlayButton() + + def onAction(self, action): + try: + controlID = self.getFocusId() + + if not controlID and self.lastFocusID and not action == xbmcgui.ACTION_MOUSE_MOVE: + self.setFocusId(self.lastFocusID) + + if action == xbmcgui.ACTION_CONTEXT_MENU: + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + self.lastNonOptionsFocusID = self.lastFocusID + self.setFocusId(self.OPTIONS_GROUP_ID) + return + else: + if self.lastNonOptionsFocusID: + self.setFocusId(self.lastNonOptionsFocusID) + self.lastNonOptionsFocusID = None + return + + elif action == xbmcgui.ACTION_NAV_BACK: + if (not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format( + self.OPTIONS_GROUP_ID)) or not controlID) and \ + not util.advancedSettings.fastBack: + if self.getProperty('on.extras'): + self.setFocusId(self.OPTIONS_GROUP_ID) + return + + elif action == xbmcgui.ACTION_LAST_PAGE and xbmc.getCondVisibility('ControlGroup(300).HasFocus(0)'): + next(self) + elif action == xbmcgui.ACTION_NEXT_ITEM: + self.setFocusId(300) + next(self) + elif action == xbmcgui.ACTION_FIRST_PAGE and xbmc.getCondVisibility('ControlGroup(300).HasFocus(0)'): + self.prev() + elif action == xbmcgui.ACTION_PREV_ITEM: + self.setFocusId(300) + self.prev() + + elif action == xbmcgui.ACTION_MOVE_UP and controlID in (self.REVIEWS_LIST_ID, + self.ROLES_LIST_ID, + self.EXTRA_LIST_ID): + self.updateBackgroundFrom(self.video) + + if controlID == self.RELATED_LIST_ID: + if self.relatedPaginator.boundaryHit: + self.relatedPaginator.paginate() + return + elif action in (xbmcgui.ACTION_MOVE_LEFT, xbmcgui.ACTION_MOVE_RIGHT): + self.updateBackgroundFrom(self.relatedListControl.getSelectedItem().dataSource) + except: + util.ERROR() + + kodigui.ControlledWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.HOME_BUTTON_ID: + self.goHome() + elif controlID == self.EXTRA_LIST_ID: + self.openItem(self.extraListControl) + elif controlID == self.RELATED_LIST_ID: + self.openItem(self.relatedListControl) + elif controlID == self.ROLES_LIST_ID: + self.roleClicked() + elif controlID == self.PLAY_BUTTON_ID: + self.playVideo() + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif controlID == self.INFO_BUTTON_ID: + self.infoButtonClicked() + elif controlID == self.SETTINGS_BUTTON_ID: + self.settingsButtonClicked() + elif controlID == self.TRAILER_BUTTON_ID: + self.openItem(item=self.trailer) + elif controlID == self.OPTIONS_BUTTON_ID: + self.optionsButtonClicked() + elif controlID == self.MEDIA_BUTTON_ID: + self.mediaButtonClicked() + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + + def onFocus(self, controlID): + self.lastFocusID = controlID + + if 399 < controlID < 500: + self.setProperty('hub.focus', str(controlID - 400)) + + if controlID == self.RELATED_LIST_ID: + self.updateBackgroundFrom(self.relatedListControl.getSelectedItem().dataSource) + + if xbmc.getCondVisibility('ControlGroup(50).HasFocus(0) + ControlGroup(300).HasFocus(0)'): + self.setProperty('on.extras', '') + elif xbmc.getCondVisibility('ControlGroup(50).HasFocus(0) + !ControlGroup(300).HasFocus(0)'): + self.setProperty('on.extras', '1') + + def searchButtonClicked(self): + self.processCommand(search.dialog(self, section_id=self.video.getLibrarySectionId() or None)) + + def settingsButtonClicked(self): + if not self.video.mediaChoice: + playerObject = plexplayer.PlexPlayer(self.video) + playerObject.build() + playersettings.showDialog(video=self.video, non_playback=True) + self.setAudioAndSubtitleInfo() + + def infoButtonClicked(self): + opener.handleOpen( + info.InfoWindow, + title=self.video.defaultTitle, + sub_title=self.getProperty('info'), + thumb=self.video.type == 'episode' and self.video.thumb or self.video.defaultThumb, + thumb_fallback='script.plex/thumb_fallbacks/{0}.png'.format(self.video.type == 'episode' and 'show' or 'movie'), + info=self.video.summary, + background=self.getProperty('background'), + is_16x9=self.video.type == 'episode', + video=self.video + ) + + def optionsButtonClicked(self): + options = [] + + inProgress = self.video.viewOffset.asInt() + if not self.video.isWatched or inProgress: + options.append({'key': 'mark_watched', 'display': T(32319, 'Mark Played')}) + if self.video.isWatched or inProgress: + options.append({'key': 'mark_unwatched', 'display': T(32318, 'Mark Unplayed')}) + + options.append(dropdown.SEPARATOR) + + if self.video.type == 'episode': + options.append({'key': 'to_season', 'display': T(32400, 'Go to Season')}) + options.append({'key': 'to_show', 'display': T(32323, 'Go to Show')}) + + if self.video.type in ('episode', 'movie'): + options.append({'key': 'to_section', 'display': T(32324, u'Go to {0}').format(self.video.getLibrarySectionTitle())}) + + if self.video.server.allowsMediaDeletion: + options.append({'key': 'delete', 'display': T(32322, 'Delete')}) + # if xbmc.getCondVisibility('Player.HasAudio') and self.section.TYPE == 'artist': + # options.append({'key': 'add_to_queue', 'display': 'Add To Queue'}) + + # if False: + # options.append({'key': 'add_to_playlist', 'display': 'Add To Playlist'}) + posy = 880 + if not util.getGlobalProperty('hide.resume'): + posy += 106 + if self.getProperty('trailer.button'): + posy += 106 + choice = dropdown.showDropdown(options, (posy, 618), close_direction='left') + if not choice: + return + + if choice['key'] == 'play_next': + xbmc.executebuiltin('PlayerControl(Next)') + elif choice['key'] == 'mark_watched': + self.video.markWatched(**VIDEO_RELOAD_KW) + self.refreshInfo() + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'mark_unwatched': + self.video.markUnwatched(**VIDEO_RELOAD_KW) + self.refreshInfo() + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'to_season': + self.processCommand(opener.open(self.video.parentRatingKey)) + elif choice['key'] == 'to_show': + self.processCommand(opener.open(self.video.grandparentRatingKey)) + elif choice['key'] == 'to_section': + self.goHome(self.video.getLibrarySectionId()) + elif choice['key'] == 'delete': + self.delete() + + def mediaButtonClicked(self): + options = [] + for media in self.video.media: + ind = '' + if self.video.mediaChoice and media.id == self.video.mediaChoice.media.id: + ind = 'script.plex/home/device/check.png' + options.append({'key': media, 'display': media.versionString(), 'indicator': ind}) + choice = dropdown.showDropdown(options, header=T(32450, 'Choose Version'), with_indicator=True) + if not choice: + return False + + for media in self.video.media: + media.set('selected', '') + + self.video.setMediaChoice(choice['key']) + choice['key'].set('selected', 1) + self.setInfo() + + def delete(self): + button = optionsdialog.show( + T(32326, 'Really delete?'), + T(32327, 'Are you sure you really want to delete this media?'), + T(32328, 'Yes'), + T(32329, 'No') + ) + + if button != 0: + return + + if self._delete(): + self.doClose() + else: + util.messageDialog(T(32330, 'Message'), T(32331, 'There was a problem while attempting to delete the media.')) + + @busy.dialog() + def _delete(self): + success = self.video.delete() + util.LOG('Media DELETE: {0} - {1}'.format(self.video, success and 'SUCCESS' or 'FAILED')) + return success + + def roleClicked(self): + mli = self.rolesListControl.getSelectedItem() + if not mli: + return + + sectionRoles = busy.widthDialog(mli.dataSource.sectionRoles, '') + + if not sectionRoles: + util.DEBUG_LOG('No sections found for actor') + return + + if len(sectionRoles) > 1: + x, y = self.getRoleItemDDPosition() + + options = [{'role': r, 'display': r.reasonTitle} for r in sectionRoles] + choice = dropdown.showDropdown(options, (x, y), pos_is_bottom=True, close_direction='bottom') + + if not choice: + return + + role = choice['role'] + else: + role = sectionRoles[0] + + if util.advancedSettings.dialogFlickerFix: + with busy.BusyContext(): + xbmc.sleep(100) + xbmc.sleep(650) + self.processCommand(opener.open(role)) + + def getVideos(self): + if not self.videos: + if self.video.TYPE == 'episode': + self.videos = self.video.show().episodes() + + if not self.videos: + return False + + return True + + def next(self): + if not self._next(): + return + self.setup() + + __next__ = next + + @busy.dialog() + def _next(self): + if self.parentList: + mli = self.parentList.getListItemByDataSource(self.video) + if not mli: + return False + + pos = mli.pos() + 1 + if not self.parentList.positionIsValid(pos): + pos = 0 + + self.video = self.parentList.getListItem(pos).dataSource + else: + if not self.getVideos(): + return False + + if self.video not in self.videos: + return False + + pos = self.videos.index(self.video) + pos += 1 + if pos >= len(self.videos): + pos = 0 + + self.video = self.videos[pos] + + return True + + def prev(self): + if not self._prev(): + return + self.setup() + + @busy.dialog() + def _prev(self): + if self.parentList: + mli = self.parentList.getListItemByDataSource(self.video) + if not mli: + return False + + pos = mli.pos() - 1 + if pos < 0: + pos = self.parentList.size() - 1 + + self.video = self.parentList.getListItem(pos).dataSource + else: + if not self.getVideos(): + return False + + if self.video not in self.videos: + return False + + pos = self.videos.index(self.video) + pos -= 1 + if pos < 0: + pos = len(self.videos) - 1 + + self.video = self.videos[pos] + + return True + + def getRoleItemDDPosition(self): + y = 200 + if xbmc.getCondVisibility('Control.IsVisible(500)'): + y += 360 + if xbmc.getCondVisibility('Control.IsVisible(501)'): + y += 520 + if xbmc.getCondVisibility('!String.IsEmpty(Window.Property(on.extras))'): + y -= 300 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),0) + Control.IsVisible(500)'): + y -= 500 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),1) + Control.IsVisible(501)'): + y -= 500 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),2) + Control.IsVisible(502)'): + y -= 500 + + focus = int(xbmc.getInfoLabel('Container(400).Position')) + + x = ((focus + 1) * 304) - 100 + return x, y + + def playVideo(self): + if not self.video.available(): + util.messageDialog(T(32312, 'Unavailable'), T(32313, 'This item is currently unavailable.')) + return + + resume = False + if self.video.viewOffset.asInt(): + choice = dropdown.showDropdown( + options=[ + {'key': 'resume', 'display': T(32429, 'Resume from {0}').format(util.timeDisplay(self.video.viewOffset.asInt()).lstrip('0').lstrip(':'))}, + {'key': 'play', 'display': T(32317, 'Play from beginning')} + ], + pos=(660, 441), + close_direction='none', + set_dropdown_prop=False, + header=T(32314, 'In Progress') + ) + + if not choice: + return + + if choice['key'] == 'resume': + resume = True + + self.processCommand(videoplayer.play(video=self.video, resume=resume)) + return True + + def openItem(self, control=None, item=None): + if not item: + mli = control.getSelectedItem() + if not mli: + return + item = mli.dataSource + + self.processCommand(opener.open(item)) + + def focusPlayButton(self): + try: + if not self.getFocusId() == self.PLAY_BUTTON_ID: + self.setFocusId(self.PLAY_BUTTON_ID) + except (SystemError, RuntimeError): + self.setFocusId(self.PLAY_BUTTON_ID) + + @busy.dialog() + def setup(self): + self.focusPlayButton() + + util.DEBUG_LOG('PrePlay: Showing video info: {0}'.format(self.video)) + if self.video.type == 'episode': + self.setProperty('preview.yes', '1') + elif self.video.type == 'movie': + self.setProperty('preview.no', '1') + + self.video.reload(checkFiles=1, **VIDEO_RELOAD_KW) + try: + self.relatedPaginator = RelatedPaginator(self.relatedListControl, leaf_count=int(self.video.relatedCount), + parent_window=self) + except ValueError: + raise util.NoDataException + + self.setInfo() + self.setBoolProperty("initialized", True) + hasRoles = self.fillRoles() + hasReviews = self.fillReviews() + hasExtras = self.fillExtras() + self.fillRelated(hasRoles and not hasExtras and not hasReviews) + + def setInfo(self, skip_bg=False): + if not skip_bg: + self.updateBackgroundFrom(self.video) + self.setProperty('title', self.video.title) + self.setProperty('duration', util.durationToText(self.video.duration.asInt())) + self.setProperty('summary', self.video.summary.strip().replace('\t', ' ')) + self.setProperty('unwatched', not self.video.isWatched and '1' or '') + + directors = u' / '.join([d.tag for d in self.video.directors()][:5]) + directorsLabel = len(self.video.directors) > 1 and T(32401, u'DIRECTORS').upper() or T(32383, u'DIRECTOR').upper() + self.setProperty('directors', directors and u'{0} {1}'.format(directorsLabel, directors) or '') + + if self.video.type == 'episode': + self.setProperty('content.rating', '') + self.setProperty('thumb', self.video.defaultThumb.asTranscodedImageURL(*self.THUMB_POSTER_DIM)) + self.setProperty('preview', self.video.thumb.asTranscodedImageURL(*self.PREVIEW_DIM)) + self.setProperty('info', u'{0} {1} {2} {3}'.format(T(32303, 'Season'), self.video.parentIndex, T(32304, 'Episode'), self.video.index)) + self.setProperty('date', util.cleanLeadingZeros(self.video.originallyAvailableAt.asDatetime('%B %d, %Y'))) + + writers = u' / '.join([w.tag for w in self.video.writers()][:5]) + writersLabel = len(self.video.writers) > 1 and T(32403, u'WRITERS').upper() or T(32402, u'WRITER').upper() + self.setProperty('writers', writers and u'{0} {1}'.format(writersLabel, writers) or '') + self.setProperty('related.header', T(32306, 'Related Shows')) + elif self.video.type == 'movie': + self.setProperty('title', self.video.defaultTitle) + self.setProperty('preview', '') + self.setProperty('thumb', self.video.thumb.asTranscodedImageURL(*self.THUMB_POSTER_DIM)) + genres = u' / '.join([g.tag for g in self.video.genres()][:3]) + self.setProperty('info', genres) + self.setProperty('date', self.video.year) + self.setProperty('content.rating', self.video.contentRating.split('/', 1)[-1]) + + cast = u' / '.join([r.tag for r in self.video.roles()][:5]) + castLabel = 'CAST' + self.setProperty('writers', cast and u'{0} {1}'.format(castLabel, cast) or '') + self.setProperty('related.header', T(32404, 'Related Movies')) + + self.setProperty('video.res', self.video.resolutionString()) + self.setProperty('audio.codec', self.video.audioCodecString()) + self.setProperty('video.codec', self.video.videoCodecString()) + self.setProperty('video.rendering', self.video.videoCodecRendering) + self.setProperty('audio.channels', self.video.audioChannelsString(metadata.apiTranslate)) + self.setBoolProperty('media.multiple', len(list(filter(lambda x: x.isAccessible(), self.video.media()))) > 1) + + self.setProperties(('rating.stars', 'rating', 'rating.image', 'rating2', 'rating2.image'), '') + if self.video.userRating: + stars = str(int(round((self.video.userRating.asFloat() / 10) * 5))) + self.setProperty('rating.stars', stars) + # elif self.video.rating: + # stars = str(int(round((self.video.rating.asFloat() / 10) * 5))) + # self.setProperty('rating.stars', stars) + + if self.video.ratingImage: + rating = self.video.rating + audienceRating = self.video.audienceRating + if self.video.ratingImage.startswith('rottentomatoes:'): + rating = '{0}%'.format(int(rating.asFloat() * 10)) + if audienceRating: + audienceRating = '{0}%'.format(int(audienceRating.asFloat() * 10)) + + self.setProperty('rating', rating) + self.setProperty('rating.image', 'script.plex/ratings/{0}.png'.format(self.video.ratingImage.replace('://', '/'))) + if self.video.audienceRatingImage: + self.setProperty('rating2', audienceRating) + self.setProperty('rating2.image', 'script.plex/ratings/{0}.png'.format(self.video.audienceRatingImage.replace('://', '/'))) + else: + self.setProperty('rating', self.video.rating) + + self.setAudioAndSubtitleInfo() + + self.setProperty('unavailable', all(not v.isAccessible() for v in self.video.media()) and '1' or '') + + if self.video.viewOffset.asInt(): + width = self.video.viewOffset.asInt() and (1 + int((self.video.viewOffset.asInt() / self.video.duration.asFloat()) * self.width)) or 1 + self.progressImageControl.setWidth(width) + else: + self.progressImageControl.setWidth(1) + + if self.video.viewOffset.asInt(): + self.setProperty('remainingTime', T(33615, "{time} left").format(time=self.video.remainingTimeString)) + else: + self.setProperty('remainingTime', '') + + def setAudioAndSubtitleInfo(self): + sas = self.video.selectedAudioStream() + self.setProperty('audio', sas and sas.getTitle(metadata.apiTranslate) or T(32309, 'None')) + + sss = self.video.selectedSubtitleStream( + forced_subtitles_override=util.getSetting("forced_subtitles_override", False)) + if sss: + if len(self.video.subtitleStreams) > 1: + self.setProperty( + 'subtitles', u'{0} \u2022 {1} {2}'.format(sss.getTitle(metadata.apiTranslate), len(self.video.subtitleStreams) - 1, T(32307, 'More')) + ) + else: + self.setProperty('subtitles', sss.getTitle(metadata.apiTranslate)) + else: + if self.video.subtitleStreams: + self.setProperty('subtitles', u'{0} \u2022 {1} {2}'.format(T(32309, 'None'), len(self.video.subtitleStreams), T(32308, 'Available'))) + else: + self.setProperty('subtitles', T(32309, u'None')) + + def createListItem(self, obj): + mli = kodigui.ManagedListItem(obj.title or '', thumbnailImage=obj.thumb.asTranscodedImageURL(*self.EXTRA_DIM), data_source=obj) + return mli + + def fillExtras(self, has_prev=False): + items = [] + idx = 0 + + if not self.video.extras: + self.extraListControl.reset() + return False + + for extra in self.video.extras(): + if not self.trailer and extra.extraType.asInt() == media.METADATA_RELATED_TRAILER: + self.trailer = extra + self.setProperty('trailer.button', '1') + continue + + mli = self.createListItem(extra) + if mli: + mli.setProperty('index', str(idx)) + mli.setProperty( + 'thumb.fallback', 'script.plex/thumb_fallbacks/{0}.png'.format(extra.type in ('show', 'season', 'episode') and 'show' or 'movie') + ) + items.append(mli) + idx += 1 + + if not items: + return False + + self.extraListControl.reset() + self.extraListControl.addItems(items) + + self.setProperty('divider.{0}'.format(self.EXTRA_LIST_ID), has_prev and '1' or '') + + return True + + def fillRelated(self, has_prev=False): + if not self.relatedPaginator.leafCount: + self.relatedListControl.reset() + return False + + items = self.relatedPaginator.paginate() + + if not items: + return False + + self.setProperty('divider.{0}'.format(self.RELATED_LIST_ID), has_prev and '1' or '') + + return True + + def fillRoles(self, has_prev=False): + items = [] + idx = 0 + + if not self.video.roles: + self.rolesListControl.reset() + return False + + for role in self.video.roles(): + mli = kodigui.ManagedListItem(role.tag, role.role, thumbnailImage=role.thumb.asTranscodedImageURL(*self.ROLES_DIM), data_source=role) + mli.setProperty('index', str(idx)) + items.append(mli) + idx += 1 + + if not items: + return False + + self.rolesListControl.reset() + self.rolesListControl.addItems(items) + return True + + def fillReviews(self, has_prev=False): + items = [] + idx = 0 + + if not self.video.reviews: + self.reviewsListControl.reset() + return False + + for review in self.video.reviews(): + mli = kodigui.ManagedListItem(review.source, review.tag, thumbnailImage=review.ratingImage()) + mli.setProperty('index', str(idx)) + mli.setProperty('text', review.text) + items.append(mli) + idx += 1 + + if not items: + return False + + self.reviewsListControl.reset() + self.reviewsListControl.addItems(items) + return True diff --git a/script.plexmod/lib/windows/preplayutils.py b/script.plexmod/lib/windows/preplayutils.py new file mode 100644 index 000000000..7d000622f --- /dev/null +++ b/script.plexmod/lib/windows/preplayutils.py @@ -0,0 +1,35 @@ +from __future__ import absolute_import +from . import dropdown + +from lib.util import T + + +def chooseVersion(video): + if len(video.media) > 1: + options = [] + for media in video.media: + ind = '' + if video.mediaChoice and media.id == video.mediaChoice.media.id: + ind = 'script.plex/home/device/check.png' + options.append({'key': media, 'display': media.versionString(), 'indicator': ind}) + choice = dropdown.showDropdown(options, header=T(32450, 'Choose Version'), with_indicator=True) + if not choice: + return False + + for media in video.media: + media.set('selected', '') + + video.setMediaChoice(choice['key']) + choice['key'].set('selected', 1) + + return True + + +def resetVersion(video): + if len(video.media) < 2: + return + + for media in video.media: + media.set('selected', '') + + video.media[0].set('selected', 1) diff --git a/script.plexmod/lib/windows/search.py b/script.plexmod/lib/windows/search.py new file mode 100644 index 000000000..2b4e2998c --- /dev/null +++ b/script.plexmod/lib/windows/search.py @@ -0,0 +1,435 @@ +from __future__ import absolute_import +import time +import threading + +from kodi_six import xbmcgui, xbmc + +from . import kodigui +from . import opener +from . import windowutils + +from lib import util +from lib.kodijsonrpc import rpc + +from plexnet import plexapp + +class SearchDialog(kodigui.BaseDialog, windowutils.UtilMixin): + xmlFile = 'script-plex-search.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + LETTERS = 'abcdefghijklmnopqrstuvwxyz0123456789 ' + SECTION_BUTTONS = { + 901: 'all', + 902: 'movie', + 903: 'show', + 904: 'artist', + 905: 'photo' + } + + EDIT_CONTROL_ID = 650 + BUTTON_A_ID = 1001 + + HUB_POSTER_00 = 2100 + HUB_SQUARE_01 = 2101 + HUB_AR16X9_02 = 2102 + HUB_CIRCLE_03 = 2103 + HUB_POSTER_04 = 2104 + HUB_SQUARE_05 = 2105 + HUB_AR16X9_06 = 2106 + HUB_CIRCLE_07 = 2107 + HUB_POSTER_08 = 2108 + HUB_SQUARE_09 = 2109 + HUB_AR16X9_10 = 2110 + HUB_CIRCLE_11 = 2111 + HUB_POSTER_12 = 2112 + HUB_SQUARE_13 = 2113 + HUB_AR16X9_14 = 2114 + HUB_CIRCLE_15 = 2115 + HUB_POSTER_16 = 2116 + HUB_SQUARE_17 = 2117 + HUB_AR16X9_18 = 2118 + HUB_CIRCLE_19 = 2119 + HUB_POSTER_20 = 2120 + HUB_SQUARE_21 = 2121 + HUB_AR16X9_22 = 2122 + HUB_CIRCLE_23 = 2123 + HUB_POSTER_24 = 2124 + HUB_SQUARE_25 = 2125 + HUB_AR16X9_26 = 2126 + HUB_CIRCLE_27 = 2127 + HUB_POSTER_28 = 2128 + HUB_SQUARE_29 = 2129 + HUB_AR16X9_30 = 2130 + HUB_CIRCLE_31 = 2131 + HUB_POSTER_32 = 2132 + HUB_SQUARE_33 = 2133 + HUB_AR16X9_34 = 2134 + HUB_CIRCLE_35 = 2135 + HUB_POSTER_36 = 2136 + HUB_SQUARE_37 = 2137 + HUB_AR16X9_38 = 2138 + HUB_CIRCLE_39 = 2139 + HUB_POSTER_40 = 2140 + HUB_SQUARE_41 = 2141 + HUB_AR16X9_42 = 2142 + HUB_CIRCLE_43 = 2143 + HUB_POSTER_44 = 2144 + HUB_SQUARE_45 = 2145 + HUB_AR16X9_46 = 2146 + HUB_CIRCLE_47 = 2147 + + HUBMAP = { + 'track': {'type': 'square'}, + 'episode': {'type': 'ar16x9'}, + 'movie': {'type': 'poster'}, + 'show': {'type': 'poster'}, + 'artist': {'type': 'square'}, + 'album': {'type': 'square'}, + 'photoalbum': {'type': 'square'}, + 'photo': {'type': 'square'}, + 'actor': {'type': 'circle'}, + 'director': {'type': 'circle'}, + 'genre': {'type': 'circle'}, + 'playlist': {'type': 'square'}, + } + + SECTION_TYPE_MAP = { + '1': {'thumb': 'script.plex/section_type/movie.png'}, # Movie + '2': {'thumb': 'script.plex/section_type/show.png'}, # Show + '3': {'thumb': 'script.plex/section_type/show.png'}, # Season + '4': {'thumb': 'script.plex/section_type/show.png'}, # Episode + '8': {'thumb': 'script.plex/section_type/music.png'}, # Artist + '9': {'thumb': 'script.plex/section_type/music.png'}, # Album + '10': {'thumb': 'script.plex/section_type/music.png'}, # Track + } + + def __init__(self, *args, **kwargs): + kodigui.BaseDialog.__init__(self, *args, **kwargs) + windowutils.UtilMixin.__init__(self) + self.parentWindow = kwargs.get('parent_window') + self.sectionID = kwargs.get('section_id') + self.resultsThread = None + self.updateResultsTimeout = 0 + self.isActive = True + self.useKodiKbd = util.getSetting('search_use_kodi_kbd', False) + + def onFirstInit(self): + self.hubControls = ( + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_00, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_01, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_02, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_03, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_04, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_05, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_06, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_07, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_08, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_09, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_10, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_11, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_12, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_13, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_14, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_15, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_16, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_17, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_18, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_19, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_20, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_21, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_22, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_23, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_24, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_25, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_26, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_27, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_28, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_29, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_30, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_31, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_32, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_33, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_34, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_35, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_36, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_37, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_38, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_39, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_40, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_41, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_42, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_43, 5) + }, + { + 'poster': kodigui.ManagedControlList(self, self.HUB_POSTER_44, 5), + 'square': kodigui.ManagedControlList(self, self.HUB_SQUARE_45, 5), + 'ar16x9': kodigui.ManagedControlList(self, self.HUB_AR16X9_46, 5), + 'circle': kodigui.ManagedControlList(self, self.HUB_CIRCLE_47, 5) + }, + ) + + self.edit = kodigui.SafeControlEdit(self.EDIT_CONTROL_ID, 651, self, key_callback=self.updateFromEdit, + grab_focus=True) + self.edit.setCompatibleMode(rpc.Application.GetProperties(properties=["version"])["version"]["major"] < 17) + if self.useKodiKbd: + self.setProperty('hide.kbd', '1') + self.setFocusId(self.EDIT_CONTROL_ID) + xbmc.executebuiltin('Action(Select,{0})'.format(self._winID)) + else: + self.setFocusId(self.BUTTON_A_ID) + self.setProperty('search.section', 'all') + self.updateQuery() + + def onAction(self, action): + try: + if action in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_PREVIOUS_MENU): + self.isActive = False + except: + util.ERROR() + + kodigui.BaseDialog.onAction(self, action) + + def onClick(self, controlID): + if 1000 < controlID < 1037: + self.letterClicked(controlID) + elif controlID in self.SECTION_BUTTONS: + self.sectionClicked(controlID) + elif controlID == 951: + self.deleteClicked() + elif controlID == 952: + self.letterClicked(1037) + elif controlID == 953: + self.clearClicked() + elif 2099 < controlID < 2200: + self.hubItemClicked(controlID) + + def onFocus(self, controlID): + if 2099 < controlID < 2200: + self.setProperty('hub.focus', str(controlID - 2099)) + + def updateFromEdit(self, actionID, oldVal, newVal): + if actionID == xbmcgui.ACTION_PREVIOUS_MENU: + self.isActive = False + self.doClose() + return + + self.updateQuery() + + def updateQuery(self): + self.updateResults() + + def updateResults(self): + self.updateResultsTimeout = time.time() + 1 + if not self.resultsThread or not self.resultsThread.is_alive(): + self.resultsThread = threading.Thread(target=self._updateResults, name='search.update') + self.resultsThread.start() + + def _updateResults(self): + while time.time() < self.updateResultsTimeout and not util.MONITOR.waitForAbort(0.1): + pass + + self._reallyUpdateResults() + + def _reallyUpdateResults(self): + query = self.edit.getText() + if query: + with self.propertyContext('searching'): + hubs = plexapp.SERVERMANAGER.selectedServer.hubs(count=10, search_query=query, section=self.sectionID) + self.showHubs(hubs) + else: + self.clearHubs() + + def sectionClicked(self, controlID): + section = self.SECTION_BUTTONS[controlID] + old = self.getProperty('search.section') + self.setProperty('search.section', section) + if old != section: + self.updateResults() + + def letterClicked(self, controlID): + letter = self.LETTERS[controlID - 1001] + self.edit.append(letter) + self.updateQuery() + + def deleteClicked(self): + self.edit.delete() + self.updateQuery() + + def clearClicked(self): + self.edit.setText('') + self.updateQuery() + + def hubItemClicked(self, hubControlID): + for controls in self.hubControls: + for control in controls.values(): + if control.controlID == hubControlID: + break + else: + continue + break + else: + return + + mli = control.getSelectedItem() + if not mli: + return + + hubItem = mli.dataSource + if hubItem.TYPE == 'playlist' and not hubItem.exists(): # Workaround for server bug + util.messageDialog('No Access', 'Playlist not accessible by this user.') + util.DEBUG_LOG('Search: Playlist does not exist - probably wrong user') + return + + self.doClose() + try: + command = opener.open(hubItem) + + if not hubItem.exists(): + control.removeManagedItem(mli) + + self.processCommand(command) + finally: + if not self.exitCommand: + self.show() + else: + self.isActive = False + + def createListItem(self, hubItem): + if hubItem.TYPE in ('Genre', 'Director', 'Role'): + if hubItem.TYPE == 'Genre': + thumb = (self.SECTION_TYPE_MAP.get(hubItem.librarySectionType) or {}).get('thumb', '') + mli = kodigui.ManagedListItem(hubItem.tag, hubItem.reasonTitle, thumbnailImage=thumb, data_source=hubItem) + mli.setProperty('thumb.fallback', thumb) + else: + mli = kodigui.ManagedListItem( + hubItem.tag, hubItem.reasonTitle, thumbnailImage=hubItem.get('thumb').asTranscodedImageURL(256, 256), data_source=hubItem + ) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/role.png') + else: + if hubItem.TYPE == 'playlist': + mli = kodigui.ManagedListItem(hubItem.tag, thumbnailImage=hubItem.get('composite').asTranscodedImageURL(256, 256), data_source=hubItem) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/{0}.png'.format(hubItem.playlistType == 'audio' and 'music' or 'movie')) + elif hubItem.TYPE == 'photodirectory': + mli = kodigui.ManagedListItem(hubItem.title, thumbnailImage=hubItem.get('composite').asTranscodedImageURL(256, 256), data_source=hubItem) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/photo.png') + else: + mli = kodigui.ManagedListItem(hubItem.title, thumbnailImage=hubItem.get('thumb').asTranscodedImageURL(256, 256), data_source=hubItem) + if hubItem.TYPE in ('movie', 'clip'): + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/movie.png') + elif hubItem.TYPE in ('artist', 'album', 'track'): + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/music.png') + elif hubItem.TYPE in ('show', 'season', 'episode'): + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/show.png') + elif hubItem.TYPE == 'photo': + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/photo.png') + + return mli + + def showHubs(self, hubs): + self.clearHubs() + self.opaqueBackground(on=False) + + allowed = None + if self.getProperty('search.section') == 'movie': + allowed = ('movie',) + elif self.getProperty('search.section') == 'show': + allowed = ('show', 'season', 'episode') + elif self.getProperty('search.section') == 'artist': + allowed = ('artist', 'album', 'track') + elif self.getProperty('search.section') == 'photo': + allowed = ('photo', 'photodirectory') + + controlID = None + i = 0 + for h in hubs: + if allowed and h.type not in allowed: + continue + + if h.size.asInt() > 0: + self.opaqueBackground() + cid = self.showHub(h, i) + controlID = controlID or cid + i += 1 + + if controlID: + self.setProperty('no.results', '') + else: + self.setProperty('no.results', '1') + + def showHub(self, hub, idx): + util.DEBUG_LOG('Showing search hub: {0} at {1}'.format(hub.type, idx)) + info = self.HUBMAP.get(hub.type) + if not info: + util.DEBUG_LOG('Unhandled hub type: {0}'.format(hub.type)) + return + + itemListControl = self.hubControls[idx][info['type']] + if itemListControl is None: + util.DEBUG_LOG('No control defined') + return + + self.setProperty('hub.{0}'.format(itemListControl.controlID), hub.title) + + items = [] + for hubItem in hub.items: + mli = self.createListItem(hubItem) + items.append(mli) + + itemListControl.reset() + itemListControl.addItems(items) + + return itemListControl.controlID + + def clearHubs(self): + self.opaqueBackground(on=False) + self.setProperty('no.results', '') + for controls in self.hubControls: + for control in controls.values(): + if control: + control.reset() + self.setProperty('hub.focus', '') + + def opaqueBackground(self, on=True): + self.parentWindow.setProperty('search.dialog.hasresults', on and '1' or '') + + def wait(self): + while self.isActive and not util.MONITOR.waitForAbort(0.1): + pass + + +def dialog(parent_window, section_id=None): + parent_window.setProperty('search.dialog.hasresults', '') + with parent_window.propertyContext('search.dialog'): + try: + w = SearchDialog.open(parent_window=parent_window, section_id=section_id) + w.wait() + command = w.exitCommand or '' + del w + return command + finally: + parent_window.setProperty('search.dialog.hasresults', '') diff --git a/script.plexmod/lib/windows/seekdialog.py b/script.plexmod/lib/windows/seekdialog.py new file mode 100644 index 000000000..f5d566743 --- /dev/null +++ b/script.plexmod/lib/windows/seekdialog.py @@ -0,0 +1,2204 @@ +from __future__ import absolute_import +import re +import time +import threading +import math + +from kodi_six import xbmc +from kodi_six import xbmcgui +from collections import OrderedDict + +from . import kodigui +from . import playersettings +from . import dropdown +from . import busy +from plexnet import plexapp + +from lib import util +from plexnet.videosession import VideoSessionInfo, ATTRIBUTE_TYPES as SESSION_ATTRIBUTE_TYPES +from plexnet.exceptions import ServerNotOwned, NotFound +from plexnet.signalsmixin import SignalsMixin + +from lib.kodijsonrpc import builtin + +from lib.util import T +from six.moves import range + +KEY_MOVE_SET = frozenset( + ( + xbmcgui.ACTION_MOVE_LEFT, + xbmcgui.ACTION_MOVE_RIGHT, + xbmcgui.ACTION_MOVE_UP, + xbmcgui.ACTION_MOVE_DOWN + ) +) + +KEY_STEP_SEEK_SET = frozenset( + ( + xbmcgui.ACTION_MOVE_LEFT, + xbmcgui.ACTION_MOVE_RIGHT, + xbmcgui.ACTION_STEP_FORWARD, + xbmcgui.ACTION_STEP_BACK + ) +) + +MARKERS = OrderedDict([ + ("intro", { + "marker": None, + "name": T(32495, 'Skip intro'), + "autoSkipName": T(32800, 'Skipping intro'), + "overrideStartOff": None, + "countdown": None, + + # attrs + "markerAutoSkip": "autoSkipIntro", + "markerAutoSkipped": False, + "markerAutoSkipShownTimer": "_introSkipShownStarted", + "markerSkipBtnTimeout": "skipIntroButtonTimeout", + }), + ("credits", { + "marker": None, + "name": T(32496, 'Skip credits'), + "autoSkipName": T(32801, 'Skipping credits'), + "overrideStartOff": None, + "countdown": None, + + "markerAutoSkip": "autoSkipCredits", + "markerAutoSkipped": False, + "markerAutoSkipShownTimer": "_creditsSkipShownStarted", + "markerSkipBtnTimeout": "skipCreditsButtonTimeout" + }) +]) + +FINAL_MARKER_NEGOFF = 5000 +MARKER_SHOW_NEGOFF = 3000 +MARKER_OFF = 500 +MARKER_CHAPTER_OVERLAP_THRES = 30000 # 30 seconds + + +class SeekDialog(kodigui.BaseDialog): + """ + fixme: This is a convoluted mess. + """ + + xmlFile = 'script-plex-seek_dialog.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + MAIN_BUTTON_ID = 100 + SEEK_IMAGE_ID = 200 + POSITION_IMAGE_ID = 201 + SELECTION_INDICATOR = 202 + SELECTION_INDICATOR_GROUP = 203 + SELECTION_INDICATOR_IMAGE = 204 + SELECTION_INDICATOR_TEXT = 205 + CACHE_IMAGE_ID = 206 + BIF_IMAGE_ID = 300 + SEEK_IMAGE_WIDTH = 1920 + + REPEAT_BUTTON_ID = 401 + SHUFFLE_BUTTON_ID = 402 + SETTINGS_BUTTON_ID = 403 + PREV_BUTTON_ID = 404 + SKIP_BACK_BUTTON_ID = 405 + PLAY_PAUSE_BUTTON_ID = 406 + STOP_BUTTON_ID = 407 + SKIP_FORWARD_BUTTON_ID = 408 + NEXT_BUTTON_ID = 409 + PLAYLIST_BUTTON_ID = 410 + OPTIONS_BUTTON_ID = 411 + SUBTITLE_BUTTON_ID = 412 + + BIG_SEEK_GROUP_ID = 500 + BIG_SEEK_LIST_ID = 501 + + SKIP_MARKER_BUTTON_ID = 791 + NO_OSD_BUTTON_ID = 800 + + BAR_X = 0 + BAR_Y = 921 + BAR_RIGHT = 1920 + BAR_BOTTOM = 969 + + NAVBAR_BTN_SIZE = 60 + + HIDE_DELAY = 4 # This uses the Cron tick so is +/- 1 second accurate + OSD_HIDE_ANIMATION_DURATION = 0.2 + SKIP_STEPS = {"negative": [-10000], "positive": [30000]} + + def __init__(self, *args, **kwargs): + kodigui.BaseDialog.__init__(self, *args, **kwargs) + + # fixme: heyo, there's a lot of disorder in here. + self.handler = kwargs.get('handler') + self.initialVideoSettings = {} + self.initialAudioStream = None + self.initialSubtitleStream = None + self.bifURL = None + self.baseURL = None + self.hasBif = bool(self.bifURL) + self.baseOffset = 0 + self._duration = 0 + self.offset = 0 + self.selectedOffset = 0 + self.bigSeekOffset = 0 + self.bigSeekChanged = False # attention, with chapters this can become an integer for the True state + self.title = '' + self.title2 = '' + self.fromSeek = 0 + self.initialized = False + self.playlistDialog = None + self.timeout = None + self.autoSeekTimeout = None + self.hasDialog = False + self.lastFocusID = None + self.previousFocusID = None + self.playlistDialogVisible = False + self.forceNextTimeAsChapter = False + self.showChapters = False + self._seeking = False + self._applyingSeek = False + self._seekingWithoutOSD = False + self._delayedSeekThread = None + self._delayedSeekTimeout = 0 + self._osdHideAnimationTimeout = 0 + self._osdHideFast = False + self._hideDelay = self.HIDE_DELAY + self._autoSeekDelay = util.advancedSettings.autoSeekDelay + self._atSkipStep = -1 + self._lastSkipDirection = None + self._forcedLastSkipAmount = None + self._navigatedViaMarkerOrChapter = False + self._lastAction = None + self.lastTimelineResponse = None + self._ignoreInput = False + self._ignoreTick = False + self._abortBufferWait = False + + self._videoBelowOneHour = False + self.timeFmtKodi = util.timeFormatKN + self.waitingForBuffer = False + self.lastSubtitleNavAction = "forward" + self.subtitleButtonLeft = 0 + self.ldTimer = True #util.advancedSettings.lowDriftTimer + self.timeKeeper = None + self.timeKeeperTime = None + self.idleTime = None + self.stopPlaybackOnIdle = util.getSetting('player_stop_on_idle', 0) + self.isDirectPlay = True + self.isTranscoded = False + + # optimize + self._enableMarkerSkip = plexapp.ACCOUNT.hasPlexPass() + self.markers = None + self.chapters = None + self._introSkipShownStarted = None + self._creditsSkipShownStarted = None + self._currentMarker = None + self.skipSteps = self.SKIP_STEPS + self.useAutoSeek = util.advancedSettings.autoSeek + self.useDynamicStepsForTimeline = util.advancedSettings.dynamicTimelineSeek + + self.bingeMode = False + self.autoSkipIntro = False + self.autoSkipCredits = False + self.showIntroSkipEarly = False + + self.skipIntroButtonTimeout = util.advancedSettings.skipIntroButtonTimeout + self.skipCreditsButtonTimeout = util.advancedSettings.skipCreditsButtonTimeout + self.showItemEndsInfo = util.advancedSettings.showMediaEndsInfo + self.showItemEndsLabel = util.advancedSettings.showMediaEndsLabel + + self.player.video.server.on("np:timelineResponse", self.timelineResponseCallback) + + if util.kodiSkipSteps and util.advancedSettings.kodiSkipStepping: + self.skipSteps = {"negative": [], "positive": []} + for step in util.kodiSkipSteps: + key = "negative" if step < 0 else "positive" + self.skipSteps[key].append(step * 1000) + + self.skipSteps["negative"].reverse() + + try: + seconds = int(xbmc.getInfoLabel("Skin.String(SkinHelper.AutoCloseVideoOSD)")) + if seconds > 0: + self._hideDelay = seconds + except ValueError: + pass + + @property + def player(self): + return self.handler.player + + def timelineResponseCallback(self, **kwargs): + response = kwargs.get("response") + self.lastTimelineResponse = response.getBodyXml() + + def resetTimeout(self): + self.timeout = time.time() + self._hideDelay + + def resetAutoSeekTimer(self, value="not_set"): + self.autoSeekTimeout = value if value != "not_set" else time.time() + self._autoSeekDelay + + def resetSeeking(self): + self._seeking = False + self._seekingWithoutOSD = False + self._delayedSeekTimeout = None + self._applyingSeek = False + self.bigSeekChanged = False + self.selectedOffset = None + self.forceNextTimeAsChapter = False + self._navigatedViaMarkerOrChapter = False + self.setProperty('show.chapters', '') + self.setProperty('button.seek', '') + self.setProperty('marker.countdown', '') + self.resetAutoSeekTimer(None) + self.resetSkipSteps() + + def resetMarkerStates(self): + self.setProperty('show.markerSkip', '') + self.setProperty('show.markerSkip_OSDOnly', '') + self.setProperty('marker.autoSkip', '') + self.setProperty('skipMarkerName', '') + + self._introSkipShownStarted = None + self._introAutoSkipped = False + self._creditsSkipShownStarted = None + self._currentMarker = None + self._creditsAutoSkipped = False + self.markers = None + + @property + def DPPlayerOffset(self): + if self.isDirectPlay and self.handler.player and self.handler.player.playerObject: + return self.handler.player.playerObject.startOffset * 1000 + return 0 + + def trueOffset(self): + if self.isDirectPlay: + return self.DPPlayerOffset + self.offset + else: + return self.baseOffset + self.offset + + @property + def markers(self): + # fixme: fix transcoded marker skip + if not self._enableMarkerSkip: + return None + + if not self._markers and hasattr(self.handler.player.video, "markers"): + markers = [] + + for marker in self.handler.player.video.markers: + if marker.type in MARKERS: + m = MARKERS[marker.type].copy() + m["marker"] = marker + m["marker_type"] = marker.type + markers.append(m) + + self._markers = markers + + return self._markers + + @markers.setter + def markers(self, val): + self._markers = val + + def onFirstInit(self): + try: + self._onFirstInit() + except RuntimeError: + util.ERROR(hide_tb=True) + self.started = False + + def _onFirstInit(self): + util.DEBUG_LOG("SeekDialog: onFirstInit") + self.resetTimeout() + self.setProperty('skipMarkerName', T(32495, 'Skip intro')) + self.bigSeekHideTimer = kodigui.PropertyTimer(self._winID, 0.5, 'hide.bigseek') + + if self.handler.playlist: + self.handler.playlist.on('change', self.updateProperties) + + self.seekbarControl = self.getControl(self.SEEK_IMAGE_ID) + self.positionControl = self.getControl(self.POSITION_IMAGE_ID) + self.cacheControl = self.getControl(self.CACHE_IMAGE_ID) + self.bifImageControl = self.getControl(self.BIF_IMAGE_ID) + self.selectionIndicator = self.getControl(self.SELECTION_INDICATOR) + self.selectionIndicatorImage = self.getControl(self.SELECTION_INDICATOR_IMAGE) + self.selectionIndicatorText = self.getControl(self.SELECTION_INDICATOR_TEXT) + self.selectionIndicatorGroup = self.getControl(self.SELECTION_INDICATOR_GROUP) + self.selectionBox = self.getControl(203) + self.bigSeekControl = kodigui.ManagedControlList(self, self.BIG_SEEK_LIST_ID, 12) + self.bigSeekGroupControl = self.getControl(self.BIG_SEEK_GROUP_ID) + self.initialized = True + + showQuickSubs = util.getSetting('subtitle_downloads', False) + showRepeat = util.getSetting('video_show_repeat', False) + showFfwdRwd = util.getSetting('video_show_ffwdrwd', False) + showShuffle = util.getSetting('video_show_shuffle', False) + self.setBoolProperty('nav.quick_subtitles', showQuickSubs) + self.setBoolProperty('nav.repeat', showRepeat) + self.setBoolProperty('nav.ffwdrwd', showFfwdRwd) + self.setBoolProperty('nav.shuffle', showShuffle) + + if showQuickSubs: + self.subtitleButtonLeft += self.NAVBAR_BTN_SIZE * len( + list(x for x in (showRepeat, showFfwdRwd, showShuffle) if not x)) + + self.updateProperties() + self.updateChapters() + self.videoSettingsHaveChanged() + self.update() + + def onReInit(self): + util.DEBUG_LOG("SeekDialog: onReInit") + self.lastTimelineResponse = None + self._lastAction = None + self._ignoreTick = False + self.waitingForBuffer = False + self._abortBufferWait = False + + self.resetTimeout() + self.resetSeeking() + self.updateProperties() + self.updateChapters() + self.videoSettingsHaveChanged() + self.updateProgress() + + def setup(self, duration, meta, offset=0, bif_url=None, title='', title2='', chapters=None, keepMarkerDef=False): + """ + this is called by our handler and occurs earlier than onFirstInit. + """ + util.DEBUG_LOG("SeekDialog: setup, keepMarkerDef={}".format(keepMarkerDef)) + self.title = title + self.title2 = title2 + self.chapters = chapters or [] + self.isDirectPlay = not meta.isTranscoded + self.isTranscoded = not self.isDirectPlay + self.showChapters = util.getUserSetting('show_chapters', True) and ( + bool(chapters) or (util.getUserSetting('virtual_chapters', True) and bool(self.markers))) + self.setProperty('video.title', title) + self.setProperty('is.show', (self.player.video.type == 'episode') and '1' or '') + self.setProperty('has.playlist', self.handler.playlist and '1' or '') + self.setProperty('shuffled', (self.handler.playlist and self.handler.playlist.isShuffled) and '1' or '') + self.setProperty('has.chapters', self.showChapters and '1' or '') + self.setProperty('show.buffer', (util.advancedSettings.playerShowBuffer and self.isDirectPlay) and '1' or '') + + self.killTimeKeeper() + + navPlaylist = util.getSetting('video_show_playlist', 'eponly') + self.setBoolProperty('nav.playlist', (navPlaylist == "eponly" and self.player.video.type == 'episode') or + navPlaylist == "always") + + if not self.getProperty('nav.playlist'): + self.subtitleButtonLeft += self.NAVBAR_BTN_SIZE + + navPrevNext = util.getSetting('video_show_prevnext', 'eponly') + self.setBoolProperty('nav.prevnext', (navPrevNext == "eponly" and self.player.video.type == 'episode') or + navPrevNext == "always") + + if not self.getProperty('nav.prevnext'): + self.subtitleButtonLeft += self.NAVBAR_BTN_SIZE + + try: + if self.player.video.type == 'episode': + pbs = self.player.video.playbackSettings + util.DEBUG_LOG("Playback settings for {}: {}".format(self.player.video.ratingKey, pbs)) + + self.bingeMode = pbs.binge_mode + self.handler.inBingeMode = self.bingeMode + + # don't auto skip intro when on binge mode on the first episode of a season + firstEp = self.player.video.index == '1' + + if self.isDirectPlay or util.getUserSetting('auto_skip_in_transcode', True): + self.autoSkipIntro = (self.bingeMode and not firstEp) or pbs.auto_skip_intro + self.autoSkipCredits = self.bingeMode or pbs.auto_skip_credits + + self.showIntroSkipEarly = self.bingeMode or pbs.show_intro_skip_early + + # in transcoded scenarios, when seeking, keep previous marker states, as the video restarts + if not keepMarkerDef: + self.resetMarkerStates() + except IndexError: + self.doClose(delete=True) + raise util.NoDataException + self.baseOffset = offset + self.offset = 0 + self.idleTime = None + self.lastSubtitleNavAction = "forward" + self._duration = duration + self._videoBelowOneHour = duration / 3600000 < 1 + if self._videoBelowOneHour: + self.timeFmtKodi = self.timeFmtKodi.replace("hh:", "") + self._ignoreTick = False + self._ignoreInput = False + if not self.showChapters: + self.bifURL = bif_url + self.hasBif = bool(self.bifURL) + + if self.hasBif: + self.baseURL = re.sub('/\d+\?', '/{0}?', self.bifURL) + self.update() + + def update(self, offset=None, from_seek=False): + if from_seek: + self.fromSeek = time.time() + else: + if time.time() - self.fromSeek > 0.5: + self.fromSeek = 0 + + if offset is not None: + self.offset = offset + self.selectedOffset = self.trueOffset() + + self.updateProgress() + + def onAction(self, action): + if xbmc.getCondVisibility('Window.IsActive(selectdialog)'): + if self.doKodiSelectDialogHack(action): + return + + try: + self.resetTimeout() + + controlID = self.getFocusId() + self.idleTime = None + + lastAction = self._lastAction + self._lastAction = currentAction = (action.getId(), controlID) + + cancelActions = (xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_STOP) + + if not self._ignoreInput: + if action.getId() in KEY_MOVE_SET: + self.setProperty('mouse.mode', '') + if not controlID: + self.setBigSeekShift() + self.setFocusId(400) + return + elif action == xbmcgui.ACTION_MOUSE_MOVE: + self.setProperty('mouse.mode', '1') + + if controlID in (self.MAIN_BUTTON_ID, self.NO_OSD_BUTTON_ID): + if action == xbmcgui.ACTION_MOUSE_LEFT_CLICK: + if self.getProperty('mouse.mode') != '1': + self.setProperty('mouse.mode', '1') + + self.seekMouse(action, without_osd=controlID == self.NO_OSD_BUTTON_ID) + return + elif action == xbmcgui.ACTION_MOUSE_MOVE: + self.seekMouse(action, without_osd=controlID == self.NO_OSD_BUTTON_ID, preview=True) + return + + if action in (xbmcgui.ACTION_PAUSE, xbmcgui.ACTION_PLAYER_PLAY, xbmcgui.ACTION_PLAYER_PLAYPAUSE) and \ + self.player.playState == self.player.STATE_PLAYING: + self.hideOSD() + + passThroughMain = False + if controlID == self.SKIP_MARKER_BUTTON_ID: + if action == xbmcgui.ACTION_SELECT_ITEM: + markerDef = self._currentMarker + if markerDef["marker"]: + marker = markerDef["marker"] + final = getattr(marker, "final", False) + + markerOff = 0 + if marker.type == "credits" and final: + # offset final marker seek so we can trigger postPlay + markerOff = FINAL_MARKER_NEGOFF + + util.DEBUG_LOG('MarkerSkip: Skipping marker {}'.format(markerDef["marker"])) + self.setProperty('show.markerSkip', '') + self.setProperty('show.markerSkip_OSDOnly', '') + self.doSeek(math.ceil(float(marker.endTimeOffset)) - markerOff) + self.hideOSD(skipMarkerFocus=True) + + if marker.type == "credits" and not final: + # non-final marker + setattr(self, markerDef["markerAutoSkipShownTimer"], None) + self.resetAutoSeekTimer(None) + + return + elif action == xbmcgui.ACTION_MOVE_DOWN: + self.setProperty('show.markerSkip_OSDOnly', '1') + self.showOSD() + elif action in (xbmcgui.ACTION_MOVE_RIGHT, xbmcgui.ACTION_STEP_FORWARD, xbmcgui.ACTION_MOVE_LEFT, + xbmcgui.ACTION_STEP_BACK): + # allow no-OSD-seeking with intro skip button shown + passThroughMain = True + elif action == xbmcgui.ACTION_MOVE_UP and self.osdVisible() and self.showChapters: + self.setProperty('show.chapters', '1') + self.setFocusId(self.BIG_SEEK_LIST_ID) + return + + if controlID == self.MAIN_BUTTON_ID: + # we're seeking from the timeline with the OSD open - do an actual timeline seek + if not self._seeking: + self.selectedOffset = self.trueOffset() + + if action in (xbmcgui.ACTION_MOVE_RIGHT, xbmcgui.ACTION_STEP_FORWARD): + if self.useDynamicStepsForTimeline: + return self.skipForward() + return self.seekByOffset(10000, auto_seek=self.useAutoSeek) + + elif action in (xbmcgui.ACTION_MOVE_LEFT, xbmcgui.ACTION_STEP_BACK): + if self.useDynamicStepsForTimeline: + return self.skipBack() + return self.seekByOffset(-10000, auto_seek=self.useAutoSeek) + + elif action == xbmcgui.ACTION_MOVE_UP: + if self.getProperty('show.markerSkip') or self.getProperty('show.markerSkip_OSDOnly'): + # pressed up on player controls, then up on MAIN BUTTON; focus marker button + if currentAction == lastAction: + self.setFocusId(self.SKIP_MARKER_BUTTON_ID) + return + elif self.showChapters: + self.setProperty('show.chapters', '1') + + elif action == xbmcgui.ACTION_MOVE_DOWN: + if self.previousFocusID == self.BIG_SEEK_LIST_ID and ( + self.getProperty('show.markerSkip') or self.getProperty('show.markerSkip_OSDOnly')): + self.setFocusId(self.SKIP_MARKER_BUTTON_ID) + self.setProperty('show.chapters', '') + + self.updateBigSeek() + + # elif action == xbmcgui.ACTION_MOVE_UP: + # self.seekForward(60000) + # elif action == xbmcgui.ACTION_MOVE_DOWN: + # self.seekBack(60000) + + # don't auto-apply the currently selected seek when pressing down + elif controlID == self.PLAY_PAUSE_BUTTON_ID and self.previousFocusID == self.MAIN_BUTTON_ID \ + and action == xbmcgui.ACTION_MOVE_DOWN: + self.resetSeeking() + + elif controlID == self.NO_OSD_BUTTON_ID or passThroughMain: + if action in (xbmcgui.ACTION_MOVE_RIGHT, xbmcgui.ACTION_MOVE_LEFT): + # we're seeking from the timeline, with the OSD closed; act as we're skipping + if not self._seeking: + self.selectedOffset = self.trueOffset() + + if action == xbmcgui.ACTION_MOVE_RIGHT: + self.skipForward(without_osd=True) + + else: + self.skipBack(without_osd=True) + if action in (xbmcgui.ACTION_MOVE_UP, xbmcgui.ACTION_MOVE_DOWN): + # we're seeking from the timeline, with the OSD closed; act as we're skipping + if not self._seeking: + self.selectedOffset = self.trueOffset() + + if self.skipChapter(forward=(action == xbmcgui.ACTION_MOVE_UP), without_osd=True): + return + + if action in ( + xbmcgui.ACTION_MOVE_UP, + xbmcgui.ACTION_MOVE_DOWN, + xbmcgui.ACTION_BIG_STEP_FORWARD, + xbmcgui.ACTION_BIG_STEP_BACK + ) and not self._seekingWithoutOSD: + self.selectedOffset = self.trueOffset() + self.setBigSeekShift() + self.updateProgress() + self.showOSD() + + elif action.getButtonCode() == 61519: + if self.getProperty('show.PPI'): + self.hidePPIDialog() + else: + self.showPPIDialog() + return + + elif controlID == self.BIG_SEEK_LIST_ID: + if action in (xbmcgui.ACTION_MOVE_RIGHT, xbmcgui.ACTION_BIG_STEP_FORWARD): + return self.updateBigSeek(changed=True) + elif action in (xbmcgui.ACTION_MOVE_LEFT, xbmcgui.ACTION_BIG_STEP_BACK): + return self.updateBigSeek(changed=True) + + elif action == xbmcgui.ACTION_MOVE_DOWN: + if self.getProperty('show.markerSkip'): + self.setProperty('show.chapters', '') + self.setFocusId(self.SKIP_MARKER_BUTTON_ID) + + if action.getButtonCode() == 61516: + self.cycleSubtitles() + elif action.getButtonCode() == 61524: + self.toggleSubtitles() + elif action.getButtonCode() == 323714: + # Alt-left + builtin.PlayerControl('tempodown') + elif action.getButtonCode() == 323715: + # Alt-right + builtin.PlayerControl('tempoup') + elif action == xbmcgui.ACTION_NEXT_ITEM: + self.handler.ignoreTimelines = True + self._ignoreTick = True + self.killTimeKeeper() + self.handler.next() + elif action == xbmcgui.ACTION_PREV_ITEM: + self.handler.ignoreTimelines = True + self._ignoreTick = True + self.killTimeKeeper() + self.handler.prev() + + if action in cancelActions + (xbmcgui.ACTION_SELECT_ITEM,): + if self.getProperty('show.PPI') and action in cancelActions: + self.hidePPIDialog() + self.hideOSD() + return + + # immediate marker timer actions + if self.countingDownMarker and \ + (self.getProperty('show.markerSkip') or self.getProperty('show.markerSkip_OSDOnly')): + + if controlID != self.BIG_SEEK_LIST_ID and \ + (util.advancedSettings.skipMarkerTimerCancel + or util.advancedSettings.skipMarkerTimerImmediate): + if util.advancedSettings.skipMarkerTimerCancel and \ + action in (xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK): + self.displayMarkers(cancelTimer=True) + + elif util.advancedSettings.skipMarkerTimerImmediate \ + and action == xbmcgui.ACTION_SELECT_ITEM: + self.displayMarkers(immediate=True) + self.hideOSD(skipMarkerFocus=True) + return + + if action in cancelActions: + if self.waitingForBuffer: + self._abortBufferWait = True + self.waitingForBuffer = False + return + + if self._seeking and not self._ignoreInput: + self.resetSeeking() + self.updateCurrent() + self.updateProgress() + if self.osdVisible(): + self.hideOSD() + return + + if action in (xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK): + if self._osdHideAnimationTimeout: + if self._osdHideAnimationTimeout >= time.time(): + return + else: + self._osdHideAnimationTimeout = None + + if self.osdVisible(): + self.hideOSD() + else: + self.stop() + return + except: + util.ERROR() + + kodigui.BaseDialog.onAction(self, action) + + def doKodiSelectDialogHack(self, action): + command = { + xbmcgui.ACTION_MOVE_UP: "Up", + xbmcgui.ACTION_MOVE_DOWN: "Down", + xbmcgui.ACTION_MOVE_LEFT: "Right", # Not sure if these are actually reversed or something else is up here + xbmcgui.ACTION_MOVE_RIGHT: "Left", + xbmcgui.ACTION_SELECT_ITEM: "Select", + xbmcgui.ACTION_PREVIOUS_MENU: "Back", + xbmcgui.ACTION_NAV_BACK: "Back" + }.get(action.getId()) + + if command is not None: + xbmc.executebuiltin('Action({0},selectdialog)'.format(command)) + return True + + return False + + def onFocus(self, controlID): + lastFocusID = self.lastFocusID + self.previousFocusID = self.lastFocusID + self.lastFocusID = controlID + if controlID == self.MAIN_BUTTON_ID: + # when seeking via ENTER/CLICK on chapters, coming directly from bigSeekSelected, don't assume we've + # already seeked. bigSeekSelected sets self.selectedOffset + if not self.showChapters: + self.selectedOffset = self.trueOffset() + + if lastFocusID == self.BIG_SEEK_LIST_ID and self.bigSeekChanged: + self.updateBigSeek(changed=True) + + # in case of chapter mode, bigSeekChanged holds our chapter's offset + offset = self.bigSeekChanged if self.showChapters else self.selectedOffset + self.updateProgress(set_to_current=False, offset=offset) + + # immediately seek bigSeek after click + self._performSeek(offset=offset) + self.hideOSD(skipMarkerFocus=True) + + else: + self.setBigSeekShift() + self.updateProgress() + + elif controlID == self.BIG_SEEK_LIST_ID: + self.setBigSeekShift() + self.updateBigSeek(changed=False) + + elif xbmc.getCondVisibility('ControlGroup(400).HasFocus(0)'): + self.selectedOffset = self.trueOffset() + self.updateProgress() + + def onClick(self, controlID): + if self._ignoreInput: + return + + if controlID in (self.MAIN_BUTTON_ID, self.NO_OSD_BUTTON_ID): + # only react to click events on our main areas if we're not in mouse mode, otherwise mouse seeking is + # handled by onAction + if self.getProperty('mouse.mode') != '1': + if controlID == self.MAIN_BUTTON_ID: + self.resetAutoSeekTimer(None) + self.doSeek() + elif controlID == self.NO_OSD_BUTTON_ID: + if not self._seeking: + # we might be reacting to an immediate marker skip while showing a marker with timeout; + # in that case, don't show the OSD + if not self._currentMarker or not util.advancedSettings.skipMarkerTimerImmediate or \ + self._currentMarker["countdown"] is None: + self.showOSD() + else: + # currently seeking without the OSD, apply the seek + self.doSeek() + elif controlID == self.PLAY_PAUSE_BUTTON_ID \ + and self.player.playState == self.player.STATE_PLAYING \ + and self.osdVisible(): + self.hideOSD() + elif controlID == self.STOP_BUTTON_ID: + self.stop() + elif controlID == self.SETTINGS_BUTTON_ID: + self.handleDialog(self.showSettings) + elif controlID == self.REPEAT_BUTTON_ID: + self.repeatButtonClicked() + elif controlID == self.SHUFFLE_BUTTON_ID: + self.shuffleButtonClicked() + elif controlID == self.PREV_BUTTON_ID: + self.handler.ignoreTimelines = True + self._ignoreTick = True + self.handler.prev() + elif controlID == self.NEXT_BUTTON_ID: + if not self.handler.queuingNext: + self.handler.ignoreTimelines = True + self.handler.queuingNext = True + self._ignoreTick = True + self._ignoreInput = True + self.killTimeKeeper() + next(self.handler) + return + elif controlID == self.PLAYLIST_BUTTON_ID: + self.showPlaylistDialog() + elif controlID == self.OPTIONS_BUTTON_ID: + self.handleDialog(self.optionsButtonClicked) + elif controlID == self.SUBTITLE_BUTTON_ID: + self.handleDialog(self.subtitleButtonClicked) + elif controlID == self.BIG_SEEK_LIST_ID: + self.bigSeekSelected() + elif controlID == self.SKIP_BACK_BUTTON_ID: + self.skipBack() + elif controlID == self.SKIP_FORWARD_BUTTON_ID: + self.skipForward() + + def stop(self): + self._ignoreTick = True + self.doClose() + # self.handler.onSeekAborted() + if self.bingeMode: + self.handler.stoppedInBingeMode = True + self.handler.player.stop() + + def doClose(self, delete=False): + if self.handler.playlist: + self.handler.playlist.off('change', self.updateProperties) + + try: + if self.playlistDialog: + self.playlistDialog.doClose() + if delete: + del self.playlistDialog + self.playlistDialog = None + util.garbageCollect() + + self.killTimeKeeper() + finally: + kodigui.BaseDialog.doClose(self) + + def showPPIDialog(self): + for attrib in SESSION_ATTRIBUTE_TYPES.values(): + self.setProperty('ppi.%s' % attrib.label, "") + + self.setProperty('show.PPI', '1') + self.setProperty('ppi.Status', 'Loading ...') + + def getVideoSession(currentVideo): + return currentVideo.server.findVideoSession(currentVideo.settings.getGlobal("clientIdentifier"), + currentVideo.ratingKey) + + if util.KODI_BUILD_NUMBER < 2090821: + try: + cache = int(xbmc.getInfoLabel('Player.ProgressCache')) - int(xbmc.getInfoLabel('Player.Progress')) + self.setProperty('ppi.Buffered', str(cache)) + except: + pass + + while not self.player.started: + util.MONITOR.waitForAbort(0.1) + + info = None + currentVideo = self.player.video + try: + videoSession = None + elapsed = 0 + while not videoSession: + if elapsed > 10: + raise NotFound + + videoSession = getVideoSession(currentVideo) + if videoSession: + break + + util.MONITOR.waitForAbort(1) + elapsed += 1 + + # fill attributes + info = VideoSessionInfo(videoSession, currentVideo) + + except ServerNotOwned: + # timeline response data fallback + elapsed = 0 + try: + while not self.lastTimelineResponse: + if elapsed > 10: + raise NotFound + + util.MONITOR.waitForAbort(0.1) + elapsed += 0.1 + + info = VideoSessionInfo(None, currentVideo, incompleteSessionData=self.lastTimelineResponse) + except NotFound: + self.setProperty('ppi.Status', 'Info not available (data not found)') + + except: + util.ERROR() + + except NotFound: + self.setProperty('ppi.Status', 'Info not available (session not found)') + + except: + util.ERROR() + + if info: + self.setProperty('ppi.Status', '') + for attrib in info.attributes.values(): + self.setProperty('ppi.%s' % attrib.label, attrib.value) + + def hidePPIDialog(self): + self.setProperty('show.PPI', '') + + def resetSkipSteps(self): + self._forcedLastSkipAmount = None + self._atSkipStep = -1 + self._lastSkipDirection = None + + def determineSkipStep(self, direction): + stepCount = len(self.skipSteps[direction]) + + # shortcut for simple skipping + if stepCount == 1: + return self.skipSteps[direction][0] + + use_direction = direction + + # kodi-style skip steps + + # when the direction changes, we either use the skip steps of the other direction, or walk backwards in the + # current skip step list + if self._lastSkipDirection != direction: + if self._atSkipStep == -1 or self._lastSkipDirection is None: + self._atSkipStep = 0 + self._lastSkipDirection = direction + self._forcedLastSkipAmount = None + step = self.skipSteps[use_direction][0] + + else: + # we're reversing the current direction + use_direction = self._lastSkipDirection + + # use the inverse value of the current skip step + step = self.skipSteps[use_direction][min(self._atSkipStep, len(self.skipSteps[use_direction]) - 1)] * -1 + + # we've hit a boundary, reverse the difference of the last skip step in relation to the boundary + if self._forcedLastSkipAmount is not None: + step = self._forcedLastSkipAmount * -1 + self._forcedLastSkipAmount = None + + # walk back one step + self._atSkipStep -= 1 + else: + # no reversal of any kind was requested and we've not hit any boundary, use the next skip step + if self._forcedLastSkipAmount is None: + self._atSkipStep += 1 + step = self.skipSteps[use_direction][min(self._atSkipStep, stepCount - 1)] + + else: + # we've hit a timeline boundary and haven't reversed yet. Don't do any further skipping + return + + return step + + def skipChapter(self, forward=True, without_osd=False): + lastSelectedOffset = self.selectedOffset + util.DEBUG_LOG('chapter skipping from {0} with forward {1}'.format(lastSelectedOffset, forward)) + if forward: + nextChapters = [c for c in self.chapters if c.startTime() > lastSelectedOffset] + util.DEBUG_LOG('Found {0} chapters among {1}'.format(len(nextChapters), len(self.chapters))) + if len(nextChapters) == 0: + return False + chapter = nextChapters[0] + else: + startTimeLimit = lastSelectedOffset - 2000 + if startTimeLimit < 0: + startTimeLimit = 0 + lastChapters = [c for c in self.chapters if c.startTime() <= startTimeLimit] + util.DEBUG_LOG('Found {0} chapters among {1}'.format(len(lastChapters), len(self.chapters))) + if len(lastChapters) == 0: + return False + chapter = lastChapters[-1] + + if chapter.tag: + util.DEBUG_LOG('Skipping to chapter: {}'.format(chapter.tag)) + self.forceNextTimeAsChapter = chapter.tag + + util.DEBUG_LOG('New start time is {0}'.format(chapter.startTime())) + self.skipByOffset(chapter.startTime() - lastSelectedOffset, without_osd=without_osd) + return True + + def skipForward(self, without_osd=False): + self.skipByStep("positive", without_osd) + + def skipBack(self, without_osd=False): + self.skipByStep("negative", without_osd) + + def skipByStep(self, direction="positive", without_osd=False): + step = self.determineSkipStep(direction) + self.skipByOffset(step, without_osd) + + def skipByOffset(self, offset, without_osd=False): + if self.countingDownMarker: + self.displayMarkers(cancelTimer=True) + + if offset is not None: + if not self.seekByOffset(offset, without_osd=without_osd): + return + + if self.useAutoSeek: + self.delayedSeek() + else: + self.setProperty('button.seek', '1') + + def delayedSeek(self): + self.setProperty('button.seek', '1') + delay = self._autoSeekDelay + + if delay > 0: + self._delayedSeekTimeout = time.time() + delay + + if not self._delayedSeekThread or not self._delayedSeekThread.is_alive(): + self._delayedSeekThread = threading.Thread(target=self._delayedSeek) + self._delayedSeekThread.start() + else: + # Do seek now + self._performSeek() + self.resetSeeking() + + def _delayedSeek(self): + try: + while not util.MONITOR.waitForAbort(0.1): + if not self._delayedSeekTimeout or time.time() > self._delayedSeekTimeout: + break + + if not util.MONITOR.abortRequested() and self._delayedSeekTimeout is not None: + self._performSeek() + except: + util.ERROR() + + def _performSeek(self, offset=None): + self._lastSkipDirection = None + self._forcedLastSkipAmount = None + self.doSeek(offset=offset) + + def handleDialog(self, func): + self.hasDialog = True + + try: + func() + finally: + self.resetTimeout() + self.hasDialog = False + + def videoSettingsHaveChanged(self): + changed = False + if ( + self.player.video.settings.prefOverrides != self.initialVideoSettings or + self.player.video.selectedAudioStream() != self.initialAudioStream + ): + self.initialVideoSettings = dict(self.player.video.settings.prefOverrides) + self.initialAudioStream = self.player.video.selectedAudioStream() + changed = True + + sss = self.player.video.selectedSubtitleStream() + if sss != self.initialSubtitleStream: + self.initialSubtitleStream = sss + if changed or self.isTranscoded: + return True + else: + return 'SUBTITLE' + + return changed + + def repeatButtonClicked(self): + pl = self.handler.playlist + + if pl: + if pl.isRepeatOne: + pl.setRepeat(False, one=False) + self.updateProperties() + elif pl.isRepeat: + pl.setRepeat(False, one=True) + pl.refresh(force=True) + else: + pl.setRepeat(True) + pl.refresh(force=True) + else: + xbmc.executebuiltin('PlayerControl(Repeat)') + + def shuffleButtonClicked(self): + if self.handler.playlist: + self.handler.playlist.setShuffle() + + def optionsButtonClicked(self): # Button currently commented out. + pass + # options = [] + + # options.append({'key': 'kodi_video', 'display': 'Video Options'}) + # options.append({'key': 'kodi_audio', 'display': 'Audio Options'}) + + # choice = dropdown.showDropdown(options, (1360, 1060), close_direction='down', pos_is_bottom=True, close_on_playback_ended=True) + + # if not choice: + # return + + # if choice['key'] == 'kodi_video': + # xbmc.executebuiltin('ActivateWindow(OSDVideoSettings)') + # elif choice['key'] == 'kodi_audio': + # xbmc.executebuiltin('ActivateWindow(OSDAudioSettings)') + + def subtitleButtonClicked(self): + options = [] + + options.append({'key': 'download', 'display': T(32405, 'Download Subtitles')}) + + # select "enable" by default + selectIndex = 1 + if self.lastSubtitleNavAction == "download": + selectIndex = 0 + + if self.player.video.hasSubtitles: + if self.player.video.hasSubtitle: + options.append({'key': 'delay', 'display': T(32406, 'Subtitle Delay')}) + + # select "disable" if we only have one subtitle + selectIndex = 2 + if self.lastSubtitleNavAction == "delay": + selectIndex = 1 + elif self.lastSubtitleNavAction == "download": + selectIndex = 0 + + if len(self.player.video.subtitleStreams) > 1: + options.append({'key': 'prev', 'display': T(32930, 'Previous Subtitle')}) + options.append({'key': 'next', 'display': T(32407, 'Next Subtitle')}) + + # select "next subtitle" if we already have subs active + selectIndex = 3 + + # select "prev subtitle" if we've last cycled backwards + if self.lastSubtitleNavAction == "backward": + selectIndex = 2 + elif self.lastSubtitleNavAction == "delay": + selectIndex = 1 + elif self.lastSubtitleNavAction == "download": + selectIndex = 0 + + options.append( + { + 'key': 'enable', + 'display': + xbmc.getCondVisibility('VideoPlayer.SubtitlesEnabled') and self.player.video.hasSubtitle and + T(32408, 'Disable Subtitles') or T(32409, 'Enable Subtitles') + } + ) + + # cheap and inaccurate approach to move the dropdown to the left based on how many buttons the user has hidden + choice = dropdown.showDropdown(options, (1360 - self.subtitleButtonLeft, 1060), close_direction='down', pos_is_bottom=True, + close_on_playback_ended=True, select_index=selectIndex) + + if not choice: + return + + if choice['key'] == 'download': + self.hideOSD() + if self.handler and self.handler.player and self.handler.player.playerObject \ + and util.getSetting('calculate_oshash', False): + meta = self.handler.player.playerObject.metadata + oss_hash = util.getOpenSubtitlesHash(meta.size, meta.streamUrls[0]) + if oss_hash: + util.DEBUG_LOG("OpenSubtitles hash: %s" % oss_hash) + util.setGlobalProperty("current_oshash", oss_hash, base='videoinfo.{0}') + else: + util.setGlobalProperty("current_oshash", '', base='videoinfo.{0}') + self.lastSubtitleNavAction = "download" + builtin.ActivateWindow('SubtitleSearch') + elif choice['key'] == 'delay': + self.hideOSD() + self.lastSubtitleNavAction = "delay" + builtin.Action('SubtitleDelay') + elif choice['key'] == 'next': + self.cycleSubtitles() + self.lastSubtitleNavAction = "forward" + elif choice['key'] == 'prev': + self.cycleSubtitles(forward=False) + self.lastSubtitleNavAction = "backward" + elif choice['key'] == 'enable': + enabled = self.toggleSubtitles() + self.lastSubtitleNavAction = "forward" + + def toggleSubtitles(self): + """ + Used for subtitle toggling from button press or subtitle toggle menu + """ + if xbmc.getCondVisibility('VideoPlayer.SubtitlesEnabled') and self.player.video.hasSubtitle: + self.disableSubtitles() + return False + else: + self.cycleSubtitles() + return True + + def disableSubtitles(self): + self.player.video.disableSubtitles() + self.setSubtitles() + + def cycleSubtitles(self, forward=True): + """ + Selects the first subtitle or the next one + """ + stream = self.player.video.cycleSubtitles(forward=forward) + self.setSubtitles(honor_forced_subtitles_override=False) + util.showNotification(str(stream), time_ms=1500, header=util.T(32396, "Subtitles")) + + def setSubtitles(self, do_sleep=False, honor_forced_subtitles_override=False): + self.handler.setSubtitles(do_sleep=do_sleep, honor_forced_subtitles_override=honor_forced_subtitles_override) + if self.player.video.current_subtitle_is_embedded: + # this is an embedded stream, seek back a second after setting the subtitle due to long standing kodi + # issue: https://github.com/xbmc/xbmc/issues/21086 + util.DEBUG_LOG("Switching embedded subtitle stream, seeking due to Kodi issue #21086") + + # true offset can be 0, which might lead to an infinite loop, seek to 100ms at least. + self.doSeek(max(self.trueOffset() - 100, 100)) + + def showSettings(self): + with self.propertyContext('settings.visible'): + playersettings.showDialog(self.player.video, via_osd=True, parent=self) + + changed = self.videoSettingsHaveChanged() + + if self.player.playState == self.player.STATE_PLAYING: + self._osdHideFast = True + + if changed == 'SUBTITLE': + self.setSubtitles(do_sleep=False) + self.lastSubtitleNavAction = "forward" + + elif changed: + self.doSeek(self.trueOffset(), settings_changed=True) + + def setBigSeekShift(self): + closest = None + if self.selectedOffset is None: + return + + for mli in self.bigSeekControl: + if mli.dataSource > self.selectedOffset: + break + closest = mli + if not closest: + return + + self.bigSeekOffset = self.selectedOffset - closest.dataSource + pxOffset = int(self.bigSeekOffset / float(self.duration) * 1920) + + if not self.showChapters: + self.bigSeekGroupControl.setPosition(-8 + pxOffset, 917) + self.bigSeekControl.selectItem(closest.pos()) + + self._seeking = True + # xbmc.sleep(100) + + def updateBigSeek(self, changed=False): + if changed and not self.showChapters: + self.bigSeekChanged = True + self.selectedOffset = self.bigSeekControl.getSelectedItem().dataSource + self.bigSeekOffset + self.updateProgress(set_to_current=False) + elif self.showChapters: + # when hovering chapters, show its corresponding time on the timeline, but don't act like we're seeking + self.updateProgress(set_to_current=False, offset=self.bigSeekControl.getSelectedItem().dataSource, + onlyTimeIndicator=True) + self.resetSkipSteps() + + def bigSeekSelected(self): + # this gets called when a click action happened on the bigSeek, defer the actual action to onFocus + # by setFocusId(MAIN) + + self.bigSeekChanged = True + if self.showChapters: + self.resetAutoSeekTimer(None) + self._navigatedViaMarkerOrChapter = True + + sel = self.bigSeekControl.getSelectedItem() + if self.bigSeekControl.isLastItem(sel): + self.selectedOffset = sel.dataSource - FINAL_MARKER_NEGOFF + else: + self.selectedOffset = sel.dataSource + MARKER_OFF + + # the onFocus action might take a couple of ms and might be overridden by onAction, store separately + self.bigSeekChanged = self.selectedOffset + + self.setFocusId(self.MAIN_BUTTON_ID) + + def updateProperties(self, **kwargs): + if not self.started: + return + + if self.fromSeek: + self.setFocusId(self.MAIN_BUTTON_ID) + self.fromSeek = 0 + + self.setProperty('has.bif', self.bifURL and '1' or '') + self.setProperty('video.title', self.title) + self.setProperty('video.title2', self.title2) + self.setProperty('is.show', (self.player.video.type == 'episode') and '1' or '') + self.setProperty('media.show_ends', self.showItemEndsInfo and '1' or '') + self.setProperty('time.ends_label', self.showItemEndsLabel and (util.T(32543, 'Ends at')) or '') + + if self.isDirectPlay: + self.setProperty('time.fmt', self.timeFmtKodi) + self.setProperty('time.fmt.ends', util.timeFormatKN.replace(":ss", "")) + + self.setBoolProperty('direct.play', self.isDirectPlay) + + if not self.getProperty('nav.playlist') and self.getProperty('nav.quick_subtitles'): + # offset the subtitle button + self.getControl(self.SUBTITLE_BUTTON_ID).setPosition(30, 0) + + if not self.getProperty('nav.prevnext'): + if self.getProperty('nav.ffwdrwd'): + self.getControl(self.SKIP_BACK_BUTTON_ID).setPosition(30, 0) + + pq = self.handler.playlist + if pq: + self.setProperty('has.playlist', '1') + self.setProperty('pq.isRemote', pq.isRemote and '1' or '') + self.setProperty('pq.hasnext', pq.hasNext() and '1' or '') + self.setProperty('pq.hasprev', pq.hasPrev() and '1' or '') + self.setProperty('pq.repeat', pq.isRepeat and '1' or '') + self.setProperty('pq.repeat.one', pq.isRepeatOne and '1' or '') + self.setProperty('pq.shuffled', pq.isShuffled and '1' or '') + else: + self.setProperties(('pq.isRemote', 'pq.hasnext', 'pq.hasprev', 'pq.repeat', 'pq.shuffled', 'has.playlist'), + '') + + self.updateCurrent() + + def updateChapters(self): + items = [] + + # replace bigSeek with chapters or markers if possible + if self.showChapters: + chaps = [] + chapOffsets = [] + if self.chapters: + self.setProperty('chapters.label', T(33605, 'Video Chapters').upper()) + for index, chapter in enumerate(self.chapters): + thumb = chapter.thumb and chapter.thumb.asTranscodedImageURL( + *PlaylistDialog.LI_AR16X9_THUMB_DIM) or None + # mli = kodigui.ManagedListItem(data_source=chapter.startTime(), + # thumbnailImage=thumb, + # label=chapter.tag or T(33607, 'Chapter {}').format(index + 1)) + # items.append(mli) + st = chapter.startTime() + chapOffsets.append(st) + chaps.append((st, thumb, chapter.tag or T(33607, 'Chapter {}').format(index + 1))) + + # fake chapters by using markers + if util.getSetting('virtual_chapters', True) and self.markers: + if not self.chapters: + self.setProperty('chapters.label', T(33606, 'Virtual Chapters').upper()) + else: + self.setProperty('chapters.label', T(33634, 'Combined Chapters').upper()) + creditsCounter = 0 + preparedMarkers = [] + for markerDef in self.markers: + marker = markerDef["marker"] + if marker: + if markerDef["marker_type"] == "intro": + preparedMarkers.append((int(marker.startTimeOffset), T(33608, "Intro"), False)) + preparedMarkers.append((int(marker.endTimeOffset), T(33610, "Main"), False)) + + elif markerDef["marker_type"] == "credits": + creditsCounter += 1 + if creditsCounter > 1 and getattr(marker, "final", False): + label = T(33635, "Final Credits") + else: + label = T(33609, "Credits") + "{}" + preparedMarkers.append((int(marker.startTimeOffset), label, True)) + + # add staggered virtual markers + preparedMarkers.append((int(self.duration * 0.25), "25 %", False)) + preparedMarkers.append((int(self.duration * 0.50), "50 %", False)) + preparedMarkers.append((int(self.duration * 0.75), "75 %", False)) + + credCnt = 1 + for offset, label, credits in sorted(preparedMarkers): + # filter intersections + skipMarker = False + for cOffset in chapOffsets: + if offset - MARKER_CHAPTER_OVERLAP_THRES <= cOffset <= offset + MARKER_CHAPTER_OVERLAP_THRES: + skipMarker = True + break + + # skip marker if we're overlapping with any chapter + if skipMarker: + continue + + chaps.append((offset, self.handler.player.playerObject.getBifUrl(offset), + label.format(" #{}".format(credCnt) if credits and creditsCounter > 1 else ""))) + + if credits: + credCnt += 1 + + for offset, thumb, label in sorted(chaps): + mli = kodigui.ManagedListItem(data_source=offset, thumbnailImage=thumb, label=label) + items.append(mli) + + else: + div = int(self.duration / 12) + for x in range(12): + offset = div * x + items.append(kodigui.ManagedListItem(data_source=offset)) + + # we might've been reinizialized by the handler and have had markers/chapters before. reset height and + # positioning of the bigSeekControl + self.bigSeekControl.control.setHeight(16) + self.bigSeekControl.control.setPosition(self.bigSeekControl.getX(), 0) + + self.bigSeekControl.reset() + self.bigSeekControl.addItems(items) + + if self.showChapters: + # adjust height and positioning of bigSeekControl to accomodate chapters + self.bigSeekControl.control.setHeight(160) + self.bigSeekControl.control.setPosition(self.bigSeekControl.getX(), -126) + + def updateCurrent(self, update_position_control=True, atOffset=None): + ratio = self.trueOffset() / float(self.duration) + + if update_position_control: + w = int(ratio * self.SEEK_IMAGE_WIDTH) + self.positionControl.setWidth(w) + + # update cache/buffer bar + if util.advancedSettings.playerShowBuffer and self.isDirectPlay and util.KODI_VERSION_MAJOR > 18: + cache_w = int(xbmc.getInfoLabel("Player.ProgressCache")) * self.SEEK_IMAGE_WIDTH // 100 + self.cacheControl.setWidth(cache_w) + + if self.isTranscoded: + to = atOffset if atOffset is not None else self.trueOffset() + self.setProperty('time.current', util.timeDisplay(to, cutHour=self._videoBelowOneHour)) + self.setProperty('time.left', + util.timeDisplay(self.duration - to, cutHour=self._videoBelowOneHour)) + + _fmt = util.timeFormat.replace(":%S", "") + + val = time.strftime(_fmt, time.localtime(time.time() + ((self.duration - to) / 1000))) + if not util.padHour and val[0] == "0" and val[1] != ":": + val = val[1:] + + self.setProperty('time.end', val) + + def doSeek(self, offset=None, settings_changed=False): + self._applyingSeek = True + self._ignoreInput = settings_changed + offset = self.selectedOffset if offset is None else offset + + if self.countingDownMarker: + self.displayMarkers(cancelTimer=True) + + self.resetSkipSteps() + self.updateProgress(offset=offset) + + try: + self.handler.seek(offset, settings_changed=settings_changed) + finally: + self.resetSeeking() + + def seekByOffset(self, offset, auto_seek=False, without_osd=False): + """ + Sets the selected offset and updates the progress bar to visually represent the current seek + :param offset: offset to seek to + :param auto_seek: whether to automatically seek to :offset: after a certain amount of time + :param without_osd: indicates whether this seek was done with or without OSD + :return: + """ + if self.selectedOffset is None: + self.selectedOffset = self.offset + lastSelectedOffset = self.selectedOffset + # If we are seeking forward and already past 5 seconds from end, don't seek at all + if lastSelectedOffset > self.duration - 5000 and offset > 0: + return False + + self._seeking = True + self._seekingWithoutOSD = without_osd + self.selectedOffset += offset + # Don't skip past 5 seconds from end + if self.selectedOffset > self.duration - 5000: + # offset = +100, at = 80000, duration = 80007, realoffset = 2 + self._forcedLastSkipAmount = self.duration - 5000 - lastSelectedOffset + self.selectedOffset = self.duration - 5000 + # Don't skip back past 1 (0 is handled specially so seeking to 0 will not do a seek) + elif self.selectedOffset < 1: + # offset = -100, at = 5, realat = -95, realoffset = 1 - 5 = -4 + self._forcedLastSkipAmount = 1 - lastSelectedOffset + self.selectedOffset = 1 + + self.updateProgress(set_to_current=False) + self.setBigSeekShift() + if auto_seek: + self.resetAutoSeekTimer() + self.bigSeekHideTimer.reset() + return True + + def seekMouse(self, action, without_osd=False, preview=False): + x = self.mouseXTrans(action.getAmount1()) + y = self.mouseYTrans(action.getAmount2()) + if not (self.BAR_Y <= y <= self.BAR_BOTTOM): + return + + if not (self.BAR_X <= x <= self.BAR_RIGHT): + return + + self._seeking = True + self._seekingWithoutOSD = without_osd + + self.selectedOffset = int((x - self.BAR_X) / float(self.SEEK_IMAGE_WIDTH) * self.duration) + if not preview: + self.doSeek() + if not xbmc.getCondVisibility('Window.IsActive(videoosd) | Player.Rewinding | Player.Forwarding'): + self.hideOSD() + else: + self.updateProgress(set_to_current=False) + self.setProperty('button.seek', '1') + + def getCurrentMarkerDef(self, offset=None): + """ + Show intro/credits skip button at current time + """ + + if not self.markers: + return + + off = offset if offset is not None else self.trueOffset() + + for markerDef in self.markers: + marker = markerDef["marker"] + if marker: + startTimeOffset = int(marker.startTimeOffset) + + # show intro skip early? (only if intro is during the first X minutes) + if self.showIntroSkipEarly and markerDef["marker_type"] == "intro" and \ + startTimeOffset <= util.advancedSettings.skipIntroButtonShowEarlyThreshold1 * 1000: + startTimeOffset = 0 + markerDef["overrideStartOff"] = 0 + + markerEndNegoff = FINAL_MARKER_NEGOFF if getattr(markerDef["marker"], "final", False) else 0 + + if startTimeOffset - MARKER_SHOW_NEGOFF <= off < int(marker.endTimeOffset) - markerEndNegoff: + + return markerDef + + + @property + def duration(self): + try: + return self._duration or int(self.handler.player.getTotalTime() * 1000) + except RuntimeError: # Not playing + return 1 + + def updateProgress(self, set_to_current=True, offset=None, onlyTimeIndicator=False): + """ + Updates the progress bars (seek and position) and the currently-selected-time-label for the current position or + seek state on the timeline. + :param set_to_current: if True, sets both the position bar and the seek bar to the currently selected position, + otherwise we're in seek mode, whereas one of both bars move relatively to the currently + selected position depending on the direction of the seek + :return: None + """ + if not self.initialized: + return + + offset = offset if offset is not None else \ + self.selectedOffset if self.selectedOffset is not None else self.trueOffset() + ratio = offset / float(self.duration) + w = int(ratio * self.SEEK_IMAGE_WIDTH) + + current_w = int(self.offset / float(self.duration) * self.SEEK_IMAGE_WIDTH) + + bifx = (w - int(ratio * 324)) + self.BAR_X + # bifx = w + self.selectionIndicator.setPosition(w, 896) + if w < 51: + self.selectionBox.setPosition(-50 + (50 - w), 0) + elif w > 1869: + self.selectionBox.setPosition(-100 + (1920 - w), 0) + else: + self.selectionBox.setPosition(-50, 0) + + if self.forceNextTimeAsChapter: + self.setProperty('time.selection', self.forceNextTimeAsChapter) + + # fixme: might be superfluous + self.selectionIndicatorImage.setWidth(self.selectionIndicatorText.getWidth()) + self.forceNextTimeAsChapter = False + else: + self.setProperty('time.selection', util.simplifiedTimeDisplay(offset)) + self.selectionIndicatorImage.setWidth(101) + + if onlyTimeIndicator: + return + + if self.hasBif: + self.setProperty('bif.image', self.handler.player.playerObject.getBifUrl(offset)) + self.bifImageControl.setPosition(bifx, 752) + + self.seekbarControl.setPosition(0, self.seekbarControl.getPosition()[1]) + if set_to_current: + self.seekbarControl.setWidth(w) + self.positionControl.setWidth(w) + else: + # we're seeking + if not self.selectedOffset: + return + + # current seek position below current offset? set the position bar's width to the current position of the + # seek and the seek bar to the current position of the video, to visually indicate the backwards-seeking + if self.selectedOffset < self.offset: + self.positionControl.setWidth(current_w) + self.seekbarControl.setWidth(w) + + # current seek position ahead of current offset? set the position bar's width to the current position of the + # video and the seek bar to the current position of the seek, to visually indicate the forwards-seeking + elif self.selectedOffset > self.offset: + self.seekbarControl.setPosition(current_w, self.seekbarControl.getPosition()[1]) + self.seekbarControl.setWidth(w - current_w) + # we may have "shortened" the width before, by seeking negatively, reset the position bar's width to + # the current video's position if that's the case + if self.positionControl.getWidth() < current_w: + self.positionControl.setWidth(current_w) + + else: + self.seekbarControl.setWidth(w) + self.positionControl.setWidth(w) + + def waitForBuffer(self): + # current filesize in bytes + size = float(self.handler.player.video.mediaChoice.part.size) + + # current buffer fill percentage + currentBufferPerc = int(xbmc.getInfoLabel("Player.ProgressCache")) - int(xbmc.getInfoLabel("Player.Progress")) + + # configured buffer size + bufferBytes = util.kcm.memorySize * 1024 * 1024 + + # wait for the full buffer or for 10% of the file at max + # a full buffer is typically 30% of the configured cache value + sensibleBufferPerc = min(bufferBytes / size * 100.0 / 2.8, 10) + + # can wait for buffer? + # we're relying on integer based percentages coming from kodi's internal ProgressCache. + # with a typical device buffer of 20-160 MB, this might be less than 1% of available buffer based on the playing + # media item. If we're below that value, wait for a defined amount of time instead of being smart. + if sensibleBufferPerc >= 1.0: + if currentBufferPerc < sensibleBufferPerc: + # pause + wasPlaying = False + if self.player.playState == self.player.STATE_PLAYING: + util.DEBUG_LOG("SeekDialog.buffer: Waiting for buffer to reach {} (is: {}), pausing" + .format(sensibleBufferPerc, currentBufferPerc)) + self.player.pause() + wasPlaying = True + + waitedFor = 0 + waitMax = util.advancedSettings.bufferWaitMax + waitExceeded = False + self.waitingForBuffer = True + self.showOSD(focusButton=False) + with busy.BusyClosableMsgContext() as bc: + # check for the buffer fill-state every 200ms + # this may be canceled by the usual actions; + # depending on who receives the cancel action, _abortBufferWait might be set by our onAction + # or by the busy window via the context manager + while not self._abortBufferWait and not bc.shouldClose and waitedFor < waitMax and \ + (int(xbmc.getInfoLabel("Player.ProgressCache")) - + int(xbmc.getInfoLabel("Player.Progress"))) < sensibleBufferPerc: + curBuf = int(xbmc.getInfoLabel("Player.ProgressCache")) - \ + int(xbmc.getInfoLabel("Player.Progress")) + + bc.setMessage("Buffer: {} %".format(int(curBuf / sensibleBufferPerc * 100))) + + xbmc.sleep(200) + waitedFor += 0.2 + + # report buffer state every 10 seconds + if int(waitedFor) > 0 and int(waitedFor) % 10 == 0: + util.DEBUG_LOG("SeekDialog.buffer: " + "Buffer filled {}/{}".format(curBuf, sensibleBufferPerc)) + + # buffer wait canceled via busy window + if bc.shouldClose: + self._abortBufferWait = True + + # buffer timed out + if waitedFor >= waitMax: + waitExceeded = True + + self.waitingForBuffer = False + + if waitExceeded or self._abortBufferWait: + if not self._abortBufferWait: + util.showNotification(util.T(32917, "Couldn't fill buffer in time ({}s)").format(waitMax), + header="Buffer") + self.stop() + return True + + if self.player.playState == self.player.STATE_PAUSED and wasPlaying: + # resume + util.DEBUG_LOG("SeekDialog.buffer: Buffer filled, resuming") + self.player.pause() + return True + else: + util.DEBUG_LOG("SeekDialog.buffer: Buffer already filled, not waiting for buffer") + + else: + wait = util.advancedSettings.bufferInsufficientWait + util.DEBUG_LOG("SeekDialog.buffer: Buffer is too small for us to see, waiting {} seconds".format(wait)) + self.waitingForBuffer = True + + wasPlaying = False + if self.player.playState == self.player.STATE_PLAYING: + self.player.pause() + wasPlaying = True + + with busy.BusyClosableMsgContext() as bc: + bc.setMessage("Buffering") + util.MONITOR.waitForAbort(wait) + self.waitingForBuffer = False + if self.player.playState == self.player.STATE_PAUSED and wasPlaying: + self.player.pause() + return True + + def onPlayBackResumed(self): + util.DEBUG_LOG("SeekDialog: OnPlaybackResumed") + if self._ignoreInput: + self._ignoreInput = False + + self.idleTime = None + self.ldTimer and self.syncTimeKeeper() + + def onAVChange(self): + util.DEBUG_LOG("SeekDialog: OnAVChange: DPO: {0}, offset: {1}".format(self.DPPlayerOffset, self.offset)) + + # wait for buffer if we're not expecting a seek + if not self.handler.seekOnStart and util.getSetting("slow_connection", False) and not self.waitingForBuffer: + # fixme: not sure why this is necessary, but something breaks when playing back a next item from playback + # that doesn't have a seek value. Adding a slight delay here fixes that. Timing issue? + xbmc.sleep(100) + self.tick(waitForBuffer=True) + return + + def onAVStarted(self): + util.DEBUG_LOG("SeekDialog: OnAVStarted: DPO: {0}, offset: {1}".format(self.DPPlayerOffset, self.offset)) + if self._ignoreInput: + self._ignoreInput = False + + self.ldTimer and self.syncTimeKeeper() + + def onPlayBackStarted(self): + util.DEBUG_LOG("SeekDialog: OnPlaybackStarted") + if self._ignoreInput: + self._ignoreInput = False + + self.ldTimer and self.syncTimeKeeper() + + def onPlayBackPaused(self): + util.DEBUG_LOG("SeekDialog: OnPlaybackPaused") + self.idleTime = time.time() + + def onPlayBackSeek(self, stime, offset): + util.DEBUG_LOG("SeekDialog: OnPlaybackSeek: {0}, {1}".format(stime, offset)) + self.idleTime = None + self.ldTimer and self.syncTimeKeeper() + + def onPlayBackStopped(self): + util.DEBUG_LOG("SeekDialog: OnPlayBackStopped") + self.killTimeKeeper() + + def onPlayBackEnded(self): + util.DEBUG_LOG("SeekDialog: OnPlayBackEnded") + self.killTimeKeeper() + + def onPlayBackFailed(self): + util.DEBUG_LOG("SeekDialog: OnPlayBackFailed") + self.killTimeKeeper() + + def syncTimeKeeper(self): + if not not self.handler.player.playerObject: + return + + self.timeKeeperTime = self.trueOffset()#int(self.handler.player.getTime() * 1000) + if not self.timeKeeper: + self.timeKeeper = plexapp.util.RepeatingCounterTimer(1.0, self.onTimeKeeperCallback) + self.onTimeKeeperCallback(tick=False) + self.timeKeeper.reset() + + def killTimeKeeper(self): + if self.timeKeeper: + try: + self.timeKeeper.cancel() + self.timeKeeper.join() + self.timeKeeper = None + except: + util.ERROR("Couldn't stop timeKeeper") + + def onTimeKeeperCallback(self, tick=True): + """ + called by playbackTimer periodically, sets playback time/ends in UI + """ + # we might be a little early on slower systems + if not self.started or not self.handler.player.playerObject: + return + + if self.stopPlaybackOnIdle: + if self.idleTime and time.time() - self.idleTime >= self.stopPlaybackOnIdle: + util.LOG("Player has been idle for {}s, stopping.".format(int(time.time() - self.idleTime))) + self.handler.player.stopAndWait() + return + + if not self.idleTime and xbmc.getCondVisibility('Player.Paused'): + self.idleTime = time.time() + + if tick and xbmc.getCondVisibility('Player.HasVideo + Player.Playing'): + self.timeKeeperTime += 1000 + + # Update buffer state in PPI if open and old Kodi version + if util.KODI_BUILD_NUMBER < 2090821 and self.getProperty('show.PPI'): + try: + cache = int(xbmc.getInfoLabel('Player.ProgressCache')) - int(xbmc.getInfoLabel('Player.Progress')) + self.setProperty('ppi.Buffered', str(cache)) + except: + pass + + # Only updateCurrent when not in DirectPlay mode. Otherwise the Kodi time functions will be used by the skin. + if self.isDirectPlay: + return + + self.updateCurrent( + update_position_control=not self._seeking and not self._applyingSeek, atOffset=self.timeKeeperTime) + + @property + def countingDownMarker(self): + return self._currentMarker and \ + self._currentMarker["countdown"] is not None and \ + self._currentMarker["countdown"] > 0 + + def displayMarkers(self, cancelTimer=False, immediate=False, onlyReturnIntroMD=False, setSkipped=False, + offset=None): + # intro/credits marker display logic + markerDef = self.getCurrentMarkerDef(offset=offset) + + if not markerDef: + # no marker to display, hide it + self.setProperty('show.markerSkip', '') + self.setProperty('show.markerSkip_OSDOnly', '') + + # this might be counter intuitive, but self._currentMarker is a reference to a dict + if self._currentMarker: + self._currentMarker["countdown"] = None + self._currentMarker = None + return False + + # getCurrentMarkerDef might have overridden the startTimeOffset, use that + startTimeOff = markerDef["overrideStartOff"] if markerDef["overrideStartOff"] is not None else \ + int(markerDef["marker"].startTimeOffset) + + markerAutoSkip = getattr(self, markerDef["markerAutoSkip"]) + markerAutoSkipped = markerDef["markerAutoSkipped"] + + sTOffWThres = startTimeOff + util.advancedSettings.autoSkipOffset * 1000 + + # we just want to return an early marker if we want to autoSkip it, so we can tell the handler to seekOnStart + if onlyReturnIntroMD and markerDef["marker_type"] == "intro" and markerAutoSkip: + if startTimeOff == 0 and not markerDef["markerAutoSkipped"]: + if setSkipped: + markerDef["markerAutoSkipped"] = True + return int(markerDef["marker"].endTimeOffset) + 1000 + return False + + if cancelTimer and self.countingDownMarker: + self._currentMarker["countdown"] = None + markerDef["markerAutoSkipped"] = True + setattr(self, markerDef["markerAutoSkipShownTimer"], None) + self.setProperty('show.markerSkip', '') + return False + + autoSkippingNow = markerDef \ + and markerAutoSkip \ + and not markerAutoSkipped \ + and not self._navigatedViaMarkerOrChapter \ + and (markerDef["countdown"] == 0 or startTimeOff == 0 or immediate) + # and (startTimeOff == 0 or sTOffWThres <= self.offset) \ + + # auto skip marker + # delay marker autoskip by autoSkipOffset to avoid cutting off content at the expense of being + # slightly too late + if autoSkippingNow: + markerDef["markerAutoSkipped"] = True + setattr(self, markerDef["markerAutoSkipShownTimer"], None) + self.setProperty('show.markerSkip', '') + self.setProperty('show.markerSkip_OSDOnly', '') + self.resetAutoSeekTimer(None) + final = getattr(markerDef["marker"], "final", False) + markerDef["countdown"] = None + + if final: + # final marker is _not_ at the end of video, seek and do nothing + if int(markerDef["marker"].endTimeOffset) < self.duration - FINAL_MARKER_NEGOFF: + target = int(markerDef["marker"].endTimeOffset) + util.DEBUG_LOG( + "MarkerAutoSkip: Skipping final marker, its endTime is too early, " + "though, seeking and playing back") + self.doSeek(target) + return False + + # tell plex we've arrived at the end of the video, playing back + self.handler.updateNowPlaying(True, state=self.player.STATE_STOPPED, time=self.duration - 1000) + + # go to next video immediately if on bingeMode + if self.handler.playlist and self.handler.playlist.hasNext() and self.bingeMode: + if not self.handler.queuingNext: + # skip final marker + util.DEBUG_LOG("MarkerAutoSkip: Skipping final marker, going to next video") + self.handler.ignoreTimelines = True + self.handler.queuingNext = True + self._ignoreTick = True + self._ignoreInput = True + self.killTimeKeeper() + self.player.stop() + return True + else: + util.DEBUG_LOG("MarkerAutoSkip: Skipping final marker, stopping") + self.stop() + return False + + util.DEBUG_LOG('MarkerAutoSkip: Skipping marker {}'.format(markerDef["marker"])) + self.doSeek(int(markerDef["marker"].endTimeOffset) + 1000) + return True + + # got a marker, display logic + # hide marker into OSD after a timeout + timer = getattr(self, markerDef["markerAutoSkipShownTimer"]) + + if timer is None or self.player.playState == self.player.STATE_PAUSED: + setattr(self, markerDef["markerAutoSkipShownTimer"], time.time()) + + else: + if timer + getattr(self, markerDef["markerSkipBtnTimeout"]) <= time.time(): + self.setProperty('show.markerSkip_OSDOnly', '1') + else: + self.setProperty('show.markerSkip_OSDOnly', '') + + # no marker auto skip or not yet auto skipped, normal display + if not markerAutoSkip or (markerAutoSkip and not markerAutoSkipped): + self.setProperty('show.markerSkip', '1') + # marker auto skip and already skipped - hide in OSD + elif markerAutoSkip and markerAutoSkipped: + self.setProperty('show.markerSkip_OSDOnly', '1') + + # set marker name, count down + if markerAutoSkip and not markerAutoSkipped: + if markerDef["countdown"] is None: + # reset countdown on new marker + if not self._currentMarker or self._currentMarker != markerDef or markerDef["countdown"] is None: + # fixme: round might not be right here, but who cares + markerDef["countdown"] = int(max(round((sTOffWThres - self.trueOffset()) / 1000.0) + 1, 1)) + + if self.player.playState == self.player.STATE_PLAYING and not self.osdVisible(): + markerDef["countdown"] -= 1 + + self.setProperty('marker.countdown', '1') + + if markerDef["countdown"] > 0: + markerName = "{} ({})".format(markerDef["autoSkipName"], markerDef["countdown"]) + else: + markerName = markerDef["autoSkipName"] + else: + markerName = markerDef["name"] + self.setProperty('skipMarkerName', markerName) + + # store current marker + self._currentMarker = markerDef + + # focus marker if OSD is hidden, last focus wasn't the marker button and we're not auto skipping this marker + if not self.osdVisible() and self.lastFocusID != self.SKIP_MARKER_BUTTON_ID and \ + not self.getProperty('show.markerSkip_OSDOnly') and self.getProperty('show.markerSkip') \ + and not markerAutoSkip: + self.setFocusId(self.SKIP_MARKER_BUTTON_ID) + + def tick(self, offset=None, waitForBuffer=False): + """ + Called ~1/s; can be wildly inaccurate. + """ + if waitForBuffer: + cont = self.waitForBuffer() + if not cont: + return + + if not self.initialized or self._ignoreTick: + return + + # invisibly sync low-drift timer to current playback every X seconds, as Player.getTime() can be wildly off + if self.ldTimer and not self.osdVisible() and self.timeKeeper and self.timeKeeper.ticks >= 60: + self.syncTimeKeeper() + + cancelTick = False + # don't auto skip while we're initializing and waiting for the handler to seek on start + if offset is None and not self.handler.seekOnStart: + cancelTick = self.displayMarkers() + + if cancelTick: + return + + if xbmc.getCondVisibility('Window.IsActive(busydialog) + !Player.Caching'): + util.DEBUG_LOG('SeekDialog: Possible stuck busy dialog - closing') + xbmc.executebuiltin('Dialog.Close(busydialog,1)') + + if not self.hasDialog and not self.playlistDialogVisible and self.osdVisible(): + if time.time() > self.timeout and not self._osdHideFast: + if not xbmc.getCondVisibility('Window.IsActive(videoosd) | Player.Rewinding | Player.Forwarding'): + self.hideOSD() + + # try insta-hiding the OSDs when playback was requested + elif self._osdHideFast: + xbmc.executebuiltin('Dialog.Close(videoosd,true)') + xbmc.executebuiltin('Dialog.Close(seekbar,true)') + if not xbmc.getCondVisibility('Window.IsActive(videoosd) | Player.Rewinding | Player.Forwarding'): + self.hideOSD() + + self._osdHideFast = False + + try: + self.offset = offset or int(self.handler.player.getTime() * 1000) + except RuntimeError: # Playback has stopped + self.resetSeeking() + return + + if offset or (self.autoSeekTimeout and time.time() >= self.autoSeekTimeout and + self.offset != self.selectedOffset): + self.resetAutoSeekTimer(None) + #off = offset is not None and offset or None + #self.doSeek(off) + self.doSeek() + return True + + if self.isDirectPlay or not self.ldTimer: + self.updateCurrent(update_position_control=not self._seeking and not self._applyingSeek) + + @property + def playlistDialogVisible(self): + return self._playlistDialogVisible + + @playlistDialogVisible.setter + def playlistDialogVisible(self, value): + self._playlistDialogVisible = value + self.setProperty('playlist.visible', '1' if value else '') + + def showPlaylistDialog(self): + if not self.playlistDialog: + self.playlistDialog = PlaylistDialog.create(show=False, handler=self.handler) + + self.playlistDialogVisible = True + self.playlistDialog.doModal() + self.resetTimeout() + self.playlistDialogVisible = False + + def osdVisible(self): + return xbmc.getCondVisibility('Control.IsVisible(801)') + + def showOSD(self, focusButton=True): + self.setProperty('show.OSD', '1') + xbmc.executebuiltin('Dialog.Close(videoosd,true)') + if xbmc.getCondVisibility('Player.showinfo'): + xbmc.executebuiltin('Action(Info)') + + if focusButton: + self.setFocusId(self.PLAY_PAUSE_BUTTON_ID) + + def hideOSD(self, skipMarkerFocus=False, closing=False): + self.setProperty('show.OSD', '') + if closing: + return + + self.setFocusId(self.NO_OSD_BUTTON_ID) + if not skipMarkerFocus and self.getCurrentMarkerDef() and not self.getProperty('show.markerSkip_OSDOnly'): + self.setFocusId(self.SKIP_MARKER_BUTTON_ID) + + self.resetSeeking() + self._osdHideAnimationTimeout = time.time() + self.OSD_HIDE_ANIMATION_DURATION + + self._osdHideFast = False + if self.playlistDialog: + self.playlistDialog.doClose() + self.playlistDialogVisible = False + + +class PlaylistDialog(kodigui.BaseDialog): + xmlFile = 'script-plex-video_current_playlist.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + LI_AR16X9_THUMB_DIM = (178, 100) + LI_SQUARE_THUMB_DIM = (100, 100) + + PLAYLIST_LIST_ID = 101 + + def __init__(self, *args, **kwargs): + kodigui.BaseDialog.__init__(self, *args, **kwargs) + self.handler = kwargs.get('handler') + self.playlist = self.handler.playlist + + def onFirstInit(self): + self.handler.player.on('playlist.changed', self.playQueueCallback) + self.handler.player.on('session.ended', self.sessionEnded) + self.playlistListControl = kodigui.ManagedControlList(self, self.PLAYLIST_LIST_ID, 6) + self.fillPlaylist() + self.updatePlayingItem() + self.setFocusId(self.PLAYLIST_LIST_ID) + + def onClick(self, controlID): + if controlID == self.PLAYLIST_LIST_ID: + self.playlistListClicked() + + def playlistListClicked(self): + mli = self.playlistListControl.getSelectedItem() + if not mli: + return + self.handler.playAt(mli.pos()) + self.updatePlayingItem() + + def sessionEnded(self, **kwargs): + util.DEBUG_LOG('Video OSD: Session ended - closing') + self.doClose() + + def createListItem(self, pi): + if pi.type == 'episode': + return self.createEpisodeListItem(pi) + elif pi.type in ('movie', 'clip'): + return self.createMovieListItem(pi) + + def createEpisodeListItem(self, episode): + label2 = u'{0} \u2022 {1}'.format( + episode.grandparentTitle, + u'{0}{1} \u2022 {2}{3}'.format(T(32310, 'S'), episode.parentIndex, T(32311, 'E'), episode.index) + ) + mli = kodigui.ManagedListItem(episode.title, label2, + thumbnailImage=episode.thumb.asTranscodedImageURL(*self.LI_AR16X9_THUMB_DIM), + data_source=episode) + mli.setProperty('track.duration', util.durationToShortText(episode.duration.asInt())) + mli.setProperty('video', '1') + mli.setProperty('watched', episode.isWatched and '1' or '') + return mli + + def createMovieListItem(self, movie): + mli = kodigui.ManagedListItem(movie.title, movie.year, + thumbnailImage=movie.art.asTranscodedImageURL(*self.LI_AR16X9_THUMB_DIM), + data_source=movie) + mli.setProperty('track.duration', util.durationToShortText(movie.duration.asInt())) + mli.setProperty('video', '1') + mli.setProperty('watched', movie.isWatched and '1' or '') + return mli + + def playQueueCallback(self, **kwargs): + mli = self.playlistListControl.getSelectedItem() + pi = mli.dataSource + plexID = pi['comment'].split(':', 1)[0] + viewPos = self.playlistListControl.getViewPosition() + + self.fillPlaylist() + + for ni in self.playlistListControl: + if ni.dataSource['comment'].split(':', 1)[0] == plexID: + self.playlistListControl.selectItem(ni.pos()) + break + + xbmc.sleep(100) + + newViewPos = self.playlistListControl.getViewPosition() + if viewPos != newViewPos: + diff = newViewPos - viewPos + self.playlistListControl.shiftView(diff, True) + + def updatePlayingItem(self): + playing = self.handler.player.video.ratingKey + selectIndex = None + for (index, mli) in enumerate(self.playlistListControl): + isMLI = mli.dataSource.ratingKey == playing + mli.setProperty('playing', isMLI and '1' or '') + if isMLI: + selectIndex = index + + if selectIndex is not None: + xbmc.executebuiltin('Control.SetFocus({0}, {1})'.format(self.PLAYLIST_LIST_ID, selectIndex)) + + def fillPlaylist(self): + items = [] + idx = 1 + for pi in self.playlist.items(): + mli = self.createListItem(pi) + if mli: + mli.setProperty('track.number', str(idx)) + items.append(mli) + idx += 1 + + self.playlistListControl.reset() + self.playlistListControl.addItems(items) diff --git a/script.plexmod/lib/windows/settings.py b/script.plexmod/lib/windows/settings.py new file mode 100644 index 000000000..66e1c220e --- /dev/null +++ b/script.plexmod/lib/windows/settings.py @@ -0,0 +1,836 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +from kodi_six import xbmcvfs +from . import kodigui +from . import windowutils + +from lib import util +from lib.util import T + +import plexnet +import sys + + +class Setting(object): + type = None + ID = None + label = None + desc = None + default = None + userAware = False + + def translate(self, val): + return str(val) + + def get(self): + return util.getSetting(self.ID, self.default) + + def set(self, val): + old = self.get() + setRet = util.setSetting(self.ID, val) + if old != val: + util.DEBUG_LOG('Setting: {0} - changed from [{1}] to [{2}]'.format(self.ID, old, val)) + plexnet.util.APP.trigger('change:{0}'.format(self.ID), value=val) + return setRet + + def valueLabel(self): + return self.translate(self.get()) + + def __repr__(self): + return ''.format(self.ID, self.get()) + + +class BasicSetting(Setting): + def __init__(self, ID, label, default, desc=''): + self.ID = ID + self.label = label + self.default = default + self.desc = desc + + def description(self, desc): + self.desc = desc + return self + + +class ListSetting(BasicSetting): + type = 'LIST' + options = () + + def translate(self, val): + return self.options[len(self.options) - 1 - val] + + def optionLabels(self): + return self.options + + def optionIndex(self): + return len(self.options) - 1 - self.get() + + def set(self, val): + BasicSetting.set(self, len(self.options) - 1 - val) + + +class QualitySetting(ListSetting): + options = ( + T(32001), + T(32002), + T(32003), + T(32004), + T(32005), + T(32006), + T(32007), + T(32008), + T(32009), + T(32010), + T(32011), + T(32012), + T(32013), + T(32014), + ) + + +class ThemeMusicSetting(ListSetting): + options = [ + T(32481), + ] + [T(32482) % {"percentage": 10+i} for i in range(0, 100, 10)] + + +class PlayedThresholdSetting(ListSetting): + options = ['{} %'.format(perc) for perc in range(70, 100, 5)] + + +class BoolSetting(BasicSetting): + type = 'BOOL' + + +class BoolUserSetting(BoolSetting): + """ + A user-aware BoolSetting + """ + userAware = True + + @property + def userAwareID(self): + return '{}.{}'.format(self.ID, plexnet.plexapp.ACCOUNT.ID) + + def get(self): + return util.getSetting(self.userAwareID, self.default) + + def set(self, val): + old = self.get() + if old != val: + util.DEBUG_LOG('Setting: {0} - changed from [{1}] to [{2}]'.format(self.userAwareID, old, val)) + plexnet.util.APP.trigger('change:{0}'.format(self.ID), key=self.userAwareID, value=val, skey=self.ID) + return util.setSetting(self.userAwareID, val) + + +class OptionsSetting(BasicSetting): + type = 'OPTIONS' + + def __init__(self, ID, label, default, options): + BasicSetting.__init__(self, ID, label, default) + self.options = options + + def translate(self, val): + for ID, label in self.options: + if ID == val: + return label + + def optionLabels(self): + return [o[1] for o in self.options] + + def optionIndex(self): + val = self.get() + for i, o in enumerate(self.options): + if val == o[0]: + return i + + return 0 + + +class BufferSetting(OptionsSetting): + def get(self): + return util.kcm.memorySize + + def set(self, val): + old = self.get() + if old != val: + util.DEBUG_LOG('Setting: {0} - changed from [{1}] to [{2}]'.format(self.ID, old, val)) + plexnet.util.APP.trigger('change:{0}'.format(self.ID), value=val) + + util.kcm.write(memorySize=val) + + +class ReadFactorSetting(OptionsSetting): + def get(self): + return util.kcm.readFactor + + def set(self, val): + old = self.get() + if old != val: + util.DEBUG_LOG('Setting: {0} - changed from [{1}] to [{2}]'.format(self.ID, old, val)) + plexnet.util.APP.trigger('change:{0}'.format(self.ID), value=val) + + util.kcm.write(readFactor=val) + + +class InfoSetting(BasicSetting): + type = 'INFO' + + def __init__(self, ID, label, info): + BasicSetting.__init__(self, ID, label, None) + self.info = info + + def valueLabel(self): + return self.info + + +class PlatformSetting(InfoSetting): + def __init__(self): + InfoSetting.__init__(self, None, None, None) + self.ID = 'platfom_version' + self.label = T(32410, 'Platform Version') + + def valueLabel(self): + plat = None + try: + if sys.version_info[0] >= 3: + from lib import distro + dist = distro.linux_distribution() + if dist and len(dist) > 1: + plat = u'{0} {1}'.format(dist[0], dist[1]) + else: + import platform + dist = platform. dist() + if dist and len(dist) > 1: + plat = u'{0} {1}'.format(dist[0], dist[1]) + else: + plat = platform.platform() + plat = u'{0} {1}'.format(plat[0], '.'.join(plat[1].split('.', 2)[:2])) + except: + util.ERROR() + + plat = plat.strip() + + if not plat: + if xbmc.getCondVisibility('System.Platform.Android'): + plat = 'Android' + elif xbmc.getCondVisibility('System.Platform.OSX'): + plat = 'OSX' + elif xbmc.getCondVisibility('System.Platform.Darwin'): + plat = 'Darwin' + elif xbmc.getCondVisibility('System.Platform.Linux.RaspberryPi'): + plat = 'Linux (RPi)' + elif xbmc.getCondVisibility('System.Platform.Linux'): + plat = 'Linux' + elif xbmc.getCondVisibility('System.Platform.Windows'): + plat = 'Windows' + + return plat or T(32411, 'Unknown') + + +class ServerVersionSetting(InfoSetting): + def valueLabel(self): + if not plexnet.plexapp.SERVERMANAGER.selectedServer: + return '' + + return plexnet.plexapp.SERVERMANAGER.selectedServer.rawVersion or '' + + +class IPSetting(BasicSetting): + type = 'IP' + + +class IntegerSetting(BasicSetting): + type = 'INTEGER' + + +class Settings(object): + SETTINGS = { + 'main': ( + T(32000, 'Main'), ( + BoolSetting( + 'auto_signin', T(32038, 'Automatically Sign In'), False + ).description( + T(32100, 'Skip user selection and pin entry on startup.') + ), + BoolSetting( + 'speedy_home_hubs2', T(33503, 'Use alternative hubs refresh'), False + ).description( + T( + 33504, + "Refreshes all hubs for all libraries after an item's watch-state has changed, instead of " + "only those likely affected. Use this if you find a hub that doesn't update properly." + ) + ), + BoolSetting( + 'search_use_kodi_kbd', T(32955, 'Use Kodi keyboard for searching'), False + ), + ThemeMusicSetting('theme_music', T(32480, 'Theme music'), 5), + PlayedThresholdSetting('played_threshold', T(33501, 'Video played threshold'), 1).description( + T( + 33502, + "Set this to the same value as your Plex server (Settings>Library>Video played threshold) to av" + "oid certain pitfalls, Default: 90 %" + ) + ) + ) + ), + 'video': ( + T(32053, 'Video'), ( + QualitySetting('local_quality', T(32020, 'Local Quality'), 13), + QualitySetting('remote_quality', T(32021, 'Remote Quality'), 13), + QualitySetting('online_quality', T(32022, 'Online Quality'), 13), + BoolSetting('playback_directplay', T(32025, 'Allow Direct Play'), True), + BoolSetting('playback_remux', T(32026, 'Allow Direct Stream'), True), + BoolSetting('allow_4k', T(32036, 'Allow 4K'), True).description( + T(32102, 'Enable this if your hardware can handle 4K playback. Disable it to force transcoding.') + ), + BoolSetting('allow_hevc', T(32037, 'Allow HEVC (h265)'), True).description( + T(32103, 'Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding.') + ) + ) + ), + 'audio': ( + T(32931, 'Audio/Subtitles'), ( + BoolSetting('audio_clamp_to_orig', T(32058, 'Never exceed original audio codec'), True).description( + T(32059, 'When transcoding audio, never exceed the original audio bitrate or channel ' + 'count on the same codec.') + ), + BoolSetting('audio_channels_kodi', T(32060, 'Use Kodi audio channels'), + False).description( + T(32061, 'When transcoding audio, target the audio channels set in Kodi.') + ), + OptionsSetting( + 'audio_force_ac3_cond', + T(32062, 'Transcode audio to AC3'), + 'never', + ( + ('never', T(32033, 'Never')), + ('always', T(32028, 'Always')), + ('2', '2.1+'), + ('5', '5.1+'), + ) + ).description( + T(32063, 'Transcode audio to AC3 in certain conditions (useful for passthrough).') + ), + BoolSetting('audio_ac3dts', T(32064, 'Treat DTS like AC3'), + True).description( + T(32065, 'When force AC3 settings are enabled, treat DTS the same as AC3 ' + '(useful for Optical passthrough)') + ), + OptionsSetting( + 'burn_subtitles', + T(32031, 'Burn-in Subtitles'), + 'auto', + (('auto', T(32030, 'Auto')), ('image', T(32029, 'Only Image Formats')), + ('always', T(32028, 'Always'))) + ), + BoolSetting('burn_ssa', T(32944, 'Burn-in SSA subtitles'), + True).description( + T(32945, 'When Direct Streaming instruct the Plex Server to burn in SSA/ASS subtitles (thus ' + 'transcoding the video stream). If disabled it will not touch the video stream, but ' + 'will convert the subtitle to unstyled text.') + ), + BoolSetting('forced_subtitles_override', T(32941, 'Forced subtitles fix'), + False).description( + T(32493, 'When a media file has a forced/foreign subtitle for a subtitle-enabled language, the Plex' + ' Media Server preselects it. This behaviour is usually not necessary and not configurable' + '. This setting fixes that by ignoring the PMSs decision and selecting the same language ' + 'without a forced flag if possible.') + ), + BoolSetting('calculate_oshash', T(32958, 'Calculate OpenSubtitles.com hash'), + False).description( + T(32959, '') + ), + ) + ), + 'player': ( + T(32940, 'Player UI'), ( + BoolSetting('subtitle_downloads', T(32932, 'Show subtitle quick-actions button'), False).description( + T(32939, 'Only applies to video player UI')), + BoolSetting('video_show_ffwdrwd', T(32933, 'Show FFWD/RWD buttons'), False).description( + T(32939, 'Only applies to video player UI')), + BoolSetting('video_show_repeat', T(32934, 'Show repeat button'), False).description( + T(32939, 'Only applies to video player UI')), + BoolSetting('video_show_shuffle', T(32935, 'Show shuffle button'), False).description( + T(32939, 'Only applies to video player UI')), + OptionsSetting( + 'video_show_playlist', T(32936, 'Show playlist button'), 'eponly', + ( + ('always', T(32035, 'Always')), ('eponly', T(32938, 'Only for Episodes')), + ('never', T(32033, 'Never')) + ) + ).description(T(32939, 'Only applies to video player UI')), + OptionsSetting( + 'video_show_prevnext', T(32937, 'Show prev/next button'), 'eponly', + ( + ('always', T(32035, 'Always')), ('eponly', T(32938, 'Only for Episodes')), + ('never', T(32033, 'Never')) + ) + ).description(T(32939, 'Only applies to video player UI')), + ) + ), + 'player_user': ( + T(32631, 'Playback (user-specific)'), ( + BoolUserSetting( + 'post_play_auto', T(32039, 'Post Play Auto Play'), True + ).description( + T( + 32101, + "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatical" + "ly be played after a 15 second delay." + ) + ), + BoolUserSetting( + 'binge_mode', T(33618, 'TV binge-viewing mode'), False + ).description( + T(33619, 'Automatically skips episode intros, credits and tries to skip episode recaps. Doesn\'t ' + 'skip the intro of the first episode of a season.\n\nCan be disabled/enabled per TV show.') + ), + BoolUserSetting( + 'auto_skip_intro', T(32522, 'Automatically Skip Intro'), False + ).description( + T(32523, 'Automatically skip intros if available. Doesn\'t override enabled binge mode.') + ), + BoolUserSetting( + 'auto_skip_credits', T(32526, 'Auto Skip Credits'), False + ).description( + T(32527, 'Automatically skip credits if available. Doesn\'t override enabled binge mode.') + ), + BoolUserSetting( + 'show_intro_skip_early', T(33505, 'Show intro skip button early'), False + ).description( + T(33506, 'Show the intro skip button from the start of a video with an intro marker. The auto-skipp' + 'ing setting applies. Doesn\'t override enabled binge mode.') + ), + BoolUserSetting( + 'auto_skip_in_transcode', T(32948, 'Allow auto-skip when transcoding'), True + ).description( + T(32949, 'When transcoding/DirectStreaming, allow auto-skip functionality.') + ), + BoolUserSetting( + 'show_chapters', T(33601, 'Show video chapters'), True + ).description( + T(33602, 'If available, show video chapters from the video-file instead of the ' + 'timeline-big-seek-steps.') + ), + BoolUserSetting( + 'virtual_chapters', T(33603, 'Use virtual chapters'), True + ).description( + T(33604, 'When the above is enabled and no video chapters are available, simulate them by using the' + ' markers identified by the Plex Server (Intro, Credits).') + ), + ) + ), + 'network': ( + T(33624, 'Network'), ( + OptionsSetting( + 'allow_insecure', T(32032), 'never', + (('never', T(32033)), ('same_network', T(32034)), ('always', T(32035))) + ).description( + T(32104, 'When to connect to servers with no secure connections...') + ), + BoolSetting('smart_discover_local', T(33625, 'Smart LAN/local server discovery'), True) + .description( + T(33626, "Checks whether servers returned from Plex.tv are actually local/in your LAN. " + "For specific setups (e.g. Docker) Plex.tv might not properly detect a local " + "server.\n\nNOTE: Only works on Kodi 19 or above." + ) + ), + BoolSetting('prefer_local', T(33627, 'Prefer LAN/local servers over security'), False) + .description( + T(33628, "Prioritizes local connections over secure ones. Needs the proper setting in \"Allow " + "Insecure Connections\" and the Plex Server's \"Secure connections\" at \"Preferred\". " + "Can be used to enforce manual servers." + ) + ), + BoolSetting('gdm_discovery', T(32042, 'Server Discovery (GDM)'), False), + IPSetting('manual_ip_0', T(32044, 'Connection 1 IP'), ''), + IntegerSetting('manual_port_0', T(32045, 'Connection 1 Port'), 32400), + IPSetting('manual_ip_1', T(32046, 'Connection 2 IP'), ''), + IntegerSetting('manual_port_1', T(32047, 'Connection 2 Port'), 32400), + ) + ), + 'system': ( + T(33600, 'System'), ( + + BoolSetting('kiosk.mode', T(32043, 'Start Plex On Kodi Startup'), False), + BufferSetting('cache_size', + T(33613, 'Kodi Buffer Size (MB)'), + 20, + [(mem, '{} MB'.format(mem)) for mem in util.kcm.viableOptions]) + .description( + '{}{}'.format(T(33614, 'stub1').format( + util.kcm.free, util.kcm.recMax), + '' if util.kcm.useModernAPI else ' '+T(32954, 'stub2')) + ), + ReadFactorSetting('readfactor', + T(32922, 'Kodi Cache Readfactor'), + 4, + [(rf, str(rf)) for rf in util.kcm.readFactorOpts]) + .description( + T(32923, 'Sets the Kodi cache readfactor value. Default: {0}, recommended: {1}.' + 'With "Slow connection" enabled this will be set to {2}, as otherwise the cache doesn\'t' + 'fill fast/aggressively enough.').format(util.kcm.defRF, + "{}-{}".format(*util.kcm.recRFRange), + util.kcm.defRFSM) + ), + BoolSetting( + 'slow_connection', T(32915, 'Slow connection'), False + ).description("Use with a wonky/slow connection, e.g. in a hotel room. Adjusts the UI to visually " + "wait for item refreshes and waits for the buffer to fill when starting playback."), + OptionsSetting( + 'action_on_sleep', + T(32700, 'Action on Sleep event'), + 'none', + (('none', T(32702, 'Nothing')), ('stop', T(32703, 'Stop playback')), + ('quit', T(32704, 'Quit Kodi')), ('reboot', T(32426, 'Reboot')), + ('shutdown', T(32423, 'Shutdown')), + ('hibernate', T(32425, 'Hibernate')), ('suspend', T(32424, 'Suspend')), + ('cecstandby', T(32705, 'CEC Standby')), ('logoff', T(32421, 'Sign Out'))) + ).description(T(32701, 'When Kodi receives a sleep event from the system, run the following action.')), + OptionsSetting( + 'player_stop_on_idle', + T(32946, 'Stop video playback on idle after'), + 0, + ((0, T(32033, 'Never')), (30, '30s'), (60, '1m'), (120, '2m'), (300, '5m'), (600, '10m'), + (900, '15m'), (1200, '20m'), (1800, '30m'), (2700, '45m'), (3600, '1h'),) + ), + BoolSetting( + 'player_stop_on_screensaver', T(32947, 'Stop video playback on screensaver'), True + ), + BoolSetting('debug', T(32024, 'Debug Logging'), False), + ) + ), + 'privacy': ( + T(32051, 'Privacy'), + () + ), + 'about': ( + T(32052, 'About'), ( + InfoSetting('addon_version', T(32054, 'Addon Version'), util.ADDON.getAddonInfo('version')), + InfoSetting('kodi_version', T(32055, 'Kodi Version'), xbmc.getInfoLabel('System.BuildVersion')), + PlatformSetting(), + InfoSetting('screen_res', T(32056, 'Screen Resolution'), + xbmc.getInfoLabel('System.ScreenResolution').split('-')[0].strip()), + ServerVersionSetting('server_version', T(32057, 'Current Server Version'), None), + InfoSetting('addon_path', T(33616, 'Addon Path'), util.ADDON.getAddonInfo("path")), + InfoSetting('userdata_path', T(33617, 'Userdata/Profile Path'), + util.translatePath("special://profile")), + ) + ), + } + + SECTION_IDS = ('main', 'video', 'audio', 'player', 'player_user', 'network', 'system', 'about') + + def __getitem__(self, key): + return self.SETTINGS[key] + + +# enable AV1 setting if kodi nexus +if util.KODI_VERSION_MAJOR >= 20: + videoSettings = list(Settings.SETTINGS["video"]) + videoSettings[1] = tuple(list(videoSettings[1]) + [ + BoolSetting('allow_av1', T(32601, 'Allow AV1'), False).description( + T(32602, + 'Enable this if your hardware can handle AV1. Disable it to force transcoding.') + ) + ]) + Settings.SETTINGS["video"] = (videoSettings[0], videoSettings[1]) + + +class SettingsWindow(kodigui.BaseWindow, windowutils.UtilMixin): + xmlFile = 'script-plex-settings.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + SECTION_LIST_ID = 75 + SETTINGS_LIST_ID = 100 + OPTIONS_LIST_ID = 125 + TOP_GROUP_ID = 200 + + CLOSE_BUTTON_ID = 201 + PLAYER_STATUS_BUTTON_ID = 204 + + def onFirstInit(self): + self.settings = Settings() + self.sectionList = kodigui.ManagedControlList(self, self.SECTION_LIST_ID, 6) + self.settingsList = kodigui.ManagedControlList(self, self.SETTINGS_LIST_ID, 6) + self.optionsList = kodigui.ManagedControlList(self, self.OPTIONS_LIST_ID, 6) + + self.setProperty('heading', T(32343, 'Settings')) + self.showSections() + self.setFocusId(75) + self.lastSection = None + self.checkSection() + + def onAction(self, action): + try: + self.checkSection() + controlID = self.getFocusId() + if action in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_PREVIOUS_MENU): + if self.getFocusId() == self.OPTIONS_LIST_ID: + self.setFocusId(self.SETTINGS_LIST_ID) + return + # elif not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.TOP_GROUP_ID)): + # self.setFocusId(self.TOP_GROUP_ID) + # return + elif action == xbmcgui.ACTION_MOVE_RIGHT and controlID == 150: + self.editSetting(from_right=True) + except: + util.ERROR() + + kodigui.BaseWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.SECTION_LIST_ID: + self.setFocusId(self.SETTINGS_LIST_ID) + elif controlID == self.SETTINGS_LIST_ID: + self.editSetting() + elif controlID == self.OPTIONS_LIST_ID: + self.changeSetting() + elif controlID == self.CLOSE_BUTTON_ID: + self.doClose() + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + + def checkSection(self): + mli = self.sectionList.getSelectedItem() + if not mli: + return + + if mli.dataSource == self.lastSection: + return + + self.lastSection = mli.dataSource + self.showSettings(self.lastSection) + self.setProperty('section.about', self.lastSection == 'about' and '1' or '') + util.DEBUG_LOG('Settings: Changed section ({0})'.format(self.lastSection)) + + def showSections(self): + items = [] + for sectionID in self.settings.SECTION_IDS: + label = self.settings[sectionID][0] + item = kodigui.ManagedListItem(label, data_source=sectionID) + items.append(item) + + self.sectionList.addItems(items) + + def showSettings(self, section): + settings = self.settings[section][1] + if not settings: + return self.settingsList.reset() + + items = [] + for setting in settings: + item = kodigui.ManagedListItem(setting.label, setting.type != 'BOOL' and setting.valueLabel() or '', data_source=setting) + item.setProperty('description', setting.desc) + if setting.type == 'BOOL': + item.setProperty('checkbox', '1') + item.setProperty('checkbox.checked', setting.get() and '1' or '') + elif setting.type == 'BUTTON': + item.setProperty('button', '1') + + if setting.userAware: + item.setProperty('useraware', '1') + + items.append(item) + + self.settingsList.reset() + self.settingsList.addItems(items) + + def editSetting(self, from_right=False): + mli = self.settingsList.getSelectedItem() + if not mli: + return + + setting = mli.dataSource + + if setting.type in ('LIST', 'OPTIONS'): + self.fillList(setting) + elif setting.type == 'BOOL' and not from_right: + self.toggleBool(mli, setting) + elif setting.type == 'IP' and not from_right: + self.editIP(mli, setting) + elif setting.type == 'INTEGER' and not from_right: + self.editInteger(mli, setting) + elif setting.type == 'BUTTON': + self.buttonDialog(mli, setting) + + def changeSetting(self): + optionItem = self.optionsList.getSelectedItem() + if not optionItem: + return + + mli = self.settingsList.getSelectedItem() + if not mli: + return + + setting = mli.dataSource + + if setting.type == 'LIST': + setting.set(optionItem.pos()) + mli.setLabel2(setting.valueLabel()) + elif setting.type == 'OPTIONS': + setting.set(optionItem.dataSource) + mli.setLabel2(setting.valueLabel()) + + self.setFocusId(self.SETTINGS_LIST_ID) + + def fillList(self, setting): + items = [] + if setting.type == 'LIST': + for label in setting.optionLabels(): + items.append(kodigui.ManagedListItem(label)) + elif setting.type == 'OPTIONS': + for ID, label in setting.options: + items.append(kodigui.ManagedListItem(label, data_source=ID)) + + self.optionsList.reset() + self.optionsList.addItems(items) + self.optionsList.selectItem(setting.optionIndex()) + self.setFocusId(self.OPTIONS_LIST_ID) + + def toggleBool(self, mli, setting): + setting.set(not setting.get()) + mli.setProperty('checkbox.checked', setting.get() and '1' or '') + + def editIP(self, mli, setting): + current = setting.get() + edit = True + if current: + edit = xbmcgui.Dialog().yesno( + T(32412, 'Edit Or Clear'), + T(32413, 'Edit IP address or clear the current setting?'), + nolabel=T(32414, 'Clear'), + yeslabel=T(32415, 'Edit') + ) + + if edit: + result = xbmcgui.Dialog().input(T(32416, 'Enter IP Address'), current, xbmcgui.INPUT_IPADDRESS) + if not result: + return + else: + result = '' + + setting.set(result) + mli.setLabel2(result) + + def editInteger(self, mli, setting): + result = xbmcgui.Dialog().input(T(32417, 'Enter Port Number'), str(setting.get()), xbmcgui.INPUT_NUMERIC) + if not result: + return + setting.set(int(result)) + mli.setLabel2(result) + + +class SelectDialog(kodigui.BaseDialog, util.CronReceiver): + xmlFile = 'script-plex-settings_select_dialog.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + OPTIONS_LIST_ID = 100 + + def __init__(self, *args, **kwargs): + kodigui.BaseDialog.__init__(self, *args, **kwargs) + self.heading = kwargs.get('heading') + self.options = kwargs.get('options') + self.choice = None + + def onFirstInit(self): + self.optionsList = kodigui.ManagedControlList(self, self.OPTIONS_LIST_ID, 8) + self.setProperty('heading', self.heading) + self.showOptions() + util.CRON.registerReceiver(self) + + def onAction(self, action): + try: + if not xbmc.getCondVisibility('Player.HasMedia'): + self.doClose() + return + except: + util.ERROR() + + kodigui.BaseDialog.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.OPTIONS_LIST_ID: + self.setChoice() + + def onClosed(self): + util.CRON.cancelReceiver(self) + + def tick(self): + if not xbmc.getCondVisibility('Player.HasMedia'): + self.doClose() + return + + def setChoice(self): + mli = self.optionsList.getSelectedItem() + if not mli: + return + + self.choice = self.options[self.optionsList.getSelectedPosition()][0] + self.doClose() + + def showOptions(self): + items = [] + for o in self.options: + item = kodigui.ManagedListItem(o[1], data_source=o[0]) + items.append(item) + + self.optionsList.reset() + self.optionsList.addItems(items) + + self.setFocusId(self.OPTIONS_LIST_ID) + + +def showOptionsDialog(heading, options): + w = SelectDialog.open(heading=heading, options=options) + choice = w.choice + del w + return choice + + +def showAudioDialog(video): + options = [(s, s.getTitle()) for s in video.audioStreams] + choice = showOptionsDialog(T(32048, 'Audio'), options) + if choice is None: + return + + video.selectStream(choice) + + +def showSubtitlesDialog(video): + options = [(s, s.getTitle()) for s in video.subtitleStreams] + options.insert(0, (plexnet.plexstream.NoneStream(), 'None')) + choice = showOptionsDialog(T(32396, 'Subtitles'), options) + if choice is None: + return + + video.selectStream(choice) + + +def showQualityDialog(video): + options = [(13 - i, T(l)) for (i, l) in enumerate((32001, 32002, 32003, 32004, 32005, 32006, 32007, 32008, 32009, + 32010, 32011))] + + choice = showOptionsDialog(T(32397, 'Quality'), options) + if choice is None: + return + + video.settings.setPrefOverride('local_quality', choice) + video.settings.setPrefOverride('remote_quality', choice) + video.settings.setPrefOverride('online_quality', choice) + + +def openWindow(): + w = SettingsWindow.open() + del w diff --git a/script.plexmod/lib/windows/signin.py b/script.plexmod/lib/windows/signin.py new file mode 100644 index 000000000..444933662 --- /dev/null +++ b/script.plexmod/lib/windows/signin.py @@ -0,0 +1,146 @@ +from __future__ import absolute_import +from kodi_six import xbmcgui +from . import kodigui +from lib import util + + +class Background(kodigui.BaseWindow): + xmlFile = 'script-plex-signin_background.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + +class SignInMessage(kodigui.BaseWindow): + xmlFile = 'script-plex-signin_blank.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + SCREEN_BUTTON_ID = 100 + + def __init__(self, *args, **kwargs): + self.message = kwargs.get('message') + kodigui.BaseWindow.__init__(self, *args, **kwargs) + + def onFirstInit(self): + self.setProperty('message', self.message) + + def onClick(self, controlID): + if controlID == self.SCREEN_BUTTON_ID: + self.doClose() + + +class SignInPlexPass(kodigui.BaseWindow): + xmlFile = 'script-plex-plex_pass.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + RETRY_BUTTON_ID = 100 + + def __init__(self, *args, **kwargs): + self.retry = False + kodigui.BaseWindow.__init__(self, *args, **kwargs) + + def onAction(self, action): + if action == xbmcgui.ACTION_SELECT_ITEM: + self.retry = True + self.doClose() + + def onClick(self, controlID): + if controlID == self.RETRY_BUTTON_ID: + self.retry = True + self.doClose() + + +class PreSignInWindow(kodigui.BaseWindow): + xmlFile = 'script-plex-pre_signin.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + SIGNIN_BUTTON_ID = 100 + + def __init__(self, *args, **kwargs): + self.doSignin = False + kodigui.BaseWindow.__init__(self, *args, **kwargs) + + def onFirstInit(self): + self.signinButton = self.getControl(self.SIGNIN_BUTTON_ID) + + def onAction(self, action): + if action == xbmcgui.ACTION_SELECT_ITEM: + self.doSignin = True + self.doClose() + + def onClick(self, controlID): + if controlID == self.SIGNIN_BUTTON_ID: + self.doSignin = True + self.doClose() + + +class PinLoginWindow(kodigui.BaseWindow): + xmlFile = 'script-plex-pin_login.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + def __init__(self, *args, **kwargs): + self.abort = False + kodigui.BaseWindow.__init__(self, *args, **kwargs) + + def setPin(self, pin): + self.setProperty('pin.image.0', 'script.plex/sign_in/digits/{0}.png'.format(pin[0].upper())) + self.setProperty('pin.image.1', 'script.plex/sign_in/digits/{0}.png'.format(pin[1].upper())) + self.setProperty('pin.image.2', 'script.plex/sign_in/digits/{0}.png'.format(pin[2].upper())) + self.setProperty('pin.image.3', 'script.plex/sign_in/digits/{0}.png'.format(pin[3].upper())) + + def setLinking(self): + self.setProperty('linking', '1') + self.setProperty('pin.image.0', '') + self.setProperty('pin.image.1', '') + self.setProperty('pin.image.2', '') + self.setProperty('pin.image.3', '') + + def onAction(self, action): + try: + if action == xbmcgui.ACTION_NAV_BACK or action == xbmcgui.ACTION_PREVIOUS_MENU: + self.abort = True + except: + util.ERROR() + + kodigui.BaseWindow.onAction(self, action) + + +class ExpiredWindow(kodigui.BaseWindow): + xmlFile = 'script-plex-refresh_code.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + REFRESH_BUTTON_ID = 100 + + def __init__(self, *args, **kwargs): + self.refresh = False + kodigui.BaseWindow.__init__(self, *args, **kwargs) + + def onFirstInit(self): + self.refreshButton = self.getControl(self.REFRESH_BUTTON_ID) + + def onClick(self, controlID): + if controlID == self.REFRESH_BUTTON_ID: + self.refresh = True + self.doClose() diff --git a/script.plexmod/lib/windows/slidehshow.py b/script.plexmod/lib/windows/slidehshow.py new file mode 100644 index 000000000..d25f8b670 --- /dev/null +++ b/script.plexmod/lib/windows/slidehshow.py @@ -0,0 +1,108 @@ +import time +import random + +from . import kodigui + +from lib import util +from plexnet import plexapp + +class Slideshow(kodigui.BaseWindow, util.CronReceiver): + xmlFile = 'script-plex-slideshow.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + TIME_BETWEEN_IMAGES = 15 + TIME_HIDE_TITLE_IN_QUIZ = 5 + TIME_DISPLAY_MOVE = 60 + + CONTROL_INFO_GROUP = 100 + + def __init__(self, *args, **kwargs): + kodigui.BaseWindow.__init__(self, *args, **kwargs) + self.timeBetweenImages = self.TIME_BETWEEN_IMAGES + self.timeBetweenDisplayMove = self.TIME_DISPLAY_MOVE + self.timeTitleIsHidden = self.TIME_HIDE_TITLE_IN_QUIZ + self.quizMode = util.advancedSettings.screensaverQuiz + self.initialized = False + + def onFirstInit(self): + self.setProperty('clock', '') + self.setProperty('title', '') + self.setProperty('thumb', '') + self.setProperty('align', '0') + + self.infoGroupControl = self.getControl(self.CONTROL_INFO_GROUP) + + util.CRON.registerReceiver(self) + self.timeFormat = util.timeFormat.replace(":%S", "") + self.lastTime = '' + self.displayPosition = 0 + self.changeTime = time.time() - 1 + self.displayMoveTime = time.time() + self.timeBetweenDisplayMove + self.revealTitleTime = None + + self.selectedServer = plexapp.SERVERMANAGER.selectedServer + self.index = -1 + self.images = [] + + self.initialized = True + + def tick(self): + if not self.initialized: + return + + currentTime = time.time() + timestr = time.strftime(self.timeFormat, time.localtime(currentTime)) + if not util.padHour and timestr[0] == "0" and timestr[1] != ":": + timestr = timestr[1:] + + if currentTime > self.changeTime: + nextIndex = self.index + 1 + + if nextIndex >= len(self.images): + if self.selectedServer != None: + self.images = self.selectedServer.library.randomArts(); + util.DEBUG_LOG('[SS] Fetched {0} items'.format(len(self.images))) + nextIndex = 0 + + if len(self.images) == 0: + title = 'No Images' + url = '' + else: + image = self.images[nextIndex] + title = image.get('title') + key = image.get('key') + url = self.selectedServer.getImageTranscodeURL(key, self.width, self.height) + if not self.quizMode: + self.setProperty('title', title) + else: + self.setProperty('title', '') + self.quizTitle = title + self.revealTitleTime = currentTime + self.timeTitleIsHidden + self.setProperty('thumb', url) + + self.index = nextIndex + self.changeTime = time.time() + self.timeBetweenImages + + if self.revealTitleTime != None and currentTime > self.revealTitleTime: + self.setProperty('title', self.quizTitle) + self.revealTitleTime = None + + if currentTime > self.displayMoveTime: + oldDisplayPosition = self.displayPosition + self.displayPosition = (oldDisplayPosition + random.randint(1, 3)) % 4 + + if (oldDisplayPosition&2) != (self.displayPosition&2): + self.setProperty('align', str((self.displayPosition&2)>>1)) + + if (oldDisplayPosition&1) != (self.displayPosition&1): + newY = self.height - self.infoGroupControl.getY() - self.infoGroupControl.getHeight() + self.infoGroupControl.setPosition(self.infoGroupControl.getX(), newY) + + self.displayMoveTime = currentTime + self.timeBetweenDisplayMove + + if timestr != self.lastTime: + self.setProperty('clock', timestr) \ No newline at end of file diff --git a/script.plexmod/lib/windows/subitems.py b/script.plexmod/lib/windows/subitems.py new file mode 100644 index 000000000..13204429b --- /dev/null +++ b/script.plexmod/lib/windows/subitems.py @@ -0,0 +1,647 @@ +from __future__ import absolute_import +import gc + +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from lib import colors +from lib import util +from lib import metadata +from lib import player + +from plexnet import playlist +from plexnet.util import INTERFACE + +from . import busy +from . import episodes +from . import tracks +from . import opener +from . import info +from . import musicplayer +from . import videoplayer +from . import dropdown +from . import windowutils +from . import search +from . import pagination +from . import playbacksettings + +from lib.util import T +from .mixins import SeasonsMixin + + +class RelatedPaginator(pagination.BaseRelatedPaginator): + def getData(self, offset, amount): + return self.parentWindow.mediaItem.getRelated(offset=offset, limit=amount) + + +class ShowWindow(kodigui.ControlledWindow, windowutils.UtilMixin, SeasonsMixin, playbacksettings.PlaybackSettingsMixin): + xmlFile = 'script-plex-seasons.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + EXTRA_DIM = util.scaleResolution(329, 185) + RELATED_DIM = util.scaleResolution(268, 397) + ROLES_DIM = util.scaleResolution(334, 334) + + SUB_ITEM_LIST_ID = 400 + + EXTRA_LIST_ID = 401 + RELATED_LIST_ID = 402 + ROLES_LIST_ID = 403 + + OPTIONS_GROUP_ID = 200 + + HOME_BUTTON_ID = 201 + SEARCH_BUTTON_ID = 202 + PLAYER_STATUS_BUTTON_ID = 204 + + PROGRESS_IMAGE_ID = 250 + + INFO_BUTTON_ID = 301 + PLAY_BUTTON_ID = 302 + SHUFFLE_BUTTON_ID = 303 + OPTIONS_BUTTON_ID = 304 + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + self.mediaItem = kwargs.get('media_item') + self.parentList = kwargs.get('parent_list') + self.cameFrom = kwargs.get('came_from') + self.mediaItems = None + self.exitCommand = None + self.lastFocusID = None + self.lastNonOptionsFocusID = None + self.initialized = False + self.relatedPaginator = None + + def doClose(self): + self.relatedPaginator = None + kodigui.ControlledWindow.doClose(self) + + def onFirstInit(self): + self.subItemListControl = kodigui.ManagedControlList(self, self.SUB_ITEM_LIST_ID, 5) + self.extraListControl = kodigui.ManagedControlList(self, self.EXTRA_LIST_ID, 5) + self.relatedListControl = kodigui.ManagedControlList(self, self.RELATED_LIST_ID, 5) + self.rolesListControl = kodigui.ManagedControlList(self, self.ROLES_LIST_ID, 5) + self.progressImageControl = self.getControl(self.PROGRESS_IMAGE_ID) + + self.setup() + self.initialized = True + + self.setFocusId(self.PLAY_BUTTON_ID) + + def onInit(self): + super(ShowWindow, self).onInit() + if self.mediaItem.theme and (not self.cameFrom or self.cameFrom != self.mediaItem.ratingKey) \ + and not util.getSetting("slow_connection", False): + self.cameFrom = self.mediaItem.ratingKey + volume = self.mediaItem.settings.getThemeMusicValue() + if volume > 0: + player.PLAYER.playBackgroundMusic(self.mediaItem.theme.asURL(True), volume, + self.mediaItem.ratingKey) + + def setup(self): + self.mediaItem.reload(includeExtras=1, includeExtrasCount=10) + + self.relatedPaginator = RelatedPaginator(self.relatedListControl, leaf_count=int(self.mediaItem.relatedCount), + parent_window=self) + + self.updateProperties() + self.setBoolProperty("initialized", True) + self.fill() + hasPrev = self.fillExtras() + hasPrev = self.fillRelated(hasPrev) + self.fillRoles(hasPrev) + + def updateProperties(self): + self.setProperty('title', self.mediaItem.title) + self.setProperty('summary', self.mediaItem.summary) + self.setProperty('thumb', self.mediaItem.defaultThumb.asTranscodedImageURL(*self.THUMB_DIMS[self.mediaItem.type]['main.thumb'])) + self.updateBackgroundFrom(self.mediaItem) + self.setProperty('duration', util.durationToText(self.mediaItem.fixedDuration())) + self.setProperty('info', '') + self.setProperty('date', self.mediaItem.year) + + self.setProperty('extras.header', T(32305, 'Extras')) + self.setProperty('related.header', T(32306, 'Related Shows')) + + if self.mediaItem.creator: + self.setProperty('directors', u'{0} {1}'.format(T(32418, 'Creator').upper(), self.mediaItem.creator)) + elif self.mediaItem.studio: + self.setProperty('directors', u'{0} {1}'.format(T(32386, 'Studio').upper(), self.mediaItem.studio)) + + cast = u' / '.join([r.tag for r in self.mediaItem.roles()][:5]) + castLabel = T(32419, 'Cast').upper() + self.setProperty('writers', cast and u'{0} {1}'.format(castLabel, cast) or '') + + genres = self.mediaItem.genres() + self.setProperty('info', genres and (u' / '.join([g.tag for g in genres][:3])) or '') + + self.setProperties(('rating.stars', 'rating', 'rating.image', 'rating2', 'rating2.image'), '') + + if self.mediaItem.userRating: + stars = str(int(round((self.mediaItem.userRating.asFloat() / 10) * 5))) + self.setProperty('rating.stars', stars) + + if self.mediaItem.ratingImage: + rating = self.mediaItem.rating + audienceRating = self.mediaItem.audienceRating + if self.mediaItem.ratingImage.startswith('rottentomatoes:'): + rating = '{0}%'.format(int(rating.asFloat() * 10)) + if audienceRating: + audienceRating = '{0}%'.format(int(audienceRating.asFloat() * 10)) + + self.setProperty('rating', rating) + self.setProperty('rating.image', 'script.plex/ratings/{0}.png'.format(self.mediaItem.ratingImage.replace('://', '/'))) + if self.mediaItem.audienceRatingImage: + self.setProperty('rating2', audienceRating) + self.setProperty('rating2.image', 'script.plex/ratings/{0}.png'.format(self.mediaItem.audienceRatingImage.replace('://', '/'))) + else: + self.setProperty('rating', self.mediaItem.rating) + + sas = self.mediaItem.selectedAudioStream() + self.setProperty('audio', sas and sas.getTitle() or 'None') + + sss = self.mediaItem.selectedSubtitleStream( + forced_subtitles_override=util.getSetting("forced_subtitles_override", False)) + self.setProperty('subtitles', sss and sss.getTitle() or 'None') + + leafcount = self.mediaItem.leafCount.asFloat() + if leafcount: + width = (int((self.mediaItem.viewedLeafCount.asInt() / leafcount) * self.width)) or 1 + self.progressImageControl.setWidth(width) + + def onAction(self, action): + try: + controlID = self.getFocusId() + + if not controlID and self.lastFocusID and not action == xbmcgui.ACTION_MOUSE_MOVE: + self.setFocusId(self.lastFocusID) + + if action == xbmcgui.ACTION_CONTEXT_MENU: + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + self.lastNonOptionsFocusID = self.lastFocusID + self.setFocusId(self.OPTIONS_GROUP_ID) + return + else: + if self.lastNonOptionsFocusID: + self.setFocusId(self.lastNonOptionsFocusID) + self.lastNonOptionsFocusID = None + return + + elif action in(xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_CONTEXT_MENU): + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format( + self.OPTIONS_GROUP_ID)) and \ + (not util.advancedSettings.fastBack or action == xbmcgui.ACTION_CONTEXT_MENU): + if self.getProperty('on.extras'): + self.setFocusId(self.OPTIONS_GROUP_ID) + return + + if action == xbmcgui.ACTION_LAST_PAGE and xbmc.getCondVisibility('ControlGroup(300).HasFocus(0)'): + next(self) + elif action == xbmcgui.ACTION_NEXT_ITEM: + self.setFocusId(300) + next(self) + elif action == xbmcgui.ACTION_FIRST_PAGE and xbmc.getCondVisibility('ControlGroup(300).HasFocus(0)'): + self.prev() + elif action == xbmcgui.ACTION_PREV_ITEM: + self.setFocusId(300) + self.prev() + + if action == xbmcgui.ACTION_MOVE_UP and (controlID == self.SUB_ITEM_LIST_ID or + self.INFO_BUTTON_ID <= controlID <= self.OPTIONS_BUTTON_ID): + self.updateBackgroundFrom(self.mediaItem) + + if controlID == self.RELATED_LIST_ID: + if self.relatedPaginator.boundaryHit: + self.relatedPaginator.paginate() + return + elif action in (xbmcgui.ACTION_MOVE_LEFT, xbmcgui.ACTION_MOVE_RIGHT): + self.updateBackgroundFrom(self.relatedListControl.getSelectedItem().dataSource) + + except: + util.ERROR() + + kodigui.ControlledWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.HOME_BUTTON_ID: + self.goHome() + elif controlID == self.SUB_ITEM_LIST_ID: + self.subItemListClicked() + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif controlID == self.EXTRA_LIST_ID: + self.openItem(self.extraListControl) + elif controlID == self.RELATED_LIST_ID: + self.openItem(self.relatedListControl) + elif controlID == self.ROLES_LIST_ID: + self.roleClicked() + elif controlID == self.INFO_BUTTON_ID: + self.infoButtonClicked() + elif controlID == self.PLAY_BUTTON_ID: + self.playButtonClicked() + elif controlID == self.SHUFFLE_BUTTON_ID: + self.shuffleButtonClicked() + elif controlID == self.OPTIONS_BUTTON_ID: + self.optionsButtonClicked() + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + + def onFocus(self, controlID): + self.lastFocusID = controlID + + if 399 < controlID < 500: + self.setProperty('hub.focus', str(controlID - 400)) + + if controlID == self.RELATED_LIST_ID: + self.updateBackgroundFrom(self.relatedListControl.getSelectedItem().dataSource) + + if xbmc.getCondVisibility('ControlGroup(50).HasFocus(0) + ControlGroup(300).HasFocus(0)'): + self.setProperty('on.extras', '') + elif xbmc.getCondVisibility('ControlGroup(50).HasFocus(0) + !ControlGroup(300).HasFocus(0)'): + self.setProperty('on.extras', '1') + + if player.PLAYER.bgmPlaying and player.PLAYER.handler.currentlyPlaying != self.mediaItem.ratingKey: + player.PLAYER.stopAndWait() + + def getMediaItems(self): + return False + + def next(self): + if not self._next(): + return + self.setup() + + __next__ = next + + @busy.dialog() + def _next(self): + if self.parentList: + mli = self.parentList.getListItemByDataSource(self.mediaItem) + if not mli: + return False + + pos = mli.pos() + 1 + if not self.parentList.positionIsValid(pos): + pos = 0 + + self.mediaItem = self.parentList.getListItem(pos).dataSource + else: + if not self.getMediaItems(): + return False + + if self.mediaItem not in self.mediaItems: + return False + + pos = self.mediaItems.index(self.mediaItem) + pos += 1 + if pos >= len(self.mediaItems): + pos = 0 + + self.mediaItem = self.mediaItems[pos] + + return True + + def prev(self): + if not self._prev(): + return + self.setup() + + @busy.dialog() + def _prev(self): + if self.parentList: + mli = self.parentList.getListItemByDataSource(self.mediaItem) + if not mli: + return False + + pos = mli.pos() - 1 + if pos < 0: + pos = self.parentList.size() - 1 + + self.mediaItem = self.parentList.getListItem(pos).dataSource + else: + if not self.getMediaItems(): + return False + + if self.mediaItem not in self.mediaItems: + return False + + pos = self.mediaItems.index(self.mediaItem) + pos -= 1 + if pos < 0: + pos = len(self.mediaItems) - 1 + + self.mediaItem = self.mediaItems[pos] + + return True + + def searchButtonClicked(self): + self.processCommand(search.dialog(self, section_id=self.mediaItem.getLibrarySectionId() or None)) + + def openItem(self, control=None, item=None): + if not item: + mli = control.getSelectedItem() + if not mli: + return + item = mli.dataSource + + self.processCommand(opener.open(item)) + + def subItemListClicked(self): + mli = self.subItemListControl.getSelectedItem() + if not mli: + return + + update = False + + w = None + if self.mediaItem.type == 'show': + w = episodes.EpisodesWindow.open(season=mli.dataSource, show=self.mediaItem, parent_list=self.subItemListControl) + update = True + elif self.mediaItem.type == 'artist': + w = tracks.AlbumWindow.open(album=mli.dataSource, parent_list=self.subItemListControl) + + if not mli: + return + + if not mli.dataSource.exists(): + self.subItemListControl.removeItem(mli.pos()) + + if not self.subItemListControl.size(): + self.closeWithCommand(w.exitCommand) + del w + gc.collect(2) + return + + if update: + mli.setProperty('unwatched.count', not mli.dataSource.isWatched and str(mli.dataSource.unViewedLeafCount) or '') + self.mediaItem.reload(includeRelated=1, includeRelatedCount=10, includeExtras=1, includeExtrasCount=10) + self.updateProperties() + + try: + self.processCommand(w.exitCommand) + finally: + del w + gc.collect(2) + + def infoButtonClicked(self): + fallback = 'script.plex/thumb_fallbacks/{0}.png'.format(self.mediaItem.type == 'show' and 'show' or 'music') + genres = u' / '.join([g.tag for g in util.removeDups(self.mediaItem.genres())][:6]) + + w = info.InfoWindow.open( + title=self.mediaItem.title, + sub_title=genres, + thumb=self.mediaItem.defaultThumb, + thumb_fallback=fallback, + info=self.mediaItem.summary, + background=self.getProperty('background'), + is_square=bool(isinstance(self, ArtistWindow)), + video=self.mediaItem + ) + del w + util.garbageCollect() + + def playButtonClicked(self, shuffle=False): + items = self.mediaItem.all() + pl = playlist.LocalPlaylist(items, self.mediaItem.getServer()) + resume = False + if not shuffle and self.mediaItem.type == 'show': + resume = self.getPlaylistResume(pl, items, self.mediaItem.title) + if resume is None: + return + + pl.shuffle(shuffle, first=True) + videoplayer.play(play_queue=pl, resume=resume) + + def shuffleButtonClicked(self): + self.playButtonClicked(shuffle=True) + + def optionsButtonClicked(self): + options = [] + oldBingeModeValue = None + if xbmc.getCondVisibility('Player.HasAudio + MusicPlayer.HasNext'): + options.append({'key': 'play_next', 'display': 'Play Next'}) + + if self.mediaItem.type != 'artist': + if self.mediaItem.isWatched: + options.append({'key': 'mark_unwatched', 'display': T(32318, 'Mark Unplayed')}) + else: + options.append({'key': 'mark_watched', 'display': T(32319, 'Mark Played')}) + + if self.mediaItem.type == "show": + if options: + options.append(dropdown.SEPARATOR) + + options.append({'key': 'playback_settings', 'display': T(32925, 'Playback Settings')}) + + # if xbmc.getCondVisibility('Player.HasAudio') and self.section.TYPE == 'artist': + # options.append({'key': 'add_to_queue', 'display': 'Add To Queue'}) + + # if False: + # options.append({'key': 'add_to_playlist', 'display': 'Add To Playlist'}) + + options.append(dropdown.SEPARATOR) + + options.append({'key': 'to_section', 'display': u'Go to {0}'.format(self.mediaItem.getLibrarySectionTitle())}) + pos = (880, 618) + + choice = dropdown.showDropdown(options, pos, close_direction='left') + if not choice: + return + + if choice['key'] == 'play_next': + xbmc.executebuiltin('PlayerControl(Next)') + elif choice['key'] == 'mark_watched': + self.mediaItem.markWatched() + self.updateItems() + self.updateProperties() + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'mark_unwatched': + self.mediaItem.markUnwatched() + self.updateItems() + self.updateProperties() + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'to_section': + self.goHome(self.mediaItem.getLibrarySectionId()) + elif choice['key'] == 'playback_settings': + self.playbackSettings(self.mediaItem, pos, False) + + def roleClicked(self): + mli = self.rolesListControl.getSelectedItem() + if not mli: + return + + sectionRoles = busy.widthDialog(mli.dataSource.sectionRoles, '') + + if not sectionRoles: + util.DEBUG_LOG('No sections found for actor') + return + + if len(sectionRoles) > 1: + x, y = self.getRoleItemDDPosition() + + options = [{'role': r, 'display': r.reasonTitle} for r in sectionRoles] + choice = dropdown.showDropdown(options, (x, y), pos_is_bottom=True, close_direction='bottom') + + if not choice: + return + + role = choice['role'] + else: + role = sectionRoles[0] + + self.processCommand(opener.open(role)) + + def getRoleItemDDPosition(self): + y = 980 + if xbmc.getCondVisibility('Control.IsVisible(500)'): + y += 360 + if xbmc.getCondVisibility('Control.IsVisible(501)'): + y += 360 + if xbmc.getCondVisibility('Control.IsVisible(502)'): + y += 520 + if xbmc.getCondVisibility('!String.IsEmpty(Window.Property(on.extras))'): + y -= 300 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),0) + Control.IsVisible(500)'): + y -= 500 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),1) + Control.IsVisible(501)'): + y -= 360 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),1) + Control.IsVisible(502)'): + y -= 500 + + focus = int(xbmc.getInfoLabel('Container(403).Position')) + + x = ((focus + 1) * 304) - 100 + return x, y + + def updateItems(self): + self.fill(update=True) + + def createListItem(self, obj): + mli = kodigui.ManagedListItem( + obj.title or '', + thumbnailImage=obj.defaultThumb.asTranscodedImageURL(*self.THUMB_DIMS[self.mediaItem.type]['item.thumb']), + data_source=obj + ) + return mli + + @busy.dialog() + def fill(self, update=False): + self.fillSeasons(self.mediaItem, update=update) + + def fillExtras(self): + items = [] + idx = 0 + + if not self.mediaItem.extras: + self.extraListControl.reset() + return False + + for extra in self.mediaItem.extras(): + mli = kodigui.ManagedListItem( + extra.title or '', + metadata.EXTRA_MAP.get(extra.extraType.asInt(), ''), + thumbnailImage=extra.thumb.asTranscodedImageURL(*self.EXTRA_DIM), + data_source=extra + ) + + if mli: + mli.setProperty('index', str(idx)) + mli.setProperty( + 'thumb.fallback', 'script.plex/thumb_fallbacks/{0}.png'.format(extra.type in ('show', 'season', 'episode') and 'show' or 'movie') + ) + items.append(mli) + idx += 1 + + if not items: + return False + + self.extraListControl.reset() + self.extraListControl.addItems(items) + return True + + def fillRelated(self, has_prev=False): + if not self.relatedPaginator.leafCount: + self.relatedListControl.reset() + return has_prev + + self.setProperty('divider.{0}'.format(self.RELATED_LIST_ID), has_prev and '1' or '') + + items = self.relatedPaginator.paginate() + + if not items: + return False + + return True + + def fillRoles(self, has_prev=False): + items = [] + idx = 0 + if not self.mediaItem.roles: + self.rolesListControl.reset() + return has_prev + + self.setProperty('divider.{0}'.format(self.ROLES_LIST_ID), has_prev and '1' or '') + + for role in self.mediaItem.roles(): + mli = kodigui.ManagedListItem(role.tag, role.role, thumbnailImage=role.thumb.asTranscodedImageURL(*self.ROLES_DIM), data_source=role) + mli.setProperty('index', str(idx)) + items.append(mli) + idx += 1 + + self.rolesListControl.reset() + self.rolesListControl.addItems(items) + return True + + +class ArtistWindow(ShowWindow): + xmlFile = 'script-plex-artist.xml' + + SUB_ITEM_LIST_ID = 101 + + def onFirstInit(self): + self.subItemListControl = kodigui.ManagedControlList(self, self.SUB_ITEM_LIST_ID, 5) + + self.setup() + + self.setFocusId(self.PLAY_BUTTON_ID) + + def setup(self): + self.updateProperties() + self.fill() + + def playButtonClicked(self, shuffle=False): + pl = playlist.LocalPlaylist(self.mediaItem.all(), self.mediaItem.getServer(), self.mediaItem) + pl.startShuffled = shuffle + w = musicplayer.MusicPlayerWindow.open(track=pl.current(), playlist=pl) + del w + + def updateProperties(self): + self.setProperty('summary', self.mediaItem.summary) + self.setProperty('thumb', self.mediaItem.defaultThumb.asTranscodedImageURL(*self.THUMB_DIMS[self.mediaItem.type]['main.thumb'])) + self.updateBackgroundFrom(self.mediaItem) + + @busy.dialog() + def fill(self): + self.mediaItem.reload(includeRelated=1, includeRelatedCount=10, includeExtras=1, includeExtrasCount=10) + self.setProperty('artist.title', self.mediaItem.title) + genres = u' / '.join([g.tag for g in util.removeDups(self.mediaItem.genres())][:6]) + self.setProperty('artist.genre', genres) + items = [] + idx = 0 + for album in sorted(self.mediaItem.albums(), key=lambda x: x.year): + mli = self.createListItem(album) + if mli: + mli.setProperty('index', str(idx)) + mli.setProperty('year', album.year) + mli.setProperty('thumb.fallback', 'script.plex/thumb_fallbacks/music.png') + items.append(mli) + idx += 1 + + self.subItemListControl.reset() + self.subItemListControl.addItems(items) diff --git a/script.plexmod/lib/windows/tracks.py b/script.plexmod/lib/windows/tracks.py new file mode 100644 index 000000000..90dc43043 --- /dev/null +++ b/script.plexmod/lib/windows/tracks.py @@ -0,0 +1,348 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +from . import kodigui + +from lib import colors +from lib import util + +from plexnet import playlist + +from . import busy +from . import musicplayer +from . import dropdown +from . import windowutils +from . import opener +from . import search + +from lib.util import T + + +class AlbumWindow(kodigui.ControlledWindow, windowutils.UtilMixin): + xmlFile = 'script-plex-album.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + THUMB_AR16X9_DIM = util.scaleResolution(178, 100) + THUMB_SQUARE_DIM = util.scaleResolution(630, 630) + + TRACKS_LIST_ID = 101 + LIST_OPTIONS_BUTTON_ID = 111 + + OPTIONS_GROUP_ID = 200 + + HOME_BUTTON_ID = 201 + SEARCH_BUTTON_ID = 202 + PLAYER_STATUS_BUTTON_ID = 204 + + PLAY_BUTTON_ID = 301 + SHUFFLE_BUTTON_ID = 302 + OPTIONS_BUTTON_ID = 303 + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + self.album = kwargs.get('album') + self.parentList = kwargs.get('parentList') + self.albums = None + self.exitCommand = None + + def onFirstInit(self): + self.trackListControl = kodigui.ManagedControlList(self, self.TRACKS_LIST_ID, 5) + + self.setup() + self.setFocusId(self.TRACKS_LIST_ID) + try: + self.checkForHeaderFocus(xbmcgui.ACTION_MOVE_DOWN) + except AttributeError: + raise util.NoDataException + + def setup(self): + self.updateProperties() + self.fillTracks() + + def onAction(self, action): + controlID = self.getFocusId() + try: + if action == xbmcgui.ACTION_LAST_PAGE and xbmc.getCondVisibility('ControlGroup(300).HasFocus(0)'): + self.next() + elif action == xbmcgui.ACTION_NEXT_ITEM: + self.next() + elif action == xbmcgui.ACTION_FIRST_PAGE and xbmc.getCondVisibility('ControlGroup(300).HasFocus(0)'): + self.prev() + elif action == xbmcgui.ACTION_PREV_ITEM: + self.prev() + + if controlID == self.TRACKS_LIST_ID: + self.checkForHeaderFocus(action) + if controlID == self.LIST_OPTIONS_BUTTON_ID and self.checkOptionsAction(action): + return + elif action == xbmcgui.ACTION_CONTEXT_MENU: + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + self.setFocusId(self.OPTIONS_GROUP_ID) + return + # elif action in(xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_CONTEXT_MENU): + # if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + # self.setFocusId(self.OPTIONS_GROUP_ID) + # return + except: + util.ERROR() + + kodigui.ControlledWindow.onAction(self, action) + + def checkOptionsAction(self, action): + if action == xbmcgui.ACTION_MOVE_UP: + mli = self.trackListControl.getSelectedItem() + if not mli: + return False + pos = mli.pos() - 1 + if self.trackListControl.positionIsValid(pos): + self.setFocusId(self.TRACKS_LIST_ID) + self.trackListControl.selectItem(pos) + return True + elif action == xbmcgui.ACTION_MOVE_DOWN: + mli = self.trackListControl.getSelectedItem() + if not mli: + return False + pos = mli.pos() + 1 + if self.trackListControl.positionIsValid(pos): + self.setFocusId(self.TRACKS_LIST_ID) + self.trackListControl.selectItem(pos) + return True + + return False + + def onClick(self, controlID): + if controlID == self.HOME_BUTTON_ID: + self.goHome() + elif controlID == self.TRACKS_LIST_ID: + self.trackPanelClicked() + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif controlID == self.PLAY_BUTTON_ID: + self.playButtonClicked() + elif controlID == self.SHUFFLE_BUTTON_ID: + self.shuffleButtonClicked() + elif controlID == self.OPTIONS_BUTTON_ID: + self.optionsButtonClicked() + elif controlID == self.LIST_OPTIONS_BUTTON_ID: + mli = self.trackListControl.getSelectedItem() + if mli: + self.optionsButtonClicked(mli) + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + + def getAlbums(self): + if not self.albums: + self.albums = self.album.artist().albums() + + if not self.albums: + return False + + return True + + def next(self): + if not self._next(): + return + self.setup() + + @busy.dialog() + def _next(self): + if self.parentList: + mli = self.parentList.getListItemByDataSource(self.album) + if not mli: + return False + + pos = mli.pos() + 1 + if not self.parentList.positionIsValid(pos): + pos = 0 + + self.album = self.parentList.getListItem(pos).dataSource + else: + if not self.getAlbums(): + return False + + if self.album not in self.albums: + return False + + pos = self.albums.index(self.album) + pos += 1 + if pos >= len(self.albums): + pos = 0 + + self.album = self.albums[pos] + + return True + + def prev(self): + if not self._prev(): + return + self.setup() + + @busy.dialog() + def _prev(self): + if self.parentList: + mli = self.parentList.getListItemByDataSource(self.album) + if not mli: + return False + + pos = mli.pos() - 1 + if pos < 0: + pos = self.parentList.size() - 1 + + self.album = self.parentList.getListItem(pos).dataSource + else: + if not self.getAlbums(): + return False + + if self.album not in self.albums: + return False + + pos = self.albums.index(self.album) + pos -= 1 + if pos < 0: + pos = len(self.albums) - 1 + + self.album = self.albums[pos] + + return True + + def searchButtonClicked(self): + self.processCommand(search.dialog(self, section_id=self.album.getLibrarySectionId() or None)) + + def shuffleButtonClicked(self): + self.playButtonClicked(shuffle=True) + + def optionsButtonClicked(self, item=None): + options = [] + + if item: + if item.dataSource.isWatched: + options.append({'key': 'mark_unwatched', 'display': T(32318, 'Mark Unplayed')}) + else: + options.append({'key': 'mark_watched', 'display': T(32319, 'Mark Played')}) + + # if False: + # options.append({'key': 'add_to_playlist', 'display': '[COLOR FF808080]Add To Playlist[/COLOR]'}) + else: + if xbmc.getCondVisibility('Player.HasAudio + MusicPlayer.HasNext'): + options.append({'key': 'play_next', 'display': T(32325, 'Play Next')}) + + # if xbmc.getCondVisibility('Player.HasAudio') and self.section.TYPE == 'artist': + # options.append({'key': 'add_to_queue', 'display': 'Add To Queue'}) + + if options: + options.append(dropdown.SEPARATOR) + + options.append({'key': 'to_artist', 'display': T(32301, 'Go to Artist')}) + options.append({'key': 'to_section', 'display': T(32302, u'Go to {0}').format(self.album.getLibrarySectionTitle())}) + + pos = (460, 1106) + bottom = True + setDropdownProp = False + if item: + viewPos = self.trackListControl.getViewPosition() + if viewPos > 6: + pos = (1490, 312 + (viewPos * 100)) + bottom = True + else: + pos = (1490, 167 + (viewPos * 100)) + bottom = False + setDropdownProp = True + choice = dropdown.showDropdown(options, pos, pos_is_bottom=bottom, close_direction='right', set_dropdown_prop=setDropdownProp) + if not choice: + return + + if choice['key'] == 'play_next': + xbmc.executebuiltin('PlayerControl(Next)') + elif choice['key'] == 'mark_watched': + media = item and item.dataSource or self.album + media.markWatched() + self.updateItems(item) + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'mark_unwatched': + media = item and item.dataSource or self.album + media.markUnwatched() + self.updateItems(item) + util.MONITOR.watchStatusChanged() + elif choice['key'] == 'to_artist': + self.processCommand(opener.open(self.album.parentRatingKey)) + elif choice['key'] == 'to_section': + self.goHome(self.album.getLibrarySectionId()) + + def checkForHeaderFocus(self, action): + if action in (xbmcgui.ACTION_MOVE_UP, xbmcgui.ACTION_PAGE_UP): + if self.trackListControl.getSelectedItem().getProperty('is.header'): + xbmc.executebuiltin('Action(up)') + if action in (xbmcgui.ACTION_MOVE_DOWN, xbmcgui.ACTION_PAGE_DOWN, xbmcgui.ACTION_MOVE_LEFT, xbmcgui.ACTION_MOVE_RIGHT): + if self.trackListControl.getSelectedItem().getProperty('is.header'): + xbmc.executebuiltin('Action(down)') + + def updateItems(self, item=None): + if item: + self.album.reload() + item.setProperty('watched', item.dataSource.isWatched and '1' or '') + else: + self.fillTracks() + + def playButtonClicked(self, shuffle=False): + pl = playlist.LocalPlaylist(self.album.all(), self.album.getServer()) + pl.startShuffled = shuffle + self.openWindow(musicplayer.MusicPlayerWindow, track=pl.current(), playlist=pl) + + def trackPanelClicked(self): + mli = self.trackListControl.getSelectedItem() + if not mli: + return + + self.openWindow(musicplayer.MusicPlayerWindow, track=mli.dataSource, album=self.album) + + def updateProperties(self): + self.setProperty( + 'background', + util.backgroundFromArt(self.album.art, width=self.width, height=self.height) + ) + self.setProperty('album.thumb', self.album.thumb.asTranscodedImageURL(*self.THUMB_SQUARE_DIM)) + self.setProperty('artist.title', self.album.parentTitle or '') + self.setProperty('album.title', self.album.title) + + def createListItem(self, obj): + mli = kodigui.ManagedListItem(obj.title, data_source=obj) + mli.setProperty('track.number', str(obj.index) or '') + mli.setProperty('track.duration', util.simplifiedTimeDisplay(obj.duration.asInt())) + return mli + + #@busy.dialog() + def fillTracks(self): + items = [] + idx = 0 + multiDisc = 0 + + for track in self.album.tracks(): + disc = track.parentIndex.asInt() + if disc > 1: + if not multiDisc: + items.insert(0, kodigui.ManagedListItem(u'{0} 1'.format(T(32420, 'Disc').upper()), properties={'is.header': '1'})) + + if disc != multiDisc: + items[-1].setProperty('is.footer', '1') + multiDisc = disc + items.append(kodigui.ManagedListItem('{0} {1}'.format(T(32420, 'Disc').upper(), disc), properties={'is.header': '1'})) + + mli = self.createListItem(track) + if mli: + mli.setProperty('track.ID', track.ratingKey) + mli.setProperty('index', str(idx)) + mli.setProperty('artist', self.album.parentTitle) + mli.setProperty('disc', str(disc)) + mli.setProperty('album', self.album.title) + mli.setProperty('number', '{0:0>2}'.format(track.index)) + items.append(mli) + idx += 1 + + if items: + items[-1].setProperty('is.footer', '1') + + self.trackListControl.replaceItems(items) diff --git a/script.plexmod/lib/windows/userselect.py b/script.plexmod/lib/windows/userselect.py new file mode 100644 index 000000000..c659276a9 --- /dev/null +++ b/script.plexmod/lib/windows/userselect.py @@ -0,0 +1,234 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui + +from . import kodigui +from . import dropdown +from . import busy + +from lib import util, image, backgroundthread +from plexnet import plexapp + +from lib.util import T + + +class UserThumbTask(backgroundthread.Task): + def setup(self, users, callback): + self.users = users + self.callback = callback + return self + + def run(self): + for user in self.users: + if self.isCanceled(): + return + + thumb, back = image.getImage(user.thumb, user.id) + self.callback(user, thumb, back) + + +class UserSelectWindow(kodigui.BaseWindow): + xmlFile = 'script-plex-user_select.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + USER_LIST_ID = 101 + PIN_ENTRY_GROUP_ID = 400 + SHUTDOWN_BUTTON_ID = 500 + + def __init__(self, *args, **kwargs): + self.task = None + self.selected = False + kodigui.BaseWindow.__init__(self, *args, **kwargs) + + def onFirstInit(self): + self.userList = kodigui.ManagedControlList(self, self.USER_LIST_ID, 6) + + self.start() + + def onAction(self, action): + try: + ID = action.getId() + if 57 < ID < 68: + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.PIN_ENTRY_GROUP_ID)): + item = self.userList.getSelectedItem() + if not item.dataSource.isProtected: + return + self.setFocusId(self.PIN_ENTRY_GROUP_ID) + self.pinEntryClicked(ID + 142) + return + elif 142 <= ID <= 149: # JumpSMS action + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.PIN_ENTRY_GROUP_ID)): + item = self.userList.getSelectedItem() + if not item.dataSource.isProtected: + return + self.setFocusId(self.PIN_ENTRY_GROUP_ID) + self.pinEntryClicked(ID + 60) + return + elif ID in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_BACKSPACE): + item = self.userList.getSelectedItem() + if xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.PIN_ENTRY_GROUP_ID)): + if item.getProperty('editing.pin'): + self.pinEntryClicked(211) + else: + self.setFocusId(self.USER_LIST_ID) + return + # return to selected user + self.selected = 'cancel' + self.doClose() + return + except: + util.ERROR() + + kodigui.BaseWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.USER_LIST_ID: + item = self.userList.getSelectedItem() + if item.dataSource.isProtected: + self.setFocusId(self.PIN_ENTRY_GROUP_ID) + else: + self.userSelected(item) + elif 200 < controlID < 212: + self.pinEntryClicked(controlID) + elif controlID == self.SHUTDOWN_BUTTON_ID: + self.shutdownClicked() + + def onFocus(self, controlID): + if controlID == self.USER_LIST_ID: + item = self.userList.getSelectedItem() + item.setProperty('editing.pin', '') + + def userThumbCallback(self, user, thumb, back): + item = self.userList.getListItemByDataSource(user) + if item: + item.setThumbnailImage(thumb) + item.setProperty('back.image', back) + + def start(self): + self.setProperty('busy', '1') + try: + users = plexapp.ACCOUNT.homeUsers + + items = [] + selectIndex = None + for idx, user in enumerate(users): + # thumb, back = image.getImage(user.thumb, user.id) + # mli = kodigui.ManagedListItem(user.title, thumbnailImage=thumb, data_source=user) + mli = kodigui.ManagedListItem(user.title, user.title[0].upper(), data_source=user) + mli.setProperty('pin', user.title) + # mli.setProperty('back.image', back) + mli.setProperty('protected', user.isProtected and '1' or '') + mli.setProperty('admin', user.isAdmin and '1' or '') + + if plexapp.ACCOUNT.ID == user.id: + selectIndex = idx + + items.append(mli) + + self.userList.addItems(items) + + self.task = UserThumbTask().setup(users, self.userThumbCallback) + backgroundthread.BGThreader.addTask(self.task) + + self.setFocusId(self.USER_LIST_ID) + + if selectIndex is not None: + self.userList.setSelectedItemByPos(selectIndex) + + self.setProperty('initialized', '1') + finally: + self.setProperty('busy', '') + + def shutdownClicked(self): + options = [] + options.append({'key': 'sign_out', 'display': T(32421, 'Sign Out')}) + options.append({'key': 'exit', 'display': T(32422, 'Exit')}) + if util.getSetting('kiosk.mode', False): + if xbmc.getCondVisibility('System.CanPowerDown'): + options.append({'key': 'shutdown', 'display': T(32423, 'Shutdown')}) + if xbmc.getCondVisibility('System.CanSuspend'): + options.append({'key': 'suspend', 'display': T(32424, 'Suspend')}) + if xbmc.getCondVisibility('System.CanHibernate'): + options.append({'key': 'hibernate', 'display': T(32425, 'Hibernate')}) + if xbmc.getCondVisibility('System.CanReboot'): + options.append({'key': 'reboot', 'display': T(32426, 'Reboot')}) + + with self.propertyContext('dropdown'): + choice = dropdown.showDropdown(options, (60, 101)) + if not choice: + return + + if choice['key'] == 'sign_out': + self.selected = 'signout' + self.doClose() + elif choice['key'] == 'exit': + self.doClose() + elif choice['key'] == 'shutdown': + xbmc.executebuiltin('Powerdown()') + elif choice['key'] == 'suspend': + xbmc.executebuiltin('Suspend()') + elif choice['key'] == 'hibernate': + xbmc.executebuiltin('Hibernate()') + elif choice['key'] == 'reboot': + xbmc.executebuiltin('Reset()') + + def pinEntryClicked(self, controlID): + item = self.userList.getSelectedItem() + if item.getProperty('editing.pin'): + pin = item.getProperty('editing.pin') + else: + pin = '' + + if len(pin) > 3: + return + + if controlID < 210: + pin += str(controlID - 200) + elif controlID == 210: + pin += '0' + elif controlID == 211: + pin = pin[:-1] + + if pin: + item.setProperty('pin', ' '.join(list(u"\u2022" * len(pin)))) + item.setProperty('editing.pin', pin) + if len(pin) > 3: + self.userSelected(item, pin) + else: + item.setProperty('pin', item.dataSource.title) + item.setProperty('editing.pin', '') + + @busy.dialog() + def userSelected(self, item, pin=None): + user = item.dataSource + # xbmc.sleep(500) + util.DEBUG_LOG('Home user selected: {0}'.format(user)) + + from lib import plex + with plex.CallbackEvent(plexapp.util.APP, 'account:response') as e: + if plexapp.ACCOUNT.switchHomeUser(user.id, pin) and plexapp.ACCOUNT.switchUser: + util.DEBUG_LOG('Waiting for user change...') + else: + e.close() + item.setProperty('pin', item.dataSource.title) + item.setProperty('editing.pin', '') + util.messageDialog(T(32427, 'Failed'), T(32926, 'Wrong pin entered!')) + return + + self.selected = True + self.doClose() + + def finished(self): + if self.task: + self.task.cancel() + + +def start(): + w = UserSelectWindow.open() + selected = w.selected + del w + return selected diff --git a/script.plexmod/lib/windows/videoplayer.py b/script.plexmod/lib/windows/videoplayer.py new file mode 100644 index 000000000..0e36426cd --- /dev/null +++ b/script.plexmod/lib/windows/videoplayer.py @@ -0,0 +1,596 @@ +from __future__ import absolute_import +import time +import threading +import math + +from kodi_six import xbmc +from kodi_six import xbmcgui + +from . import kodigui +from . import windowutils +from . import opener +from . import busy +from . import search +from . import dropdown +from . import pagination + +from lib import util +from lib import player +from lib import colors + +from lib.util import T + + +PASSOUT_PROTECTION_DURATION_SECONDS = 7200 +PASSOUT_LAST_VIDEO_DURATION_MILLIS = 1200000 + + +class RelatedPaginator(pagination.BaseRelatedPaginator): + def readyForPaging(self): + return self.parentWindow.postPlayInitialized + + def getData(self, offset, amount): + return (self.parentWindow.prev or self.parentWindow.next).getRelated(offset=offset, limit=amount) + + +class OnDeckPaginator(pagination.MCLPaginator): + def readyForPaging(self): + return self.parentWindow.postPlayInitialized + + thumbFallback = lambda self, rel: 'script.plex/thumb_fallbacks/{0}.png'.format( + rel.type in ('show', 'season', 'episode') and 'show' or 'movie') + + def prepareListItem(self, data, mli): + mli.setProperty('progress', util.getProgressImage(mli.dataSource)) + mli.setProperty('unwatched', not mli.dataSource.isWatched and '1' or '') + + if data.type in 'episode': + mli.setLabel2( + u'{0}{1} \u2022 {2}{3}'.format(T(32310, 'S'), data.parentIndex, T(32311, 'E'), data.index)) + else: + mli.setLabel2(data.year) + + def createListItem(self, ondeck): + title = ondeck.grandparentTitle or ondeck.title + if ondeck.type == 'episode': + thumb = ondeck.thumb.asTranscodedImageURL(*self.parentWindow.ONDECK_DIM) + else: + thumb = ondeck.defaultArt.asTranscodedImageURL(*self.parentWindow.ONDECK_DIM) + + mli = kodigui.ManagedListItem(title or '', thumbnailImage=thumb, data_source=ondeck) + if mli: + return mli + + def getData(self, offset, amount): + return (self.parentWindow.prev or self.parentWindow.next).sectionOnDeck(offset=offset, limit=amount) + + +class VideoPlayerWindow(kodigui.ControlledWindow, windowutils.UtilMixin): + xmlFile = 'script-plex-video_player.xml' + path = util.ADDON.getAddonInfo('path') + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + NEXT_DIM = util.scaleResolution(537, 303) + PREV_DIM = util.scaleResolution(462, 259) + ONDECK_DIM = util.scaleResolution(329, 185) + RELATED_DIM = util.scaleResolution(268, 397) + ROLES_DIM = util.scaleResolution(334, 334) + + OPTIONS_GROUP_ID = 200 + + PREV_BUTTON_ID = 101 + NEXT_BUTTON_ID = 102 + + ONDECK_LIST_ID = 400 + RELATED_LIST_ID = 401 + ROLES_LIST_ID = 403 + + HOME_BUTTON_ID = 201 + SEARCH_BUTTON_ID = 202 + + PLAYER_STATUS_BUTTON_ID = 204 + + def __init__(self, *args, **kwargs): + kodigui.ControlledWindow.__init__(self, *args, **kwargs) + windowutils.UtilMixin.__init__(self) + self.playQueue = kwargs.get('play_queue') + self.video = kwargs.get('video') + self.resume = bool(kwargs.get('resume')) + + self.postPlayMode = False + self.prev = None + self.playlist = None + self.handler = None + self.next = None + self.videos = None + self.trailer = None + self.aborted = True + self.timeout = None + self.passoutProtection = 0 + self.postPlayInitialized = False + self.relatedPaginator = None + self.onDeckPaginator = None + self.lastFocusID = None + self.lastNonOptionsFocusID = None + self.playBackStarted = False + + def doClose(self): + util.DEBUG_LOG('VideoPlayerWindow: Closing') + self.timeout = None + self.relatedPaginator = None + self.onDeckPaginator = None + kodigui.ControlledWindow.doClose(self) + player.PLAYER.handler.sessionEnded() + + def onFirstInit(self): + player.PLAYER.on('session.ended', self.sessionEnded) + player.PLAYER.on('av.started', self.playerPlaybackStarted) + player.PLAYER.on('post.play', self.postPlay) + player.PLAYER.on('change.background', self.changeBackground) + + self.onDeckListControl = kodigui.ManagedControlList(self, self.ONDECK_LIST_ID, 5) + self.relatedListControl = kodigui.ManagedControlList(self, self.RELATED_LIST_ID, 5) + self.rolesListControl = kodigui.ManagedControlList(self, self.ROLES_LIST_ID, 5) + + util.DEBUG_LOG('VideoPlayerWindow: Starting session (ID: {0})'.format(id(self))) + self.resetPassoutProtection() + self.play(resume=self.resume) + + def onReInit(self): + self.setBackground() + + def onAction(self, action): + try: + if self.postPlayMode: + controlID = self.getFocusId() + + self.cancelTimer() + self.resetPassoutProtection() + if action in(xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_CONTEXT_MENU): + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.OPTIONS_GROUP_ID)): + if not util.advancedSettings.fastBack or action == xbmcgui.ACTION_CONTEXT_MENU: + self.lastNonOptionsFocusID = self.lastFocusID + self.setFocusId(self.OPTIONS_GROUP_ID) + return + else: + if self.lastNonOptionsFocusID and action == xbmcgui.ACTION_CONTEXT_MENU: + self.setFocusId(self.lastNonOptionsFocusID) + self.lastNonOptionsFocusID = None + return + + if action in(xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_PREVIOUS_MENU): + self.doClose() + return + + if action in (xbmcgui.ACTION_NEXT_ITEM, xbmcgui.ACTION_PLAYER_PLAY): + self.playVideo() + elif action == xbmcgui.ACTION_PREV_ITEM: + self.playVideo(prev=True) + elif action == xbmcgui.ACTION_STOP: + self.doClose() + + if controlID == self.RELATED_LIST_ID: + if self.relatedPaginator.boundaryHit: + self.relatedPaginator.paginate() + return + + elif controlID == self.ONDECK_LIST_ID: + if self.onDeckPaginator.boundaryHit: + self.onDeckPaginator.paginate() + return + except: + util.ERROR() + + kodigui.ControlledWindow.onAction(self, action) + + def playerPlaybackStarted(self, *args, **kwargs): + self.playBackStarted = True + + def onClick(self, controlID): + if not self.postPlayMode: + return + + timeoutCanceled = False + if util.advancedSettings.postplayCancel: + timeoutCanceled = bool(self.timeout) + self.cancelTimer() + + if controlID == self.HOME_BUTTON_ID: + self.goHome() + elif controlID == self.ONDECK_LIST_ID: + self.openItem(self.onDeckListControl) + elif controlID == self.RELATED_LIST_ID: + self.openItem(self.relatedListControl) + elif controlID == self.ROLES_LIST_ID: + self.roleClicked() + elif controlID == self.PREV_BUTTON_ID: + self.playVideo(prev=True) + elif controlID == self.NEXT_BUTTON_ID: + if not timeoutCanceled: + self.playVideo() + elif controlID == self.PLAYER_STATUS_BUTTON_ID: + self.showAudioPlayer() + elif controlID == self.SEARCH_BUTTON_ID: + self.searchButtonClicked() + + def onFocus(self, controlID): + if not self.postPlayMode: + return + + self.lastFocusID = controlID + + if 399 < controlID < 500: + self.setProperty('hub.focus', str(controlID - 400)) + else: + self.setProperty('hub.focus', '') + + if xbmc.getCondVisibility('Control.HasFocus(101) | Control.HasFocus(102) | ControlGroup(200).HasFocus(0)'): + self.setProperty('on.extras', '') + elif xbmc.getCondVisibility('ControlGroup(60).HasFocus(0)'): + self.setProperty('on.extras', '1') + + def searchButtonClicked(self): + self.processCommand(search.dialog(self, section_id=self.prev.getLibrarySectionId() or None)) + + def roleClicked(self): + mli = self.rolesListControl.getSelectedItem() + if not mli: + return + + sectionRoles = busy.widthDialog(mli.dataSource.sectionRoles, '') + + if not sectionRoles: + util.DEBUG_LOG('No sections found for actor') + return + + if len(sectionRoles) > 1: + x, y = self.getRoleItemDDPosition() + + options = [{'role': r, 'display': r.reasonTitle} for r in sectionRoles] + choice = dropdown.showDropdown(options, (x, y), pos_is_bottom=True, close_direction='bottom') + + if not choice: + return + + role = choice['role'] + else: + role = sectionRoles[0] + + self.processCommand(opener.open(role)) + + def getRoleItemDDPosition(self): + y = 1000 + if xbmc.getCondVisibility('Control.IsVisible(500)'): + y += 360 + if xbmc.getCondVisibility('Control.IsVisible(501)'): + y += 520 + if xbmc.getCondVisibility('!String.IsEmpty(Window.Property(on.extras))'): + y -= 300 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),0) + Control.IsVisible(500)'): + y -= 500 + if xbmc.getCondVisibility('Integer.IsGreater(Window.Property(hub.focus),1) + Control.IsVisible(501)'): + y -= 500 + + focus = int(xbmc.getInfoLabel('Container(403).Position')) + + x = ((focus + 1) * 304) - 100 + return x, y + + def setBackground(self): + video = self.video if self.video else self.playQueue.current() + self.windowSetBackground(video.defaultArt.asTranscodedImageURL(1920, 1080, opacity=60, + background=colors.noAlpha.Background)) + + def changeBackground(self, url, **kwargs): + self.windowSetBackground(url) + + def sessionEnded(self, session_id=None, **kwargs): + if session_id != id(self): + util.DEBUG_LOG('VideoPlayerWindow: Ignoring session end (ID: {0} - SessionID: {1})'.format(id(self), session_id)) + return + + util.DEBUG_LOG('VideoPlayerWindow: Session ended - closing (ID: {0})'.format(id(self))) + self.doClose() + + def play(self, resume=False, handler=None): + self.hidePostPlay() + + self.setBackground() + if self.playQueue: + player.PLAYER.playVideoPlaylist(self.playQueue, resume=self.resume, session_id=id(self), handler=handler) + elif self.video: + player.PLAYER.playVideo(self.video, resume=self.resume, force_update=True, session_id=id(self), handler=handler) + + def openItem(self, control=None, item=None): + if not item: + mli = control.getSelectedItem() + if not mli: + return + item = mli.dataSource + + self.processCommand(opener.open(item)) + + def showPostPlay(self): + self.postPlayMode = True + self.setProperty('post.play', '1') + + def hidePostPlay(self): + self.postPlayMode = False + self.setProperty('post.play', '') + self.setProperties(( + 'post.play.background', + 'info.title', + 'info.duration', + 'info.summary', + 'info.date', + 'next.thumb', + 'next.title', + 'next.subtitle', + 'prev.thumb', + 'prev.title', + 'prev.subtitle', + 'related.header', + 'has.next' + ), '') + + self.onDeckListControl.reset() + self.relatedListControl.reset() + self.rolesListControl.reset() + + @busy.dialog() + def postPlay(self, video=None, playlist=None, handler=None, stoppedInBingeMode=False, **kwargs): + util.DEBUG_LOG('VideoPlayer: Starting post-play') + self.showPostPlay() + self.prev = video + self.playlist = playlist + self.handler = handler + + self.getHubs() + + self.setProperty( + 'thumb.fallback', 'script.plex/thumb_fallbacks/{0}.png'.format(self.prev.type in ('show', 'season', 'episode') and 'show' or 'movie') + ) + + util.DEBUG_LOG('PostPlay: Showing video info') + if self.next: + self.next.reload(includeExtras=1, includeExtrasCount=10) + + self.relatedPaginator = RelatedPaginator(self.relatedListControl, + leaf_count=int((self.prev or self.next).relatedCount), + parent_window=self) + + vid = self.prev or self.next + if vid.sectionOnDeckCount: + self.onDeckPaginator = OnDeckPaginator(self.onDeckListControl, + leaf_count=int(vid.sectionOnDeckCount), + parent_window=self) + + self.setInfo() + self.fillOnDeck() + hasPrev = self.fillRelated() + self.fillRoles(hasPrev) + + if not stoppedInBingeMode: + self.startTimer() + + if self.next: + self.setFocusId(self.NEXT_BUTTON_ID) + else: + self.setFocusId(self.PREV_BUTTON_ID) + self.postPlayInitialized = True + + def resetPassoutProtection(self): + self.passoutProtection = time.time() + PASSOUT_PROTECTION_DURATION_SECONDS + + def startTimer(self): + if not util.getUserSetting('post_play_auto', True): + util.DEBUG_LOG('Post play auto-play disabled') + return + + if not self.next: + return + + if time.time() > self.passoutProtection and self.prev.duration.asInt() > PASSOUT_LAST_VIDEO_DURATION_MILLIS: + util.DEBUG_LOG('Post play auto-play skipped: Passout protection') + return + else: + millis = (self.passoutProtection - time.time()) * 1000 + util.DEBUG_LOG('Post play auto-play: Passout protection in {0}'.format(util.durationToShortText(millis))) + + self.timeout = time.time() + abs(util.advancedSettings.postplayTimeout) + util.DEBUG_LOG('Starting post-play timer until: %i' % self.timeout) + threading.Thread(target=self.countdown).start() + + def cancelTimer(self): + if self.timeout is not None: + util.DEBUG_LOG('Canceling post-play timer') + + self.timeout = None + self.setProperty('countdown', '') + + def countdown(self): + while self.timeout and not util.MONITOR.waitForAbort(0.1): + now = time.time() + if self.timeout and now > self.timeout: + self.timeout = None + self.setProperty('countdown', '') + util.DEBUG_LOG('Post-play timer finished') + # This works. The direct method caused the OSD to be broken, possibly because it was triggered from another thread? + # That was the only real difference I could see between the direct method and the user actually clicking the button. + xbmc.executebuiltin('SendClick(,{0})'.format(self.NEXT_BUTTON_ID)) + # Direct method, causes issues with OSD + # self.playVideo() + break + elif self.timeout is not None: + cd = min(abs(util.advancedSettings.postplayTimeout-1), int((self.timeout or now) - now)) + base = 15 / float(util.advancedSettings.postplayTimeout-1) + self.setProperty('countdown', str(int(math.ceil(base*cd)))) + + def getHubs(self): + try: + self.hubs = self.prev.postPlay() + except: + util.ERROR("No data - disconnected?", notify=True, time_ms=5000) + self.doClose() + return + + self.next = None + + if self.playlist: + if self.prev != self.playlist.current(): + self.next = self.playlist.current() + else: + if self.prev.type == 'episode' and 'tv.upnext' in self.hubs: + self.next = self.hubs['tv.upnext'].items[-1] + + if self.next: + self.setProperty('has.next', '1') + + def setInfo(self): + if self.next: + self.setProperty( + 'post.play.background', + util.backgroundFromArt(self.next.art, width=self.width, height=self.height) + ) + self.setProperty('info.title', self.next.title) + self.setProperty('info.duration', util.durationToText(self.next.duration.asInt())) + self.setProperty('info.summary', self.next.summary) + + if self.prev: + self.setProperty( + 'post.play.background', + util.backgroundFromArt(self.prev.art, width=self.width, height=self.height) + ) + self.setProperty('prev.info.title', self.prev.title) + self.setProperty('prev.info.duration', util.durationToText(self.prev.duration.asInt())) + self.setProperty('prev.info.summary', self.prev.summary) + + if self.prev.type == 'episode': + self.setProperty('related.header', T(32306, 'Related Shows')) + if self.next: + self.setProperty('next.thumb', self.next.thumb.asTranscodedImageURL(*self.NEXT_DIM)) + self.setProperty('info.date', util.cleanLeadingZeros(self.next.originallyAvailableAt.asDatetime('%B %d, %Y'))) + + self.setProperty('next.title', self.next.grandparentTitle) + self.setProperty( + 'next.subtitle', u'{0} {1} \u2022 {2} {3}'.format(T(32303, 'Season'), self.next.parentIndex, T(32304, 'Episode'), self.next.index) + ) + if self.prev: + self.setProperty('prev.thumb', self.prev.thumb.asTranscodedImageURL(*self.PREV_DIM)) + self.setProperty('prev.title', self.prev.grandparentTitle) + self.setProperty( + 'prev.subtitle', u'{0} {1} \u2022 {2} {3}'.format(T(32303, 'Season'), self.prev.parentIndex, T(32304, 'Episode'), self.prev.index) + ) + self.setProperty('prev.info.date', util.cleanLeadingZeros(self.prev.originallyAvailableAt.asDatetime('%B %d, %Y'))) + elif self.prev.type == 'movie': + self.setProperty('related.header', T(32404, 'Related Movies')) + if self.next: + self.setProperty('next.thumb', self.next.defaultArt.asTranscodedImageURL(*self.NEXT_DIM)) + self.setProperty('info.date', self.next.year) + + self.setProperty('next.title', self.next.title) + self.setProperty('next.subtitle', self.next.year) + if self.prev: + self.setProperty('prev.thumb', self.prev.defaultArt.asTranscodedImageURL(*self.PREV_DIM)) + self.setProperty('prev.title', self.prev.title) + self.setProperty('prev.subtitle', self.prev.year) + self.setProperty('prev.info.date', self.prev.year) + + def fillOnDeck(self): + if not self.onDeckPaginator: + return False + + if not self.onDeckPaginator.leafCount: + self.onDeckPaginator.reset() + return False + + items = self.onDeckPaginator.paginate() + + if not items: + return False + + return True + + def fillRelated(self, has_prev=False): + if not self.relatedPaginator.leafCount: + self.relatedListControl.reset() + return False + + items = self.relatedPaginator.paginate() + + if not items: + return False + + self.setProperty('divider.{0}'.format(self.RELATED_LIST_ID), has_prev and '1' or '') + return True + + def fillRoles(self, has_prev=False): + items = [] + idx = 0 + + video = self.next if self.next else self.prev + + if not video.roles: + self.rolesListControl.reset() + return False + + for role in video.roles(): + mli = kodigui.ManagedListItem(role.tag, role.role, thumbnailImage=role.thumb.asTranscodedImageURL(*self.ROLES_DIM), data_source=role) + mli.setProperty('index', str(idx)) + items.append(mli) + idx += 1 + + if not items: + return False + + self.setProperty('divider.{0}'.format(self.ROLES_LIST_ID), has_prev and '1' or '') + + self.rolesListControl.reset() + self.rolesListControl.addItems(items) + return True + + def playVideo(self, prev=False): + self.cancelTimer() + try: + if not self.next and self.playlist: + if prev: + self.playlist.prev() + self.aborted = False + self.playQueue = self.playlist + self.video = None + self.play(handler=self.handler) + else: + video = self.next + if prev: + video = self.prev + + if not video: + util.DEBUG_LOG('Trying to play next video with no next video available') + self.video = None + return + + self.playQueue = None + self.video = video + self.play(handler=self.handler) + except: + util.ERROR() + + +def play(video=None, play_queue=None, resume=False): + try: + w = VideoPlayerWindow.open(video=video, play_queue=play_queue, resume=resume) + except util.NoDataException: + raise + finally: + player.PLAYER.off('session.ended', w.sessionEnded) + player.PLAYER.off('post.play', w.postPlay) + player.PLAYER.off('av.started', w.playerPlaybackStarted) + player.PLAYER.off('change.background', w.changeBackground) + player.PLAYER.reset() + command = w.exitCommand + del w + util.garbageCollect() + return command diff --git a/script.plexmod/lib/windows/windowutils.py b/script.plexmod/lib/windows/windowutils.py new file mode 100644 index 000000000..9914d8c87 --- /dev/null +++ b/script.plexmod/lib/windows/windowutils.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import +from lib import util +from . import opener +from . import dropdown + +from lib.util import T + + +HOME = None + + +class UtilMixin(): + def __init__(self): + self.exitCommand = None + + def goHome(self, section=None): + HOME.show() + if section: + self.closeWithCommand('HOME:{0}'.format(section)) + else: + self.closeWithCommand('HOME') + + def openItem(self, obj): + self.processCommand(opener.open(obj)) + + def openWindow(self, window_class, **kwargs): + self.processCommand(opener.handleOpen(window_class, **kwargs)) + + def processCommand(self, command): + if command and command.startswith('HOME'): + self.exitCommand = command + self.doClose() + elif command and command == "NODATA": + raise util.NoDataException + + def closeWithCommand(self, command): + self.exitCommand = command + self.doClose() + + def showAudioPlayer(self, **kwargs): + from . import musicplayer + self.processCommand(opener.handleOpen(musicplayer.MusicPlayerWindow, **kwargs)) + + def getPlaylistResume(self, pl, items, title): + resume = False + watched = False + for i in items: + if (watched and not i.isWatched) or i.get('viewOffset').asInt(): + if i.get('viewOffset'): + choice = dropdown.showDropdown( + options=[ + {'key': 'resume', 'display': T(32429, 'Resume from {0}').format(util.timeDisplay(i.viewOffset.asInt()).lstrip('0').lstrip(':'))}, + {'key': 'play', 'display': T(32317, 'Play from beginning')} + ], + pos=(660, 441), + close_direction='none', + set_dropdown_prop=False, + header=u'{0} - {1}{2} \u2022 {3}{4}'.format(title, T(32310, 'S'), i.parentIndex, T(32311, 'E'), i.index) + ) + + if not choice: + return None + + if choice['key'] == 'resume': + resume = True + + pl.setCurrent(i) + break + elif i.isWatched: + watched = True + else: + break + + return resume + + +def shutdownHome(): + global HOME + if HOME: + HOME._shuttingDown = True + HOME.shutdown() + del HOME + HOME = None + HOME diff --git a/script.plexmod/plugin.py b/script.plexmod/plugin.py new file mode 100644 index 000000000..6e2eec66e --- /dev/null +++ b/script.plexmod/plugin.py @@ -0,0 +1,75 @@ +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcplugin +from kodi_six import xbmcgui +import sys +import base64 +from lib import _included_packages, plex, util +from plexnet import audio, plexplayer, plexapp +from plexnet import util as plexnetUtil + +HANDLE = int(sys.argv[1]) + +BASE_LOG = util.LOG + + +def LOG(msg): + BASE_LOG('(plugin) - {0}'.format(plexnetUtil.cleanToken(msg))) + + +util.LOG = LOG + + +def playTrack(track): + track.reload() + apobj = plexplayer.PlexAudioPlayer(track) + url = apobj.build()['url'] + url = util.addURLParams(url, { + 'X-Plex-Client-Profile-Name': 'Generic', + 'X-Plex-Client-Identifier': plexapp.util.INTERFACE.getGlobal('clientIdentifier') + }) + LOG('Playing URL: {0}'.format(url)) + + return xbmcgui.ListItem(path=url) + + +def playVideo(video): + return None + + +def play(data): + try: + from plexnet import plexobjects + + plexObject = plexobjects.PlexObject.deSerialize(base64.urlsafe_b64decode(data.encode('utf-8'))) + + if plexObject.type == 'track': + listitem = playTrack(plexObject) + elif plexObject.type in ('episode', 'movie', 'clip'): + listitem = playVideo(plexObject) + except: + util.ERROR() + xbmcplugin.setResolvedUrl(HANDLE, False, None) + return + + xbmcplugin.setResolvedUrl(HANDLE, True, listitem) + + +def main(): + try: + if len(sys.argv) < 3: + return + + path = sys.argv[0].split('/', 3)[-1] + data = sys.argv[2].lstrip('?') + + if path == 'play': + play(data) + else: # This is a hack since it's both a plugin and a script. My Addons and Shortcuts otherwise can't launch the add-on + xbmc.executebuiltin('Action(back)') # This sometimes works to back out of the plugin directory display + xbmc.executebuiltin('RunScript(script.plexmod)') + except: + util.ERROR() + + +main() diff --git a/script.plexmod/pm4k_cache_template.xml b/script.plexmod/pm4k_cache_template.xml new file mode 100644 index 000000000..82ad94e32 --- /dev/null +++ b/script.plexmod/pm4k_cache_template.xml @@ -0,0 +1,5 @@ + + 1 + {memorysize} + {readfactor} + \ No newline at end of file diff --git a/script.plexmod/resources/language/resource.language.cs_cz/strings.po b/script.plexmod/resources/language/resource.language.cs_cz/strings.po new file mode 100644 index 000000000..189e635a4 --- /dev/null +++ b/script.plexmod/resources/language/resource.language.cs_cz/strings.po @@ -0,0 +1,927 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: 2017-02-04 14:36+0100\n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: cs\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Last-Translator: Michal Kuncl \n" +"X-Generator: Poedit 2.0beta2\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Hlavní" + +msgctxt "#32001" +msgid "Original" +msgstr "Originální" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mb/s 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mb/s 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mb/s 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mb/s 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mb/s 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mb/s 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mb/s 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mb/s 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kb/s" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kb/s" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kb/s" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kb/s" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kb/s" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Místní kvalita" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Vzdálená kvalita" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Online kvalita" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Formát překódování" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Ladící záznamy" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Povolit přímé přehrávání" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Povolit přímé streamování" + +msgctxt "#32027" +msgid "Force" +msgstr "Vynutit" + +msgctxt "#32028" +msgid "Always" +msgstr "Vždy" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Pouze obrázkové formáty" + +msgctxt "#32030" +msgid "Auto" +msgstr "Automaticky" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Vpálit titulky (pouze přímá přehrávání)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Povolit nezabezpečené připojení" + +msgctxt "#32033" +msgid "Never" +msgstr "Nikdy" + +msgctxt "#32034" +msgid "On Same network" +msgstr "Pouze na stejné síti" + +msgctxt "#32035" +msgid "Always" +msgstr "Vždy" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "Povolit 4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "Povolit HEVC (H265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Automaticky přihlašovat" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Automatické přehrání po skončení" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Povolit stahování titulků" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Povolit stahování titulků" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Objevení serveru (GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Spustit plex při spuštění Kodi" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "IP připojení 1" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Port připojení 1" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "IP připojení 2" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Port připojení 2" + +msgctxt "#32048" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Rozšířené" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Ruční servery" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Soukromí" + +msgctxt "#32052" +msgid "About" +msgstr "O doplňku" + +msgctxt "#32053" +msgid "Video" +msgstr "Video" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Verze doplňku" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Verze Kodi" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Rozlišení obrazovky" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Verze serveru" + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Při spuštění přeskočit výběr uživatele a zadávání pinu." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Pokud povolíte, po zkončení přehrávání se automaticky přehraje položka ze seznamu 'Následující' po prodlevě 15 sekund." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Povolte pokud váš hardware zvládne přehrávat 4K videa. Zakázáním vynutíte překódování." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Povolte pokud váš hardware zvládne přehrávat formát HEVC/H265. Zakázáním vynutíte překódování." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Kdy se připojovat k serverům přes nezabezpečené připojení.[CR][CR]* [B]Nikdy[/B]: Nepoužívat nezabezpečená připojení[CR]* [B]Na stejné síti[/B]: Povolte pokud jste na stejné síti jako server[CR]* [B]Vždy[/B]: Povolí na stejné síti a při vzdálených připojeních" + +msgctxt "#32201" +msgid "Trailer" +msgstr "Ukázka" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Smazaná scéna" + +msgctxt "#32203" +msgid "Interview" +msgstr "Rozhovor" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Videoklip" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "Ze zákulisí" + +msgctxt "#32206" +msgid "Scene" +msgstr "Scéna" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Živý videoklip" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Videoklip s textem" + +msgctxt "#32209" +msgid "Concert" +msgstr "Koncert" + +msgctxt "#32210" +msgid "Featurette" +msgstr "" + +msgctxt "#32211" +msgid "Short" +msgstr "Krátký film" + +msgctxt "#32212" +msgid "Other" +msgstr "Jiný" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Přejít na album" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Přejít na interpreta" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Přejít na {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Sezóna" + +msgctxt "#32304" +msgid "Episode" +msgstr "Epizoda" + +msgctxt "#32305" +msgid "Extras" +msgstr "Extra" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Podobné seriály" + +msgctxt "#32307" +msgid "More" +msgstr "Více" + +msgctxt "#32308" +msgid "Available" +msgstr "K dispozici" + +msgctxt "#32309" +msgid "None" +msgstr "Žádné" + +msgctxt "#32310" +msgid "S" +msgstr "" + +msgctxt "#32311" +msgid "E" +msgstr "" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "Není k dispozici" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Tato položka momentálně není k dispozici" + +msgctxt "#32314" +msgid "In Progress" +msgstr "Rozkoukané" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Pokračovat v přehrávání?" + +msgctxt "#32316" +msgid "Resume" +msgstr "Pokračovat" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Přehrát od začátku" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Označit jako neshlédnuté" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Označit jako shlédnuté" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Označit sezónu jako neshlédnutou" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Označit sezónu jako shlédnutou" + +msgctxt "#32322" +msgid "Delete" +msgstr "Smazat" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Přejít na seriál" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Přejít na {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Přehrát další" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Opravdu smazat?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Opravdu chcete smazat tyto média?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Ano" + +msgctxt "#32329" +msgid "No" +msgstr "Ne" + +msgctxt "#32330" +msgid "Message" +msgstr "Zpráva" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Při mazání média se vyskytla chyba." + +msgctxt "#32332" +msgid "Home" +msgstr "Domů" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Playlisty" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Potvrdit odchod" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Opravdu chcete odejít z Plexu?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Odejít" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Zrušit" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Nenalezeny žádné servery" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Server je nedostupný" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Probíhají zkoušky připojení. Prosím počkejte." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Server je nedostupný. Prosím přihlašte se ke svému serveru a zkontrolujte připojení." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Přepnout uživatele" + +msgctxt "#32343" +msgid "Settings" +msgstr "Nastavení" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Odhlásit" + +msgctxt "#32345" +msgid "All" +msgstr "Všechno" + +msgctxt "#32346" +msgid "By Name" +msgstr "Podle názvu" + +msgctxt "#32347" +msgid "artists" +msgstr "interpreti" + +msgctxt "#32348" +msgid "movies" +msgstr "filmy" + +msgctxt "#32349" +msgid "photos" +msgstr "fotky" + +msgctxt "#32350" +msgid "shows" +msgstr "seriály" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "Podle data přidání" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Datum přidání" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "Podle data vydání" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Datum vydání" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Podle data shlédnutí" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Datum shlédnutí" + +msgctxt "#32357" +msgid "By Name" +msgstr "Podle názvu" + +msgctxt "#32358" +msgid "Name" +msgstr "Název" + +msgctxt "#32359" +msgid "By Rating" +msgstr "Podle hodnocení" + +msgctxt "#32360" +msgid "Rating" +msgstr "Hodnocení" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "Podle rozlišení" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Rozlišení" + +msgctxt "#32363" +msgid "By Duration" +msgstr "Podle délky" + +msgctxt "#32364" +msgid "Duration" +msgstr "Délka" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "Podle prvního vysílání" + +msgctxt "#32366" +msgid "First Aired" +msgstr "První vysílání" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Podle neshlédnutí" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Neshlédnuté" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "Podle data přehrání" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Datum přehrání" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "Podle počtu přehrání" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Počet přehrání" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Podle data pořízení" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Datum pořízení" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Filtry nejsou k dispozici" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Odstranit filtr" + +msgctxt "#32377" +msgid "Year" +msgstr "Rok" + +msgctxt "#32378" +msgid "Decade" +msgstr "Desetiletí" + +msgctxt "#32379" +msgid "Genre" +msgstr "Žánr" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Hodnocení obsahu" + +msgctxt "#32381" +msgid "Network" +msgstr "Stanice" + +msgctxt "#32382" +msgid "Collection" +msgstr "Kolekce" + +msgctxt "#32383" +msgid "Director" +msgstr "Režie" + +msgctxt "#32384" +msgid "Actor" +msgstr "Herci" + +msgctxt "#32385" +msgid "Country" +msgstr "Země" + +msgctxt "#32386" +msgid "Studio" +msgstr "Studio" + +msgctxt "#32387" +msgid "Labels" +msgstr "Popisky" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Výrobce kamery" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Model kamery" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Clona" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Rychlost závěrky" + +msgctxt "#32392" +msgid "Lens" +msgstr "Čočka" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Seriály" + +msgctxt "#32394" +msgid "Music" +msgstr "Hudba" + +msgctxt "#32395" +msgid "Audio" +msgstr "Zvuková stopa" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Titulky" + +msgctxt "#32397" +msgid "Quality" +msgstr "Kvalita" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Video nastavení Kodi" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Audio nastavení Kodi" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Přejít na sezónu" + +msgctxt "#32401" +msgid "Directors" +msgstr "Režiséři" + +msgctxt "#32402" +msgid "Writer" +msgstr "Autor" + +msgctxt "#32403" +msgid "Writers" +msgstr "Autoři" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Podobné filmy" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Stáhnout titulky" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Zpoždění titulků" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Další titulky" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Vypnout titulky" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Zapnout titulky" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Verze platformy" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Neznámá" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Upravit nebo smazat" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "Upravit IP adresu nebo smazat nastavení?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Smazat" + +msgctxt "#32415" +msgid "Edit" +msgstr "Upravit" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Zadejte IP adresu" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Zadejte číslo portu" + +msgctxt "#32418" +msgid "Creator" +msgstr "Tvůrce" + +msgctxt "#32419" +msgid "Cast" +msgstr "Hrají" + +msgctxt "#32420" +msgid "Disc" +msgstr "Disk" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Odhlásit" + +msgctxt "#32422" +msgid "Exit" +msgstr "Odejít" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Vypnout" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Uspat" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Hibernovat" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Restartovat" + +msgctxt "#32427" +msgid "Failed" +msgstr "Neuspělo" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "Přihlášení neuspělo!" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Pokračovat od {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Objevit" + +msgctxt "#32431" +msgid "Search" +msgstr "Vyhledat" + +msgctxt "#32432" +msgid "Space" +msgstr "Mezera" + +msgctxt "#32433" +msgid "Clear" +msgstr "Smazat" + +msgctxt "#32434" +msgid "Searching..." +msgstr "Vyhledávám..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Žádné výsledky" + +msgctxt "#32436" +msgid "Paused" +msgstr "Pozastaveno" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Vítáme vás" + +msgctxt "#32438" +msgid "Previous" +msgstr "Předchozí" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "Přehrávám další" + +msgctxt "#32440" +msgid "On Deck" +msgstr "Aktuální" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Neznámý" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Vestavěné" + +msgctxt "#32443" +msgid "Forced" +msgstr "Vynucené" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Text skladby" + +msgctxt "#32445" +msgid "Mono" +msgstr "Mono" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Stereo" + +msgctxt "#32447" +msgid "None" +msgstr "Žádné" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "Přehrávání neuspělo!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Nemohu se připojit k plex.tv[CR]Zkontrolujte připojení k internetu a zkuste to znovu." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Zvolte verzi" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Přehrávám verzi..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "V této knihovně není žádný obsah" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Prosím přidejte obsah a nebo zkontrolujte, že je povolené nastavení 'přidat na nástěnku'." + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Pro tento filtr není k dispozici žádný obsah" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Prosím změňte nebo odstraňte filtr" + +msgctxt "#32456" +msgid "Offline Mode" +msgstr "Režim offline" + +msgctxt "#32457" +msgid "Sign In" +msgstr "Přihlásit" diff --git a/script.plexmod/resources/language/resource.language.de_de/strings.po b/script.plexmod/resources/language/resource.language.de_de/strings.po new file mode 100644 index 000000000..b50c731b5 --- /dev/null +++ b/script.plexmod/resources/language/resource.language.de_de/strings.po @@ -0,0 +1,1946 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: POEditor.com\n" +"Project-Id-Version: PM4K\n" +"Language: de\n" + +#: +msgctxt "#32000" +msgid "Main" +msgstr "Allgemein" + +#: +msgctxt "#32001" +msgid "Original" +msgstr "Original" + +#: +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mbit/s 1080p" + +#: +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mbit/s 1080p" + +#: +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mbit/s 1080p" + +#: +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mbit/s 1080p" + +#: +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mbit/s 720p" + +#: +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mbit/s 720p" + +#: +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mbit/s 720p" + +#: +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mbit/s 480p" + +#: +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kbit/s" + +#: +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kbit/s" + +#: +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kbit/s" + +#: +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kbit/s" + +#: +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kbit/s" + +#: +msgctxt "#32020" +msgid "Local Quality" +msgstr "Qualität für lokale Geräte" + +#: +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Qualität für entfernte Geräte" + +#: +msgctxt "#32022" +msgid "Online Quality" +msgstr "Online Qualität" + +#: +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Transkodierungsformat" + +#: +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Debug-Protokollierung" + +#: +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Direkte Wiedergabe erlauben" + +#: +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Direktes streamen erlauben" + +#: +msgctxt "#32027" +msgid "Force" +msgstr "Erzwingen" + +#: +msgctxt "#32028" +msgid "Always" +msgstr "Immer" + +#: +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "nur Bildformate" + +#: +msgctxt "#32030" +msgid "Auto" +msgstr "Automatisch" + +#: +msgctxt "#32031" +msgid "Burn-in Subtitles" +msgstr "Untertitel einbrennen" + +#: +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Unsichere Verbindung erlauben" + +#: +msgctxt "#32033" +msgid "Never" +msgstr "Nie" + +#: +msgctxt "#32034" +msgid "On Same network" +msgstr "Im selben Netzwerk" + +#: +msgctxt "#32035" +msgid "Always" +msgstr "Immer" + +#: +msgctxt "#32036" +msgid "Allow 4K" +msgstr "4K erlauben" + +#: +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "HEVC erlauben (H265)" + +#: +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Automatisch anmelden" + +#: +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Automatisch nächsten Titel abspielen" + +#: +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Untertitel download aktivieren" + +#: +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Untertitel download aktivieren" + +#: +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Server Erkennung (GDM)" + +#: +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Plex mit Kodi starten" + +#: +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "Verbindung 1 IP" + +#: +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Verbindung 1 Port" + +#: +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "Verbindung 2 IP" + +#: +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Verbindung 2 Port" + +#: +msgctxt "#32048" +msgid "Audio" +msgstr "Ton" + +#: +msgctxt "#32049" +msgid "Advanced" +msgstr "Erweitert" + +#: +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Manuelle Server" + +#: +msgctxt "#32051" +msgid "Privacy" +msgstr "Datenschutz" + +#: +msgctxt "#32052" +msgid "About" +msgstr "Über" + +#: +msgctxt "#32053" +msgid "Video" +msgstr "Video" + +#: +msgctxt "#32054" +msgid "Addon Version" +msgstr "Erweiterung Version" + +#: +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Kodi Version" + +#: +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Bilschirmauflösung" + +#: +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Aktuelle Server Version" + +#: +msgctxt "#32058" +msgid "Never exceed original audio codec" +msgstr "Niemals den ursprünglichen Audio-Codec überschreiten" + +#: +msgctxt "#32059" +msgid "When transcoding audio, never exceed the original audio bitrate or channel count on the same codec." +msgstr "Bei der Transkodierung von Audio niemals die ursprüngliche Audio-Bitrate oder die Anzahl der Kanäle mit demselben Codec überschreiten." + +#: +msgctxt "#32060" +msgid "Use Kodi audio channels" +msgstr "Kodi-Audiokanäle verwenden" + +#: +msgctxt "#32061" +msgid "When transcoding audio, target the audio channels set in Kodi." +msgstr "Beim Transkodieren von Audio werden die in Kodi eingestellten Audiokanäle verwendet." + +#: +msgctxt "#32062" +msgid "Transcode audio to AC3" +msgstr "Transkodiere Ton zu AC3" + +#: +msgctxt "#32063" +msgid "Transcode audio to AC3 in certain conditions (useful for passthrough)." +msgstr "Transkodiere Ton zu AC3 in bestimmten Umständen (nützlich für Passthrough)" + +#: +msgctxt "#32064" +msgid "Treat DTS like AC3" +msgstr "DTS wie AC3 behandeln" + +#: +msgctxt "#32065" +msgid "When any of the force AC3 settings are enabled, treat DTS the same as AC3 (useful for Optical passthrough)" +msgstr "Wenn einer der AC3 Optionen aktiviert ist, wird DTS wie AC3 behandelt (nützlich für Optical Passthrough)" + + +msgctxt "#32066" +msgid "Force audio to AC3" +msgstr "Audio immer als AC3 erzwingen" + + +msgctxt "#32067" +msgid "Only force multichannel audio to AC3" +msgstr "Nur Mehrkanal-Audio als AC3 erzwingen" + +#: +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Benutzerauswahl und Pin-Eingabe beim Start überspringen." + +#: +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Falls aktiviert wird, sofern verfügbar, nachdem die Wiedergabe endet ein 'nächster Titel' automatisch nach 15 Sekunden gestartet." + +#: +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Aktiviert 4K Wiedergabe per Hardware. Deaktivierung erzwingt Transcodierung." + +#: +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Aktiviert HEVC/H265 Wiedergabe per Hardware. Deaktivierung erzwingt Transcodierung." + +#: +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Wann soll zu Servern ohne 'sichere Verbindung' verbunden werden[CR]* [B]Nie[/B]: Niemals unsicher zu eine Server verbinden.[CR]* [B]Im selben Netzwerk[/B]: Im selben Netzwerk erlauben[CR]* [B]Immer[/B]: Im selben Netzwerk und bei entfernter Verbindung erlauben" + +#: +msgctxt "#32201" +msgid "Trailer" +msgstr "Trailer" + +#: +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Entfernte Szene" + +#: +msgctxt "#32203" +msgid "Interview" +msgstr "Interview" + +#: +msgctxt "#32204" +msgid "Music Video" +msgstr "Musik-Video" + +#: +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "Hinter den Kulissen" + +#: +msgctxt "#32206" +msgid "Scene" +msgstr "Szene" + +#: +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Live Musikvideo" + +#: +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Musikvideo mit Lyrics" + +#: +msgctxt "#32209" +msgid "Concert" +msgstr "Konzert" + +#: +msgctxt "#32210" +msgid "Featurette" +msgstr "Featurette" + +#: +msgctxt "#32211" +msgid "Short" +msgstr "Kurzfilm" + +#: +msgctxt "#32212" +msgid "Other" +msgstr "Sonstige" + +#: +msgctxt "#32300" +msgid "Go to Album" +msgstr "Gehe zu Album" + +#: +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Gehe zu Künstler(in)" + +#: +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Gehe zu {0}" + +#: +msgctxt "#32303" +msgid "Season" +msgstr "Staffel" + +#: +msgctxt "#32304" +msgid "Episode" +msgstr "Folge" + +#: +msgctxt "#32305" +msgid "Extras" +msgstr "Extras" + +#: +msgctxt "#32306" +msgid "Related Shows" +msgstr "Ähnliche Serien" + +#: +msgctxt "#32307" +msgid "More" +msgstr "Film" + +#: +msgctxt "#32308" +msgid "Available" +msgstr "Verfügbar" + +#: +msgctxt "#32309" +msgid "None" +msgstr "Ohne" + +#: +msgctxt "#32310" +msgid "S" +msgstr "S" + +#: +msgctxt "#32311" +msgid "E" +msgstr "E" + +#: +msgctxt "#32312" +msgid "Unavailable" +msgstr "Nicht verfügbar" + +#: +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Dieser Eintrag ist aktuell nicht verfügbar." + +#: +msgctxt "#32314" +msgid "In Progress" +msgstr "in Bearbeitung" + +#: +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Wiedergabe fortsetzen?" + +#: +msgctxt "#32316" +msgid "Resume" +msgstr "Fortsetzen" + +#: +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Von vorne wiedergeben" + +#: +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Als ungesehen markieren" + +#: +msgctxt "#32319" +msgid "Mark Played" +msgstr "Als gesehen markieren" + +#: +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Staffel als ungesehen markieren" + +#: +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Staffel als gesehen markieren" + +#: +msgctxt "#32322" +msgid "Delete" +msgstr "Löschen" + +#: +msgctxt "#32323" +msgid "Go To Show" +msgstr "Gehe zu Serie" + +#: +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Gehe zu {0}" + +#: +msgctxt "#32325" +msgid "Play Next" +msgstr "Nächster Titel" + +#: +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Wirklich löschen?" + +#: +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Soll diese Mediandatei wirklich gelöscht werden?" + +#: +msgctxt "#32328" +msgid "Yes" +msgstr "Ja" + +#: +msgctxt "#32329" +msgid "No" +msgstr "Nein" + +#: +msgctxt "#32330" +msgid "Message" +msgstr "Nachricht" + +#: +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Es gab einen Fehler beim Löschversuch dieser Mediendatei." + +#: +msgctxt "#32332" +msgid "Home" +msgstr "Start" + +#: +msgctxt "#32333" +msgid "Playlists" +msgstr "Wiedergabelisten" + +#: +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Beenden bestätigen" + +#: +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Bereit um Plex zu beenden?" + +#: +msgctxt "#32336" +msgid "Exit" +msgstr "Beenden" + +#: +msgctxt "#32337" +msgid "Cancel" +msgstr "Abbrechen" + +#: +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Keine Server gefunden" + +#: +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Server ist nicht erreichbar" + +#: +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Verbindungstests laufen. Bitte warten." + +#: +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Der Server ist nicht erreichbar. Bitte einloggen und Verbindung prüfen." + +#: +msgctxt "#32342" +msgid "Switch User" +msgstr "Benutzer wechseln" + +#: +msgctxt "#32343" +msgid "Settings" +msgstr "Einstellungen" + +#: +msgctxt "#32344" +msgid "Sign Out" +msgstr "Abmelden" + +#: +msgctxt "#32345" +msgid "All" +msgstr "Alle" + +#: +msgctxt "#32346" +msgid "By Name" +msgstr "Nach Name" + +#: +msgctxt "#32347" +msgid "Artists" +msgstr "Künstler" + +#: +msgctxt "#32348" +msgid "Movies" +msgstr "Filme" + +#: +msgctxt "#32349" +msgid "photos" +msgstr "Fotos" + +#: +msgctxt "#32350" +msgid "Shows" +msgstr "Serien" + +#: +msgctxt "#32351" +msgid "By Date Added" +msgstr "Nach 'Hinzugefügt am'" + +#: +msgctxt "#32352" +msgid "Date Added" +msgstr "Hinzugefügt am" + +#: +msgctxt "#32353" +msgid "By Release Date" +msgstr "Nach Erscheinungsdatum" + +#: +msgctxt "#32354" +msgid "Release Date" +msgstr "Erscheinungsdatum" + +#: +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Nach 'Gesehen am'" + +#: +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Gesehen am" + +#: +msgctxt "#32357" +msgid "By Name" +msgstr "Nach Name" + +#: +msgctxt "#32358" +msgid "Name" +msgstr "Name" + +#: +msgctxt "#32359" +msgid "By Rating" +msgstr "Nach Bewertung" + +#: +msgctxt "#32360" +msgid "Rating" +msgstr "Bewertung" + +#: +msgctxt "#32361" +msgid "By Resolution" +msgstr "Nach Auflösung" + +#: +msgctxt "#32362" +msgid "Resolution" +msgstr "Auflösung" + +#: +msgctxt "#32363" +msgid "By Duration" +msgstr "Nach Dauer" + +#: +msgctxt "#32364" +msgid "Duration" +msgstr "Dauer" + +#: +msgctxt "#32365" +msgid "By First Aired" +msgstr "Nach Erstausstrahlung" + +#: +msgctxt "#32366" +msgid "First Aired" +msgstr "Erstausstrahlung" + +#: +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Nach Ungesehen" + +#: +msgctxt "#32368" +msgid "Unplayed" +msgstr "Ungesehen" + +#: +msgctxt "#32369" +msgid "By Date Played" +msgstr "Nach 'Abgespielt am'" + +#: +msgctxt "#32370" +msgid "Date Played" +msgstr "Abgespielt am" + +#: +msgctxt "#32371" +msgid "By Play Count" +msgstr "Nach Wiedergabe-Zähler" + +#: +msgctxt "#32372" +msgid "Play Count" +msgstr "Wiedergabe-Zähler" + +#: +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Nach Aufnahmedatum" + +#: +msgctxt "#32374" +msgid "Date Taken" +msgstr "Aufnahmedatum" + +#: +msgctxt "#32375" +msgid "No filters available" +msgstr "Keine Filter verfügbar" + +#: +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Filter bereinigen" + +#: +msgctxt "#32377" +msgid "Year" +msgstr "Jahr" + +#: +msgctxt "#32378" +msgid "Decade" +msgstr "Jahrzent" + +#: +msgctxt "#32379" +msgid "Genre" +msgstr "Genre" + +#: +msgctxt "#32380" +msgid "Content Rating" +msgstr "Jugendfreigabe" + +#: +msgctxt "#32381" +msgid "Network" +msgstr "Netzwerk" + +#: +msgctxt "#32382" +msgid "Collection" +msgstr "Sammlung" + +#: +msgctxt "#32383" +msgid "Director" +msgstr "Regisseur(in)" + +#: +msgctxt "#32384" +msgid "Actor" +msgstr "Schauspieler(in)" + +#: +msgctxt "#32385" +msgid "Country" +msgstr "Land" + +#: +msgctxt "#32386" +msgid "Studio" +msgstr "Studio" + +#: +msgctxt "#32387" +msgid "Labels" +msgstr "Labels" + +#: +msgctxt "#32388" +msgid "Camera Make" +msgstr "Kamerahersteller" + +#: +msgctxt "#32389" +msgid "Camera Model" +msgstr "Kameramodell" + +#: +msgctxt "#32390" +msgid "Aperture" +msgstr "Blendenöffnung" + +#: +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Verschlusszeit" + +#: +msgctxt "#32392" +msgid "Lens" +msgstr "Linse" + +#: +msgctxt "#32393" +msgid "TV Shows" +msgstr "Fernsehserien" + +#: +msgctxt "#32394" +msgid "Music" +msgstr "Musik" + +#: +msgctxt "#32395" +msgid "Audio" +msgstr "Ton" + +#: +msgctxt "#32396" +msgid "Subtitles" +msgstr "Untertitel" + +#: +msgctxt "#32397" +msgid "Quality" +msgstr "Qualität" + +#: +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Kodi Bild Einstellungen" + +#: +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Kodi Ton Einstellungen" + +#: +msgctxt "#32400" +msgid "Go To Season" +msgstr "Gehe zu Staffel" + +#: +msgctxt "#32401" +msgid "Directors" +msgstr "Regisseure" + +#: +msgctxt "#32402" +msgid "Writer" +msgstr "Autor(in)" + +#: +msgctxt "#32403" +msgid "Writers" +msgstr "Autoren" + +#: +msgctxt "#32404" +msgid "Related Movies" +msgstr "Ähnliche Filme" + +#: +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Untertitel downloaden" + +#: +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Untertitel Verzögerung" + +#: +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Nächster Untertitel" + +#: +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Untertitel deaktiviren" + +#: +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Untertitel aktivieren" + +#: +msgctxt "#32410" +msgid "Platform Version" +msgstr "Platform Version" + +#: +msgctxt "#32411" +msgid "Unknown" +msgstr "Unbekannt" + +#: +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Bearbeiten oder bereinigen" + +#: +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "IP Adresse bearbeiten oder die aktuellen Einstellungen bereinigen?" + +#: +msgctxt "#32414" +msgid "Clear" +msgstr "Bereinigen" + +#: +msgctxt "#32415" +msgid "Edit" +msgstr "Ändern" + +#: +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "IP Adresse eingeben" + +#: +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Port Nummer eingeben" + +#: +msgctxt "#32418" +msgid "Creator" +msgstr "Urheber(in)" + +#: +msgctxt "#32419" +msgid "Cast" +msgstr "Besetzung" + +#: +msgctxt "#32420" +msgid "Disc" +msgstr "Disk" + +#: +msgctxt "#32421" +msgid "Sign Out" +msgstr "Abmelden" + +#: +msgctxt "#32422" +msgid "Exit" +msgstr "Beenden" + +#: +msgctxt "#32423" +msgid "Shutdown" +msgstr "Herunterfahren" + +#: +msgctxt "#32424" +msgid "Suspend" +msgstr "Energie sparen" + +#: +msgctxt "#32425" +msgid "Hibernate" +msgstr "Ruhezustand" + +#: +msgctxt "#32426" +msgid "Reboot" +msgstr "Neustart" + +#: +msgctxt "#32427" +msgid "Failed" +msgstr "Fehlgeschlagen" + +#: +msgctxt "#32428" +msgid "Login failed!" +msgstr "Anmeldung fehlgeschlagen!" + +#: +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Fortsetzen ab {0}" + +#: +msgctxt "#32430" +msgid "Discovery" +msgstr "Entdecken" + +#: +msgctxt "#32431" +msgid "Search" +msgstr "Suche" + +#: +msgctxt "#32432" +msgid "Space" +msgstr "Leerzeichen" + +#: +msgctxt "#32433" +msgid "Clear" +msgstr "Bereinigen" + +#: +msgctxt "#32434" +msgid "Searching..." +msgstr "Suche..." + +#: +msgctxt "#32435" +msgid "No Results" +msgstr "Keine Ergebnisse" + +#: +msgctxt "#32436" +msgid "Paused" +msgstr "Pausiert" + +#: +msgctxt "#32437" +msgid "Welcome" +msgstr "Willkommen" + +#: +msgctxt "#32438" +msgid "Previous" +msgstr "Vorheriger Titel" + +#: +msgctxt "#32439" +msgid "Playing Next" +msgstr "Nächster Titel" + +#: +msgctxt "#32440" +msgid "On Deck" +msgstr "Aktuell" + +#: +msgctxt "#32441" +msgid "Unknown" +msgstr "Unbekannt" + +#: +msgctxt "#32442" +msgid "Embedded" +msgstr "Eingebettet" + +#: +msgctxt "#32443" +msgid "Forced" +msgstr "Zwangsuntertitel" + +#: +msgctxt "#32444" +msgid "Lyrics" +msgstr "Lyrics" + +#: +msgctxt "#32445" +msgid "Mono" +msgstr "Mono" + +#: +msgctxt "#32446" +msgid "Stereo" +msgstr "Stereo" + +#: +msgctxt "#32447" +msgid "None" +msgstr "Nichts" + +#: +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "Wiedergabe fehlgeschlagen!" + +#: +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Keine Verbindung zu plex.tv[CR]Internetverbindung prüfen und erneut versuchen." + +#: +msgctxt "#32450" +msgid "Choose Version" +msgstr "Version auswählen" + +#: +msgctxt "#32451" +msgid "Play Version..." +msgstr "Version abspielen..." + +#: +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "In dieser Bibliothek ist nichts vorhanden" + +#: +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Bitte Inhalte ergänzen und/oder prüfen ob 'In Dashboard anzeigen' aktiv ist." + +#: +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Mit diesem Filter ist kein Inhalt verfügbar" + +#: +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Bitte aktuellen Filter ändern oder entfernen" + +#: +msgctxt "#32456" +msgid "Show" +msgstr "Serie" + +#: +msgctxt "#32457" +msgid "By Show" +msgstr "Nach Serie" + +#: +msgctxt "#32458" +msgid "Episodes" +msgstr "Episoden" + +#: +msgctxt "#32459" +msgid "Offline Mode" +msgstr "Offline-Modus" + +#: +msgctxt "#32460" +msgid "Sign In" +msgstr "Anmelden" + +#: +msgctxt "#32461" +msgid "Albums" +msgstr "Alben" + +#: +msgctxt "#32462" +msgid "Artist" +msgstr "Künstler(in)" + +#: +msgctxt "#32463" +msgid "By Artist" +msgstr "Nach Künstler(in)" + +#: +msgctxt "#32464" +msgid "Player" +msgstr "Wiedergabe" + +#: +msgctxt "#32465" +msgid "Use skip step settings from Kodi" +msgstr "Skip-Schritte-Einstellung von Kodi benutzen" + +#: +msgctxt "#32466" +msgid "Automatically seek selected position after a delay" +msgstr "Automatisch verzögert zur ausgewählten Position springen" + +#: +msgctxt "#32467" +msgid "User Interface" +msgstr "Benutzeroberfläche" + +#: +msgctxt "#32468" +msgid "Show dynamic background art" +msgstr "Dynamische Hintergrundbilder aktivieren" + +#: +msgctxt "#32469" +msgid "Background art blur amount" +msgstr "Unschärfe der Hintergrundbilder" + +#: +msgctxt "#32470" +msgid "Background art opacity" +msgstr "Deckkraft der Hintergrundbilder" + +#: +msgctxt "#32471" +msgid "Use Plex/Kodi steps for timeline" +msgstr "Plex/Kodi-Skip-Schritte für die Zeitachse verwenden" + +#: +msgctxt "#32480" +msgid "Theme music" +msgstr "Titelmusik" + +#: +msgctxt "#32481" +msgid "Off" +msgstr "Aus" + +#: +msgctxt "#32482" +msgid "%(percentage)s %%" +msgstr "%(percentage)s %%" + +#: +msgctxt "#32483" +msgid "Hide Stream Info" +msgstr "Stream Info nicht anzeigen" + +#: +msgctxt "#32484" +msgid "Show Stream Info" +msgstr "Stream Info anzeigen" + +#: +msgctxt "#32485" +msgid "Go back instantly with the previous menu action in scrolled views" +msgstr "Mit der Previous-Menu-Aktion In gescrollten Ansichten sofort zurückgehen" + +#: +msgctxt "#32487" +msgid "Seek Delay" +msgstr "Vorspulverzögerung" + +#: +msgctxt "#32488" +msgid "Screensaver" +msgstr "Bildschirmschoner" + +#: +msgctxt "#32489" +msgid "Quiz Mode" +msgstr "Quiz-Modus" + +#: +msgctxt "#32490" +msgid "Collections" +msgstr "Sammlungen" + +#: +msgctxt "#32491" +msgid "Folders" +msgstr "Ordner" + +#: +msgctxt "#32492" +msgid "Kodi Subtitle Settings" +msgstr "Kodi Untertitel-Einstellungen" + +#: +msgctxt "#32493" +msgid "When a media file has a forced/foreign subtitle for a subtitle-enabled language, the Plex Media Server preselects it. This behaviour is usually not necessary and not configurable. This setting fixes that by ignoring the PMSs decision and selecting the same language without a forced flag if possible." +msgstr "Hat eine Mediendatei erzwungenge Untertitel für eine Sprache, bei der Untertitel erwünscht sind, wählt der Plex Media Server diesen standardmäßig aus. Das Verhalten ist normalerweise unerwünscht und nicht konfigurierbar. Diese Einstellung behebt das Problem, indem versucht wird, einen Untertitel der selben Sprache ohne Erzwungen-Markierung zu wählen." + +#: +msgctxt "#32495" +msgid "Skip intro" +msgstr "Intro überspringen" + +#: +msgctxt "#32496" +msgid "Skip credits" +msgstr "Abspann überspringen" + +#: +msgctxt "#32500" +msgid "Always show post-play screen (even for short videos)" +msgstr "Immer den Nachwiedergabe-Bildschirm anzeigen (auch bei kurzen Videos)" + +#: +msgctxt "#32501" +msgid "Time-to-wait between videos on post-play" +msgstr "Wartezeit zwischen Videos bei Nachwiedergabe" + +#: +msgctxt "#32505" +msgid "Visit media in video playlist instead of playing it" +msgstr "Medien in der Video-Wiedergabeliste anzeigen, anstatt sie abzuspielen" + +#: +msgctxt "#32521" +msgid "Skip Intro Button Timeout" +msgstr "Zeitlimit für die Schaltfläche Intro überspringen" + +#: +msgctxt "#32522" +msgid "Automatically Skip Intro" +msgstr "Intro automatisch überspringen" + +#: +msgctxt "#32523" +msgid "Automatically skip intros if available." +msgstr "Automatisches Überspringen von Intros, falls vorhanden. Überschreibt aktivierten Binge-Modus nicht." + +#: +msgctxt "#32524" +msgid "Set how long the skip intro button shows for." +msgstr "Festlegen, wie lange die Schaltfläche zum Überspringen des Intros angezeigt werden soll." + +#: +msgctxt "#32525" +msgid "Skip Credits Button Timeout" +msgstr "Zeitlimit für die Schaltfläche Abspann überspringen" + +#: +msgctxt "#32526" +msgid "Automatically Skip Credits" +msgstr "Automatisches Überspringen von Abspann" + +#: +msgctxt "#32527" +msgid "Automatically skip credits if available." +msgstr "Automatisches Überspringen von Abspann, falls vorhanden. Überschreibt aktivierten Binge-Modus nicht." + +#: +msgctxt "#32528" +msgid "Set how long the skip credits button shows for." +msgstr "Festlegen, wie lange die Schaltfläche zum Überspringen des Abspann angezeigt werden soll." + +#: +msgctxt "#32540" +msgid "Show when the current video will end in player" +msgstr "Im Player anzeigen, wann das aktuelle Video endet" + +#: +msgctxt "#32541" +msgid "Shows time left and at which time the media will end." +msgstr "Zeigt im Player an, wann und zu welchem Zeitpunkt das aktuelle Video endet." + +#: +msgctxt "#32542" +msgid "Show \"Ends at\" label for the end-time as well" +msgstr "\"Endet um\"-Label für die Endzeit auch anzeigen" + +#: +msgctxt "#32543" +msgid "Ends at" +msgstr "Endet um" + +#: +msgctxt "#32601" +msgid "Allow AV1" +msgstr "AV1 zulassen" + +#: +msgctxt "#32602" +msgid "Enable this if your hardware can handle AV1. Disable it to force transcoding." +msgstr "Diese Option aktivieren, wenn die Hardware AV1 verarbeiten kann. Deaktivieren, um die Transkodierung zu erzwingen." + +#: +msgctxt "#33101" +msgid "By Audience Rating" +msgstr "Nach Zuschauerwertung" + +#: +msgctxt "#33102" +msgid "Audience Rating" +msgstr "Zuschauerwertung" + +#: +msgctxt "#33103" +msgid "By my Rating" +msgstr "Nach meiner Bewertung" + +#: +msgctxt "#33104" +msgid "My Rating" +msgstr "Meine Bewertung" + +#: +msgctxt "#33105" +msgid "By Content Rating" +msgstr "Nach Inhaltsbewertung" + +#: +msgctxt "#33106" +msgid "Content Rating" +msgstr "Inhaltsbewertung" + +#: +msgctxt "#33107" +msgid "By Critic Rating" +msgstr "Nach kritischer Bewertung" + +#: +msgctxt "#33108" +msgid "Critic Rating" +msgstr "Kritikerwertung" + +#: +msgctxt "#33200" +msgid "Background Color" +msgstr "Hintergrundfarbe" + +#: +msgctxt "#33201" +msgid "Specify solid Background Color instead of using media images" +msgstr "Hintergrundfarbe anstatt Bilder verwenden" + +#: +msgctxt "#33400" +msgid "Use old compatibility profile" +msgstr "Altes Kompatibilitätsprofil verwenden" + +#: +msgctxt "#33401" +msgid "Uses the Chrome client profile instead of the custom one. Might fix rare issues with 3D playback." +msgstr "Benutzt das alte Chrome Client-Profil anstatt des angepassten. Könnte seltene Fehler beim Abspielen von 3D-Inhalten verhindern." + +#: +msgctxt "#32348" +msgid "movies" +msgstr "Filme" + +#: +msgctxt "#32466" +msgid "Automatically seek to the selected timeline position after a second" +msgstr "Nach Verzögerung automatisch zur aktuell gewählten Position springen" + +msgctxt "#33501" +msgid "Video played threshold" +msgstr "Video-abgespielt-Grenzwert" + +msgctxt "#33502" +msgid "Set this to the same value as your Plex server (Settings>Library>Video played threshold) to avoid certain pitfalls, Default: 90 %" +msgstr "Auf dem selben wert wie im Plex server setzen (Einstellungen>Mediathek>Video played threshold) um bestimmte Fehler zu umgehen, Standardwert: 90 %" + +msgctxt "#33503" +msgid "Use alternative hubs refresh" +msgstr "Alternative Aktualisierung der Hubs" + +msgctxt "#33504" +msgid "Refreshes all hubs for all libraries after an item's watch-state has changed, instead of only those likely affected. Use this if you find a hub that doesn't update properly." +msgstr "Aktualisiert alle Hubs aller Bibliotheken, anstatt nur die, die möglicherweise zutreffend sind, nachdem sich der Abspielstatus eines Items geändert hat. Benutzen, wenn sich ein Hub nicht aktualisiert." + +msgctxt "#33505" +msgid "Show intro skip button early" +msgstr "Intro überspringen früher anzeigen" + +msgctxt "#33506" +msgid "Show the intro skip button from the start of a video with an intro marker. The auto-skipping setting applies." +msgstr "Zeige den Intro-Überspringen-Knopf von Anfang an. Die Automatische-Intro-Überspringen-Einstellung wird angewandt. Überschreibt aktivierten Binge-Modus nicht." + +msgctxt "#33507" +msgid "Enabled" +msgstr "Aktiviert" + +msgctxt "#33508" +msgid "Disabled" +msgstr "Deaktiviert" + +msgctxt "#33509" +msgid "Early intro skip threshold (default: < 60s/1m)" +msgstr "Frühes Intro-Überspringen Grenzwert (default: < 60s/1m)" + +msgctxt "#33510" +msgid "When showing the intro skip button early, only do so if the intro starts within the first X seconds." +msgstr "Wenn der Into-Überspringen-Knopf früher angezeigt werden soll, nur anzeigen, wenn das Intro innerhalb der ersten X Sekunden startet." + +msgctxt "#33600" +msgid "System" +msgstr "System" + +msgctxt "#33601" +msgid "Show video chapters" +msgstr "Video-Kapitel anzeigen" + +msgctxt "#33602" +msgid "If available, show video chapters from the video-file instead of the timeline-big-seek-steps." +msgstr "Wenn verfügbar, Video-Kapitel aus der Video-Datei anstatt der Zeitleiste-Big-Seek-Schritte anzeigen." + +msgctxt "#33603" +msgid "Use virtual chapters" +msgstr "Virtuelle Kapitel verwenden" + +msgctxt "#33604" +msgid "When the above is enabled and no video chapters are available, simulate them by using the markers identified by the Plex Server (Intro, Credits)." +msgstr "Wenn die obrige aktiviert ist und keine Video-Kapitel verfügbar sind, virtuelle Kapitel aus den Plex Server Markern (Intro, Abspann) erzeugen." + +msgctxt "#33605" +msgid "Video Chapters" +msgstr "Video-Kapitel" + +msgctxt "#33606" +msgid "Virtual Chapters" +msgstr "Virtuelle Kapitel" + +msgctxt "#33607" +msgid "Chapter {}" +msgstr "Kapitel {}" + +msgctxt "#33608" +msgid "Intro" +msgstr "Intro" + +msgctxt "#33609" +msgid "Credits" +msgstr "Abspann" + +msgctxt "#33610" +msgid "Main" +msgstr "Haupt" + +msgctxt "#33611" +msgid "Chapters" +msgstr "Kapitel" + +msgctxt "#33612" +msgid "Markers" +msgstr "Markierungen" + +msgctxt "#33613" +msgid "Kodi Buffer Size (MB)" +msgstr "Kodi Puffergröße (MB)" + +msgctxt "#33614" +msgid "Set the Kodi Cache/Buffer size. Free: {} MB, Recommended: ~100 MB, Recommended max: {} MB, Default: 20 MB." +msgstr "Setzt die Kodi Cache/Puffer Größe. Frei: {} MB, empfohlen: ~100 MB, empfohlenes Max.: {} MB, Default: 20 MB." + +msgctxt "#33615" +msgid "{time} left" +msgstr "{time} übrig" + +msgctxt "#33616" +msgid "Addon Path" +msgstr "Addon-Pfad" + +msgctxt "#33617" +msgid "Userdata/Profile Path" +msgstr "Benutzerdaten-/Profilpfad" + +msgctxt "#33618" +msgid "TV binge-viewing mode" +msgstr "TV Binge-Viewing-Modus" + +msgctxt "#33619" +msgid "Automatically skips episode intros, credits and tries to skip episode recaps. Doesn\'t skip the intro of the first episode of a season.\n\nCan be disabled/enabled per TV show." +msgstr "Überspringt automatisch Intros und Abspänne von Episoden und versucht Recaps zu vermeiden. Überspringt das Intro der ersten Episode einer Staffel nicht." + +msgctxt "#33620" +msgid "Plex requests timeout (seconds)" +msgstr "Plex HTTP Zeitlimit (Sekunden)" + +msgctxt "#33621" +msgid "Set the (async and connection) timeout value of the Python requests library in seconds. Default: 5 seconds" +msgstr "Setzt das Zeitlimit für die Python Requests Bibliothek bei asynchronen Verbindungen und Verbindungsanfragen. Default: 5 Sekunden" + +msgctxt "#33622" +msgid "LAN reachability timeout (ms)" +msgstr "LAN-Erreichbarkeits-Zeitlimit (ms)" + +msgctxt "#33623" +msgid "When checking for Server-in-LAN reachability, use this timeout. Default: 10ms" +msgstr "Wenn die lokale Serververbindung im LAN überprüft wird, benutze dieses Zeitlimit. Default: 10ms" + +msgctxt "#33624" +msgid "Network" +msgstr "Netzwerk" + +msgctxt "#33625" +msgid "Smart LAN/local server discovery" +msgstr "Smartes LAN/lokale Server-Auffinden" + +msgctxt "#33626" +msgid "Checks whether servers returned from Plex.tv are actually local/in your LAN. For specific setups (e.g. Docker) Plex.tv might not properly detect a local server.\n\nNOTE: Only works on Kodi 19 or above." +msgstr "Überprüft, ob von Plex.tv zurückgegebene Server tatsächlich lokal/in Deinem LAN sind. Für bestimmte Setups (z. B. Docker) könnte Plex.tv einen lokalen Servern nicht als solchen entdecken.\n\nACHTUNG: Funktioniert nur unter Kodi 19 oder neuer." + +msgctxt "#33627" +msgid "Prefer LAN/local servers over security" +msgstr "LAN/lokale Server bevorzugen" + +msgctxt "#33628" +msgid "Prioritizes local connections over secure ones. Needs the proper setting in \"Allow Insecure Connections\" and the Plex Server's \"Secure connections\" at \"Preferred\". Can be used to enforce manual servers." +msgstr "Priorisiert lokale Verbindungen über sichere. Benötigt die korrekte Einstellung in \"Unsichere Verbindung erlauben\" und die Plex Server Einstellung \"Sichere Verbindungen\" auf \"Bevorzugt\". Kann verwendet werden um manuelle Server zu forcieren." + +msgctxt "#33629" +msgid "Auto-skip intro/credits offset" +msgstr "Auto-Überspringen-Versatz" + +msgctxt "#33630" +msgid "Intro/credits markers might be a little early in Plex. When auto skipping add (or subtract) this many seconds from the marker. This avoids cutting off content, while possibly skipping the marker a little late." +msgstr "Intro-/Abspann-Markierungen können ein wenig früh erscheinen in Plex. Wenn diese automatisch übersprungen werden sollen, addiere (oder subtrahiere) diese Menge an Sekunden. Das verhindert das verfrühte Abschneiden von Inhalten, kann aber zu etwas verspätetem Springen führen." + +msgctxt "#32631" +msgid "Playback (user-specific)" +msgstr "Wiedergabe (benutzerspezifisch)" + +msgctxt "#33632" +msgid "Server connectivity check timeout (seconds)" +msgstr "Server Konnektivitätscheck-Timeout (Sekunden)" + +msgctxt "#33633" +msgid "Set the maximum amount of time a server connection has to answer a connectivity request. Default: 2.5" +msgstr "Setzt die maximale Zeit, in der eine Serververbindung antworten muss. Voreinstellung: 2.5" + +msgctxt "#33634" +msgid "Combined Chapters" +msgstr "Kombinierte Kapitel" + +msgctxt "#33635" +msgid "Final Credits" +msgstr "Finaler Abspann" + +msgctxt "#32700" +msgid "Action on Sleep event" +msgstr "Aktion bei Sleep-Ereignis" + +msgctxt "#32701" +msgid "When Kodi receives a sleep event from the system, run the following action." +msgstr "Wenn Kodi ein Sleep-Ereignis vom System erhält, folgende Aktion ausführen." + +msgctxt "#32702" +msgid "Nothing" +msgstr "Nichts" + +msgctxt "#32703" +msgid "Stop playback" +msgstr "Abspielen stoppen" + +msgctxt "#32704" +msgid "Quit Kodi" +msgstr "Kodi beenden" + +msgctxt "#32705" +msgid "CEC Standby" +msgstr "CEC Standby" + +msgctxt "#32800" +msgid "Skipping intro" +msgstr "Überspringe Intro" + +msgctxt "#32801" +msgid "Skipping credits" +msgstr "Überspringe Abspann" + +msgctxt "#32900" +msgid "While playing back an item and seeking on the seekbar, automatically seek to the selected position after a delay instead of having to confirm the selection." +msgstr "Wird während des Abspielens die Position auf der Zeitleiste verändert, automatisch nach einer Verzögerung auf die gewählte Position springen, ohne diese bestätigen zu müssen." + +msgctxt "#32901" +msgid "Seek delay in seconds." +msgstr "Sprungverzögerung in Sekunden." + +msgctxt "#32902" +msgid "Kodi has its own skip step settings. Try to use them if they're configured instead of the default ones." +msgstr "Kodi besitzt seine eigenen Sprungeinstellungen. Versuche diese anstatt der standardmäßigen zu verwenden, sollten sie konfiguriert sein." + +msgctxt "#32903" +msgid "Use the above for seeking on the timeline as well." +msgstr "Benutze die obrige Einstellung auch für die Zeitleiste." + +msgctxt "#32904" +msgid "In seconds." +msgstr "In Sekunden." + +msgctxt "#32905" +msgid "Cancel post-play timer by pressing OK/SELECT" +msgstr "Post-Play Timer durch OK/AUSWAHL abbrechen" + +msgctxt "#32906" +msgid "Cancel skip marker timer with BACK" +msgstr "Markierung überspringen durch Zurück-Taste abbrechen" + +msgctxt "#32907" +msgid "When auto-skipping a marker, allow cancelling the timer by pressing BACK." +msgstr "Wenn eine Markierung mit einem Zeitgeber automatisch übersprungen wird, durch Zurück-Taste abbrechen." + +msgctxt "#32908" +msgid "Immediately skip marker with OK/SELECT" +msgstr "Markierung sofort überspringen mit OK/AUSWAHL" + +msgctxt "#32909" +msgid "When auto-skipping a marker with a timer, allow skipping immediately by pressing OK/SELECT." +msgstr "Wenn eine Markierung mit einem Zeitgeber automatisch übersprungen wird, durch OK/AUSWAHL-Taste sofort überspringen." + +msgctxt "#32912" +msgid "Show buffer-state on timeline" +msgstr "Zeige Puffer-Stand auf Zeitachse" + +msgctxt "#32913" +msgid "Shows the current Kodi buffer/cache state on the video player timeline." +msgstr "Zeigt den aktuellen Kodi Puffer/Cache-Stand auf der Videoplayer Zeitachse." + +msgctxt "#32914" +msgid "Loading" +msgstr "Lädt" + +msgctxt "#32915" +msgid "Slow connection" +msgstr "Langsame Verbindung" + +msgctxt "#32916" +msgid "Use with a wonky/slow connection, e.g. in a hotel room. Adjusts the UI to visually wait for item refreshes and waits for the buffer to fill when starting playback. Automatically sets readfactor=20, requires Kodi restart." +msgstr "Bei langsamer Verbindung benutzen, z.B. im Hotel. Passt die Oberfläche visuell an um auf Media Auffrischungen zu warten und füllt den Kodi Puffer vor dem Abspielen. Setzt automatisch Kodi Cache readfactor=20, benötigt einen Kodi Neustart." + +msgctxt "#32917" +msgid "Couldn't fill buffer in time ({}s)" +msgstr "Konnte den Puffer nicht schnell genug füllen ({} Sek.)" + +msgctxt "#32918" +msgid "Buffer wait timeout (seconds)" +msgstr "Puffer-Wartezeit (Sekunden)" + +msgctxt "#32919" +msgid "When slow connection is enabled in the addon, wait this long for the buffer to fill. Default: 120 s" +msgstr "Wenn Langsame Verbindung im Addon aktiviert ist, warte so lange bis der Puffer gefüllt ist. Voreinstellung: 120 Sek." + +msgctxt "#32920" +msgid "Insufficient buffer wait (seconds)" +msgstr "Ungenügender Puffer Wartezeit (Sekunden)" + +msgctxt "#32921" +msgid "When slow connection is enabled in the addon and the configured cache/buffer isn't big enough for us to determine its fill state, wait this long when starting playback. Default: 10 s" +msgstr "Wenn \"Langsame Verbindung\" im Addon aktiviert ist und der konfigurierte Puffer/Cache nicht groß genug ist, um seinen Füllstand zu ermitteln, wird so lange gewartet, bevor die Wiedergabe gestartet wird. Voreinstellung: 10 Sek." + +msgctxt "#32922" +msgid "Kodi Cache Readfactor" +msgstr "Kodi Puffer Readfactor" + +msgctxt "#32923" +msgid "Sets the Kodi cache readfactor value. Default: {0}, recommended: {1}. With \"Slow connection\" enabled this will be set to {2}, as otherwise the cache doesn't fill fast/aggressively enough." +msgstr "Setzt den Kodi Cache/Puffer readfactor Wert. Standard: {0}, Empfohlen: {1}. Bei aktivem \"Langsame Verbindung\" wird dies automatisch auf {2} gesetzt, da ansonsten der Cache nicht schnell/agressiv genug gefüllt wird." + +msgctxt "#32924" +msgid "Minimize" +msgstr "Minimieren" + +msgctxt "#32925" +msgid "Playback Settings" +msgstr "Abspieleinstell." + +msgctxt "#32926" +msgid "Wrong pin entered!" +msgstr "Falsche PIN eingegeben!" + +msgctxt "#32927" +msgid "Use episode thumbnails in continue hub" +msgstr "Vorschaubild für Episoden im Fortsetzen-Hub verwenden" + +msgctxt "#32928" +msgid "Instead of using media artwork, use thumbnails for episodes in the continue hub on the home screen if available." +msgstr "Verwende Vorschaubilder anstatt Media-Artwork für Episoden im Fortsetzen-Hub auf der Start-Ansicht." + +msgctxt "#32929" +msgid "Use legacy background fallback image" +msgstr "Veraltetes Ausweich-Hintergrundbild verwenden" + +msgctxt "#32930" +msgid "Previous Subtitle" +msgstr "Vorheriger Untertitel" + +msgctxt "#32931" +msgid "Audio/Subtitles" +msgstr "Audio/Untertitel" + +msgctxt "#32932" +msgid "Show subtitle quick-actions button" +msgstr "Zeige Untertitel-Schnellaktionen-Knopf" + +msgctxt "#32933" +msgid "Show FFWD/RWD buttons" +msgstr "Zeige Vorspulen-Zurückspulen-Knopf" + +msgctxt "#32934" +msgid "Show repeat button" +msgstr "Zeige Wiederholen-Knopf" + +msgctxt "#32935" +msgid "Show shuffle button" +msgstr "Zeige Zufällige-Wiedergabe-Knopf" + +msgctxt "#32936" +msgid "Show playlist button" +msgstr "Zeige Wiedergabeliste-Knopf" + +msgctxt "#32937" +msgid "Show prev/next button" +msgstr "Zeige Vorheriger/Nächster-Knopf" + +msgctxt "#32938" +msgid "Only for Episodes" +msgstr "Nur bei Episoden" + +msgctxt "#32939" +msgid "Only applies to video player UI" +msgstr "Gilt nur für die Video Abspieloberfläche" + +msgctxt "#32940" +msgid "Player UI" +msgstr "Abspieloberfläche" + +msgctxt "#32941" +msgid "Forced subtitles fix" +msgstr "Erzwungene Untertitel beheben" + +msgctxt "#32942" +msgid "Other seasons" +msgstr "Weitere Staffeln" + +msgctxt "#32943" +msgid "Crossfade dynamic background art" +msgstr "Dynamische Hintergrundbilder überblenden" + +msgctxt "#32944" +msgid "Burn-in SSA subtitles (DirectStream)" +msgstr "SSA-Untertitel einbrennen (DirectStream)" + +msgctxt "#32945" +msgid "When Direct Streaming instruct the Plex Server to burn in SSA/ASS subtitles (thus transcoding the video stream). If disabled it will not touch the video stream, but will convert the subtitle to unstyled text." +msgstr "Wird Direct Streaming verwendet, den Plex Server dazu bringen, SSA/ASS-Untertitel einzubrennen (also den Video Stream zu transcoden). Wenn deaktiviert, wird dieser den Video Stream nicht anfassen, jedoch den Untertitel als reinen Text anzeigen." + +msgctxt "#32946" +msgid "Stop video playback on idle after" +msgstr "Bei Inaktivität Video stoppen nach" + +msgctxt "#32947" +msgid "Stop video playback on screensaver" +msgstr "Video stoppen bei Bildschirmschoner" + +msgctxt "#32948" +msgid "Allow auto-skip when transcoding" +msgstr "Überspringen beim Transkodieren erlauben" + +msgctxt "#32949" +msgid "When transcoding/DirectStreaming, allow auto-skip functionality." +msgstr "Beim Transkodieren/DirectStream die automatische Überspringen-Funktionalität erlauben." + +msgctxt "#32950" +msgid "Use extended title for subtitles" +msgstr "Erweiterten Titel für Untertitel verwenden" + +msgctxt "#32951" +msgid "When displaying subtitles use the extendedDisplayTitle Plex exposes." +msgstr "Verwende erweiterte Namen wenn Untertitelnamen angezeigt werden." + +msgctxt "#32952" +msgid "Dialog-Flackern beheben" +msgstr "" + +msgctxt "#32953" +msgid "Reviews" +msgstr "Kritik" + +msgctxt "#32954" +msgid "Needs Kodi restart. WARNING: This will overwrite advancedsettings.xml!\n\nTo customize other cache/network-related values, copy \"script.plexmod/pm4k_cache_template.xml\" to profile folder and edit it to your liking. (See About section for the file paths)" +msgstr "Benötigt Kodi Neustart. ACHTUNG: Überschreibt advancedsettings.xml!\n\nUm weitere Cache-/Netzwerkbezogene Werte zu ändern, kopiere \"script.plexmod/pm4k_cache_template.xml\" in den Profilordner und editiere sie. (Für die Dateipfade schaue in die Über-Sektion)" + +msgctxt "#32955" +msgid "Use Kodi keyboard for searching" +msgstr "Kodi-Tastatur bei der Suche verwenden" + +msgctxt "#32956" +msgid "Poster resolution scaling %" +msgstr "Poster Auflösungsskalierung %" + +msgctxt "#32957" +msgid "In percent. Scales the resolution of all posters/thumbnails for better image quality. May impact PMS/PM4K performance, will increase the cache usage accordingly. Recommended: 200-300 % for big screens if your hardware can handle it. Needs addon restart." +msgstr "In Prozent. Skaliert die Auflösung aller Poster/Vorschaubilder für bessere Bildqualität. Kann die PMS/PM4K Performance beeinflussen, wird die Cache-Nutzung dementsprechend erhöhen. Empfohlen: 200-300 % für große Bildschirme, wenn die Hardware damit umgehen kann. Benötigt Addon-Neustart." + +msgctxt "#32958" +msgid "Calculate OpenSubtitles.com hash" +msgstr "OpenSubtitles.com Prüfsumme berechnen" + +msgctxt "#32959" +msgid "When opening the subtitle download feature, automatically calculate the OpenSubtitles.com hash for the given file. Can improve search results, downloads 2*64 KB of the video file to calculate the hash." +msgstr "Beim Öffnen der Untertitel-Herunterladen-Funktion die Prüfsumme der Datei für OpenSubtitles.com automatisch berechnen. Kann die Suchergebnisse verbessern, lädt 2*64 KB der Videodatei herunter um die Prüfsumme zu berechnen." diff --git a/script.plexmod/resources/language/resource.language.en_gb/strings.po b/script.plexmod/resources/language/resource.language.en_gb/strings.po new file mode 100644 index 000000000..62f5ebd93 --- /dev/null +++ b/script.plexmod/resources/language/resource.language.en_gb/strings.po @@ -0,0 +1,1647 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: en\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#32000" +msgid "Main" +msgstr "" + +msgctxt "#32001" +msgid "Original" +msgstr "" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "" + +msgctxt "#32027" +msgid "Force" +msgstr "" + +msgctxt "#32028" +msgid "Always" +msgstr "" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "" + +msgctxt "#32030" +msgid "Auto" +msgstr "" + +msgctxt "#32031" +msgid "Burn-in Subtitles" +msgstr "" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "" + +msgctxt "#32033" +msgid "Never" +msgstr "" + +msgctxt "#32034" +msgid "On Same network" +msgstr "" + +msgctxt "#32035" +msgid "Always" +msgstr "" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "" + +msgctxt "#32048" +msgid "Audio" +msgstr "" + +msgctxt "#32049" +msgid "Advanced" +msgstr "" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "" + +msgctxt "#32051" +msgid "Privacy" +msgstr "" + +msgctxt "#32052" +msgid "About" +msgstr "" + +msgctxt "#32053" +msgid "Video" +msgstr "" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "" + +msgctxt "#32058" +msgid "Never exceed original audio codec" +msgstr "" + +msgctxt "#32059" +msgid "When transcoding audio, never exceed the original audio bitrate or channel count on the same codec." +msgstr "" + +msgctxt "#32060" +msgid "Use Kodi audio channels" +msgstr "" + +msgctxt "#32061" +msgid "When transcoding audio, target the audio channels set in Kodi." +msgstr "" + +msgctxt "#32062" +msgid "Transcode audio to AC3" +msgstr "" + +msgctxt "#32063" +msgid "Transcode audio to AC3 in certain conditions (useful for passthrough)." +msgstr "" + +msgctxt "#32064" +msgid "Treat DTS like AC3" +msgstr "" + +msgctxt "#32065" +msgid "When any of the force AC3 settings are enabled, treat DTS the same as AC3 (useful for Optical passthrough)" +msgstr "" + +msgctxt "#32066" +msgid "Force audio to AC3" +msgstr "" + +msgctxt "#32067" +msgid "Only force multichannel audio to AC3" +msgstr "" + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "" + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "" + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "" + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "" + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "" + +msgctxt "#32201" +msgid "Trailer" +msgstr "" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "" + +msgctxt "#32203" +msgid "Interview" +msgstr "" + +msgctxt "#32204" +msgid "Music Video" +msgstr "" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "" + +msgctxt "#32206" +msgid "Scene" +msgstr "" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "" + +msgctxt "#32209" +msgid "Concert" +msgstr "" + +msgctxt "#32210" +msgid "Featurette" +msgstr "" + +msgctxt "#32211" +msgid "Short" +msgstr "" + +msgctxt "#32212" +msgid "Other" +msgstr "" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "" + +msgctxt "#32303" +msgid "Season" +msgstr "" + +msgctxt "#32304" +msgid "Episode" +msgstr "" + +msgctxt "#32305" +msgid "Extras" +msgstr "" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "" + +msgctxt "#32307" +msgid "More" +msgstr "" + +msgctxt "#32308" +msgid "Available" +msgstr "" + +msgctxt "#32309" +msgid "None" +msgstr "" + +msgctxt "#32310" +msgid "S" +msgstr "" + +msgctxt "#32311" +msgid "E" +msgstr "" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "" + +msgctxt "#32314" +msgid "In Progress" +msgstr "" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "" + +msgctxt "#32316" +msgid "Resume" +msgstr "" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "" + +msgctxt "#32322" +msgid "Delete" +msgstr "" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "" + +msgctxt "#32325" +msgid "Play Next" +msgstr "" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "" + +msgctxt "#32328" +msgid "Yes" +msgstr "" + +msgctxt "#32329" +msgid "No" +msgstr "" + +msgctxt "#32330" +msgid "Message" +msgstr "" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "" + +msgctxt "#32332" +msgid "Home" +msgstr "" + +msgctxt "#32333" +msgid "Playlists" +msgstr "" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "" + +msgctxt "#32336" +msgid "Exit" +msgstr "" + +msgctxt "#32337" +msgid "Cancel" +msgstr "" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "" + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "" + +msgctxt "#32342" +msgid "Switch User" +msgstr "" + +msgctxt "#32343" +msgid "Settings" +msgstr "" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "" + +msgctxt "#32345" +msgid "All" +msgstr "" + +msgctxt "#32346" +msgid "By Name" +msgstr "" + +msgctxt "#32347" +msgid "Artists" +msgstr "" + +msgctxt "#32348" +msgid "Movies" +msgstr "" + +msgctxt "#32349" +msgid "photos" +msgstr "" + +msgctxt "#32350" +msgid "Shows" +msgstr "" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "" + +msgctxt "#32352" +msgid "Date Added" +msgstr "" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "" + +msgctxt "#32354" +msgid "Release Date" +msgstr "" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "" + +msgctxt "#32357" +msgid "By Name" +msgstr "" + +msgctxt "#32358" +msgid "Name" +msgstr "" + +msgctxt "#32359" +msgid "By Rating" +msgstr "" + +msgctxt "#32360" +msgid "Rating" +msgstr "" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "" + +msgctxt "#32362" +msgid "Resolution" +msgstr "" + +msgctxt "#32363" +msgid "By Duration" +msgstr "" + +msgctxt "#32364" +msgid "Duration" +msgstr "" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "" + +msgctxt "#32366" +msgid "First Aired" +msgstr "" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "" + +msgctxt "#32370" +msgid "Date Played" +msgstr "" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "" + +msgctxt "#32372" +msgid "Play Count" +msgstr "" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "" + +msgctxt "#32375" +msgid "No filters available" +msgstr "" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "" + +msgctxt "#32377" +msgid "Year" +msgstr "" + +msgctxt "#32378" +msgid "Decade" +msgstr "" + +msgctxt "#32379" +msgid "Genre" +msgstr "" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "" + +msgctxt "#32381" +msgid "Network" +msgstr "" + +msgctxt "#32382" +msgid "Collection" +msgstr "" + +msgctxt "#32383" +msgid "Director" +msgstr "" + +msgctxt "#32384" +msgid "Actor" +msgstr "" + +msgctxt "#32385" +msgid "Country" +msgstr "" + +msgctxt "#32386" +msgid "Studio" +msgstr "" + +msgctxt "#32387" +msgid "Labels" +msgstr "" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "" + +msgctxt "#32390" +msgid "Aperture" +msgstr "" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "" + +msgctxt "#32392" +msgid "Lens" +msgstr "" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "" + +msgctxt "#32394" +msgid "Music" +msgstr "" + +msgctxt "#32395" +msgid "Audio" +msgstr "" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "" + +msgctxt "#32397" +msgid "Quality" +msgstr "" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "" + +msgctxt "#32401" +msgid "Directors" +msgstr "" + +msgctxt "#32402" +msgid "Writer" +msgstr "" + +msgctxt "#32403" +msgid "Writers" +msgstr "" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "" + +msgctxt "#32411" +msgid "Unknown" +msgstr "" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "" + +msgctxt "#32414" +msgid "Clear" +msgstr "" + +msgctxt "#32415" +msgid "Edit" +msgstr "" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "" + +msgctxt "#32418" +msgid "Creator" +msgstr "" + +msgctxt "#32419" +msgid "Cast" +msgstr "" + +msgctxt "#32420" +msgid "Disc" +msgstr "" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "" + +msgctxt "#32422" +msgid "Exit" +msgstr "" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "" + +msgctxt "#32424" +msgid "Suspend" +msgstr "" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "" + +msgctxt "#32426" +msgid "Reboot" +msgstr "" + +msgctxt "#32427" +msgid "Failed" +msgstr "" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "" + +msgctxt "#32430" +msgid "Discovery" +msgstr "" + +msgctxt "#32431" +msgid "Search" +msgstr "" + +msgctxt "#32432" +msgid "Space" +msgstr "" + +msgctxt "#32433" +msgid "Clear" +msgstr "" + +msgctxt "#32434" +msgid "Searching..." +msgstr "" + +msgctxt "#32435" +msgid "No Results" +msgstr "" + +msgctxt "#32436" +msgid "Paused" +msgstr "" + +msgctxt "#32437" +msgid "Welcome" +msgstr "" + +msgctxt "#32438" +msgid "Previous" +msgstr "" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "" + +msgctxt "#32440" +msgid "On Deck" +msgstr "" + +msgctxt "#32441" +msgid "Unknown" +msgstr "" + +msgctxt "#32442" +msgid "Embedded" +msgstr "" + +msgctxt "#32443" +msgid "Forced" +msgstr "" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "" + +msgctxt "#32445" +msgid "Mono" +msgstr "" + +msgctxt "#32446" +msgid "Stereo" +msgstr "" + +msgctxt "#32447" +msgid "None" +msgstr "" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "" + +msgctxt "#32450" +msgid "Choose Version" +msgstr "" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "" + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "" + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "" + +msgctxt "#32456" +msgid "Show" +msgstr "" + +msgctxt "#32457" +msgid "By Show" +msgstr "" + +msgctxt "#32458" +msgid "Episodes" +msgstr "" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "" + +msgctxt "#32460" +msgid "Sign In" +msgstr "" + +msgctxt "#32461" +msgid "Albums" +msgstr "" + +msgctxt "#32462" +msgid "Artist" +msgstr "" + +msgctxt "#32463" +msgid "By Artist" +msgstr "" + +msgctxt "#32464" +msgid "Player" +msgstr "" + +msgctxt "#32465" +msgid "Use skip step settings from Kodi" +msgstr "" + +msgctxt "#32466" +msgid "Automatically seek selected position after a delay" +msgstr "" + +msgctxt "#32467" +msgid "User Interface" +msgstr "" + +msgctxt "#32468" +msgid "Show dynamic background art" +msgstr "" + +msgctxt "#32469" +msgid "Background art blur amount" +msgstr "" + +msgctxt "#32470" +msgid "Background art opacity" +msgstr "" + +msgctxt "#32471" +msgid "Use Plex/Kodi steps for timeline" +msgstr "" + +msgctxt "#32480" +msgid "Theme music" +msgstr "" + +msgctxt "#32481" +msgid "Off" +msgstr "" + +msgctxt "#32482" +msgid "%(percentage)s %%" +msgstr "" + +msgctxt "#32483" +msgid "Hide Stream Info" +msgstr "" + +msgctxt "#32484" +msgid "Show Stream Info" +msgstr "" + +msgctxt "#32485" +msgid "Go back instantly with the previous menu action in scrolled views" +msgstr "" + +msgctxt "#32487" +msgid "Seek Delay" +msgstr "" + +msgctxt "#32488" +msgid "Screensaver" +msgstr "" + +msgctxt "#32489" +msgid "Quiz Mode" +msgstr "" + +msgctxt "#32490" +msgid "Collections" +msgstr "" + +msgctxt "#32491" +msgid "Folders" +msgstr "" + +msgctxt "#32492" +msgid "Kodi Subtitle Settings" +msgstr "" + +msgctxt "#32493" +msgid "When a media file has a forced/foreign subtitle for a subtitle-enabled language, the Plex Media Server preselects it. This behaviour is usually not necessary and not configurable. This setting fixes that by ignoring the PMSs decision and selecting the same language without a forced flag if possible." +msgstr "" + +msgctxt "#32495" +msgid "Skip intro" +msgstr "" + +msgctxt "#32496" +msgid "Skip credits" +msgstr "" + + +msgctxt "#32500" +msgid "Always show post-play screen (even for short videos)" +msgstr "" + +msgctxt "#32501" +msgid "Time-to-wait between videos on post-play" +msgstr "" + +msgctxt "#32505" +msgid "Visit media in video playlist instead of playing it" +msgstr "" + +msgctxt "#32521" +msgid "Skip Intro Button Timeout" +msgstr "" + +msgctxt "#32522" +msgid "Automatically Skip Intro" +msgstr "" + +msgctxt "#32523" +msgid "Automatically skip intros if available. Doesn't override enabled binge mode." +msgstr "" + +msgctxt "#32524" +msgid "Set how long the skip intro button shows for." +msgstr "" + +msgctxt "#32525" +msgid "Skip Credits Button Timeout" +msgstr "" + +msgctxt "#32526" +msgid "Automatically Skip Credits" +msgstr "" + +msgctxt "#32527" +msgid "Automatically skip credits if available. Doesn't override enabled binge mode." +msgstr "" + +msgctxt "#32528" +msgid "Set how long the skip credits button shows for." +msgstr "" + +msgctxt "#32540" +msgid "Show when the current video will end in player" +msgstr "" + +msgctxt "#32541" +msgid "Shows time left and at which time the media will end." +msgstr "" + +msgctxt "#32542" +msgid "Show \"Ends at\" label for the end-time as well" +msgstr "" + +msgctxt "#32543" +msgid "Ends at" +msgstr "" + +msgctxt "#32601" +msgid "Allow AV1" +msgstr "" + +msgctxt "#32602" +msgid "Enable this if your hardware can handle AV1. Disable it to force transcoding." +msgstr "" + +msgctxt "#33101" +msgid "By Audience Rating" +msgstr "" + +msgctxt "#33102" +msgid "Audience Rating" +msgstr "" + +msgctxt "#33103" +msgid "By my Rating" +msgstr "" + +msgctxt "#33104" +msgid "My Rating" +msgstr "" + +msgctxt "#33105" +msgid "By Content Rating" +msgstr "" + +msgctxt "#33106" +msgid "Content Rating" +msgstr "" + +msgctxt "#33107" +msgid "By Critic Rating" +msgstr "" + +msgctxt "#33108" +msgid "Critic Rating" +msgstr "" + +msgctxt "#33200" +msgid "Background Color" +msgstr "" + +msgctxt "#33201" +msgid "Specify solid Background Color instead of using media images" +msgstr "" + +msgctxt "#33400" +msgid "Use old compatibility profile" +msgstr "" + +msgctxt "#33401" +msgid "Uses the Chrome client profile instead of the custom one. Might fix rare issues with 3D playback." +msgstr "" + +msgctxt "#33501" +msgid "Video played threshold" +msgstr "" + +msgctxt "#33502" +msgid "Set this to the same value as your Plex server (Settings>Library>Video played threshold) to avoid certain pitfalls, Default: 90 %" +msgstr "" + +msgctxt "#33503" +msgid "Use alternative hubs refresh" +msgstr "" + +msgctxt "#33504" +msgid "Refreshes all hubs for all libraries after an item's watch-state has changed, instead of only those likely affected. Use this if you find a hub that doesn't update properly." +msgstr "" + +msgctxt "#33505" +msgid "Show intro skip button early" +msgstr "" + +msgctxt "#33506" +msgid "Show the intro skip button from the start of a video with an intro marker. The auto-skipping setting applies. Doesn\'t override enabled binge mode." +msgstr "" + +msgctxt "#33507" +msgid "Enabled" +msgstr "" + +msgctxt "#33508" +msgid "Disabled" +msgstr "" + +msgctxt "#33509" +msgid "Early intro skip threshold (default: < 60s/1m)" +msgstr "" + +msgctxt "#33510" +msgid "When showing the intro skip button early, only do so if the intro occurs within the first X seconds." +msgstr "" + +msgctxt "#33600" +msgid "System" +msgstr "" + +msgctxt "#33601" +msgid "Show video chapters" +msgstr "" + +msgctxt "#33602" +msgid "If available, show video chapters from the video-file instead of the timeline-big-seek-steps." +msgstr "" + +msgctxt "#33603" +msgid "Use virtual chapters" +msgstr "" + +msgctxt "#33604" +msgid "When the above is enabled and no video chapters are available, simulate them by using the markers identified by the Plex Server (Intro, Credits)." +msgstr "" + +msgctxt "#33605" +msgid "Video Chapters" +msgstr "" + +msgctxt "#33606" +msgid "Virtual Chapters" +msgstr "" + +msgctxt "#33607" +msgid "Chapter {}" +msgstr "" + +msgctxt "#33608" +msgid "Intro" +msgstr "" + +msgctxt "#33609" +msgid "Credits" +msgstr "" + +msgctxt "#33610" +msgid "Main" +msgstr "" + +msgctxt "#33611" +msgid "Chapters" +msgstr "" + +msgctxt "#33612" +msgid "Markers" +msgstr "" + +msgctxt "#33613" +msgid "Kodi Buffer Size (MB)" +msgstr "" + +msgctxt "#33614" +msgid "Set the Kodi Cache/Buffer size. Free: {} MB, Recommended: ~100 MB, Recommended max: {} MB, Default: 20 MB." +msgstr "" + +msgctxt "#33615" +msgid "{time} left" +msgstr "" + +msgctxt "#33616" +msgid "Addon Path" +msgstr "" + +msgctxt "#33617" +msgid "Userdata/Profile Path" +msgstr "" + +msgctxt "#33618" +msgid "TV binge-viewing mode" +msgstr "" + +msgctxt "#33619" +msgid "Automatically skips episode intros, credits and tries to skip episode recaps. Doesn\'t skip the intro of the first episode of a season.\n\nCan be disabled/enabled per TV show." +msgstr "" + +msgctxt "#33620" +msgid "Plex requests timeout (seconds)" +msgstr "" + +msgctxt "#33621" +msgid "Set the (async and connection) timeout value of the Python requests library in seconds. Default: 5" +msgstr "" + +msgctxt "#33622" +msgid "LAN reachability timeout (ms)" +msgstr "" + +msgctxt "#33623" +msgid "When checking for LAN reachability, use this timeout. Default: 10ms" +msgstr "" + +msgctxt "#33624" +msgid "Network" +msgstr "" + +msgctxt "#33625" +msgid "Smart LAN/local server discovery" +msgstr "" + +msgctxt "#33626" +msgid "Checks whether servers returned from Plex.tv are actually local/in your LAN. For specific setups (e.g. Docker) Plex.tv might not properly detect a local server.\n\nNOTE: Only works on Kodi 19 or above." +msgstr "" + +msgctxt "#33627" +msgid "Prefer LAN/local servers over security" +msgstr "" + +msgctxt "#33628" +msgid "Prioritizes local connections over secure ones. Needs the proper setting in \"Allow Insecure Connections\" and the Plex Server's \"Secure connections\" at \"Preferred\". Can be used to enforce manual servers." +msgstr "" + +msgctxt "#33629" +msgid "Auto-skip intro/credits offset" +msgstr "" + +msgctxt "#33630" +msgid "Intro/credits markers might be a little early in Plex. When auto skipping add (or subtract) this many seconds from the marker. This avoids cutting off content, while possibly skipping the marker a little late." +msgstr "" + +msgctxt "#32631" +msgid "Playback (user-specific)" +msgstr "" + +msgctxt "#33632" +msgid "Server connectivity check timeout (seconds)" +msgstr "" + +msgctxt "#33633" +msgid "Set the maximum amount of time a server connection has to answer a connectivity request. Default: 2.5" +msgstr "" + +msgctxt "#33634" +msgid "Combined Chapters" +msgstr "" + +msgctxt "#33635" +msgid "Final Credits" +msgstr "" + +msgctxt "#32700" +msgid "Action on Sleep event" +msgstr "" + +msgctxt "#32701" +msgid "When Kodi receives a sleep event from the system, run the following action." +msgstr "" + +msgctxt "#32702" +msgid "Nothing" +msgstr "" + +msgctxt "#32703" +msgid "Stop playback" +msgstr "" + +msgctxt "#32704" +msgid "Quit Kodi" +msgstr "" + +msgctxt "#32705" +msgid "CEC Standby" +msgstr "" + +msgctxt "#32800" +msgid "Skipping intro" +msgstr "" + +msgctxt "#32801" +msgid "Skipping credits" +msgstr "" + +msgctxt "#32900" +msgid "While playing back an item and seeking on the seekbar, automatically seek to the selected position after a delay instead of having to confirm the selection." +msgstr "" + +msgctxt "#32901" +msgid "Seek delay in seconds." +msgstr "" + +msgctxt "#32902" +msgid "Kodi has its own skip step settings. Try to use them if they're configured instead of the default ones." +msgstr "" + +msgctxt "#32903" +msgid "Use the above for seeking on the timeline as well." +msgstr "" + +msgctxt "#32904" +msgid "In seconds." +msgstr "" + +msgctxt "#32905" +msgid "Cancel post-play timer by pressing OK/SELECT" +msgstr "" + +msgctxt "#32906" +msgid "Cancel skip marker timer with BACK" +msgstr "" + +msgctxt "#32907" +msgid "When auto-skipping a marker, allow cancelling the timer by pressing BACK." +msgstr "" + +msgctxt "#32908" +msgid "Immediately skip marker with OK/SELECT" +msgstr "" + +msgctxt "#32909" +msgid "When auto-skipping a marker with a timer, allow skipping immediately by pressing OK/SELECT." +msgstr "" + +msgctxt "#32912" +msgid "Show buffer-state on timeline" +msgstr "" + +msgctxt "#32913" +msgid "Shows the current Kodi buffer/cache state on the video player timeline." +msgstr "" + +msgctxt "#32914" +msgid "Loading" +msgstr "" + +msgctxt "#32915" +msgid "Slow connection" +msgstr "" + +msgctxt "#32916" +msgid "Use with a wonky/slow connection, e.g. in a hotel room. Adjusts the UI to visually wait for item refreshes and waits for the buffer to fill when starting playback. Automatically sets readfactor=20, requires Kodi restart." +msgstr "" + +msgctxt "#32917" +msgid "Couldn't fill buffer in time ({}s)" +msgstr "" + +msgctxt "#32918" +msgid "Buffer wait timeout (seconds)" +msgstr "" + +msgctxt "#32919" +msgid "When slow connection is enabled in the addon, wait this long for the buffer to fill. Default: 120 s" +msgstr "" + +msgctxt "#32920" +msgid "Insufficient buffer wait (seconds)" +msgstr "" + +msgctxt "#32921" +msgid "When slow connection is enabled in the addon and the configured buffer isn't big enough for us to determine its fill state, wait this long when starting playback. Default: 10 s" +msgstr "" + +msgctxt "#32922" +msgid "Kodi Cache Readfactor" +msgstr "" + +msgctxt "#32923" +msgid "Sets the Kodi cache readfactor value. Default: {0}, recommended: {1}. With \"Slow connection\" enabled this will be set to {2}, as otherwise the cache doesn't fill fast/aggressively enough." +msgstr "" + +msgctxt "#32924" +msgid "Minimize" +msgstr "" + +msgctxt "#32925" +msgid "Playback Settings" +msgstr "" + +msgctxt "#32926" +msgid "Wrong pin entered!" +msgstr "" + +msgctxt "#32927" +msgid "Use episode thumbnails in continue hub" +msgstr "" + +msgctxt "#32928" +msgid "Instead of using media artwork, use thumbnails for episodes in the continue hub on the home screen if available." +msgstr "" + +msgctxt "#32929" +msgid "Use legacy background fallback image" +msgstr "" + +msgctxt "#32930" +msgid "Previous Subtitle" +msgstr "" + +msgctxt "#32931" +msgid "Audio/Subtitles" +msgstr "" + +msgctxt "#32932" +msgid "Show subtitle quick-actions button" +msgstr "" + +msgctxt "#32933" +msgid "Show FFWD/RWD buttons" +msgstr "" + +msgctxt "#32934" +msgid "Show repeat button" +msgstr "" + +msgctxt "#32935" +msgid "Show shuffle button" +msgstr "" + +msgctxt "#32936" +msgid "Show playlist button" +msgstr "" + +msgctxt "#32937" +msgid "Show prev/next button" +msgstr "" + +msgctxt "#32938" +msgid "Only for Episodes" +msgstr "" + +msgctxt "#32939" +msgid "Only applies to video player UI" +msgstr "" + +msgctxt "#32940" +msgid "Player UI" +msgstr "" + +msgctxt "#32941" +msgid "Forced subtitles fix" +msgstr "" + +msgctxt "#32942" +msgid "Other seasons" +msgstr "" + +msgctxt "#32943" +msgid "Crossfade dynamic background art" +msgstr "" + +msgctxt "#32944" +msgid "Burn-in SSA subtitles (DirectStream)" +msgstr "" + +msgctxt "#32945" +msgid "When Direct Streaming instruct the Plex Server to burn in SSA/ASS subtitles (thus transcoding the video stream). If disabled it will not touch the video stream, but will convert the subtitle to unstyled text." +msgstr "" + +msgctxt "#32946" +msgid "Stop video playback on idle after" +msgstr "" + +msgctxt "#32947" +msgid "Stop video playback on screensaver" +msgstr "" + +msgctxt "#32948" +msgid "Allow auto-skip when transcoding" +msgstr "" + +msgctxt "#32949" +msgid "When transcoding/DirectStreaming, allow auto-skip functionality." +msgstr "" + +msgctxt "#32950" +msgid "Use extended title for subtitles" +msgstr "" + +msgctxt "#32951" +msgid "When displaying subtitles use the extendedDisplayTitle Plex exposes." +msgstr "" + +msgctxt "#32952" +msgid "Dialog flicker fix" +msgstr "" + +msgctxt "#32953" +msgid "Reviews" +msgstr "" + +msgctxt "#32954" +msgid "Needs Kodi restart. WARNING: This will overwrite advancedsettings.xml!\n\nTo customize other cache/network-related values, copy \"script.plexmod/pm4k_cache_template.xml\" to profile folder and edit it to your liking. (See About section for the file paths)" +msgstr "" + +msgctxt "#32955" +msgid "Use Kodi keyboard for searching" +msgstr "" + +msgctxt "#32956" +msgid "Poster resolution scaling %" +msgstr "" + +msgctxt "#32957" +msgid "In percent. Scales the resolution of all posters/thumbnails for better image quality. May impact PMS/PM4K performance, will increase the cache usage accordingly. Recommended: 200-300 % for for big screens if your hardware can handle it. Needs addon restart." +msgstr "" + +msgctxt "#32958" +msgid "Calculate OpenSubtitles.com hash" +msgstr "" + +msgctxt "#32959" +msgid "When opening the subtitle download feature, automatically calculate the OpenSubtitles.com hash for the given file. Can improve search results, downloads 2*64 KB of the video file to calculate the hash." +msgstr "" diff --git a/script.plexmod/resources/language/resource.language.es_es/strings.po b/script.plexmod/resources/language/resource.language.es_es/strings.po new file mode 100644 index 000000000..b8c6adca8 --- /dev/null +++ b/script.plexmod/resources/language/resource.language.es_es/strings.po @@ -0,0 +1,951 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: 2020-05-16 10:52+0200\n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Last-Translator: \n" +"X-Generator: Poedit 2.0.2\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Principal" + +msgctxt "#32001" +msgid "Original" +msgstr "Original" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mbps 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mbps 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mbps 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mbps 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mbps 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mbps 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mbps 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mbps 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kbps" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kbps" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kbps" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kbps" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kbps" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Calidad Local" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Calidad Remoto" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Calidad Online" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Formato transcodificación" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Log Depuración" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Permitir Reproducción en Directo" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Permitir Stream en Directo" + +msgctxt "#32027" +msgid "Force" +msgstr "Forzar" + +msgctxt "#32028" +msgid "Always" +msgstr "Siempre" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Solo formatos de imagen" + +msgctxt "#32030" +msgid "Auto" +msgstr "Auto" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Subtítulos (Solo Reproducción Directo)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Permetir conexiones inseguras" + +msgctxt "#32033" +msgid "Never" +msgstr "Nunca" + +msgctxt "#32034" +msgid "On Same network" +msgstr "En la misma red" + +msgctxt "#32035" +msgid "Always" +msgstr "Siempre" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "Permitir 4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "Permetir HEVC (h265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Accesso automatico" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Post Play Auto Play" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Activar la descarga de subtítulos" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Activar la descarga de subtítulos" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Detección del Servidor (GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Arrancar Plex al iniciar Kodi" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "IP Conexión 1" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Puerto Conexión 1" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "IP Conexión 2" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Puerto conexión 2" + +msgctxt "#32048" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Avanzar" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Servidores manuales" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Privacidad" + +msgctxt "#32052" +msgid "About" +msgstr "Acerca de" + +msgctxt "#32053" +msgid "Video" +msgstr "Video" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Versión Add-on" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Versión Kodi" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Resolución de Pantalla" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Versión del Servidor" + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Omitir selección de usuario y PIN al iniciar." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Si se activa, cuando acabe la reproducción y 'Siguiente Capítulo' esté disponible, se reproducirá automáticamente a los 15 segundos." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Activa esto si se puede reproducir contenido 4K. Desactívalo para forzar la trasncodificación." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Activa esto si se puede reproducir HEVC/h265. Desactiva para forzar la trascodificación." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Conectar a servidores con conexiones no seguras.[CR][CR]* [B]Nunca[/B]: Nunca conectarse a un servidor de forma no segura[CR]* [B]En la misma red[/B]: Permitir para la misma red[CR]* [B]Siempre[/B]: Permitir para todas las conexiones" + +msgctxt "#32201" +msgid "Trailer" +msgstr "Tráiler" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Escenas eliminadas" + +msgctxt "#32203" +msgid "Interview" +msgstr "Entrevista" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Video musical" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "Detrás de las escenas" + +msgctxt "#32206" +msgid "Scene" +msgstr "Escena" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Videos de música en vivo" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Videos de letras musicales" + +msgctxt "#32209" +msgid "Concert" +msgstr "Conciertos" + +msgctxt "#32210" +msgid "Featurette" +msgstr "Featurette" + +msgctxt "#32211" +msgid "Short" +msgstr "Cortos" + +msgctxt "#32212" +msgid "Other" +msgstr "Otros" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Ir a Album" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Ir a Artistas" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Ir a {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Temporada" + +msgctxt "#32304" +msgid "Episode" +msgstr "Capítulo" + +msgctxt "#32305" +msgid "Extras" +msgstr "Extras" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Series relacionadas" + +msgctxt "#32307" +msgid "More" +msgstr "Más" + +msgctxt "#32308" +msgid "Available" +msgstr "Disponible" + +msgctxt "#32309" +msgid "None" +msgstr "Ninguno" + +msgctxt "#32310" +msgid "S" +msgstr "S" + +msgctxt "#32311" +msgid "E" +msgstr "E" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "No disponible" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Este elemento no está disponible actualmente" + +msgctxt "#32314" +msgid "In Progress" +msgstr "En curso" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "¿Continuar reproducción?" + +msgctxt "#32316" +msgid "Resume" +msgstr "Continuar" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Reproducir desde el principio" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Marcar como no visto" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Marcar como visto" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Marca la Temporada como no vista" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Marcar la Temporada como vista" + +msgctxt "#32322" +msgid "Delete" +msgstr "Borrar" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Ir a la Serie" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Ir a {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Reproducir el siguiente" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "¿Borrarlo de verdad?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "¿Seguro que quieres borrar este medio?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Sí" + +msgctxt "#32329" +msgid "No" +msgstr "No" + +msgctxt "#32330" +msgid "Message" +msgstr "Mensaje" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Hubo un problema al intentar borrar este medio." + +msgctxt "#32332" +msgid "Home" +msgstr "Inicio" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Listas de reproducción" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Salir realmente" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "¿Listo para salir de Plex?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Salir" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Cancelar" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Ningún servidor encontrado" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Servidor no accessible" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Tests de conexión en curso. Espere por favor." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Servidor no accessible. Por favor, comprueba la conexión de tu servidor." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Cambiar usuario" + +msgctxt "#32343" +msgid "Settings" +msgstr "Configuración" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Desconectar" + +msgctxt "#32345" +msgid "All" +msgstr "Todo" + +msgctxt "#32346" +msgid "By Name" +msgstr "Por Nombre" + +msgctxt "#32347" +msgid "Artists" +msgstr "Artistas" + +msgctxt "#32348" +msgid "movies" +msgstr "películas" + +msgctxt "#32349" +msgid "photos" +msgstr "fotos" + +msgctxt "#32350" +msgid "Shows" +msgstr "Series" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "Por fecha" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Fecha" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "Por fecha de estreno" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Fecha de estreno" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Por fecha de visionado" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Fecha de visionado" + +msgctxt "#32357" +msgid "By Name" +msgstr "Por nombre" + +msgctxt "#32358" +msgid "Name" +msgstr "Nombre" + +msgctxt "#32359" +msgid "By Rating" +msgstr "Por valoración" + +msgctxt "#32360" +msgid "Rating" +msgstr "Valoración" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "Por Resolución" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Resolución" + +msgctxt "#32363" +msgid "By Duration" +msgstr "Por Duración" + +msgctxt "#32364" +msgid "Duration" +msgstr "Duración" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "Por primera emisión" + +msgctxt "#32366" +msgid "First Aired" +msgstr "Primera emisión" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Por No Vistos" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Non visto" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "Por Fecha de Reproducción" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Fecha de Reproducción" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "Por Número de Reproducciones" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Número de Reproducciones" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Por Fecha de Captura" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Fecha de Captura" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Sin filtros disponbles" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Quitar filtros" + +msgctxt "#32377" +msgid "Year" +msgstr "Año" + +msgctxt "#32378" +msgid "Decade" +msgstr "Década" + +msgctxt "#32379" +msgid "Genre" +msgstr "Género" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Clasificación por Edad" + +msgctxt "#32381" +msgid "Network" +msgstr "Red" + +msgctxt "#32382" +msgid "Collection" +msgstr "Colección" + +msgctxt "#32383" +msgid "Director" +msgstr "Dirección" + +msgctxt "#32384" +msgid "Actor" +msgstr "Actores" + +msgctxt "#32385" +msgid "Country" +msgstr "País" + +msgctxt "#32386" +msgid "Studio" +msgstr "Estudio" + +msgctxt "#32387" +msgid "Labels" +msgstr "Etiquetas" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Marca de Cámara" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Modelo de Cámera" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Apertura" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Velocidad de apertura" + +msgctxt "#32392" +msgid "Lens" +msgstr "Lente" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Series de TV" + +msgctxt "#32394" +msgid "Music" +msgstr "Música" + +msgctxt "#32395" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Subtítulos" + +msgctxt "#32397" +msgid "Quality" +msgstr "Calidad" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Configuración de Video de Kodi" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Configuración de Audio de Kodi" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Ir a Temporada" + +msgctxt "#32401" +msgid "Directors" +msgstr "Dirección" + +msgctxt "#32402" +msgid "Writer" +msgstr "Autor" + +msgctxt "#32403" +msgid "Writers" +msgstr "Guionistas" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Películas relacionadas" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Descargar Subtítulos" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Retardo en Subtítulos" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Siguiente Subtítulo" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Desactivar Subtítulos" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Activar Subtítulos" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Versión de la Plataforma" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Desconocido" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Modificar o Borrar" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "¿Editar la direeción IP o borrar la configuración?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Borrar" + +msgctxt "#32415" +msgid "Edit" +msgstr "Modificar" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Introduce la Dirección IP" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Introduce el Puerto" + +msgctxt "#32418" +msgid "Creator" +msgstr "Creador" + +msgctxt "#32419" +msgid "Cast" +msgstr "Elenco" + +msgctxt "#32420" +msgid "Disc" +msgstr "Disco" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Desconectar" + +msgctxt "#32422" +msgid "Exit" +msgstr "Salir" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Apagar" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Suspender" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Hibernar" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Reiniciar" + +msgctxt "#32427" +msgid "Failed" +msgstr "Fallo" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "¡El acceso falló!" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Continuar desde {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Descubrimiento" + +msgctxt "#32431" +msgid "Search" +msgstr "Búsqueda" + +msgctxt "#32432" +msgid "Space" +msgstr "Espacio" + +msgctxt "#32433" +msgid "Clear" +msgstr "Borrar" + +msgctxt "#32434" +msgid "Searching..." +msgstr "Buscando..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Sin resultados" + +msgctxt "#32436" +msgid "Paused" +msgstr "En Pausa" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Bienvenido" + +msgctxt "#32438" +msgid "Previous" +msgstr "Anterior" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "Reproducir el Siguiente" + +msgctxt "#32440" +msgid "On Deck" +msgstr "En Portada" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Desconocido" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Integrado" + +msgctxt "#32443" +msgid "Forced" +msgstr "Forzado" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Letras" + +msgctxt "#32445" +msgid "Mono" +msgstr "Mono" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Stereo" + +msgctxt "#32447" +msgid "None" +msgstr "Ninguno" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "¡La reproducción falló!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "No pude conectarme a plex.tv[CR]Comprueba la conexión y vuelve a intentarlo." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Elegir una Versión" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Reproduce un Versión..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "No hay contenido disponible en esta bilioteca" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Por favo, añade contenido y/o comprueba que 'Incluir en el dashboard' esté activado." + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Sin contenido disponible por este filtro" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Por favor, cambie o quite el filtro actual" + +msgctxt "#32456" +msgid "Show" +msgstr "Serie" + +msgctxt "#32457" +msgid "By Show" +msgstr "Por Serie" + +msgctxt "#32458" +msgid "Episodes" +msgstr "Capítulo" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "Modo Offline" + +msgctxt "#32460" +msgid "Sign In" +msgstr "Acceso" + +msgctxt "#32461" +msgid "Albums" +msgstr "Albums" + +msgctxt "#32462" +msgid "Artist" +msgstr "Artista" + +msgctxt "#32463" +msgid "By Artist" +msgstr "Por Artista" diff --git a/script.plexmod/resources/language/resource.language.fr_fr/strings.po b/script.plexmod/resources/language/resource.language.fr_fr/strings.po new file mode 100644 index 000000000..b4ec81eca --- /dev/null +++ b/script.plexmod/resources/language/resource.language.fr_fr/strings.po @@ -0,0 +1,953 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: 2017-05-29 16:47++0200\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Main" + +msgctxt "#32001" +msgid "Original" +msgstr "Original" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mbps 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mbps 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mbps 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mbps 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mbps 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mbps 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mbps 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mbps 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kbps" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kbps" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kbps" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kbps" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kbps" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Qualité locale" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Qualité distante" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Qualité online" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Format transcodage" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Debug Logging" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Autoriser Direct Play" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Autoriser Direct Stream" + +msgctxt "#32027" +msgid "Force" +msgstr "Force" + +msgctxt "#32028" +msgid "Always" +msgstr "Toujours" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Seulement formats d'image" + +msgctxt "#32030" +msgid "Auto" +msgstr "Auto" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Incruster sous-titres (pour Direct Play)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Autoriser connexions non sécurisées" + +msgctxt "#32033" +msgid "Never" +msgstr "Jamais" + +msgctxt "#32034" +msgid "On Same network" +msgstr "Sur le même réseau" + +msgctxt "#32035" +msgid "Always" +msgstr "Toujours" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "Autoriser 4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "Autoriser HEVC (h265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Connexion automatique" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Post Play Auto Play" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Activer le téléchargement des sous-titres" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Activer le téléchargement des sous-titres" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Server Discovery (GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Démarrer Plex au démarrage de Kodi" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "Connexion 1 IP" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Connexion 1 Port" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "Connexion 2 IP" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Connexion 2 Port" + +msgctxt "#32048" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Avancée" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Serveurs manuels" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Privacy" + +msgctxt "#32052" +msgid "About" +msgstr "A propos" + +msgctxt "#32053" +msgid "Video" +msgstr "Video" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Version de l'addon" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Version de kodi" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Résolution de l'écran" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Version actuelle du serveur" + + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Passer l'écran de sélection de l'utilisateur et du PIN au démarrage" + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Si actif, à la fin de la lecture, les éléments suivants seront joués après un délai de 15s." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Activer cette option si votre hardware est capable de lire la 4K. Désactiver pour forcer le transcodage." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Activer cette option si votre hardware est capable de décoder l'HEVC/h265. Désactiver pour forcer le transcodage." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Pour se connecter à un serveur via une connexion non sécurisée.[CR][CR]* [B]Attention[/B]: Ne jamais se connecter à un serveur via une connexion son sécurisée[CR]* [B]Sur le même réseau[/B]: Autoriser si même réseau[CR]* [B]Toujours[/B]: Autoriser même réseau et connexions distantes" + + +msgctxt "#32201" +msgid "Trailer" +msgstr "Bande-annonce" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Supprimer scène" + +msgctxt "#32203" +msgid "Interview" +msgstr "Interview" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Vidéos Musiques" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "Dans les coulisses" + +msgctxt "#32206" +msgid "Scene" +msgstr "Scene" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Vidéos Musiques Live" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Paroles vidéos musiques" + +msgctxt "#32209" +msgid "Concert" +msgstr "Concert" + +msgctxt "#32210" +msgid "Featurette" +msgstr "Featurette" + +msgctxt "#32211" +msgid "Short" +msgstr "Courte" + +msgctxt "#32212" +msgid "Other" +msgstr "Autres" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Voir l'album" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Voir l'artiste" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Aller à {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Saison" + +msgctxt "#32304" +msgid "Episode" +msgstr "Episode" + +msgctxt "#32305" +msgid "Extras" +msgstr "Extras" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Liens" + +msgctxt "#32307" +msgid "More" +msgstr "Plus" + +msgctxt "#32308" +msgid "Available" +msgstr "Disponible" + +msgctxt "#32309" +msgid "None" +msgstr "Aucun" + +msgctxt "#32310" +msgid "S" +msgstr "S" + +msgctxt "#32311" +msgid "E" +msgstr "E" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "Non disponible" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Cet élément n'est actuellement pas disponible." + +msgctxt "#32314" +msgid "In Progress" +msgstr "En cours" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Poursuivre la lecture ?" + +msgctxt "#32316" +msgid "Resume" +msgstr "Resume" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Lire depuis le début" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Marquer comme non vu" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Marquer comme vu" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Marquer saison comme non vue" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Marquer saison comme vue" + +msgctxt "#32322" +msgid "Delete" +msgstr "Supprimer" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Voir le Show" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Aller à {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Lire le media suivant" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Supprimer?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Etes-vous sûr de vouloir supprimer ce media ?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Oui" + +msgctxt "#32329" +msgid "No" +msgstr "Non" + +msgctxt "#32330" +msgid "Message" +msgstr "Message" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Erreur : impossible de supprimer le media" + +msgctxt "#32332" +msgid "Home" +msgstr "Home" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Playlists" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Quitter" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Souhaitez-vous quitter Plex ?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Quitter" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Annuler" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Aucun serveur trouvé" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Serveur non accessible" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Tests de connexion en cours. Merci de patienter." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Serveur non joignable. Merci de vérifier l'accessibilité du serveur." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Changer d'utilisateur" + +msgctxt "#32343" +msgid "Settings" +msgstr "Paramètres" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Déconnexion" + +msgctxt "#32345" +msgid "All" +msgstr "Tous" + +msgctxt "#32346" +msgid "By Name" +msgstr "Par Nom" + +msgctxt "#32347" +msgid "Artists" +msgstr "Artites" + +msgctxt "#32348" +msgid "movies" +msgstr "films" + +msgctxt "#32349" +msgid "photos" +msgstr "photos" + +msgctxt "#32350" +msgid "Shows" +msgstr "Séries" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "Par date d'ajout" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Date d'ajout" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "Par date de sortie" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Date de sortie" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Par date de visionnage" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Date du visionnage" + +msgctxt "#32357" +msgid "By Name" +msgstr "Par nom" + +msgctxt "#32358" +msgid "Name" +msgstr "Nom" + +msgctxt "#32359" +msgid "By Rating" +msgstr "Par note" + +msgctxt "#32360" +msgid "Rating" +msgstr "Note" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "Par qualité" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Qualité" + +msgctxt "#32363" +msgid "By Duration" +msgstr "Par durée" + +msgctxt "#32364" +msgid "Duration" +msgstr "Durée" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "Par première diffusion" + +msgctxt "#32366" +msgid "First Aired" +msgstr "Première diffusion" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Par non vus" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Non vus" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "Par date de lecture" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Date de lecture" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "Par nombre de lectures" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Nombre de lectures" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Par date de prise de vue" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Date de prise de vue" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Aucuns filtres disponibles" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Effacer filtres" + +msgctxt "#32377" +msgid "Year" +msgstr "Année" + +msgctxt "#32378" +msgid "Decade" +msgstr "Décennie" + +msgctxt "#32379" +msgid "Genre" +msgstr "Genre" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Note du contenu" + +msgctxt "#32381" +msgid "Network" +msgstr "Réseau" + +msgctxt "#32382" +msgid "Collection" +msgstr "Collection" + +msgctxt "#32383" +msgid "Director" +msgstr "Réalisateur" + +msgctxt "#32384" +msgid "Actor" +msgstr "Acteur" + +msgctxt "#32385" +msgid "Country" +msgstr "Pays" + +msgctxt "#32386" +msgid "Studio" +msgstr "Studio" + +msgctxt "#32387" +msgid "Labels" +msgstr "Labels" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Marque appareil photo" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Modèle caméra" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Aperture" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Vitesse d'obturation" + +msgctxt "#32392" +msgid "Lens" +msgstr "Lentille" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Séries TV" + +msgctxt "#32394" +msgid "Music" +msgstr "Musiques" + +msgctxt "#32395" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Sous-titres" + +msgctxt "#32397" +msgid "Quality" +msgstr "Qualité" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Paramètres vidéo Kodi" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Paramètres audio Kodi" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Aller à la saison" + +msgctxt "#32401" +msgid "Directors" +msgstr "Réalisateurs" + +msgctxt "#32402" +msgid "Writer" +msgstr "Auteur" + +msgctxt "#32403" +msgid "Writers" +msgstr "Auteurs" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Films liés" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Télécharger sous-titres" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Délai sous-titres" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Sous-titres suivants" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Désactiver sous-titres" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Activer sous-titres" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Version de la plateforme" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Inconnu" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Editer ou Effacer" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "Editer adresse IP ou effacer les paramètres actuels ?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Effacer" + +msgctxt "#32415" +msgid "Edit" +msgstr "Editer" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Saisir adresse IP" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Saisir le port" + +msgctxt "#32418" +msgid "Creator" +msgstr "Creator" + +msgctxt "#32419" +msgid "Cast" +msgstr "Casting" + +msgctxt "#32420" +msgid "Disc" +msgstr "Disc" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Déconnexion" + +msgctxt "#32422" +msgid "Exit" +msgstr "Quitter" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Eteindre" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Veille" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Veille prolongée" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Redémarrer" + +msgctxt "#32427" +msgid "Failed" +msgstr "Echec" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "Impossible de se connecter" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Reprendre à {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Recherche" + +msgctxt "#32431" +msgid "Search" +msgstr "Recherche" + +msgctxt "#32432" +msgid "Space" +msgstr "Espace" + +msgctxt "#32433" +msgid "Clear" +msgstr "Effacer" + +msgctxt "#32434" +msgid "Searching..." +msgstr "Recherche en cours..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Aucun résultat" + +msgctxt "#32436" +msgid "Paused" +msgstr "Pause" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Bienvenue" + +msgctxt "#32438" +msgid "Previous" +msgstr "Précédent" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "A regarder ensuite" + +msgctxt "#32440" +msgid "On Deck" +msgstr "Découvrir" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Inconnu" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Intégré" + +msgctxt "#32443" +msgid "Forced" +msgstr "Forcé" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Parole" + +msgctxt "#32445" +msgid "Mono" +msgstr "Mono" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Stereo" + +msgctxt "#32447" +msgid "None" +msgstr "Aucun" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "Echec de lecture!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Impossible de se connecter à plex.tv[CR]Vérifiez votre connexion et réessayez." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Choisir une version" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Lire version..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "" + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Aucun contenu disponible dans cette librairie" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Merci de modifier ou supprimer le filtre courant" + +msgctxt "#32456" +msgid "Show" +msgstr "" + +msgctxt "#32457" +msgid "By Show" +msgstr "" + +msgctxt "#32458" +msgid "Episodes" +msgstr "" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "Mode Hors-Ligne" + +msgctxt "#32460" +msgid "Sign In" +msgstr "Se connecter" + +msgctxt "#32461" +msgid "Albums" +msgstr "" + +msgctxt "#32462" +msgid "Artist" +msgstr "" + +msgctxt "#32463" +msgid "By Artist" +msgstr "" + diff --git a/script.plexmod/resources/language/resource.language.hu_hu/strings.po b/script.plexmod/resources/language/resource.language.hu_hu/strings.po new file mode 100644 index 000000000..18410177c --- /dev/null +++ b/script.plexmod/resources/language/resource.language.hu_hu/strings.po @@ -0,0 +1,928 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: 2017-04-21 19:23+0100\n" +"Last-Translator: Norbert Suto \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Főoldal" + +msgctxt "#32001" +msgid "Original" +msgstr "Eredeti" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mbps 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mbps 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mbps 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mbps 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mbps 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mbps 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mbps 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mbps 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kbps" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kbps" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kbps" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kbps" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kbps" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Helyi minőség" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Távoli minőség" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Online minőség" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Átkódolási formátum" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Hibakeresési naplózás" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Közvetlen lejátszás engedélyezése" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Közvetlen adatfolyam engedélyezése" + +msgctxt "#32027" +msgid "Force" +msgstr "Kényszerítés" + +msgctxt "#32028" +msgid "Always" +msgstr "Mindig" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Csak képformátumok esetében" + +msgctxt "#32030" +msgid "Auto" +msgstr "Automatikus" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Feliratok égetése (Csak közvetlen lejátszás esetén)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Nem biztonságos kapcsolatok engedélyezése" + +msgctxt "#32033" +msgid "Never" +msgstr "Soha" + +msgctxt "#32034" +msgid "On Same network" +msgstr "Ugyanazon a hálózaton" + +msgctxt "#32035" +msgid "Always" +msgstr "Mindig" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "4K engedélyezése" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "HEVC (h265) engedélyezése" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Automatikus bejelentkezés" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Post Play Auto Play" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Felirat letöltés engedélyezése" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Felirat letöltés engedélyezése" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Szerver felderítés" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Indítsa el a Plexet a Kodi indításakor" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "1. Kapcsolat IP" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "1. Kapcsolat Port" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "2. Kapcsolat IP" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "2. Kapcsolat Port" + +msgctxt "#32048" +msgid "Audio" +msgstr "Audió" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Fejlett beállítások" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Kézi szerverek" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Adatvédelem" + +msgctxt "#32052" +msgid "About" +msgstr "Rólunk" + +msgctxt "#32053" +msgid "Video" +msgstr "Videó" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Addon verzió" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Kodi verzió" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Képernyőfelbontás" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Jelenlegi szerver verzió" + + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Felhasználó kiválasztás és a PIN kód megadás átugrása indításkor." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Ha engedélyezi, akkor a lejátszás befejezése után, amennyiben rendelkezésre áll egy \"következő\" elem, az 15 másodperces késleltetés után automatikusan lejátszásra kerül." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Engedélyezze ezt, ha a hardver képes a 4K lejátszásra. Kapcsolja ki, amennyiben kényszeríteni szeretné az átkódolást." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Engedélyezze ezt, ha a hardver képes a HEVC/h265 lejátszásra. Kapcsolja ki, amennyiben kényszeríteni szeretné az átkódolást." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Mikor kapcsolódhat nem biztonságosan a szerverekhez.[CR][CR]* [B]Soha[/B]: Soha ne kapcsolódjon[CR]* [B]Azonos hálózat[/B]: Azonos hálózat esetén engedélyezze[CR]* [B]Mindig[/B]: Engedélyezze helyi és távoli kapcsolat esetén is" + + +msgctxt "#32201" +msgid "Trailer" +msgstr "Előzetes" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Törölt jelenet" + +msgctxt "#32203" +msgid "Interview" +msgstr "Interjú" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Videóklip" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "A kulisszák mögött" + +msgctxt "#32206" +msgid "Scene" +msgstr "Jelenet" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Élő zenei videó" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Zenei videó dalszöveggel" + +msgctxt "#32209" +msgid "Concert" +msgstr "Koncert" + +msgctxt "#32210" +msgid "Featurette" +msgstr "Kísérő film" + +msgctxt "#32211" +msgid "Short" +msgstr "Rövidfilm" + +msgctxt "#32212" +msgid "Other" +msgstr "Egyéb" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Ugrás az Albumra" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Ugrás az előadóra" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Ugrás ide {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Évad" + +msgctxt "#32304" +msgid "Episode" +msgstr "Epizód" + +msgctxt "#32305" +msgid "Extras" +msgstr "Extrák" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Kapcsolódó műsorok" + +msgctxt "#32307" +msgid "More" +msgstr "Egyéb" + +msgctxt "#32308" +msgid "Available" +msgstr "Elérhető" + +msgctxt "#32309" +msgid "None" +msgstr "Nincs" + +msgctxt "#32310" +msgid "S" +msgstr "" + +msgctxt "#32311" +msgid "E" +msgstr "" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "Nem elérhető" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Ez az elem jelenleg nem érhető el." + +msgctxt "#32314" +msgid "In Progress" +msgstr "Folyamatban" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Folytatja a lejátszást?" + +msgctxt "#32316" +msgid "Resume" +msgstr "Folytat" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Lejátszás az elejétől" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Nem nézettnek jelölés" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Nézettnek jelölés" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Az évad nem nézettnek jelölése" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Az évad nézettnek jelölése" + +msgctxt "#32322" +msgid "Delete" +msgstr "Törlés" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Ugrás a műsorra" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Ugrás {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Következő lejátszása" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Tényleg törli?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Biztos benne, hogy törli az alábbi tartalmat?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Igen" + +msgctxt "#32329" +msgid "No" +msgstr "Nem" + +msgctxt "#32330" +msgid "Message" +msgstr "Üzenet" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Probléma történt a tartalom törlése közben." + +msgctxt "#32332" +msgid "Home" +msgstr "Kezdőoldal" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Lejátszási listák" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Kilépés megerősítése" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Készen áll arra, hogy kilépjen a Plexből?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Kilépés" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Mégse" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Nem található szerver" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "A szerver nem elérhető" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "A kapcsolat tesztelése folyamatban. Kérem várjon." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "A szerver nem elérhető. Kérem jelentkezzen be a szerverébe és ellenőrizze a hálózati kapcsolatot." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Felhasználóváltás" + +msgctxt "#32343" +msgid "Settings" +msgstr "Beállítások" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Kijelentkezés" + +msgctxt "#32345" +msgid "All" +msgstr "Összes" + +msgctxt "#32346" +msgid "By Name" +msgstr "Név szerint" + +msgctxt "#32347" +msgid "artists" +msgstr "előadók" + +msgctxt "#32348" +msgid "movies" +msgstr "filmek" + +msgctxt "#32349" +msgid "photos" +msgstr "fényképek" + +msgctxt "#32350" +msgid "shows" +msgstr "műsorok" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "Hozzáadás dátuma szerint" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Dátum szerint" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "Megjelenés dátuma szerint" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Megjelenés dátuma" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Megtekintés dátuma szerint" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Megtekintés dátuma" + +msgctxt "#32357" +msgid "By Name" +msgstr "Név szerint" + +msgctxt "#32358" +msgid "Name" +msgstr "Név" + +msgctxt "#32359" +msgid "By Rating" +msgstr "Értékelés szerint" + +msgctxt "#32360" +msgid "Rating" +msgstr "Értékelés" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "Felbontás szerint" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Felbontás" + +msgctxt "#32363" +msgid "By Duration" +msgstr "Időtartam szerint" + +msgctxt "#32364" +msgid "Duration" +msgstr "Időtartam" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "Első sugárzás dátuma szerint" + +msgctxt "#32366" +msgid "First Aired" +msgstr "Első sugárzás dátuma" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Nem megtekintettek szerint" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Nem megtekintettek" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "Lejátszás dátuma szerint" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Lejátszás dátuma" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "Lájátszások száma szerint" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Lejátszások száma" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Készítés dátuma szerint" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Készítés dátuma" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Nincs elérhető szűrő" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Szűrők eltávolítása" + +msgctxt "#32377" +msgid "Year" +msgstr "Év" + +msgctxt "#32378" +msgid "Decade" +msgstr "Évtized" + +msgctxt "#32379" +msgid "Genre" +msgstr "Műfaj" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Értékelés" + +msgctxt "#32381" +msgid "Network" +msgstr "Csatorna" + +msgctxt "#32382" +msgid "Collection" +msgstr "Nyűjtemény" + +msgctxt "#32383" +msgid "Director" +msgstr "Rendező" + +msgctxt "#32384" +msgid "Actor" +msgstr "Színész" + +msgctxt "#32385" +msgid "Country" +msgstr "Ország" + +msgctxt "#32386" +msgid "Studio" +msgstr "Stúdió" + +msgctxt "#32387" +msgid "Labels" +msgstr "Cimkék" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Fényképezőgép gyártmánya" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Fényképezőgép Modell" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Rekesz" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Zár sebesség" + +msgctxt "#32392" +msgid "Lens" +msgstr "Lencsék" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Sorozatok" + +msgctxt "#32394" +msgid "Music" +msgstr "Zene" + +msgctxt "#32395" +msgid "Audio" +msgstr "Audió" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Feliratok" + +msgctxt "#32397" +msgid "Quality" +msgstr "Minőség" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Kodi videó beállitások" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Kodi audió beállitások" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Ugrás az évadra" + +msgctxt "#32401" +msgid "Directors" +msgstr "Rendezők" + +msgctxt "#32402" +msgid "Writer" +msgstr "Szerző" + +msgctxt "#32403" +msgid "Writers" +msgstr "Szerzők" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Kapcsolódó filmek" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Feliratok letöltése" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Felirat késleltetés" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Következő felirat" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Feliratok letiltása" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Feliratok engedélyezése" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Platform verzió" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Ismeretlen" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Szerkesztés vagy törlés" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "Módosíthatja az IP-címet, vagy törli az aktuális beállítást?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Törlés" + +msgctxt "#32415" +msgid "Edit" +msgstr "Módositás" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Adja meg az IP-címet" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Adja meg a port számát" + +msgctxt "#32418" +msgid "Creator" +msgstr "Alkotó" + +msgctxt "#32419" +msgid "Cast" +msgstr "Szereplők" + +msgctxt "#32420" +msgid "Disc" +msgstr "Lemez" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Kijelentkezés" + +msgctxt "#32422" +msgid "Exit" +msgstr "Kilépés" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Leállítás" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Felfüggesztés" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Hibernálás" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Újraindítás" + +msgctxt "#32427" +msgid "Failed" +msgstr "Sikertelen" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "Bejelentkezés sikertelen" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Folytatás innen {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Felfedezés" + +msgctxt "#32431" +msgid "Search" +msgstr "Keresés" + +msgctxt "#32432" +msgid "Space" +msgstr "Space" + +msgctxt "#32433" +msgid "Clear" +msgstr "Törlés mind" + +msgctxt "#32434" +msgid "Searching..." +msgstr "Keresés..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Nincs találat" + +msgctxt "#32436" +msgid "Paused" +msgstr "Szünetelve" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Üdvözöljük" + +msgctxt "#32438" +msgid "Previous" +msgstr "Előző" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "Következő lejátszása" + +msgctxt "#32440" +msgid "On Deck" +msgstr "Jelenlegi" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Ismeretlen" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Beágyazott" + +msgctxt "#32443" +msgid "Forced" +msgstr "Kényszerített" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Dalszöveg" + +msgctxt "#32445" +msgid "Mono" +msgstr "Monó" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Sztereó" + +msgctxt "#32447" +msgid "None" +msgstr "Nincs" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "A lejátszás sikertelen!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Nem lehet csatlakozni a plex.tv-hez[CR]Ellenőrizze az internetkapcsolatot, és próbálja újra." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Verzió választása" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Verzió lejátszása..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "Nincs elérhető tartalom ebben a könyvtárban" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Kérem adjon hozzá tartalmat és/vagy ellenőrizze, hogy a 'Hozzáadás az irányítópulthoz' opció be van kapcsolva" + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Nincs elérhető tartalom ezzel a szűrővel" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Kérem változtassa meg, vagy távolítsa el a jelenlegi szűrőt" + +msgctxt "#32456" +msgid "Offline Mode" +msgstr "Offline mód" + +msgctxt "#32457" +msgid "Sign In" +msgstr "Bejelentkezés" diff --git a/script.plexmod/resources/language/resource.language.it_it/strings.po b/script.plexmod/resources/language/resource.language.it_it/strings.po new file mode 100644 index 000000000..50dee38bc --- /dev/null +++ b/script.plexmod/resources/language/resource.language.it_it/strings.po @@ -0,0 +1,951 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: 2017-05-25 10:52+0200\n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Last-Translator: \n" +"X-Generator: Poedit 2.0.2\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Principale" + +msgctxt "#32001" +msgid "Original" +msgstr "Originale" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mbps 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mbps 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mbps 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mbps 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mbps 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mbps 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mbps 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mbps 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kbps" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kbps" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kbps" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kbps" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kbps" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Qualità Locale" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Qualità Remota" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Qualità Online" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Formato transcodifica" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Log di Debug" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Permetti Play Diretto" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Permetti Stream Diretto" + +msgctxt "#32027" +msgid "Force" +msgstr "Forza" + +msgctxt "#32028" +msgid "Always" +msgstr "Sempre" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Solo formati immagine" + +msgctxt "#32030" +msgid "Auto" +msgstr "Auto" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Sottotitoli (Solo Play Diretto)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Permetti connessioni non sicure" + +msgctxt "#32033" +msgid "Never" +msgstr "Mai" + +msgctxt "#32034" +msgid "On Same network" +msgstr "Sulla stessa rete" + +msgctxt "#32035" +msgid "Always" +msgstr "Sempre" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "Permetti 4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "Permetti HEVC (h265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Accesso (Sign In) automatico" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Post Play Auto Play" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Abilita il download dei sottotitoli" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Abilita il download dei sottotitoli" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Ricerca Server (GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Esegui Plex all'avvio di Kodi" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "IP connessione 1" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Porta connessione 1" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "IP connessione 2" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Porta connessione 2" + +msgctxt "#32048" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Avanzate" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Server manuali" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Privacy" + +msgctxt "#32052" +msgid "About" +msgstr "Circa" + +msgctxt "#32053" +msgid "Video" +msgstr "Video" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Versione Addon" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Versione Kodi" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Risoluzione schermo" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Versione Server attuale" + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "All'avvio salta l'immissione del PIN e la selezione utente." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Se abilitato, quando la riproduzione finisce e un 'Titolo Successivo' è disponibile, sarà automaticamente riprodotto dopo un ritardo di 15 secondi." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Abilita se il tuo hardware supporta la riproduzione 4K. Disabilita per forzare la trascodifica." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Abilita se il tuo hardware supporta HEVC/h265. Disabilita per forzare la trascodifica." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Quando connettersi a Server con connessioni non sicure.[CR][CR]* [B]Mai[/B]: Mai connettersi a Server non sicuri[CR]* [B]Sulla stessa Rete[/B]: Permetti se nella stessa Rete[CR]* [B]Sempre[/B]: Permetti sulla stessa Rete e su Reti remote" + +msgctxt "#32201" +msgid "Trailer" +msgstr "Trailer" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Scene cancellate" + +msgctxt "#32203" +msgid "Interview" +msgstr "Intervista" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Video musicali" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "Dietro le scene" + +msgctxt "#32206" +msgid "Scene" +msgstr "Scena" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Video musicali dal vivo" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Testi video musicali" + +msgctxt "#32209" +msgid "Concert" +msgstr "Concerto" + +msgctxt "#32210" +msgid "Featurette" +msgstr "Featurette" + +msgctxt "#32211" +msgid "Short" +msgstr "Corto" + +msgctxt "#32212" +msgid "Other" +msgstr "Altro" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Vai all'Album" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Vai all'Artista" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Vai a {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Stagione" + +msgctxt "#32304" +msgid "Episode" +msgstr "Episodio" + +msgctxt "#32305" +msgid "Extras" +msgstr "Extras" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Serie correlate" + +msgctxt "#32307" +msgid "More" +msgstr "Più" + +msgctxt "#32308" +msgid "Available" +msgstr "Disponibile" + +msgctxt "#32309" +msgid "None" +msgstr "Nessuno" + +msgctxt "#32310" +msgid "S" +msgstr "S" + +msgctxt "#32311" +msgid "E" +msgstr "E" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "Non disponibile" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Questo elemento non è al momento diponibile" + +msgctxt "#32314" +msgid "In Progress" +msgstr "In Corso" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Riprendere la riproduzione?" + +msgctxt "#32316" +msgid "Resume" +msgstr "Riprendi" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Riproduci dall'inizio" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Marca come non visto" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Marca come visto" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Marca la Stagione come non vista" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Marca la Stagione come vista" + +msgctxt "#32322" +msgid "Delete" +msgstr "Cancellato" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Vai alla Serie" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Vai a {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Riproduci il titolo succesivo" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Cancellare veramente?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Sei sucuro che vuoi davvero cancellare questo media?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Sì" + +msgctxt "#32329" +msgid "No" +msgstr "No" + +msgctxt "#32330" +msgid "Message" +msgstr "Messaggio" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "C'è stato un problema nella cancellazione del media." + +msgctxt "#32332" +msgid "Home" +msgstr "Home" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Playlists" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Conferma Uscita" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Sei pronto per uscire da Plex?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Esci" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Cancella" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Nessun Server trovato" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Server non accessibile" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Test di connessione in corso. Per favore attenti." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Server non accessibile. Per favore fai il sign in nel Server a controlla la connessione." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Cambia utente" + +msgctxt "#32343" +msgid "Settings" +msgstr "Impostazioni" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Esci (Sign Out)" + +msgctxt "#32345" +msgid "All" +msgstr "Tutto" + +msgctxt "#32346" +msgid "By Name" +msgstr "Per Nome" + +msgctxt "#32347" +msgid "Artists" +msgstr "Artisti" + +msgctxt "#32348" +msgid "movies" +msgstr "film" + +msgctxt "#32349" +msgid "photos" +msgstr "foto" + +msgctxt "#32350" +msgid "Shows" +msgstr "Serie" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "Per data di aggiunta" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Data di aggiunta" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "Per data di uscita" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Data di uscita" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Per data di già visto" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Data di già visto" + +msgctxt "#32357" +msgid "By Name" +msgstr "Per nome" + +msgctxt "#32358" +msgid "Name" +msgstr "Nome" + +msgctxt "#32359" +msgid "By Rating" +msgstr "Per Valutazione" + +msgctxt "#32360" +msgid "Rating" +msgstr "Valutazione" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "Per Risoluzione" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Risoluzione" + +msgctxt "#32363" +msgid "By Duration" +msgstr "Per Durata" + +msgctxt "#32364" +msgid "Duration" +msgstr "Durata" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "Per prima trasmissione" + +msgctxt "#32366" +msgid "First Aired" +msgstr "Prima trasmissione" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Per Non visto" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Non visto" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "Per data di riproduzione" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Data di riproduzione" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "Per numero di volte riprodotto" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Numero di volte riprodotto" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Per data di ripresa" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Data di ripresa" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Nussun filtro disponibile" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Pulisci i filtri" + +msgctxt "#32377" +msgid "Year" +msgstr "Anno" + +msgctxt "#32378" +msgid "Decade" +msgstr "Decennio" + +msgctxt "#32379" +msgid "Genre" +msgstr "Genere" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Classificazione dei contenuti" + +msgctxt "#32381" +msgid "Network" +msgstr "Rete" + +msgctxt "#32382" +msgid "Collection" +msgstr "Collezione" + +msgctxt "#32383" +msgid "Director" +msgstr "Regista" + +msgctxt "#32384" +msgid "Actor" +msgstr "Attore" + +msgctxt "#32385" +msgid "Country" +msgstr "Nazione" + +msgctxt "#32386" +msgid "Studio" +msgstr "Studio" + +msgctxt "#32387" +msgid "Labels" +msgstr "Etichette" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Marca camera" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Modello camera" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Apertura" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Velocità di scatto" + +msgctxt "#32392" +msgid "Lens" +msgstr "Lenti" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Serie televisive" + +msgctxt "#32394" +msgid "Music" +msgstr "Musica" + +msgctxt "#32395" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Sottotitoli" + +msgctxt "#32397" +msgid "Quality" +msgstr "Qualità" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Impostazioni Video di Kodi" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Impostazioni Audio di Kodi" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Vai alla Stagione" + +msgctxt "#32401" +msgid "Directors" +msgstr "Registi" + +msgctxt "#32402" +msgid "Writer" +msgstr "Autore" + +msgctxt "#32403" +msgid "Writers" +msgstr "Autori" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Film correlati" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Scarica Sottotitoli" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Ritardo Sottotitolo" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Sottotitolo successivo" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Disabilita sottotitoli" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Abilita Sottotitoli" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Versione piattaforma" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Sconosciuto" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Modifica o Cancella" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "Modificare l'indirizzo IP o cancellare le impostazioni correnti?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Cancella" + +msgctxt "#32415" +msgid "Edit" +msgstr "Modifica" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Inserisci l'indirizzo IP" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Inserisci il numero della Porta" + +msgctxt "#32418" +msgid "Creator" +msgstr "Creatore" + +msgctxt "#32419" +msgid "Cast" +msgstr "Cast" + +msgctxt "#32420" +msgid "Disc" +msgstr "Disc" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Esci (Sign Out)" + +msgctxt "#32422" +msgid "Exit" +msgstr "Esci" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Spegni" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Sospenti" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Iberna" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Riavvia" + +msgctxt "#32427" +msgid "Failed" +msgstr "Fallito" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "Login fallita!" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Riprendi da {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Ricerca" + +msgctxt "#32431" +msgid "Search" +msgstr "Cerca" + +msgctxt "#32432" +msgid "Space" +msgstr "Spazio" + +msgctxt "#32433" +msgid "Clear" +msgstr "Pulisci" + +msgctxt "#32434" +msgid "Searching..." +msgstr "In ricerca..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Nessun risultato" + +msgctxt "#32436" +msgid "Paused" +msgstr "In Pausa" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Benvenuto" + +msgctxt "#32438" +msgid "Previous" +msgstr "Precedente" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "Titolo successivo" + +msgctxt "#32440" +msgid "On Deck" +msgstr "Scoprire" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Sconosciuto" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Integrato" + +msgctxt "#32443" +msgid "Forced" +msgstr "Forzato" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Testi" + +msgctxt "#32445" +msgid "Mono" +msgstr "Mono" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Stereo" + +msgctxt "#32447" +msgid "None" +msgstr "Nessuno" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "Riproduzione fallita!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Impossibile connettersi a plex.tv[CR]Controlla la tua connessione ad Internet e riprova." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Seleziona Versione" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Versione in Play..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "Nessun contenuto disponibile in questa libreria" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Per favore aggiungi contenuti e/o controlla che 'Includi nella dashboard' è abilitato." + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Nessun contenuto disponibile per questo filtro" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Per favore cambia o rimuovi il filtro corrente" + +msgctxt "#32456" +msgid "Show" +msgstr "Serie" + +msgctxt "#32457" +msgid "By Show" +msgstr "Per Serie" + +msgctxt "#32458" +msgid "Episodes" +msgstr "Episodi" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "Modo Offline" + +msgctxt "#32460" +msgid "Sign In" +msgstr "Accedi (Sign In)" + +msgctxt "#32461" +msgid "Albums" +msgstr "Albums" + +msgctxt "#32462" +msgid "Artist" +msgstr "Artista" + +msgctxt "#32463" +msgid "By Artist" +msgstr "Per Artista" diff --git a/script.plexmod/resources/language/resource.language.pl_pl/strings.po b/script.plexmod/resources/language/resource.language.pl_pl/strings.po new file mode 100644 index 000000000..d8b263ae0 --- /dev/null +++ b/script.plexmod/resources/language/resource.language.pl_pl/strings.po @@ -0,0 +1,984 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: 2020-06-25 12:04+0200\n" +"Last-Translator: Lukasz Zacharski \n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pl\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Główne" + +msgctxt "#32001" +msgid "Original" +msgstr "Oryginalna" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mb/s 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mb/s 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mb/s 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mb/s 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mb/s 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mb/s 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mb/s 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mb/s 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kb/s" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kb/s" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kb/s" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kb/s" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kb/s" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Jakość lokalna" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Jakość zdalna" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Jakość online" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Format transkodowania" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Dziennik debugowania" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Zezwól na bezpośrednie odtwarzanie" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Zezwól na bezpośrednie strumieniowanie" + +msgctxt "#32027" +msgid "Force" +msgstr "Wymuszaj" + +msgctxt "#32028" +msgid "Always" +msgstr "Zawsze" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Tylko formaty graficzne" + +msgctxt "#32030" +msgid "Auto" +msgstr "Automatyczne" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Wypalaj napisy (tylko bezpośrednie odtwarzanie)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Zezwól na niezabezpieczone połączenia" + +msgctxt "#32033" +msgid "Never" +msgstr "Nigdy" + +msgctxt "#32034" +msgid "On Same network" +msgstr "W tej samej sieci" + +msgctxt "#32035" +msgid "Always" +msgstr "Zawsze" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "Zezwól na 4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "Zezwól na HEVC (H.265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Zaloguj się automatycznie" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Odtwarzaj „Następne” automatycznie" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Włącz pobieranie napisów" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Włącz pobieranie napisów" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Odnajdowanie serwera (GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Uruchom Plex przy starcie Kodi" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "IP połączenia 1" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Port połączenia 1" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "IP połączenia 2" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Port połączenia 2" + +msgctxt "#32048" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Zaawansowane" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Ręcznie dodane serwery" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Prywatność" + +msgctxt "#32052" +msgid "About" +msgstr "O dodatku" + +msgctxt "#32053" +msgid "Video" +msgstr "Wideo" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Wersja dodatku" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Wersja Kodi" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Rozdzielczość ekranu" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Obecna wersja serwera" + + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Pomiń wybór użytkownika i kod PIN przy starcie." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Jeśli włączone, po zakończeniu odtwarzania i dostępnej pozycji w „Następne”, zostanie ona automatycznie odtworzona po 15 sekundach." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Włącz, jeśli Twój sprzęt obsługuje odtwarzanie 4K. Wyłącz, aby wymusić transkodowanie." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Włącz, jeśli Twój sprzęt obsługuje HEVC/H.265. Wyłącz, aby wymusić transkodowanie." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Kiedy łączyć z serwerami bez zabezpieczonych połączeń.[CR][CR]* [B]Nigdy[/B]: Nigdy nie łącz w sposób niezabezpieczony[CR]* [B]W tej samej sieci[/B]: Zezwól, jeśli w tej samej sieci[CR]* [B]Zawsze[/B]: Zezwól w tej samej sieci i zdalnie" + + +msgctxt "#32201" +msgid "Trailer" +msgstr "Zwiastun" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Usunięta scena" + +msgctxt "#32203" +msgid "Interview" +msgstr "Wywiad" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Teledysk" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "Za kulisami" + +msgctxt "#32206" +msgid "Scene" +msgstr "Scena" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Teledysk na żywo" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Teledysk z tekstem" + +msgctxt "#32209" +msgid "Concert" +msgstr "Koncert" + +msgctxt "#32210" +msgid "Featurette" +msgstr "Średniometrażowy" + +msgctxt "#32211" +msgid "Short" +msgstr "Krótkometrażowy" + +msgctxt "#32212" +msgid "Other" +msgstr "Inne" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Przejdź do albumu" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Przejdź do wykonawcy" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Przejdź do {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Sezon" + +msgctxt "#32304" +msgid "Episode" +msgstr "Odcinek" + +msgctxt "#32305" +msgid "Extras" +msgstr "Dodatki" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Powiązane seriale" + +msgctxt "#32307" +msgid "More" +msgstr "Więcej" + +msgctxt "#32308" +msgid "Available" +msgstr "Dostępne" + +msgctxt "#32309" +msgid "None" +msgstr "Brak" + +msgctxt "#32310" +msgid "S" +msgstr "S" + +msgctxt "#32311" +msgid "E" +msgstr "O" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "Niedostępne" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Ten element jest obecnie niedostępny." + +msgctxt "#32314" +msgid "In Progress" +msgstr "W toku" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Wznowić odtwarzanie" + +msgctxt "#32316" +msgid "Resume" +msgstr "Wznów" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Odtwórz od początku" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Oznacz jako nieodtworzone" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Oznacz jako odtworzone" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Oznacz sezon jako nieodtworzony" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Oznacz sezon jako odtworzony" + +msgctxt "#32322" +msgid "Delete" +msgstr "Usuń" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Przejdź do serialu" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Przejdź do {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Odtwórz następne" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Na pewno usunąć?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Czy na pewno chcesz usunąć te multimedia?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Tak" + +msgctxt "#32329" +msgid "No" +msgstr "Nie" + +msgctxt "#32330" +msgid "Message" +msgstr "Wiadomość" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Wystąpił problem z usunięciem multimediów." + +msgctxt "#32332" +msgid "Home" +msgstr "Strona główna" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Playlisty" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Potwierdź wyjście" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Czy chcesz wyjść z Plex?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Wyjdź" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Anuluj" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Nie znaleziono serwerów" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Serwer jest niedostępny" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Trwa testowanie połączeń. Proszę czekać." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Serwer jest niedostępny. Zaloguj się na swój serwer i sprawdź połączenie." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Przełącz użytkownika" + +msgctxt "#32343" +msgid "Settings" +msgstr "Ustawienia" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Wyloguj się" + +msgctxt "#32345" +msgid "All" +msgstr "Wszystkie" + +msgctxt "#32346" +msgid "By Name" +msgstr "Wg nazwy" + +msgctxt "#32347" +msgid "Artists" +msgstr "Wykonawcy" + +msgctxt "#32348" +msgid "movies" +msgstr "Filmy" + +msgctxt "#32349" +msgid "photos" +msgstr "Zdjęcia" + +msgctxt "#32350" +msgid "Shows" +msgstr "Seriale" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "Wg daty dodania" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Data dodania" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "Wg daty wydania" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Data wydania" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Wg daty wyświetlenia" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Data wyświetlenia" + +msgctxt "#32357" +msgid "By Name" +msgstr "Wg nazwy" + +msgctxt "#32358" +msgid "Name" +msgstr "Nazwa" + +msgctxt "#32359" +msgid "By Rating" +msgstr "Wg oceny" + +msgctxt "#32360" +msgid "Rating" +msgstr "Ocena" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "Wg rozdzielczości" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Rozdzielczość" + +msgctxt "#32363" +msgid "By Duration" +msgstr "Wg czasu trwania" + +msgctxt "#32364" +msgid "Duration" +msgstr "Czas trwania" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "Wg pierwszej emisji" + +msgctxt "#32366" +msgid "First Aired" +msgstr "Pierwsza emisja" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Wg nieodtworzonych" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Nieodtworzone" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "Wg daty odtworzenia" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Data odtworzenia" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "Wg ilości odtworzeń" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Ilość odtworzeń" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Wg daty wykonania" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Data wykonania" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Brak dostępnych filtrów" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Wyczyść filtr" + +msgctxt "#32377" +msgid "Year" +msgstr "Rok" + +msgctxt "#32378" +msgid "Decade" +msgstr "Dekada" + +msgctxt "#32379" +msgid "Genre" +msgstr "Gatunek" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Ocena treści" + +msgctxt "#32381" +msgid "Network" +msgstr "Stacja" + +msgctxt "#32382" +msgid "Collection" +msgstr "Kolekcja" + +msgctxt "#32383" +msgid "Director" +msgstr "Reżyser" + +msgctxt "#32384" +msgid "Actor" +msgstr "Aktor" + +msgctxt "#32385" +msgid "Country" +msgstr "Kraj" + +msgctxt "#32386" +msgid "Studio" +msgstr "Studio" + +msgctxt "#32387" +msgid "Labels" +msgstr "Etykiety" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Producent aparatu" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Model aparatu" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Przysłona" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Czas migawki" + +msgctxt "#32392" +msgid "Lens" +msgstr "Obiektyw" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Seriale" + +msgctxt "#32394" +msgid "Music" +msgstr "Muzyka" + +msgctxt "#32395" +msgid "Audio" +msgstr "Audio" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Napisy" + +msgctxt "#32397" +msgid "Quality" +msgstr "Jakość" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Ustawienia wideo Kodi" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Ustawienia audio Kodi" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Przejdź do sezonu" + +msgctxt "#32401" +msgid "Directors" +msgstr "Reżyserzy" + +msgctxt "#32402" +msgid "Writer" +msgstr "Scenarzysta" + +msgctxt "#32403" +msgid "Writers" +msgstr "Scenarzyści" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Powiązane filmy" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Pobierz napisy" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Opóźnienie napisów" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Następne napisy" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Wyłącz napisy" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Włącz napisy" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Wersja platformy" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Nieznana" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Edytuj lub wyczyść" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "Edytować adres IP lub wyczyścić obecne ustawienie?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Wyczyść" + +msgctxt "#32415" +msgid "Edit" +msgstr "Edytuj" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Wprowadź adres IP" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Wprowadź numer portu" + +msgctxt "#32418" +msgid "Creator" +msgstr "Twórca" + +msgctxt "#32419" +msgid "Cast" +msgstr "Obsada" + +msgctxt "#32420" +msgid "Disc" +msgstr "Dysk" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Wyloguj się" + +msgctxt "#32422" +msgid "Exit" +msgstr "Wyjdź" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Zamknij" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Uśpij" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Hibernuj" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Uruchom ponownie" + +msgctxt "#32427" +msgid "Failed" +msgstr "Nieudane" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "Logowanie nieudane!" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Wznów od {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Odkrywanie" + +msgctxt "#32431" +msgid "Search" +msgstr "Wyszukiwanie" + +msgctxt "#32432" +msgid "Space" +msgstr "Spacja" + +msgctxt "#32433" +msgid "Clear" +msgstr "Wyczyść" + +msgctxt "#32434" +msgid "Searching..." +msgstr "Wyszukiwanie..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Brak wyników" + +msgctxt "#32436" +msgid "Paused" +msgstr "Wstrzymano" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Witaj" + +msgctxt "#32438" +msgid "Previous" +msgstr "Poprzednie" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "Odtwarzanie następnego" + +msgctxt "#32440" +msgid "On Deck" +msgstr "Na tapecie" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Nieznany" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Osadzone" + +msgctxt "#32443" +msgid "Forced" +msgstr "Wymuszone" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Tekst" + +msgctxt "#32445" +msgid "Mono" +msgstr "Mono" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Stereo" + +msgctxt "#32447" +msgid "None" +msgstr "Brak" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "Odtwarzanie nieudane!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Nie można połączyć z plex.tv[CR]Sprawdź połączenie internetowe i spróbuj ponownie." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Wybierz wersję" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Odtwórz wersję..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "Brak zawartości w tej bibliotece" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Dodaj zawartość i/lub sprawdź, czy opcja „Załącz na pulpicie” jest włączona." + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Brak zawartości dla tego filtra" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Zmień lub usuń bieżący filtr" + +msgctxt "#32456" +msgid "Show" +msgstr "Serial" + +msgctxt "#32457" +msgid "By Show" +msgstr "Wg serialu" + +msgctxt "#32458" +msgid "Episodes" +msgstr "Odcinki(ów)" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "Tryb offline" + +msgctxt "#32460" +msgid "Sign In" +msgstr "Zaloguj się" + +msgctxt "#32461" +msgid "Albums" +msgstr "Albumy" + +msgctxt "#32462" +msgid "Artist" +msgstr "Wykonawca" + +msgctxt "#32463" +msgid "By Artist" +msgstr "Wg wykonawcy" + +msgctxt "#32464" +msgid "Player" +msgstr "Odtwarzacz" + +msgctxt "#32465" +msgid "Use skip step settings from Kodi" +msgstr "Użyj ustawień kroków przeskoku z Kodi" + +msgctxt "#32466" +msgid "Automatically seek selected position after a delay" +msgstr "Automatycznie szukaj wybranej pozycji po opóźnieniu" + +msgctxt "#32467" +msgid "User Interface" +msgstr "Interfejs użytkownika" + +msgctxt "#32471" +msgid "Use Plex/Kodi steps for timeline" +msgstr "Użyj kroków Plex/Kodi dla osi czasu" + +msgctxt "#32485" +msgid "Go back instantly with the previous menu action in scrolled views" +msgstr "Wróć natychmiast akcją menu „poprzednie” w przewijanych widokach" + +msgctxt "#32492" +msgid "Kodi Subtitle Settings" +msgstr "Ustawienia napisów Kodi" + +msgctxt "#32495" +msgid "Skip intro" +msgstr "Pomiń wstęp" diff --git a/script.plexmod/resources/language/resource.language.pt_br/strings.po b/script.plexmod/resources/language/resource.language.pt_br/strings.po new file mode 100644 index 000000000..98bd80061 --- /dev/null +++ b/script.plexmod/resources/language/resource.language.pt_br/strings.po @@ -0,0 +1,951 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt-BR\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Principal" + +msgctxt "#32001" +msgid "Original" +msgstr "Original" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mbps 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mbps 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mbps 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mbps 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mbps 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mbps 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mbps 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mbps 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kbps" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kbps" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kbps" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kbps" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kbps" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Qualidade Local" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Qualidade Remota" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Qualidade Online" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Formato de Transcodificação" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Registro de Depuração" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Permitir Reprodução Direta" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Permitir Transmissão Direta" + +msgctxt "#32027" +msgid "Force" +msgstr "Forçar" + +msgctxt "#32028" +msgid "Always" +msgstr "Sempre" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Apenas Formatos de Imagem" + +msgctxt "#32030" +msgid "Auto" +msgstr "Auto" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Gravar Legendas (Somente Reprodução Direta)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Permitir Conexões Inseguras" + +msgctxt "#32033" +msgid "Never" +msgstr "Nunca" + +msgctxt "#32034" +msgid "On Same network" +msgstr "Na Mesma Rede" + +msgctxt "#32035" +msgid "Always" +msgstr "Sempre" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "Permitir 4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "Permitir HEVC (h265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Conectar Automaticamente" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Reprodução Automática Após Reprodução" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Habilitar Download de Legendas" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Habilitar Download de Legendas" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Descoberta de Servidor (GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Iniciar Plex quando Kodi Iniciar" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "Conexão de IP 1" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Conexão de Porta 1" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "Conexão de IP 2" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Conexão de Porta 2" + +msgctxt "#32048" +msgid "Audio" +msgstr "Áudio" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Avançado" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Servidores Manuais" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Privacidade" + +msgctxt "#32052" +msgid "About" +msgstr "Sobre" + +msgctxt "#32053" +msgid "Video" +msgstr "Vídeo" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Versão do Addon" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Versão do Kodi" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Resolução da Tela" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Versão Atual do Servidor" + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Pular seleção de usuário e inserção do PIN ao iniciar." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Se habilitado, quando a reprodução acabar e existir algum item 'A Seguir', será automáticamente reproduzido depois de 15 segudos." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Habilite isto se seu equipamento suporta reprodução 4K. Desabilite para forçar transcodificação." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Habilite isto se seu equipamento suporta HEVC/h265. Desabilite para forçar transcodificação." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Quando conectar à servidores sem conexão segura.[CR][CR]* [B]Nunca[/B]: Nunca conectar à um servidor inseguramente[CR]* [B]Na Mesma Rede[/B]: Permitir se na mesma reder[CR]* [B]Sempre[/B]: Permitir conexão na mesma rede e remotamente" + +msgctxt "#32201" +msgid "Trailer" +msgstr "Trailer" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Cena apagada" + +msgctxt "#32203" +msgid "Interview" +msgstr "Entrevista" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Videoclipe" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "Por trás das cenas" + +msgctxt "#32206" +msgid "Scene" +msgstr "Cena" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Videoclipe ao vivo" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Videclipe com Letra" + +msgctxt "#32209" +msgid "Concert" +msgstr "Show" + +msgctxt "#32210" +msgid "Featurette" +msgstr "Featurette" + +msgctxt "#32211" +msgid "Short" +msgstr "Curta" + +msgctxt "#32212" +msgid "Other" +msgstr "Outro" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Ir para Álbum" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Ir para Artista" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Ir para {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Temporada" + +msgctxt "#32304" +msgid "Episode" +msgstr "Episódio" + +msgctxt "#32305" +msgid "Extras" +msgstr "Extras" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Séries relacionadas" + +msgctxt "#32307" +msgid "More" +msgstr "Mais" + +msgctxt "#32308" +msgid "Available" +msgstr "Disponível" + +msgctxt "#32309" +msgid "None" +msgstr "Nenhum" + +msgctxt "#32310" +msgid "S" +msgstr "S" + +msgctxt "#32311" +msgid "E" +msgstr "E" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "Indisponível" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Este item está atualmente indisponível." + +msgctxt "#32314" +msgid "In Progress" +msgstr "Em Progresso" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Resumir reprodução" + +msgctxt "#32316" +msgid "Resume" +msgstr "Resumir" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Reproduzir do começo" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Marcar como Não-Visto" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Marcar como Visto" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Marcar Temporada como Não-Vista" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Marcar Temporada como Vista" + +msgctxt "#32322" +msgid "Delete" +msgstr "Apagar" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Ir para Série" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Ir para {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Reproduzir Próximo" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Realmente apagar?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Tem certeza que quer apagar esta mídia?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Sim" + +msgctxt "#32329" +msgid "No" +msgstr "Não" + +msgctxt "#32330" +msgid "Message" +msgstr "Mensagem" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Ocorreu um problema ao apagar esta mídia." + +msgctxt "#32332" +msgid "Home" +msgstr "Início" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Listas de Reprodução" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Confirmar Saída" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Está pronto para sair do Plex?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Sair" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Cancelar" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Nenhum Servidor Encontrado" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Servidor inacessível" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Testes de conexão estão em progresso. Por favor, aguarde." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Servidor inacessível. Conecte em seu servidor e teste sua conexão." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Trocar Usuário" + +msgctxt "#32343" +msgid "Settings" +msgstr "Configurações" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Desconectar" + +msgctxt "#32345" +msgid "All" +msgstr "Tudo" + +msgctxt "#32346" +msgid "By Name" +msgstr "Por Nome" + +msgctxt "#32347" +msgid "Artists" +msgstr "Artistas" + +msgctxt "#32348" +msgid "movies" +msgstr "filmes" + +msgctxt "#32349" +msgid "photos" +msgstr "fotos" + +msgctxt "#32350" +msgid "Shows" +msgstr "Séries" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "Por Data Adicionado" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Data Adicionado" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "Por Data de Lançamento" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Data de Lançamento" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Por Data de Visualização" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Data de Visualização" + +msgctxt "#32357" +msgid "By Name" +msgstr "Por Nome" + +msgctxt "#32358" +msgid "Name" +msgstr "Nome" + +msgctxt "#32359" +msgid "By Rating" +msgstr "Por Avaliação" + +msgctxt "#32360" +msgid "Rating" +msgstr "Avaliação" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "Por Resolução" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Resolução" + +msgctxt "#32363" +msgid "By Duration" +msgstr "Por Duração" + +msgctxt "#32364" +msgid "Duration" +msgstr "Duração" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "Por Data de Estreia" + +msgctxt "#32366" +msgid "First Aired" +msgstr "Data de Estreia" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Por Não-Vistos" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Não-Vistos" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "Por Data de Reprodução" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Data de Reprodução" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "Por Número de Reproduções" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Número de Reproduções" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Por Data Tirada" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Data Tirada" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Nenhum filtro disponível" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Limpar filtro" + +msgctxt "#32377" +msgid "Year" +msgstr "Ano" + +msgctxt "#32378" +msgid "Decade" +msgstr "Década" + +msgctxt "#32379" +msgid "Genre" +msgstr "Gênero" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Classificação do Conteúdo" + +msgctxt "#32381" +msgid "Network" +msgstr "Rede" + +msgctxt "#32382" +msgid "Collection" +msgstr "Coleção" + +msgctxt "#32383" +msgid "Director" +msgstr "Diretor" + +msgctxt "#32384" +msgid "Actor" +msgstr "Ator" + +msgctxt "#32385" +msgid "Country" +msgstr "País" + +msgctxt "#32386" +msgid "Studio" +msgstr "Estúdio" + +msgctxt "#32387" +msgid "Labels" +msgstr "Rótulos" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Fabricante da câmera" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Modelo da câmera" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Abertura" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Velocidade do Obturador" + +msgctxt "#32392" +msgid "Lens" +msgstr "Lente" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Séries" + +msgctxt "#32394" +msgid "Music" +msgstr "Música" + +msgctxt "#32395" +msgid "Audio" +msgstr "Áudio" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Legendas" + +msgctxt "#32397" +msgid "Quality" +msgstr "Qualidade" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Configurações de Vídeo do Kodi" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Configurações de Áudio do Kodi" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Ir para Temporada" + +msgctxt "#32401" +msgid "Directors" +msgstr "Diretores" + +msgctxt "#32402" +msgid "Writer" +msgstr "Escritor" + +msgctxt "#32403" +msgid "Writers" +msgstr "Escritores" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Filmes relacionados" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Baixar Legendas" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Atraso da Legenda" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Próxima Legenda" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Desabilitar Legendas" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Habilitar Legendas" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Versão da Plataforma" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Desconhecido" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Editar ou Limpar" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "Editar endereço de IP ou limpar configurações atuais?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Limpar" + +msgctxt "#32415" +msgid "Edit" +msgstr "Editar" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Insira o endereço de IP" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Insira o número da Porta" + +msgctxt "#32418" +msgid "Creator" +msgstr "Criador" + +msgctxt "#32419" +msgid "Cast" +msgstr "Elenco" + +msgctxt "#32420" +msgid "Disc" +msgstr "Disco" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Desconectar" + +msgctxt "#32422" +msgid "Exit" +msgstr "Sair" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Desligar" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Suspender" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Hibernar" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Reiniciar" + +msgctxt "#32427" +msgid "Failed" +msgstr "Falhou" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "Login falhou!" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Resumir de {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Descobrir" + +msgctxt "#32431" +msgid "Search" +msgstr "Procurar" + +msgctxt "#32432" +msgid "Space" +msgstr "Espaço" + +msgctxt "#32433" +msgid "Clear" +msgstr "Limpar" + +msgctxt "#32434" +msgid "Searching..." +msgstr "Procurando..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Sem Resultados" + +msgctxt "#32436" +msgid "Paused" +msgstr "Pausado" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Bem-Vindo" + +msgctxt "#32438" +msgid "Previous" +msgstr "Anterior" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "Reproduzindo a seguir" + +msgctxt "#32440" +msgid "On Deck" +msgstr "No Deck" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Desconhecido" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Embutido" + +msgctxt "#32443" +msgid "Forced" +msgstr "Forçado" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Letra da música" + +msgctxt "#32445" +msgid "Mono" +msgstr "Mono" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Estéreo" + +msgctxt "#32447" +msgid "None" +msgstr "Nenhum" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "Reprodução falhou!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Nao pôde conectar com o plex.tv[CR]Teste sua conexão com a internet e tente novamente." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Escolha a Versão" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Reproduzir Versão..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "Nenhum conteúdo disponível nesta biblioteca" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Por favor adicione e/ou confirme que 'Incluir no Painel' está habilitado." + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Nenhum conteúdo disponível para este filtro" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Por favor, troque ou remova o filtro atual" + +msgctxt "#32456" +msgid "Show" +msgstr "Série" + +msgctxt "#32457" +msgid "By Show" +msgstr "Por Série" + +msgctxt "#32458" +msgid "Episodes" +msgstr "Episódios" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "Modo Offline" + +msgctxt "#32460" +msgid "Sign In" +msgstr "Conectar" + +msgctxt "#32461" +msgid "Albums" +msgstr "Álbuns" + +msgctxt "#32462" +msgid "Artist" +msgstr "Artista" + +msgctxt "#32463" +msgid "By Artist" +msgstr "Por Artista" + diff --git a/script.plexmod/resources/language/resource.language.pt_pt/strings.po b/script.plexmod/resources/language/resource.language.pt_pt/strings.po new file mode 100644 index 000000000..7c265ff3c --- /dev/null +++ b/script.plexmod/resources/language/resource.language.pt_pt/strings.po @@ -0,0 +1,980 @@ +# XBMC Media Center language file +# Guerreiro , 2019. +# +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: 2019-09-10 18:44+0100\n" +"Last-Translator: Guerreiro \n" +"Language-Team: Português <>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Principal" + +msgctxt "#32001" +msgid "Original" +msgstr "Original" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Mbps 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Mbps 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Mbps 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Mbps 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Mbps 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Mbps 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Mbps 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Mbps 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 kbps" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 kbps" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 kbps" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 kbps" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 kbps" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Qualidade Local" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Qualidade Remota" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Qualidade Online" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Formato de Transcodificação" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Registo de Depuração" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Permitir Reprodução Direta" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Permitir Transmissão Direta" + +msgctxt "#32027" +msgid "Force" +msgstr "Forçar" + +msgctxt "#32028" +msgid "Always" +msgstr "Sempre" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Apenas Formatos de Imagem" + +msgctxt "#32030" +msgid "Auto" +msgstr "Auto" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Gravar Legendas (Somente Reprodução Direta)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Permitir Ligações Inseguras" + +msgctxt "#32033" +msgid "Never" +msgstr "Nunca" + +msgctxt "#32034" +msgid "On Same network" +msgstr "Na Mesma Rede" + +msgctxt "#32035" +msgid "Always" +msgstr "Sempre" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "Permitir 4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "Permitir HEVC (h265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Entrar Automaticamente" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Reprodução Automática" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Ativar a Transferência de Legendas" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Ativar a Transferência de Legendas" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Descoberta de Servidor (GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Iniciar Plex Automaticamente" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "IP de Ligação 1" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Porta de Ligação 1" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "IP de Ligação 2" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Porta de Ligação 2" + +msgctxt "#32048" +msgid "Audio" +msgstr "Áudio" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Avançado" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Servidores Manuais" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Privacidade" + +msgctxt "#32052" +msgid "About" +msgstr "Sobre" + +msgctxt "#32053" +msgid "Video" +msgstr "Vídeo" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Versão do Addon" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Versão do Kodi" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Resolução de Ecrã" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Versão Atual do Servidor" + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Saltar seleção de utilizador e inserção do PIN ao iniciar." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Se ativado, quando a reprodução acabar e existir algum item 'A Seguir', será automáticamente reproduzido depois de 15 segundos." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Ative isto se seu equipamento suportar reprodução 4K. Desative para forçar conversão." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Ative isto se seu equipamento suportar HEVC/h265. Desative para forçar conversão." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Quando ligar à servidores sem ligação segura.[CR][CR]* [B]Nunca[/B]: Nunca ligar à um servidor de forma insegura[CR]* [B]Na Mesma Rede[/B]: Permitir se na mesma rede[CR]* [B]Sempre[/B]: Permitir ligação na mesma rede e remotamente" + +msgctxt "#32201" +msgid "Trailer" +msgstr "Trailer" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Cena apagada" + +msgctxt "#32203" +msgid "Interview" +msgstr "Entrevista" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Vídeo Clipe" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "Nos Bastidores" + +msgctxt "#32206" +msgid "Scene" +msgstr "Cena" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Vídeo Clipe ao Vivo" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Vide Clipe com Letra" + +msgctxt "#32209" +msgid "Concert" +msgstr "Concerto" + +msgctxt "#32210" +msgid "Featurette" +msgstr "Destaques" + +msgctxt "#32211" +msgid "Short" +msgstr "Curta" + +msgctxt "#32212" +msgid "Other" +msgstr "Outro" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Ir para Álbum" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Ir para Artista" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Ir para {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Temporada" + +msgctxt "#32304" +msgid "Episode" +msgstr "Episódio" + +msgctxt "#32305" +msgid "Extras" +msgstr "Extras" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Séries relacionadas" + +msgctxt "#32307" +msgid "More" +msgstr "Mais" + +msgctxt "#32308" +msgid "Available" +msgstr "Disponível" + +msgctxt "#32309" +msgid "None" +msgstr "Nenhum" + +msgctxt "#32310" +msgid "S" +msgstr "T" + +msgctxt "#32311" +msgid "E" +msgstr "E" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "Indisponível" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Este item está atualmente indisponível." + +msgctxt "#32314" +msgid "In Progress" +msgstr "Em Progresso" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Resumir reprodução" + +msgctxt "#32316" +msgid "Resume" +msgstr "Resumir" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Reproduzir do inicio" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Marcar como Não-Visto" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Marcar como Visto" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Marcar Temporada como Não-Vista" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Marcar Temporada como Vista" + +msgctxt "#32322" +msgid "Delete" +msgstr "Apagar" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Ir para Série" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Ir para {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Reproduzir Próximo" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Realmente Apagar?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Tem certeza que quer apagar este item?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Sim" + +msgctxt "#32329" +msgid "No" +msgstr "Não" + +msgctxt "#32330" +msgid "Message" +msgstr "Mensagem" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Ocorreu um problema ao apagar este item." + +msgctxt "#32332" +msgid "Home" +msgstr "Início" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Listas de Reprodução" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Confirmar Saída" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Está pronto para sair do Plex?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Sair" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Cancelar" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Nenhum Servidor Encontrado" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Servidor inacessível" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Testes de ligação estão em progresso. Por favor, aguarde." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Servidor inacessível. Ligue-se ao servidor e teste a ligação." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Mudar de Utilizador" + +msgctxt "#32343" +msgid "Settings" +msgstr "Definições" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Terminar Sessão" + +msgctxt "#32345" +msgid "All" +msgstr "Tudo" + +msgctxt "#32346" +msgid "By Name" +msgstr "Por Nome" + +msgctxt "#32347" +msgid "Artists" +msgstr "Artistas" + +msgctxt "#32348" +msgid "Movies" +msgstr "Filmes" + +msgctxt "#32349" +msgid "photos" +msgstr "fotos" + +msgctxt "#32350" +msgid "Shows" +msgstr "Séries" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "Por Data Adicionado" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Data Adicionado" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "Por Data de Lançamento" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Data de Lançamento" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "Por Data de Visualização" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Data de Visualização" + +msgctxt "#32357" +msgid "By Name" +msgstr "Por Nome" + +msgctxt "#32358" +msgid "Name" +msgstr "Nome" + +msgctxt "#32359" +msgid "By Rating" +msgstr "Por Avaliação" + +msgctxt "#32360" +msgid "Rating" +msgstr "Avaliação" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "Por Resolução" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Resolução" + +msgctxt "#32363" +msgid "By Duration" +msgstr "Por Duração" + +msgctxt "#32364" +msgid "Duration" +msgstr "Duração" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "Por Data de Estreia" + +msgctxt "#32366" +msgid "First Aired" +msgstr "Data de Estreia" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "Por Não-Vistos" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Não-Vistos" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "Por Data de Reprodução" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Data de Reprodução" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "Por Número de Reproduções" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Número de Reproduções" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "Por Data Tirada" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Data Tirada" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Nenhum filtro disponível" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Limpar filtro" + +msgctxt "#32377" +msgid "Year" +msgstr "Ano" + +msgctxt "#32378" +msgid "Decade" +msgstr "Década" + +msgctxt "#32379" +msgid "Genre" +msgstr "Género" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Classificação do Conteúdo" + +msgctxt "#32381" +msgid "Network" +msgstr "Rede" + +msgctxt "#32382" +msgid "Collection" +msgstr "Coleção" + +msgctxt "#32383" +msgid "Director" +msgstr "Diretor" + +msgctxt "#32384" +msgid "Actor" +msgstr "Ator" + +msgctxt "#32385" +msgid "Country" +msgstr "País" + +msgctxt "#32386" +msgid "Studio" +msgstr "Estúdio" + +msgctxt "#32387" +msgid "Labels" +msgstr "Rótulos" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Fabricante da câmara" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Modelo da câmara" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Abertura" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Velocidade do Obturador" + +msgctxt "#32392" +msgid "Lens" +msgstr "Lente" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Séries TV" + +msgctxt "#32394" +msgid "Music" +msgstr "Música" + +msgctxt "#32395" +msgid "Audio" +msgstr "Áudio" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Legendas" + +msgctxt "#32397" +msgid "Quality" +msgstr "Qualidade" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Configurações de Vídeo do Kodi" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Configurações de Áudio do Kodi" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Ir para Temporada" + +msgctxt "#32401" +msgid "Directors" +msgstr "Diretores" + +msgctxt "#32402" +msgid "Writer" +msgstr "Escritor" + +msgctxt "#32403" +msgid "Writers" +msgstr "Escritores" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Filmes relacionados" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Transferir Legendas" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Atraso da Legenda" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Próxima Legenda" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Desativar Legendas" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Ativar Legendas" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Versão da Plataforma" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Desconhecido" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Editar ou Limpar" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "Editar endereço de IP ou limpar configurações atuais?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Limpar" + +msgctxt "#32415" +msgid "Edit" +msgstr "Editar" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Insira o endereço de IP" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Insira o número da Porta" + +msgctxt "#32418" +msgid "Creator" +msgstr "Criador" + +msgctxt "#32419" +msgid "Cast" +msgstr "Elenco" + +msgctxt "#32420" +msgid "Disc" +msgstr "Disco" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Terminar Sessão" + +msgctxt "#32422" +msgid "Exit" +msgstr "Sair" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Desligar" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Suspender" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Hibernar" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Reiniciar" + +msgctxt "#32427" +msgid "Failed" +msgstr "Falhou" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "Falha ao iniciar sessão!" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Resumir de {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Descobrir" + +msgctxt "#32431" +msgid "Search" +msgstr "Procurar" + +msgctxt "#32432" +msgid "Space" +msgstr "Espaço" + +msgctxt "#32433" +msgid "Clear" +msgstr "Limpar" + +msgctxt "#32434" +msgid "Searching..." +msgstr "A Procurar..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Sem Resultados" + +msgctxt "#32436" +msgid "Paused" +msgstr "Em Pausa" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Bem-Vindo" + +msgctxt "#32438" +msgid "Previous" +msgstr "Anterior" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "Reproduzindo a seguir" + +msgctxt "#32440" +msgid "On Deck" +msgstr "Próximos a Ver" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Desconhecido" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Embutido" + +msgctxt "#32443" +msgid "Forced" +msgstr "Forçado" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Letra da música" + +msgctxt "#32445" +msgid "Mono" +msgstr "Mono" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Estéreo" + +msgctxt "#32447" +msgid "None" +msgstr "Nenhum" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "Falha ao Reproduzir!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Não foi possivel ligar ao plex.tv[CR]Teste a ligação de internet e tente novamente." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Escolher Versão" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Reproduzir Versão..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "Nenhum conteúdo disponível nesta biblioteca" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Por favor adicione e/ou confirme que 'Incluir no Painel' está desativado." + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Nenhum conteúdo disponível para este filtro" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Por favor, troque ou remova o filtro atual" + +msgctxt "#32456" +msgid "Show" +msgstr "Série" + +msgctxt "#32457" +msgid "By Show" +msgstr "Por Série" + +msgctxt "#32458" +msgid "Episodes" +msgstr "Episódios" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "Modo Offline" + +msgctxt "#32460" +msgid "Sign In" +msgstr "Iniciar Sessão" + +msgctxt "#32461" +msgid "Albums" +msgstr "Álbuns" + +msgctxt "#32462" +msgid "Artist" +msgstr "Artista" + +msgctxt "#32463" +msgid "By Artist" +msgstr "Por Artista" + +msgctxt "#32464" +msgid "Player" +msgstr "Reprodutor" + +msgctxt "#32465" +msgid "Use skip step settings from Kodi" +msgstr "Use as definições de saltar etapas do Kodi" + +msgctxt "#32466" +msgid "Automatically seek selected position after a delay" +msgstr "Procurar automaticamente a posição selecionada após atrasar" + +msgctxt "#32467" +msgid "User Interface" +msgstr "Interface de Utilizador" + +msgctxt "#32471" +msgid "Use Plex/Kodi steps for timeline" +msgstr "Use as etapas do Plex/Kodi para a linha de tempo" + +msgctxt "#32485" +msgid "Go back instantly with the previous menu action in scrolled views" +msgstr "Recuar instantaneamente com a ação recuar do menu em visualizações deslocáveis" + +msgctxt "#32492" +msgid "Kodi Subtitle Settings" +msgstr "Definições de Legendas do Kodi" diff --git a/script.plexmod/resources/language/resource.language.ru_ru/strings.po b/script.plexmod/resources/language/resource.language.ru_ru/strings.po new file mode 100644 index 000000000..50b5ba08d --- /dev/null +++ b/script.plexmod/resources/language/resource.language.ru_ru/strings.po @@ -0,0 +1,951 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2013-12-12 22:56+0000\n" +"PO-Revision-Date: 2018-01-15 11:26+0300\n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Last-Translator: \n" +"X-Generator: Poedit 2.0.5\n" + +msgctxt "#32000" +msgid "Main" +msgstr "Главный" + +msgctxt "#32001" +msgid "Original" +msgstr "Оригинал" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "20 Мбит/с 1080p" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "12 Мбит/с 1080p" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "10 Мбит/с 1080p" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "8 Мбит/с 1080p" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "4 Мбит/с 720p" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "3 Мбит/с 720p" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "2 Мбит/с 720p" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "1.5 Мбит/с 480p" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "720 кбит/с" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "320 кбит/с" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "208 кбит/с" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "96 кбит/с" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "64 кбит/с" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "Локальное качество" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "Удаленное качество" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "Онлайн качество" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "Формат перекодирования" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "Отладка" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "Разрешить прямое воспроизведение" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "Разрешить прямую трансляцию" + +msgctxt "#32027" +msgid "Force" +msgstr "Принудительно" + +msgctxt "#32028" +msgid "Always" +msgstr "Всегда" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "Только изображения" + +msgctxt "#32030" +msgid "Auto" +msgstr "Авто" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "Наложение субтитров (только прямое воспроизведение)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "Разрешить небезопасные соединения" + +msgctxt "#32033" +msgid "Never" +msgstr "Никогда" + +msgctxt "#32034" +msgid "On Same network" +msgstr "В той же сети" + +msgctxt "#32035" +msgid "Always" +msgstr "Всегда" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "Разрешить 4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "Разрешить HEVC (h265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "Автоматический вход" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "Автоматическое воспроизведение" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "Включить скачивание субтитров" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "Включить скачивание субтитров" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "Обнаружение сервера (GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "Запускать Plex при старте Kodi" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "Соединение 1 IP" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "Соединение 1 порт" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "Соединение 2 IP" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "Соединение 2 порт" + +msgctxt "#32048" +msgid "Audio" +msgstr "Аудио" + +msgctxt "#32049" +msgid "Advanced" +msgstr "Продвинутый" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "Задать сервер вручную" + +msgctxt "#32051" +msgid "Privacy" +msgstr "Приватность" + +msgctxt "#32052" +msgid "About" +msgstr "Сведения" + +msgctxt "#32053" +msgid "Video" +msgstr "Видео" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "Версия аддона" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Версия Kodi" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "Разрешение экрана" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "Версия сервера" + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "Пропустить выбор пользователя и ввод пин-кода при старте." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "Если включено, после окончании воспроизведения, если есть следующая запись, она будет автоматически запущена после 15 секундной задержки." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "Включите, если ваше оборудование поддерживает воспроизведение 4K. Отключите, чтобы использовать преобразование." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "Включите, если ваше оборудование поддерживает HEVC/h265. Отключите, чтобы использовать преобразование." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "Когда подключаться к серверам, не поддерживающим безопасные соединения.[CR][CR]* [B]Никогда[/B]: Никогда не подключаться к серверам с небезопасным соединением[CR]* [B]В той же сети[/B]: Разрешить, если сервер находится в той же сети[CR]* [B]Всегда[/B]: Разрешить в той же сети и удаленные соединения" + +msgctxt "#32201" +msgid "Trailer" +msgstr "Трейлер" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "Удаленные эпизоды" + +msgctxt "#32203" +msgid "Interview" +msgstr "Интервью" + +msgctxt "#32204" +msgid "Music Video" +msgstr "Клип" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "За кулисами" + +msgctxt "#32206" +msgid "Scene" +msgstr "Эпизод" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "Живая музыка" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "Лирический клип" + +msgctxt "#32209" +msgid "Concert" +msgstr "Концерт" + +msgctxt "#32210" +msgid "Featurette" +msgstr "Короткометражный фильм" + +msgctxt "#32211" +msgid "Short" +msgstr "Короткий" + +msgctxt "#32212" +msgid "Other" +msgstr "Прочее" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "Перейти к альбому" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "Перейти к артисту" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "Перейти к {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "Сезон" + +msgctxt "#32304" +msgid "Episode" +msgstr "Эпизод" + +msgctxt "#32305" +msgid "Extras" +msgstr "Дополнения" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "Связанные вупыски" + +msgctxt "#32307" +msgid "More" +msgstr "Еще" + +msgctxt "#32308" +msgid "Available" +msgstr "Доступно" + +msgctxt "#32309" +msgid "None" +msgstr "Нет" + +msgctxt "#32310" +msgid "S" +msgstr "S" + +msgctxt "#32311" +msgid "E" +msgstr "E" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "Недосутпно" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "Эта запись сейчас недоступна." + +msgctxt "#32314" +msgid "In Progress" +msgstr "В работе" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "Возобновить воспроизведение?" + +msgctxt "#32316" +msgid "Resume" +msgstr "Возобновить" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "Начать сначала" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "Пометить как не просмотренное" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "Пометить как просмотренное" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "Пометить сезон как не просмотренный" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "Пометить сезон как просмотренный" + +msgctxt "#32322" +msgid "Delete" +msgstr "Удалить" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "Перейти к просмотру" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "Перейти к {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "Воспроизвести следующий" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "Действительно удалить?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "Вы действительно хотите удалить?" + +msgctxt "#32328" +msgid "Yes" +msgstr "Да" + +msgctxt "#32329" +msgid "No" +msgstr "Нет" + +msgctxt "#32330" +msgid "Message" +msgstr "Сообщение" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "Возникла проблема при удалении." + +msgctxt "#32332" +msgid "Home" +msgstr "Домой" + +msgctxt "#32333" +msgid "Playlists" +msgstr "Плейлисты" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "Подтверждение выхода" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "Вы действительно хотите выйти из Plex?" + +msgctxt "#32336" +msgid "Exit" +msgstr "Выход" + +msgctxt "#32337" +msgid "Cancel" +msgstr "Отмена" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "Сервера не найдены" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "Сервер недоступен" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "Пожалуйста, подождите, идет проверка соединения." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "Сервер недоступен. Пожалуйста, войдите на ваш сервер и проверьте соединение." + +msgctxt "#32342" +msgid "Switch User" +msgstr "Сменить пользователя" + +msgctxt "#32343" +msgid "Settings" +msgstr "Настройки" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "Выйти" + +msgctxt "#32345" +msgid "All" +msgstr "Все" + +msgctxt "#32346" +msgid "By Name" +msgstr "По имени" + +msgctxt "#32347" +msgid "Artists" +msgstr "Артисты" + +msgctxt "#32348" +msgid "movies" +msgstr "фильмы" + +msgctxt "#32349" +msgid "photos" +msgstr "фото" + +msgctxt "#32350" +msgid "Shows" +msgstr "Сериалы" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "По дате добавления" + +msgctxt "#32352" +msgid "Date Added" +msgstr "Дата добавления" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "По дате выхода" + +msgctxt "#32354" +msgid "Release Date" +msgstr "Дата выхода" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "По дате просмотра" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "Дата просмотра" + +msgctxt "#32357" +msgid "By Name" +msgstr "По имени" + +msgctxt "#32358" +msgid "Name" +msgstr "Имя" + +msgctxt "#32359" +msgid "By Rating" +msgstr "По рейтингу" + +msgctxt "#32360" +msgid "Rating" +msgstr "Рейтинг" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "По разрешению" + +msgctxt "#32362" +msgid "Resolution" +msgstr "Разрешение" + +msgctxt "#32363" +msgid "By Duration" +msgstr "По длительности" + +msgctxt "#32364" +msgid "Duration" +msgstr "Длительность" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "По дате показа" + +msgctxt "#32366" +msgid "First Aired" +msgstr "Дата показа" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "По не просмотренным" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "Не просмотренные" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "По дате воспроизведения" + +msgctxt "#32370" +msgid "Date Played" +msgstr "Дата воспроизведения" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "По количеству просмотров" + +msgctxt "#32372" +msgid "Play Count" +msgstr "Количество просмотров" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "По выбранной дате" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "Выбранная дата" + +msgctxt "#32375" +msgid "No filters available" +msgstr "Нет фильтров" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "Очистить фильтр" + +msgctxt "#32377" +msgid "Year" +msgstr "Год" + +msgctxt "#32378" +msgid "Decade" +msgstr "Десятилетие" + +msgctxt "#32379" +msgid "Genre" +msgstr "Жанр" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "Рейтинг контента" + +msgctxt "#32381" +msgid "Network" +msgstr "Сеть" + +msgctxt "#32382" +msgid "Collection" +msgstr "Коллекция" + +msgctxt "#32383" +msgid "Director" +msgstr "Режиссер" + +msgctxt "#32384" +msgid "Actor" +msgstr "Актер" + +msgctxt "#32385" +msgid "Country" +msgstr "Страна" + +msgctxt "#32386" +msgid "Studio" +msgstr "Студия" + +msgctxt "#32387" +msgid "Labels" +msgstr "Лейбл" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "Камера" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "Модель камеры" + +msgctxt "#32390" +msgid "Aperture" +msgstr "Диафрагма" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "Скорость затвора" + +msgctxt "#32392" +msgid "Lens" +msgstr "Объектив" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "Сериалы" + +msgctxt "#32394" +msgid "Music" +msgstr "Музыка" + +msgctxt "#32395" +msgid "Audio" +msgstr "Аудио" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "Субтитры" + +msgctxt "#32397" +msgid "Quality" +msgstr "Качетсво" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "Настройки видео Kodi" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "Настройки аудио Kodi" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "Перейти к сезону" + +msgctxt "#32401" +msgid "Directors" +msgstr "Режиссеры" + +msgctxt "#32402" +msgid "Writer" +msgstr "Сценарист" + +msgctxt "#32403" +msgid "Writers" +msgstr "Сценаристы" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "Похожие фильмы" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "Скачать субтитры" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "Задержка субтитров" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "Следующие субтитры" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "Отключить субтитры" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "Включить субтитры" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "Версия платформы" + +msgctxt "#32411" +msgid "Unknown" +msgstr "Неизсвестно" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "Изменить или удалить" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "Изменить IP адрес или удалить настройки?" + +msgctxt "#32414" +msgid "Clear" +msgstr "Удалить" + +msgctxt "#32415" +msgid "Edit" +msgstr "Изменить" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "Введите IP адрес" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "Введите номер порта" + +msgctxt "#32418" +msgid "Creator" +msgstr "Автор" + +msgctxt "#32419" +msgid "Cast" +msgstr "В ролях" + +msgctxt "#32420" +msgid "Disc" +msgstr "Диск" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "Выйти из учетной записи" + +msgctxt "#32422" +msgid "Exit" +msgstr "Выход" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "Завершить работу" + +msgctxt "#32424" +msgid "Suspend" +msgstr "Перейти в режим сна" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "Гибернация" + +msgctxt "#32426" +msgid "Reboot" +msgstr "Перезагрузка" + +msgctxt "#32427" +msgid "Failed" +msgstr "Ошибка" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "Ошибка входа!" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "Начать с {0}" + +msgctxt "#32430" +msgid "Discovery" +msgstr "Обнаружение" + +msgctxt "#32431" +msgid "Search" +msgstr "Поиск" + +msgctxt "#32432" +msgid "Space" +msgstr "Пробел" + +msgctxt "#32433" +msgid "Clear" +msgstr "Удалить" + +msgctxt "#32434" +msgid "Searching..." +msgstr "Поиск..." + +msgctxt "#32435" +msgid "No Results" +msgstr "Нет результатов" + +msgctxt "#32436" +msgid "Paused" +msgstr "Пауза" + +msgctxt "#32437" +msgid "Welcome" +msgstr "Добро пожаловать" + +msgctxt "#32438" +msgid "Previous" +msgstr "Предыдущий" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "Следующий" + +msgctxt "#32440" +msgid "On Deck" +msgstr "Сейчас просматривается" + +msgctxt "#32441" +msgid "Unknown" +msgstr "Неизвестно" + +msgctxt "#32442" +msgid "Embedded" +msgstr "Встроенный" + +msgctxt "#32443" +msgid "Forced" +msgstr "Принудительно" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "Текст песни" + +msgctxt "#32445" +msgid "Mono" +msgstr "Моно" + +msgctxt "#32446" +msgid "Stereo" +msgstr "Стерео" + +msgctxt "#32447" +msgid "None" +msgstr "Нет" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "Ошибка воспроизведения!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "Нет соединения с plex.tv[CR]Проверьте ваше интернет-соединение и попробуйте еще раз." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "Выберите версию" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "Версия воспроизведения..." + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "В этой библиотеке ничего нет" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "Пожалуйста, добавьте контент и/или проверьте включено ли \"Добавить на панель\"." + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "Нет результатов с выбранными условиями" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "Пожалуйста, измените или удалите текущий фильтр" + +msgctxt "#32456" +msgid "Show" +msgstr "Показ" + +msgctxt "#32457" +msgid "By Show" +msgstr "По показу" + +msgctxt "#32458" +msgid "Episodes" +msgstr "Эпизоды" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "Автономный режим" + +msgctxt "#32460" +msgid "Sign In" +msgstr "Войти" + +msgctxt "#32461" +msgid "Albums" +msgstr "Альбомы" + +msgctxt "#32462" +msgid "Artist" +msgstr "Артист" + +msgctxt "#32463" +msgid "By Artist" +msgstr "По артисту" diff --git a/script.plexmod/resources/language/resource.language.zh_cn/strings.po b/script.plexmod/resources/language/resource.language.zh_cn/strings.po new file mode 100644 index 000000000..46b8c93da --- /dev/null +++ b/script.plexmod/resources/language/resource.language.zh_cn/strings.po @@ -0,0 +1,1075 @@ +# XBMC Media Center language file +msgid "" +msgstr "" +"Project-Id-Version: XBMC-Addons\n" +"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" +"POT-Creation-Date: 2020-3-4 22:56+0000\n" +"PO-Revision-Date: 2022-02-08 19:00+0800\n" +"Last-Translator: Qianyu Li \n" +"Language-Team: LANGUAGE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgctxt "#32000" +msgid "Main" +msgstr "一般" + +msgctxt "#32001" +msgid "Original" +msgstr "原始" + +msgctxt "#32002" +msgid "20 Mbps 1080p" +msgstr "" + +msgctxt "#32003" +msgid "12 Mbps 1080p" +msgstr "" + +msgctxt "#32004" +msgid "10 Mbps 1080p" +msgstr "" + +msgctxt "#32005" +msgid "8 Mbps 1080p" +msgstr "" + +msgctxt "#32006" +msgid "4 Mbps 720p" +msgstr "" + +msgctxt "#32007" +msgid "3 Mbps 720p" +msgstr "" + +msgctxt "#32008" +msgid "2 Mbps 720p" +msgstr "" + +msgctxt "#32009" +msgid "1.5 Mbps 480p" +msgstr "" + +msgctxt "#32010" +msgid "720 kbps" +msgstr "" + +msgctxt "#32011" +msgid "320 kbps" +msgstr "" + +msgctxt "#32012" +msgid "208 kbps" +msgstr "" + +msgctxt "#32013" +msgid "96 kbps" +msgstr "" + +msgctxt "#32014" +msgid "64 kbps" +msgstr "" + +msgctxt "#32020" +msgid "Local Quality" +msgstr "本地播放质量" + +msgctxt "#32021" +msgid "Remote Quality" +msgstr "远程播放质量" + +msgctxt "#32022" +msgid "Online Quality" +msgstr "在线播放质量" + +msgctxt "#32023" +msgid "Transcode Format" +msgstr "转码格式" + +msgctxt "#32024" +msgid "Debug Logging" +msgstr "调试日志" + +msgctxt "#32025" +msgid "Allow Direct Play" +msgstr "允许直接播放" + +msgctxt "#32026" +msgid "Allow Direct Stream" +msgstr "允许直连串流" + +msgctxt "#32027" +msgid "Force" +msgstr "强制直接播放" + +msgctxt "#32028" +msgid "Always" +msgstr "总是" + +msgctxt "#32029" +msgid "Only Image Formats" +msgstr "仅图像格式" + +msgctxt "#32030" +msgid "Auto" +msgstr "自动" + +msgctxt "#32031" +msgid "Burn Subtitles (Direct Play Only)" +msgstr "固化字幕(仅直接播放)" + +msgctxt "#32032" +msgid "Allow Insecure Connections" +msgstr "允许非加密连接" + +msgctxt "#32033" +msgid "Never" +msgstr "从不" + +msgctxt "#32034" +msgid "On Same network" +msgstr "在同一网络" + +msgctxt "#32035" +msgid "Always" +msgstr "总是" + +msgctxt "#32036" +msgid "Allow 4K" +msgstr "允许4K" + +msgctxt "#32037" +msgid "Allow HEVC (h265)" +msgstr "允许HEVC (h265)" + +msgctxt "#32038" +msgid "Automatically Sign In" +msgstr "自动登录" + +msgctxt "#32039" +msgid "Post Play Auto Play" +msgstr "点击海报自动播放" + +msgctxt "#32040" +msgid "Enable Subtitle Downloading" +msgstr "允许下载字幕" + +msgctxt "#32041" +msgid "Enable Subtitle Downloading" +msgstr "允许下载字幕" + +msgctxt "#32042" +msgid "Server Discovery (GDM)" +msgstr "发现服务器(GDM)" + +msgctxt "#32043" +msgid "Start Plex On Kodi Startup" +msgstr "打开Kodi时自动启动PLEX" + +msgctxt "#32044" +msgid "Connection 1 IP" +msgstr "服务器1的IP" + +msgctxt "#32045" +msgid "Connection 1 Port" +msgstr "服务器1的端口" + +msgctxt "#32046" +msgid "Connection 2 IP" +msgstr "服务器2的IP" + +msgctxt "#32047" +msgid "Connection 2 Port" +msgstr "服务器2的端口" + +msgctxt "#32048" +msgid "Audio" +msgstr "音频" + +msgctxt "#32049" +msgid "Advanced" +msgstr "高级" + +msgctxt "#32050" +msgid "Manual Servers" +msgstr "手动输入服务器地址" + +msgctxt "#32051" +msgid "Privacy" +msgstr "隐私" + +msgctxt "#32052" +msgid "About" +msgstr "关于" + +msgctxt "#32053" +msgid "Video" +msgstr "视频" + +msgctxt "#32054" +msgid "Addon Version" +msgstr "插件版本" + +msgctxt "#32055" +msgid "Kodi Version" +msgstr "Kodi版本" + +msgctxt "#32056" +msgid "Screen Resolution" +msgstr "屏幕分辨率" + +msgctxt "#32057" +msgid "Current Server Version" +msgstr "PLEX服务器版本" + +msgctxt "#32100" +msgid "Skip user selection and pin entry on startup." +msgstr "启动时跳过选择用户和图钉." + +msgctxt "#32101" +msgid "If enabled, when playback ends and there is a 'Next Up' item available, it will be automatically be played after a 15 second delay." +msgstr "如果启用,当播放结束并且有一个“Next Up”项目可用时,它将在15秒的延迟后自动播放." + +msgctxt "#32102" +msgid "Enable this if your hardware can handle 4K playback. Disable it to force transcoding." +msgstr "如果您的硬件可以处理4K播放,请启用此选项.禁用它以强制转码." + +msgctxt "#32103" +msgid "Enable this if your hardware can handle HEVC/h265. Disable it to force transcoding." +msgstr "如果您的硬件可以处理HEVC/h265,请启用此选项.禁用它以强制转码." + +msgctxt "#32104" +msgid "When to connect to servers with no secure connections.[CR][CR]* [B]Never[/B]: Never connect to a server insecurely[CR]* [B]On Same Network[/B]: Allow if on the same network[CR]* [B]Always[/B]: Allow same network and remote connections" +msgstr "何时连接到没有安全连接的服务器。[CR][CR]* [B]从不[/B]: 从不以不安全方式连接服务器[CR]* [B]在同一网络[/B]: 允许同一网络时[CR]* [B]总是[/B]: 允许同一网络和远程连接时" + +msgctxt "#32201" +msgid "Trailer" +msgstr "预告片" + +msgctxt "#32202" +msgid "Deleted Scene" +msgstr "删除的场景" + +msgctxt "#32203" +msgid "Interview" +msgstr "访问" + +msgctxt "#32204" +msgid "Music Video" +msgstr "音乐视频" + +msgctxt "#32205" +msgid "Behind the Scenes" +msgstr "幕后花絮" + +msgctxt "#32206" +msgid "Scene" +msgstr "现场" + +msgctxt "#32207" +msgid "Live Music Video" +msgstr "现场音乐视频" + +msgctxt "#32208" +msgid "Lyric Music Video" +msgstr "歌词音乐视频" + +msgctxt "#32209" +msgid "Concert" +msgstr "演奏会" + +msgctxt "#32210" +msgid "Featurette" +msgstr "电影短片" + +msgctxt "#32211" +msgid "Short" +msgstr "短篇" + +msgctxt "#32212" +msgid "Other" +msgstr "其他" + +msgctxt "#32300" +msgid "Go to Album" +msgstr "跳转到相册" + +msgctxt "#32301" +msgid "Go to Artist" +msgstr "跳转到演员" + +msgctxt "#32302" +msgid "Go to {0}" +msgstr "跳转到 {0}" + +msgctxt "#32303" +msgid "Season" +msgstr "季数" + +msgctxt "#32304" +msgid "Episode" +msgstr "集数" + +msgctxt "#32305" +msgid "Extras" +msgstr "其他" + +msgctxt "#32306" +msgid "Related Shows" +msgstr "相关节目" + +msgctxt "#32307" +msgid "More" +msgstr "更多" + +msgctxt "#32308" +msgid "Available" +msgstr "可用的" + +msgctxt "#32309" +msgid "None" +msgstr "无" + +msgctxt "#32310" +msgid "S" +msgstr "" + +msgctxt "#32311" +msgid "E" +msgstr "" + +msgctxt "#32312" +msgid "Unavailable" +msgstr "不可用" + +msgctxt "#32313" +msgid "This item is currently unavailable." +msgstr "这个项目现在不可用." + +msgctxt "#32314" +msgid "In Progress" +msgstr "进行中" + +msgctxt "#32315" +msgid "Resume playback?" +msgstr "恢复播放?" + +msgctxt "#32316" +msgid "Resume" +msgstr "恢复" + +msgctxt "#32317" +msgid "Play from beginning" +msgstr "从头播放" + +msgctxt "#32318" +msgid "Mark Unplayed" +msgstr "标记为未播放" + +msgctxt "#32319" +msgid "Mark Played" +msgstr "标记为已播放" + +msgctxt "#32320" +msgid "Mark Season Unplayed" +msgstr "标记整季未播放" + +msgctxt "#32321" +msgid "Mark Season Played" +msgstr "标记整季已播放" + +msgctxt "#32322" +msgid "Delete" +msgstr "删除" + +msgctxt "#32323" +msgid "Go To Show" +msgstr "转到剧集" + +msgctxt "#32324" +msgid "Go To {0}" +msgstr "跳转到 {0}" + +msgctxt "#32325" +msgid "Play Next" +msgstr "播放下一个" + +msgctxt "#32326" +msgid "Really Delete?" +msgstr "确定删除?" + +msgctxt "#32327" +msgid "Are you sure you really want to delete this media?" +msgstr "你确定你要删除这个媒体么?" + +msgctxt "#32328" +msgid "Yes" +msgstr "是" + +msgctxt "#32329" +msgid "No" +msgstr "否" + +msgctxt "#32330" +msgid "Message" +msgstr "消息" + +msgctxt "#32331" +msgid "There was a problem while attempting to delete the media." +msgstr "尝试删除媒体时出现问题." + +msgctxt "#32332" +msgid "Home" +msgstr "主页" + +msgctxt "#32333" +msgid "Playlists" +msgstr "播放列表" + +msgctxt "#32334" +msgid "Confirm Exit" +msgstr "确定退出" + +msgctxt "#32335" +msgid "Are you ready to exit Plex?" +msgstr "你确定要退出PLEX么?" + +msgctxt "#32336" +msgid "Exit" +msgstr "退出" + +msgctxt "#32337" +msgid "Cancel" +msgstr "返回" + +msgctxt "#32338" +msgid "No Servers Found" +msgstr "没有找到服务器" + +msgctxt "#32339" +msgid "Server is not accessible" +msgstr "服务器不能访问" + +msgctxt "#32340" +msgid "Connection tests are in progress. Please wait." +msgstr "连接测试正在进行中.请耐心等待." + +msgctxt "#32341" +msgid "Server is not accessible. Please sign into your server and check your connection." +msgstr "服务器不可访问.请登录您的服务器并检查您的连接." + +msgctxt "#32342" +msgid "Switch User" +msgstr "切换用户" + +msgctxt "#32343" +msgid "Settings" +msgstr "设置" + +msgctxt "#32344" +msgid "Sign Out" +msgstr "登出" + +msgctxt "#32345" +msgid "All" +msgstr "所有" + +msgctxt "#32346" +msgid "By Name" +msgstr "按名称排序" + +msgctxt "#32347" +msgid "Artists" +msgstr "艺人" + +msgctxt "#32348" +msgid "Movies" +msgstr "电影" + +msgctxt "#32349" +msgid "photos" +msgstr "相片" + +msgctxt "#32350" +msgid "Shows" +msgstr "演出" + +msgctxt "#32351" +msgid "By Date Added" +msgstr "按添加日期排序" + +msgctxt "#32352" +msgid "Date Added" +msgstr "添加日期" + +msgctxt "#32353" +msgid "By Release Date" +msgstr "按发布日期排序" + +msgctxt "#32354" +msgid "Release Date" +msgstr "发布日期" + +msgctxt "#32355" +msgid "By Date Viewed" +msgstr "按观看日期排序" + +msgctxt "#32356" +msgid "Date Viewed" +msgstr "观看日期" + +msgctxt "#32357" +msgid "By Name" +msgstr "按名称排序" + +msgctxt "#32358" +msgid "Name" +msgstr "名称" + +msgctxt "#32359" +msgid "By Rating" +msgstr "按热度排序" + +msgctxt "#32360" +msgid "Rating" +msgstr "热度" + +msgctxt "#32361" +msgid "By Resolution" +msgstr "按分辨率排序" + +msgctxt "#32362" +msgid "Resolution" +msgstr "分辨率" + +msgctxt "#32363" +msgid "By Duration" +msgstr "按时长排序" + +msgctxt "#32364" +msgid "Duration" +msgstr "时长" + +msgctxt "#32365" +msgid "By First Aired" +msgstr "按首次播出排序" + +msgctxt "#32366" +msgid "First Aired" +msgstr "首次播出" + +msgctxt "#32367" +msgid "By Unplayed" +msgstr "按未播放排序" + +msgctxt "#32368" +msgid "Unplayed" +msgstr "未播放" + +msgctxt "#32369" +msgid "By Date Played" +msgstr "按播放日期排序" + +msgctxt "#32370" +msgid "Date Played" +msgstr "播放日期" + +msgctxt "#32371" +msgid "By Play Count" +msgstr "按播放次数排序" + +msgctxt "#32372" +msgid "Play Count" +msgstr "播放次数" + +msgctxt "#32373" +msgid "By Date Taken" +msgstr "按拍摄日期排序" + +msgctxt "#32374" +msgid "Date Taken" +msgstr "拍摄日期" + +msgctxt "#32375" +msgid "No filters available" +msgstr "没找到相关内容" + +msgctxt "#32376" +msgid "Clear Filter" +msgstr "清空内容" + +msgctxt "#32377" +msgid "Year" +msgstr "年" + +msgctxt "#32378" +msgid "Decade" +msgstr "年代" + +msgctxt "#32379" +msgid "Genre" +msgstr "类型" + +msgctxt "#32380" +msgid "Content Rating" +msgstr "内容分级" + +msgctxt "#32381" +msgid "Network" +msgstr "网络" + +msgctxt "#32382" +msgid "Collection" +msgstr "合集" + +msgctxt "#32383" +msgid "Director" +msgstr "导演" + +msgctxt "#32384" +msgid "Actor" +msgstr "演员" + +msgctxt "#32385" +msgid "Country" +msgstr "国家" + +msgctxt "#32386" +msgid "Studio" +msgstr "工作室" + +msgctxt "#32387" +msgid "Labels" +msgstr "标签" + +msgctxt "#32388" +msgid "Camera Make" +msgstr "相机品牌" + +msgctxt "#32389" +msgid "Camera Model" +msgstr "相机型号" + +msgctxt "#32390" +msgid "Aperture" +msgstr "光圈" + +msgctxt "#32391" +msgid "Shutter Speed" +msgstr "快门速度" + +msgctxt "#32392" +msgid "Lens" +msgstr "镜头" + +msgctxt "#32393" +msgid "TV Shows" +msgstr "剧集" + +msgctxt "#32394" +msgid "Music" +msgstr "音乐" + +msgctxt "#32395" +msgid "Audio" +msgstr "音频" + +msgctxt "#32396" +msgid "Subtitles" +msgstr "字幕" + +msgctxt "#32397" +msgid "Quality" +msgstr "质量" + +msgctxt "#32398" +msgid "Kodi Video Settings" +msgstr "KODI视频设置" + +msgctxt "#32399" +msgid "Kodi Audio Settings" +msgstr "KODI音频设置" + +msgctxt "#32400" +msgid "Go To Season" +msgstr "跳转到季" + +msgctxt "#32401" +msgid "Directors" +msgstr "导演" + +msgctxt "#32402" +msgid "Writer" +msgstr "编剧" + +msgctxt "#32403" +msgid "Writers" +msgstr "编剧" + +msgctxt "#32404" +msgid "Related Movies" +msgstr "相关电影" + +msgctxt "#32405" +msgid "Download Subtitles" +msgstr "下载字幕" + +msgctxt "#32406" +msgid "Subtitle Delay" +msgstr "字幕延迟" + +msgctxt "#32407" +msgid "Next Subtitle" +msgstr "下一个字幕" + +msgctxt "#32408" +msgid "Disable Subtitles" +msgstr "禁用字幕" + +msgctxt "#32409" +msgid "Enable Subtitles" +msgstr "允许字幕" + +msgctxt "#32410" +msgid "Platform Version" +msgstr "平台版本" + +msgctxt "#32411" +msgid "Unknown" +msgstr "未知" + +msgctxt "#32412" +msgid "Edit Or Clear" +msgstr "编辑或清除" + +msgctxt "#32413" +msgid "Edit IP address or clear the current setting?" +msgstr "编辑IP地址或清除当前设置?" + +msgctxt "#32414" +msgid "Clear" +msgstr "清除" + +msgctxt "#32415" +msgid "Edit" +msgstr "编辑" + +msgctxt "#32416" +msgid "Enter IP Address" +msgstr "填写IP地址" + +msgctxt "#32417" +msgid "Enter Port Number" +msgstr "填写端口" + +msgctxt "#32418" +msgid "Creator" +msgstr "创作者" + +msgctxt "#32419" +msgid "Cast" +msgstr "阵容" + +msgctxt "#32420" +msgid "Disc" +msgstr "碟片" + +msgctxt "#32421" +msgid "Sign Out" +msgstr "登出" + +msgctxt "#32422" +msgid "Exit" +msgstr "离开" + +msgctxt "#32423" +msgid "Shutdown" +msgstr "关机" + +msgctxt "#32424" +msgid "Suspend" +msgstr "暂停" + +msgctxt "#32425" +msgid "Hibernate" +msgstr "休眠" + +msgctxt "#32426" +msgid "Reboot" +msgstr "重启" + +msgctxt "#32427" +msgid "Failed" +msgstr "失败" + +msgctxt "#32428" +msgid "Login failed!" +msgstr "登陆失败!" + +msgctxt "#32429" +msgid "Resume from {0}" +msgstr "从{0}恢复" + +msgctxt "#32430" +msgid "Discovery" +msgstr "发现" + +msgctxt "#32431" +msgid "Search" +msgstr "搜索" + +msgctxt "#32432" +msgid "Space" +msgstr "空格" + +msgctxt "#32433" +msgid "Clear" +msgstr "清除" + +msgctxt "#32434" +msgid "Searching..." +msgstr "搜索中..." + +msgctxt "#32435" +msgid "No Results" +msgstr "无结果" + +msgctxt "#32436" +msgid "Paused" +msgstr "暂停" + +msgctxt "#32437" +msgid "Welcome" +msgstr "欢迎" + +msgctxt "#32438" +msgid "Previous" +msgstr "重播" + +msgctxt "#32439" +msgid "Playing Next" +msgstr "播放下一集" + +msgctxt "#32440" +msgid "On Deck" +msgstr "已播项目" + +msgctxt "#32441" +msgid "Unknown" +msgstr "未知" + +msgctxt "#32442" +msgid "Embedded" +msgstr "内嵌" + +msgctxt "#32443" +msgid "Forced" +msgstr "强制" + +msgctxt "#32444" +msgid "Lyrics" +msgstr "歌词" + +msgctxt "#32445" +msgid "Mono" +msgstr "单声道" + +msgctxt "#32446" +msgid "Stereo" +msgstr "立体声" + +msgctxt "#32447" +msgid "None" +msgstr "无" + +msgctxt "#32448" +msgid "Playback Failed!" +msgstr "播放失败!" + +msgctxt "#32449" +msgid "Can't connect to plex.tv[CR]Check your internet connection and try again." +msgstr "无法连接至plex.tv[CR]检查您的互联网连接,然后重试." + +msgctxt "#32450" +msgid "Choose Version" +msgstr "选择版本" + +msgctxt "#32451" +msgid "Play Version..." +msgstr "播放版本" + +msgctxt "#32452" +msgid "No Content available in this library" +msgstr "库里没有可播放的内容" + +msgctxt "#32453" +msgid "Please add content and/or check that 'Include in dashboard' is enabled." +msgstr "请添加内容和/或检查 '包括在仪表板' 是否已启用." + +msgctxt "#32454" +msgid "No Content available for this filter" +msgstr "没有可用于此过滤器的内容" + +msgctxt "#32455" +msgid "Please change change or remove the current filter" +msgstr "请更改或删除当前过滤器" + +msgctxt "#32456" +msgid "Show" +msgstr "节目" + +msgctxt "#32457" +msgid "By Show" +msgstr "按节目排序" + +msgctxt "#32458" +msgid "Episodes" +msgstr "集数" + +msgctxt "#32459" +msgid "Offline Mode" +msgstr "离线模式" + +msgctxt "#32460" +msgid "Sign In" +msgstr "登录" + +msgctxt "#32461" +msgid "Albums" +msgstr "专辑" + +msgctxt "#32462" +msgid "Artist" +msgstr "艺人" + +msgctxt "#32463" +msgid "By Artist" +msgstr "按艺人排序" + +msgctxt "#32464" +msgid "Player" +msgstr "播放" + +msgctxt "#32465" +msgid "Use skip step settings from Kodi" +msgstr "使用Kodi设置的跳过步骤" + +msgctxt "#32466" +msgid "Automatically seek selected position after a delay" +msgstr "延迟后自动跳到所选位置" + +msgctxt "#32467" +msgid "User Interface" +msgstr "用户界面" + +msgctxt "#32468" +msgid "Show dynamic background art" +msgstr "显示动态背景艺术" + +msgctxt "#32469" +msgid "Background art blur amount" +msgstr "背景艺术模糊量" + +msgctxt "#32470" +msgid "Background art opacity" +msgstr "背景艺术不透明度" + +msgctxt "#32471" +msgid "Use Plex/Kodi steps for timeline" +msgstr "使用Plex/Kodi的时间轴步骤" + +msgctxt "#32480" +msgid "Theme music" +msgstr "主题音乐" + +msgctxt "#32481" +msgid "Off" +msgstr "关闭" + +msgctxt "#32482" +msgid "%(percentage)s %%" +msgstr "" + +msgctxt "#32483" +msgid "Hide Stream Info" +msgstr "隐藏流信息" + +msgctxt "#32484" +msgid "Show Stream Info" +msgstr "显示流信息" + +msgctxt "#32485" +msgid "Go back instantly with the previous menu action in scrolled views" +msgstr "滚动视图中的上一个菜单操作后立即返回" + +msgctxt "#32487" +msgid "Seek Delay" +msgstr "跳过延迟" + +msgctxt "#32488" +msgid "Screensaver" +msgstr "屏幕保护" + +msgctxt "#32489" +msgid "Quiz Mode" +msgstr "测验模式" + +msgctxt "#32490" +msgid "Collections" +msgstr "合集" + +msgctxt "#32491" +msgid "Folders" +msgstr "文件夹" + +msgctxt "#32492" +msgid "Kodi Subtitle Settings" +msgstr "KODI字幕设置" + +msgctxt "#32493" +msgid "Prefer normal over forced subtitles if available (PMS selects forced by default)" +msgstr "如果有的话,优先选择正常字幕而不是强制字幕(PMS默认选择强制字幕)" + +msgctxt "#32495" +msgid "Skip intro" +msgstr "跳过片头" + +msgctxt "#32500" +msgid "Always show post-play screen (even for short videos)" +msgstr "始终显示播放后的画面(即使是短视频)" + +msgctxt "#32501" +msgid "Time-to-wait between videos on post-play" +msgstr "播放后的视频之间的等待时间" + +msgctxt "#32505" +msgid "Visit media in video playlist instead of playing it" +msgstr "访问视频播放列表中的媒体而不是播放它" + +msgctxt "#32601" +msgid "Allow AV1" +msgstr "允许AV1" + +msgctxt "#32602" +msgid "Enable this if your hardware can handle AV1. Disable it to force transcoding." +msgstr "如果你的硬件可以处理AV1,请启用此功能.禁用它可以强制进行转码." + +msgctxt "#32521" +msgid "Skip Intro Button Timeout" +msgstr "跳过片头按钮超时" + +msgctxt "#32522" +msgid "Automatically Skip Intro" +msgstr "自动跳过片头" + +msgctxt "#32523" +msgid "Automatically skip intros if available." +msgstr "如果可用既自动跳过片头." + +msgctxt "#32524" +msgid "Set how long the skip intro button shows for." +msgstr "设置跳过片头按钮的显示时间." + diff --git a/script.plexmod/resources/settings.xml b/script.plexmod/resources/settings.xml new file mode 100644 index 000000000..973bb4a12 --- /dev/null +++ b/script.plexmod/resources/settings.xml @@ -0,0 +1,335 @@ + + +
+ + + + + + + + + 0 + false + + + + 0 + false + + + + 0 + true + + + + 0 + 100 + + 25 + 25 + 750 + + + false + + + + + + + + + 0 + true + + + + 0 + 1 + + 0 + 0.1 + 5 + + + false + + + true + + + + 0 + false + + + + 0 + false + + + + 0 + true + + + + 0 + true + + + true + + + + 0 + true + + + + 0 + 120 + + 0 + 1 + 600 + + + false + + + + 0 + 10 + + 0 + 1 + 600 + + + false + + + + + + + + + 0 + 2.5 + + -10 + 0.5 + 10 + + + 33630 + false + + + + 0 + 10 + + 1 + 1 + 40 + + + 32524 + false + + + + 0 + 10 + + 1 + 1 + 40 + + + 32528 + false + + + + 0 + 60 + + 10 + 10 + 1800 + + + 33510 + false + + + + 0 + true + + + + 0 + false + + + + + + + + + 0 + false + + + + 0 + false + + + + 0 + true + + + + 0 + true + + + true + + + + 0 + - + + + false + + + + 0 + 0 + + 0 + 1 + 256 + + + false + + + true + + + + 0 + 20 + + 0 + 1 + 100 + + + false + + + true + + + + 0 + false + + + true + + + + 0 + true + + + + 0 + true + + + + 0 + 16 + + 32501 + + + + 0 + true + + + + 0 + true + + + + + + + + 0 + false + + + + + + + + 0 + 5 + + 0.1 + 0.1 + 20 + + + false + + + + 0 + 2.5 + + 0.1 + 0.1 + 20 + + + false + + + + 0 + 10 + + 1 + 1 + 1000 + + + false + + + + +
+
diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-album.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-album.xml new file mode 100644 index 000000000..e9c0d979a --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-album.xml @@ -0,0 +1,628 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + 0 + 135 + 101 + + + 60 + 0 + + 0 + 5 + 420 + 40 + font13 + left + center + FFFFFFFF + + + + 0 + 60 + 420 + 40 + font13 + left + center + FFFFFFFF + + + + 0 + 142 + 630 + 630 + $INFO[Window.Property(album.thumb)] + scale + + + + + VisibleChange + 301 + 50 + 784 + 650 + 145 + 200 + 101 + -50 + horizontal + center + 200 + true + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 750 + 0 + 1170 + 945 + + 0 + 0 + 1380 + 945 + script.plex/white-square.png + 20000000 + + + + 0 + 0 + 1170 + 945 + 200 + 152 + 300 + 200 + vertical + 4 + 152 + + + + String.IsEmpty(ListItem.Property(is.header)) + 120 + 24 + + !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + -10 + 0 + 60 + 76 + font10 + center + center + D8FFFFFF + + + + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 2 + 21 + 35 + 35 + script.plex/indicators/playing-circle.png + FFE5A00D + + + 90 + 0 + + 0 + 0 + 723 + 76 + font10 + left + center + FFFFFFFF + + + + + 730 + 0 + 200 + 76 + font10 + right + center + D8FFFFFF + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 73 + 930 + 2 + script.plex/white-square.png + 40000000 + + + + + !String.IsEmpty(ListItem.Property(is.header)) + 120 + 24 + 400 + 76 + font10 + left + center + FFFFFFFF + + + + + + + + + String.IsEmpty(ListItem.Property(is.header)) + + !Control.HasFocus(101) + 120 + 24 + + !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + -10 + 0 + 60 + 76 + font10 + center + center + D8FFFFFF + + + + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 2 + 21 + 35 + 35 + script.plex/indicators/playing-circle.png + FFE5A00D + + + 90 + 0 + + 0 + 0 + 723 + 76 + font10 + left + center + FFFFFFFF + + + + + 730 + 0 + 200 + 76 + font10 + right + center + D8FFFFFF + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 73 + 930 + 2 + script.plex/white-square.png + 40000000 + + + + + Control.HasFocus(101) + 63 + 21 + + -40 + -40 + 1130 + 156 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 1044 + 76 + script.plex/white-square-rounded.png + FFE5A00D + + + !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 48 + 0 + 50 + 76 + font12 + left + center + B8000000 + + + + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 36 + 21 + 35 + 35 + script.plex/indicators/playing-circle.png + FF000000 + + + 140 + 0 + + 0 + 0 + 738 + 76 + font12 + left + center + DF000000 + + + + + 796 + 0 + 200 + 76 + font12 + right + center + B8000000 + + + + + + + !String.IsEmpty(ListItem.Property(is.header)) + 120 + 24 + 400 + 76 + font10 + left + center + FFFFFFFF + + + + + + + + 1128 + 33 + 10 + 874 + 101 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + + + 201 + 0 + 0 + 1920 + 135 + + ControlGroup(200).HasFocus(0) + false + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-artist.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-artist.xml new file mode 100644 index 000000000..797137b02 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-artist.xml @@ -0,0 +1,527 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + 0 + 135 + 101 + + + VisibleChange + 301 + 594 + 418 + 600 + 145 + 200 + 101 + -50 + horizontal + center + 200 + true + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/info-focus.png + script.plex/buttons/info.png + + + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + + 60 + 0 + 1920 + 200 + + 0 + 0 + 519 + 519 + $INFO[Window.Property(thumb)] + scale + + + 579 + 5 + 1190 + 40 + font13 + left + center + FFFFFFFF + + + + 579 + 55 + 1190 + 40 + font13 + left + center + FFDDDDDD + + + + 579 + 158 + 1221 + 250 + font13 + left + FFDDDDDD + + 152 + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 0 + 585 + 1920 + 360 + + 0 + 0 + 1920 + 360 + script.plex/white-square.png + 20000000 + + + 0 + -20 + 1920 + 700 + 300 + 200 + horizontal + 2 + + + + 60 + 60 + + 0 + 0 + + 0 + 0 + 215 + 215 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 215 + 215 + $INFO[ListItem.Thumb] + scale + + + 0 + 220 + + 0 + 0 + 215 + 30 + font10 + center + FFFFFFFF + + + + 0 + 30 + 215 + 30 + font10 + center + FFFFFFFF + + + + + + + + + + + 60 + 60 + + Focus + UnFocus + + 0 + 0 + + Control.HasFocus(101) + -40 + -40 + 295 + 295 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 215 + 215 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 215 + 215 + $INFO[ListItem.Thumb] + scale + + + 0 + 220 + + false + 0 + 0 + 215 + 30 + font10 + center + FFFFFFFF + + + + 0 + 30 + 215 + 30 + font10 + center + FFFFFFFF + + + + + + Control.HasFocus(101) + -5 + -5 + 225 + 225 + script.plex/home/selected.png + + + + + + + + + + + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + false + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-background.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-background.xml new file mode 100644 index 000000000..7d28bf2fb --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-background.xml @@ -0,0 +1,65 @@ + + + 100 + + 1 + 0 + 0 + + 0xff111111 + + + !String.IsEmpty(Window(10000).Property(script.plex.background.splash)) + 710 + 459 + 500 + 162 + script.plex/splash.png + + + + !String.IsEmpty(Window(10000).Property(script.plex.background.busy)) + + 812 + 135 + 300 + 97 + script.plex/user_select/plex.png + + + 840 + 465 + 240 + 150 + script.plex/busy-back.png + A0FFFFFF + + + 915 + 521 + 90 + 38 + script.plex/busy.gif + + + + + !String.IsEmpty(Window(10000).Property(script.plex.background.shutdown)) + + 840 + 465 + 240 + 150 + script.plex/busy-back.png + A0FFFFFF + + + 915 + 521 + 90 + 38 + script.plex/busy.gif + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-blank.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-blank.xml new file mode 100644 index 000000000..2f887866c --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-blank.xml @@ -0,0 +1,12 @@ + + + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-busy.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-busy.xml new file mode 100644 index 000000000..31b167f2b --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-busy.xml @@ -0,0 +1,28 @@ + + + + 1 + 0 + 0 + + + + WindowOpen + + 840 + 465 + 240 + 150 + script.plex/busy-back.png + A0FFFFFF + + + 915 + 521 + 90 + 38 + script.plex/busy.gif + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-busy_msg.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-busy_msg.xml new file mode 100644 index 000000000..5fc2a6bb5 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-busy_msg.xml @@ -0,0 +1,35 @@ + + + + 1 + 0 + 0 + + + + 0 + 0 + WindowOpen + + 840 + 465 + 240 + 150 + script.plex/busy-back.png + A0FFFFFF + + + 840 + 465 + 240 + 150 + center + center + FFFFFFFF + + font14 + black + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-dropdown.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-dropdown.xml new file mode 100644 index 000000000..8ace797b8 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-dropdown.xml @@ -0,0 +1,201 @@ + + SetProperty(dropdown,1) + 100 + + 1 + 0 + 0 + + 100 + + + + 0 + 0 + 1920 + 1080 + - + - + + + 250 + !String.IsEmpty(Window.Property(show)) + 0 + 0 + + -40 + -40 + 380 + 146 + script.plex/drop-shadow.png + + + 0 + 0 + 300 + 924 + Close + noop + Close + Close + Close + noop + 200 + vertical + + + + !String.IsEmpty(ListItem.Property(first)) + 0 + 0 + 300 + 66 + script.plex/white-square-top-rounded.png + + + String.IsEmpty(ListItem.Property(first)) + String.IsEmpty(ListItem.Property(last)) + String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 300 + 66 + script.plex/white-square.png + + + !String.IsEmpty(ListItem.Property(last)) + 0 + 0 + 300 + 66 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 300 + 66 + script.plex/white-square-rounded.png + + + String.IsEmpty(ListItem.Property(with.indicator)) + 0 + 0 + 300 + 66 + font12 + center + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(with.indicator)) + + 20 + 0 + 280 + 66 + font12 + left + center + FFFFFFFF + + + + 254 + 20 + 26 + 26 + $INFO[ListItem.Thumb] + keep + + + + !String.IsEmpty(ListItem.Property(separator)) + 0 + 64 + 300 + 2 + script.plex/white-square.png + + + + + !String.IsEmpty(ListItem.Property(first)) + 0 + 0 + 300 + 66 + script.plex/white-square-top-rounded.png + + + String.IsEmpty(ListItem.Property(first)) + String.IsEmpty(ListItem.Property(last)) + String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 300 + 66 + script.plex/white-square.png + + + !String.IsEmpty(ListItem.Property(last)) + 0 + 0 + 300 + 66 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 300 + 66 + script.plex/white-square-rounded.png + + + String.IsEmpty(ListItem.Property(with.indicator)) + 0 + 0 + 300 + 66 + font12 + center + center + FF000000 + + + + !String.IsEmpty(ListItem.Property(with.indicator)) + + 20 + 0 + 280 + 66 + font12 + left + center + FF000000 + + + + 254 + 20 + 26 + 26 + $INFO[ListItem.Thumb] + keep + + + + !String.IsEmpty(ListItem.Property(separator)) + 0 + 64 + 300 + 2 + script.plex/white-square.png + + + + + + \ No newline at end of file diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-dropdown_header.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-dropdown_header.xml new file mode 100644 index 000000000..3c623d851 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-dropdown_header.xml @@ -0,0 +1,247 @@ + + SetProperty(dropdown,1) + 100 + + 1 + 0 + 0 + + + + + 0 + 0 + 1920 + 1080 + - + - + + + 250 + !String.IsEmpty(Window.Property(show)) + 0 + 0 + + -60 + -106 + 720 + 146 + script.plex/drop-shadow.png + + + !String.IsEmpty(Window.Property(header)) + -20 + -66 + + 0 + 0 + 640 + 132 + script.plex/white-square-rounded.png + + + 20 + 0 + 600 + 66 + font12 + center + center + FFFFFFFF + + + + + 0 + 0 + 600 + 924 + Close + noop + Close + Close + Close + noop + 200 + vertical + + + + !String.IsEmpty(ListItem.Property(first)) + 0 + 0 + 600 + 66 + script.plex/white-square-top-rounded.png + + + String.IsEmpty(ListItem.Property(first)) + String.IsEmpty(ListItem.Property(last)) + String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 600 + 66 + script.plex/white-square.png + + + !String.IsEmpty(ListItem.Property(last)) + 0 + 0 + 600 + 66 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 600 + 66 + script.plex/white-square-rounded.png + + + String.IsEmpty(ListItem.Property(with.indicator)) + String.IsEqual(ListItem.Property(align),center) + 0 + 0 + 600 + 66 + font12 + center + center + FFFFFFFF + + + + String.IsEmpty(ListItem.Property(with.indicator)) + String.IsEqual(ListItem.Property(align),left) + 20 + 0 + 600 + 66 + font12 + left + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(with.indicator)) + + 60 + 0 + 520 + 66 + font12 + left + center + FFFFFFFF + + + + 20 + 20 + 26 + 26 + $INFO[ListItem.Thumb] + keep + + + + !String.IsEmpty(ListItem.Property(separator)) + 0 + 64 + 600 + 2 + script.plex/white-square.png + + + + + !String.IsEmpty(ListItem.Property(first)) + 0 + 0 + 600 + 66 + script.plex/white-square-top-rounded.png + + + String.IsEmpty(ListItem.Property(first)) + String.IsEmpty(ListItem.Property(last)) + String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 600 + 66 + script.plex/white-square.png + + + !String.IsEmpty(ListItem.Property(last)) + 0 + 0 + 600 + 66 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 600 + 66 + script.plex/white-square-rounded.png + + + String.IsEmpty(ListItem.Property(with.indicator)) + String.IsEqual(ListItem.Property(align),center) + 0 + 0 + 600 + 66 + font12 + center + center + FF000000 + + + + String.IsEmpty(ListItem.Property(with.indicator)) + String.IsEqual(ListItem.Property(align),left) + 20 + 0 + 600 + 66 + font12 + left + center + FF000000 + + + + !String.IsEmpty(ListItem.Property(with.indicator)) + + 60 + 0 + 520 + 66 + font12 + left + center + FF000000 + + + + 20 + 20 + 26 + 26 + $INFO[ListItem.Thumb] + keep + + + + !String.IsEmpty(ListItem.Property(separator)) + 0 + 64 + 600 + 2 + script.plex/white-square.png + + + + + + \ No newline at end of file diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-episodes.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-episodes.xml new file mode 100644 index 000000000..47428c701 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-episodes.xml @@ -0,0 +1,1820 @@ + + + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + Conditional + + + + + + + + + + + + + + + + + + 0 + 155 + 101 + + + VisibleChange + !String.IsEmpty(Window.Property(initialized)) + 301 + 30 + 405 + 717 + 200 + 200 + 400 + center + -50 + horizontal + 200 + true + + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/info-focus.png + script.plex/buttons/info.png + + + + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + !String.IsEmpty(Container(400).ListItem.Property(media.multiple)) + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/media-focus.png + script.plex/buttons/media.png + + + + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/settings-focus.png + script.plex/buttons/settings.png + + + + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + + 0 + 0 + 1920 + 600 + + + 60 + 0 + 657 + 393 + script.plex/thumb_fallbacks/show.png + WindowOpen + scale + + + 60 + 0 + 657 + 393 + $INFO[Container(400).ListItem.Thumb] + scale + + + !String.IsEmpty(Container(400).ListItem.Property(unwatched)) + 682 + 0 + 35 + 35 + script.plex/indicators/unwatched.png + + + + + 776 + 0 + 1360 + 60 + left + 0 + horizontal + true + + auto + 60 + font13 + left + top + FFFFFFFF + + + + !String.IsEmpty(Container(400).ListItem.Property(remainingTime)) + 10 + 6 + auto + 34 + font12 + center + center + FFE5A00D + FFE5A00D + 15 + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + + + + + 776 + 50 + 1360 + 60 + font13 + left + top + FFFFFFFF + + + + 776 + 140 + 1360 + 30 + left + 0 + horizontal + true + + auto + 30 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Container(400).ListItem.Property(unavailable)) + 10 + auto + 30 + font12 + center + center + FFFFFFFF + FFFFFFFF + 15 + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + + + + + + 776 + 188 + 1360 + 34 + left + 0 + horizontal + true + + auto + 34 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Container(400).ListItem.Property(rating.stars)) + auto + 34 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Container(400).ListItem.Property(rating.stars)) + 6 + 134 + 22 + script.plex/stars/$INFO[Container(400).ListItem.Property(rating.stars)].png + + + !String.IsEmpty(Container(400).ListItem.Property(video.res)) + 10 + auto + 34 + font12 + center + center + FFFFFFFF + FFFFFFFF + 15 + script.plex/white-square-rounded-top-padded.png + script.plex/white-square-rounded-top-padded.png + + + + + + !String.IsEmpty(Container(400).ListItem.Property(rating)) + 1560 + 140 + 300 + 32 + right + 15 + horizontal + true + + 2 + 63 + 30 + $INFO[Container(400).ListItem.Property(rating.image)] + keep + + + auto + 30 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Container(400).ListItem.Property(rating2)) + 2 + 40 + 30 + $INFO[Container(400).ListItem.Property(rating2.image)] + keep + + + !String.IsEmpty(Container(400).ListItem.Property(rating2)) + auto + 30 + font12 + left + FFFFFFFF + + + + + + 776 + 263 + 1360 + 34 + left + 15 + horizontal + true + + !String.IsEmpty(Container(400).ListItem.Property(audio)) + auto + 34 + font12 + center + center + FFFFFFFF + FFFFFFFF + 15 + script.plex/white-square-rounded-top-padded.png + script.plex/white-square-rounded-top-padded.png + + + + auto + 34 + font12 + left + center + FFFFFFFF + + + + !String.IsEmpty(Container(400).ListItem.Property(subtitles)) + 34 + auto + 34 + font12 + center + center + FFFFFFFF + FFFFFFFF + 15 + script.plex/white-square-rounded-top-padded.png + script.plex/white-square-rounded-top-padded.png + + + + !String.IsEmpty(Container(400).ListItem.Property(subtitles)) + auto + 34 + font12 + left + center + FFFFFFFF + + + + + 776 + 340 + 1084 + 172 + font12 + left + FFFFFFFF + + + + + WindowOpen + -1 + 557 + 1 + 8 + script.plex/white-square.png + FFCC7B19 + + + !Control.IsVisible(500) + 0 + 565 + 1920 + 2 + script.plex/white-square.png + A0000000 + + + + + !String.IsEmpty(Window.Property(initialized)) + 0 + 565 + 1920 + 1800 + + 300 + 0 + + + Integer.IsGreater(Container(400).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 360 + 1920 + + 0 + 0 + 1920 + 360 + script.plex/white-square.png + 40000000 + + + 60 + 0 + 800 + 80 + font12 + left + center + AAFFFFFF + + + + 0 + 18 + 1920 + 430 + 300 + 401 + false + false + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 158 + + 0 + 0 + 299 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 299 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 264 + 0 + 35 + 35 + script.plex/indicators/unwatched.png + + + false + 0 + 175 + 299 + 60 + font12 + center + AAFFFFFF + + + + false + 0 + 210 + 299 + 60 + font12 + center + AAFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 299 + 168 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 119 + 34 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 119 + 34 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 85.5 + 20 + 128 + 128 + script.plex/home/busy.gif + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(400) + -40 + -40 + 389 + 258 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 158 + + 0 + 0 + 299 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 299 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 264 + 0 + 35 + 35 + script.plex/indicators/unwatched.png + + + Control.HasFocus(400) + + true + 0 + 175 + 299 + 60 + font12 + center + AAFFFFFF + + + + true + 0 + 210 + 299 + 60 + font12 + center + AAFFFFFF + + + + + !Control.HasFocus(400) + + false + 0 + 175 + 299 + 60 + font12 + center + FFCC7B19 + + + + false + 0 + 210 + 299 + 60 + font12 + center + FFCC7B19 + + + + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 299 + 168 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 119 + 34 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 119 + 34 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 85.5 + 20 + 128 + 128 + script.plex/home/busy.gif + + + + + Control.HasFocus(400) + 0 + 0 + 309 + 178 + script.plex/home/selected.png + + + + + + + + + + Integer.IsGreater(Container(401).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 400 + 1920 + + 60 + 20 + 800 + 40 + font12 + left + center + FFFFFFFF + + + + 0 + 50 + 1920 + 360 + 400 + 402 + 200 + horizontal + 4 + + + + 55 + 29 + + 5 + 5 + + 0 + 0 + 158 + 236 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 158 + 236 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 113 + 0 + 45 + 40 + script.plex/white-square.png + FF000000 + + + 114 + 0 + 44 + 39 + script.plex/white-square.png + FFCC7B19 + + + 114 + 0 + 44 + 39 + font10 + center + center + FF000000 + + + + + false + 0 + 240 + 158 + 54 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 29 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(401) + -40 + -40 + 248 + 326 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 158 + 236 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 158 + 236 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 113 + 0 + 45 + 40 + script.plex/white-square.png + FF000000 + + + 114 + 0 + 44 + 39 + script.plex/white-square.png + FFCC7B19 + + + 114 + 0 + 44 + 39 + font10 + center + center + FF000000 + + + + + Control.HasFocus(401) + 0 + 240 + 158 + 54 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(401) + 0 + 0 + 168 + 246 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(402).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 360 + 1920 + + !String.IsEmpty(Window.Property(divider.402)) + 60 + 0 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 800 + 80 + font12 + left + center + AAFFFFFF + + + + 0 + 18 + 1920 + 430 + 401 + 403 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 175 + 299 + 60 + font10 + center + AAFFFFFF + + + + false + 0 + 205 + 299 + 60 + font10 + center + AAFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(402) + -40 + -40 + 389 + 258 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + + Control.HasFocus(402) + 0 + 175 + 299 + 60 + font10 + center + AAFFFFFF + + + + Control.HasFocus(402) + 0 + 205 + 299 + 60 + font10 + center + AAFFFFFF + + + + + + Control.HasFocus(402) + 0 + 0 + 309 + 178 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(403).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 402 + 1920 + 520 + + !String.IsEmpty(Window.Property(divider.403)) + 60 + 0 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 16 + 1920 + 520 + 402 + 404 + false + false + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 369 + 244 + 38 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + Control.HasFocus(403) + -40 + -40 + 324 + 441 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(403) + 0 + 369 + 244 + 38 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(403) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(404).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 403 + 1920 + 410 + + !String.IsEmpty(Window.Property(divider.404)) + 60 + 20 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 20 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 36 + 1920 + 410 + 403 + 404 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + script.plex/thumb_fallbacks/role.png + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + 0 + 253 + + false + 0 + 0 + 244 + 60 + font10 + center + AAFFFFFF + + + + false + 0 + 30 + 244 + 60 + font10 + center + AAFFFFFF + + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(404) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + script.plex/thumb_fallbacks/role.png + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + 0 + 253 + + Control.HasFocus(404) + 0 + 0 + 244 + 60 + font10 + center + AAFFFFFF + + + + Control.HasFocus(404) + 0 + 30 + 244 + 60 + font10 + center + AAFFFFFF + + + + + + Control.HasFocus(404) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + + + Conditional + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + !String.IsEmpty(Window.Property(on.extras)) + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-home.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-home.xml new file mode 100644 index 000000000..e5431162c --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-home.xml @@ -0,0 +1,8622 @@ + + + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + Conditional + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 101 + 0 + 96 + 2130 + 5540 + 20 + vertical + true + 200 + + 2130 + 200 + + Conditional + Conditional + -300 + 0 + 2430 + 240 + 101 + 203 + 204 + 400 + 200 + horizontal + 4 + 3 + 102 + + + + !String.IsEmpty(ListItem.Property(item)) + 60 + 40 + 298 + 200 + + 0 + 0 + 238 + 117 + + String.IsEmpty(ListItem.Property(is.home)) + 0 + 0 + 238 + 117 + script.plex/white-square-rounded.png + FF1F1F1F + + + + String.IsEmpty(ListItem.Property(is.home)) + 84 + 23.5 + 70 + 70 + $INFO[ListItem.Thumb] + keep + + + !String.IsEmpty(ListItem.Property(is.home)) + 74 + 13.5 + 90 + 90 + script.plex/home/type/home.png + keep + + + + + false + 0 + 125 + 238 + 35 + font10 + center + FFFFFFFF + + + + + + + + + !String.IsEmpty(ListItem.Property(item)) + 60 + 40 + + Focus + UnFocus + 0 + 0 + + String.IsEmpty(ListItem.Property(is.home)) + + Control.HasFocus(101) + + -40 + -40 + 318 + 197 + script.plex/drop-shadow.png + + + UnFocus + 0 + 0 + 238 + 117 + script.plex/white-square-rounded.png + FF1F1F1F + + + UnFocus + 0 + 0 + 238 + 117 + script.plex/white-square-rounded.png + FFE5A00D + + + + !Control.HasFocus(101) + 0 + 0 + 238 + 117 + script.plex/white-square-rounded.png + FFCC7B19 + + + 84 + 23.5 + 70 + 70 + $INFO[ListItem.Thumb] + keep + + + + !String.IsEmpty(ListItem.Property(is.home)) + 74 + 13.5 + + 0 + 0 + 90 + 90 + script.plex/home/type/home.png + keep + + + Control.HasFocus(101) + UnFocus + -40 + -40 + 170 + 170 + script.plex/home/type/home-selected.png + keep + + + + Control.HasFocus(100) + 0 + 125 + 238 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + Integer.IsGreater(Container(400).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1920 + 440 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1920 + 440 + 101 + 401 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.400)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(400) + -40 + -40 + 622 + 389 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(400) + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + Control.HasFocus(400) + !String.IsEmpty(Window.Property(hub.text2lines.400)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(400) + 0 + 0 + 542 + 309 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(400).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.400)) + 10 + 12 + + + + Integer.IsGreater(Container(401).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 401 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 400 + 402 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.401)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(401) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(401) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(401) + !String.IsEmpty(Window.Property(hub.text2lines.401)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(401) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(401).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.401)) + 10 + 7 + + + + Integer.IsGreater(Container(402).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 402 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 401 + 403 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.402)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(402) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(402) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(402) + !String.IsEmpty(Window.Property(hub.text2lines.402)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(402) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(402).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.402)) + 10 + 7 + + + + Integer.IsGreater(Container(403).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 403 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 402 + 404 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.403)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(403) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(403) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(403) + !String.IsEmpty(Window.Property(hub.text2lines.403)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(403) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(403).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.403)) + 10 + 7 + + + + Integer.IsGreater(Container(404).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 404 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 403 + 405 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.404)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(404) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(404) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(404) + !String.IsEmpty(Window.Property(hub.text2lines.404)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(404) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(404).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.404)) + 10 + 7 + + + + Integer.IsGreater(Container(405).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 405 + 1920 + 392 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 392 + 404 + 406 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.405)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(405) + -40 + -40 + 324 + 324 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(405) + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(405) + !String.IsEmpty(Window.Property(hub.text2lines.405)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(405) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(405).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.405)) + 10 + 7 + + + + Integer.IsGreater(Container(406).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1920 + 440 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1920 + 440 + 405 + 407 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.406)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(406) + -40 + -40 + 622 + 389 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(406) + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + Control.HasFocus(406) + !String.IsEmpty(Window.Property(hub.text2lines.406)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(406) + 0 + 0 + 542 + 309 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(406).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.406)) + 10 + 12 + + + + Integer.IsGreater(Container(407).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 407 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 406 + 408 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.407)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(407) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(407) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(407) + !String.IsEmpty(Window.Property(hub.text2lines.407)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(407) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(407).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.407)) + 10 + 7 + + + + Integer.IsGreater(Container(408).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 408 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 407 + 409 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.408)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(408) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(408) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(408) + !String.IsEmpty(Window.Property(hub.text2lines.408)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(408) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(408).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.408)) + 10 + 7 + + + + Integer.IsGreater(Container(409).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 409 + 1920 + 392 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 392 + 408 + 410 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.409)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(409) + -40 + -40 + 324 + 324 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(409) + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(409) + !String.IsEmpty(Window.Property(hub.text2lines.409)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(409) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(409).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.409)) + 10 + 7 + + + + Integer.IsGreater(Container(410).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 410 + 1920 + 392 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 392 + 409 + 411 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.410)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(410) + -40 + -40 + 324 + 324 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(410) + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(410) + !String.IsEmpty(Window.Property(hub.text2lines.410)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(410) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(410).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.410)) + 10 + 7 + + + + Integer.IsGreater(Container(411).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 411 + 1920 + 392 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 392 + 410 + 412 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.411)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(411) + -40 + -40 + 324 + 324 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(411) + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(411) + !String.IsEmpty(Window.Property(hub.text2lines.411)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(411) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(411).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.411)) + 10 + 7 + + + + Integer.IsGreater(Container(412).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 412 + 1920 + 392 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 392 + 411 + 420 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.412)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(412) + -40 + -40 + 324 + 324 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(412) + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(412) + !String.IsEmpty(Window.Property(hub.text2lines.412)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(412) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(412).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.412)) + 10 + 7 + + + + Integer.IsGreater(Container(420).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 420 + 1920 + 392 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 392 + 412 + 421 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.420)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(420) + -40 + -40 + 324 + 324 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(420) + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(420) + !String.IsEmpty(Window.Property(hub.text2lines.420)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(420) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(420).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.420)) + 10 + 7 + + + + Integer.IsGreater(Container(421).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 421 + 1920 + 392 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 392 + 420 + 422 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.421)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(421) + -40 + -40 + 324 + 324 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(421) + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(421) + !String.IsEmpty(Window.Property(hub.text2lines.421)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(421) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(421).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.421)) + 10 + 7 + + + + Integer.IsGreater(Container(422).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 422 + 1920 + 392 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 392 + 421 + 413 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.422)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(422) + -40 + -40 + 324 + 324 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 244 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 72 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 58 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 234 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(422) + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(422) + !String.IsEmpty(Window.Property(hub.text2lines.422)) + 0 + 281 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(422) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(422).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.422)) + 10 + 7 + + + + Integer.IsGreater(Container(413).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 413 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 422 + 414 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.413)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(413) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(413) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(413) + !String.IsEmpty(Window.Property(hub.text2lines.413)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(413) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(413).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.413)) + 10 + 7 + + + + Integer.IsGreater(Container(414).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 414 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 413 + 415 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.414)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(414) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(414) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(414) + !String.IsEmpty(Window.Property(hub.text2lines.414)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(414) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(414).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.414)) + 10 + 7 + + + + Integer.IsGreater(Container(415).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 415 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 414 + 416 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.415)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(415) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(415) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(415) + !String.IsEmpty(Window.Property(hub.text2lines.415)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(415) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(415).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.415)) + 10 + 7 + + + + Integer.IsGreater(Container(416).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 416 + 1920 + 515 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 29 + 1920 + 515 + 415 + 417 + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + false + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.416)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(416) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + Control.HasFocus(416) + 0 + 371 + 244 + 35 + font10 + center + FFFFFFFF + + + + Control.HasFocus(416) + !String.IsEmpty(Window.Property(hub.text2lines.416)) + 0 + 398 + 244 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + Control.HasFocus(416) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(416).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.416)) + 10 + 7 + + + + Integer.IsGreater(Container(417).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1920 + 440 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1920 + 440 + 416 + 418 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.417)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(417) + -40 + -40 + 622 + 389 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(417) + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + Control.HasFocus(417) + !String.IsEmpty(Window.Property(hub.text2lines.417)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(417) + 0 + 0 + 542 + 309 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(417).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.417)) + 10 + 12 + + + + Integer.IsGreater(Container(418).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1920 + 440 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1920 + 440 + 417 + 419 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.418)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(418) + -40 + -40 + 622 + 389 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(418) + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + Control.HasFocus(418) + !String.IsEmpty(Window.Property(hub.text2lines.418)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(418) + 0 + 0 + 542 + 309 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(418).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.418)) + 10 + 12 + + + + Integer.IsGreater(Container(419).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1920 + 440 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1920 + 440 + 418 + 423 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.419)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(419) + -40 + -40 + 622 + 389 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(419) + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + Control.HasFocus(419) + !String.IsEmpty(Window.Property(hub.text2lines.419)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(419) + 0 + 0 + 542 + 309 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(419).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.419)) + 10 + 12 + + + + Integer.IsGreater(Container(423).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1920 + 440 + + 60 + 12 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1920 + 440 + 419 + 423 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + false + !String.IsEmpty(Window.Property(hub.text2lines.423)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(423) + -40 + -40 + 622 + 389 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.end)) + + 0 + 0 + 532 + 299 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + 235.5 + 99.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 202 + 85.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 532 + 299 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 289 + + 0 + 0 + 532 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 532 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 484 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 481 + 0 + + 0 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 1 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 1 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(423) + 0 + 309 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + Control.HasFocus(423) + !String.IsEmpty(Window.Property(hub.text2lines.423)) + 0 + 337 + 532 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(423) + 0 + 0 + 542 + 309 + script.plex/home/selected.png + + + + + + + + Integer.IsGreater(Container(423).NumItems,0) + !String.IsEmpty(Window.Property(hub.text2lines.423)) + 10 + 12 + + + + + 1920 + 100 + font12 + left + center + 00FFFFFF + + + + + + + + Conditional + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + !String.IsEmpty(Window(10000).Property(script.plex.off.sections)) + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + String.IsEmpty(Window.Property(search.dialog)) + + Focus + UnFocus + 60 + 47.5 + 40 + 40 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + 160 + 35 + 500 + 65 + font12 + left + center + FFFFFFFF + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 203 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + 576 + 34 + 1000 + 1046 + + 0 + 0 + 1000 + 1046 + 50 + 204 + right + 0 + horizontal + 200 + true + + auto + 66 + font12 + FFFFFFFF + FF000000 + FFFFFFFF + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + SetFocus(260) + + + + -93 + 93 + 66 + + 6 + 14 + 40 + 39 + $INFO[Window.Property(server.icon)] + + + 0 + 38 + 16 + 15 + $INFO[Window.Property(server.iconmod)] + + + + !String.IsEmpty(Window.Property(server.iconmod)) + 0 + 20 + 16 + 14 + $INFO[Window.Property(server.iconmod2)] + FFEEEEEE + + + + String.IsEmpty(Window.Property(server.iconmod)) + 0 + 38 + 16 + 14 + $INFO[Window.Property(server.iconmod2)] + FFEEEEEE + + + !Control.HasFocus(201) + 59 + 27 + 15 + 13 + script.plex/indicators/dropdown-triangle.png + 99FFFFFF + + + Control.HasFocus(201) + 59 + 27 + 15 + 13 + script.plex/indicators/dropdown-triangle.png + FF222222 + + + Control.HasFocus(260) | !String.IsEmpty(Window.Property(show.servers)) + -413 + 70 + + -40 + -40 + 580 + 146 + script.plex/drop-shadow.png + + + 432 + -13 + 15 + 13 + script.plex/indicators/dropdown-triangle.png + FF1F1F1F + + + + 0 + 0 + 500 + 900 + 201 + 203 + 202 + SetProperty(show.servers,) + 200 + vertical + 261 + + + + !String.IsEmpty(ListItem.Property(first)) + 0 + 0 + 500 + 100 + script.plex/white-square-top-rounded.png + + + String.IsEmpty(ListItem.Property(first)) + String.IsEmpty(ListItem.Property(last)) + String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 500 + 100 + script.plex/white-square.png + + + !String.IsEmpty(ListItem.Property(last)) + 0 + 0 + 500 + 100 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 500 + 100 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Label2) + + 20 + 20 + 400 + 35 + font12 + left + center + FFFFFFFF + + + + 20 + 50 + 400 + 35 + font12 + left + center + FFA0A0A0 + + + + + String.IsEmpty(ListItem.Label2) + 20 + 0 + 400 + 100 + font12 + left + center + FFFFFFFF + + + + + + String.IsEmpty(ListItem.Property(status)) + String.IsEmpty(ListItem.Property(current)) + !String.IsEmpty(ListItem.Property(local)) + 456 + 38 + 24 + 21 + script.plex/home/device/home.png + + + + String.IsEmpty(ListItem.Property(status)) + !String.IsEmpty(ListItem.Property(current)) + !String.IsEmpty(ListItem.Property(local)) + 415 + 38 + 24 + 21 + script.plex/home/device/home.png + + + + !String.IsEmpty(ListItem.Property(status)) + String.IsEmpty(ListItem.Property(current)) + !String.IsEmpty(ListItem.Property(local)) + 415 + 38 + 24 + 21 + script.plex/home/device/home.png + + + + !String.IsEmpty(ListItem.Property(status)) + !String.IsEmpty(ListItem.Property(current)) + !String.IsEmpty(ListItem.Property(local)) + 374 + 38 + 24 + 21 + script.plex/home/device/home.png + + + + !String.IsEmpty(ListItem.Property(status)) + String.IsEmpty(ListItem.Property(current)) + 456 + 38 + 24 + 24 + script.plex/home/device/$INFO[ListItem.Property(status)] + + + + !String.IsEmpty(ListItem.Property(status)) + !String.IsEmpty(ListItem.Property(current)) + 415 + 38 + 24 + 24 + script.plex/home/device/$INFO[ListItem.Property(status)] + + + !String.IsEmpty(ListItem.Property(current)) + 449 + 38 + 31 + 24 + script.plex/home/device/check.png + + + + + + !String.IsEmpty(ListItem.Property(first)) + 0 + 0 + 500 + 100 + script.plex/white-square-top-rounded.png + + + String.IsEmpty(ListItem.Property(first)) + String.IsEmpty(ListItem.Property(last)) + String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 500 + 100 + script.plex/white-square.png + + + !String.IsEmpty(ListItem.Property(last)) + 0 + 0 + 500 + 100 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 500 + 100 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Label2) + + 20 + 20 + 400 + 35 + font12 + left + center + FF000000 + + + + 20 + 50 + 400 + 35 + font12 + left + center + FFFFFFFF + + + + + String.IsEmpty(ListItem.Label2) + 20 + 0 + 400 + 100 + font12 + left + center + FF000000 + + + + + + String.IsEmpty(ListItem.Property(status)) + String.IsEmpty(ListItem.Property(current)) + !String.IsEmpty(ListItem.Property(local)) + 456 + 38 + 24 + 21 + script.plex/home/device/home.png + + + + String.IsEmpty(ListItem.Property(status)) + !String.IsEmpty(ListItem.Property(current)) + !String.IsEmpty(ListItem.Property(local)) + 415 + 38 + 24 + 21 + script.plex/home/device/home.png + + + + !String.IsEmpty(ListItem.Property(status)) + String.IsEmpty(ListItem.Property(current)) + !String.IsEmpty(ListItem.Property(local)) + 415 + 38 + 24 + 21 + script.plex/home/device/home.png + + + + !String.IsEmpty(ListItem.Property(status)) + !String.IsEmpty(ListItem.Property(current)) + !String.IsEmpty(ListItem.Property(local)) + 374 + 38 + 24 + 21 + script.plex/home/device/home.png + + + !String.IsEmpty(ListItem.Property(status)) + String.IsEmpty(ListItem.Property(current)) + 456 + 38 + 24 + 24 + script.plex/home/device/focus-$INFO[ListItem.Property(status)] + + + !String.IsEmpty(ListItem.Property(status)) + !String.IsEmpty(ListItem.Property(current)) + 415 + 38 + 24 + 24 + script.plex/home/device/focus-$INFO[ListItem.Property(status)] + + + !String.IsEmpty(ListItem.Property(current)) + 449 + 38 + 31 + 24 + script.plex/home/device/check.png + + + + + + + 492 + 20 + 8 + 860 + - + script.plex/white-square.png + script.plex/white-square.png + - + - + false + vertical + false + 250 + + + + + + auto + 66 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + SetFocus(250) + + + -87 + 87 + 66 + + 0 + 14 + 40 + 39 + $INFO[Window.Property(user.avatar)] + + + String.IsEmpty(Window.Property(user.avatar)) + 0 + 14 + 40 + 39 + font10 + center + center + FFFFFFFF + + + + !Control.HasFocus(202) + 53 + 27 + 15 + 13 + script.plex/indicators/dropdown-triangle.png + 99FFFFFF + + + Control.HasFocus(202) + 53 + 27 + 15 + 13 + script.plex/indicators/dropdown-triangle.png + FF222222 + + + Control.HasFocus(250) | !String.IsEmpty(Window.Property(show.options)) + -213 + 70 + + -40 + -40 + 380 + 146 + script.plex/drop-shadow.png + + + 226 + -13 + 15 + 13 + script.plex/indicators/dropdown-triangle.png + FF1F1F1F + + + + 0 + 0 + 300 + 198 + 202 + noop + 201 + SetProperty(show.options,) + 200 + vertical + + + + !String.IsEmpty(ListItem.Property(first)) + 0 + 0 + 300 + 66 + script.plex/white-square-top-rounded.png + + + String.IsEmpty(ListItem.Property(first)) + String.IsEmpty(ListItem.Property(last)) + String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 300 + 66 + script.plex/white-square.png + + + !String.IsEmpty(ListItem.Property(last)) + 0 + 0 + 300 + 66 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 300 + 66 + script.plex/white-square-rounded.png + + + 0 + 0 + 300 + 66 + font12 + center + center + FFFFFFFF + + + + + + !String.IsEmpty(ListItem.Property(first)) + 0 + 0 + 300 + 66 + script.plex/white-square-top-rounded.png + + + String.IsEmpty(ListItem.Property(first)) + String.IsEmpty(ListItem.Property(last)) + String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 300 + 66 + script.plex/white-square.png + + + !String.IsEmpty(ListItem.Property(last)) + 0 + 0 + 300 + 66 + script.plex/white-square-top-rounded.png + + + !String.IsEmpty(ListItem.Property(only)) + 0 + 0 + 300 + 66 + script.plex/white-square-rounded.png + + + 0 + 0 + 300 + 66 + font12 + center + center + FF000000 + + + + + + + + + 40 + 10 + - + + + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + String.IsEmpty(Window.Property(busy)) + !String.IsEmpty(Window.Property(no.content)) + 0 + 465 + + false + 60 + 0 + 1800 + 35 + font13 + center + FFFFFFFF + + + + false + 60 + 60 + 1800 + 35 + font13 + center + FFCCCCCC + + + + + + !String.IsEmpty(Window.Property(busy)) + Visible + 840 + 465 + + 0 + 0 + 240 + 150 + script.plex/busy-back.png + A0FFFFFF + + + 75 + 56 + 90 + 38 + script.plex/busy.gif + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-info.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-info.xml new file mode 100644 index 000000000..9c07ff9b2 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-info.xml @@ -0,0 +1,281 @@ + + + 152 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + 0 + 135 + + + 60 + 0 + + !String.IsEmpty(Window.Property(is.poster)) + + 0 + 0 + 519 + 769 + $INFO[Window.Property(thumb.fallback)] + scale + + + 0 + 0 + 519 + 769 + $INFO[Window.Property(thumb)] + scale + + + + !String.IsEmpty(Window.Property(is.square)) + + 0 + 0 + 519 + 519 + $INFO[Window.Property(thumb.fallback)] + keep + + + 0 + 0 + 519 + 519 + $INFO[Window.Property(thumb)] + scale + + + + !String.IsEmpty(Window.Property(is.16x9)) + + 0 + 0 + 519 + 292 + $INFO[Window.Property(thumb.fallback)] + scale + + + 0 + 0 + 519 + 292 + $INFO[Window.Property(thumb)] + scale + + + + 579 + 5 + 1190 + 40 + font13 + left + center + FFFFFFFF + + + + 579 + 55 + 1190 + 40 + font13 + left + center + FFDDDDDD + + + + 579 + 157 + 152 + 1190 + 718 + font13 + left + FFDDDDDD + + + + + 1794 + 157 + 6 + 718 + true + script.plex/white-square.png + script.plex/white-square.png + script.plex/white-square.png + - + - + false + vertical + false + 204 + + + + + + 201 + 0 + 0 + 1920 + 135 + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 152 + 152 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-listview-16x9-chunked.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-listview-16x9-chunked.xml new file mode 100644 index 000000000..b209ee461 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-listview-16x9-chunked.xml @@ -0,0 +1,879 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + 0 + 135 + 101 + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 750 + 0 + 1170 + 1080 + + 0 + 0 + 1170 + 1080 + script.plex/white-square.png + 20000000 + + + + 0 + 0 + 1170 + 945 + 600 + 151 + 304 + 0 + vertical + 4 + 152 + 5 + + + + 120 + 24 + + + !String.IsEmpty(ListItem.Property(unwatched)) + 880 + -3 + 35 + 35 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 861 + 14 + + 0 + 0 + 54 + 42 + script.plex/white-square-rounded.png + + + 0 + 0 + 54 + 42 + font10 + center + center + FF000000 + + + + + 0 + 0 + + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + + + String.IsEmpty(ListItem.Property(is.footer)) + !String.IsEmpty(ListItem.Label) + 0 + 72 + 915 + 2 + script.plex/white-square.png + 40000000 + + + + + + + + + !Control.HasFocus(101) + 120 + 24 + + + !String.IsEmpty(ListItem.Property(unwatched)) + 880 + -2 + 35 + 35 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 861 + 14 + + 0 + 0 + 54 + 42 + script.plex/white-square-rounded.png + + + 0 + 0 + 54 + 42 + font10 + center + center + FF000000 + + + + + 0 + 0 + + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + + + String.IsEmpty(ListItem.Property(is.footer)) + !String.IsEmpty(ListItem.Label) + 0 + 72 + 915 + 2 + script.plex/white-square.png + 40000000 + + + + + Control.HasFocus(101) + 63 + 21 + + -40 + -40 + 1085 + 156 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 1005 + 76 + script.plex/white-square-rounded.png + FFE5A00D + + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 957 + 0 + 48 + 48 + script.plex/indicators/unwatched-rounded.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 933 + 15 + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 0 + 0 + 57 + 46 + script.plex/white-square-rounded.png + + + 0 + 0 + 57 + 46 + font10 + center + center + FF000000 + + + + + 60 + 0 + + 0 + 23 + 915 + 30 + font12 + left + center + DF000000 + + + + + + + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),episode) + + 1128 + 33 + 10 + 879 + 101 + 951 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + String.IsEqual(Window(10000).Property(script.plex.item.type),episode) + 1128 + 33 + 10 + 879 + + 0 + 0 + 10 + 879 + script.plex/white-square-rounded.png + + + 0 + 0 + + !Control.HasFocus(951) + String.IsEmpty(Window.Property(dragging)) + 0 + 0 + 10 + 10 + script.plex/white-square-rounded.png + + + Control.HasFocus(951) | !String.IsEmpty(Window.Property(dragging)) + 0 + 0 + 10 + 10 + script.plex/white-square-rounded.png + + + + + 0 + 0 + 10 + 879 + 152 + - + - + + + + + + + 0 + -135 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + VisibleChange + 301 + 30 + -25 + 1000 + 145 + 200 + 101 + 101 + -20 + horizontal + 200 + true + !String.IsEmpty(Window.Property(initialized)) + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + String.IsEmpty(Window.Property(no.options)) | Player.HasAudio + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/chapters-focus.png + script.plex/buttons/chapters.png + + + + + + + 60 + 248 + + !String.IsEqual(Window.Property(media),show) + !String.IsEqual(Window.Property(media),movie) + 0 + 0 + 630 + 355 + 500 + $INFO[Container(101).ListItem.Property(art)] + scale + + + String.IsEqual(Window.Property(media),show) | String.IsEqual(Window.Property(media),movie) + 0 + 0 + 630 + 355 + 500 + $INFO[Container(101).ListItem.Property(art)] + scale + + + 0 + 355 + 440 + 80 + font12 + left + center + FFFFFFFF + + + + 630 + 355 + 180 + 80 + font12 + right + center + FFFFFFFF + + + + 0 + 435 + 630 + 2 + script.plex/white-square.png + 40000000 + + + 0 + 463 + 630 + 307 + font12 + left + FFDDDDDD + + + + + + String.IsEqual(Window(10000).Property(script.plex.sort),titleSort) + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 151 + 1830 + 150 + 20 + 920 + + 0 + 0 + 34 + 1050 + 100 + 152 + 200 + vertical + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + Control.HasFocus(151) + 0 + 0 + + Control.HasFocus(151) + 0 + 0 + 34 + 34 + FFE5A00D + script.plex/white-outline-rounded.png + + + + + + + + + 201 + 0 + 0 + 1920 + 135 + !String.IsEmpty(Window.Property(initialized)) + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 211 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 311 + String.IsEmpty(Window.Property(hide.filteroptions)) + 340 + 35 + 1000 + 65 + right + 30 + horizontal + 204 + 210 + 50 + + !String.IsEqual(Window.Property(media.itemType),folder) + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + !String.IsEqual(Window.Property(media.itemType),folder) + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media),show) + !String.IsEqual(Window.Property(media),movie) + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 20 + 0 + + + + String.IsEqual(Window.Property(media),show) | String.IsEqual(Window.Property(media),movie) + auto + 65 + font12 + FFFFFFFF + FF000000 + FFFFFFFF + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media.itemType),folder) + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-listview-16x9.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-listview-16x9.xml new file mode 100644 index 000000000..efd185bf1 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-listview-16x9.xml @@ -0,0 +1,842 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + 60 + 248 + + !String.IsEqual(Window.Property(media),show) + !String.IsEqual(Window.Property(media),movie) + 0 + 0 + 630 + 355 + 500 + $INFO[Container(101).ListItem.Property(art)] + scale + + + String.IsEqual(Window.Property(media),show) | String.IsEqual(Window.Property(media),movie) + 0 + 0 + 630 + 355 + 500 + $INFO[Container(101).ListItem.Property(art)] + scale + + + 0 + 355 + 440 + 80 + font12 + left + center + FFFFFFFF + + + + 630 + 355 + 180 + 80 + font12 + right + center + FFFFFFFF + + + + 0 + 435 + 630 + 2 + script.plex/white-square.png + 40000000 + + + 0 + 463 + 630 + 307 + font12 + left + FFDDDDDD + + + + + + 0 + 135 + 101 + + + VisibleChange + 301 + 30 + -25 + 1000 + 145 + 200 + 101 + 101 + -20 + horizontal + 200 + true + !String.IsEmpty(Window.Property(initialized)) + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + String.IsEmpty(Window.Property(no.options)) | Player.HasAudio + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/chapters-focus.png + script.plex/buttons/chapters.png + + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 750 + 0 + 1170 + 1080 + + 0 + 0 + 1170 + 1080 + script.plex/white-square.png + 20000000 + + + + 0 + 0 + 1170 + 945 + 600 + 151 + 304 + 200 + vertical + 4 + 152 + + + + 120 + 24 + + + !String.IsEmpty(ListItem.Property(unwatched)) + 880 + -3 + 35 + 35 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 861 + 14 + + 0 + 0 + 54 + 42 + script.plex/white-square-rounded.png + + + 0 + 0 + 54 + 42 + font10 + center + center + FF000000 + + + + + 0 + 0 + + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 72 + 915 + 2 + script.plex/white-square.png + 40000000 + + + + + + + + + !Control.HasFocus(101) + 120 + 24 + + + !String.IsEmpty(ListItem.Property(unwatched)) + 880 + -2 + 35 + 35 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 861 + 14 + + 0 + 0 + 54 + 42 + script.plex/white-square-rounded.png + + + 0 + 0 + 54 + 42 + font10 + center + center + FF000000 + + + + + 0 + 0 + + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 72 + 915 + 2 + script.plex/white-square.png + 40000000 + + + + + Control.HasFocus(101) + 63 + 21 + + -40 + -40 + 1085 + 156 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 1005 + 76 + script.plex/white-square-rounded.png + FFE5A00D + + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 957 + 0 + 48 + 48 + script.plex/indicators/unwatched-rounded.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 933 + 15 + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 0 + 0 + 57 + 46 + script.plex/white-square-rounded.png + + + 0 + 0 + 57 + 46 + font10 + center + center + FF000000 + + + + + 60 + 0 + + 0 + 0 + 510 + 72 + font12 + left + center + DF000000 + + + + + + + + + + + + 1128 + 33 + 10 + 879 + 101 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + + String.IsEqual(Window(10000).Property(script.plex.sort),titleSort) + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 151 + 1830 + 150 + 20 + 920 + + 0 + 0 + 34 + 1050 + 100 + 152 + 200 + vertical + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + Control.HasFocus(151) + 0 + 0 + + Control.HasFocus(151) + 0 + 0 + 34 + 34 + FFE5A00D + script.plex/white-outline-rounded.png + + + + + + + + + 201 + 0 + 0 + 1920 + 135 + !String.IsEmpty(Window.Property(initialized)) + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 211 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 311 + String.IsEmpty(Window.Property(hide.filteroptions)) + 340 + 35 + 1000 + 65 + right + 30 + horizontal + 204 + 210 + 50 + + !String.IsEqual(Window.Property(media.itemType),folder) + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + !String.IsEqual(Window.Property(media.itemType),folder) + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media),show) + !String.IsEqual(Window.Property(media),movie) + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 20 + 0 + + + + String.IsEqual(Window.Property(media),show) | String.IsEqual(Window.Property(media),movie) + auto + 65 + font12 + FFFFFFFF + FF000000 + FFFFFFFF + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media.itemType),folder) + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-listview-square-chunked.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-listview-square-chunked.xml new file mode 100644 index 000000000..b3aab3078 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-listview-square-chunked.xml @@ -0,0 +1,943 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + 0 + 135 + 101 + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 750 + 0 + 1170 + 1080 + + 0 + 0 + 1170 + 1080 + script.plex/white-square.png + 20000000 + + + + 0 + 0 + 1170 + 945 + 600 + 151 + 304 + 0 + vertical + 4 + 152 + 5 + + + + 120 + 24 + + + !String.IsEmpty(ListItem.Property(unwatched)) + 880 + -3 + 35 + 35 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 861 + 14 + + 0 + 0 + 54 + 42 + script.plex/white-square-rounded.png + + + 0 + 0 + 54 + 42 + font10 + center + center + FF000000 + + + + + 0 + 0 + + String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + + + String.IsEmpty(ListItem.Property(is.footer)) + !String.IsEmpty(ListItem.Label) + 0 + 72 + 915 + 2 + script.plex/white-square.png + 40000000 + + + + + + + + + !Control.HasFocus(101) + 120 + 24 + + + !String.IsEmpty(ListItem.Property(unwatched)) + 880 + -2 + 35 + 35 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 861 + 14 + + 0 + 0 + 54 + 42 + script.plex/white-square-rounded.png + + + 0 + 0 + 54 + 42 + font10 + center + center + FF000000 + + + + + 0 + 0 + + 0 + 0 + + String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + + + + String.IsEmpty(ListItem.Property(is.footer)) + !String.IsEmpty(ListItem.Label) + 0 + 72 + 915 + 2 + script.plex/white-square.png + 40000000 + + + + + Control.HasFocus(101) + 63 + 21 + + -40 + -40 + 1085 + 156 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 1005 + 76 + script.plex/white-square-rounded.png + FFE5A00D + + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 957 + 0 + 48 + 48 + script.plex/indicators/unwatched-rounded.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 933 + 15 + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 0 + 0 + 57 + 46 + script.plex/white-square-rounded.png + + + 0 + 0 + 57 + 46 + font10 + center + center + FF000000 + + + + + 60 + 0 + + String.IsEmpty(ListItem.Property(is.folder)) + 0 + 23 + 885 + 30 + font12 + left + center + DF000000 + + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 23 + 885 + 30 + font10 + left + center + FF000000 + + + + + + + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),album) + + 1128 + 33 + 10 + 879 + 101 + 951 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + String.IsEqual(Window(10000).Property(script.plex.item.type),album) + 1128 + 33 + 10 + 879 + + 0 + 0 + 10 + 879 + script.plex/white-square-rounded.png + + + 0 + 0 + + !Control.HasFocus(951) + String.IsEmpty(Window.Property(dragging)) + 0 + 0 + 10 + 10 + script.plex/white-square-rounded.png + + + Control.HasFocus(951) | !String.IsEmpty(Window.Property(dragging)) + 0 + 0 + 10 + 10 + script.plex/white-square-rounded.png + + + + + 0 + 0 + 10 + 879 + 152 + - + - + + + + + + + 0 + -135 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + 301 + 30 + -25 + 1000 + 145 + 200 + 101 + 101 + -20 + horizontal + 200 + true + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + String.IsEmpty(Window.Property(no.options)) | Player.HasAudio + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + String.IsEmpty(Window.Property(hide.filteroptions)) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/chapters-focus.png + script.plex/buttons/chapters.png + + + + + + + 60 + 248 + + String.IsEqual(Window.Property(media),photo) | String.IsEqual(Window.Property(media),photodirectory) + + 0 + 0 + 630 + 355 + script.plex/white-square.png + + + 0 + 0 + 630 + 355 + 500 + $INFO[Container(101).ListItem.Thumb] + keep + + + + String.IsEqual(Window.Property(media),artist) + 0 + 0 + 355 + 355 + 500 + $INFO[Container(101).ListItem.Thumb] + scale + + + !String.IsEmpty(Container(101).ListItem.Label2) + + 0 + 355 + 510 + 80 + font12 + left + center + FFFFFFFF + + + + 630 + 355 + 110 + 80 + font12 + right + center + FFFFFFFF + + + + + String.IsEmpty(Container(101).ListItem.Label2) + + 0 + 355 + 630 + 80 + font12 + left + center + FFFFFFFF + + + + + 0 + 435 + 630 + 2 + script.plex/white-square.png + 40000000 + + + 0 + 463 + 630 + 307 + font12 + left + FFDDDDDD + + + + + + String.IsEqual(Window(10000).Property(script.plex.sort),titleSort) + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 151 + 1830 + 150 + 20 + 920 + + 0 + 0 + 34 + 1050 + 100 + 152 + 200 + vertical + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + Control.HasFocus(151) + 0 + 0 + + Control.HasFocus(151) + 0 + 0 + 34 + 34 + FFE5A00D + script.plex/white-outline-rounded.png + + + + + + + + + 201 + 0 + 0 + 1920 + 135 + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 211 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 311 + String.IsEmpty(Window.Property(hide.filteroptions)) + 340 + 35 + 1000 + 65 + right + 30 + horizontal + 204 + 210 + 50 + + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media),artist) + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 20 + 0 + + + + String.IsEqual(Window.Property(media),artist) + auto + 65 + font12 + FFFFFFFF + FF000000 + FFFFFFFF + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-listview-square.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-listview-square.xml new file mode 100644 index 000000000..0b80694ee --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-listview-square.xml @@ -0,0 +1,908 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + 60 + 248 + + String.IsEqual(Window.Property(media),photo) | String.IsEqual(Window.Property(media),photodirectory) + + 0 + 0 + 630 + 355 + script.plex/white-square.png + + + 0 + 0 + 630 + 355 + 500 + $INFO[Container(101).ListItem.Thumb] + keep + + + + String.IsEqual(Window.Property(media),artist) + 0 + 0 + 355 + 355 + 500 + $INFO[Container(101).ListItem.Thumb] + scale + + + !String.IsEmpty(Container(101).ListItem.Label2) + + 0 + 355 + 310 + 80 + font12 + left + center + FFFFFFFF + + + + 630 + 355 + 310 + 80 + font12 + right + center + FFFFFFFF + + + + + String.IsEmpty(Container(101).ListItem.Label2) + + 0 + 355 + 630 + 80 + font12 + left + center + FFFFFFFF + + + + + 0 + 435 + 630 + 2 + script.plex/white-square.png + 40000000 + + + 0 + 463 + 630 + 307 + font12 + left + FFDDDDDD + + + + + + 0 + 135 + 101 + + + 301 + 30 + -25 + 1000 + 145 + 200 + 101 + 101 + -20 + horizontal + 200 + true + !String.IsEmpty(Window.Property(initialized)) + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + String.IsEmpty(Window.Property(no.options)) | Player.HasAudio + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + String.IsEmpty(Window.Property(hide.filteroptions)) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/chapters-focus.png + script.plex/buttons/chapters.png + + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 750 + 0 + 1170 + 1080 + + 0 + 0 + 1170 + 1080 + script.plex/white-square.png + 20000000 + + + + 0 + 0 + 1170 + 945 + 600 + 151 + 304 + 200 + vertical + 4 + 152 + + + + 120 + 24 + + + !String.IsEmpty(ListItem.Property(unwatched)) + 880 + -3 + 35 + 35 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 861 + 14 + + 0 + 0 + 54 + 42 + script.plex/white-square-rounded.png + + + 0 + 0 + 54 + 42 + font10 + center + center + FF000000 + + + + + 0 + 0 + + String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 72 + 915 + 2 + script.plex/white-square.png + 40000000 + + + + + + + + + !Control.HasFocus(101) + 120 + 24 + + + !String.IsEmpty(ListItem.Property(unwatched)) + 880 + -2 + 35 + 35 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 861 + 14 + + 0 + 0 + 54 + 42 + script.plex/white-square-rounded.png + + + 0 + 0 + 54 + 42 + font10 + center + center + FF000000 + + + + + 0 + 0 + + 0 + 0 + + String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 915 + 72 + font10 + left + center + FFFFFFFF + + + + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 72 + 915 + 2 + script.plex/white-square.png + 40000000 + + + + + Control.HasFocus(101) + 63 + 21 + + -40 + -40 + 1085 + 156 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 1005 + 76 + script.plex/white-square-rounded.png + FFE5A00D + + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 957 + 0 + 48 + 48 + script.plex/indicators/unwatched-rounded.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 933 + 15 + + !String.IsEmpty(ListItem.Property(unwatched.count)) + 0 + 0 + 57 + 46 + script.plex/white-square-rounded.png + + + 0 + 0 + 57 + 46 + font10 + center + center + FF000000 + + + + + 60 + 0 + + String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 885 + 72 + font12 + left + center + DF000000 + + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 885 + 72 + font10 + left + center + FF000000 + + + + + + + + + + + + 1128 + 33 + 10 + 879 + 101 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + + String.IsEqual(Window(10000).Property(script.plex.sort),titleSort) + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 151 + 1830 + 150 + 20 + 920 + + 0 + 0 + 34 + 1050 + 100 + 152 + 200 + vertical + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + Control.HasFocus(151) + 0 + 0 + + Control.HasFocus(151) + 0 + 0 + 34 + 34 + FFE5A00D + script.plex/white-outline-rounded.png + + + + + + + + + 201 + 0 + 0 + 1920 + 135 + !String.IsEmpty(Window.Property(initialized)) + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 211 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 311 + String.IsEmpty(Window.Property(hide.filteroptions)) + 340 + 35 + 1000 + 65 + right + 30 + horizontal + 204 + 210 + 50 + + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media),artist) + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 20 + 0 + + + + String.IsEqual(Window.Property(media),artist) + auto + 65 + font12 + FFFFFFFF + FF000000 + FFFFFFFF + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-music_current_playlist.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-music_current_playlist.xml new file mode 100644 index 000000000..28881da16 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-music_current_playlist.xml @@ -0,0 +1,790 @@ + + + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + String.IsEmpty(Window.Property(use_solid_background)) + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + false + + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Player.Art(fanart)] + + + !String.IsEmpty(Player.Art(fanart)) + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + D0404040 + + + + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Player.Art(landscape)] + + + + + 0 + 0 + 101 + + + 90 + 0 + + -15 + 75 + 669 + 669 + script.plex/white-square.png + 20FFFFFF + + + 0 + 90 + 639 + 639 + $INFO[Player.Art(thumb)] + scale + + + 0 + 764 + 639 + 35 + font12 + left + center + FFFFFFFF + + + + 0 + 799 + 639 + 35 + font12 + left + center + FFFFFFFF + + + + 0 + 834 + 639 + 35 + font12 + left + center + FFFFFFFF + + + + 0 + 869 + 639 + 35 + font12 + left + center + FFFFFFFF + + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 819 + 0 + 1101 + 1080 + + 0 + 0 + 1101 + 1080 + script.plex/white-square.png + 20000000 + + + 0 + 0 + 1101 + 1080 + 200 + 152 + 411 + 200 + vertical + 4 + 152 + + + + 120 + 24 + + !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + -10 + 0 + 60 + 100 + font10 + center + center + D8FFFFFF + + + + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 2 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FFE5A00D + + + 63 + 11 + 74 + 74 + $INFO[ListItem.Thumb] + scale + + + 168 + 0 + + 0 + 15 + 723 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 723 + 30 + font10 + left + center + B8FFFFFF + + + + + 661 + 0 + 200 + 100 + font10 + right + center + D8FFFFFF + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 97 + 861 + 2 + script.plex/white-square.png + 40000000 + + + + + + + + + !Control.HasFocus(101) + 120 + 24 + + !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + -10 + 0 + 60 + 100 + font10 + center + center + D8FFFFFF + + + + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 0 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FFE5A00D + + + 63 + 11 + 74 + 74 + $INFO[ListItem.Thumb] + scale + + + 168 + 0 + + 0 + 15 + 723 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 723 + 30 + font10 + left + center + B8FFFFFF + + + + + 669 + 0 + 200 + 100 + font10 + right + center + D8FFFFFF + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 97 + 861 + 2 + script.plex/white-square.png + 40000000 + + + + + Control.HasFocus(101) + 63 + 21 + + -40 + -40 + 1055 + 180 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 975 + 100 + script.plex/white-square-rounded.png + FFE5A00D + + + !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 24 + 0 + 60 + 100 + font12 + center + center + B8000000 + + + + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 36 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FF000000 + + + 103 + 0 + 100 + 100 + $INFO[ListItem.Thumb] + scale + + + 235 + 0 + + 0 + 16 + 669 + 30 + font12 + left + center + DF000000 + + + + 0 + 51 + 669 + 30 + font10 + left + center + 98000000 + + + + + 735 + 0 + 200 + 100 + font12 + right + center + B8000000 + + + + + + + + + + + 1059 + 33 + 10 + 1014 + 101 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + + 406 + + 0 + 964 + 819 + + 124 + center + 500 + 100 + -40 + horizontal + 200 + false + + Conditional + Conditional + 125 + 101 + + + 0 + 0 + 125 + 101 + 100 + 402 + 411 + font12 + - + - + + + + !Control.HasFocus(401) + + !Playlist.IsRepeatOne + !Playlist.IsRepeat + String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat.png + + + Playlist.IsRepeat | !String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat.png + + + Playlist.IsRepeatOne + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-one.png + + + + Control.HasFocus(401) + + !Playlist.IsRepeatOne + !Playlist.IsRepeat + String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-focus.png + + + Playlist.IsRepeat | !String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-focus.png + + + Playlist.IsRepeatOne + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-one-focus.png + + + + + + String.IsEmpty(Window.Property(pq.isremote)) + Focus + UnFocus + + 125 + 101 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + Playlist.IsRandom + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + PlayerControl(RandomOn) + PlayerControl(RandomOff) + + + + + !String.IsEmpty(Window.Property(pq.isremote)) + Conditional + Conditional + 125 + 101 + + + 0 + 0 + 125 + 101 + 100 + 404 + 401 + font12 + - + - + + + + String.IsEmpty(Window.Property(pq.shuffled)) + + !Control.HasFocus(422) + 0 + 0 + 125 + 101 + script.plex/buttons/shuffle.png + + + Control.HasFocus(422) + 0 + 0 + 125 + 101 + script.plex/buttons/shuffle-focus.png + + + + !String.IsEmpty(Window.Property(pq.shuffled)) + + !Control.HasFocus(422) + 0 + 0 + 125 + 101 + script.plex/buttons/shuffle.png + + + Control.HasFocus(422) + 0 + 0 + 125 + 101 + script.plex/buttons/shuffle-focus.png + + + + + + MusicPlayer.HasPrevious | !String.IsEmpty(Window.Property(pq.hasprevious)) + Focus + UnFocus + + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + Focus + UnFocus + + 125 + 101 + font12 + script.plex/buttons/pause-focus.png + script.plex/buttons/pause.png + Player.Paused | Player.Forwarding | Player.Rewinding + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + PlayerControl(Play) + + + + Focus + UnFocus + + 125 + 101 + font12 + script.plex/buttons/stop-focus.png + script.plex/buttons/stop.png + PlayerControl(Stop) + + + + MusicPlayer.HasNext | !String.IsEmpty(Window.Property(pq.hasnext)) + Focus + UnFocus + + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + + Focus + UnFocus + + 125 + 101 + font12 + script.plex/buttons/pqueue-focus.png + script.plex/buttons/pqueue.png + + Close + + + Focus + UnFocus + + 125 + 101 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + + 0 + 940 + + Player.HasAudio + + 0 + 0 + 819 + 10 + 100 + 400 + script.plex/white-square.png + script.plex/white-square.png + A0000000 + + + Control.HasFocus(500) + Visible + 0 + 1 + 1 + 8 + script.plex/white-square.png + FFE5A00D + + + !Control.HasFocus(500) + Progressbar + 0 + 2 + 819 + 6 + script.plex/transparent-6px.png + - + script.plex/white-square-6px.png + - + - + Player.Progress + + + Control.HasFocus(500) + Progressbar + 0 + 2 + 819 + 6 + script.plex/transparent-6px.png + - + script.plex/white-square-6px.png + - + - + Player.Progress + + + + + + + + + Control.HasFocus(500) + 0 + 896 + + -50 + 0 + + Visible + 0 + 0 + 101 + 39 + script.plex/indicators/player-selection-time_box.png + D0000000 + + + 0 + 0 + 101 + 40 + font10 + center + center + FFFFFFFF + + + + + Visible + -6 + 39 + 15 + 7 + script.plex/indicators/player-selection-time_arrow.png + D0000000 + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-music_player.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-music_player.xml new file mode 100644 index 000000000..18926cfc2 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-music_player.xml @@ -0,0 +1,578 @@ + + + + 1 + 0 + 0 + + 406 + + + + String.IsEmpty(Window.Property(use_solid_background)) + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + false + + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Player.Art(fanart)] + + + !String.IsEmpty(Player.Art(fanart)) + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + D0404040 + + + + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Player.Art(landscape)] + + + + + 75 + 75 + 786 + 786 + script.plex/white-square.png + 20FFFFFF + + + 90 + 90 + 756 + 756 + $INFO[Player.Art(thumb)] + + + + 939 + 0 + + 0 + 305 + 1000 + 54 + font13 + left + center + FFFFFFFF + + + + 0 + 359 + 1000 + 54 + font13 + left + center + FFFFFFFF + + + + 0 + 470 + 1000 + 54 + font13 + left + center + FFFFFFFF + + + + 0 + 580 + 1000 + 54 + font13 + left + center + FFFFFFFF + + + + + + 1845 + 0 + + 0 + 738 + 1000 + 54 + font13 + right + center + 80FFFFFF + + + + 0 + 794 + 1000 + 54 + font13 + right + center + 80FFFFFF + + + + + + + + 406 + + 360 + 964 + 1200 + + 124 + center + 100 + -40 + horizontal + 200 + true + + Conditional + Conditional + 125 + 101 + + + 0 + 0 + 125 + 101 + 100 + 402 + 411 + font12 + - + - + + + + !Control.HasFocus(401) + + !Playlist.IsRepeatOne + !Playlist.IsRepeat + String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat.png + + + Playlist.IsRepeat | !String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat.png + + + Playlist.IsRepeatOne + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-one.png + + + + Control.HasFocus(401) + + !Playlist.IsRepeatOne + !Playlist.IsRepeat + String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-focus.png + + + Playlist.IsRepeat | !String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-focus.png + + + Playlist.IsRepeatOne + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-one-focus.png + + + + + + String.IsEmpty(Window.Property(pq.isremote)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + Playlist.IsRandom + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + PlayerControl(RandomOn) + PlayerControl(RandomOff) + + + + + !String.IsEmpty(Window.Property(pq.isremote)) + Conditional + Conditional + 125 + 101 + + + 0 + 0 + 125 + 101 + 100 + 404 + 401 + font12 + - + - + + + + String.IsEmpty(Window.Property(pq.shuffled)) + + !Control.HasFocus(422) + 0 + 0 + 125 + 101 + script.plex/buttons/shuffle.png + + + Control.HasFocus(422) + 0 + 0 + 125 + 101 + script.plex/buttons/shuffle-focus.png + + + + !String.IsEmpty(Window.Property(pq.shuffled)) + + !Control.HasFocus(422) + 0 + 0 + 125 + 101 + script.plex/buttons/shuffle.png + + + Control.HasFocus(422) + 0 + 0 + 125 + 101 + script.plex/buttons/shuffle-focus.png + + + + + + MusicPlayer.HasPrevious | !String.IsEmpty(Window.Property(pq.hasprevious)) + Focus + UnFocus + + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/pause-focus.png + script.plex/buttons/pause.png + Player.Paused | Player.Forwarding | Player.Rewinding + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + PlayerControl(Play) + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/stop-focus.png + script.plex/buttons/stop.png + PlayerControl(Stop) + + + + MusicPlayer.HasNext | !String.IsEmpty(Window.Property(pq.hasnext)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + + + Focus + UnFocus + + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/pqueue-focus.png + script.plex/buttons/pqueue.png + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + + 0 + 940 + + Player.HasAudio + + 0 + 0 + 1920 + 10 + 400 + script.plex/white-square.png + script.plex/white-square.png + A0000000 + + + Control.HasFocus(100) + Visible + 0 + 1 + 1 + 8 + script.plex/white-square.png + FFE5A00D + + + !Control.HasFocus(100) + Progressbar + 0 + 2 + 1920 + 6 + script.plex/transparent-6px.png + - + script.plex/white-square-6px.png + - + - + Player.Progress + + + Control.HasFocus(100) + Progressbar + 0 + 2 + 1920 + 6 + script.plex/transparent-6px.png + - + script.plex/white-square-6px.png + - + - + Player.Progress + + + + + + + + + Control.HasFocus(100) + 0 + 896 + + -50 + 0 + + Visible + 0 + 0 + 101 + 39 + script.plex/indicators/player-selection-time_box.png + D0000000 + + + 0 + 0 + 101 + 40 + font10 + center + center + FFFFFFFF + + + + + Visible + -6 + 39 + 15 + 7 + script.plex/indicators/player-selection-time_arrow.png + D0000000 + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-options_dialog.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-options_dialog.xml new file mode 100644 index 000000000..fb660d70e --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-options_dialog.xml @@ -0,0 +1,136 @@ + + 1001 + + 1 + 0 + 0 + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + !String.IsEmpty(Window.Property(initialized)) + 585 + 360 + + -40 + -40 + 830 + 440 + script.plex/drop-shadow.png + + + 0 + 0 + 750 + 360 + script.plex/white-square-rounded.png + + + 0 + 0 + 750 + 80 + script.plex/white-square-top-rounded.png + + + + 48 + 31 + 19 + 19 + script.plex/indicators/circle-19.png + + + + 115 + 0 + 575 + 80 + font12 + left + center + FFE5A00D + + + + + 115 + 105 + 575 + 125 + font10 + left + FFFFFFFF + + + + + 1001 + -10 + 220 + 770 + 155 + right + -50 + horizontal + 0 + true + + !String.IsEmpty(Window.Property(button.0)) + Focus + UnFocus + 0 + 0 + auto + 143 + font10 + script.plex/buttons/blank-focus.png + script.plex/buttons/blank.png + 70 + FF000000 + FF000000 + + + + !String.IsEmpty(Window.Property(button.1)) + Focus + UnFocus + 0 + 0 + auto + 143 + font10 + script.plex/buttons/blank-focus.png + script.plex/buttons/blank.png + 70 + FF000000 + FF000000 + + + + !String.IsEmpty(Window.Property(button.2)) + Focus + UnFocus + 0 + 0 + auto + 143 + font10 + script.plex/buttons/blank-focus.png + script.plex/buttons/blank.png + 70 + FF000000 + FF000000 + + + + + + + \ No newline at end of file diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-photo.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-photo.xml new file mode 100644 index 000000000..071430b70 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-photo.xml @@ -0,0 +1,717 @@ + + + + 1 + 0 + 0 + + 250 + 100 + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + Conditional + Conditional + Conditional + Conditional + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(photo)] + keep + + + !String.IsEmpty(Window.Property(is.updating)) + VisibleChange + + 840 + 465 + 240 + 150 + script.plex/busy-back.png + A0FFFFFF + + + 915 + 521 + 90 + 38 + script.plex/busy.gif + + + + + 0 + 0 + 1920 + 1080 + - + - + !String.IsEmpty(Window.Property(OSD)) + - + - + + SetProperty(OSD,1) + SetFocus(400) + SetProperty(OSD,) + SetProperty(OSD,1) + SetFocus(400) + SetFocus(501) + SetFocus(400) + + + Conditional + 0 + 0 + + !String.IsEmpty(Window.Property(OSD)) + + 0 + 940 + 1920 + 140 + script.plex/white-square.png + A0000000 + + + 406 + + 360 + 964 + 1200 + + 124 + center + 250 + SetProperty(OSD,) + 250 + SetProperty(OSD,) + -40 + horizontal + 200 + true + + + String.IsEmpty(Window.Property(no.playlist)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/repeat-focus.png + script.plex/buttons/repeat.png + !String.IsEmpty(Window.Property(pq.repeat)) + script.plex/buttons/repeat-focus.png + script.plex/buttons/repeat.png + + + + false + !String.IsEmpty(Window.Property(no.playlist)) + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + String.IsEmpty(Window.Property(no.playlist)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + !String.IsEmpty(Window.Property(pq.shuffled)) + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + false + !String.IsEmpty(Window.Property(no.playlist)) + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/rotate-focus.png + script.plex/buttons/rotate.png + + + + + + String.IsEmpty(Window.Property(hide.prev)) + Focus + UnFocus + + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + false + !String.IsEmpty(Window.Property(hide.prev)) + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + !String.IsEmpty(Window.Property(playing)) + script.plex/buttons/pause-focus.png + script.plex/buttons/pause.png + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/stop-focus.png + script.plex/buttons/stop.png + + + + String.IsEmpty(Window.Property(hide.next)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + false + !String.IsEmpty(Window.Property(hide.next)) + 0 + 0 + 125 + 101 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + + + Focus + UnFocus + + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/square2x2-focus.png + script.plex/buttons/square2x2.png + !String.IsEmpty(Window.Property(show.pqueue)) + script.plex/buttons/square2x2-focus.png + script.plex/buttons/square2x2-focus.png + SetProperty(show.pqueue,1) + SetProperty(show.pqueue,) + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/info-focus.png + script.plex/buttons/info.png + !String.IsEmpty(Window.Property(show.info)) + script.plex/buttons/info-focus.png + script.plex/buttons/info-focus.png + SetProperty(show.info,1) + SetProperty(show.info,) + + + + false + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/tags-focus.png + script.plex/buttons/tags.png + + + + false + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + + + 0 + 1080 + 1920 + 135 + SetProperty(OSD,1) + 400 + font12 + - + - + + SetProperty(OSD,1) + SetFocus(400) + + + + 0 + 1080 + 1920 + 135 + script.plex/white-square.png + FF000000 + + + 0 + 1080 + 1920 + 135 + + + 0 + horizontal + 4 + 7 + + + + 0 + 0 + + 2.5 + 6 + + 0 + 0 + 123 + 123 + script.plex/thumb_fallbacks/photo.png + + + 0 + 0 + 123 + 123 + $INFO[ListItem.Thumb] + scale + + + + + + + + + 0 + 0 + + 2.5 + 6 + + 0 + 0 + 123 + 123 + script.plex/thumb_fallbacks/photo.png + + + 0 + 0 + 123 + 123 + $INFO[ListItem.Thumb] + scale + + + + + + + 892.5 + 1080 + 135 + 135 + script.plex/home/selected.png + + + + + + !String.IsEmpty(Window.Property(show.info)) + 1470 + 0 + 450 + 1080 + + 0 + 0 + 450 + 1080 + script.plex/white-square.png + 4C000000 + + + 0 + 0 + 450 + 1080 + 0 + vertical + + + + 450 + 21 + - + - + 00000000 + + + + 450 + 37 + script.plex/white-square.png + script.plex/white-square.png + 00000000 + left + center + 28 + font12 + + + + 450 + 37 + script.plex/white-square.png + script.plex/white-square.png + 00000000 + left + center + 28 + font12 + + + + + 450 + 21 + - + - + 00000000 + + + + + + 450 + 21 + script.plex/white-square.png + script.plex/white-square.png + 99000000 + + + + !String.IsEmpty(Window.Property(camera.model)) + 450 + 37 + + 0 + 0 + 450 + 37 + script.plex/white-square.png + script.plex/white-square.png + 99000000 + left + center + 28 + font12 + + + + 393 + 6 + 29 + 24 + script.plex/indicators/camera.png + A0FFFFFF + + + + !String.IsEmpty(Window.Property(camera.lens)) + 450 + 37 + script.plex/white-square.png + script.plex/white-square.png + 99000000 + left + center + 28 + font12 + + + + !String.IsEmpty(Window.Property(photo.container)) + 0 + 0 + 450 + 37 + + 0 + 0 + 450 + 37 + script.plex/white-square.png + script.plex/white-square.png + 99000000 + left + center + 28 + font12 + + + + 28 + 5 + 200 + 26 + 0 + horizontal + right + + auto + 26 + font10 + center + top + FF000000 + FF000000 + 5 + -3 + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + + + + + + + 450 + 21 + script.plex/white-square.png + script.plex/white-square.png + 99000000 + + + + !String.IsEmpty(Window.Property(camera.settings)) + 450 + 80 + + + 0 + 0 + 450 + 1 + script.plex/indicators/info-sep.png + 99000000 + + + 28 + 0 + 394 + 1 + script.plex/white-square.png + 999B9B9B + + + + 0 + 1 + 450 + 21 + script.plex/white-square.png + script.plex/white-square.png + 99000000 + + + + 0 + 22 + 450 + 37 + script.plex/white-square.png + script.plex/white-square.png + 99000000 + left + center + 28 + font12 + + + + + 0 + 59 + 450 + 21 + script.plex/white-square.png + script.plex/white-square.png + 99000000 + + + + + + !String.IsEmpty(Window.Property(photo.summary)) + 450 + 152 + + 0 + 0 + 450 + 152 + script.plex/white-square.png + 661F1F1F + + + 28 + 24 + 394 + 100 + font12 + left + center + + + + + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-pin_login.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-pin_login.xml new file mode 100644 index 000000000..6dcac7f4a --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-pin_login.xml @@ -0,0 +1,82 @@ + + + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + !String.IsEmpty(Window.Property(pin.image.0)) + 0 + 0 + 1920 + 1080 + script.plex/sign_in/pin-display.jpg + + + String.IsEmpty(Window.Property(pin.image.0)) + String.IsEmpty(Window.Property(linking)) + 0 + 0 + 1920 + 1080 + script.plex/sign_in/generating-code.jpg + + + !String.IsEmpty(Window.Property(linking)) + 0 + 0 + 1920 + 1080 + script.plex/sign_in/linking-account.jpg + + + + 270 + 738 + 800 + 153 + WeatherTemp + left + center + FFFFFFFF + + + + + 406 + 265 + 708 + 1000 + + 200 + left + 0 + horizontal + + 200 + 200 + $INFO[Window.Property(pin.image.0)] + + + 200 + 200 + $INFO[Window.Property(pin.image.1)] + + + 200 + 200 + $INFO[Window.Property(pin.image.2)] + + + 200 + 200 + $INFO[Window.Property(pin.image.3)] + + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-playlist.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-playlist.xml new file mode 100644 index 000000000..3e00fca9c --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-playlist.xml @@ -0,0 +1,883 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + 0 + 135 + 101 + + + 60 + 0 + + 0 + 5 + 420 + 40 + font13 + left + center + FFFFFFFF + + + + 0 + 60 + 420 + 40 + font13 + left + center + FFFFFFFF + + + + 0 + 142 + 630 + 630 + $INFO[Window.Property(playlist.thumb)] + scale + + + + + VisibleChange + 303 + 50 + 784 + 650 + 145 + 200 + 101 + -50 + horizontal + center + 200 + true + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + !String.IsEmpty(Window.Property(show.options)) | Player.HasAudio + Focus + UnFocus + + 0 + 0 + 174 + 139 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 750 + 0 + 1170 + 1080 + + 0 + 0 + 1170 + 1080 + script.plex/white-square.png + 20000000 + + + 0 + 0 + 1170 + 945 + 200 + 152 + 300 + 200 + vertical + 4 + 152 + + + + 120 + 24 + + String.IsEmpty(ListItem.Property(track.ID)) | !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + -10 + 0 + 60 + 100 + font10 + center + center + D8FFFFFF + + + + !String.IsEmpty(ListItem.Property(track.ID)) + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 2 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FFE5A00D + + + String.IsEmpty(ListItem.Property(video)) + + 63 + 11 + 74 + 74 + $INFO[ListItem.Thumb] + scale + + + 168 + 0 + + 0 + 15 + 692 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 692 + 30 + font10 + left + center + B8FFFFFF + + + + + + !String.IsEmpty(ListItem.Property(video)) + + 63 + 11 + 132 + 74 + $INFO[ListItem.Thumb] + scale + + + String.IsEmpty(ListItem.Property(watched)) + 895 + -1 + 35 + 35 + script.plex/indicators/unwatched.png + + + 226 + 0 + + 0 + 15 + 584 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 584 + 30 + font10 + left + center + B8FFFFFF + + + + + + 730 + 0 + 200 + 100 + font10 + right + center + D8FFFFFF + + + + + False + 63 + 85 + + 0 + 0 + 870 + 8 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 870 + 6 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 97 + 930 + 2 + script.plex/white-square.png + 40000000 + + + + + + + + + !Control.HasFocus(101) + 120 + 24 + + String.IsEmpty(ListItem.Property(track.ID)) | !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + -10 + 0 + 60 + 100 + font10 + center + center + D8FFFFFF + + + + !String.IsEmpty(ListItem.Property(track.ID)) + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 0 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FFE5A00D + + + String.IsEmpty(ListItem.Property(video)) + + 63 + 11 + 74 + 74 + $INFO[ListItem.Thumb] + scale + + + 168 + 0 + + 0 + 15 + 692 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 692 + 30 + font10 + left + center + B8FFFFFF + + + + + + !String.IsEmpty(ListItem.Property(video)) + + 63 + 11 + 132 + 74 + $INFO[ListItem.Thumb] + scale + + + String.IsEmpty(ListItem.Property(watched)) + 895 + -1 + 35 + 35 + script.plex/indicators/unwatched.png + + + 226 + 0 + + 0 + 15 + 584 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 584 + 30 + font10 + left + center + B8FFFFFF + + + + + + 730 + 0 + 200 + 100 + font10 + right + center + D8FFFFFF + + + + !String.IsEmpty(ListItem.Property(progress)) + 63 + 88 + + 0 + 0 + 870 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 870 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 97 + 930 + 2 + script.plex/white-square.png + 40000000 + + + + + Control.HasFocus(101) + 63 + 21 + + -40 + -40 + 1124 + 180 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 1044 + 100 + script.plex/white-square-rounded.png + FFE5A00D + + + + + String.IsEmpty(ListItem.Property(track.ID)) | !String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 24 + 0 + 60 + 100 + font12 + center + center + B8000000 + + + + !String.IsEmpty(ListItem.Property(track.ID)) + String.IsEqual(ListItem.Property(track.ID),Window(10000).Property(script.plex.track.ID)) + 36 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FF000000 + + + String.IsEmpty(ListItem.Property(video)) + + String.IsEmpty(ListItem.Property(video)) + 103 + 0 + 100 + 100 + $INFO[ListItem.Thumb] + scale + + + 235 + 0 + + 0 + 16 + 638 + 30 + font12 + left + center + DF000000 + + + + 0 + 51 + 638 + 30 + font10 + left + center + 98000000 + + + + + + !String.IsEmpty(ListItem.Property(video)) + + 103 + 0 + 178 + 100 + $INFO[ListItem.Thumb] + scale + + + String.IsEmpty(ListItem.Property(watched)) + 951 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + 313 + 0 + + 0 + 16 + 510 + 30 + font12 + left + center + DF000000 + + + + 0 + 51 + 510 + 30 + font10 + left + center + 98000000 + + + + + + 802 + 0 + 200 + 100 + font12 + right + center + B8000000 + + + + !String.IsEmpty(ListItem.Property(progress)) + 103 + 91 + + 0 + 0 + 899 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 899 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + + + + + + + + 1128 + 33 + 10 + 879 + 101 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + false + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-playlists.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-playlists.xml new file mode 100644 index 000000000..7e5e9621e --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-playlists.xml @@ -0,0 +1,567 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + 0 + 115 + 101 + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 0 + 0 + 1920 + 360 + + 60 + 0 + 1800 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1920 + 390 + 200 + 301 + 200 + horizontal + 2 + + + + 40 + 40 + + 21 + 21 + + 0 + 0 + 238 + 238 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 238 + 238 + $INFO[ListItem.Thumb] + scale + + + -30 + 248 + 298 + 40 + font10 + center + FFFFFFFF + + + + -30 + 278 + 298 + 40 + font10 + center + FFFFFFFF + + + + + + + + + + 40 + 40 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(101) + -19 + -19 + 318 + 318 + script.plex/drop-shadow.png + + + 21 + 21 + + 0 + 0 + 238 + 238 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 238 + 238 + $INFO[ListItem.Thumb] + scale + + + -30 + 248 + 298 + 40 + font10 + center + FFFFFFFF + + + + -30 + 278 + 298 + 40 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(101) + 16 + 16 + 248 + 248 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(301).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + Conditional + 301 + 0 + 445 + 1920 + 360 + + Control.IsVisible(100) + 60 + 0 + 1800 + 2 + script.plex/white-square.png + 661F1F1F + + + 60 + 0 + 1800 + 80 + font12 + left + center + FFFFFFFF + + + + -21.5 + 30 + 1941.5 + 700 + 101 + 200 + horizontal + 2 + + + + 40 + 40 + + 41.5 + 25.5 + + 0 + 0 + 537 + 303 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 537 + 303 + $INFO[ListItem.Thumb] + scale + + + -30 + 313 + 597 + 40 + font10 + center + FFFFFFFF + + + + -30 + 343 + 597 + 40 + font10 + center + FFFFFFFF + + + + + + + + + + 40 + 40 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(301) + 1.5 + -15.5 + 617 + 383 + script.plex/drop-shadow.png + + + 41.5 + 25.5 + + 0 + 0 + 537 + 303 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 537 + 303 + $INFO[ListItem.Thumb] + scale + + + -30 + 313 + 597 + 40 + font10 + center + FFFFFFFF + + + + -30 + 343 + 597 + 40 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(301) + 36.5 + 20.5 + 547 + 313 + script.plex/home/selected.png + + + + + + + + + + + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + false + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-plex_pass.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-plex_pass.xml new file mode 100644 index 000000000..d4c0be6d5 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-plex_pass.xml @@ -0,0 +1,39 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + 0 + 0 + 1920 + 1080 + script.plex/sign_in/plexpass.jpg + + + + 1436 + 802 + 275 + 100 + 200 + font13 + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-posters-small.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-posters-small.xml new file mode 100644 index 000000000..bfd43ed7d --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-posters-small.xml @@ -0,0 +1,877 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + Conditional + 0 + 135 + 101 + + + VisibleChange + !Integer.IsGreater(Container(101).ListItem.Property(index),9) + String.IsEmpty(Window.Property(no.content)) + String.IsEmpty(Window.Property(no.content.filtered)) + !String.IsEmpty(Window.Property(initialized)) + 301 + 30 + -25 + 1000 + 145 + 200 + 101 + -20 + horizontal + 200 + true + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + String.IsEmpty(Window.Property(no.options)) | Player.HasAudio + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/chapters-focus.png + script.plex/buttons/chapters.png + + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 0 + -35 + 1920 + 1080 + + + 0 + 0 + 1800 + 1190 + 300 + 151 + 200 + vertical + 2 + 152 + + + + 55 + 137 + + 5 + 5 + + 0 + 0 + 144 + 213 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 144 + 213 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 203 + + 0 + 0 + 144 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 144 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 115 + 0 + 29 + 29 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 93 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 94 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 94 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + String.IsEmpty(ListItem.Property(subtitle)) + false + 0 + 218 + 144 + 72 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(subtitle)) + false + 0 + 218 + 144 + 72 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 137 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(101) + -40 + -40 + 234 + 316 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 144 + 213 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 144 + 213 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 203 + + 0 + 0 + 144 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 144 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 115 + 0 + 29 + 29 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 93 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 94 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 94 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + String.IsEmpty(ListItem.Property(subtitle)) + true + 0 + 218 + 144 + 72 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(subtitle)) + true + 0 + 218 + 144 + 30 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(101) + 0 + 0 + 154 + 225 + script.plex/home/selected.png + + + + + + + + + + + String.IsEqual(Window(10000).Property(script.plex.sort),titleSort) + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 151 + 1780 + 150 + 20 + 920 + + 0 + 0 + 34 + 1050 + 100 + 152 + 200 + vertical + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + Control.HasFocus(151) + 0 + 0 + + Control.HasFocus(151) + 0 + 0 + 34 + 34 + FFE5A00D + script.plex/white-outline-rounded.png + + + + + + + + + + 1860 + 150 + 12 + 910 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + Conditional + !String.IsEmpty(Window.Property(initialized)) + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + Integer.IsGreater(Container(101).ListItem.Property(index),9) + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font10 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 211 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + String.IsEmpty(Window.Property(hide.filteroptions)) + 340 + 35 + 870 + 65 + right + 30 + horizontal + 204 + 210 + 50 + + !String.IsEqual(Window.Property(media.itemType),folder) + false + auto + 65 + font10 + A0FFFFFF + A0FFFFFF + A0FFFFFF + center + center + - + - + 0 + 0 + + + + !String.IsEqual(Window.Property(media.itemType),folder) + auto + 65 + font10 + A0FFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + String.IsEqual(Window.Property(subDir),1) | ![String.IsEqual(Window.Property(media),show) | String.IsEqual(Window.Property(media),movie)] + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 20 + 0 + + + + !String.IsEqual(Window.Property(subDir),1) + [String.IsEqual(Window.Property(media),show) | String.IsEqual(Window.Property(media),movie)] + auto + 65 + font12 + FFFFFFFF + FF000000 + FFFFFFFF + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media.itemType),folder) + auto + 65 + font10 + A0FFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + + 213 + 35 + 200 + 65 + font10 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(no.content)) + 0 + 465 + + false + 60 + 0 + 1800 + 35 + font13 + center + FFFFFFFF + + + + false + 60 + 60 + 1800 + 35 + font13 + center + FFCCCCCC + + + + + + !String.IsEmpty(Window.Property(no.content.filtered)) + 0 + 465 + + false + 60 + 0 + 1800 + 35 + font13 + center + FFFFFFFF + + + + false + 60 + 60 + 1800 + 35 + font13 + center + FFCCCCCC + + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-posters.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-posters.xml new file mode 100644 index 000000000..3dd674899 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-posters.xml @@ -0,0 +1,851 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + Conditional + 0 + 135 + 101 + + + VisibleChange + !Integer.IsGreater(Container(101).ListItem.Property(index),5) + String.IsEmpty(Window.Property(no.content)) + String.IsEmpty(Window.Property(no.content.filtered)) + !String.IsEmpty(Window.Property(initialized)) + 301 + 30 + -25 + 1000 + 145 + 200 + 101 + -20 + horizontal + 200 + true + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + String.IsEmpty(Window.Property(no.options)) | Player.HasAudio + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/chapters-focus.png + script.plex/buttons/chapters.png + + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 0 + -35 + 1920 + 1080 + + + 0 + 0 + 1800 + 1190 + 300 + 151 + 200 + vertical + 2 + 152 + + + + 55 + 137 + + 5 + 5 + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 199 + 0 + 45 + 45 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + false + 0 + 371 + 244 + 72 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 137 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(101) + -40 + -40 + 334 + 451 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 199 + 0 + 45 + 45 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + + true + 0 + 371 + 244 + 72 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(101) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + + + + String.IsEqual(Window(10000).Property(script.plex.sort),titleSort) + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 151 + 1780 + 150 + 20 + 920 + + 0 + 0 + 34 + 1050 + 100 + 152 + 200 + vertical + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + Control.HasFocus(151) + 0 + 0 + + Control.HasFocus(151) + 0 + 0 + 34 + 34 + FFE5A00D + script.plex/white-outline-rounded.png + + + + + + + + + + 1860 + 150 + 12 + 910 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + Conditional + 201 + 0 + 0 + 1920 + 135 + !String.IsEmpty(Window.Property(initialized)) + + VisibleChange + ControlGroup(200).HasFocus(0) + Integer.IsGreater(Container(101).ListItem.Property(index),5) + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font10 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 211 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + String.IsEmpty(Window.Property(hide.filteroptions)) + 340 + 35 + 870 + 65 + right + 30 + horizontal + 204 + 210 + 50 + + !String.IsEqual(Window.Property(media.itemType),folder) + false + auto + 65 + font10 + A0FFFFFF + A0FFFFFF + A0FFFFFF + center + center + - + - + 0 + 0 + + + + !String.IsEqual(Window.Property(media.itemType),folder) + auto + 65 + font10 + A0FFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + String.IsEqual(Window.Property(subDir),1) | ![String.IsEqual(Window.Property(media),show) | String.IsEqual(Window.Property(media),movie)] + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 20 + 0 + + + + !String.IsEqual(Window.Property(subDir),1) + [String.IsEqual(Window.Property(media),show) | String.IsEqual(Window.Property(media),movie)] + auto + 65 + font12 + FFFFFFFF + FF000000 + FFFFFFFF + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media.itemType),folder) + auto + 65 + font10 + A0FFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + + 213 + 35 + 200 + 65 + font10 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(no.content)) + 0 + 465 + + false + 60 + 0 + 1800 + 35 + font13 + center + FFFFFFFF + + + + false + 60 + 60 + 1800 + 35 + font13 + center + FFCCCCCC + + + + + + !String.IsEmpty(Window.Property(no.content.filtered)) + 0 + 465 + + false + 60 + 0 + 1800 + 35 + font13 + center + FFFFFFFF + + + + false + 60 + 60 + 1800 + 35 + font13 + center + FFCCCCCC + + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-pre_play.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-pre_play.xml new file mode 100644 index 000000000..9b7c28131 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-pre_play.xml @@ -0,0 +1,1494 @@ + + + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + Conditional + + + + + + + + + + + + + + 0 + 155 + 101 + + + VisibleChange + !String.IsEmpty(Window.Property(initialized)) + 302 + 428 + 410 + 1000 + 145 + 200 + 400 + -50 + horizontal + 200 + true + + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/info-focus.png + script.plex/buttons/info.png + + + + + String.IsEmpty(Window.Property(unavailable)) + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + !String.IsEmpty(Window.Property(trailer.button)) + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/trailer-focus.png + script.plex/buttons/trailer.png + + + + !String.IsEmpty(Window.Property(media.multiple)) + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/media-focus.png + script.plex/buttons/media.png + + + + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/settings-focus.png + script.plex/buttons/settings.png + + + + Focus + UnFocus + + 0 + 0 + 176 + 140 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + + 0 + 0 + 1920 + 600 + + !String.IsEmpty(Window.Property(preview.no)) + + 60 + 0 + 347 + 518 + script.plex/thumb_fallbacks/movie.png + WindowOpen + scale + + + 60 + 0 + 347 + 518 + $INFO[Window.Property(thumb)] + scale + + + !String.IsEmpty(Window.Property(unwatched)) + 359 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + + + !String.IsEmpty(Window.Property(preview.yes)) + 60 + 0 + + 0 + 0 + 347 + 315 + script.plex/thumb_fallbacks/show.png + WindowOpen + scale + + + 0 + 323 + 347 + 195 + script.plex/white-square.png + scale + + + + 0 + 0 + 347 + 315 + $INFO[Window.Property(thumb)] + scale + + + 0 + 323 + 347 + 195 + $INFO[Window.Property(preview)] + scale + + + + 466 + 0 + 1360 + 60 + left + 0 + horizontal + true + + auto + 60 + font13 + left + FFFFFFFF + + + + !String.IsEmpty(Window.Property(remainingTime)) + 10 + 6 + auto + 34 + font12 + center + center + FFE5A00D + FFE5A00D + 15 + script.plex/white-square-rounded-top-padded.png + script.plex/white-square-rounded-top-padded.png + + + + + 466 + 68 + 1360 + 34 + left + 0 + horizontal + true + + auto + 34 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Window.Property(rating.stars)) + auto + 34 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Window.Property(rating.stars)) + 6 + 134 + 22 + script.plex/stars/$INFO[Window.Property(rating.stars)].png + + + !String.IsEmpty(Window.Property(video.res)) + 10 + auto + 34 + font12 + center + center + FFFFFFFF + FFFFFFFF + 15 + script.plex/white-square-rounded-top-padded.png + script.plex/white-square-rounded-top-padded.png + + + + !String.IsEmpty(Window.Property(unavailable)) + 10 + auto + 34 + font12 + center + center + FFFFFFFF + FFFFFFFF + 15 + script.plex/white-square-rounded-top-padded.png + script.plex/white-square-rounded-top-padded.png + + + + + + !String.IsEmpty(Window.Property(rating)) + 1560 + 4 + 300 + 32 + right + 15 + horizontal + true + + 2 + 63 + 30 + $INFO[Window.Property(rating.image)] + keep + + + auto + 30 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Window.Property(rating2)) + 2 + 40 + 30 + $INFO[Window.Property(rating2.image)] + keep + + + !String.IsEmpty(Window.Property(rating2)) + auto + 30 + font12 + left + FFFFFFFF + + + + + + !String.IsEmpty(Window.Property(directors)) + 466 + 130 + 1360 + 30 + font12 + left + 99FFFFFF + + + + !String.IsEmpty(Window.Property(writers)) + 466 + 165 + 1360 + 30 + font12 + left + 99FFFFFF + + + + 466 + 223 + 1360 + 34 + left + 15 + horizontal + true + + !String.IsEmpty(Window.Property(audio)) + auto + 34 + font12 + center + center + FFFFFFFF + FFFFFFFF + 15 + script.plex/white-square-rounded-top-padded.png + script.plex/white-square-rounded-top-padded.png + + + + auto + 34 + font12 + left + center + FFFFFFFF + + + + !String.IsEmpty(Window.Property(subtitles)) + 30 + auto + 34 + font12 + center + center + FFFFFFFF + FFFFFFFF + 15 + script.plex/white-square-rounded-top-padded.png + script.plex/white-square-rounded-top-padded.png + + + + !String.IsEmpty(Window.Property(subtitles)) + auto + 34 + font12 + left + center + FFFFFFFF + + + + + 466 + 290 + 1360 + 102 + font12 + left + FFFFFFFF + + + + WindowOpen + -1 + 557 + 1 + 8 + script.plex/white-square.png + FFCC7B19 + + + !Control.IsVisible(500) + 0 + 565 + 1920 + 2 + script.plex/white-square.png + A0000000 + + + + + 0 + 565 + 1920 + 1800 + + 300 + 0 + + + + Integer.IsGreater(Container(400).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 400 + 1920 + 446 + + 60 + 20 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 36 + 1920 + 410 + 300 + 401 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + script.plex/thumb_fallbacks/role.png + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + 0 + 253 + + false + 0 + 0 + 244 + 60 + font10 + center + AAFFFFFF + + + + false + 0 + 30 + 244 + 60 + font10 + center + AAFFFFFF + + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(403) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + script.plex/thumb_fallbacks/role.png + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + 0 + 253 + + Control.HasFocus(400) + 0 + 0 + 244 + 60 + font10 + center + AAFFFFFF + + + + Control.HasFocus(400) + 0 + 30 + 244 + 60 + font10 + center + AAFFFFFF + + + + + + Control.HasFocus(400) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + + + Integer.IsGreater(Container(401).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 401 + 1920 + 446 + + 60 + 20 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 36 + 1920 + 410 + 400 + 402 + 200 + horizontal + 4 + + + + 55 + 61 + + 0 + 0 + 520 + 310 + script.plex/white-square.png + 60000000 + + + 20 + 20 + + 0 + 0 + + 10 + -5 + 70 + 70 + script.plex/reviews/$INFO[ListItem.Thumb].png + + + false + 100 + 0 + 400 + 30 + font10 + left + DDFFFFFF + + + + false + 100 + 30 + 400 + 30 + font10 + left + 66FFFFFF + + + + + 0 + 80 + 480 + 190 + font10 + left + AAFFFFFF + + + + + + + + + + 55 + 61 + + 0 + 0 + 520 + 310 + script.plex/white-square.png + 80000000 + + + 20 + 20 + + 0 + 0 + + 10 + -5 + 70 + 70 + script.plex/reviews/$INFO[ListItem.Thumb].png + + + false + 100 + 0 + 400 + 30 + font10 + left + DDFFFFFF + + + + false + 100 + 30 + 400 + 30 + font10 + left + 66FFFFFF + + + + + 0 + 80 + 480 + 190 + font10 + left + DDFFFFFF + + Control.HasFocus(401) + + + + Control.HasFocus(401) + -5 + -5 + 530 + 320 + script.plex/home/selected.png + + + + + + + + + + Integer.IsGreater(Container(402).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 360 + 1920 + + 0 + 0 + 1920 + 360 + script.plex/white-square.png + 40000000 + + + 60 + 0 + 800 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 18 + 1920 + 430 + 401 + 403 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + 0 + 180 + 299 + 60 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(402) + -40 + -40 + 389 + 258 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + 0 + 180 + 299 + 60 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(402) + 0 + 0 + 309 + 178 + script.plex/home/selected.png + + + + + + + + + + + Integer.IsGreater(Container(403).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 403 + 1920 + 520 + + !String.IsEmpty(Window.Property(divider.403)) + 60 + 0 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 16 + 1920 + 520 + 402 + false + false + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 369 + 244 + 38 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(403) + -40 + -40 + 324 + 441 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(403) + 0 + 369 + 244 + 38 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(403) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + + + + + + + + + + Conditional + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + !String.IsEmpty(Window.Property(on.extras)) + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-pre_signin.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-pre_signin.xml new file mode 100644 index 000000000..9c8b5d391 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-pre_signin.xml @@ -0,0 +1,39 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + 0 + 0 + 1920 + 1080 + script.plex/sign_in/pre-signin.jpg + + + + 1437 + 801 + 275 + 104 + 200 + font13 + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-refresh_code.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-refresh_code.xml new file mode 100644 index 000000000..482622389 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-refresh_code.xml @@ -0,0 +1,39 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + 0 + 0 + 1920 + 1080 + script.plex/sign_in/refresh-code.jpg + + + + 1383 + 802 + 335 + 102 + 200 + font13 + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-search.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-search.xml new file mode 100644 index 000000000..95db79fb5 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-search.xml @@ -0,0 +1,8839 @@ + + SetProperty(dropdown,1) + + 1 + 0 + 0 + + + + + + 0 + 0 + 564 + 1080 + script.plex/white-square.png + + + 0 + 135 + 564 + 810 + String.IsEmpty(Window.Property(hide.kbd)) + script.plex/white-square.png + + + 0 + 135 + 564 + 248 + !String.IsEmpty(Window.Property(hide.kbd)) + script.plex/white-square.png + + + 0 + 945 + 564 + 135 + String.IsEmpty(Window.Property(hide.kbd)) + script.plex/white-square.png + + + 0 + 383 + 564 + 697 + !String.IsEmpty(Window.Property(hide.kbd)) + script.plex/white-square.png + + + + + Focus + UnFocus + 60 + 47.5 + 40 + 40 + 900 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + Close + + + + false + 160 + 35 + 500 + 65 + font12 + left + center + FFFFFFFF + + + + + + + 60 + 186 + 459 + 60 + + + 0 + 0 + + 0 + 0 + 151 + 60 + script.plex/white-square.png + + + String.IsEqual(Window.Property(search.section),all) + + 0 + 0 + 151 + 60 + script.plex/white-square.png + + + false + 0 + 0 + 151 + 60 + font12 + center + center + FF000000 + + + + + false + !String.IsEqual(Window.Property(search.section),all) + 0 + 0 + 151 + 60 + font12 + center + center + FFFFFFFF + + + + + 154 + 0 + + 0 + 0 + 74 + 60 + script.plex/white-square.png + + + String.IsEqual(Window.Property(search.section),movie) + 0 + 0 + 74 + 60 + script.plex/white-square.png + + + + 231 + 0 + + 0 + 0 + 74 + 60 + script.plex/white-square.png + + + String.IsEqual(Window.Property(search.section),show) + 0 + 0 + 74 + 60 + script.plex/white-square.png + + + + 308 + 0 + + 0 + 0 + 74 + 60 + script.plex/white-square.png + + + String.IsEqual(Window.Property(search.section),artist) + 0 + 0 + 74 + 60 + script.plex/white-square.png + + + + 384 + 0 + + 0 + 0 + 74 + 60 + script.plex/white-square.png + + + String.IsEqual(Window.Property(search.section),photo) + 0 + 0 + 74 + 60 + script.plex/white-square.png + + + + + 901 + + 0 + 0 + + Focus + UnFocus + + -40 + -40 + 231 + 140 + 902 + 999 + 650 + font12 + center + center + FF000000 + 00000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 154 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 140 + 901 + 903 + 999 + 650 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 231 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 140 + 902 + 904 + 999 + 650 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 308 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 140 + 903 + 905 + 999 + 650 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 385 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 140 + 904 + 3000 + 999 + 650 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + + + 154 + 0 + + Conditional + 0 + 0 + 74 + 60 + + 26 + 20 + 22 + 20 + script.plex/home/type/movie.png + + + + + 231 + 0 + + Conditional + 0 + 0 + 74 + 60 + + 26 + 20 + 24 + 20 + script.plex/home/type/show.png + + + + + 308 + 0 + + Conditional + 0 + 0 + 74 + 60 + + 26 + 20 + 18 + 20 + script.plex/home/type/artist.png + + + + + 385 + 0 + + Conditional + 0 + 0 + 74 + 60 + + 26 + 20 + 22 + 20 + script.plex/home/type/photo.png + + + + + + + + 60 + 276 + 459 + 60 + + 0 + 0 + 459 + 60 + script.plex/white-square.png + + + 0 + 0 + 459 + 60 + left + center + 900 + 1001 + 3000 + 00000000 + + + font13 + 30 + script.plex/home/selected.png + - + no + + + false + 30 + 0 + 399 + 60 + left + center + FFFFFFFF + font13 + + + + + + + 60 + 360 + 459 + 439 + String.IsEmpty(Window.Property(hide.kbd)) + + + + 0 + 0 + + 0 + 0 + 74 + 74 + script.plex/white-square.png + + + 77 + 0 + 74 + 74 + script.plex/white-square.png + + + 154 + 0 + 74 + 74 + script.plex/white-square.png + + + 231 + 0 + 74 + 74 + script.plex/white-square.png + + + 308 + 0 + 74 + 74 + script.plex/white-square.png + + + 385 + 0 + 74 + 74 + script.plex/white-square.png + + + + + 0 + 77 + + 0 + 0 + 74 + 74 + script.plex/white-square.png + + + 77 + 0 + 74 + 74 + script.plex/white-square.png + + + 154 + 0 + 74 + 74 + script.plex/white-square.png + + + 231 + 0 + 74 + 74 + script.plex/white-square.png + + + 308 + 0 + 74 + 74 + script.plex/white-square.png + + + 385 + 0 + 74 + 74 + script.plex/white-square.png + + + + + 0 + 154 + + 0 + 0 + 74 + 74 + script.plex/white-square.png + + + 77 + 0 + 74 + 74 + script.plex/white-square.png + + + 154 + 0 + 74 + 74 + script.plex/white-square.png + + + 231 + 0 + 74 + 74 + script.plex/white-square.png + + + 308 + 0 + 74 + 74 + script.plex/white-square.png + + + 385 + 0 + 74 + 74 + script.plex/white-square.png + + + + + 0 + 231 + + 0 + 0 + 74 + 74 + script.plex/white-square.png + + + 77 + 0 + 74 + 74 + script.plex/white-square.png + + + 154 + 0 + 74 + 74 + script.plex/white-square.png + + + 231 + 0 + 74 + 74 + script.plex/white-square.png + + + 308 + 0 + 74 + 74 + script.plex/white-square.png + + + 385 + 0 + 74 + 74 + script.plex/white-square.png + + + + + 0 + 308 + + 0 + 0 + 74 + 74 + script.plex/white-square.png + + + 77 + 0 + 74 + 74 + script.plex/white-square.png + + + 154 + 0 + 74 + 74 + script.plex/white-square.png + + + 231 + 0 + 74 + 74 + script.plex/white-square.png + + + 308 + 0 + 74 + 74 + script.plex/white-square.png + + + 385 + 0 + 74 + 74 + script.plex/white-square.png + + + + + 0 + 385 + + 0 + 0 + 74 + 74 + script.plex/white-square.png + + + 77 + 0 + 74 + 74 + script.plex/white-square.png + + + 154 + 0 + 74 + 74 + script.plex/white-square.png + + + 231 + 0 + 74 + 74 + script.plex/white-square.png + + + 308 + 0 + 74 + 74 + script.plex/white-square.png + + + 385 + 0 + 74 + 74 + script.plex/white-square.png + + + + + + 0 + 0 + + 0 + 0 + + true + Focus + UnFocus + + -40 + -40 + 154 + 154 + 650 + 1007 + 1002 + 1006 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 77 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 650 + 1008 + 1003 + 1001 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 154 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 650 + 1009 + 1004 + 1002 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 231 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 650 + 1010 + 1005 + 1003 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 308 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 650 + 1011 + 1006 + 1004 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 385 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 650 + 1012 + 3000 + 1005 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + + + 0 + 77 + + 0 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1001 + 1013 + 1008 + 1012 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 77 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1002 + 1014 + 1009 + 1007 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 154 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1003 + 1015 + 1010 + 1008 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 231 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1004 + 1016 + 1011 + 1009 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 308 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1005 + 1017 + 1012 + 1010 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 385 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1006 + 1018 + 3000 + 1011 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + + + 0 + 154 + + 0 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1007 + 1019 + 1014 + 1018 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 77 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1008 + 1020 + 1015 + 1013 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 154 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1009 + 1021 + 1016 + 1014 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 231 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1010 + 1022 + 1017 + 1015 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 308 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1011 + 1023 + 1018 + 1016 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 385 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1012 + 1024 + 3000 + 1017 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + + + 0 + 231 + + 0 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1013 + 1025 + 1020 + 1024 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 77 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1014 + 1026 + 1021 + 1019 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 154 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1015 + 1027 + 1022 + 1020 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 231 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1016 + 1028 + 1023 + 1021 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 308 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1017 + 1029 + 1024 + 1022 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 385 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1018 + 1030 + 3000 + 1023 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + + + 0 + 308 + + 0 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1019 + 1031 + 1026 + 1030 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 77 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1020 + 1032 + 1027 + 1025 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 154 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1021 + 1033 + 1028 + 1026 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 231 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1022 + 1034 + 1029 + 1027 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 308 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1023 + 1035 + 1030 + 1028 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 385 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1024 + 1036 + 3000 + 1029 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + + + 0 + 385 + + 0 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1025 + 951 + 1032 + 1036 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 77 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1026 + 951 + 1033 + 1031 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 154 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1027 + 952 + 1034 + 1032 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 231 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1028 + 952 + 1035 + 1033 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 308 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1029 + 953 + 1036 + 1034 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 385 + 0 + + Focus + UnFocus + + -40 + -40 + 154 + 154 + 1030 + 953 + 3000 + 1035 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + + + + + 60 + 840 + 459 + 60 + String.IsEmpty(Window.Property(hide.kbd)) + + 0 + 0 + 151 + 60 + script.plex/white-square.png + + + 154 + 0 + 151 + 60 + script.plex/white-square.png + + + 308 + 0 + 151 + 60 + script.plex/white-square.png + + + + 0 + 0 + + Focus + UnFocus + + -40 + -40 + 231 + 140 + 953 + 952 + 1031 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 154 + 0 + + Focus + UnFocus + + -40 + -40 + 231 + 140 + 951 + 953 + 1033 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + 308 + 0 + + Focus + UnFocus + + -40 + -40 + 231 + 140 + 952 + 3000 + 1036 + font12 + center + center + FF000000 + script.plex/white-square-rounded-with-shadow.png + - + + + + + + + Visible + !String.IsEmpty(Window.Property(searching)) + 0 + 993 + + false + 420 + 0 + 434 + 39 + font12 + right + center + FFFFFFFF + + + + 480 + 0 + + !String.IsEmpty(Window.Property(searching)) + Visible + 0 + 0 + 39 + 39 + script.plex/indicators/spinner.png + + + + + !String.IsEmpty(Window.Property(no.results)) + String.IsEmpty(Window.Property(searching)) + 0 + 993 + + false + 0 + 0 + 564 + 39 + font12 + center + center + FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2000 + 564 + 20 + 2130 + 5540 + 20 + vertical + true + 200 + + + 2100 + Integer.IsGreater(Container(2100).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2101 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2100) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2100) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2100 + 2102 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2101) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2101) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2102).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2101 + 2103 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2102) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2102) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2103).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2102 + 2104 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2103) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2103) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2104).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2103 + 2105 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2104) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2104) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2105).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2104 + 2106 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2105) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2105) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2106).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2105 + 2107 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2106) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2106) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2107).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2106 + 2108 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2107) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2107) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2108).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2107 + 2109 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2108) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2108) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2109).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2108 + 2110 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2109) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2109) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2110).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2109 + 2111 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2110) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2110) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2111).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2110 + 2112 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2111) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2111) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2112).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2111 + 2113 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2112) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2112) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2113).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2112 + 2114 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2113) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2113) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2114).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2113 + 2115 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2114) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2114) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2115).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2114 + 2116 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2115) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2115) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2116).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2115 + 2117 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2116) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2116) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2117).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2116 + 2118 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2117) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2117) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2118).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2117 + 2119 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2118) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2118) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2119).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2118 + 2120 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2119) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2119) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2120).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2119 + 2121 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2120) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2120) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2121).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2120 + 2122 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2121) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2121) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2122).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2121 + 2123 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2122) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2122) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2123).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2122 + 2124 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2123) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2123) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2124).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2123 + 2125 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2124) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2124) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2125).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2124 + 2126 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2125) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2125) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2126).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2125 + 2127 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2126) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2126) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2127).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2126 + 2128 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2127) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2127) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2128).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2127 + 2129 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2128) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2128) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2129).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2128 + 2130 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2129) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2129) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2130).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2129 + 2131 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2130) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2130) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2131).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2130 + 2132 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2131) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2131) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2132).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2131 + 2133 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2132) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2132) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2133).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2132 + 2134 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2133) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2133) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2134).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2133 + 2135 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2134) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2134) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2135).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2134 + 2136 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2135) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2135) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2136).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2135 + 2137 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2136) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2136) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2137).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2136 + 2138 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2137) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2137) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2138).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2137 + 2139 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2138) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2138) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2139).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2138 + 2140 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2139) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2139) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2140).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2139 + 2141 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2140) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2140) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2141).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2140 + 2142 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2141) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2141) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2142).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2141 + 2143 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2142) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2142) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2143).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2142 + 2144 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2143) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2143) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + Integer.IsGreater(Container(2144).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2143 + 2145 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2144) + -40 + -40 + 270 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 180 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 180 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 180 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2144) + 0 + 0 + 190 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2145).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2144 + 2146 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2145) + -40 + -40 + 360 + 360 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 270 + 270 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 270 + 270 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 280 + 270 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2145) + 0 + 0 + 280 + 280 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2146).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 320 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2145 + 2147 + 200 + horizontal + 4 + + + + 55 + 64 + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 64 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2146) + -40 + -40 + 390 + 259 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 300 + 169 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 300 + 169 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 179 + 300 + 35 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(2146) + 0 + 0 + 310 + 179 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(2147).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 1356 + 420 + + 60 + 0 + 1236 + 2 + script.plex/white-square.png + FF282828 + + + false + 60 + 0 + 1000 + 87 + font12 + left + center + FFFFFFFF + + + + 0 + 30 + 1356 + 440 + 899 + 2146 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(2147) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 254 + 244 + 35 + font10 + center + FFFFFFFF + + + + 0 + 282 + 244 + 35 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(2147) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + + \ No newline at end of file diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-seasons.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-seasons.xml new file mode 100644 index 000000000..c86327de0 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-seasons.xml @@ -0,0 +1,1361 @@ + + + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + Conditional + + + + + + + + + + + + + + 0 + 155 + 101 + + + VisibleChange + !String.IsEmpty(Window.Property(initialized)) + 302 + 440 + 445 + 1000 + 145 + 200 + 400 + -20 + horizontal + 200 + true + + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/info-focus.png + script.plex/buttons/info.png + + + + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + + 0 + 0 + 1920 + 600 + + 60 + 0 + 347 + 518 + script.plex/thumb_fallbacks/movie.png + WindowOpen + scale + + + 60 + 0 + 347 + 518 + $INFO[Window.Property(thumb)] + scale + + + + 466 + 0 + 1360 + 60 + font13 + left + FFFFFFFF + + + + 466 + 70 + 1360 + 30 + left + 0 + horizontal + true + + auto + 30 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Window.Property(rating.stars)) + auto + 30 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Window.Property(rating.stars)) + 4 + 134 + 22 + script.plex/stars/$INFO[Window.Property(rating.stars)].png + + + + + !String.IsEmpty(Window.Property(rating)) + 1660 + 70 + 200 + 32 + right + 15 + horizontal + true + + 2 + 63 + 30 + $INFO[Window.Property(rating.image)] + keep + + + auto + 30 + font12 + left + FFFFFFFF + + + + !String.IsEmpty(Window.Property(rating2)) + 2 + 63 + 30 + $INFO[Window.Property(rating2.image)] + keep + + + !String.IsEmpty(Window.Property(rating2)) + auto + 30 + font12 + left + FFFFFFFF + + + + + + + !String.IsEmpty(Window.Property(directors)) + 466 + 130 + 1360 + 30 + font12 + left + 99FFFFFF + + + + !String.IsEmpty(Window.Property(writers)) + 466 + 165 + 1360 + 30 + font12 + left + 99FFFFFF + + + + + 466 + 234 + 1360 + 179 + font12 + left + FFFFFFFF + + + + WindowOpen + -1 + 557 + 1 + 8 + script.plex/white-square.png + FFCC7B19 + + + !Control.IsVisible(500) + 0 + 565 + 1920 + 2 + script.plex/white-square.png + A0000000 + + + + + 0 + 565 + 1920 + 1600 + + 300 + 0 + + + Integer.IsGreater(Container(400).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 360 + 1920 + + 0 + 0 + 1920 + 360 + script.plex/white-square.png + 40000000 + + + 0 + 14 + 1920 + 430 + 300 + 401 + 200 + horizontal + 4 + + + + 55 + 29 + + 5 + 5 + + 0 + 0 + 158 + 236 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 158 + 236 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 113 + 0 + 45 + 40 + script.plex/white-square.png + FF000000 + + + 114 + 0 + 44 + 39 + script.plex/white-square.png + FFCC7B19 + + + 114 + 0 + 44 + 39 + font10 + center + center + FF000000 + + + + + false + 0 + 240 + 158 + 54 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 29 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(400) + -40 + -40 + 248 + 326 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 158 + 236 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 158 + 236 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 113 + 0 + 45 + 40 + script.plex/white-square.png + FF000000 + + + 114 + 0 + 44 + 39 + script.plex/white-square.png + FFCC7B19 + + + 114 + 0 + 44 + 39 + font10 + center + center + FF000000 + + + + + Control.HasFocus(400) + 0 + 240 + 158 + 54 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(400) + 0 + 0 + 168 + 246 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(401).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 360 + 1920 + + 60 + 0 + 800 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 18 + 1920 + 430 + 400 + 402 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + false + 0 + 175 + 299 + 60 + font12 + center + FFFFFFFF + + + + false + 0 + 210 + 299 + 60 + font12 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(401) + -40 + -40 + 389 + 258 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + + Control.HasFocus(401) + 0 + 175 + 299 + 60 + font12 + center + FFFFFFFF + + + + Control.HasFocus(401) + 0 + 210 + 299 + 60 + font12 + center + FFFFFFFF + + + + + + Control.HasFocus(401) + 0 + 0 + 309 + 178 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(402).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 402 + 1920 + 520 + + !String.IsEmpty(Window.Property(divider.402)) + 60 + 0 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 16 + 1920 + 520 + 401 + 403 + false + false + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 369 + 244 + 38 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(402) + -40 + -40 + 324 + 441 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + Control.HasFocus(402) + 0 + 369 + 244 + 38 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(402) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + + + + + + + Integer.IsGreater(Container(403).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 403 + 1920 + 410 + + !String.IsEmpty(Window.Property(divider.403)) + 60 + 20 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 20 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 36 + 1920 + 410 + 402 + 403 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + script.plex/thumb_fallbacks/role.png + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + 0 + 253 + 244 + 90 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(403) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + script.plex/thumb_fallbacks/role.png + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + 0 + 253 + 244 + 90 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(403) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + + + Conditional + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + !String.IsEmpty(Window.Property(on.extras)) + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-seek_dialog.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-seek_dialog.xml new file mode 100644 index 000000000..d85f26fc4 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-seek_dialog.xml @@ -0,0 +1,1106 @@ + + + + 1 + 0 + 0 + + 100 + 800 + + + [!String.IsEmpty(Window.Property(show.OSD)) | Window.IsVisible(seekbar) | !String.IsEmpty(Window.Property(button.seek))] + !Window.IsVisible(osdvideosettings) + !Window.IsVisible(osdaudiosettings) + !Window.IsVisible(osdsubtitlesettings) + !Window.IsVisible(subtitlesearch) + !Window.IsActive(playerprocessinfo) + !Window.IsActive(selectdialog) + Hidden + + String.IsEmpty(Window.Property(settings.visible)) + [Window.IsVisible(seekbar) | Window.IsVisible(videoosd) | Player.ShowInfo] + Hidden + 0 + 0 + + 0 + 0 + 1920 + 1080 + script.plex/player-fade.png + FF080808 + + + + + 0 + 0 + + 0 + 0 + 1920 + 140 + script.plex/white-square.png + A0000000 + + + 0 + 940 + 1920 + 140 + script.plex/white-square.png + A0000000 + + + + + 0 + 40 + + !String.IsEmpty(Window.Property(is.show)) + 60 + 0 + 1500 + 60 + font13 + left + center + FFFFFFFF + + + + String.IsEmpty(Window.Property(is.show)) + 60 + 0 + 1500 + 60 + font13 + left + center + FFFFFFFF + + + + 1860 + 0 + 300 + 60 + font12 + right + center + FFFFFFFF + + + + + + 0 + 965 + + !String.IsEmpty(Window.Property(direct.play)) + 60 + 0 + 1000 + 60 + font13 + left + center + FFFFFFFF + + + + String.IsEmpty(Window.Property(direct.play)) + 60 + 0 + 1000 + 60 + font13 + left + center + FFFFFFFF + + + + Player.IsTempo + 60 + 40 + 1000 + 60 + font13 + left + center + A0FFFFFF + + + + !String.IsEmpty(Window.Property(direct.play)) + 1860 + 0 + 800 + 60 + font13 + right + center + FFFFFFFF + + + + String.IsEmpty(Window.Property(direct.play)) + 1860 + 0 + 800 + 60 + font13 + right + center + FFFFFFFF + + + + !String.IsEmpty(Window.Property(media.show_ends)) + !String.IsEmpty(Window.Property(direct.play)) + 1860 + 40 + 800 + 60 + font13 + right + center + A0FFFFFF + + + + !String.IsEmpty(Window.Property(media.show_ends)) + String.IsEmpty(Window.Property(direct.play)) + 1860 + 40 + 800 + 60 + font13 + right + center + A0FFFFFF + + + + Player.Paused + String.IsEmpty(Window.Property(show.OSD)) + Visible + 0 + 20 + 1920 + 60 + font13 + center + center + FFCC7B19 + + + + + + 0 + 940 + + 0 + 0 + 1920 + 10 + script.plex/white-square.png + A0000000 + + + !String.IsEmpty(Window.Property(show.buffer)) + 0 + 2 + 1 + 6 + script.plex/white-square.png + EE4E4842 + + + 0 + 2 + 1 + 6 + script.plex/white-square.png + FFAC5B00 + + + Control.HasFocus(100) | !String.IsEmpty(Window.Property(button.seek)) + 0 + 2 + 1 + 6 + script.plex/white-square.png + FFE5A00D + + + + + String.IsEmpty(Window.Property(show.OSD)) + 0 + 0 + 1920 + 1080 + - + - + + SetProperty(show.OSD,1) + + + + + 0 + 350 + !String.IsEmpty(Window.Property(show.PPI)) + String.IsEmpty(Window.Property(settings.visible)) + String.IsEmpty(Window.Property(playlist.visible)) + Visible + Hidden + + 10 + -220 + 10 + 420 + buttons/dialogbutton-nofo.png + + + 52 + -184 + 1786 + 350 + horizontal + 10 + + 0 + 0 + 793 + + 793 + 50 + bottom + + font14 + black + Player.HasVideo + + + 793 + 50 + bottom + + font14 + black + Player.HasVideo + + + 793 + 50 + bottom + + font14 + black + Player.HasVideo + + + 793 + 50 + bottom + + font14 + black + Player.HasVideo + + + 793 + 50 + bottom + + + font14 + black + + + 793 + 50 + bottom + + font14 + black + + + + 0 + 0 + 993 + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + !String.IsEmpty(Window.Property(ppi.Status)) + + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + !String.IsEmpty(Window.Property(ppi.Mode)) + + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + !String.IsEmpty(Window.Property(ppi.Container)) + + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + !String.IsEmpty(Window.Property(ppi.Video)) + + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + !String.IsEmpty(Window.Property(ppi.Audio)) + + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + !String.IsEmpty(Window.Property(ppi.Subtitles)) + + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + !String.IsEmpty(Window.Property(ppi.User)) + + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + String.IsEmpty(Window.Property(ppi.Buffered)) + + + 893 + 50 + bottom + + font14 + black + Player.HasVideo + !String.IsEmpty(Window.Property(ppi.Buffered)) + + + + + 52 + 120 + 1786 + 50 + bottom + + font14 + black + + + + !String.IsEmpty(Window.Property(show.OSD)) + !Window.IsVisible(osdvideosettings) + !Window.IsVisible(osdaudiosettings) + !Window.IsVisible(osdsubtitlesettings) + !Window.IsVisible(subtitlesearch) + !Window.IsActive(playerprocessinfo) + !Window.IsActive(selectdialog) + Hidden + + !String.IsEmpty(Window.Property(has.bif)) + [Control.HasFocus(100) | Control.HasFocus(501) | !String.IsEmpty(Window.Property(button.seek))] + Visible + 0 + 752 + + 0 + 0 + 324 + 184 + script.plex/white-square.png + FF000000 + + + 2 + 2 + 320 + 180 + 10 + $INFO[Window.Property(bif.image)] + + + + + 406 + + 360 + 964 + 1200 + + 124 + center + 100 + -40 + horizontal + 200 + true + + !String.IsEmpty(Window.Property(nav.repeat)) + Conditional + Conditional + 125 + 101 + + + 0 + 0 + 125 + 101 + 100 + 402 + 412 + font12 + - + - + + + + !Control.HasFocus(401) + + !Playlist.IsRepeatOne + !Playlist.IsRepeat + String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat.png + + + Playlist.IsRepeat | !String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat.png + + + Playlist.IsRepeatOne | !String.IsEmpty(Window.Property(pq.repeat.one)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-one.png + + + + Control.HasFocus(401) + + !Playlist.IsRepeatOne + !Playlist.IsRepeat + String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-focus.png + + + Playlist.IsRepeat | !String.IsEmpty(Window.Property(pq.repeat)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-focus.png + + + Playlist.IsRepeatOne | !String.IsEmpty(Window.Property(pq.repeat.one)) + 0 + 0 + 125 + 101 + script.plex/buttons/repeat-one-focus.png + + + + + + !String.IsEmpty(Window.Property(has.playlist)) + !String.IsEmpty(Window.Property(nav.shuffle)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + !String.IsEmpty(Window.Property(pq.shuffled)) + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + false + String.IsEmpty(Window.Property(has.playlist)) + !String.IsEmpty(Window.Property(nav.shuffle)) + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/settings-focus.png + script.plex/buttons/settings.png + + + + + + !String.IsEmpty(Window.Property(pq.hasprev)) + !String.IsEmpty(Window.Property(nav.prevnext)) + Focus + UnFocus + + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + false + String.IsEmpty(Window.Property(pq.hasprev)) + !String.IsEmpty(Window.Property(nav.prevnext)) + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + !String.IsEmpty(Window.Property(nav.ffwdrwd)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/skip-forward-focus.png + script.plex/buttons/skip-forward.png + + + + + Conditional + Conditional + 125 + 101 + + + 0 + 0 + 125 + 101 + 100 + 407 + 405 + font12 + - + - + + PlayerControl(Play) + + + !Control.HasFocus(406) + + !Player.Paused + !Player.Forwarding + !Player.Rewinding + 0 + 0 + 125 + 101 + script.plex/buttons/pause.png + + + Player.Paused | Player.Forwarding | Player.Rewinding + 0 + 0 + 125 + 101 + script.plex/buttons/play.png + + + + Control.HasFocus(406) + + !Player.Paused + !Player.Forwarding + !Player.Rewinding + 0 + 0 + 125 + 101 + script.plex/buttons/pause-focus.png + + + Player.Paused | Player.Forwarding | Player.Rewinding + 0 + 0 + 125 + 101 + script.plex/buttons/play-focus.png + + + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/stop-focus.png + script.plex/buttons/stop.png + + + + !String.IsEmpty(Window.Property(nav.ffwdrwd)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/skip-forward-focus.png + script.plex/buttons/skip-forward.png + + + + !String.IsEmpty(Window.Property(pq.hasnext)) + !String.IsEmpty(Window.Property(nav.prevnext)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + false + String.IsEmpty(Window.Property(pq.hasnext)) + !String.IsEmpty(Window.Property(nav.prevnext)) + 0 + 0 + 125 + 101 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + + + + + + [!String.IsEmpty(Window.Property(pq.hasnext)) | !String.IsEmpty(Window.Property(pq.hasprev))] + !String.IsEmpty(Window.Property(nav.playlist)) + Focus + UnFocus + + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/pqueue-focus.png + script.plex/buttons/pqueue.png + + + + false + String.IsEmpty(Window.Property(pq.hasnext)) + String.IsEmpty(Window.Property(pq.hasprev)) + !String.IsEmpty(Window.Property(nav.playlist)) + Focus + UnFocus + + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/pqueue-focus.png + script.plex/buttons/pqueue.png + + + + !String.IsEmpty(Window.Property(nav.quick_subtitles)) + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/subtitle-focus.png + script.plex/buttons/subtitle.png + + + + + + 0 + 940 + + + 0 + 0 + 1920 + 10 + 501 + 400 + - + - + + + + + Conditional + + + Conditional + + + String.IsEmpty(Window.Property(mouse.mode)) + String.IsEmpty(Window.Property(hide.bigseek)) + [Control.HasFocus(501) | Control.HasFocus(100)] + [!String.IsEmpty(Window.Property(show.chapters)) | String.IsEmpty(Window.Property(has.chapters))] + -8 + 917 + + -200 + 5 + 2320 + 6 + script.plex/white-square.png + A0000000 + String.IsEmpty(Window.Property(has.chapters)) + + + + 0 + -175 + 1928 + 200 + script.plex/white-square.png + A0000000 + !String.IsEmpty(Window.Property(has.chapters)) + + + 40 + -162 + auto + 20 + font10 + left + center + CC606060 + + !String.IsEmpty(Window.Property(has.chapters)) + !Control.HasFocus(501) + + + 40 + -162 + auto + 20 + font10 + left + center + FFFFFFFF + + !String.IsEmpty(Window.Property(has.chapters)) + Control.HasFocus(501) + + + + + 0 + 0 + 1928 + 16 + 100 + SetProperty(hide.bigseek,) + 200 + horizontal + 4 + + + + 0 + 0 + 16 + 16 + script.plex/indicators/seek-selection-marker.png + FF606060 + + + + + + + !Control.HasFocus(501) + 0 + 0 + 16 + 16 + script.plex/indicators/seek-selection-marker.png + FF606060 + + + Control.HasFocus(501) + 0 + 0 + 16 + 16 + script.plex/indicators/seek-selection-marker.png + FFE5A00D + + + + + + + + 40 + 0 + 178 + 100 + script.plex/thumb_fallbacks/movie16x9.png + scale + CC606060 + !Control.HasFocus(501) + + + 40 + 0 + 178 + 100 + $INFO[ListItem.Thumb] + scale + DDAAAAAA + !Control.HasFocus(501) + + + 40 + 0 + 178 + 100 + script.plex/thumb_fallbacks/movie16x9.png + scale + FFAAAAAA + Control.HasFocus(501) + + + 40 + 0 + 178 + 100 + $INFO[ListItem.Thumb] + scale + FFAAAAAA + Control.HasFocus(501) + + + 40 + 120 + auto + 10 + font10 + center + center + CC606060 + + !Control.HasFocus(501) + + + 40 + 120 + auto + 10 + font10 + center + center + FFAAAAAA + + Control.HasFocus(501) + + + + + + + + + 40 + 0 + 178 + 100 + script.plex/thumb_fallbacks/movie16x9.png + scale + CC909090 + !Control.HasFocus(501) + + + 40 + 0 + 178 + 100 + $INFO[ListItem.Thumb] + scale + FFAAAAAA + !Control.HasFocus(501) + + + 40 + 0 + 178 + 100 + script.plex/thumb_fallbacks/movie16x9.png + scale + + Control.HasFocus(501) + + + 40 + 0 + 178 + 100 + $INFO[ListItem.Thumb] + scale + + Control.HasFocus(501) + + + 40 + 120 + auto + 10 + font10 + center + center + FFAAAAAA + + !Control.HasFocus(501) + + + 40 + 120 + auto + 10 + font10 + center + center + + + Control.HasFocus(501) + + + + + + + + Control.HasFocus(100) | Control.HasFocus(501) | !String.IsEmpty(Window.Property(button.seek)) + 0 + 896 + + -50 + 0 + + Visible + 0 + 0 + 101 + 39 + script.plex/indicators/player-selection-time_box.png + D0000000 + + + 0 + 0 + 101 + 40 + font10 + center + center + FFFFFFFF + + + + + Visible + -6 + 39 + 15 + 7 + script.plex/indicators/player-selection-time_arrow.png + D0000000 + + + + + + 30 + 797 + 1670 + 143 + right + horizontal + + [!String.IsEmpty(Window.Property(show.markerSkip)) + String.IsEmpty(Window.Property(show.markerSkip_OSDOnly))] | [!String.IsEmpty(Window.Property(show.markerSkip_OSDOnly)) + !String.IsEmpty(Window.Property(show.OSD))] + Focus + UnFocus + + + + auto + 143 + center + 0 + 0 + script.plex/buttons/blank-focus.png + script.plex/buttons/blank.png + 70 + FF000000 + FF000000 + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-settings.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-settings.xml new file mode 100644 index 000000000..3e2cdece4 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-settings.xml @@ -0,0 +1,684 @@ + + + 300 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + + Conditional + 0 + 0 + + + Conditional + + 843 + 135 + 1077 + 945 + script.plex/white-square.png + 32111111 + + + 0 + 810 + 1920 + 270 + script.plex/white-square.png + 32000000 + + + + 843 + 810 + 1077 + 270 + script.plex/white-square.png + 32111111 + + + Conditional + 1920 + 135 + 879 + 945 + script.plex/white-square.png + 66111111 + + + + + Control.HasFocus(100) | Control.HasFocus(125) + 903 + 870 + 1017 + 170 + font10 + FFFFFFFF + left + 200 + + + + + + 248 + 168 + 75 + + 0 + 0 + 590 + 666 + 201 + 100 + 200 + vertical + + + + 88 + 40 + + 0 + 0 + 414 + 75 + font12 + left + center + FFFFFFFF + + + + 0 + 75 + 414 + 2 + script.plex/white-square.png + 661F1F1F + + + + + + ControlGroup(50).HasFocus(0) + + 0 + 0 + 590 + 155 + script.plex/drop-shadow.png + + + Control.HasFocus(75) + 40 + 40 + 510 + 75 + script.plex/white-square-rounded.png + + + !Control.HasFocus(75) + 40 + 40 + 510 + 75 + script.plex/white-square-rounded.png + + + !Control.HasFocus(75) + 512 + 66 + 16 + 23 + script.plex/settings/expanded.png + FF000000 + + + 88 + 40 + 414 + 75 + font12 + left + center + FF000000 + + + + + !ControlGroup(50).HasFocus(0) + 88 + 40 + 414 + 75 + font12 + left + center + FFFFFFFF + + + + + + + Integer.IsGreater(Container(100).NumItems,0) + String.IsEmpty(Window.Property(section.about)) + 604 + 0 + 776 + 666 + 75 + 150 + 200 + vertical + 101 + + + + 88 + 40 + + 0 + 0 + 500 + 75 + font12 + left + center + FFFFFFFF + + + + 200 + 0 + 400 + true + 25 + 75 + font12 + right + center + FFFFFFFF + + + + 0 + 75 + 600 + 2 + script.plex/white-square.png + 661F1F1F + + + + 643 + 55 + + !String.IsEmpty(ListItem.Property(checkbox)) + 0 + 0 + 45 + 45 + script.plex/settings/checkbox.png + + + !String.IsEmpty(ListItem.Property(checkbox.checked)) + 0 + 0 + 45 + 45 + script.plex/settings/checkmark.png + + + + + + Control.HasFocus(100) | Control.HasFocus(125) + + 0 + 0 + 776 + 155 + script.plex/drop-shadow.png + + + !Control.HasFocus(125) + 40 + 40 + 696 + 75 + script.plex/white-square-rounded.png + + + Control.HasFocus(125) + 40 + 40 + 696 + 75 + script.plex/white-square-rounded.png + + + Control.HasFocus(125) + 698 + 66 + 16 + 23 + script.plex/settings/expanded.png + FF000000 + + + 88 + 40 + + 0 + 0 + 500 + 75 + font12 + left + center + FF000000 + + + + 200 + 0 + 400 + 75 + font12 + right + center + FF000000 + + + + + + !Control.HasFocus(100) + !Control.HasFocus(125) + 88 + 40 + + 0 + 0 + 400 + 75 + font12 + left + center + FFFFFFFF + + + + 200 + 0 + 400 + 75 + font12 + right + center + FFFFFFFF + + + + 0 + 75 + 600 + 2 + script.plex/white-square.png + 661F1F1F + + + + 643 + 55 + + !String.IsEmpty(ListItem.Property(checkbox)) + 0 + 0 + 45 + 45 + script.plex/settings/checkbox.png + + + !String.IsEmpty(ListItem.Property(checkbox.checked)) + 0 + 0 + 45 + 45 + script.plex/settings/checkmark.png + + + + + + + Control.IsVisible(100) + !Control.IsVisible(125) + 1388 + 40 + 9 + 525 + true + script.plex/white-square-rounded-4r.png + script.plex/white-square-rounded-4r.png + script.plex/white-square-rounded-4r.png + - + - + false + vertical + false + 151 + + + + Integer.IsGreater(Container(100).NumItems,0) + String.IsEmpty(Window.Property(section.about)) + 10 + 10 + 125 + 100 + font12 + FF000000 + - + - + + SetFocus(100) + + + + Control.HasFocus(125) + Integer.IsGreater(Container(100).NumItems,0) + Integer.IsGreater(Container(100).NumItems,0) + String.IsEmpty(Window.Property(section.about)) + + 1383 + 0 + 845 + 566 + 100 + 200 + vertical + 126 + + + + 88 + 40 + + 0 + 0 + 594 + 75 + font12 + left + center + FFFFFFFF + + + + 0 + 75 + 594 + 2 + script.plex/white-square.png + 661F1F1F + + + + 637 + 55 + + !String.IsEmpty(ListItem.Property(checkbox.checked)) + 0 + 0 + 45 + 45 + script.plex/settings/checkmark.png + + + + + + 0 + 0 + 610 + 155 + script.plex/drop-shadow.png + + + 40 + 40 + 690 + 75 + script.plex/white-square-rounded.png + + + 88 + 40 + + 0 + 0 + 594 + 75 + font12 + left + center + FF000000 + + + + + 637 + 55 + + !String.IsEmpty(ListItem.Property(checkbox.checked)) + 0 + 0 + 45 + 45 + script.plex/settings/checkmark.png + + + + + + + Control.IsVisible(125) + 2161 + 40 + 9 + 525 + true + script.plex/white-square-rounded-4r.png + script.plex/white-square-rounded-4r.png + script.plex/white-square-rounded-4r.png + - + - + false + vertical + false + 151 + + + + + + + + 201 + 0 + 0 + 1920 + 135 + + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 201 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-settings_select_dialog.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-settings_select_dialog.xml new file mode 100644 index 000000000..f619fa164 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-settings_select_dialog.xml @@ -0,0 +1,94 @@ + + + + 1 + 0 + 0 + + + + + 660 + 145 + + -40 + -40 + 680 + 870 + script.plex/drop-shadow.png + + + 0 + 0 + 600 + 80 + script.plex/white-square-top-rounded.png + F21F1F1F + + + 0 + 80 + 600 + 710 + script.plex/white-square-top-rounded.png + F2606060 + + + 0 + 0 + 600 + 80 + font12 + center + center + FFFFFFFF + + + + 0 + 80 + 600 + 700 + noop + noop + 200 + vertical + + + + 20 + 0 + 560 + 100 + font12 + left + center + FFFFFFFF + + + + + + 0 + 0 + 600 + 100 + script.plex/white-square.png + + + 20 + 0 + 560 + 100 + font12 + left + center + FF000000 + + + + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-signin_background.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-signin_background.xml new file mode 100644 index 000000000..4747d5473 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-signin_background.xml @@ -0,0 +1,21 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + 0 + 0 + 1920 + 1080 + script.plex/sign_in/back.jpg + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-signin_blank.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-signin_blank.xml new file mode 100644 index 000000000..91e3fae5e --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-signin_blank.xml @@ -0,0 +1,49 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + 0 + 0 + 1920 + 1080 + script.plex/sign_in/back.jpg + + + + 210 + 375 + 1502 + 530 + font13 + FFFFFFFF + left + + + + + 0 + 0 + 1920 + 1080 + font20 + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-slideshow.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-slideshow.xml new file mode 100644 index 000000000..869b7255b --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-slideshow.xml @@ -0,0 +1,63 @@ + + 6 + + + + 0 + 0 + 1920 + 1080 + + keep + 1000 + $INFO[Window.Property(thumb)] + + + 20 + 20 + 100 + 1880 + + String.IsEqual(Window.Property(align),0) + 0 + 50 + font45 + left + FFFFFFFF + FF000000 + + + + String.IsEqual(Window.Property(align),0) + 50 + 20 + font13 + left + FFFFFFFF + FF000000 + + + + String.IsEqual(Window.Property(align),1) + 0 + 50 + font45 + right + FFFFFFFF + FF000000 + + + + String.IsEqual(Window.Property(align),1) + 50 + 20 + font13 + right + FFFFFFFF + FF000000 + + + + + + \ No newline at end of file diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-squares.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-squares.xml new file mode 100644 index 000000000..eac7b3e1d --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-squares.xml @@ -0,0 +1,769 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + + Conditional + Conditional + 0 + 135 + 101 + + + VisibleChange + !Integer.IsGreater(Container(101).ListItem.Property(index),5) + String.IsEmpty(Window.Property(no.content)) + String.IsEmpty(Window.Property(no.content.filtered)) + !String.IsEmpty(Window.Property(initialized)) + 301 + 30 + -25 + 1000 + 145 + 200 + 101 + -20 + horizontal + 200 + true + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + + + + + !String.IsEqual(Window(10000).Property(script.plex.item.type),collection) | String.IsEqual(Window.Property(media),collection) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/shuffle-focus.png + script.plex/buttons/shuffle.png + + + + + String.IsEmpty(Window.Property(no.options)) | Player.HasAudio + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/more-focus.png + script.plex/buttons/more.png + + + + + String.IsEmpty(Window.Property(hide.filteroptions)) + Focus + UnFocus + 0 + 0 + 126 + 100 + font12 + script.plex/buttons/chapters-focus.png + script.plex/buttons/chapters.png + + + + + + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 101 + 0 + 0 + 1920 + 1080 + + + 0 + 0 + 1800 + 1280 + 300 + 151 + 200 + vertical + 2 + 152 + + + + 55 + 97 + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 244 + 244 + 40 + script.plex/white-square.png + 80000000 + + + false + 0 + 260 + 244 + 40 + font10 + center + center + FFFFFFFF + + + + + + + + + + 55 + 97 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(101) + + String.IsEmpty(ListItem.Property(is.folder)) + -40 + -40 + 334 + 334 + script.plex/drop-shadow.png + + + !String.IsEmpty(ListItem.Property(is.folder)) + -40 + -40 + 334 + 374 + script.plex/drop-shadow.png + + + + 5 + 5 + + 0 + 0 + 244 + 244 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 244 + 244 + 40 + script.plex/white-square.png + 80000000 + + + Control.HasFocus(101) + 0 + 260 + 244 + 40 + font10 + center + center + FFFFFFFF + + + + + Control.HasFocus(101) + + String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 254 + 254 + script.plex/home/selected.png + + + !String.IsEmpty(ListItem.Property(is.folder)) + 0 + 0 + 254 + 294 + script.plex/home/selected.png + + + + + + + + + + + String.IsEqual(Window(10000).Property(script.plex.sort),titleSort) + Integer.IsGreater(Container(101).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 151 + 1780 + 150 + 20 + 920 + + 0 + 0 + 34 + 1050 + 100 + 152 + 200 + vertical + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + + + + + 0 + 0 + + 0 + 0 + + !String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(letter)) + 0 + 0 + 34 + 32 + font10 + center + center + 99FFFFFF + + + + String.IsEqual(Window(10000).Property(script.plex.key), ListItem.Property(key)) + 0 + 0 + 34 + 32 + font10 + center + center + FFE5A00D + + + + + + Control.HasFocus(151) + 0 + 0 + + Control.HasFocus(151) + 0 + 0 + 34 + 34 + FFE5A00D + script.plex/white-outline-rounded.png + + + + + + + + + + 1860 + 150 + 12 + 910 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + Conditional + 201 + 0 + 0 + 1920 + 135 + !String.IsEmpty(Window.Property(initialized)) + + VisibleChange + ControlGroup(200).HasFocus(0) + Integer.IsGreater(Container(101).ListItem.Property(index),5) + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 211 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + String.IsEmpty(Window.Property(hide.filteroptions)) + 340 + 35 + 1000 + 65 + right + 30 + horizontal + 204 + 210 + 50 + + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + !String.IsEqual(Window.Property(media),artist) + false + auto + 65 + font12 + FFFFFFFF + FFFFFFFF + FFFFFFFF + center + center + - + - + 20 + 0 + + + + String.IsEqual(Window.Property(media),artist) + auto + 65 + font12 + FFFFFFFF + FF000000 + FFFFFFFF + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + auto + 65 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square-rounded.png + - + 20 + 0 + + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(no.content)) + 0 + 465 + + false + 60 + 0 + 1800 + 35 + font13 + center + FFFFFFFF + + + + false + 60 + 60 + 1800 + 35 + font13 + center + FFCCCCCC + + + + + + !String.IsEmpty(Window.Property(no.content.filtered)) + 0 + 465 + + false + 60 + 0 + 1800 + 35 + font13 + center + FFFFFFFF + + + + false + 60 + 60 + 1800 + 35 + font13 + center + FFCCCCCC + + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-track_context.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-track_context.xml new file mode 100644 index 000000000..1597a7053 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-track_context.xml @@ -0,0 +1,67 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 236 + 131 + 638 + 638 + $INFO[Window.Property(track.thumb)] + + + + 236 + 131 + 1502 + 530 + font13 + FFFFFFFF + left + + + + + VisibleChange + 301 + 965 + 131 + 750 + 638 + 30 + vertical + 200 + + 30 + 30 + 1920 + 1080 + font20 + FFFFFFFF + FFFFFFFF + center + center + - + - + 0 + 0 + + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-user_select.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-user_select.xml new file mode 100644 index 000000000..143893c08 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-user_select.xml @@ -0,0 +1,901 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour_opaque)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + + + Conditional + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 441 + 780 + + + 0 + 0 + 225 + 225 + $INFO[Player.Art(thumb)] + + + + 255 + 0 + + 0 + 0 + 783 + 40 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 0 + 40 + 783 + 40 + font10 + left + center + FFFFFFFF + MusicPlayer.Album + + + 0 + 80 + 783 + 40 + font10 + left + center + FFFFFFFF + + + + + + 406 + + 255 + 134 + 783 + 124 + center + 101 + -40 + horizontal + 200 + true + + + MusicPlayer.HasPrevious + Focus + UnFocus + + 30 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + PlayerControl(Previous) + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/pause-focus.png + script.plex/buttons/pause.png + Player.Paused | Player.Forwarding | Player.Rewinding + script.plex/buttons/play-focus.png + script.plex/buttons/play.png + PlayerControl(Play) + + + + MusicPlayer.HasNext + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/next-focus.png + script.plex/buttons/next.png + PlayerControl(Next) + + + + Focus + UnFocus + + 0 + 0 + 125 + 101 + font12 + script.plex/buttons/stop-focus.png + script.plex/buttons/stop.png + PlayerControl(Stop) + + + + + + 255 + 177 + 783 + 40 + font10 + left + center + FFFFFFFF + MusicPlayer.Time + + + 1038 + 177 + 783 + 40 + font10 + right + center + FFFFFFFF + MusicPlayer.TimeRemaining + + + + + Progressbar + 255 + 222 + 783 + 3 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + + ControlGroup(400).HasFocus(0) + 770 + 275 + 380 + 695 + script.plex/drop-shadow.png + + + + 0 + 315 + 101 + + + -180 + -40 + 2100 + 455 + 200 + 500 + 600 + 400 + horizontal + 3 + + + + + + 0 + 40 + 300 + 300 + + 0 + 0 + $INFO[ListItem.Property(back.image)] + FFA0A0A0 + + + + 45 + 45 + 210 + 210 + script.plex/user_select/avatar-background.png + E0C0C0C0 + + + 54 + 54 + 192 + 192 + $INFO[ListItem.Thumb] + + + String.IsEmpty(ListItem.Thumb) + 54 + 54 + 192 + 192 + WeatherTemp + center + center + FFFFFFFF + + + + + !String.IsEmpty(ListItem.Property(protected)) + 15 + 231 + + 0 + 0 + 54 + 54 + script.plex/user_select/protected-back.png + A0000000 + + + 0 + 0 + 54 + 54 + script.plex/user_select/protected-icon.png + + + + + !String.IsEmpty(ListItem.Property(admin)) + 231 + 231 + + 0 + 0 + 54 + 54 + script.plex/user_select/admin-back.png + A0000000 + + + 0 + 0 + 54 + 54 + script.plex/user_select/admin-icon.png + + + + + + + + + + + 0 + 40 + + Control.HasFocus(101) + -40 + -40 + 380 + 455 + script.plex/drop-shadow.png + + + Control.HasFocus(101) | ControlGroup(400).HasFocus(0) + 0 + 0 + 300 + 300 + $INFO[ListItem.Property(back.image)] + FFA0A0A0 + + + !Control.HasFocus(101) + !ControlGroup(400).HasFocus(0) + 0 + 0 + 300 + 300 + $INFO[ListItem.Property(back.image)] + FFA0A0A0 + + + Control.HasFocus(101) + + 0 + 300 + 300 + 75 + script.plex/user_select/item-background-bottom.png + FF000000 + + + 0 + 300 + 300 + 75 + $INFO[ListItem.Property(back.image)] + stretch + 40FFFFFF + + + + + !Control.HasFocus(101) + !ControlGroup(400).HasFocus(0) + 45 + 45 + 210 + 210 + script.plex/user_select/avatar-background.png + E0C0C0C0 + + + ControlGroup(400).HasFocus(0) + 45 + 45 + 210 + 210 + script.plex/user_select/avatar-background.png + FFCC7B19 + + + Control.HasFocus(101) + 45 + 45 + 210 + 210 + script.plex/user_select/avatar-background.png + FFE5A00D + + + + 54 + 54 + 192 + 192 + $INFO[ListItem.Thumb] + + + String.IsEmpty(ListItem.Thumb) + 54 + 54 + 192 + 192 + WeatherTemp + center + center + FFFFFFFF + + + + + !String.IsEmpty(ListItem.Property(protected)) + 15 + 231 + + 0 + 0 + 54 + 54 + script.plex/user_select/protected-back.png + A0000000 + + + 0 + 0 + 54 + 54 + script.plex/user_select/protected-icon.png + + + + + !String.IsEmpty(ListItem.Property(admin)) + 231 + 231 + + 0 + 0 + 54 + 54 + script.plex/user_select/admin-back.png + A0000000 + + + 0 + 0 + 54 + 54 + script.plex/user_select/admin-icon.png + + + + + Control.HasFocus(101) + 10 + 300 + 280 + 75 + font13 + center + center + FFCC7B19 + + + + + + + + + 205 + !String.IsEmpty(Container(101).ListItem.Property(protected)) + ControlGroup(400).HasFocus(0) + !String.IsEmpty(Window.Property(initialized)) + 810 + 375 + + 0 + 0 + 300 + 239 + 400 + 400 + 400 + 400 + - + - + + + + 0 + -75 + 300 + 75 + script.plex/white-square.png + FF000000 + + + 0 + -75 + 300 + 75 + $INFO[Container(101).ListItem.Property(back.image)] + 40FFFFFF + + + String.IsEmpty(Container(101).ListItem.Property(editing.pin)) + 0 + -75 + 300 + 75 + font13 + center + center + FFCC7B19 + + + + !String.IsEmpty(Container(101).ListItem.Property(editing.pin)) + 0 + -75 + 300 + 75 + font13 + center + center + FFCC7B19 + + + + 0 + 0 + 300 + 239 + script.plex/white-square.png + FF000000 + + + 205 + + 205 + + 0 + 0 + 73 + 58 + 202 + 101 + 204 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + 75 + 0 + 73 + 58 + 203 + 201 + 101 + 205 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + 150 + 0 + 73 + 58 + 211 + 202 + 101 + 206 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + 0 + 60 + 73 + 58 + 205 + 207 + 201 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + 75 + 60 + 73 + 58 + 206 + 204 + 208 + 202 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + 150 + 60 + 73 + 58 + 211 + 205 + 209 + 203 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + 0 + 120 + 73 + 58 + 208 + 210 + 204 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + 75 + 120 + 73 + 58 + 209 + 207 + 210 + 205 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + 150 + 120 + 73 + 58 + 211 + 208 + 210 + 206 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + + 0 + 180 + 223 + 59 + 211 + 200 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/white-square.png + script.plex/white-square.png + 0 + 0 + + + + + 225 + 0 + 75 + 239 + 300 + 101 + font12 + FFFFFFFF + FF000000 + center + center + script.plex/user_select/backspace.png + script.plex/user_select/backspace_nf.png + 0 + 0 + + + + + + + + 201 + 0 + 0 + 1920 + 135 + + 0 + 0 + 1920 + 135 + script.plex/white-square.png + 19000000 + + + + 60 + 34.5 + 1000 + 66 + left + 60 + horizontal + 101 + true + + 0 + 0 + 124 + 66 + + 0 + 0 + 124 + 66 + 101 + 101 + right + center + script.plex/white-square-rounded.png + - + + + + !String.IsEmpty(Window.Property(dropdown)) + 0 + 0 + 124 + 66 + script.plex/white-square-rounded.png + + + 27 + 13 + + !Control.HasFocus(500) + String.IsEmpty(Window.Property(dropdown)) + 0 + 0 + + 0 + 0 + 40 + 40 + script.plex/buttons/power.png + + + 55 + 13.5 + 15 + 13 + script.plex/indicators/dropdown-triangle.png + + + + Control.HasFocus(500) | !String.IsEmpty(Window.Property(dropdown)) + 0 + 0 + + 0 + 0 + 40 + 40 + script.plex/buttons/power.png + + + 55 + 13.5 + 15 + 13 + script.plex/indicators/dropdown-triangle.png + + + + + + -27 + 0 + auto + 66 + font12 + left + center + FFFFFFFF + + + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(busy)) + Visible + + 840 + 465 + 240 + 150 + script.plex/busy-back.png + A0FFFFFF + + + 915 + 521 + 90 + 38 + script.plex/busy.gif + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-video_current_playlist.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-video_current_playlist.xml new file mode 100644 index 000000000..796140288 --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-video_current_playlist.xml @@ -0,0 +1,480 @@ + + + 100 + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + + + 101 + 750 + 140 + 1170 + 800 + + 0 + 0 + 1170 + 800 + script.plex/white-square.png + B3111111 + + + 0 + 0 + 1170 + 800 + 200 + 152 + 300 + 200 + vertical + 4 + 152 + + + + 120 + 24 + + String.IsEmpty(ListItem.Property(playing)) + -10 + 0 + 60 + 100 + font10 + center + center + D8FFFFFF + + + + !String.IsEmpty(ListItem.Property(playing)) + 2 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FFE5A00D + + + String.IsEmpty(ListItem.Property(video)) + + 63 + 11 + 74 + 74 + $INFO[ListItem.Thumb] + scale + + + 168 + 0 + + 0 + 15 + 692 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 692 + 30 + font10 + left + center + B8FFFFFF + + + + + + !String.IsEmpty(ListItem.Property(video)) + + 63 + 11 + 132 + 74 + $INFO[ListItem.Thumb] + scale + + + String.IsEmpty(ListItem.Property(watched)) + 895 + -1 + 35 + 35 + script.plex/indicators/unwatched.png + + + 226 + 0 + + 0 + 15 + 584 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 584 + 30 + font10 + left + center + B8FFFFFF + + + + + + 730 + 0 + 200 + 100 + font10 + right + center + D8FFFFFF + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 98 + 930 + 2 + script.plex/white-square.png + 40000000 + + + + + + + + + !Control.HasFocus(101) + 120 + 24 + + String.IsEmpty(ListItem.Property(playing)) + -10 + 0 + 60 + 100 + font10 + center + center + D8FFFFFF + + + + !String.IsEmpty(ListItem.Property(playing)) + 0 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FFE5A00D + + + String.IsEmpty(ListItem.Property(video)) + + 63 + 11 + 74 + 74 + $INFO[ListItem.Thumb] + scale + + + 168 + 0 + + 0 + 15 + 692 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 692 + 30 + font10 + left + center + B8FFFFFF + + + + + + !String.IsEmpty(ListItem.Property(video)) + + 63 + 11 + 132 + 74 + $INFO[ListItem.Thumb] + scale + + + String.IsEmpty(ListItem.Property(watched)) + 895 + -1 + 35 + 35 + script.plex/indicators/unwatched.png + + + 226 + 0 + + 0 + 15 + 584 + 30 + font10 + left + center + FFFFFFFF + + + + 0 + 50 + 584 + 30 + font10 + left + center + B8FFFFFF + + + + + + 756 + 0 + 200 + 100 + font10 + right + center + D8FFFFFF + + + + String.IsEmpty(ListItem.Property(is.footer)) + 0 + 97 + 930 + 2 + script.plex/white-square.png + 40000000 + + + + + Control.HasFocus(101) + 63 + 21 + + -40 + -40 + 1124 + 180 + script.plex/square-rounded-shadow.png + + + 0 + 0 + 1044 + 100 + script.plex/white-square-rounded.png + FFE5A00D + + + + + String.IsEmpty(ListItem.Property(playing)) + 24 + 0 + 60 + 100 + font12 + center + center + B8000000 + + + + !String.IsEmpty(ListItem.Property(playing)) + 36 + 32.5 + 35 + 35 + script.plex/indicators/playing-circle.png + FF000000 + + + String.IsEmpty(ListItem.Property(video)) + + String.IsEmpty(ListItem.Property(video)) + 103 + 0 + 100 + 100 + $INFO[ListItem.Thumb] + scale + + + 235 + 0 + + 0 + 16 + 638 + 30 + font12 + left + center + DF000000 + + + + 0 + 51 + 638 + 30 + font10 + left + center + 98000000 + + + + + + !String.IsEmpty(ListItem.Property(video)) + + 103 + 0 + 178 + 100 + $INFO[ListItem.Thumb] + scale + + + String.IsEmpty(ListItem.Property(watched)) + 951 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + 313 + 0 + + 0 + 16 + 510 + 30 + font12 + left + center + DF000000 + + + + 0 + 51 + 510 + 30 + font10 + left + center + 98000000 + + + + + + 802 + 0 + 200 + 100 + font12 + right + center + B8000000 + + + + + + + + + + + 1128 + 33 + 10 + 734 + 101 + true + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + script.plex/white-square-rounded.png + - + - + false + vertical + false + 151 + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-video_player.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-video_player.xml new file mode 100644 index 000000000..12d2f4f3b --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-video_player.xml @@ -0,0 +1,1343 @@ + + + + 1 + 0 + 0 + + $INFO[Window.Property(background_colour)] + + + String.IsEmpty(Window.Property(use_solid_background)) + + !String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background_static)] + + + String.IsEmpty(Window.Property(use_bg_fallback)) + 0 + 0 + 1920 + 1080 + 1000 + $INFO[Window.Property(background)] + + + + !String.IsEmpty(Window.Property(post.play)) + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(post.play.background)] + + + + + Conditional + + + + + + + + + + 0 + 135 + 102 + + + 60 + 0 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + + false + 60 + 57 + 462 + 40 + font12 + left + center + A0FFFFFF + + + + + 102 + + 0 + 0 + 1920 + 580 + + 60 + 131 + + Conditional + 0 + 0 + + Control.HasFocus(101) + -45 + -45 + 552 + 349 + script.plex/drop-shadow.png + + + 0 + 0 + + 0 + 0 + 462 + 259 + $INFO[Window.Property(thumb.fallback)] + scale + + + 0 + 0 + 462 + 259 + $INFO[Window.Property(prev.thumb)] + scale + + + 193 + 91.5 + + 0 + 0 + 76 + 76 + script.plex/indicators/circle-152.png + + + 15 + 15 + 46 + 46 + script.plex/indicators/replay.png + + + + false + 0 + 269 + 462 + 35 + font10 + center + FFFFFFFF + + + + false + 0 + 301 + 462 + 35 + font10 + center + FFFFFFFF + + + + + -5 + -5 + 472 + 269 + 200 + 400 + 102 + script.plex/home/selected.png + - + + + + + + !String.IsEmpty(Window.Property(has.next)) + + false + 572 + 57 + 462 + 40 + font12 + left + center + FFFFFFFF + + + + 582 + 131 + + Conditional + 0 + 0 + + Control.HasFocus(102) + -45 + -45 + 627 + 393 + script.plex/drop-shadow.png + + + 0 + 0 + + 0 + 0 + 537 + 303 + $INFO[Window.Property(thumb.fallback)] + scale + + + 0 + 0 + 537 + 303 + $INFO[Window.Property(next.thumb)] + scale + + + !String.IsEmpty(Window.Property(countdown)) + Integer.IsGreaterOrEqual(Window.Property(countdown), 0) + 192.5 + 75.5 + + 0 + 0 + 152 + 152 + script.plex/indicators/circle-152.png + + + 8 + 8 + 136 + 136 + script.plex/circle-progress/$INFO[Window.Property(countdown)].png + + + 59.5 + 57 + 33 + 38 + script.plex/indicators/pause.png + + + + false + 0 + 313 + 537 + 30 + font10 + center + FFFFFFFF + + + + false + 0 + 345 + 537 + 30 + font10 + center + FFFFFFFF + + + + + -5 + -5 + 547 + 313 + 200 + 400 + 101 + script.plex/home/selected.png + - + + + + + + + + !String.IsEmpty(Window.Property(has.next)) + + false + 1177 + 131 + 683 + 43 + font13 + left + center + FFFFFFFF + + + + false + 1177 + 189 + 683 + 32 + font12 + left + center + A0FFFFFF + + + + false + 1177 + 300 + 683 + 215 + font12 + left + FFFFFFFF + + + + + + String.IsEmpty(Window.Property(has.next)) + + false + 580 + 131 + 1280 + 43 + font13 + left + center + FFFFFFFF + + + + false + 580 + 189 + 1280 + 32 + font12 + left + center + A0FFFFFF + + + + false + 580 + 300 + 1280 + 225 + font12 + left + FFFFFFFF + + + + + + + 0 + 585 + 1920 + 1610 + + 300 + 0 + + + Integer.IsGreater(Container(400).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 360 + 1920 + + 0 + 0 + 1920 + 360 + script.plex/white-square.png + 40000000 + + + 60 + 0 + 800 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 18 + 1920 + 430 + 100 + 401 + false + false + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 158 + + 0 + 0 + 299 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 299 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 264 + 0 + 35 + 35 + script.plex/indicators/unwatched.png + + + false + 0 + 180 + 299 + 35 + font10 + center + FFFFFFFF + + + + false + 0 + 212 + 299 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 299 + 168 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 119 + 34 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 119 + 34 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 85.5 + 20 + 128 + 128 + script.plex/home/busy.gif + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(400) + -40 + -40 + 389 + 258 + script.plex/drop-shadow.png + + + 5 + 5 + + 0 + 0 + 299 + 168 + $INFO[ListItem.Property(thumb.fallback)] + scale + + + 0 + 0 + 299 + 168 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 158 + + 0 + 0 + 299 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 299 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 264 + 0 + 35 + 35 + script.plex/indicators/unwatched.png + + + false + 0 + 180 + 299 + 35 + font10 + center + FFFFFFFF + + + + false + 0 + 212 + 299 + 35 + font10 + center + FFFFFFFF + + + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 299 + 168 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 119 + 34 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 119 + 34 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 85.5 + 20 + 128 + 128 + script.plex/home/busy.gif + + + + + Control.HasFocus(400) + 0 + 0 + 309 + 178 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(401).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 401 + 1920 + 520 + + !String.IsEmpty(Window.Property(divider.401)) + 60 + 0 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 0 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 16 + 1920 + 520 + 400 + 403 + false + false + 200 + horizontal + 4 + + + + 55 + 72 + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 369 + 244 + 38 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 72 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(401) + -40 + -40 + 324 + 441 + script.plex/drop-shadow.png + + + 5 + 5 + + !String.IsEmpty(ListItem.Property(is.boundary)) + + 0 + 0 + 244 + 361 + script.plex/white-square.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(right.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white.png + + + String.IsEmpty(ListItem.Property(is.updating)) + !String.IsEmpty(ListItem.Property(left.boundary)) + 91.5 + 130.5 + 61 + 100 + script.plex/indicators/chevron-white-l.png + + + !String.IsEmpty(ListItem.Property(is.updating)) + 58 + 116.5 + 128 + 128 + script.plex/home/busy.gif + + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Property(thumb.fallback)] + + + 0 + 0 + 244 + 361 + $INFO[ListItem.Thumb] + scale + + + !String.IsEmpty(ListItem.Property(progress)) + 0 + 351 + + 0 + 0 + 244 + 10 + script.plex/white-square.png + C0000000 + + + 0 + 1 + 244 + 8 + $INFO[ListItem.Property(progress)] + FFCC7B19 + + + + !String.IsEmpty(ListItem.Property(unwatched)) + 196 + 0 + 48 + 48 + script.plex/indicators/unwatched.png + + + !String.IsEmpty(ListItem.Property(unwatched.count)) + + 193 + 0 + 51 + 39 + script.plex/white-square.png + FF000000 + + + 194 + 0 + 50 + 38 + script.plex/white-square.png + FFCC7B19 + + + 194 + 0 + 50 + 38 + font12 + center + center + FF000000 + + + + + false + 0 + 369 + 244 + 38 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(401) + 0 + 0 + 254 + 371 + script.plex/home/selected.png + + + + + + + + + Integer.IsGreater(Container(403).NumItems,0) + String.IsEmpty(Window.Property(drawing)) + 403 + 1920 + 410 + + !String.IsEmpty(Window.Property(divider.403)) + 60 + 20 + 1800 + 2 + script.plex/white-square.png + A0000000 + + + 60 + 20 + 1000 + 80 + font12 + left + center + FFFFFFFF + + + + 0 + 36 + 1920 + 410 + 401 + 404 + 200 + horizontal + 4 + + + + 55 + 61 + + 5 + 5 + + 0 + 0 + 244 + 244 + script.plex/thumb_fallbacks/role.png + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + 0 + 253 + 244 + 90 + font10 + center + FFFFFFFF + + + + + + + + + + 55 + 61 + + Focus + UnFocus + 0 + 0 + + Control.HasFocus(403) + -40 + -40 + 334 + 334 + script.plex/buttons/role-shadow.png + + + 5 + 5 + + 0 + 0 + 244 + 244 + script.plex/thumb_fallbacks/role.png + + + 0 + 0 + 244 + 244 + $INFO[ListItem.Thumb] + scale + + + 0 + 253 + 244 + 90 + font10 + center + FFFFFFFF + + + + + Control.HasFocus(403) + 0 + 0 + 254 + 254 + script.plex/buttons/role-selected.png + + + + + + + + + + + Conditional + 201 + 0 + 0 + 1920 + 135 + + VisibleChange + ControlGroup(200).HasFocus(0) + !String.IsEmpty(Window.Property(on.extras)) + 0 + 0 + 1920 + 135 + script.plex/white-square.png + C0000000 + + + 60 + 47.5 + 1000 + 40 + left + 60 + horizontal + 50 + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 202 + 50 + font12 + FF000000 + script.plex/buttons/home-focus.png + script.plex/buttons/home.png + + + + + auto + 40 + font12 + left + center + FFFFFFFF + + + + 40 + 40 + + Focus + UnFocus + 40 + 40 + 204 + 201 + 50 + font12 + FF000000 + script.plex/buttons/search-focus.png + script.plex/buttons/search.png + + + + + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + 438 + 0 + + Player.HasAudio + String.IsEmpty(Window(10000).Property(script.plex.theme_playing)) + -10 + 38 + 260 + 75 + 202 + 50 + font12 + FFFFFFFF + FF000000 + right + center + script.plex/white-square-rounded.png + - + 100 + 0 + + + + 0 + 48 + 42 + 42 + $INFO[Player.Art(thumb)] + + + + !Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FFFFFFFF + MusicPlayer.Title + + + + Control.HasFocus(204) + + 53 + 48 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Artist + + + 53 + 72 + 187 + 20 + font10 + left + center + FF000000 + MusicPlayer.Title + + + + + Progressbar + 0 + 102 + 240 + 1 + script.plex/white-square-1px.png + - + script.plex/white-square-1px.png + - + - + Player.Progress + + + + 213 + 35 + 200 + 65 + font12 + right + center + FFFFFFFF + + + + 153r + 54 + 93 + 30 + script.plex/home/plex.png + + + + + !String.IsEmpty(Window.Property(search.dialog)) + + !String.IsEmpty(Window.Property(search.dialog.hasresults)) + + 0 + 0 + 1920 + 1080 + script.plex/home/background-fallback.png + + + 0 + 0 + 1920 + 1080 + $INFO[Window.Property(background)] + + + + 0 + 0 + 1920 + 1080 + script.plex/white-square.png + + + + + diff --git a/script.plexmod/resources/skins/Main/1080i/script-plex-video_settings_dialog.xml b/script.plexmod/resources/skins/Main/1080i/script-plex-video_settings_dialog.xml new file mode 100644 index 000000000..4bf41907b --- /dev/null +++ b/script.plexmod/resources/skins/Main/1080i/script-plex-video_settings_dialog.xml @@ -0,0 +1,159 @@ + + + + 1 + 0 + 0 + + + + + !String.IsEmpty(Window.Property(via.OSD)) + Hidden + 0 + 0 + + 0 + 0 + 1920 + 1080 + script.plex/player-fade.png + FF080808 + + + + !Window.IsVisible(sliderdialog) + !Window.IsVisible(osdvideosettings) + !Window.IsVisible(osdaudiosettings) + !Window.IsVisible(osdsubtitlesettings) + !Window.IsVisible(subtitlesearch) + 460 + 200 + + -40 + -40 + 1080 + 770 + script.plex/drop-shadow.png + + + 0 + 0 + 1000 + 80 + script.plex/white-square-top-rounded.png + F21F1F1F + + + 0 + 80 + 1000 + 610 + script.plex/white-square-top-rounded.png + F2606060 + + + 0 + 80 + 400 + 610 + script.plex/white-square-tl-rounded.png + 30000000 + + + 0 + 0 + 1000 + 80 + font12 + center + center + FFFFFFFF + + + + 0 + 80 + 990 + 600 + noop + noop + 200 + vertical + 101 + 101 + + + + 20 + 0 + 300 + 100 + font12 + left + center + FFFFFFFF + + + + 320 + 0 + 650 + 100 + font12 + right + center + FFFFFFFF + + + + + + 0 + 0 + 1000 + 100 + script.plex/white-square.png + + + 20 + 0 + 300 + 100 + font12 + left + center + FF000000 + + + + 320 + 0 + 650 + 100 + font12 + right + center + FF000000 + + + + + + + + 1450 + 280 + 10 + 600 + 101 + true + script.plex/white-square.png + script.plex/white-square.png + script.plex/white-square.png + - + - + false + vertical + false + 100 + + + + diff --git a/script.plexmod/resources/skins/Main/media/script.plex/busy-back.png b/script.plexmod/resources/skins/Main/media/script.plex/busy-back.png new file mode 100644 index 0000000000000000000000000000000000000000..f193fb26be5d63d86ae77942bb0ba6f50c43ceb9 GIT binary patch literal 1280 zcmeAS@N?(olHy`uVBq!ia0vp^AAooo2OE%l@PqX#kYY>nc6VX;4}uH!E}sk(;Vkfo zEM{QfI|9OtQ?>b|fr9KMp1!W^4_H{l44Ec$S-u1cNtU=qlsM<-=BDPAFgO>bCYGe8 zD3oWGWGJ|M`UZqI@`*Druw;0;IEGZ*dV6RlDKfa16-BPv7Dx|mh|Mah~@=BNQ3cb4~ zFXZ~FYX3*#eb4?>oW8mavJ$dae)9Acw|_(G+0-@K$*l*`|!27D` z$3y#EYtnY>e)PNF_A6-5hI~Ii={cFZ=SDnVZGKkZ+tuRS&B@te2lCBt-sX9;Uwn1^ zD*5uyauqv&t+dL?+hA~Q_4C`GY+tqSW&h`~XF~y>|Lr?v+oZ5L- ze_{ApX13JQ$Esg~zRs>Z@W942ujo~HLWN)N>^a*dCFTh~R#T57u)V&FjUl*2iS{557K9pZ&HEwDxNxYS@InL>NO8*!CtBIeR zS~teo-Yf2TuPP6~n{7c7r+XK(vORBPO#eC+fIK2I;{?*f09XGe_j9h;& z_t?E>m8>z7`)Am#pSLp3pu8eSeAV^U^51@muQ#z|c$9y7lU!x&T(d3j!&Y_A6F7bA z>Mo1*1@6Usl{>A%*FM|eawBK$$;^U%uN31uW2Q8iN3Ze=RbTb^>c&?YUrS0g!rh+y w->Lj6Z}RH7ce0AkeU-ktwd{w@_x-=v6Z)dI*_Q5<2Np~Wp00i_>zopr0E!?(d;kCd literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/busy-diffuse.png b/script.plexmod/resources/skins/Main/media/script.plex/busy-diffuse.png new file mode 100644 index 0000000000000000000000000000000000000000..205b216d198e33c53a94e8ebef2a7a3ba5636952 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^Q9!K5!3HE^8q%{+I4w~^CsQI$yL7S_B zkg!1PtSf?bF4LI*Uk`{Z-_)9Vn+K>52-4EjR!%nYn5DXQ{(FU$%CF5`r93_Ft9tTA z{yyb%EA3YBs}+&a+^SDKQ;vRH*YWO6KX>Y`)wBot+eD;-bHm=b^dEFeUTAnV?Wtdhyv`MIsn7h8a~7|* rbT2m6sW5)BcJYO1_Vwjp=PXFde;;}!a)ZXgr69hitDnm{r-UW|gxQ9f literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/busy.gif b/script.plexmod/resources/skins/Main/media/script.plex/busy.gif new file mode 100644 index 0000000000000000000000000000000000000000..d97a260add8d5d441424419a5008577332922d1f GIT binary patch literal 739 zcmZ?wbhEHbjABq@XyIZ20wHcDK|w(kF%~s(77raxUp-EL1Fl#L?i5>|G&|mj;ezwy zg?AN*?Jf{ISt)U*S`sKoJW~A6?dKX2?CcoeYNTht%m}nk@t>e`QEFmIYKlU6W=V#E zyQgmegW^vXP9p|+1|5)#KyG7Tbzh*=my$UzW7WEx*ZT@|&X?rguUPlK=KcQz3kp1R zr20=RDLR>BHUGkj60fyU>u;q5|AP$`K6XV_&WXVwrzInBN+Gf z?oGYDb2i($jk#B(<;>5nEdBj=rv1CAwaWE=jZMuStxD}3o!!ozzI~1pCQa_0YCUB} z==9mfv*x+XU1+;_iQaU~Z8Glv=Z9xkl?s}>b?+UU(coF?FP*R%2Jnm4m9SNX==Dc9k;e!xmgQCKbHfA#%O|2lz&fTotlx^|z=F4wkRm;MQMlP23too3cEGi>%8 zlNs|37cNp?vebSa(3PuKR;^pSc4O-1Ez39VShs8S9#^c6oCu4iNdcf}+MS(y|K*zZ z`tSa0&nsZlk#aqp^8UmT&G~0D-maVy6?o-I>FHBkI}_fE?-BicB6TxgZRq-&LFR&T zQ%}DrwdT2h<^50hI`0P8CX<%dHi3@LwjPJB?tZ(8lc#h|^P4f#Z0elg+4HsLEwWs= iRDH<`wNlzR_dzmbKfrZQQYY*Sd*{4Auamz&+Xk literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/blank-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/blank-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9fe6b3f73e01e8e0546db371be85f787be4d3f GIT binary patch literal 2808 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/blank.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..11f18ffd590dd4cde507daf5a8ee55f13d993273 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^TYz{X2OE&gS~F=okYY>nc6VX;4}uH!E}sk(;Vkfo zEC%Yh4#JF18nY{ag6t)pzOL*KxW$BI`R=>yD`j9{bo6v_45_&F_FAmqAp-%oi}|Y= z_H4=9&>%ITLHdJ}Yzw=<0Uz$aGmAx1Hkr@#1)6~iH0)imR%XlAGS4EfB7<%Fr6%85 z^-AZ(&!m0oFSl-8;U3DHZJ)Az;{3=nr(fG|{^0D-^DFag#Q9%=q3(|U+`C?8xE>5y zyKCmTjvK;`${7MC98xU33mh*ffSHcXP-YVwl*z&iWdhYfn1UcJASQ9T|4qC&<4lsj zQKR{q0fDzb+niLM~CQxHQc3vR2aGw+^ zT=jsZ=VJN~Kb%RI23(^f*)l;oJ|vY8k3DLhF8N1Xoa+?3Y%AvS6YDoqvB6 z+V-%c0v*2}3UI%G7ovGy-xf8Pv6a4lRSs%a#mr3f!0gF)}KK6!b2D&Iz-0&W+gWp=A+S zI&TU!bOf{S@2Pp{w<$J6VZIAy2w)_BTOI0>KyzRY!AgAx5q^7#wu76s2m#9ln-jey z*_CEMg8=XtV8@?1QJY)IB_^Hm)U+OuX}?mUGPPX@EW?Q7#hO4$F5?`ZJX~fc<`SS|tjE$Cg}&?r z1@v%o*Xxbv94o@H9!-Ge-ud%E9RslyfX%TVO9I+wH#i`>M7XI&Vm2?G(?d%#2)?-` zAm&7DDg%-Vc8g3$4qL?a%t%C9H`=bfUN-j0KHr?(W|VFea;%17L|@AUdK}?>V5dgv z-coicjln6XhY^-z9oz)eQ$Bj^rzN0Q13K21a=ow*W=XU*hQ3W+BuX$VKuznziOyrt zoCo+DcI9A3D?+yfv-Y>lcbsAG$6J zJ28O(;G(jHV5L%ZRL0}$w7nsOE)auY>%c$j;t>vJ~4osy{VQt2POj%Do^lo_Q z5^NL$TKYttB(o9vUe!0yF=Z=_+E4=Ml2JSLfK~N@t^#PwMj<4e3}ZUFeX3$dXl^-H z1Kd_T3Dnf320>l0TNG4ZwWyw!Q?`o@>-?1c0(>}^Vv zrhaP#KD@UmENvLVt^*B;C#W{e!6@y4k@~IFy2PXoTiT1JQ1@y%dK5Q%flT0luq}r0 z%+MI>F71Z`JV`O4K0GT*4@8<|5vvzch;IWZ{8dQti)|H5#ipw zd%ql65P1Fi^${WhBErpjhzQO(xcNMsj*gCgp`|CUVVoDuk6$(69pY;+?S&>p{JR!Y zN5B9)G{$@(CKs5-ZvybWxJP#i}yf=az-@kwVPs4v#qkZ(~(UF#( zHVQeuJ~)8NO$7C9Loym`=sQVARE^Mj3cNre0S@P38xlBArQi&3*i(my#YSl9%hg*$ z9fT&(^$9X;zvmwC7*Vb}8=<)e-|`j2D1d#IM~>PLAS?$9 zw1DO4b?m>cQ?0842MdhvBpptBX&_Fph#boi>apUpEs`-WYWMn%u_4u>_^QJb(F?#+ z@4p5HNI5Kl^lf2!Wi1Fa_i~G!Lk<+wM23PDp^1vsYtMJeLu0E7u*v`})z=M#+vSc< z)T6KVMS1Uf%v^TU*E~cv2sve(Jt?rNcmjYpF}-&7lvYql9vX;7p)vCq6doCn@8sBa zl0JDYAy2(&vdeeyBz-HZmtjiIlrvcQ@Y#dmeE4wxcs_o>{~t!xkM9C_VEhmDkLSaO z`p0u5EM`>yNn5#QbG=xT+O0~u%I0V!Cd)PgIn)qPi021)Oj*wsXwKzh>e8cd&&NX} zvy5jIp;O11@IkHW+j4NqF$X)%BQy$6Q0&Q2wX+$qstXh#GdZrNkcKpRHGP9ya0dT11uee(#N@(eS#RXmIU z8ln5N98LhU^!0T~e%fZJtrE{{n2m|AlXLFh%1|dH|GzA_kr|m*Gi$b^gyrDmpxKwM z&!0c*({`Qcx-6uYqw0NzRwF0*4*bq|!sqAbpA@A&bX^vqF`rHA_77zEO=wh~sn2)D zW;3^+lfLu$;^N}_gM)(;MXH@HFE4*MJUo17ZfBr;pV5;IF{bcCO^~S~_(t?MhVHR! z39!K!W4GJw@p`>}vA@6nz*_r_B34INS64rspPzr)Y&Jid>4)_>5Aais#w;+G0-6)0 zr=s=LD=d7VhkhG+UwDq!#j=B<5vu}|3_tYSRlr^vu za}YpGMdu|%YHmX-)Q6K3vCYI>a&slS-6#Qc4yZvmQCSu4e(pNh#_)TPpm53wa}v<2 z3?~gDPxO?J217rnBDEPyw;Vp0B#$MSM3}2(k7|rQIyG{q59+B3f)fCvq4UjLJG7(* zp|61`iPqd`j6{Vh(lCUA+u>Lb%8G<6iZS#J6o}Z*U9%Y+AI-^t7{O;w)0^jH`QP+UC=2JGX-F1eB5)-f=CCZPrV|{254&gF<^7O zvgFucfe=&cNg^&LZhuxl=YTrLdaCp&ow8mPm}>%%5=kL({UutDoC70b;`-HKZc(5) z!A?DfrDi#DXGgjKxn-f|h_JA5SZhI#m9{Z!pi5^X6z1}gylO9$ITe2GOoZMktg{{L z9jKo6LnH8f8<>j$S}n%zTaZNptrlZ9Ey&`5Rxo$FA}A;dyaLOS)iPA6R4SE9rBbO> qDwRs5QmIrbl}e>jsZ=V}y!Ai&NBpCn5beDH0000nc6VX;4}uH!E}sk(;Vkfo zEC%Yh4#JF18nY{ag6t)pzOL*KSUH6_c#m!R0F-BZ=;`7ZQgQ3;9mg!;M2X`M|3~jy zZGJ(orR%}IZYReVP9HeFGVE-SI~=3H(ZpTd`(|&`@eHx0H_rDa%)Q&QaAr;Ayt^%5 zme#!QS7cV?1X_U$T)gDGOeH>MAL=P@mMj-e+q2ykCf~b2mJz7Bd4VHP^ z?zRi8@gLG-4E89A5=v|e_tjy=r z>dOq@$9;Qh5}keBQ_S<+1pIkF}%{Rp~TtN;LU!cFAaos!r!l@>!B|*wOUHx3v IIVCg!05oRfA^-pY literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/home-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/home-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..baa780c30894e8027120b16aae1387e2f02f9909 GIT binary patch literal 1303 zcmV+y1?c*TP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00e(YL_t(|+U=Z8Y*bYg$AAAv zHNh!HET$V;Sy*Y48i|&=a6=3mrVHbS;6i2RMxw&j6_uSaHW+tA&_#s>c0<`Tt~3#X z3j--NxKS5oVy76Tl4#(#co&^cU#D;0_q@J;GHKGebMBenymvp&JLifFWoFxemw;!0 zF<=yU0@wjO3OoX=0(ac20sH{m1a1HelI~F!nc03b`@qZ=Eg3DD*@tE}*{eVX%(Y5iQ;FSHW_GS5U;yf2uOKf3m}%g3%B7=W#vpA1rVd=9ysAsO+%+6CdmLy|ehqB2 z4(fDUeaqI+m9EAdxAY##*vV_a5%)LKg<|NfhTBADtz&II9LvFnS{OKAX6VqbW;VQm zAH(kb%y#peff>rsnc0w6@@$4a4RvxPt3cJ^F1Ia*vkI66PUSAtxSaCf_mc}DG$QQl z2Hni^WXeA7lGJRUt=>+#(=(FxL;(XJsUc|(a3*Cx-wFC<(hP=ACF#AHO{E#MZ|`g( zrH+2*RQ=EFc{Ow zKLv#o*RMej=#OdSenH{H^{YP#IAv9TACODBhM8>#UITUk4+k{)+eHaJmvlD=7i)d^ zIe0sA==^Koxe)E%1fI{qzf})EF)PvJl{&|wdCO^ zKv&uT&W(yg@b<$47Ag*bTJT&gK{f8I)lEtFAHV??31+jQJ3Lnd4?M;4%E1>5n6Pk6}r_1j2EE=75*C;8-&!>6O-h z1i`807{`xeEor%FP%Bt0GUMwP)HC4=34pk8t? zQ=Lj2J66rOqKWB}f_Yz3#|?L=Vl-EubhJcZK9lsuW{s*!y$%Xp0P75%?Qt;Y!h(q; zcSc1os_W`tMFez+-ijV}tjJ3gPRlyz3dKK>U@~gDuNSpfNh^{@3cS@gE@>pKJm_w& zqMAE>qzJlLm{U;N<3Tx}pR>F0qn|r@Y1*BPl%|&5>{CV_ns)%FJodLE# zZQqqKsBQQe^W*qQNqh0LS^M3q2KXfI~A=J!dl*DIjSAxC`6^ZjlaazzVQxW>wk&N#S`! z(wwAC<;SL^c}b(uF;WYQh?|!5P13R2hhyiQsUI(`$g)l!SILKUGP~z--K5 z1>l(%i4J4P&iN5{|3!oSw%>iS(BSP~HnWX(Cr#}_P0|#Eo41+m0*|}kzxT+s)CMR2 zOX41$7tcW4Qp+ekB5C6Spx+Nd=DnYwSz;lvD zk}PT3BKmlwh<-ce@2y0N=!ru-OFEM=pCK*)cf8s^0gOfRn?2wwPz62!uYrRspCSGL XzU$zZ1&Zp600000NkvXXu0mjf;m3kH literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/info-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/info-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..407b37b5893395d4f784bf3610a51bc80a02b476 GIT binary patch literal 4487 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/media-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/media-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..a89f1c340e50da762c4e9fbeafe27858164cad5f GIT binary patch literal 3780 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/more-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/more-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..c814cf744c55762032fbc747e9ab2f8063206240 GIT binary patch literal 3286 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 Uh(QGN{Qv*}07*qoM6N<$f+)rw=>Px# literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/more-vertical.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/more-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..4faa5ce6be3f67da5f9bd01d0c50496e406644a8 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^x{XE)7O>#0XvI`h~hjevqL~3$r9Iy66gHf+|;}h2Ir#G#FEq$ zh4Rdj3$B>F!Z|@w;JnSIQ`tW;COgn#=qNlLs62AB~a(5i0 z3M8-D>Z+vv5IOwWl`(me!v>$SL-x~K?>5`9Z8TooJVzzV-px~g+xJONlwO>_ar0h? zv-hQ9*Dn!*wQD-AIk7UEWL#L_*v!T&1!eq|ztFrS?ov@y`%Za-@5g7k-+ufxZ4$d@ zyO^y!4MS~2bA+_$yiEY`0ceb-MFVdQ&MBb@0J*!cLI3~& literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/more.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/more.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd025d39f9268aab287ea046f9e93d194e21356 GIT binary patch literal 663 zcmeAS@N?(olHy`uVBq!ia0vp^TYz{X2OE&gS~F=okYY>nc6VX;4}uH!E}sk(;Vkfo zEC%Yh4#JF18nY{ag6t)pzOL*KSUH8b7`jZ~`7kgrsd&0LhE&{od)F{eI8dbR;{Tnz zqRSR0ae4@D=nWA$$Fzqrg6&>Iw9}mp9bY)59Rh+Cr7k(@x!!4Hk$8M&w&n7|MBCWY z?=PQ_i#Fy2+JFlfh^?J29u?ZHa$3cIvdqn0%{x6d<*m(S*}H#6ylUmbwbom+*6tPg zQrCCpd6iVl<%RMq(`EN`dduGIHk4hs|JNBCiR){(RyY0IzQEg^nQPfrM|0!Nu05R# z1Wh=kSa_SOGo)b`)$o5w@H);1Zl+;zN=Zhh{) zPl4NZNB@`J57%8!v7Y~cC*9JjVC&;u<-&6mU+~r3EWG=i^PE5l`!nlx)dmM8o8BGx z$at+cwQYg*h8u-Y|DQ@!UI^aX^xt=qx#vB#ojGf3 zSFLK_xi|IB=eN(#&XnBGk@g_`L%BDXo9Gt%ACI@l;`eOE3#%8|w^Q_wiF{ew_vYw~ zrnuK9;(F9xT)U-q(#yL%Z|mLe#P63*?~Vk;!<{&nrylX_#S>HRI-kK6Z9wq@JN_^{ WyvcT-{o>YDAZ4DeelF{r5}E*EzYH+| literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/next-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/next-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d5e0aa3ed30c1915272f50900b48e3ca90cdb2 GIT binary patch literal 3894 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/next.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/next.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec144c458cd0d223c43094ccdba8127b2e72eac GIT binary patch literal 923 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/pause.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..9f0083e82a1ee3d70a4d67d8dd734d981a22293d GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^TYz{X2OE&gS~F=okYY>nc6VX;4}uH!E}sk(;Vkfo zEC%Yh4#JF18nY{ag6t)pzOL*K*hIv{ct2=Pdc?rMSmo*B7*cWT?cI&O%!U$e58wB{ zaAG{1GQ+?@tif;xs}Vz_vh869$E?c%K?16~ew_KdMSZT{zxYV?odrxl6LEo_Mbkbl zT)Q=QQtTw(Nn0H*c_EJ1WZbvpA-6Xb|*X6 z+O7R6{QGTwtyy*4`2N#^lYG4k94{yURd7f-Hba>}JrE{XJBSH2sd<4QP#sXz4XTCZ zZ2i+uRp+>mJ^hMe22jbo(=UnhnMuyk&G$?|N<3ZtT-G@yGywoCD6h`| literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/play-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/play-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..e39c5ce15e5266a5de651ccb04d1163d6637c512 GIT binary patch literal 3790 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/pqueue-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/pqueue-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..cd23065b8d62f66b09a5c39c0587c9ac74a7cce1 GIT binary patch literal 4124 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 D{GZVH literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/pqueue.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/pqueue.png new file mode 100644 index 0000000000000000000000000000000000000000..231e9350d6095e947ab7e026dfe678f7880f4b66 GIT binary patch literal 1052 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 P00000NkvXXu0mjfZ;05x literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/repeat-one.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/repeat-one.png new file mode 100644 index 0000000000000000000000000000000000000000..485ad9c3664ec3ee7cddb82c2c04596f480299f4 GIT binary patch literal 873 zcmeAS@N?(olHy`uVBq!ia0vp^TYz{X2OE&gS~F=okYY>nc6VX;4}uH!E}sk(;Vkfo zEC%Yh4#JF18nY{ag6t)pzOL*KIGBYbt_4KxB9Q9nndOTo`$if{gj)g0u7jEfR$n8o#nKIq#mHdJkCyzRcv;Jic z(Rj2Vu;jzb2ZBv&%T822{=M({u4NM@Jel+R=aZAgb*h{|n{fdHG1DpBx1y|Pr6`{K zr!rgj?yg9`O(CJvS#0;tsQ3QVyv=Ua(N$L3FJ8VmQ~z?Mc;DCB<@2Nu2#A-Y=pNhR zY+s!Au6OFHTS_msvfeGZvN&N?)!j35RFiyIdKWleP{S9C1C%^Ig8Sl&Klg|0r0VQH|N2+Ix*d6Mq4~KV{9op2&R=O??SEqTq(8G#{xQ%0ojGZ5 zt+ny)>CIOa>n}#_HrRR4JYT8o#lp5fo|A$->%2bg?BuB0u-!8%`}5?-NA(^He7W#< zV#;zujw+pd;-B}bTvyMZZ=&YNfAguz{qU=oPyUR$AX}vGULL3Z)9~cP?S{%P7G`-q zTm33#lJDBB%x+3A6j!UXM`v44it+xmbs|UA3qSRpv!6Ijntn|2h2f1|uWUfU%pt|X z+tj94`J%e^P3Brzv$l6du8f( z+dY2d-`G2&+VX&;)SQLxU$Z5wfzt431FCEW8g1b0xIRKH+i=-}{8uNUdNg0C%0_ly zWQh%({^{9$&d-Iqe%BV=-^-IaYwgy>o??^U_-~4gf1PG|@{&LjD0AQf$DYdf)@(Z0 SaMOtiq{P$J&t;ucLK6VInTd1& literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/repeat.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..850245867f57b0b433bca3febed3a1c3ea6259a6 GIT binary patch literal 752 zcmeAS@N?(olHy`uVBq!ia0vp^TYz{X2OE&gS~F=okYY>nc6VX;4}uH!E}sk(;Vkfo zEC%Yh4#JF18nY{ag6t)pzOL*K*hIvnIHNyGerI4{s`Yen45_&F_U?NBsfiNDAHMIE zl99TSWSqEh#pE|L%F>QRYKWM1r!BvzdG3Wr#FAg^5*}jBV$J^;&z-gGev$UUu!8Ax z`U9DY``=^2TNvN(oPWNuf=`Bz6KESQU?6gJI(P0`UDZfWqxmVYRTn(GV?Ky4o z9%DgAe#KYsL$^+RQZmWfbKi`v1?>Xg%0lnTwf?o}jDPB1bT4-Q0ZyCgkDsvUe-93= z{eAwe<@_g(le+isd0jfmJ9*!{@4`Epr!BA+DG3)_vb9Y2q}wFs#pZigttyti&tqfR zd0%OE=2~6#ox7FO-dxyyKQSu%{G>S&kC(@!0<)G$%=lPPKXa0H-?=;W5NdM#`d%JH1lQzd%8~@g1w|2I>7gcRhbzpmjQrU}r zZ8aJvvnEA*_RZ{AQ2l$xlC9e;tm4i{wlDboE^t!tu?IZ1B1vMvpkV1;;0OzqW+=0X z%@M>jcw67}_264cF@09Egg7pqISUU;Rt4N|+vp6E1#0C5D-;Bo!W%5|Wm_sR__=-8?mAFTWu( eu0#M7Km3WA&P|& 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 D@Mf8N literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/rotate-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/rotate-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..43bbe7541f6431da0788781cf926698e9e8ccc03 GIT binary patch literal 4439 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 uaTmy-qXKWyfpai>+~?fqJU_2n`g2?~28lxg z0Dxh{&^I|;~10sEIxTvJv#5?6lA);!0@!!LqG`qvaXLWF>^ zAqru3#Q`X^6MHHK0Oqwa=n)Bp0~3SEl7wAeT~pTmWGJNFg`2!7K0s>0|42Tj*i!U& zN|sZbE1}(jztj}t@*1zANfn3ZFKG8~n_oU$(yCe1P+p?&EyGvnZ{c&b!NSkNHDmbW zSK6*n(%C)ek#Eo_W2^D>p0gu!M)DYy?8}g?_`02mdUspQ9)+_OUPhj@-p_|%tYZ2& z$@HLf4SvBKyRjG(;AR_h1g^&+L|vk6{ImP3Q^%0z zWf|A4PiPccB)@%LtKg>}=;yj>PT zmJ*L+xo?R&%4&lEYjwg{gn8*9Zc)n1Ka9QEv2IvzTi<-uJ|+%h~KKU>&T{-#(dkwaWo?P|4P> f?SmEXPuPLrSH(F2ftkaOLIW64arEX$)`9;3cL7(F literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/search-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/search-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..7d532ac56a99a7f668c341289b78370a9f7edd04 GIT binary patch literal 1526 zcmVe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00mx2L_t(|+U=apYZX@*#((b+ zNus-?L5p?~O$%C~RQw1jmR4)kg(c8zblF8e@ITPtLTE{|vWv8I(S-$f@hhSAtAO&MG&P!(pfznoR!p3i=wnhI;GmcDM>B0BFrJxCJv?To23wC6>t?;Tf-y$ zHt>p>O;&SrP^B<$0~0ka49>m@XK(i6NctEUEZ71%=Nr%krqqs?=Z+s=G zD?!-MiDI>TN$XH(4d>mtZ;i$*V|7cDEbwnBAt5DUQL20BrkAhiL zY10P|WLP^okb^+23pL#5fp{QB2b(3mC+UQwEAH=vyVe}z{(+3e>07ALw8ilIi*#z4 zq~kGoj!Rm$2-p2Ai}sa`b$TG(715cEk{&1EdMs&U1mCWVy{EH0Lf)TpIv6*zOCcRu z3)}#j67V$vH{88X<~*gg#xo2I_m_*4c6I5G`0RQL-s@GinHJsiziguiH(Va#HAg&f z9|_@Jp7GFXG)cRG^C?vR!_1xw>A;MKJZaXP}QRcgnHbe;YA$5rreNDWsgxw zA4pmqA;@a?ozaSWyJ8A@+2_*-DV`fwHS^4~=HU$h7K%5^X#d#?3 zXBFH-^TPbcbDY{8o-24+VzZfD5Am84KsCEPo;R~w<@KEMCGi$;x*+0QleB38VZN+V znA7FLJmEQxyrpavDFQZ`*)PuaFMxNd&r^Acx6Ewaf{}NGI7>U&Bl49=pr_7->4`ex7%Y;|og~|RFi#WxQHMez zhgHQ8EBXn&O2j&`w{%i30O;P@R*%(zntiFuye(t&O!Z24!e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00PBHL_t(o!`+#&YZO5g#(!@w zf`S+#1`V7NRBSZb+=&p7Xs3n$g6V@GqBcr8Q7d~>8Au^Yv=M>`0VN<@8Zm{1qR4dy zV~k3~OFj!HVYBYt&Q5Z7#;@AhowxJt%)Ix$d20khQW+=%{Xid31UlX0d7uis2Bv_D znN?^uBy~v|Ryc+wbv1*SNg9__)A~_!@3M^|Hz;XA8;=D^gX<+XqUK{HgjhjRMXf_c zQX!3t)gf2`O0*W!W>!w#jMA314dehynak}QqTLuwU1I0Bc4V=kuzz#E0a`wh^#IcJWj&@$sufSOxUo(R)x_<%+9$&cE%&MNzV3&JuUMvCK zW;VCtBo{o$Edjkra*|4tuDdkWzh?iK%>v!P&zuAcj??NOKDd=2wqMdrO24;~jwJeC z4O!<^RpQZiJ~3d?!{%VZW;TFhIdYOI3(phnF%O%EiS~nly;zQ%p3A~yY$kRBCp~PA zN$QEUrveD}M^0>J;a%J)#{j1jaWgOaBBzA2uqAe#$0HYG*Bt=_i&0FbH^Sjq=y;lA zfJd?G0|5j(BhQWliS|7Yn+Y>pZtxB-n554@);VF>%nC6_*$R9BcGv0u1t^-?_n1x1 zGgHMe7kO^pNYazoGA{x>z$j2l^t})40e-~D-3%c2$FU@h0do|wyPfFU8mW6r4NS_z;r9gxiSBf^4q2< nU~Y;MaJ!4>whpo_`3>f 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/settings.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e24421bc0a011cc6933792ba981b86c136b80708 GIT binary patch literal 1079 zcmeAS@N?(olHy`uVBq!ia0vp^TYz{X2OE&gS~F=okYY>nc6VX;4}uH!E}sk(;Vkfo zEC%Yh4#JF18nY{ag6t)pzOL*K*hIt>L}cSuhchrRAMtc?45_&F_OAVksiiW@%U-kaXOpXDaqdq4>$NwL z!THW=<>yKB)?KLIl|E1MbZF`71^?qO__`a5_+0fd-+WLrX^WAg&X3kn%5yiIJ5 z{5K{_DW7cgydNOE=2N=NjDkOckHt-Z5+F67b1hH)zVgD_rKAmd-wMp-oaw~TI=Msd*9kU z@4a)Xt9@ej*zmE?mn~afM^vx+{^)&B=-bt+cCUK1bXAtNzR2Vp<1k16)Bj#a+`boO z{X_nIxyi{z8@Z~a_(HGF7JhHIZjG$e&A&z2xzBH$uFU>D$tHVE)4VqCzY)>d+-tYa zy?fos{@1%3`*y3_Jhwfj^&)d;MCkPD+v<~QF4WF_5xZ1heP>2Y)4bC7Z|lyPtKGa9 zef#3u-OnOeY*)*@h;99U?rOe8)T?i?#X8xK*_0!SqocC9L$`i%TV(4w@1@-S+xxfs zZ8{3_P~Ll`y7jxg{!e>y)$sV+mwiWdkB9uRNc``g{7p7{t?wU2kL_h=JXmdY--lei zSjZh(s&-OadAInaIdM;a`jsD7cu~52O3M8#_K>RwRnpzd@?)Mxn@O!+u>5Jv|Gy$@ zw_cCRw%>lOZ`-xJce39n269$$*uA!m^ZArC$=7q<>8t;b)!41xugK|mzU6*(zj^PP zuiO83@NeR(Vvu`lYd87H>~|meJ@36=Yy0S4#0BRKH>y8wj|t^}ddmODyVa}WtB>0z zhBV1FEsxH={o8ugtKCz@yY6-$J*skEdg_Aq1jUmluibk5SS&i5U)}O~nezqbqTosD z>T7a)<9W0)1WbTw?Xbhor(a{@4eBawIi!F|&JCFIz!J?1uAkm?`AN)~;0yoS{hlYS zYqDDhOuKna>sAGO@?~ef;wyiiw5?k5lu2~d1#nP^22A-VL@bi=Y XYwbI&6}&lNpv>jz>gTe~DWM4fwmj|$ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/shuffle-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/shuffle-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..8dbadf6e31e2da8e249f4fbeeddd772a21c2255c GIT binary patch literal 4873 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 oco=4Qpvm3UTzphg~Z z^FXfP<>=RrA?t6Q`=VXHb_4|lncCXeaDCe>ORR{SbvI*z+J$)5P-cHVc>%uucan^M zKeo(n`0ekJy5tzqybWT(x%-Ph_Ss^{Mq$+BpzX=D7Nw1Xz)4Zt7LoQV{7w`|#c+)W zhvHBH`f@1!yrWu8PSuojN7ip4qg*q!=vV7OfqdW#$Iz`0KaW=X9q+thAl%vn9nx_& z-%;A88B<{}_#+Q7rrLd-<>l!qfI7#736Ci3)E>kY>=+pg01wpIG=5ui7E%W4Y!t$Z z@R+az(Ojhnyq&fTLblr7$3%;4$zw5>Tc0$ZZiH9_`lGOO9>Nb|=R`JV&#IU;-Xq2) zms>(IM0!P_YFn`cDmCt<1bAg$maV1t%~_UOX+8kJ>!1l93m~9qX+6c&LvbE3 zh+Zn_^NC2p=b!1hMx^E9Rr=iwkqsY%n*zbY6&x~gc^4vCsBASPmC-VsW=2Kth|<+~ zbMF;h+4_LUVAsS)zhJ6iHKc*42;nIfO<8EIeXo8vfHbVqoW6*L9||SC-&DXjKLR~; z2>$U!=yjpyAH>k@()E-vaJoXn_AAqpDnOG#dGjkq1s9&CzmJ4WRa(MR$0k*d`+?R` z=GwY^nU@1;|Fy7v4V>VJy$j24t_>XM&w+W6?$WdK^8<~nHKS_rA+e|VXPnBEmNYEI zB)0?!Iheng@$n;}GTzrF5l`nVWiEH-bq?PIAF|aT#_IN+jp2&^{cNfG`}^A{6zW5Q zS+GL*MZjtt74vo%zC|dRtZdvbXi zJqd9{m@!&?F!2HkyPDg4ScN>KWhUF9-w0OXzPX7R^&mM@b_HmA#@Mo1-( zmP_b?&h?%73UM~8fCWFFz-7XxP*5!k+Ki&sv&WXifELb7pR)&t24XYX3`X9JaNnrf zi#*g^>k5;3zR(hhiRq7t0Wpo&G((+EY-nosj=|iO zO7J0I&TR+D{j3UMelK!?y0S*+m8lS4@*g*p7d1ScvSy^nXKyaxT$eU_?sG*Io!P!Z zCsaZa|UwDYVlvld9^?1&)Hqx*Y~!AV)vOByUbg?lDn*|ln8&48hsrbU~?)NK+%;=-9zWBG`l^q}R2x~YtPQCLiyFw?kh!Y_-tu_LwyPgFMH8k1 z^kcQwfjO8d2V*u61D%)D@EOhxvPm?FnD}>IwWnC7ml&^Dt)`YxakHGuZLoML);ZVb za4-@+%Kl+dgjrxn1vtD~Rj8bwY;nJGEsa8hpQ>on$Y?7X3T$R~3h{xobni+}`Y8v! zSQnq%dKnuxU$g$IX7NV+D{3WJdqKSf#dsT!(zO0$P@r`_tr{F6l91^+GEcwssXznh z>GaX)ah(aRC1Qk3Afv?i-8BU;Fb$qy!I40EG46c9-c>ai+YQU<+4SN6(B#t@F8X+F za=kG+nu8BukSQa+^V2mamYPeIZJ^%PO|_rt?uus4BFQ@0doznlSF0y@H~ENWGl@YE zfXXSKN_B^@;mH@xyMuKy%U&v@wJqtuh{Y{B0-m+R#QsK50ApeZ(dbZ7GQy4j@7L#l fzk+h>u1RkUzRfFzP%jdzKR_E|p#DkKDdv9wTVQV= literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/shuffle.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/shuffle.png new file mode 100644 index 0000000000000000000000000000000000000000..a67dbde2bc506afe873fce3eb65c2c1dc3b6299e GIT binary patch literal 1407 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/square2x2-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/square2x2-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..66f17a8c8cd7e5275b34e37a35c552d75b55cc38 GIT binary patch literal 3445 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/stop-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/stop-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..50588e55b9aa8df1f4a51361d9da919ad0a2d83b GIT binary patch literal 3402 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 TP8&S>dH}}yW_l%P=ZOCSs^NxX literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/stop.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..1a8d4d9f7672d15f4097b0051ad3983d7d4a69b3 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^TYz{X2OE&gS~F=okYY>nc6VX;4}uH!E}sk(;Vkfo zEC%Yh4#JF18nY{ag6t)pzOL*K*hIucHJ`Jqeqdl=O!stg45_&F_U^{q!v+Fv7yt8= zpR-*WSz^<^wbg7ib8)5@xq$Ynhjk zs->Ex#NEqxCh3Hhihg;VROkO`)!NXrpFH z8+A`?`gdVsWRJ*~Mar8c)LyLGr8aZxmR&!q#cIEAntC~B?c7N|o_(Htzp7?MPfF!B gWX2U9K=I_COiQ-wXWv|~JOQN2)78&qol`;+0N<6QUH||9 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/subtitle-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/subtitle-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..5584950602a5f0cceb0832c126626b4ceddc926b GIT binary patch literal 4620 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 T)?bRP^FVx0S3j3^P6Hn!Inq?0q?Hm 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 IH5|hJ2bi#DjsO4v literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/tags.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/tags.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef59db7e7100812ffd9d175cf34fbf1280bf906 GIT binary patch literal 1601 zcma)+dr;B|5XWuwd|gzQ)=8!LOf5x0rBXB!Lo$_oW~mexAf?qQnex!my5lUh!z|M@ zN{YICrv1qGd0CdCkzpvmL9Qs@*mWqHs2t7Q+~4ia?#}G&cXnt0`230w#X?M>rh0mM z5L^%@Tvr=(@td)sE+4Pt2z14e7>vc}X}>zRm0zgqn4AuZP1PwRUt`4{r_yv?(};!( z2{ii4HPjAOw{SIR}eP zphtN_7mXi=ABc=Z#z&@cIse@3e`ni&zsD^X&gnLHa9z!djg2%%BOj1TmYa&Te>{CO z)Gw??DCSZt{HFSRRc-PN=4jbjii7TmZ!?k0omj`?jBC7AI3>rhev;m6h&y3R+>DmM zMn>&rVTZR4yl1DM<4)GYYwq%Yc5i+iGXXdbvNzK@+Y;|uENtl#LKJw+N}Dlhw)bW) zyt^4hwtr)@an%JbTBL{8H-N11G=^?TJjY#;ZDA4#3AYroc>E?a0JXPYT?pNuL%4|% z&Cb>FeC&vnKJ6adCHr_c>PbvXp~B7~gyUJue8S1!x2s$`U7B?=pBTu2fGtQ_+>WaWhH7Dg)F@uq%1C+9G-T; zMX1!8;1cKYsY2GYWmW5*tfLI3M>`If8}vKE$n@}YA&d=7)GGN0Z^zzd{Mi?G14)UK z>^o#by}&cFBc7>)!=gWybu_iy>bN($9owqxE=H0XBteIqsXX2Lrf0+CUV7*Yw%2pwUD^;vd0Ltc6dtSh*?CJq4Fvdc4qxig*swoep zAcpU&SXorYKK|CVx@U*nTmMku1)TjbAN*_+7EA#3!+7wK&j50rCt5->8fknNmO76F z>rA}bk86} zbf#XY=H8U-1`8g3bl@N|$(aV>19MP~w!+xTORVhjI&x6lBBZR$cJgq$=nxAqKuFl{w zn_eQ1ItJ0*`W}1JdUby4@_jbPa9T2$4S0q81DdCew@p<&SE|Ng&-i#Reqve2b zEM^L3^(N3#Rn)8YcWmeXEq32sRA6;*x|?r1d*GwObZ>CU_VJ>XaT#RANAl%H=kn8) zq9Ye|9Qg{A|M{|8^dDbB2e_;2N(VPona@P;A`%+HMJLACtk-ZfwsTihW~+W^^|MA8 zwD~%Ds05(kCa#FxsP3%U5(ww5XMphAc&VG>K3>$9jqk6>!N4uPig1CUnCd-8vi}9v CjP~3B literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/buttons/trailer-focus.png b/script.plexmod/resources/skins/Main/media/script.plex/buttons/trailer-focus.png new file mode 100644 index 0000000000000000000000000000000000000000..57bbb48aaac24bb0d5ef3bf034faa5c9f6322037 GIT binary patch literal 5999 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/0.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/0.png new file mode 100644 index 0000000000000000000000000000000000000000..5ef79460d743b1183a1957776f2e5ffef6d87441 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^9U#oX0wkwx&b|qxn3BBRT^Rni_n+Ah4nJ za0`PlBg3pY5H=O_6J;|0^GX3uQVP2g(OQ{BTAg}b8}PkN*J7rQWHy3QxwWG zOEMJPJ$(bh8~MZ;7#IaST^vIyZoR!?=q*|xa_r&vcro2ZzC)sl9SR(CWSj)Gv2spmec zr(2#2SI^FQ;@r--sALQo0FG)(yWXtr#-Kn8UFIljt%q0-#&Wxeul&} zg|(Nw_0=t3oHm*LbI-Y?X`epaI<(vIiNsv~&pYm2$$I|rv3^IeZTdG l{ps7Yf*FCKf)})%7LD1vM&<9HyU#)DJYD@<);T3K0RUZ=q0s;U literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/1.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/1.png new file mode 100644 index 0000000000000000000000000000000000000000..a4571b6ec4281accefa70372f253c38f66091b96 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^9U#oX0wkwx&b|qxn3BBRT^Rni_n+Ah4nJ za0`PlBg3pY5H=O_6J;|0^G9M#u7e2A;}Wgh!W@g+}zZ>5(ej@)Wnk16ovB4 zk_-iRPv3y>Mm}){2F3zU7srr_TW_!J*KQ4zIsWmy@s3E5=0(wUI$k|pANT{<7N1pU zJ}SRZ=X$~dp0H-eNkLvI%BoX3i~`t#c4)qQmb|$A`Nw3z^OgIrU0!*4ck#Zt9`!Br zLoY3sD_Jfb`!eXc)#c8; z*01?|KBxLhC`)Jcw>7spKi%u9-fZctG<9W+=&F#dS)t3_Ojkyl-oLeHVP}S`V!^#y zxzD@29$uZY{POyM${X7|1Kke$PWoPxG^w!lwDL*$ zZ4)MMsWewS8FIq2Xx?vw7;90p{-Z@Doa-;Q$gKBd%Mrip+qqq(_6abgi3JVyk5~)& Vqwf^_EItd;vd$@?2>>4r%z^*_ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/10.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/10.png new file mode 100644 index 0000000000000000000000000000000000000000..009f5be4a3274a343cee77acab82f0b44d2684e8 GIT binary patch literal 1500 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 LNkvXXu0mjfcemmP literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/12.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/12.png new file mode 100644 index 0000000000000000000000000000000000000000..711c177dd53aa2462e687afbd383a0a81fe2b118 GIT binary patch literal 1733 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 IM6N<$g2e|{6951J literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/15.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/15.png new file mode 100644 index 0000000000000000000000000000000000000000..848639d4072cd6d5b172c27e114b6c2e17ffd711 GIT binary patch literal 1824 zcmV+*2jBRKP)eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00xXnL_t(|+U;G0j35RD z1p^us!4Cv6gKrO$UGu8C?H-+Or@QLid{bTZ-p{I6uU@^XvJfy)J{l26J*rWK3Y4K3 zg($!y04ZGJ0;f2}A@;F{9c*FKx(Zf4D=;8BkU%?H(Ujqb8(6~%K3U5V0fZXRg-$$0 z(LF0V#}XDWZ+!_ZAk>0>^x{dDt6j$|-dUd!CZbYG(lYr;%ao+jaDdT4lXOi%&^1j` zM{a}BLvs`~%~4NI+7Rl&3q12w^cyy@gO}(YRy#XEYcz921VhjAdpv?^mSI#)2@bC2 zrdOJQ_bNN|Gnsroq;#=1gq)~N(aCE#no5;O`UoOGig7*ixM`uRT&58bQsO0ERyWk4 zM8jf{0VJkG)!cXclugNDM2Kiu-T-y`phpfJBVwe4qi@e0phc;8B65HvBn=lc=^qn_ zASp`{=RTsOyVOJykQzDV#_RkthKQ1~0ct{{Y56k()DU%t-IEjF;55T*LlctnUXwRNrjwQXOBX;SO>a<;BJADT^pI{IiML~6#I z(+&`>ag{&?V`yhoC5NYn&4D7}5?9$%YDCFh-GffN+g31Wp;F zL_0vZ#-{?uj8U!~AY9{PfkVcq)D94?@u9#zU;b(b2-kRDNXy?k?Ev8#?+NTMMqE2U zxW+p|3ZXS>2ME`A%WOkP+YrLK!Uikzi&p)EYrA1x2>@%1`KwldaBbJpTbV12`I}aN zaBb5_m~;pw#oHvz+$7AT14K)#T$eTjhHJWX1IPmV;dgBS;hNr{VA3*g(lP}ASYNQt z%Jyr~Ke(3b>HEO{3o`R$|39<Lsh?!Ez972?enPaL- zL35BU3iU@nJL zsxa4wy1KY}UoZ=pD~Q#~%q7(xD%ANJbHH45Z&$H-3c+=CqxWMOfO$^ED|gh!xSy6V-}{ z<`HunaU=B1y_Gdkdhi0zJQe+hO>AKodpN)mPH>J(dJUdG9($_s z172Hmxwy{kQBrRFr#aXC`v)IBlT!MgUvy2A*%>B57}}(xH=7+=rldax)bbIQ7WAVR zPqJL?I%e_C`s|m~mhZi#0bS_C(|g}LagHS{U_PCq?;lyg*%lHL6g7G8Cf_1$YD?g-cxE6vsHkKK8JKEo=sT|L?!fy?EBI8omDj O00004nJ za0`PlBg3pY5H=O_6J;|0^EG>dm|?Sg(OQ{BTAg}b8}PkN*J7rQWHy3QxwWG zOEMJPJ$(bh8~MZ;7#QDrx;TbZ+&NbWSCw%y%Or^YZCv(Eu{4B z#WMvyy?>mJO{a4+0(La7Zf@>inIzyAt>nQPsA3^uBGDw}*z#kGOToGCGFuN$_+7dG z+UeHQv)`XD_FtxbXt~uz|GyU|@@-ka{?_GncCVAaz5f5N@69Qe!lUf+U&5lRCg%#N zyx$%7dg-;z{wyb}*N5t+zrXVGPrjM$+q|YHbE^(2vuH+r&PZRUICED?ta(ZB_LAuG ztLv+!0?xPY`{U)m+0^yHF8Qis(sq{ROKjdhco{6T>=}FAv$@5K&XoUfiWXY-aN7Pk z6Q9gh7wMlJXRCaw>$j4dM#Ny+`%O4skM>bVr=^R9IFClhNCQ?J9XMT3{GTw(L_ z@Fk7Qg_E!B4Vje^R#>^}&jB&ZlN+{sPttMm3;L|&*%g>J!$LgLH!WFRGFjM9zj39S zXV>!UifVoj`xf8uns&YHi^@wi8#&vPNt-5pIm#F0&G$w7;_(v&M!9N>)Mt9lyHM`# zzv;+ZHTfm;Y(k|w=cR1=!M%Q~lo FCID|;3=jYS literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/3.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/3.png new file mode 100644 index 0000000000000000000000000000000000000000..76c1403f686b3adbdb8345ed98f21e7752496125 GIT binary patch literal 770 zcmeAS@N?(olHy`uVBq!ia0vp^9U#oX0wkwx&b|qxn3BBRT^Rni_n+Ah4nJ za0`PlBg3pY5H=O_6J;|0^E%CMlQ@iA;}Wgh!W@g+}zZ>5(ej@)Wnk16ovB4 zk_-iRPv3y>Mm}+%$$6eGjv*Dd-rjQb4oMVg|M*{2s-G;908Yj>QDWP^A6y_j z$}BVfo9Cv)!(GR-uH8^SHK)|Q=TdgC@8myQ6kStNXXi*QT{mOR=~uq<(|#{KnA}<{=f~uG4Pa@;8*!Uv4*N^<1W`u6dKk^ODBn7>o9szG_M8 zJJ0%B{8u$t?>6bn%dP#~>OcDy-{9JIz3Pj~&)FXWzNi@QoV&!jY(mhx#yY)UQZLWP znjOA4x#yYR3+qMdGoRk>^U&cY*bJ?Wp-w)Yu{#JBtmRe>(*R$p&%h!f`KDr;e`}6b5+YY$O?RY7s zty0^u-)GX*KXaGqmP|aJx9cF6}#qR1?{|DE)&k@y;3-IaXlG!vUOr@#@a2zZiZy`T|IWr>mdKI;Vst0C<^I<^TWy literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/4.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/4.png new file mode 100644 index 0000000000000000000000000000000000000000..7b126ab2e1b722fbfdcc8b25078833abf16b917b GIT binary patch literal 914 zcmV;D18w|?P)eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00RC=L_t(|+U=ZANYh~$$G`8uF$ifR zjBGG9Xe0_nSQ~T=LL+K)Dd^xqJb3ZgJ;4rk@L;fmS0N7}BN7BL41`Pw6U3NcWT2o3 zng}w+o(^7m-rsL(my$i-&+WT07$2VZ-?R5OhckjyP{tt+u!kLNVFT+}LlG;k^l!h1 zJ2OJ0${WjA!~#CKc?!|&V;0kxa^EOKvxEZPy055prXr(~p%9-*>8i~+ z#Gwu`)FX}tG$Mr-q|u5?r~2>*ymFJUfF$LC49JX>Ppp)8H9UMm#6+c2hGq2xDX(jM zq74y~l_B|gjFN5XfjuNAg=3^lNV7#LZ8B0-$uH@KMINz>q^FXy3sK_GN)K5f{wDq!m8=F=nuuv5 z?^U|X3hC6HcnXPncjz<5hm0%Xqk180eGUQURJuhWpH;fSS;TJyM5$y`pJ*cHjjX7Y zrjVjaS19DWN+}9iSLrf^Y^rpTLbg@9Kq0#-ou`m}mCjMfp-M4l-G?|-{*0^;4+^PM zsZ1d;J)=-ay-EiZ5?5)DLK;-sp^!$EwkRZ}(guaJ=w<+gq*Yp@kXDt7)=x5lpCPPQ z$W4`&UCFwT+bS*caCb+g1?w|N$aM(YLP9Rg*d8+XRGOub`zlRaA26ZUGA&ogW0jVU z{tw);kS8h?tPhw+y!@|)B;>jL;Nu}$N=%-~93LR^wOo~#5~l}32qAeSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00UY{L_t(|+U=deOH@%5#?KWT20~K8 z$OcAjF(e8_SPrxeLL+Ku(X`5ixNzhDkl)Aw=eU-|ljA84`qM@ z=Q!D9&^D4MoP>j$z@Sn@;;&xYIB>i@j@VX6dd*r#5}bs)ts@x?WRfP^Kq7$!{kZiQ zX%7sW9_vW@0u}l?>qy49yFnnaKvk{7I+9-h1*lk8pd8(09Z1pxGR+vtGDZ+cqkrUv zF_Ph2<4?aVKzm4ryyJW3*Q~9qwfabMtfC3EXvN5x)=+A(D06 z(NviyvIH(cAbD_C2;@7sIDxE!yG$VK;4Tu#Cb$a(vJLJ$f$V}iMt3W2nM%Uj>c z1YSc}kB}SS7G1$QkXzv9xw*RyZq9lJ2{{g78%W538QVkVF1Q&2xd(2_`hW>NmT5Uc z9)Vjp><4ZcNE%$u`hel#e-8++hX4*eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00WarL_t(|+U=dsOVe=}$Di-OF$ifA zMmCz-VI&GgSQ~ULLL*{yDY|$N4_@qVNbq8Z4hlPX74i^cM1mj-gCG;a1TiKU7$_)$ zCW5Tt(_s{Qf4<*sb_v<@e&603g1q=V&*#TJpXc%9j7U$UB*$_j2eKzSvL&0cAq83U zivRcj@Xibnt@6dHEX$I7@)ijMbtnrmFLT~E0zs`vPTqK5rO~DTrbQjm76L(?=#(Z2 z#MP|!H)am;q)8&uEKzBdHi=88B&16&o$8O@%S&%oEJ$PeP)9YdrMe^KZ3Bl-0GP1$ z=__5Y17)(o6Kw#Pl#c6<8c23^Q0z(5nyUdNs~r}hbn8S_BtLaPEJ|ZKUKL74Y)acT zQ*|}lV--qD=cKvn?=x2S`*W h%|Ga%D2h7U`VC`j_M&OeqEG+;002ovPDHLkV1k%N#|Z!c literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/7.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/7.png new file mode 100644 index 0000000000000000000000000000000000000000..9d15832eb40f842cc7170216af963a2ee5f5264b GIT binary patch literal 1142 zcmV-+1d02JP)eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00ZJlL_t(|+U=deOVm*i$G=Z+UjN{(}S%9kP@J|SQt(kdTiH3yVW zMILBFz$Bz!{$xS2EuFAu(k`hiP{yRzB9ulM%!uT#bikrXO!_lINy4T{jU+R!W}B=+ zNytQoq04|QjRq16WYt=%BkA%FKw;ei>F74=KoTC1Df&o~KB9rt_*ZV|BmJCf z{OOkoXb;JtcYV+NnzfO+Rv$@J2@_U&KEolGWf$ zQ(~IPSEXLiLt1qvopqB1E#OcQhsD ziL5A9PatWf9uUZHrQ!s#uGD=3*;MKtfov;vmq2!vx>9_s}keRFiZ|V|R8fP? zL(gHby{y`_u>tXU_+*Rfv*kFOn4g8sJh!LwZP>xDeBaS-MqXAWy`tmde zT(RBqkpH#uB0azV4-_XdRK$nXSA;PqJ=YUJZ{0X@OGshVEne5Zzd1nmF@s4=oLeSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00d!4L_t(|+U=dsOI%kJ$G=bNFc2h4 zFvJW@VirTh(1eo2fiAiU1XDr~7j1W0ge+3%7x05yB8E2-aYs5GxcT zh+zZ+2DB)GRs^ww-!6pWx$n)4(#+s^zGwFxnep-A-gAGvd%q{bF$wOWgdJ>S6YE&T zGM2E2BIcvr`aVZ=Y=E%LALcNFX}pW31jNP`CNYk&=!1aRm_-4vqW3uI!K1|#2iPVc zHugBe9svnsly^>M4vEl=G+NM#c61<%PUO&qbBFr!TRe$I;USpeT@G@BrK&CE%?a*4 z31Cv}E`pYNdD%1cnoGZR2IrG zdYY*($vJCcXt3s88E*mm?C??CbakO{Ss zVYLwp=&FKvKaO`X1+9Cfdbs=7YTV90L4q)C~do z!>DV@BH>0rN=R1hil)guk$IzX0#Y>Ul7M_PDk~sMMx7Us6{F4y$eK}S1Z2ag(*m+( z)F}bkF)AH-=fMbj2c=p_5CYO{R7pV6Hlqkgi&5JG(rVPEfV3O6E+8F7tqMrisAU1^ zw3`6}k~3;iK)Q@7dSA)JUPE|qAzv9a7wvina?_|8E$+THYTA1SNjMJS8%V-|8Q)#z zwo#J;@~u(h-aAa@P7bA*Fy{rT_6g8=!#jzMZfn; zh`Od~ap)p*07O^aD^A$Gn<2<9!{U&kN-*5Ya>oFXDU-n=+b)Ac#%>0Otp5TaGKVxc zWFJ~Fnff-El?AcIA(QGVI6T{!%jmvZD)n3nLB%rctW@Px%$h|7cdBF#ubo9jyDScs zbvpnzGKNyWxUY6h0uKzY*0b(|DndB!9G5?v7eda3RnL`(=W!Nia2ltO#uore*uge7v5r+NV+o5W fVm{if@ALf&y_By_%O#f600000NkvXXu0mjfA%8uX literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/9.png b/script.plexmod/resources/skins/Main/media/script.plex/circle-progress/9.png new file mode 100644 index 0000000000000000000000000000000000000000..c6885f460a218e04886091666df534702d72b858 GIT binary patch literal 1391 zcmV-#1(5oQP)eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00i4fL_t(|+U=dsOI%kJ$G>kH2O&t5 zV2Ba?k%dH*CKOW#x+sM}&=P`V)9hS`3pZ~17gTUFS!7|r#XwimxCk&7 z1hI@@zEVQOUgL8_zkr?~KlUe7N`Ad(XS~91k%u7Ldmg4zZ72 zY-1A}SVs=4-f^_g;l&0Bi+r(yB`o5tw_re|9bg`_nDPEJAkvnR#VhYUF1zu3w!mT5 z84zg&X4q{&T$^U^<@6yQs!)v@)S?~@XhJL6(2kpD`sX)z=1oI`v5}8B!a3$o?J2J> z@$d-%lVlH{bL|u;FD|*G4FHp3njcFb+2H{68T*(m0cDCU8liM>tSFLC?1x5UBhy8p zj665_BrUpu zBz+6|DeZlv%QtKWv?CevMd<6aBbl__jRex@i>h^NM>6QX0EKq*g`<1514%hR=B$s5 zTOW}?n%yHe)<@Dd*SOQK1)v=yW6tqC^=sA+i?zB)vKB>?K-_5ST|*+zs{M5GX+klP zmqI-_4at_=(InIpSrw|yfaHX_Z9qN<)nq_6gt}!wwuHK2Kz4+>Zb0^gx@JHQ zgt}@#j)bcAwDX{c!vCf95XTHil~8#DQY}4-0jUw{(16qmwQoS`h1xYB4MJ@jkS3uv z4M?jD1{jbwq1FvZyHGjpI~m_=2<<)OE1_1rW9>k`7HY{hci#xLsNI7E9EZ>iB;de| z?jiF~sCfhOy->5-2Tb6xOwB#yiBQWY`M@;;`9Y|x_5ovu{~aK9Jw)KJ3q%eOyJA*y z)35y!qFqy!IP4;`1H`Vnmt3%GPljOWG9(U5sNzhwmU2e`v7}4_ho$WjI4rT7z+tKX z93Yk)QsA)kp(UNE?gX=;ryyoU9R?3QNi`GvxpESLhn~iqU+@=_`D-U8(T+CUMiXw~2Cm~8 xuA&-O0OWCmL+oQ0+t|bg){(=icO32W{R5FjAj;DmkQ4v_002ovPDHLkV1i_2fIk2L literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/drop-shadow.png b/script.plexmod/resources/skins/Main/media/script.plex/drop-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..ca961689b8fb2f6a58b92c603eb86db5c855868d GIT binary patch literal 1819 zcmV+$2juvPP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00x6eL_t(|+U=d~vg#@fh7;`l z-?3!>InJ6<_d6d+r+Y}vA9%a$$M{DwbtuJjFGvg9?HK(Zx} zj3M6~$0!w&?a`|fA39h12F2i^$J%vXbQ%~u=onAO5;_449smO;9)~u8p>G5-8^+EU z@)#6+2*wN$IB2k$VCWlw;AGX{jq|3!w!3PelY!tQ)!-%|G)WC~A`qPLUJsPJabyI{ zawzy949Vcwp^DxZVyT5Xz$}G=UjPGdD25E<9|>h85N|sM3?5NV515GY$pJXC7dIWq z9T*-6PZ>C%4sK`~cz-Dr+zbN)3P8c|qe>ye$n9$isALP2*+52NV8`|dn8=k+9ot8s z3<0?|D9eitlHo0-V5iIChD5>m(!R+40(&0$-n2_0*trcmV3Z)75rs%9sESIcGp0;Y z32uZTUF}6Ny!G&cyXU672Q-i(@n$NNQI~ZWp5&s6pc2oe@#AO)M8){E*}pP(r5SX{ z6|GVTb{ZX=_#heo1EvI2V!13&9aT^R39rd;Thmo?ErvV-BMJ!|g@9xHk19&@J_xTt zP!6q9%e6oq5m#lwk)U`k44k-u!uA#hhk${rT!Vpk+}yQM9ia54IE2yxB?{yN0NL|a zIW3gZs0oF?%T#hrGQJi+!14W-GK!-b3AEN#Z2=I2K!Q@JIgS?Ot>5v7Aze3(Z~c!3 z#WMJd{pE_WpnwB|m?{te-v1rz&7gqd$~09(0E8f|bXgD_g=;W0IND$llrHbbsFj^Z z3!{bd7S5U2HkzRZsl9F(+6&szSRp+mDB62Pi9G;+m&&4%5{YDtHJ3Ft3vw+|hUd1d zo>mbc6al6-7U9YOA%H`p2w)1(E-WvIPf^OX*j+{3mZX}Opav^T@|J(6kOhD8h*LU>M3ON260kS5ft~O4H~szTtT1zB8^3WJqM?k z6&aCtgIk^Ljex>H-l{kXLBUB3-; z0Rxnv4o)0_8E&j>R7G!Eo(~*Bac{i49Nj09*7rIo$0}qrGmL{H{2~}0Sn{y2tJwO1 z3&5|M-10-!Ns~T3BYA~&kzxw3EB<&Z4+Dtw+A!z>qvN3HVD{&LWIGIqSNt4#O@Y@V zpG~O{xoE(uiHd-T)Kn21v{KNu(75PajSw)BR_0li+>=&YWqnpe9n(rhPf!RMi9fGY zr!_3V-?dZxdF|Y1q|}GLMIj{gRHT9c@9LK-LJ;IC5mItY63hz!ue*xWUq!&sOt-f? zmt|EEdNBCs6vv%ZrXCIj3@DMgA;&00s=`3S@X~8;xFW!?#skuC-=M^i_VH$~!Ekk2 z$D$|Jbi<7NrXHPu8JTQj)%02;YYDK{3HUtTOc`%MId35bSuSmPESXj0Fajb{k;1dB z7yx0#jkoeYH2@;g-R_CC%YkUdk3s_QGpp?vss<3Qf*NpN9t>|Rb6hVAo$Wmp>7TkO zer56^HUPWG0Tj0-xvI##5zF}Wq{|v{TLAHipH}^pH8+p~F6kX`Uj(t)y3^;Y&jtd} zHHEL}5m*7lQb`nwm%gZhURDjj02rV2xn#ut8rWxau3@BnpNugLIDT9+ zdJVWYFVX0w<)^4)HIRtw8Yw35;!6#t_#?*O_QTX2gWQ1vkV|W912PlJip6IlaAv|7 z0y3J*BIsMQN~#)1@K@tOuxG&TT%M`dz(=f?a15xLa(W+=Td{@KO&UogMTzFoyE zMfA9`M_{Z1(yNA9hF;MN`X_GavPunk%cBFKc%P9s1)F$`ylo!jjU|8b#*(v+nYUj3 zp>uc)0B<=h`mlySbguLbUosVvK(Zx}Y}vA9%a$!$wroG%{s3Tud$Jej!o~mq002ov JPDHLkV1nRjIhX(d literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/gray-square.png b/script.plexmod/resources/skins/Main/media/script.plex/gray-square.png new file mode 100644 index 0000000000000000000000000000000000000000..453a5a2f80c5b7bb0ffb8a3959cf447247a08c68 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih`sf0~S^x72Xb0-m5?%$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj3ld}x}e#mjIzk#UOZcEh_s1q`09elF{r5}E)~1SO;Z literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/avatar-diffuse.png b/script.plexmod/resources/skins/Main/media/script.plex/home/avatar-diffuse.png new file mode 100644 index 0000000000000000000000000000000000000000..f64652769117e76e864eb697e7919223ff52aa79 GIT binary patch literal 589 zcmV-T096}1W$Rw9U1s;IEX4V^g=X)3>khBhL0>6MI%5e)E0xdH;=QEI$pBE(^Nowokw9~s5 zi*1w^E68n2>gn_8N!lK4uZ-lZq^7=}rli@jT{N$nlMRq;2xME7H#0C1Iq#BNKVV1b|+EUbYLy8 z;F<#qfdv;#QU|C773`X%UfG@X7?A_dfxGzGfycmtj}F`g7QA!dGO*yK1FgV;X>!%Gwb$i zl2me@0{i(AQ^m5D&il#bHT^2qpps51tmsY#tIhDqLilXvd!<|7Dj$rJu!hg5ZPYJW bRm%Sljvt0l8(b?t00000NkvXXu0mjfpx*k? literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/background-fallback.png b/script.plexmod/resources/skins/Main/media/script.plex/home/background-fallback.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3c9a8154ba2c9cdb0767edf5ebbc463c7b3d2a GIT binary patch literal 188030 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%0A%$1F^dB(P6-Q&TdMKMynSs^BgMoHxNz}n#!=itF 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 v`5RZ|S;FIbf+F%jY(MZ?&?X?Pj^-z7w$U;P6? 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

F^N4bAHlJLA;zo{R9Y!xEJ+HLCN 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 M07*qoM6N<$g4b5s3jhEB literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/busy.gif b/script.plexmod/resources/skins/Main/media/script.plex/home/busy.gif new file mode 100644 index 0000000000000000000000000000000000000000..0c0828a6c1c0d7641cd0dba7d76063b11fe676bc GIT binary patch literal 58766 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

-RGQdba$zd_alDAg_ndJIU2vnkH7LRU$@Eey9> z_n1m$eb6RB2&>k#E2_-JvRv`JZ1a^F6)^jbo8-sAM=6u*ZXNO{gut@f)DPD9LyuD< z0r(jGi!KG~vc3L`qw-H4T9fu{gYDifgfrxOi1SWV91S`w$cC*$iNkJI+O|mGd!)v)m93C3xt%Unc8DKLn2R; zlz5>MP-gQ%E`Qu zg$Fwu3r@EeK%h~ZB3>6gyF^is66;=of?~?(=xuBFb*mGj>D6ydUR%2mK zBRpj!c^|F#4!3Z$swkHV>>(W@NQ%F(ORiQG5=EhP4Y?y@#VgeOL2Bl9R>4hF@f2C~ zj9Bd72!9!HI94QjOB4l(;9Hrib)XXL!NSlvLnIkf&MvuwfxliXP_m03tQ1d=G_mb2`2FUrrW{J%SL1FSw$$;cyQ&mMN1OI$#RjuBY~rHc4J z*E!X(_FFyFLev5RPVR|2C3f-e_V$nPj_}t}a!$Ma;NeBpYuDADwT5(@47ge2BI)TH zh=^DP@jYb1qYoc*?2LDL=y?24dpg?D`SO+vyW79_&MoC7I_G|+(e`|fwEI%+1ssam z^=)qVss6nqb7vmkx%kEn8aN^vzxv-DLiwf&^08q_?R`&A>=Ef)P8Ry0YD3_S%6Lt3 zi8oF4_m=wTdzL1(-t;r#eZYjnO^M*x~DM*B6F-**|}GbBI^MyL-nN9Y^k#nftzu+UOXp4JvNE zcjOp7`EuY1#{(m$Rf(D#m~lO3vs;Efm6Un;#__HSHjbM!FVSv&KfCL{U;>FXzWA!v-@bbAm@jz9eZG1`DNeRLmOkA zcZ3|Gl|HW&2ku>$8aHS|(Oa!7&$GI@A}>m}GP&BZ`p^mOR29E(cN;cYdOTwknYbJ6 zeijvb{l8un9}zh#4nd$Jl$1z=7|>Y^^(fozr63bh6Gn7=#d!lD)_9IZhhHE)fsBr| z*N&|ukL{}5p4W-=65|+)z-s+IT3T0HHQ3I|nxQwIK3sd0!UH{>`#jWL2B!^Ejl-?Q z3Je@ZfT#W8NGk*(A_)Sz=Veeu^`!QOA3nMz%j^?*#xtelDD`cs>BvD7#f`WSpoUKt zt-cyzHdE+8XgF4Eq%4`)isCjSs$a>>>^K^XEfwT%1h$}Rlp(B{SZR=IP}Tb%HA^P6 zI7Waf*^y9Jo%GVwgK*6M1VYV2c}Wu~llH;9nT)v4I@hNz`c#od*>tX&F_B<`fByO& zQjNj1KBa+78voo@XG85jh@|w+lH|C+{u{wjdt=Z3fLX`49+=!N>0AD8Zn2VuAGDs+ z+e_YJqL@0ciP8JRc+y>ixsmeip2~I$1BI7y`vws~uM^C#S3TK&Ro2Qdp?i~RlSRv| z*Ev`^%wVufsNrUqcI{zU*hd)N`G8aupmc(ibjxxx$$iM%pp32|8?i3&ne&NHJzZ}v zmeb|zo0@(O|27r_W05BOo}*j7PS`&Bq2Hao^}`&CFJnLCVmEqzT5h8p>GwqkH5TRz zO!++wo%%L6-ZJTUu}4o9KK;>&l>d$x@C2FT~xqDes^NHab2Eedj!|DY{5o?WCGz8OpCI;Owwu-I- z8O5ekGJ%b*DmnNpWhfFSH%M0;dzjP2^jI#I!c;OKK2_3<&Yu(F8uf%BT6KSZ2^hgg zq?u;*;mW~{?uyhNSV&hCe&-+@+jY4>L;~d9#J9*nU*S6^+zl{dz+yR}NJE*ZwWB*r z`>i-Pg#nYl$^txxX`m?JovvxKgx=aCw}sK8IM9CAA{tyl`-dPvL*TBzH=!WD#n7-& z;<_%yMmDJhlyB!^3~2tadb=|k-x}`i4wH&D%tfo7ugq2<9>C;_JgiijhrG_~9le>x zfJ;b2${Gid4j5zN>nbqJ;YWoC7hxCi?Y?jL)9L|1_u0L(zVQ`Tj|^*>{BdRZtW|wl z)f@(@DA3`ugWWJyc8t|Q(?`L|V9BV~Svi(u*g#qY07YaP@=zatwY;(Tho(xr#|*J~ zf=?5#UY-B&NErG|ed8jqA(C|8qD6Yf(vSgXc>jNtz4u>I|NsAg4qF7p3C?iiO5B=O zxUDR4lr}6hOEW7nQ*s`Lie_eMY1zP$qg<7%9D&=i#IiJ>W|$32D=JHyetCWWg7@cg z;lgiR_yI2G+#a|4^?p51&U!C$O!gtwNt%6X9gEi{Uc2jI7(At1sM7v>lxdopa?Ac0^Be-PqmdIa{T;>cbd$d*2M=gwsMYDF z-t>KkTcaFD6?6%v-O|2~W+lAGa{-6CbkEj!D_e_Z>SIGkUQc9)a|% zcl7ByG?RqF6}En>5j*wGBs3EX(c7_(2-kkKYISiV&f$HeL95M90dtVsY0#efEV zyuTLQqwd>KF(Ze=+%B%GeOa9FTxkPCC|7?8u6uerJSvlir&8ZiZ#$z;@Z#MnySqw`PVr?8DID2-@bO71DCgbz zc1zGNxpRo)dKKjN*xZYVZHMh~!F7CX3kGP&{BmPMr~eKu_p!@e_VriA?*l$R8_!^H z8vm~B0>cX=ath?dvj-#}HoW}x+@CC}yOz7)u38FH#IzP%PKBWm4gbk@8{xWyx6Jhd z7*6~Hc9?vKOk{(Sw57W}od9(Y@dbwj!e!7_N|x3$LnqetR6H+nJtUD`{O`?PMnLjq zfFYBkGQF9Zu<4JC-@*vxB!Efu&e`%$%PQ*R;FIa$pwj=CEWuF|yY|_rk1ZGyfrH7H zAhoLQ440%LPHO3)w}jF#?!d9a^|V=~LFZd{q~C~9TKHNs!wTVb5&y{NjngTg;rZ_~p6;Ws4W3bMctgk7)>~FUl9QP)4?a;=>>VG8RVIFf8e+kXk_3Ik|Z>( zPM7dN9st&S{xh>DKT)|Dc#fBJg9^~E|K90-J@Ibs+XII>PYH5x)JEfqMh#A z0*74!{t{f%fhSq6%jkSwl2sc(g1Uf?m7nmjf6JHN!5Fi(z-o*H*-I3D+apN-@_Wxe zfdkBs3ZMn)h{5!>L|`E+2~JN2CZc8g9$RE}I0V2TpeKq=T28Ib0yc@G5kk-h0zfJN zqsrb>Op4Q&ir8odYb9YnG9S^L$T6kJQu+$}(z~=@S?snf;CO4KI<&!%1pLb4QmVP8 zq0sWc31W4+f;8FO8&r{?JoAz2(Yzfjz$luF^ko~j$w0?+AF{9bT$&T>Ac6$M4rapg zIn2R~xa#y>(Hu%Bo9L9%LF9cno^@zB3tG-PQk{{&;yRErmlNUoLrao))a}^ zZp0{jb0OuhT_`Ygn~s7TZn)@LL)G*+XgM#p^Vh>Ntz7$Z-+(g1jU@ZEZuf0xY~uJxc)&W_ji>T@ zWCM$-jZ>D!d~0U;y3@*?hd=7?{6rK!;zI}}`!R9Jk!hsk7$c~-48U7d$6-JVU*S2F zS)(;-uYalDc<|zA)T*?dwKsc}cd{Uj^mSjzFvvc3d?$!VTY4IzQjB2B#ayCfE1_sq zp4L$>;|pP4zDw}5^|{L)E5xuiJuoMOA1Ta1AqFoeO3rn|@oz7AK-zNE0O#1oMS5gd zlir;^C=f*PD5`^GSZGZzjVzUif8xO!$kk!~UKgwY=} z-cd!UXfNAOTh8H1H&n`olfHQm1?9;BpE8e6k2 z5URZ;D|0V{7M{s`L?}PHx`bYwbY1bqFQJ>iH$`lAXFwBLeWj}H1_trdGR8`EIpF~h z*Q+oF!Bh+68&~eYUYf!bKWf(UVf_8=eKldMk_Md3G9aQMH_&dv)Qd`LFJmV@SnFF< zGmZ=`C7ryb=#J5=DpK$G6E|FETr&PJk0wT5$0yHoaUp;uPcg)`1_#>tN^ZgS^tgVy z=}HpW8M>;5-x^wv{s>p{j2*SMu?UqMpYS;2g_nCXZEbLGuL-Z<9 z3vYWzd2TS#Ksk2i+n9TBn3EEX03I+mCFu>kN^m^fgb;68oekTBxN?W!iBmuj8hx0`cnd;1 zg0BZ(QHrRQ4K=(gtk&Wyit?~O>ih`pUulCt+TWRzBHruV$ozjRkISzh>f!gc@j!(k z`IpPx=vDO$1V|18327zKow~WcLqp!j*FLnDC(l9e{n074RL&=y8%OlfJ%aWc|*Qu%F z=C8~!jYw;rG*f?pro0Bo)U|WZ(eO1;OD*mWj#kn@2}?BwO}gK(XYzFDwDiFI{&m0d zb1cZOv<%o8Z=MF=cD3zY76LHu3dxz&#l4C@^F?kOIVdOG9(|D*w4G8~!R@Ea=;?0Q zxX$~m;_4Ss76Sbx9ijlty$IQ8Q2;$GDmyX&v&v@8P zYQdh>eBS{IiwJ zl9=zg&76oIB-dN4HQ%e1te_t~bF27atvV%HVO8k&>PuTQNp_ni#l~>ORhW6-L&8am z6k*fgGEIK}rvE0p)LUxFK-g^tys;iYQH$&L9Bs$Sjs0l5tp-0DqQ_B>F0B{VS*o0O z$u^CZ+@0vFS7#8AA2z}eTCCM!&G|3z9b@gM8Se7h!s#EGMfE{6E5ln7NZm6L{&C;u zz&8&t^7)SUzMncQA3yZcqmYbNzrPWOhu7yJ=Xf*yxed%Tz$N2Y&q4WEjKpY;>xdefRe0G@z#NPN@15=RzmkZSSKp%j>-_MVM zBm#H)`k7}q7UzaWaijKWpK6Y&p^ev?Ys%iPUAI7szv3D?i{C zy0fF)(6OJBBa1(b9lsOhTCN4@A@ zPi}7ciXniXD)+e&eIaOtD6{=UnYcYaw*}VqS@JGDkve~A9Yh?{`GTSTetP@Uu?xQe zX_N|zJ!;KX*p&(>(NbqDk1X|O(dJ#mrA7uaI8(L;EJ)|c-IbNJ3k=|%j}Qpd`Sd@aNesX2&w<4*3l$Woz^7HZ%he4jZw#QHudQ_9N7DAnmyP_J zya#~~pFrST4I~Fiuv&t(u(nkYQCqlDvy_}!mGn9bP;6vbkrDgLH!6$M6qcdr0bu3_ z&_e_;3^r*l-HHI{F@fK$>92~C^q8#pEY{}%)RZAgv5jL+`Co*#B5|n`sYDjw(3YNQ zvI6ylq?}&@900E=1lPieH<}1|k$}~d)IU}16~~m!q9kD!OP+T8(QD9?l`&exYktS^ z=5w`|(;Z1^@ap)MZ~p#JMs#ShEs3j1;_9-1nk=BZD2b7u_NW4Npe@4#!}V^<{2j&n zn+WJ&I5kB`qwoGY`B@%=86*E&qe=fYwP~e zH8PIAq&1fV;QjPH$3iC*c7q4XtG{$RaCcrv{pZReb>HOi_aZ!O?lXs=As%+T^H}Hu z_0>r#pSRYszLa>M@^G!Di>%p7XK3=*X4!I2hBC}Tyt&2lUeyPeS`N+sIQ3|Ao~zZa z2{|{0IN#JFxW;{~;yDke)x8(1;?_ncmLk-9k=xcgQhQZwhHs%fj|1 zvlo`fO-Jke4j=pZ^TAM%*K}uaBZDpd_W4G|{pxoymCHTRbvV-)z+kMwuG;ZvBP<&IW3+HT>Qy1y& zYb5L0eHk6_H}|>TQrHw&;x}=T>HlL_iPP~{ef6CC883q4(Xx>aiLl$iJCwHj1lE_{ z7ae(FKNP@k4&s7aLm8f^*V>N(JeDNf;OKbBu6N6c8p!KN2YyZ;v(_(P#O7DXOgq@s zEZy*o&BfZ8-cavG_*PXaH``=)>$#Qm_M-#+(1Ar@7O5-_<)5;Pyik6k?@Z)f=KzF5H)e-f=xgSYgvsiktJJ2BqD^uG z7YP}v#-SJ3N{N9NtMbC~yx>fcMgWAqP@^F!IN2}fu6o)G6tOiL8Hj5JQ!G<%-za%M z3sFq%y?ChWfZ6pxN-0k@Xv!=Qg}0NM)v{hyn-sM?&Q`$suX|oucyyzZmtr^ScLu6o z!4tSOv^qKJ_D(ZePwr#Q2oSwG;y-T7l){Z(Vn9lOJAHOPt^QWSm69sN<>q8xtX!^M zL;2+7$R7gIr+tJLi4{F!$2v*Hwr+=5Z0#!edOMKryE`)w{qssH&QthVd7vfm%+&(C4WjlAiwg}U~Se!=&wz7>JPlRgmBoC)uA~ZEOTn(D2M^W`M zeLCEg_A#?unEBc9fo#S6!5*`2J-H2JxcaqyfNqTRB!dT6OLy=#Pn}V)0ro0O=w8m< z4X5m00VG?JkMpB1@~nz8Fv;8iE-e7Jffi0?ck`V06LKT?hWhf2gVJhA{@K^1q%{K0 zMpV@bz_)vC>_WS*@JC#bZtbqTal=N>e!`jRML(5Ya#;blY&bU&SWM{ljh-B9@D2`( zPPxF_94A5!#=B{7yPpG*k#RG{a$eB{ESlIO1+a*E^{^;FIJ?Q0CP z^lxAGp~3tv(1Nx}$(6LtHL6K#%m)wdJ}Q1{AuO#w zwcL%J{sn5!**7>yj2XmHwxW>M5M&v<+rBZ>OG=a95h~iG=rUnI5!}jdqlH`FK$85_ z8q9_8Xq6e*aLhAQ#nbMcYVDKmW3=1mL!d?v|ih-4EC`QXnY_bgkU$=jf$I}vWRwU8~9sKrU6`h+jz&Lu+_K; z!ES&;lUJCaCBG;c$0LZSH|3u+IrGq;dSU0kwN&RCbJ(9Xz-{C+s};@>GUwMTJ@k$V z8oOC*=EuLSozITb6yn6w_=8UOI#pwNHDLv-M9Qo`Z!Tjt4P0E{v?JZlK$nGimv=?#YyIpCsjZW1%IB)Y z3WlBYZO$FPgn0d|S>!*+F7Qd=n9MuL`tI5zUX5%OC-S3x(?>72=YsctIe-TH0rMM+XjbO8VAhXj3L1pG@mk`4zk0BwZLS0zrQzClrnfJSqP7trFeI#y+VAK#ULu z!?_qxOJV+PP4%{&2TbeL z-Y)S52*DD>F@{j3xGp+qJviw<(Ou#73W(k7g6RLW18kC2-xfmoV@__J)`vb|89QEV z`vA40^AKxWH^FRJ5b;wd#58Z8wiX}1bb;VB5*scdDbke3G<6Lqr7#>zsIA@zB+vey zdAZsV-a`L!k42uYS@R)rLAz-zm*Fp4AIbN7?{>C#V?f zVu+j*!V>6g4A1qo(H^0k=599Ami)%=nhN^tmIRPYmb10XlIxQ4oaw1(c|PsYD(3OC z>%+l4=`4kAGfNDnWZ~xSUytGb3o8UN8*jkOfb|o2SefSN^l9kz%;E2s=l^_KH-2~I z5baxnMz{i$xCFq+vEhos1&k9+dxFX~YwFmtwOEK8Wb)1!0AFRQEVw)MJC?okNqh>99f%)ys9j~eL3C7Hxtg3y*PT()Y*3&>T-f@^l>*J($o%AkY@0*vb3Fe z;UqwBIo(Q}{`+0}0SYwT3P_eRM7E3^5%4({)ja<;xDo-T)rdl6 zZB)reL^z#%Jdg#G!tU@--VNoO3}&u&LNlqL^V|j%G72YTUvx^{Gm$$I>c{(&2)K|T zaPTC81e%cHwm{6X9n44q-ysD&d}Cjc_^+4KrxNp`+W@-+Fn%H!MMrJSM=ZW&DUoF? zN`#LXq*D>A0`}PbzckQz13Trds;;j3`t|~S)TOOhJ3QiluD`R0^Xk~G7fW1Gtycv0 z#>U7lq?{~$tEy|%4G!HvSlD4lMsBM%x1jE{cOW~3BEmEQ>1tQ=zkuCf5T~px9&Nhx zbo}{b*Nc|~6#|9eYVZ!&-WlWF!*NT%P7ZMf5px48|yj-^I9azS*zQEDmbWS*1!wLu{VIhc>KB=a0jmU__5LbePSDH>q$ zw)W8!nt{oqjd;z)MY&+gQ1p{mIvLC66M;v5?cTE8d~3{wR^*Ci=vp5#_eJemH)Y(K zrq>$|DsCRD9ynFDso4L&7?un75l+eUt+4^^XZ^DdvRBgPxmG)(O_^xuQ!aJaE=M>v2iFx`!UW zZ)P|fNE=T_)Ho+d_~A0IRvxyZT0frfwy*o7_9(r_@73thsTIDQf>I{d3|Gnl*R8%) zmi%MJWIG%s$e+Y%i`nFCBX?&{Z8KH+K7EDBYermC5*1#2LvPS6FVH=^5_{B8I(c!< z6eN?*rw{h3IvfXtiKN`ul1=fdOPY+uS#~ zdYYq&)+#$|X0B&2EQu_ zUv5&3O8JtZ{N6t74Ix0F)Hf2av(8g>53cn1Iptwjhvy-;4>cpAe)GGBww@0APL#p! zUK&TMoH(k7US3|(f=GkpWN}V+eZa9jFyxG6p zw>xXU^eJvnTt}2oEa*bcZR)LOe`q{PTQjq>x6AW=pm_CmwaOL2Z}s&Uf0V}GUsqH# zZx$W?^QHY;UCI`f+Appe?FAx)N~izn0>nUpUdjsbzauaE)Zes|*w?#=j^zA!vlpf+@mcriyCT_QV*1OV2^Zy%k3-}5s>Ko^3fn0E+9Lq* zpj7q)fLPU9$sdQ%Jey!KJ8?o+RpQkhX-Lih3)zJI6vX>xg2q-ssX`P5Zd@(N9Ezp^ zttK9t-XMR7@=D>rGTcyqR#sf?#+pwcOG1x3!ra3+s6yjOWH)W>;$047ng*YFcL(_Qmxz8}HRP(nsH5!^7I zfV(noyO)_m(=~lpMyAX8 zv*-2~vn|v>7;*V)kq(t>$R^wf({;z}BJ4L#|GBA6;|aln3bzf*A9la!h8uD9gylo% z&0C%zvxoQVy^;~B#VT^E#fG}FV0%=ZgPGg)*7@NOQvL32?EIxD$7|VJO7GYz_&B+* z38VTSwwdvN)xoubo6&8VY=JL{>w?yU>CDjth?&Q*w9#B89= z+4@L0iYYXKK{LgBRvG~CX0G`%-=oDEK{~AXG7Ddh0uzGAe-K_co*FFMmP9wQ@w+z$>*NOCP`+FZ#?rRl+<&gx*NLN$#LKmm zi7%fRKsaV2M@`$UHuls9G;T0Q&Pfjdo!nPk#UVP2YUp&edEfQ4kgcHrn*Y#3ZES#B zC8IXXNoI`oH91rq`St}J+P(whfL^ql{HnQw(fg7SHTCMst}Iwg;ym>JP$}L4VykZh zc9i{iimER3M4fH??=1=_Y0~20w}~^=CM3-_Kh7)t`7rE@6Ww|ABKDnfBS$^76@O@1 zcrg3-#Pb^WR*6>~P@CkSRM^@f^!gm%3~(nB*fn`nT1tueo!ego4UTPW{0=cpTTs;2 z;Kf-%?$G0cpId|;wnC-D5=hOkt;4c-b<)%M>20;b?wV^>eSQqC!m)`SM?w9GL(sG> z;G}Fp26K=E0Bkz8j}Yy_37eWx?`^|diaGdUC}bOr(dwFaggAK3QgKRvRA{p~^B@^c z63RR$PFd(zT5l+50dn&dHTgj%S3B}K=xzM9s38_^5AtyE)yDt@0xbDa4%&xF!|lk2 zE4T>o3gkGgCMI012(EbH&CxBh}71-pXNUk#|Yf`*IW6GRo@&vfU_pr~F z*tfa{=O5QsHUYkpD4K>4Y2xIjuug|-@eUYOfY>!h8hKhp+^4RY&9}l<%^A37~09U@vp$gdKpm(v_eP!T4x0?1Gv? zIpDek@AIgRkCW5BUqM2j_OJg9Ffq2Vk5OC|ssu6F-%_t5oF_$#9`es~+Tbu48=fL5 zTt~a>Kfhp5$o2);5P_5rKW_`YT0HO6cU8=xw>}5=e+$r1(2~{NJ71&xTL+(h~-Ku0+w zQ=;Hp4ai-gvrVW1m_p(&l`XW-F?)CZXT1!ZL-oN{hRsSOuK(`bRn&!n3(yFf*$rH2 zgc(CJo%Ng}peoz3y96p)vH-Zc4ET0sBTS<2J}A}Y@*i}3-|2ho9F2A$ia7PdFl0%L zX8ibH1AVsW&u0(XF9)Fzby#*ZxzBDjB;Lbu?-VaelDHKxm&%SJ@n}1krWm<~$#ZGr?#ASOHObSZ@YDowKM8m*+S^qY ztr;l!melX#+~k36HV{fv2-gY;x~=?whC5Co5O@u|x3_`%Wp(ANmkqp&3M#9rtIlZ@ z<1H) z&CAU#ZSA9v=TKOS$&VkW5ViPk_ix>v#kO?Z-TK&dPCo`?N1nOZ&h5+7yD_j3WEmx< zRCt((d0r~26M9pm?2?X6-_K_oBp$q4pN)b&la;~H0~jiod1(kUJrGjf?Hs@V>s9{) zu#k(a_cq{ZlwE=DSEmuRwq!%KV$TDDGOseZTgCzgy(aMVG{d^!8~v(twhA(bk-hcC zHu>Ev_sn`15An3OM3!Iis`>h1Q>z>qQ_r?r?NhSIIB?deD#&^F%H#Uj=j!g;L@LI# ze8w`hgB4b^pYf$;&s{-CmikjOlKWdZ3Xb>b(xD#}I0Mx`DmR~fj(JeGr<`wD@G2Aie4x=OuMrf=)FBF}yp7x>PO;O7;Jm)x}o80*K=shcH zuj?=od22L(ddnG5PFzJ&co_XWTaxJ;Ep0#RvU8VDk;6|0r2Wi9>#EW!Q@#DzT?uIaYhogmyorE`nGJNDZ`{9bBo#g z3fG97OCT#rU~;XXQqw!UOc%|rxtf+VM>yJhhIV6cAGN3ScG-@3LMSf4sJ>~t#I2#J z-}*q^Q9rkZqxuya=Wh*1u#vk)5*$2k4fV4#TA!8WABs|^@2qQn7N|GSmT4r6t(%Lm z?(cYYYkn(S$T|42V=sNCq3p+_U|PqY2sb1K)2_h`)WEqR?<-Yr4w4teaP^`x*IbyvX?EiSWfRkHZXOd0af-?-Df5po zM$os1>)RK=QOtJ9vBzY=sE2AGFl^_rcabbh)$uQyRZ+V>=AnX;b^1mEDFF==&q=gq zRi;mA@6@r7;RFZoip@(?Q4cJ=h7)~Y-BZkwu-=(0MXhD3_9eE{tK_WCWh#Mk6!mnY z=Zw=U5C1DU;2zh1ZL^P(uH+!RoYFEs9Bk_9*Q%_t;mkKZ$@5yMCJ>T7c%{tzCLXi^ zVV|mHIzm|pPDg#If~3E{-6M)ROvx7Ef4@&yS^qT*9sBh6$62~t|H|^~B7fBKnOvnm zUqn%-*BNf4>8<=(yt>k5;1zifp%FG{_4jY?AdPsDCWNUIup0rgL9TGUjYX+E+)g4@ zt;XmsOE{!OHx&Wk)*e7mLgw#T5r}!XUl4qi9}nfn65->RFjG&28pgL<`C>lW+O=0X zQs|-kI3HRk4OKu|!}L_e=(P*sL`^-mb*&`fi7gw)qj~A=DuqJw*{aF`aMKBftcsgO zwGdJIg92VqZ5d%pC`LCw90|jeYri4k-qy*I^I*BgsIOOs90z#}SE1b_bd{5R$h(lO zo88!NOxZ%vBSez9LRW=BNq*L@S=DcCD34g$%GqN$H=VscnTCe!9H!8a5Gmm*lk^n? zmkd-l55Ub}qQa^|H#0@kJMNJ6d2kT?^ooIYA)m#x4I8NvzJQF(o2W`#j^)V%=$)?~ zb2G${Eu4vXa!#b6GY1$H(1(MtdUBn12v|#vZHqmG(E&K5Zqv+Tflt!-gl-2HspqMW`&XK7H%u!7vZB($)q{S;YlHI+;2lS4q*@UWavH?o>00QTO*v$fz(VG`Lx zrxx>dNN@u`vQJ(@a2}jiI)M{|XYiLt-@ z?VR*M%X70J!wg8X`H0t9!MGDPZhWjz%&u@c6m76W8dSWx3Flb=kT^o*>gcBmn@&}e zc1gy3X!g08jh;cRMt7bb!0TYj}vF7+>NJX40~(7Q_m(i^=Zbd=JKPVp|Csvr86f) z`c~J9HhIBfOr}69pgI(C^sdcghm`RhCTE0|CjCXMfl$2R9x9P{JuV6adWNMMM0p$X{u+E_D5;BV1Wg zh249z<xEbDQ9`(SL#=`@CBUV<%7PMqcRl_+$ei32=v1{7ReMY=v#Kx3*7~ zd&bVyxSXXzU#^oL{IR^1kEUe~P7c6ro^_*d(cY>>x}nn&zMk58S4jusoIBI^RsQb6 ztVu0?ZS%0Z)?_}?a*jQc{0OG-DEGZ0UDRF!^u)FMMXoX+3*n6(=T532Eu%}34vg_4c>+O@0)_(N=tqiBZAT;9A(kw!6)M8#omz0PD0v?FNMF&j^@P@&8KICU(bBslP`5>qJ_MVLgsw*m=hee4T$n zZ!7TM0&eCD@UK-kuR)tEB?sbg+L`<=w!HBGsLLb=oC1808@CP`C zg7kk`AdbNSi{T^z$C{B;LxcynGOwGYxiMp`BM_U(D{&u}()1YdTGebNA)rX+xsy1* zs?v?4IY!F}e|pl?Kx*PR#|D$;z(g^A7^4UXka$>9nGoZXqRCJ3#Bd^6JcB{NAIiir zIsO99f2|;rk`XYFWHX59d1hiP1v{6LXEND^#Pr?)wwG@vNj55K&E)eruw|YzHR%*T zNq#(TgT$v7wzsP)!HN;zKL8Abqzw7+_c?J4X|RLEng3eBai1iTASZuo zn>t2>`#B~3*P3chN2uvLsE9)lhiEDN1MK@z>0B1SoX>eWkjX4QypaK0YN4vrQJbVP zEQ&Ygd#ckZr+hBms4deGK&=&kiX<0hDoAcbCP)t>DV&cih7Aq17J|77<2}Yq{_mVf z0S|#NH9c<%loVdMDk$Y&EY{G#S66Bv%IfMH$}1|XWr@4h0Drl$qqE?Ak?C!GbBlqU zU7X#Wu7{7Zh1aTj`v>gQCzRt1YDcCYj&?t3ZXKLZSALJh#%a9#+)&Y7-P>yM_PO%> ze2h9?3alTx=v_BuAOB&|w7OfoN0^n5dTf)qAh??OxGwW%La;>Z@Qt-0TNJjW;T&%*41L=t7F>*0TYE9iAPBC1 z%WUGi>W3O7Z>#!E*T;l`wV?+|%j365h7FJC@3XTh-81!8de$aA6ug1ghN zu*o+C5)OO|wNDjEBdOp=kWL_%vWw3_6&)a*MX0uzl%Xujq=IZvL#oF$zcmUcbK=kr%2Udi(W;(QRH^_GXZG@FoeVI_Z8=j zA}5S!cA+P(o!`5EsQUtN0or%|Sj++AOE2vN;N?TI1bNBb=dE_sffB?f!%Jx?-83k zL}h-E6dCH7>vadmjexE6DsS@hY9H9PAcqW%)wb@9EgVJ_>Ly2kYR0Xxw@{|ZXF;vt zu@378vANbLG$)10BkjbMvcs&cY)}|qle$F$2O(K}LSF^Bjb>KU;~uU)ebnsJ*DXy)51#q~OL!UP@H{P9$4vt4 z68F5yb)5E?3FGQ4BTux8mR{|pDSQX`r}g^Y39`EE0r}y-b|TaAQP$kmy?TT2N|)5B zNjxR|_s15lZYJ5e;*9s=wwWVGF@Ckpw#%1IVDzs1>A>5T}-G*KYH6yfA3J-_gR6-aHb zNV!^(tO!ub@-j=%&?1^_5`ybB~q{SC*Q{w?! z^jJX`9xT9|Oj|IP!pG1yWNZN?d-{mHNXT+%NTEZw%n=ay3uD$n=3k981u7h4O zhs%|VPpYtma_W|&1`x2R?!FWNU4`qdj)P>3TP^HRjDO-qu}>};HW&F?VR8)+@6HYg zBEXb-WrG6#x!N@!-8ZO-P#5b9p!25=VkV#}O^cSAh(`0>YMXe*g~yZ~X;HfHb}mRg zTdFr0Qb-YxjbPny5pA5%fsMR@)P+*-)N0>s4OvN`=B?az5Z&7t+W%^sAmR|m+DIw0 zEvK-u&eFnTRU@3G;R|k_qoJY3skdehO^Itinn;VFZBCU~Q0CoIT6~OmP+*i{2ZtT$qK;io0SVQ$B324XyzHVk7 zb!@+?!5>E|U6H2!P7c>YY*jU4Q24VqBpUD*g{Z$aoCqVH1 z%O0o0psY2;q6cCB;?N}^&p3Ix;K19%h2;xKV#~GDYpQ#cUN7vmNCZZ98(V3O&0+Qb zJRd$V4Km=Jkd6f;|0Hz~L!)PT&O`F))!g!VdY0=uXIx=g24S7toAruoVDwM%RjcT1 zBi=793%VPcNzYQG>_D$xhM%8b5hAy)zxZG;-`;{pKe$VA4dNI^1lN~BTSCaN-Jwte zXv2}0h)}C!8^Qk=3!dZb(e2xsd0WYccBimQ=`9JBot<2CY&)#u3YVY^4TY#maBGBY zd>(_lp70x9xy9l3n}-Xi^@cb#jHvF|izB=%3FwyWeDXR=4gtp5Xnmr zg$kbQRyxdtuUIw-kW@&7l}Y%Eth8UqStX1g{D&qqX^_KxkBQqK{y4nq@7&QnLTxiD z+A3H8+wJ@JMW;-8Cvyo!5V<3}KLaEu2D15{2)m;(Su48qjpe<&&vX>NB+S!rN*_-m zKM3BYSqVPMhXM`PEZ#gWU-!Kxz5B&p2@)N@3hv04H4$RYB0TNE9a&w}@6qBWs7sx@r0_>kn;p}(zwKOwauBr!1rk_Gl@B6oKqC^1QU{SJ6j zw8C{{viJjOqE;4m2^~6cI5vN8R{;FDL@{O_04u>WGC~}TrqG(o zT=v8p0-wuEWX+?~z48Hav>}p=bbwL==J?2o90fYpnsD-VHIn7)%bFht$#nP=zKH=9 z86`yCTt*-Vlg=*ZSVOsv(aE80un;Or_DC^P4^V}M+#^ODZ)8bAxX#ewz1I+-0?;)- zkN-sH{~=r#o;zPueBolrrOW>d*Jb4u*UlplmDg`%SDTtv*WS8b-=NWO`;MU5RHF;u zdbj&xHKOw#9`B8>>3LMp+@&#e-`iVbkhw)lvlQp&M#T)SbKa)LBEh(3id=biszww# z<8?$&*2{_1OHP5WF$E(j+ke0PLiUn3IA+!ee7kUq@8D%dxGvbJrn&a=HL|aVzSm`g zr@;Xp?5M}#_=~rAF@_ zD2Sc~-GW7B23v(rqSGoB+xSEWbqxR&y3ppkf>MUPf1QVc7Vt;@s|->j)nI<^lPuy87-lmHpS< zu5z3j4=C1YmO(WI_ph_dxW01H;2rhHP(zo4hp5tOc>4lk@UfnyPS#O+1rT(WUaN=P zwdP}M(T?WcO3&Dxd@#QE;-}WHAjAVEbjeVM*Q=OM!xIOe8u^6nxsjhV!akY9;P4p_K_C5`bTH8Bf zc~Zk|)JM_n*fX)`*EKv-@(VNgA-`09gnKAQirrpLb z+k$4h1k10Oih53f*2G%j{b)2@zYj9$T1JAcgs2x7f%YxL(Za)bUoqkG-qRQy1iYcO zgSN;c<%jRS7jATO64w`L-I5DMtV+=?*~8$FHKn?o7Y_d)Yw!Ng^#8~I@454lId0A) zG3Vucsy4@wYL%j*M#>>&O3sJp4w$IdI+9c)MTMrsL^UHM)heNb8YwE(bfTm0-k0x> z-(NnT%jNqA?5Ay)%l&?TTyNJ~Eaa0l&FQjze!9|_XmNd3JRs5!@9_nZ<_hPU!L{92&O~eFH-iPJn8!I;}Bx! z<${0Ryk8I{0FR_`$*$tRttcB!x}xAEpWOkE0pM0DgcJK|w|lFDp|p!&{znXJ7MnrB zWuQ6z6~OX@7*t&1?w)37vip~#FUp7k)F|{8unR_$t>a$@iNCFTY`$nl3Ye$=RtOoU zrWAJLMLF)$G}3m1*7`yw1MzmB+@y2&b{|i_=4lGT2H(7YU7EkKIH3sYxP-5jFa}Bc zc0mi>d{Bsw)!UdL#8AKkK7%o1TZjO)B?%hZAE!y&7#vtLyFk>VvMC>f?pzO~*z=QQ zR_8<^i$@O~AytH#=Tkz~omcGB8U=JHg?B7;yN)%ay)kdjL>tx;0WIkp-1G(y?RxGi zdy(Aff%2})Q1h|f_0{HwX`#OtKR%8o!cLtR!?*ssQWYq%vg@i4LTe>Q_u&{60vU+q zF`@DET_nZNLaO+2W%&xYhAD-a^)lr|({l)FN~hRNcO0ehrfzvD+dasVodwI3{Z*g- zJk({EPW{~nwIOTr-hM^Ji_bfqrTGPMs?X{RY@Cm@^RYva0PK91_OPhfY;qjGbH2-P z?IuB=7Z17{4~)eo$xxP$foD~#V71D}izml%#D%|d|3X{Dq%Ra}c#RED2<62EDS@a2 z1@X86F4Xs6HDzi`Xd3Q6R~Ty;>1Ij$4_)+fhv)mA5{D z9cO{0FO|<8fBFvSjdsDvoX%%Vie|*LUvjwu(e;+wxa==4!X_1XR3yG^va5k(R?5YE zc_VFJxjVT-@nX<#q~oZl3)ZxG*u&{+ZS2F)PiQ$Dp}%5*aGV1B`@Z}Zup7DyRyDektb||Om6E$isl=+=s`VoI zkyadpxofq2nN+1$A&#s8LYxqfMses9 zxVF75A9KGq8ZARgGeDTTIvblT`>>_0YdXt;e=weba;HNzj+()Z;S3bpGv^tfjcm;^ zp4{QNv~@cxF`f$IKJM^TrriAA)W?QRea`#LJyWRPVuo^1bj@Dn2qt~ZP;41MN|Pbp zUApl)gq9rz=2?uut{^o{iK%!>{t|GXHK>j*W|pW)TRPWBgdmNo(=kw0@&8DXdn36& zQAlqh{M1NRLR+c{1dI~FpZ39ZC@W?u085qhAbsCt@It1vIA?z_S6|5e*v2*SEa=aG z-z|m()x$!`c?ostJKIug`w-4bppm4hD}rC%kYi2Hv{pdhl3*I5dx!jZLt{Y++g`FXe0U|+I z^n77Keg3V!e8YaOI03eixc|pU?m$~siZGo)ff;kacQKH)kb)DQT)pX>w)y<){iQcD zbAQz3R!-%nRKO!yFr1s2t`Zp{UYpbDQA9=`C>`N`ia78s9u`tBoDYVRh$fBBP^uUn z%i_}Kb4ufjW=0PN2@95i2p#&a=Y9}<5o9eK0aOUDkCw&WF}nM$w6zh>IFX{NjxziKPVK`bk1Isl2K5&_g|cM_ z>=OH%+1y%7Hz+&Qm(4pb-m98_GkIs-!PU$q0{IYISLRh@_hx3&h5YMn=|1+8pP);rg=1MGokSLDU6qh9DeagTQlm; zg~r|=yRh1ZdT3%QZNF0Boa~t2nY|mbF|+guaDzxd3|%stIuvz?2i$<6nNBQ__vxXY z&@4s$aFZykz!RS4TI7E2eHgJd@6zJ6jDq*ytz`h>p9gavEGPkjD6zLD^4??81pJq? zl<{H$#RAU56I8)Faq<*9R`)o9xBcqW{r9>7U9`W9Wqv>ypFbBv^%k`gn?WWr!S zMz<{x!l1!I6U^aE5CV%rnP`T}`zMbRG~{5(;!ya>LxM>0o8t+Uszv6D>^)@=v?=Xe zLL62uKW;%wl%LL>K+!QD5ZREbd+Rq^n+dRgzN+)0-D`yx*Eha>|DJ*j^PX;i8f4o++@?3t zp$$c78Q%P;_l1+kHFnaQ`mNZzp#Pm(^ZMk~rr;h4kIMRZZPE&oq`lXHiI74fS)V$5 z(T{j1UufGB;WLJ_yW1_$YrC%AG^OcC4Q6s2;76Cv%H`ifZNX#4R*^TbIYmbrKkvm^q~800m)kifi8 zg7Sw<>%YbjV~cM^JmN5wRR@1+2Lj?@IEH)lxy$Gy&nSZo2?diJxjiN z0D2SRN#yFRs_%5}(P(X)d*<5b@D1YRsl{#VcBgfZ3)>Fx?gT47O2=L}E^RP&ksO$R zLxNFyU-5iWZKc?w=D((kchU-xZfL(=wHBA~6S7ir*WbWJvFz8!S*Q${TIH((IuHu; zPF2n7HATqny3DSV+__HyH*k_tKg{BzYvig?yORLsfyayA&{f3z#08k~(XGo&hBmM6 z)14nv!-Tw%6^ceIhtm0T{&CC|%1U1%qg&mzzL1|`r_(tOrbx_8ROQzho!rglnKG!U z=n6>$N$Gk>Cwqc)_~{h2luHJ+iflW&6oe~3Jg-h57U{RrxF)&$E68#1XdxT06f5Ob z5JdPBHaf;rjPvMc+#%FpR*_>cuwpsM7vLYWVUUaHw<#J+@C3^MsBNa-r-u$uT!p+^ zR}9r_5$#_ez%ED53M?JPSs@LOKRgZ<9oAe%ud*tX$s`th7&Bko$(AiWW!d40z z6tjZ#CR5QTTmqoeK~Se3P0+o2p*sC>Jm)RSg(C;!EKNt4LL>B->f#4>4x?8_s(n3pTlE{EP|!PSYPCd}DYx6%=cy z;D6GEz^9H<1OH}m`&=zB+Lm#iQ(k@t9Vw;9ssX)6>U%UR2A^0z?bXKt7O9o<*8Ss{ z<@>v%9hLA+OeBBx*PjXm>I?DhIAAv~Mvg*2J zi1z_5?}h4t=EC+y8yHgt>V(S(=}Q2^Yz2%c?Yfu}Xv4Zdc@iv$5ro{1S$o&}fprxd z8B`51tWgZhdE&;BK$}&I9s=i`Wexd_GR$ciXe@Ox#?tw^*~CIqd@CwB&>kJCWQFAo zUAAO>v|TL&hkty(Hpl{vYQ%zP!@~r@M;pTzbcFR99_+}{kG9)bFN_CWP+nw*CHAx; zivVu>{R7an9A(i1`G9r^r7P*6DM>qgn?efu%#ysBs)#`X+RM&NBzs%^Sq>$8?*-JVuKait(xl+)D z>uIFtd9a^q`G7qd^AP7$H4|kYgIk{9T(*Eh3 z1p04;<^6%{7~3amle~~#o?Yiml%R2o67?{yP|K5!q<+iB#i@6&wskuB_+6wo>GJ0tMVaw^O-n8Y;)EoQ_%KlhG)ap;T2fiQh%`d~Zh!Ets@p&^z7b;D~U1ZEf$FkM0aTLA}q#DMS-6VTU z{yxN+WA@yFYE{b843uNvSJE>{%3Pcm5$G(b+o%8I2KUODzp%r_T#av+bB&Cvf0_~D z-VmfZTE}36&rrybV7Lhdp03J^0JHbSXEX+L5UAbb>A->YxD;AJOk3*jbeL=eDk?Ad zodI_T;qGeELv4nO1Q~1;3XM#MAVU-YZhiqgkAeq?vsa9yWsD$@bFkDRT#yREo`QTG zfqqBjy3=`^=(#kSx}%h5FGV?y0<;9sEt2oi51vKA>5zQ761LA8mN1{z904_|$LUgF zl=;1XhM}v41;;XSk4_cXjq;%Ng=jM06^(p80thPL-c%T!0$V!Ie;dEYpP1RthB_-V zEttF!{jBhWTz5r*eLs&ahUI61E>z^xVBzy%^+z&FJoD4z_ryrH$tci3TJdT$tUDs> zcX{r~1lZtQ0h9?Appj3l%L+$9Z(;V{V7N0oBLz~bZu?4A0Dp=KZhI8^)fJnG4h+tf zZYIO!o@KaEpuVCIzD+2+*oM#%?^l@|JncVFFnypqlRpwKynsf; zu$f(JVBsS8?{dV+dfq}`t|Pjv#&bWGDHKFzZ{+~%d(HLPt0IVShNRej9$>0?NHo&$ z1emS>LcpxiFH3%{MUoV-I8Gju2;WSFXQ&WsMOklaT#o(!H<_OeH@Mn%%)%OANNfjp~(?=_qHN}2l@2s)We*}re zs}u)x?6D4`HSPZ}qd)T1^1< z@B7TV)zxc*!cMNbLZgEtha3tq?boS0heHB1(!Pi4y*_X-Zb9>eo6&`$Ti2i(^Xm*^ z1ESjZUX||?z}_$KgoT@W&b6`F=WU$hn6qekM7Mm{%IeYR>RvTXovL zZK`I(`<)5=Z#Vt=8g7R$M*~zn+naEwh3}!bNbLvf9Y&DMhO=$ko?cD7TCwGsh&P1( z^#0yXS(dp{Ubos~B4SNB>FF&C#ZobU&d)|(>fx6!_zFzm-Hz`1@zf2iEq|8WW&%a7@{exCB-9aPu-%(~(+4%syVN=+l%sUa ziyHlP+zpj?6%CG1GL_-mz|4DWCw2L{A4&Z4t(7iO+TSAL(Pcx*Dv=N$~GIhz*aXLYKCG0&d`C!R~;Y1 z*)Fu-)1k}7HUp1}&2BCsYfyj!)oR{nrvOoVO)1be){TUTF3 z+$kK#v_=3<4fIXcRXmMj(jJFZ%6vYJp;t%sei%dH=~c+jCrEm1q-%U zMA-9fbo`5Lb%qIaSW4Pi{e5Ua2U~;A&=pUs$B2*XA!XW0pwR-l-yOR)qKF1sIAsKV ze79r)dEe+Tu!9~N`Y%XRw6wiur1_L5KCFL*7?YZf-1FqtQz_8HvLq#V2ZX)74SJy3^$gs>=(h{%U*&xRo#W zR$mMks7-)!LJx#zyObN4GHS4>Km5GQ-|3Yl@6oVHc12&@WS|Ep%vf>Q-e94Ei)!7p zuE};E(lENmkeAI9U(v1CU_$jTuLaHVF_)sgC#}4I#Nb-eV5EKO86}gyZ8tqLZV8Aj zA{MpDuU&FE#jDZPLSEhCigH*A;P;4Ngs4D3u%3&>`oL@Nr(H5S8lbJ7H!qyly5hxw z;N4{>tC%tviQKTGn-wX&KU98HB16?=^Iay~t{G8x=})U$QSjr?z8iG%jt|2$j$X~t zY4Mham9S24CDMZfYS2Q6UX~uMB>E>J^6o}W@qO)`N{8)@IecXkTkYktX4s2)IF@;* zGO%d}#z!z5Yk}~l@6y(bD8Ap-H z?+&oy~N}QK@pLWJ4 zL-_VBPhsR8fxsiBdJ6*J(W|;ko^s+;2X%ErIWq3js%?jDv~`+SjvH+ zXFA_3A^yDk<3WQc}$VmtEP1+NrCYIYNLpU+j^+mG{79YbedtPP$C_1KOe>X ztG3xsdvEmZ*}dA`U$Gm+2_|vo=w#5*)^LHwr7{_qwL++2?9xQXDT5J=(8YR!5^IY) zIb zNWrx%i-FP(2EdY(z~Z!V)C#KKed{go{mXwpSp&8x9*T-+_0RPPLce2r4xDZA=5O8x z@ifxJa})}IXH3(HgLJ`y+A9aujnsD5r9Z$00N7|yu6}uWGSRb1MI@D{|wQpq!&4|b8*Yn&o1iyVSFnW z6DG|4Z1>;ZQ{`hbRTNXJ6gr_=>C}U3ZP8C#QQPjdZ0ou zhT~%VK>6%t1;R=MU^mbI(&qewm6S(+jaMZ<)JGVLlcf;#a1NV1zUN}!9>+S^D^e!c zBmZrDz8{#cjwOEb$o(>ch@d0GBye>|@V7_$gSxB-=i!Mgn2QH4NQUhFk%laWubIov zC&8m=3*3qL`~XhA8W{QLk=xw||CWJZiE>$VT5)8I)YV~;f~H!(=t&CpgkB)ro!oTVRr_? zkAtX<%%xCy(W3of!o6M*P;HK$I+GqCDdde5de0Z{pcI{&FZpB*zscMm5Ls}jT*z*N zC(r<7y)J&3ukFbVQEwokob_#`;`!3qctKyW@Q5|SMJ2r4#oo-y*^1tb^c@A-nVBKV z5&?C8Pe##~@&hZx@Wre=e>oJv0XD139**)uM5XWQ4hASoKT->R6eEpUkd$)!JuJvN zC6G)+Y*xTmiVmKk!nfAJNh~Ol4NarEhW_8q+X8!o6Kde(kg10jU?El~Cw070KohX+ z!j-FsvCGUax072sZxp+Ew#%Dt-tI)$bq`qe-V-A{1|IFa|D+tt1fY)wHVwZz91nf| z{DmB)d{?%fEPwO%GUol)B3tR3&(BoA+He1Ya`q7Vk3D!nDELaXC)a=0^NK(e?oyi@ z$M9=`P1}>_SsT%oF>AxaMqY!EB17}aypIYsrkm;Y-(5Oj)t8z) z{T@O>_)fKZ-r>9rJ7Ie#ar{urRG9dAlY61M1FhuZ*IeoKY&KhQW@Ebqa!KO=B+7Xq zQDf-hE_FYG{;9H@(DYB90GX;>8E?_UCFcB%J@CBe4SOenjQ8ZQi|^b?T@Ahc#nYrb zwdii8I^S_;?EY~0jMOk&7WN3{*YCe;C3n27CmnFS>2pNcgZVt#Ypp4aVdS}xCKgGT z(erate)p1Tbol2&@z&&3EGrn;J1shsiM*~4MebZOx&rVa&Wi<|D`TpimbL45?Q1si zl$o0SuwcNo8mufzR+TZ=?{CRHbf(1qdMo8XOOFIBg;h#nnD4XH6;N}_JFyE~oGQKe z(A9Z%^kH+)*|V9raNwN1o@I#Nk#NV7p5qt7Xy*=ZyhD(>PS2xYRkxpJ@T{ed|+~sxITfP7(vATx#onP*|t0*>>$+HW$vA7zP3=;3P z#2n5Z#of`xPD~FP=+zUcaK<+wh z1JgQ(#D$FpGzJi`5ylK%D<~oY7J7;8t9ms`+t7N#QRzQ_S8M<>54!c zw?K&5*f_Tj8+F7FgTyki?-S@c?uFvZ`AV4V>VF7VF}Gt?40QXsB-U$YiDRc8>XCpO z6(Qzdwg9T%FOf$ZY~Il6x8ZU~g8;sa7TLAC^=eggm+2#K6MgkU<)SU{7MaYr92XbUk2e{zIptDcY-a6{@eh^ zY=duC$kHy9MjYBv1H`JDGJKv7oi7?eWY3ftijBq$=n*$uDxisLL||yFAHmzxQDbt` zRucgUlda$`d@SFZKr8-R9vk^=3P+=hT$I1!+1IfOQ8a& z`IF=S-lk(m|MuYJxR>WEJ-c!^5}cAXbV$KQnr6bvwufz7cvjIWmdUXeVG~*(AQ&@F zSIM;*C`mB6*aGcO_EiGpzESzV##wxS4%U7;rfWm5vvzBlV5yX?8Kq(*y=#ut%VeWd zC@y93zT5D>+mLyPK*P{Z<}V=bfNRRSF-Qoju0&GG(}y(f<4j=P?u zJgk$_&zhOUnIvRAI=YI7>k+{<;UnbfaE5U>hr4R8_fUxGx5B%eq-{|$MDaeZ=)*#1 z@ls*+BS$3>U{{jtnRK#*!}W|3k5nPQR~-3MHe=+*O*$E^k-#WdUiff`+x9g4>5*d z%Y+P?$H2A109+!yo9wsj%MzBkvICjXRSZccD83mP$aoz#2c{BMY@X7$hF-g^fwJg_ zXeUu|FUe~^_;=AOIiL9)c_>|bGz40W$X;k*3V4jtb zHx>cf*Jn5;A97R3lEXV-fM zY#kl>11UH)m+MT+s~LfZsfxLoytvW4`1!n|Q9*uNnk^fuiZ@sPbK>am#EkTWk%9_o z379E(J_nO#7Okc2zm@?IDaF2Wn2Q)520@+fD}EfDU6oL}S%Q#GXLnHZ9mq%`1wgji z*sHe=5cznjpcW;JX6KzAwJX~x=GD~0ZE5O0qQbFmSOy812+5CQm&QY&Bo%UN@K5f-Z;2@ zpLu(CW8BTYex7z5x#xaEozB@uyp7M*rf4sq9OV)Lip0-Gy z5STBzj*Q)~KC1nZI4}y$7N(x%qUcAUJ3YmthaLxKX~zUqgIB4b^D56PX<4F0rf81? z6EoE#c$x%+RX;GrCrW zGEM6kP)Z?Aea%i<;T77EG@cy&em? z?ncCErt!U5U^l#GU3Y<{EdEu&?e#Q20TjW2^4=tpVuc6}Ss~C0P{m|@)~gF4Ss{nI zpj#AmHHEg`TmZLZcpGR{IaE<2{MOjv(-B+9-RC@Lw0DISuER|E@p!9kJQ7*bZY9#2C&qiQAa_90`uvUNRXL`6 zVdBhuOf9}JbRE6WlC8XLOwZrQNH}1z2!Ryk3xT>yPm$mG{^>OU?2NPGU0t9kdl0>E z1I6xy7i3dRX48G1y!=d)m)%99vPwIr_}oPMQ`ZKbbxCeWL57CcP?r5E67BAa#y&rz zkL3Xyjc|x(q27%o&rG|!aD46Wcc4-(TE9^Yx4^MPU z`(jzKva>_8$r>8po~N{siTgR08*`J?^YfWKZmCq7=ge%kU9vs4*Rq?khwAY{!Wgjk z`7?0mkfR&!9=QXYZjDz;mqEB?>&5e-y$2eoO1{(XGjVs%0LTLT(JKQ7Srd(;}Uw!qBLDcT+Z?;}a z{fcyGP_=8Ey-Mkrsq;{|K{iT0W%t?FCBq*DmC=5yT67-W9=OqVI#Az14B3lZ6kv8k zD+qtNnG#vs@CO@}G4}qBeVEgYg>OS!SFh0LXT0*$_Z0sJA6%rMEGJB?NLhw^cUh7D zE9y16A!Pz@oF@JNPBS#TwYI`ppmuqGpmD5%Xhp91w~XR%kuKRZ@66LbCcW+Gmq5%E zP7sZlz4k-nrNaZD;gBf6J$-h+P)RrNs^`Di&OoW}VXlLLFs$dE|29p&)}Kv4FA`}T zDhlwkFcKCMHkK|xk~p>0Cz2qCP_Vd=<8Pwben%6|&@`(szG_by*t8Zry6Grv5ni#( zWEwyb@H`FgNR-JRrwD?&VkDD&cg@AF+>&`eBHt@4!a^;rNPxN;1#-9B9)Ye;c>7Ev z2BcVwS2p4OP<%>Q_xAnBfwDU16E*|3$u3%f^eNPP$O@Ao#t{Y$#&$jyrq#dhbWIDy za!7JNiN`qN&0!EloI;P#67@(h&Cp7E7*NYNHJS!k@Rhv1=@5K;!cnz@h+meJrgn_L zao&>E0q-Gr9Rk#J^eNY1CIo7gkhmf`Td_L?ieQu9`5$7TO0J7x-nXA0N?`LYV)xY} z7Y@`}TQiDII_h2Y-j{?@aR$i-U2p`IPT&nZI&Mfmn?x=|9Om5jo^eH6-`-cy+8*){qDDa*a`th_p({3dT5^j<4*Bma{{5__=^C>5SfTM@ z$g}>+VZ`~55aZgD@TurvC^C+GSfvTQ- zN^dXSNWUM8oGfh0dRV&URX*TQ5yOC5(UtS}=dQgLl#>VSq8|;2Z-uCU1>;=ySPKz^ z>d*l!Hd*-*>)zEYhFJaA27}J3tLN{Cc~@=@z+I@^`n&9Dx2sR@8E@bpt6Kx=p7gw( zLH;7x&Ot2q??Oc<$hE~3gl-y$2ZFzM+H*l2K$MHF5lRAk`&VX zO3X7?BU0OBe#VFMx#u<2Pbvv>9bUwgwU2)f)zy|FUQlAferG8?N80b-{>VAAz@A=9 z<>}t16jG(ts0=f{QLm_|t`ES4M06qKV(5YSa%J=>*?T{I_5NN*wzU<7{ zgQKt94BT(2PLswz29*1ZomId(=O~1n&pwZUt>3#y%O)*6e$W%rwSy86`QW z97j8!cl_hZeKgY)!HjSFZv7rx^I)!S8-U}P$q~N0=P&i0o}4}1hP-KKim6x5Eff11 zT$iMuo_jIHFw1^8M$dkH_B8h5Ey%YEO}t>jaBL9n-K)gVpj`AF+rLLcY0N1A0O@@!jfU3vC> zYwp9j)Zy|>^|4him|_nB)+i7@)<=1}gLwh*Jp6RNEqdPrQf5>9zD>nYBr(g_4_K_q z+SSIdj!0WWD`c04TuR+{?&pS&ZBN`VWuj8`F)>LZQ{Cs!xkM&fEZ? z*1_SfO}Bd+bON@hO{wPMYi+H!&a`#jylKwZ-Z%ELNN0!THS@v8w;oGxo}L*R9fjg| z6JC99a1FJ5gOdJvsHm+I95Woy95>d=W)U z&r{oi*8{UU`P6wXEV{1jQ@X*-=-q(+le|pdu#NXEmlx7{Y4aY%(+Xf^nps)R3R3LL`n8Lnakfo-v@{K858{>Q+w2Hi zrr#SyS2jN=S!2)-D*uoLgeL=={|k7-5PbXZiWbfAoWrA z*;BoTNTN95EG6DvCEI_plgZ0@o;b(P_HZWm!YrrzUoRXyiH>}PtkTPxfP49ZlmD&w zMUFA)VP;uqZn0P1{?C$)nfMRLuRc?5q%8`pz=hM#pP(&cK~GZMwT3I~Hb~B%@y%Yd z=(N%CE*U1~PWuFAgR^9jx;^uHHFU|*lIi`N?3gzdhe9vLpti7CI}mumzQhX4u<;8; zF*MeWbH_iOu!Na542a=m8pRew^3K)$y*Lg zLG6<;@KK%zbTl2Jq8*T4X-ltO+*CYS)F1PT*gaw#zl8Jjhh^%u{v}8E_-i~#M|k+V zCbI^R4w4mfL#ICNdH~O#5@(K{5axD2FUrtCyx#QUM&{_UfSV$N@^UB)&z)jjdiz}_ zE_`=<>r3dJ+Kg>I4~$;_c64;u!DGk~5{9 zOIR-`e`k8SMTPnf^W}{lGFVDm4JN~a$$mp z43**8zJ4a}!NB46L&RwMHr?n^*`hGz!6GTd%qJ4%$ZSS|_HcM4S>W|cQs~FDG%sWK z2m2kurTIcNExm+3^O6P8KB)!iS9b_R5OZ*CatzU%-A^G_ABfiFQhn%s)ID8z3-yg4 z9fN_YX+;y}Hlmb1NZo+S?+CN9hn?v4hPWJPo1vGt)(s{(%ORI)x9fgjBR6OtfxW(T z-ZSe2+KT=d-!tilQk;P6v-VaEtF?heCHK>YzaBsP+XOIFKr#>Sb*D?>=_QFpmT3_5 zBD(2v5_WY^?fCIIdn)Z71irSl39yf(`oF$_##nZpMn+p}4YCwbhYv#RnTbJe&mP3N z%L#3Go4}AHq^D&J&SS_B7sQ4ysy}+}Z(4v}5H^eg;nvd07YqcD`~7Ypa*^;oI{frZ!4V1dOTf4QEEa0|dtpFO#3#Xxf)P-8j7!*KcuG~4aNs=6dWm2C|WJ!)$#glsS%uSYsl zplV$z6vKpEsef}R`~Y#(pAJewJR7389FzsI3*{$Vd&f`=d0eS~O`r7MKLnf9PX;VmV?TcB zOLKNLT3|(ylzH}5XDOffNy-1?9)n|)>8D&07rob)w&~A1#FhL;>)DUA{vAtMD9BU5 z&1ls)tNr@GMLO4(SaIV<)Rdl{)&kOm*XGjucC|Kb!dG zIU3V4-@Z)B$LG=~^?!?TVW3>>8wfKc%OGx_B*lB}V@-Yh;1723L^jDWq(vt%n?W9y z+)({}+0#3$*5=}|OAzPPvCvJ9PKQn?w|f`2^6vrA>gR_#t#m|{gwuXm%8; zTNJtIByr*@pDe}N;ioG-*^^cjg9r7izU!;GY%^U3thiMJ7+PTSc6gi|F3@NZpKaJ# zRrYKottjoHb#!tlX&egm3ZTf@s zBU->&&93wu-*p{z^V3FH_G8s?{}e1_hJC4Wbn|?x_OG$e)Br9_SMtR&hz-K&6aWFq zx_)YxD&dUR(2a417H{Rd+=6k`Rx0%NS+T%0po>5PL4@l~G_(vvAu1s7qJOj8v%jBy za?iTr;{x?iw!i6l=^?erM=lopeyfH}42x)hDI`j}Qx8zDwmb~_)U<_%_oM22usy}K zz+&+F#ansE6RWG(`rgXXXu52lq8DEF~neVMdO0gx>$s5h^;ymHnfyT=`=$mH)}; zb7p_=zZuijzx&VZ0xzc|z+jHLxR<@*w7dD|#pGKhfJ=h;mIm}%Z* zTTbU(rVcCJgSux|u_IOqxV9DSmSmitLIx(}h0_tKERfpI!}bICX;5=CQ%9V?qc2}w zF|m7U@i8S*f26>CG-EdrjI9tL=Cf@<(1DucG!0IXxVM7Sd?jh{#}I@V`qw&d5f!wB z2zj2ul~PcODm+l0&xwTWYW2{E03;Au(1%Q9@n8u>Cz!&-OyTMIl691{+tvjSEdYcP z$gj_4PG`%|Ig(Lc(!5|-J+POGl1|eIvSdS=nrY_QQp--(7dc6DFl@-#Oh0=u#7dcJ zsGgKTZ4gtDvrdt3A%p3Indjo{{?7#*`;%Oj?+Dh=@IgbNFeuJxi=NSrEaU%oOkT8j z#V$)23=PwQ`9M#dfp$2Z1^}_vk^tjHO?L+y5YZZzXf3qQwf6R|(>J@Gb)SayoVLuQ z-kX{(!mQZhq~)af1pQU|{h1Qlb!r??PW-tw7{&~i=n)osq|anp?>FR;9>0I{zVNcq z<^1RWzW>%|16l}#zxxDW*{hM^!<6OB@^sviVOxfty}fi~sytTIMI z^BXX!Sta+EP-@&xh%=uw7$~iJIZz?tHCfh07n|!rX0^w;53#|dn?yaQmyb8OES%## zo3n`@YcSfk8&B+pM5Yn)GqYIce(;tZr1QDe+7>Iaowq-$daoHSZQnGj@wnqV`oOKb z@)w!(SYRA&S$5d-7i9b0V$FSb)E%$qr47eiQpP$q%gBmLmdcH+@h*NB4zClvYiMjB z)9J&~zi;epKXn**O?E9}hbtCqFipF=isUctw?4VC zFK6ykf}oFyUDl%xTp-C5!FdW@r z`vJ|?^24OCFa^ZhhEDN^SDIv5>W5;rgYaP+ln9JoMQ~Lj;qbL*Fy^4-&1&NwR!zl1 z-t8Kr+Dvt&Hvcg3by>J09jdDYtfAUfvlzb<%W3q}m3;3I9%+qfWK>qP+V6pL7Gzlx zxBHEQ;_}0fEHQiwA(fbPG(?C9RweqMSVLpmT+$0y(j^Z$18)f-&yvtsA2Augg$9im z!fw8WBp(qpC9-uhYhu%5};LM`~(G!?Mysvy*LYQhD;`_kRZWqxinQ z@6UT|A*NO{l(Tk8Gx9C?CH|#Jo#aD3FaozR#nW~pcRVf6gKtupms;@9H#+YNF?KLT zM4H>ePa?j~8S^=s&|fD)gf7fWC%6XjFyM~L$o5Cy+o#g*af4*Hw(dDT(1oVc-!lmC z&a!{+i+i?1FZ}FNH(HW{)Zy@fjV_4s!<+N>5IO9TJ#DKSFSWm=kH{k|Pq(l>y_q(> z*MYCS^6}UB4sPVN7Q4p$uvgA?&qLpp9Qu9jBD?W`c*?JiHG}T?p=@i(Zj}Frk0Ta@ zS>9@~c{}?J-;xk!`m{xpYuUNo2KBRf1-RFeJ`9BY8f=jV&p^kf!H>!dm87Tg1rAfu z5oomlx&k8r!64ds>IvBCCDGT-$Ke}6WI`6QZ8<%dAv;BK!6JxBV~7*KsoZcL61y}y zXRfvqvN<0rk7VTdYgGo9r#eh>RVeE^8+Nxw*Yi4s2>yDK+&(TeupYyb-rMMTE4yw| zLxk+Eb|cqT2)D|B<`N7U?&E~GoEju zuElAk(a5#dgmH<-_i0(~*M2JQzL@fMYCi|)q~KbZ=|KB|iu4JC$k^MvD-vc)(@U#q z?F>=WIfN`aGSTTCw{JHL>MOg1gg{2W9z3RZF}Tnv>*pfc#AWkKrHQWFYPvQyhaOCi zJm;Cn8At>Y{_gY^dI!P%NzIU6-++T5D{=W6E%m5d#aZtj^RCqJ)7T_s;{Wue>7z!5 zshq8t?trMpH;fDuD$cn)F~7TI^oxO)<~(5l5DAXi5NAb;Ky0!);l8IBmngEb3XHY| z+D{Laa_yuXv@P2h`_*3I>D?!F7af*cqiPmL9Fyi|dY}Dj-+^LZ#TvnfPcdYml?Ff} z?t2@A1M|rms&K#QVXUX}bu?)jWp4bnhWTnfnSAwOm}snK(QHO?$QTdfzh;OWOs$R4 zU2ktOwA*x4#qgShcIqhX%h z*(P5e+u0|_iC?`lM4w{=*|(K49~UERKfe!xQOmRIHv27OJEV^_B)@_a@)+@t4z59+ zItwOLvDVD>=Hq0Eka-0I9F*{tbz*2so-Qax2k~4@b-XL*nH#Z%a4oUJu=t(hRY^kY z)kMLzasWkh8N*Ox>a0#IL%&?w(z?DEVctuZq}DVM*Q-;_S_$G{MLBUhTY&G28$#EO zwXt-{qohIA^BN;E|jr_nY(|(+_$e$92=g9y{H;?J2Mqv*n;C`Z}^=WMq zuNkhuJSr`ulqb<`mf|*2rp<1!HqFaEP=M@ZpjXH?p}abg&_1QKfQ7VhuEH+ng=IIC z3(%9~d4YjU6@ygC@tT#p) zs(;ub08(o1Zpz+C+GOo@*k_&0Vu12M^zYXy9bs92WuSIpEkQ07V z1p`z;&sFDI4)KM8yk#Ny#^wxF4<~is$^@bl9W3+>7dp|_L4<;qhJqcUJ=cD?<78gl zqnvkJk6R*FsRG(Bkqha@8jU<6HLA>c(69>F67j`34wch{qFW~Lp4-(j| z469Xg0gk45-p_@R*(wB{JUX#tV{7N$IiC*Lk&zY!zC9Q{$fcBzXYcQP937Q7Q)z4;e^XdhmFE{`W@rk!f$bK+}Fupu0AZtQ@mPKUo*vy#Rl5!gi8_RWmxz zJc7oAv9%1uc_UlI&>BELnFSbS-$bLO*T+Z=+S8RY-yfZ;yG?_|`(poldvbOL6}s@3 zU$)MKBS&DCvIL%ob*>@Z%>e+(EMT-8_+LkUD~z7Zb6_DFbUk&k`S`8rj$6S;X6`z7 z?(QFH?5(+#JsD2Q+#j(yzhfaU-HZwahG;NC0TZM!Nt>ti%P-2xEImKV^H%OnwAG#d z(>Akm<6E-UozES34eAo!Gvxw63c2`$ZcNyN4dCcPvNq>sVRlkhrYRS!$?_q|fLnzb z@maZF9CNB;1%p|F`3lfk3c31&x+!uj7aIKmlXbQ=cD}f=jomP5;!bdYeetGyV4m3}dt8-_k(BjKnD1`?UFr6tzXBX;ofnIimHw$5;EN~ny zIX5i&msYfrEkWJU}4{npGk<1(lMc*dMo#0N4cJ54cGdV4K&b0kDX*|$dRwmBtt z*T+U-JFxmuam%d?8}8h_=&;zI;HXd3*Z=2f)X5uFgj-mf4n!0J!V)8CgC9OhY`4TvE_uSjY_GxpvH%yxX*HkKTItZ{K81#@4ZA`>gUkW-d;3U5L75GL;Z?{DRTT zO(_O}2ISDH(AxyWy5^Hz9sedJ#HVC`u5RF>9i1lV>l5zYJ!RGMDqfjAp)|uPotOV( zxNFBhE(j|YB{W!Idm(?>!LTizcdVirUO-tD6ot0$N^blPSAKn4`JOQVN1FJT1I`z# z)v3^=?Euo7enINDd{2m>e9lVXcR%_VplHuT8m>|I4q z;oW(ONuqYNQAJ}`f4Zk8>Mf^(fXz(9Yjmce9wc>cdxSH&%pr)_vs3Ti@%tP_2F zg!M-DX+gVf9%*^|%gB{h9*jLNi+VW1l5@4s%=ZhF{OW*4WlBO#Z48hPcZfaK5yFg<|4If8u(aeSwS8|*VZgt-u-sU$ z@i@J)@wAk`H*^zK1T`3*hGz*cY_`8wf$z}5cCV9{LQHWD+LX4>H;USEA(5*u*^pOJ z&s9JVQtDIVU@HUDjSV)4qBlPhou-kB_z3S+0it}*h$_>h@gPJb|e+A`N3WcuRX|6NkS0gwx;>q z_8U>B>anZ$w%9HY-jVqNj8sP!z=IzV<+4AW-TNiR#ykb}vProa= zd3}@V#zT6yiRm%A(QN;!Q`}7>9M#%7psuPzEntY8rzA{0^1s7DuZ;g$mJ;m6Ug55vw2ClGR8(2 zkn)oBIJ?vR;dGh{w!>f@rz5!A0K@c$ZvDYFn@^4%Sb`0;`9_Vfgy92Oc90?RCvzzp zoW;n~+mRkWJ@G1!A~)_!JHHx?lgx9Q84t96gzcg74jvrHPP`@Mi8hS4qZ%KEIQ^&S zkDZ1IHSb>;$TU!B$AP?CC)B7EbEF$DM0TAh&}|&U+`p1>kE@f&Q&asLuHHYsU{i?G zdYxgj`rxt4RyKi-tAxB2M*5E;6Ac6Xqieekp8RR-Xm(#ch}%(h6x(zzRH(Ws7)N10 z7>60kiddQTcdJ$(2wQyoHmaz&>Lg_}5Ne zx4PyR^@8CvfAs|?(dAUJ^J<=4fe9oi0$G+ib9=^9zPsMfq zQe9ro?O43nxrpA|q!b?^Z+DDA5Bus;Q7~kj3*31U2th2>hXnngz!#yX(VgG;slsO> zw1t^rc(3bj*S&1jUq1}iQa+j1S{ZrjIu{^g*J{vMk9 z@}YjLk;W81{p#bcFJ#m&&kpQDbwlcHrP$SlPuwCcDloYx1YftSu=$^6^*>(LEE?bt z_DJdGy54fF8`xm-mk6?L6YIH;b*-gAEup1YzZsRvaRXF1w@pk}YRNQdn)QvTO~isK z>_*;L8P0}3FPGng`qO?OU`uCFkFd;e|!-9N>E~L-0HPhAd8#bsq34Oe*iK>=i8WEw^}ZKD^1& zP3~nH#<*9#uc_`HATZ}-^pco}8n02I_0-dc+jPu!aQ5*li^GABbhXO=t2#-%VnbSz z=z%F7MUa_6Py6aKE!^bErdME6Dga(SLV|o@7{7`m#D@oL!7GAB`=Y`wKY>yCn?q2q z^rn#v+5613$4RySCt#6#uCAL|b!WAPPj72Spy96>MpIu( zFxOu#(idXR-Q~~Mc4s2BK5vv0Uyp??Ag(z7%W_gy9KWy_nBRN#(cE%fb9>t>KmFg9 z&sE^%@&vRk<>i?bGCr}I`XTQ122z_|#_WmcQG^v`@8}ywq4|IcSob^{q8Q`(>ou1V|Kw*j811~Xl79yAeobIF3%A%0Fnyw zreX}`0Gdky+07!h)x|xE}`m^P_+)18^+Bg$vno zfM5n_Ocn-n05nx-ET2W|X<-9hFPtK`A$E_&Wd45-05XvCEvw*XPu|Q{!E8A&zg6JE z*2%a6A1dU|6?#a8c)5@~EHuW7LWZ;ME)nTfqgMigC$F<_7DBq6LPspTVpy<7D)!|H zSIdL}y4w(qpP(w&bPu78sEWqx}n4aUma`IF2jyXM#b!LIWoM zjUUwSC&}9iTR#L)aKW-+2~R4B@fWB27iD6FbSAh*A=Dc#G}Hnp@Q6ycR&u^ty(z|Fsn5#_&Lt}`D0dM#-mmewi+b(EqWh4@lyseW&n z&`_Fxj}4=afW`o*m=rz37CmPcWl{EdGD{{V3*R{APc8zyIRKejO6x7VMblw_(OR1D zs8(#!3+4P+<;?(5Q~O4^&;h25trgs6@2{vRGF8cr9f5Yq(Y7oA3J@db@Bcy*Ug3gv zYT#N$EQx`@Q-x?)e2BI`ScM3rVd@{txZjuje-OGMZrc`5W?%qu_ijf*fTL^RoVDAG zO#ja}5>BQ@I1`B{PI#O;C66ZT*4MvD3?e$ScH-;%`s-||Og~4xXvd~jqT{LPN`m~R zKB2uUNEH;HWkDKv_g;)%;Y+!9j}jg2(M+TepY49uMxY=OzFU{Hqk;@2Y$c;xWca@~dupsxZqC`7hB{QJ za{h(l+&qVQPnjC;lRoNWA^%A`b4y~ikrQF{&X38)Nd3~ zbDc2?TC&Jgdzux9Ai55#PG%+C>6XV`y?Ay*%wyhpp&pa#@z83FDqqvKTskdB2qCaJ6@R+{lVZpxj=`nhYpAXwD!tCXeKq-?2V_3+0MIknkJ|-L+ z>G0eP>tes zx$8trJq#9xf!!&qX*Le6TE1z#M%__TlKFbx4!@^z5f<pQ1*;9Pw2;l*t^?M==aAnbZm zM=z}$mCE86IH472BZ6${C~*E*APjuEF;z!yZA`i4a zGrN}ULuB=O>^U;$1W^lsQzTtLo9G5NzGtfWlXKxJgr4Wk52s0)4Ig_gE}-{Ky<2*| zwsvBmn%A@cMu8kRRsD>&2HkRTyt!(S@_tEZL?m3GESd8m`MfvL z-_?+e4aH=h?*emVIe{=kKh8j6{409frIi*Rn(0O85s>JyWt`~K8!{)GQ+yGI-uL>2 zxF)BGWV)yGXloZ;kB(g#y4g9E+HRv4Q!-bIB*F5(=p6MvPb7l8Pq8GT6i&?RI{okA z?(0jc2Z@vuRpuSNi_Cm?%^K1euw~Qa5->$$fCoY`4+|sK+)u++u0oTg{!8Q0s@0`H z2xdTr{FXt*UGTQ2d{p(am!1ao6|d$VK?}o~j3dj8!yK~SESogHVluCy+Vzscd%J_J zUJ?L#2LYlD$%e?s>%vVhOK&Bjse}?POs1PhQ7aOPz9WT{yXAM+C~Tx7b!Qz3e8>w6 zV(-_zHZ0iFo$q9adq(5}BDvI6I(C{t4mG47Mec?8EWHe|)yVvN;0OsY*4dujlUaK| z8)n&L+%m9tx@S)9Kt%M`EOmE6r$PKmk3^I{*Men5h47(jZdB0K6&^|(ML!J2%&YOW z)*558X8jdWhx&XJS5G5X-Wo^ghKz!?44n`4-)<=9t!N0{gh?PVh{P&UH9iEr_1l{{ z7H=P|NvGB$Xp0bX+3IT!J`IQu+wEE8#{j&F?7(!|(7;1=;>QTZtGicK@-RkLF^D5R zb;NoV(i|ItI+`IiwXZ?ZvagW0QCy9Zw#Q%FP<60o{Vj4l88zYr8F^w;c@h1hzFONB zu?Lj4buVfRT~6%XK|;}%jXIC;aV(uIs5T$1XHc&_z37&)Og&nEn9(*o50Ra>_PJCP za(%$$lZj^dxm20Zti9uA{%{%k*uz-c7`0nICiq$NpB9tF>QDJ*Z7+PR*tTy`4YQ&v zmJOJe&4ew(0*PN+!pHdRIYhnb{K{Wr8Fgb_w5Vx|?)XhfQvWXN)Jx9AvT^r19hUc| zl_m}p(|FpRwF>(FwFl6o2Adv#H^IRY25i$3it=5PR?L4p!E6I>ZKMed50k~NW_+L3 zr@D}BZ4;hm{K5puB5?Yuffm5tXK9RR{!{(7vV=i00tSi+3O<84etz0vHl6hHwyNdbH< zd!MC*F{n@OCxug(TN+Xo2$t?)Ab?fM|TJ6^TjEG|B35E=h{0^^*amKu0xs0e6Bi9eIjs1 z#*ja>M9GI80r1Q?CAOW6je3)O26#o?_>&w=mQ+^lMN;NMy`9wE`nvSvJlT(W8&29O zqhMn24*(O)OWo;5B|1532Mg)D^=T&&u8zL?@_Ojh?8w{L0t80YHhpyEocBu$IxUx~ z_=eoJCnOCpRQ?gXbm1f-+r6Erh)ltY#z<>gt_@FbK+j&^t_hs<77{H4vfvVW2fO!AROMb!cXJ+<~XelSW7 zyf;fqR_6})~fsCi}gbtXeuM23Ld=k3=p@mT_z<>)F^5Eb{0FGKfWERZf z7R;sa9jN~Y>2knM2KLGKvX0C`!EnB%j=`}4cdXEZCe#7EAp;RE1O1s;q*^q8N)+8H zVy(t4m=ylNh(i5E!Ah~QT8y6(>%IndbSRu931>)1GKo1^yu4y9i3;H~u&y4@04qdO zp_OilX1l zlF?z&EM+~33O?{JtD}_GV@m`TvJr*!IXiJa2Wct?_6`?wC{nWk$(7!HNTu}1-%yXg W)RZjIITjnG()rtXAtqQL=>Gx0=5yTu literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/check.png b/script.plexmod/resources/skins/Main/media/script.plex/home/device/check.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e2c3d22f138d4b2a5304f8460c95e194c1b5de GIT binary patch literal 520 zcmV+j0{8uiP)AbMHO(UvHiBy#MF?&w1YG;|L&SSSjEH7}xFP5UvJJ`NIb= zSuXJ;aKwLn0yBUlB|aoXWKTq<0`@8qIS`RlWlX{qBC;zYX~&C=#ue^u+&BahaR_gD zgpXA&OHT{JAiC}ycj`v#Up$H)CBzm z=mj1O4nM$L2;pUq@Fh@d@)Z>h8@}|8WLOIx;VYod<}W}4aN~HuJ1}B!o>$Sa;TouS zMJ;#HVmNahFTjB2I179`_!*$dcVzlar{(N(cm%qEX>}Yn+yc#E5;bV(1D+iZzE^|6 zhAhw)wn|LKA>fVZxC7dw^ak6;gy#!Q5$THBm|UA_Pg3c*&{Ie|_7Qw_`~>tDIt#*( zRvqOxSj+?rOWX_yzXHR>j^8Nc9j)Vym16csAt!)+RS6~e@%RORMbBn5AF7T30000< KMNUMnLSTa9(9`e$ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/error.png b/script.plexmod/resources/skins/Main/media/script.plex/home/device/error.png new file mode 100644 index 0000000000000000000000000000000000000000..c60c200177c78292c8548951330d247e0affd91a GIT binary patch literal 1217 zcmV;y1U~zTP)Cq|0Ggp<%mX@%-zK)%p9Tba20Dz(>7#JA9$jAuB$Hy@`Itquw@q15C z&l3RO2_c@LlScA&l20<3%*#k5La*0L0EXP_^)eEPFr7}nAo-MJe<#4YNPb3=p-_mj zEVI5vZMhJFR;!hvP>3X}BtIc(Z5Qr3$saULqucFn8>*SR-EL}{Mv{+6I*r0PNbW|X zQQGbHj>9$FZnrZUjgn-NTf(^767yGTIDoxLU1JmSsa*WV6|t0@`dgL$PF8W~EXoki31WI*|Oy z@An%%L!AT!K)>Hll8;XUzOQN8KZ>GUI-sH`Tw7Zs$y)#*k?g8gs~^tK&&!Qcb(vNy z7BM$Bhgz)`Yh2#V3Rw|W{N~MmTQ>he6rIM+bb*6#@V0&n2 z$aDtN>GaWaI-NG1!NI{n0Qge^@Uze7GhL$M@i=r{hpy|0$K$5sjg5@~z!pfpWu}t6 zDz8_PPp<*^!{u`AsjAwyy}jMmY9}Wr(bv~^R5>gb3-GSz+$6~RMTAho_bUxUHmg((YxK!7B-Np`g=e+-a(eu3JIM$%w~f^H}t_g$%ma%Scge|mC0miR$e00000NkvXXu0mjfEw(H9 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-refreshing.gif b/script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-refreshing.gif new file mode 100644 index 0000000000000000000000000000000000000000..b135ff2971f29f661e89552ec49c22bda364dd8e GIT binary patch literal 6211 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-unknown.png b/script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..42d85bfc7be614a2612d45625d034767ce869c61 GIT binary patch literal 561 zcmV-10?z%3P)oXLQQ7VauEE$jkPJyWsuCh;{4fswj2YCSqHy}>h04T4V0B8V{ACSkhX~j9s zd=HEZ_-WZO_#SRJ&xr2SgHf9R7~_jK;e5Bk-{2+h-YLSzMC5!=G1) z1sFU0K2Y<3s>AtLsOEr*!|{sUmpN{LyF|=O?EM6|0QM6x6@Vej`gPMz&WaP&b?^+m z>{(}nhrL|eLeIlqux+9LFBya^YRq3^285nAi>ob6a48}qBO(}Md~7Bqbv^^f840g} z1ATu04n^cEevZqyYf@I50>!k3)B5Ek6QHrKWtOq^JS%w!6xQ}+ox}&uH_T>={XxjN zxT2Qnf-xq*mh&pMa8T5Xcw^J4v8teM00000NkvXXu0mjfkKX1^ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-unreachable.png b/script.plexmod/resources/skins/Main/media/script.plex/home/device/focus-unreachable.png new file mode 100644 index 0000000000000000000000000000000000000000..c1912ca77c4e8b8cbddeda17373f770a697ff829 GIT binary patch literal 506 zcmV96=BU;BPvL39)mjfnjl`dqMo6pzG(as-B*juAv_d#yG?`T;p%pb#RBFY0QBJ6CC3n zxnTD=iI`%cC2ZrSBJr%f4IZ1u)E+M(jGiiq>1W%ySu^>-iI9p*Qei} zJ+4XNSiWO3=Pc(8o52ko*91~j`i#-QyGdB=_=~~yVH7!=gf;AWeC%N@VW+Z>o1XQM zekWn8Li`-d9e+8v61EaHDugfNi)}Fuu7r(*l?veq>m7f+&=f6J7Upl&OVoK*<_#FM@Yn+8|HS=$k%YxxIu@iuHXxY9K~ zPH}0S7IyL*7dhw4obx3vf*Zmqu2NL{g4+RcyQ@Bb7PpZzw{7|p`}o=u@B$w@ZTca& wKI})%ryDp=GBRg}{>dCe|G0MOKl*RWe{=xE&@G-i8~^|S07*qoM6N<$f=4>rApigX literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/home.png b/script.plexmod/resources/skins/Main/media/script.plex/home/device/home.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c50b90f87cabda1ffa3cdbfc293ad3955b2e42 GIT binary patch literal 367 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/secure.png b/script.plexmod/resources/skins/Main/media/script.plex/home/device/secure.png new file mode 100644 index 0000000000000000000000000000000000000000..da0f2dab0c044ecd1c69b5559f6e145a10abe45a GIT binary patch literal 674 zcmV;T0$u%yP)JA+(o0w%z55CqUOX{N5FNEa1ynNsLe)D_3-%HQ~ zmTjE{@}6q~_zr9U6?rcUQ|v@>BqE5Dz$4%>aGKt5fq7s-n8N+-1eR@G0$u~Twm!62d$@+vc0!k|YARFDrbu5%huM`Erf@qJ%>~H;3X27t zwu7pv=+ioxnGBhk4EnT=s;M|_hr(hZ%C0$pgk@Vpz(*kE)A_|^`Q|bJllLdlP2I<^ zZEsUtDgrROGE3@AD$J_$ij41LZx6p7{<7k@&%QqISPxP_Uirg_IVp@JkPG(if8MA1 zvf6FeR%;^0Z)F)cHxQ)CCBqan-!-YP*Sqb;W~1ja>+5w!uZ@OH zU?}t%irifN!iFMKL%&e@FAB{=rt5K_6qYt(;s7v&Dc<-Bj?CW={_=k~z`YK6RLLBdB{Lg0Vr0pD8(A_v zO7g&y6RJ6ohl8s@^2k$#N6nC&%#caZkl&PKc$ej|r5VNX1HZKN>f&c&j literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/unknown.png b/script.plexmod/resources/skins/Main/media/script.plex/home/device/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..564c2864a5c595225e6e44c11c29f9e9ccf1c1a2 GIT binary patch literal 664 zcmV;J0%!e+P)5i*0_V63m7tn%`{;M>cY!dpy1SqU(z(^^z=J_a_%`d!4BBAeH$o;o@3w# z&<8yE?g=5zw{ax45T}3!@DjMiZp?ub;8X}P|Dyxjw(kQiz$6|%0d*n7$FMTFM*a+V z3)~|IeE@s~(qW6)Y(}%$1fW){VHm~=gXej)+id_EjRu)a zCaP3-71`hEjj!|H9T!pO6oc!k(eX!?iE;6*(361@FIP(36Ma zUt{i0000 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/device/unreachable.png b/script.plexmod/resources/skins/Main/media/script.plex/home/device/unreachable.png new file mode 100644 index 0000000000000000000000000000000000000000..a06aa49c31b0c205e78de77c7b5a4d8edb679a5e GIT binary patch literal 651 zcmV;60(AX}P)nVDlCFaJ{&_*ck!B_K185POCe*11UmF3n!!)ep)?sX7J{cj z9wMU73)C1AnheRHm`YK6JLK4?t|Y6F^bZ1E-FwgH|C}R50m2|qz&fxEYylg*3>O)x~^LmuGUqQY-y>`@_^bls~N_u zIt~rnuA*Q=XUe}23zo&2>rU5euFFEkqY^CJRRh|r)uxGR)@qd#p`~%n#gc9FT%IMn zvRzlUbj8-ZlO50F&En$py(0QrT5c&4W4KOJI-WkomUmI2X~ zeqLybDOnfHhHemsWJF2Vo+002ovPDHLkV1kFH8q)v( literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/plex.png b/script.plexmod/resources/skins/Main/media/script.plex/home/plex.png new file mode 100644 index 0000000000000000000000000000000000000000..9a94e24096b26273c8398858395fa77d23b08bd1 GIT binary patch literal 1579 zcmV+`2Gse9P) zK~!ko?V5RPR8$Hk#C2bDMQ$(w3<5?0CjplO zj{%#_>=84opa)}8H7&?r0wm=?%43d^W&0&-3b?8%KzI{yrR(H=OMxqZHD-21PbU8O zMO)S&?m~uS$mO+}^>qiF8lv)vz@-H)^MIu9T^H?n1n{Prjq1t7SM1pTHi>UgsM;OQ zFWvYAr8$HPs0E_<+zc$Dz@+wKFmP{ACVljS>zm}5E@xihiXU6TfCV{ArvfJzaKAuO z1ArnD>FvM^!RvlNB`_YC28<5NCBWg5)^<}O-3**lq?^5xzRdT**LPMfQH+_fdwbZf|XIlTlv*?hHRTSKcEnqq%`er1r#@?x>1EnP|appfz3dkg7f zuW#5Uaf5Z|d&yf17cfTBw5X>?|9%8e zsu(N2fIuc52ld}aG+=?k%?sj#NsPNMd)et`c6LW%`n|x)toMz;ZeU%|fB9eFhb03q zaV0h>-7+`Kz`nQta;D3w_wS$M4lJ~TRl5|+f5bp(v z!ILQ&J~iL+D&X26BK#wXv{xeKTJAT~f&0kz>?7S9pwgE9$2=6};wCd2)<=4g_~!0G z=a}b$wkmIpAG$ZfO*yc*kMtt&*?j{C3N10yz6zy{d9akdf8a-J7KSyo zvT(7Po!IGyR~KP|nU%C-{(4D26_`_MW|NBa*C^?Oyj`=#_+l$zXq!0h)90VSl6W^m z)p%RT?Z8FAAz=j-@UWRpl;pdc^at8Ge{Q~{l!GC_TkSYOSLF_VaqH02JgFJZd@I>5 zN99t@!P6SP3QE-7W;PF47ICfPf*=;8n)C7M<#~n#Bnpe-nsv-+j5pZ z4ZKspeNE<1S$(8uXT4O@jb=86oJu82<=%Uyk3XMe&VkH;S)?CAN8N=B`bf{hM>h|f zfHBX)6rQ$6M$XvvVaQ4N)1W01g;{1crjK-B#d*Y>Ssf6^=TUij?5E~EvH1mD%?F}d dA_?H0zW}^GpnTlSyl4Ob002ovPDHLkV1oGe@*e;I literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/selected-section.png b/script.plexmod/resources/skins/Main/media/script.plex/home/selected-section.png new file mode 100644 index 0000000000000000000000000000000000000000..9339012e6d4689e01b35b438ad36247859da1052 GIT binary patch literal 6642 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/type/artist.png b/script.plexmod/resources/skins/Main/media/script.plex/home/type/artist.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8e0177fffcc4012f480b4f794ab3910266fce1 GIT binary patch literal 1331 zcmV-31e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00f&!L_t(|+U=Z8Xk1kkfWPzd zrkOTrt*wQbhSG|SNi9-ATvTwOBHh@HRZ!5K(2Y=vD?vmM!Hu|aRk|rc!JWDhbR%6T zEl4dG8?{QbjcMA{*q(V4MtAkOd@0v#X6Or@nmXl?&phe(X zMkjz@fS;`#7m=mA*?B1X5Ss-q1DCA42>f9{CV&YMnQr&xJMBvq3D7d|Cve`;NnpyL zOaT`~WMMT{A@_KHqT7Hj1LsVCGo3bT`5TxOk=eYhq89-*%qNTiKbih+K4Tu31Lj3! zv70cu3Fu|uYa2exz>4Zyp=VUOmT zw={rTo&kLynKM4<5e~qThdLKXp2qhjH-T>>;6dO$&%{9mQ`Og1^+pcYdcw{*x?O+dd8!0B2{iJ~%dns}9d1W0 zsy=SBPnx)Ur(Q`vGXuN@>=Thmclji$`YXu^alYgL@L9X`r<{Efs=Cqq>Qlg@B&S^U z^WS!>8o(KnZ0E0l&qZV|TUT1)Cmx5_rPO3Qxrx^1y|t!&t688&z^5Ls`H1IWZpB>% zx4|N^VA^N}(_N%zE2)|z&0EH8x3Ab@ruC$%PUi^cimJY-s?v=OHD8dPQ`NIMz?o9j zmsFG8%2L2_AZ=IGw^eoK9^o8S)#1{>v1$H)afLbVD)0pGH1IgdDVa6fIjq<;c@4Ng plH&ah@P#cP8);oq?8Alu_!pHt_t9V;k^}$%002ovPDHLkV1mnWPeK3y literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/type/channels.png b/script.plexmod/resources/skins/Main/media/script.plex/home/type/channels.png new file mode 100644 index 0000000000000000000000000000000000000000..c03c9be48a4d044a5c49d1ab5314d50faa721399 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPN2a7n9K?X}#K2T`8r;B4q#jUru7xFe32((?4Kg7{< zNWj35=b*-$0uGTr7ALKH%e7}spJ#D#-72lzEh;zV=FOeFMmJ_xKLZmBM*ssO6N^Rz zkQ8wMl3WTvl2rgmGI0P&Mivf%1$m{RrshS{ZBKsu@McCz7V8CLqeF1@5BBr!w0jr% pG;U2%UA9yr4kOTPI`H0#@rjkVqT1I5nLsZvc)I$ztaD0e0sscDQilKl literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/type/home-selected.png b/script.plexmod/resources/skins/Main/media/script.plex/home/type/home-selected.png new file mode 100644 index 0000000000000000000000000000000000000000..023557b729888fa35a2c187c6b65f4ae26ad6387 GIT binary patch literal 7286 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/home/type/photo.png b/script.plexmod/resources/skins/Main/media/script.plex/home/type/photo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d528852d04e9c887354e54a126d777be0d20456 GIT binary patch literal 1252 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 _{S{`l-46Caq7$4T|&{zvx9E&Nri? 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 UR;T^M1ONa407*qoM6N<$g8xJn*Z=?k literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/indicators/chevron-white-l.png b/script.plexmod/resources/skins/Main/media/script.plex/indicators/chevron-white-l.png new file mode 100644 index 0000000000000000000000000000000000000000..45a6bcbee09268a2f99526a8006f539b93c9e1b5 GIT binary patch literal 1127 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/indicators/circle-19.png b/script.plexmod/resources/skins/Main/media/script.plex/indicators/circle-19.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1a852dc0d2c6bcf10eaa57fa3e041d606d4c69 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7S1|*9D%+3HQwj^(N7l!{JxM1({$v_d#0*}aI z1_o}RQf^^JhFNnYfP(BLp1!W^54gpI1x0^^1uX&!NtU=qlsM<-=BDPAFgO>bCYGe8 zD3oWGWGJ|M`UZqI@`(c#E%9`546!)9b;?HGLk0q__jkHYNmOY||;L5^sO2 z1#LfXK5et+fj*fs)*EUkw=IloC~bNp^-8vbWhUzm)uVev z7kE!9WwlT{*|+n(juP8~SdA>@q#vj6pP4E3^0Q9%B|C{XE)7O>#0SiBafM7VIsW?zbvcxr_#5q4VH#M(>!MP|ku_QG` zp**uBL&4qCHz2%`52R?Rr;B4q#=W;UHVPgx;AwrRZf+8=bm_vhmOF-g*%sNtvo%<) z177^y^_k(m=O&%@CI4!4Zdd&W3aqR$ndv%t35W3pk-P_An9@)2&Y5D8yfVadcVp`H z!-;0?(I%UDc7Oda=Q8)6_lLP{+9ZGckc)|Wb9n2#X*&E3-i?Pr8WIjPFfz08NEo0p p{>6WJts1od{mW14Dy7Tc%wrLcNd9mByb$PM22WQ%mvv4FO#rI=b3On7 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/indicators/dropdown-triangle.png b/script.plexmod/resources/skins/Main/media/script.plex/indicators/dropdown-triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..ce90adcb8bddde66db1280b48b6613a34bf2ffe3 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^{2(?58;~rMGjRk`Y)RhkE)4%caKYZ?lYt_f1s;*b zKvma4n9)gNb_Gz7y~NYkmHhz=hX6O*AJGTRK%oVmE{-7@=jUEB^mB3)VZHEM(WFhn z%)v4JAYaanj%_;xUN-bT;40u2Ymp6*5UO&@urWKrA~56p+UI-BKi^}S|L*jjL&1|$ zCxxBb?0?CBQbN?`*H6~-SltjgWGdJHu5r7QjZHPntcW`e@fm-tS$WnSkhh7KRkqW6 zaPzF}g7&+dcNRr&aq02{XE)7O>#0jHF(j>)@&&t?IIBuiW)N}Tg^b5rw57@Uhz6H8K4 z6v{J8G8EiBeFMT9`NV;Wq&!_5LnJOI|M~y_e?6NOlN%7UDYCqfwPW}q$o@}gg|916 O6@#a%pUXO@geCwI@G$8B literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/indicators/pause.png b/script.plexmod/resources/skins/Main/media/script.plex/indicators/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..622f04c769f793f3b6c01be6ad146edf46c17bfd GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^ia@N!!3HF~9)7wGq}Y|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sf11?d1J_DDBA%;L9$r9Iy66gHf+|;}h2Ir#G#FEq$ zh4Rdj3dS j`}^nZYzF}ha9Myo;wXm)Z(Tqo&>RL&S3j3^P6J#6b2IL&Qo@;(^4ry<90ot_?F6{px8>y*vi9o6pY%lqD{uz7vnr6S;U;q3dG zUpC$fGe7;aczC)%i!;=9QtktRA1rGU)?ZaF;GGk4wO>WVVUqHL8?{#N_pEB0`oy^4 zsodEuk)Cb``l3xP*Q!=B*zIz)4xMD-9L+n&K}6UUhK{-j!jNI03k>;)1cK0%@@}KD zwr>G>a~7_w<825o&sep-d6g8Sc-}>q>7k|3#oL?98}q+BPb=8_VSy3juOh`)`WwPS z??2CHKcB!A!91<%gKJph?sU8RFHSn2v48Nrq<+<^`{}kPBgMAA*H1K8P>GCZ_@sVv zQ@G{sqmuvHKOGI-Wv?qgsb{j!q(5`^=HGoR|O(w`l+X literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/indicators/player-selection-time_arrow.png b/script.plexmod/resources/skins/Main/media/script.plex/indicators/player-selection-time_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fe5e15a2e84b3182ae41b2e11a46f192ec2e5ed9 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!3HF+w~DI+DYhhUcNd2LAh=-f^2tCE&H|6f zVj%Skgc-HUqBnr_lz95OvOi!G6Vz2uWBR`kC?r|p8d2h$pPQSSSHj?2l$uzQnxasi zS(2gP?&%v4-pD5oRFvrH;us=vdFt7XyiE)OtQYbZZspyWEGm}3ahRbe>0!nc9Y^n{ ziv^^Zn%3`p@~-Y5tLwgZp1Gu6R&{Hhl-g0;tytyp zX;%FGgU=7xwttqKW6w7=|3QG500006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3Hks43Hkvlc3ZFj000McNliru;0F;BI4HfHKGy&M0yRlQ zK~z}7)tIqsQ&AYjf9E9x1A;|#(7{l2j1F}X9a@kq4i4S*KM*=4e}cI9Clm@D#66?X zg0q8k5fLdu1#P9!QbRB~4&GOuS^D11ZH#A09^`#F_ws$`oO{I?u#Ker`vR~CtN_bE z8@LW!00zJwumfxZTfk>Yhm&=pU_1Y;+1{|dZ+q-=7>D0)*sc}p#gb{*?m7*+wi~g# z(XxHuv^cQcDz!@mA|2aDJ|7&}?vy3esn8d(80UnF&;*fIn1+j-KaPR6q}{*Bgzaho zUxCZa4nKfvz)%udVgA=uUXk<$xC1;%&^wD+Fuf@pjGvM=fhMpC3}e;>tYpD` zqj5S3(g1i0+ydT3lv>V03}9M9xo%4OBI#}*_NhXdHnvY98m@JgzZIT)C2O7#=|inD z?q4w8XJ!1V9t5nJN-%Oo553g1{R((oMo6;|6_XONUAO%l_+F9-z+OGL^vx6`fST=l zKp(hNvCK{u!gGqx)FAzYx`R=Zwlv{ ze#MpCxBUTl0bEVc`+Z4=v3X_$)RO0!(10VLSK;N9M0%1&#iTbM88|mONkd>Mr1n|h z7+8`t%#AjiaNk{Eb;?mMJIbrYW6FPVqMVPj_T1e<{LA|pl_4~%o2%asQJjJZA

#m&Y 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 z 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

lM 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%0Du-t7OfezdZ}j!T_x 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%0ApRcOJWaK8O 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: - item = items[selected] - cmd = 'StartAndroidActivity("","org.acestream.action.start_content","","acestream:?content_id=%s")' % item['acestream_id'] - xbmc.executebuiltin(cmd) \ No newline at end of file diff --git a/script.areace/resources/settings.xml b/script.areace/resources/settings.xml deleted file mode 100644 index f412b5412..000000000 --- a/script.areace/resources/settings.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/script.areace/resources/telegram.py b/script.areace/resources/telegram.py deleted file mode 100644 index 1b3997cfa..000000000 --- a/script.areace/resources/telegram.py +++ /dev/null @@ -1,26 +0,0 @@ -import requests -import re -import datetime as dtm - -host="https://api.telegram.org/" - -def fetch(config): - results=[] - params = dict(offset=config['offset']) - url=host+'bot'+config['token']+'/getUpdates' - res = requests.get(url, params) - json=res.json() - for update in json['result']: - if(not 'channel_post' in update): continue - if(not 'text' in update['channel_post']): continue - text = update['channel_post']['text'] - timestamp = update['channel_post']['date'] - date = dtm.datetime.fromtimestamp(timestamp) - obj={'text':text,'date':date} - match = re.search(r'[0-9a-f]{40}', text) - if match: - id = match.group() - if (id): - obj['acestream_id'] = id - results.append(obj) - return results \ No newline at end of file diff --git a/script.areace/script.py b/script.areace/script.py deleted file mode 100644 index b09afbe7b..000000000 --- a/script.areace/script.py +++ /dev/null @@ -1,7 +0,0 @@ -from resources.main_dialog import main_dialog - -def main(): - main_dialog() - -if (__name__ == '__main__'): - main() \ No newline at end of file diff --git a/script.common.plugin.cache/LICENSES/GPL-3.0-only.txt b/script.common.plugin.cache/LICENSES/GPL-3.0-only.txt deleted file mode 100644 index f288702d2..000000000 --- a/script.common.plugin.cache/LICENSES/GPL-3.0-only.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/script.common.plugin.cache/addon.xml b/script.common.plugin.cache/addon.xml deleted file mode 100644 index 18ca5d794..000000000 --- a/script.common.plugin.cache/addon.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - -[fix] use xbmcvfs.translatePath when available, xbmc.translatePath deprecated(Matrix) and removed(Nexus) |contrib: Gujal00| - - - icon.png - - all - GPL-3.0-only - https://github.com/anxdpanic/script.common.plugin.cache -

O00000JC zpNr%fIC44mKo&!EWnb16IWX}N74(PPMKq^>WKE)L;NUs%{l~q1C6JhuZGjXpEqli9 zZ3AkQfLVYfsioI6Nb05FBby0Wcv6zKNYyk*sz^O)TnN~BUSd22-Sz+%HUf45<(Q5n z06PJv2$`A=Bmk$ehQg4k8$=9aJ5Sp1BWc;PZfrEMv}f9|9<*Q;7!6%pP*Lx7Q`-Rh zZmI{{u+PRs_77uX?ize~k0ga}!cKZ3TUlEWG$&c$&s;cKV-xLyDuG;LRLVvvoW&^8 sKt4%&kaR04vFo3b-X*e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00a0*L_t(&-p!g#Y*j@R$A5Dv zA4*#lBvw&c5rax%Gyy~tB_VO)is09VxKI}a7RHj`+PEYV-ROdiABnC>Oyk1D7}59< z7nn#0q-bfuL|YL`izcP~TrkgEANSsOZ@qo*{gapXF*E1bRhuQ1>i0$;SIF>R$D4 z>%*+NN4+_%t4`9-s*^4reph$?Z}KU^z3O4xhj-MKttJp!kY5pZKAZG^T!_KBKNGkh?1O`A|Jm(t+1kG9C4X5~Qcqo$Au6 zCa5k|cd0WibX-)Il@;2jju!~KqQ2Q6ybwo9?dmf1Ep@&?-!IY6S_*rw#VTw`^{vDC zQ6Fic^KhX)b$7wwGwNWivG%_cxLchl(Eog%fLqn6f`Nl=IE~jA=$}+qXU%xHz^1oA z+fs>b1vdZ6bvv$J&FOq7+F?6LH(qb&aG7f!@LEpCnNs1X{s}BsFXwRD-{_R6qdA?P zuG<+aIO}scoKC3;>QFpPnlT;^3OcajjYH~e&Y?7z07F1u#`vSaT-y@-bOLov=N#~5 zMsq(flmOdv#*cJ@bQAfJoaXHbkQeH{p!3M%u$gG=*MTlUj)R^|fPswu=h_`j@}diH zHlukU0aj)-oKM+VCv6KWtT?_Sij=8+sMbRab_)7(My-n@3-Lm6D>W51}Z%(4K1F){} zsJ;q3T4drmzaI=C{Lp;kc)4KJ->7-j_bjj=x-UyuzxrFjpuIJd|EePC%j*4k!k%g| zc(^WSReNH=v@FKdr09}*s8uBR4_FIq0=5AU0~;z@*X|I)$7SMWdLrLMg`L9Xn7y7(pCd^LTYMZC?jZ5;5W?xo zhhHk%+!G(FUa@}6#%R@(@ksK;TJj6^G4+$02+ybo)H_r1*Tu|Kb$&4tvo-3$_*i_Z zHP;?(T5Vlp!_EQ0000c-?_PV@fXCHe#c#6Xjv3brPiryn2z;*Py}|6# z9h0C0g%8ai=P+*&tkBn}dobJDfKmIytBv2bTeIJ3U^;Vv?S;a&dBMA$IWx*Nobh?L zt|K5#%UD#fsC?#4gQ}9V?UDg&L)V(hUW^J}TRP*+Z~OeTZ_6w4FKOR&^H+0tw{G)} z-z$<9l}88`-cnF%JLn}p+352Y$27j?@P|sQ6-+v(i=wuiuKl;9bNca$%87NGPEGHB ddH?wzwse+_GDd&nHv+xE;OXk;vd$@?2>@uWfb9SP literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/indicators/spinner.png b/script.plexmod/resources/skins/Main/media/script.plex/indicators/spinner.png new file mode 100644 index 0000000000000000000000000000000000000000..6ddb4d4ac419e8f4b881e049e29a978276fcee6e GIT binary patch literal 824 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 MboFyt=akR{0QwtzoB#j- literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/0.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/0.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff39bf62c50285bf0086a6d57b7fa3d57d2da1b GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1an)5S5w;`G~thKvjh91R99<)xH=RBc#j)z9EF>B$zB*(^-|j`3>&RWf+G`njxg HN@xNAAHgf9 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/100.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/100.png new file mode 100644 index 0000000000000000000000000000000000000000..b25f1dc57a9f4efe2e83831107e229b3880e5755 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89A7Mq(@QG4j{!@;1OBOz`%C|gc+x5^GO2* z*-JcqUD+S7aEfpVo2UJn02Goeag8W(&d<$F%`0JWE=o--Nlj5G&n(GMaQE~L2yf&Q x2PzWtba4!^IGz0G|9|_#8WOCF6GQ@-85mw>GX3wl=n68K!PC{xWt~$(699hWD1`t3 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/12.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/12.png new file mode 100644 index 0000000000000000000000000000000000000000..3cff5946998d143b5555c1a938369c1ff35b7681 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1av)5S5w;`G~tjJymCJk1*(#+zLK*dlh-mT7~^Nj?^77AEf(#qL0b44$rjF6*2U FngAN3D=+{6 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/14.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/14.png new file mode 100644 index 0000000000000000000000000000000000000000..fef67aee2dad268d38132bc235bc859e5acafa7d GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1`Ki;O^-g5Z=fq z4pb!P>Eak-aXR_W|NsB%+X4?9IC0{Hg%sD~1d*Pmg)9tAyIGjZb6i2jF?hQAxvXT5fsA;G#hVFM!rlQ#=fzBYddP$`3_tDnm{ Hr-UW|(lIPc literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/22.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/22.png new file mode 100644 index 0000000000000000000000000000000000000000..b79551d567c2296b4b82c7330a70dd6609b4d032 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*@+wC8VUJ$ndrX8gRKCbO73Xn}zAcrt6D77|Nqyw1v(fXIC0{Hg%sD~1d$%5D4@;JEKD!mvW^0kGI+ZBxvX`Ki;O^-g5Z=fq z4pb!X>Eak-aXR_W|NsB%+X4*~8YWJhSZE^Rc2Glt^$8OL!)q2MEoQk-K&1?xu6{1- HoD!M`Ki;O^-g5Z=fq z4pb!X>Eak-aXR_W|NsB%+X4+V7?qWkA7^OvGzA)P6)-X|WV0~wCGAN8DrN9=^>bP0 Hl+XkKG@mMw literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/30.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/30.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c9aa4b821acfa6c11d7b47ce63a0d44e4e343f GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1K9a#5JPCIX^cyHLrxhxhOTUBsE2$JhLQ2!QIn0AiR-J z9H>an)5S5w;&k$#|NsBjw*?wJVNh09ew?Av(-dg1iIL&|8y2Roi}$Yts$}qV^>bP0 Hl+XkKwUsYh literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/32.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/32.png new file mode 100644 index 0000000000000000000000000000000000000000..e4224f7b87fef4a85958e46acdc5a7811a6d5792 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1an)5S5w;&k$#|NsBjw*?xkVNh09ew?Av(-dg%hmqlb4GU9*?vD#Vl?an)5S5w;&k$#|NsBjw*?w3Vo+9Aew?Av(-dg%g^}Uk9~P!%W_N&AF)(<#`njxg HN@xNAvyLwQ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/36.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/36.png new file mode 100644 index 0000000000000000000000000000000000000000..74889d1562fe77b4a2bd953f172a8072eb609fac GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1ZGi?{3mPU)oLFcg;&xC&LW+UmUk?kD3P=7a%)5S5w;&k$#|NsBjw*?w-bujb*!QzDmTy6&+Ff#m;VPSGipY;o7sn8b({B$NGBPl5G#I>;m$LrxW5Yr#c819+m77_AvoJM_Enf^&$>8bg=d#Wz Gp$PyS#4Bz9 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/40.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/40.png new file mode 100644 index 0000000000000000000000000000000000000000..02bae0233f4d89308b85bdbb7a696d75a3d52f4e GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1`Ki;O^-g5Z=fq z4pb!X>Eak-aXR_W|NsB%+X4-^Rxn6NN=mvrCyMki{bFSJJBNj-sp;Q(pi%};S3j3^ HP6a%)5S5w;&k$#|NsBjw*?w-W$;KyN=mvrCyMkiy<%ectHZ*STef&DP$`3_tDnm{ Hr-UW|b#yE4 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/44.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/44.png new file mode 100644 index 0000000000000000000000000000000000000000..72a4f4c132c9a395c591d108d13f77badc1de21c GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*?w-u?ZL$85#Ap9nz3sUBb-pXAcY0zMbA6M=*H0`njxg HN@xNAoo_7t literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/46.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/46.png new file mode 100644 index 0000000000000000000000000000000000000000..6e7155e6931b206442dcb29467545c97f46a7501 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*?w-u^A?$q@>93wgTA(j0}HlSeP;&=q>{)W$<+Mb6Mw< G&;$TWzAI4x literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/48.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/48.png new file mode 100644 index 0000000000000000000000000000000000000000..42a61770e3e4fa82d12c9c4fd9a08890651fdc0d GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1an)5S5w;&k$#|NsBjw*?w-wP_}#q@>93wgwu+Ff#o1VPVSC^q&D#$>8bg=d#Wz Gp$PyX6e}(O literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/52.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/52.png new file mode 100644 index 0000000000000000000000000000000000000000..353fa36789f992e1ee66614f97f7c84917d551b6 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1an)5S5w;&k$#|NsBjw*?w-xhW*1q@>93wgwtZVPyDqhlOdOO7LBvN(N6?KbLh* G2~7ZZYAovj literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/54.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/54.png new file mode 100644 index 0000000000000000000000000000000000000000..66cae819efe9c84614ba61c7a19b8e5bd85e11cf GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*?w-xiNAjq@<+C@U{jT++bw*mBYfs@hW^ZP$`3_tDnm{ Hr-UW|mAWjd literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/56.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/56.png new file mode 100644 index 0000000000000000000000000000000000000000..7f806034c5affc951220ce53e0335d9d5405713e GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*?w-xiNY+Oq@8e&_u-TpaV0*&o?Yg3sP3J0F^R$y85}S Ib4q9e0Lm>cWdHyG literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/58.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/58.png new file mode 100644 index 0000000000000000000000000000000000000000..2aad245a9101e2f192e816a694b686eab515b2f0 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*?w-xiMa4P*zrcoT1UfRK>vXvxbG~+)~#-pi%};S3j3^ HP6 zaiAi3PZ!4!i_^(}{{R19-xg@V<;EDxpscL?I76d{DT|TeCl3o#me(^Gpi%};S3j3^ HP6`Ki;O^-g5Z=fq z4pb!X>Eak-aXR_W|NsB%+X4-^+zu{a=mCPo3k|qBSQ&owurNJ6J!1h-DTAl0pUXO@ GgeCyS5-(x^ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/64.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/64.png new file mode 100644 index 0000000000000000000000000000000000000000..228dba450651a1a8f911c69544e381be2c2c4981 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1`Ki;O^-g5Z=fq z4pb!P>Eak-aXR_W|NsB%+X4-^+zw7)>j8qr3k^OoFnnLb!gQ3;t{te7!PC{xWt~$( F699hEE;j%G literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/68.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/68.png new file mode 100644 index 0000000000000000000000000000000000000000..0c853000b74774a190b4eee39d21767e2fa128da GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1`Ki;O^-g5Z=fq z4pb!P>Eak-aXR_W|NsB%+X4-^+zxJF>j8qr3l07-FnrfxVM;bpRR^kM@O1TaS?83{ F1OP;~EWrQ( literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/70.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/70.png new file mode 100644 index 0000000000000000000000000000000000000000..869f9d751c950fd8f3cf829f8f136a8abe681ac1 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1`Ki;O^-g5Z=fq z4pb!P>Eak-aXR_W|NsB%+X4-^+zxiI_5i`+g$5>!4Bz&!Ff}@R=mAwSc)I$ztaD0e F0swMVElB_X literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/72.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/72.png new file mode 100644 index 0000000000000000000000000000000000000000..e9158e62821122dc32cb3fd98391973f145b1a37 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*?w-xgFFvz$76lDe3N<_<@Pxn-2?<77|Nqyw1sZU<9n@H0l#r5=BE!pii;3ZD3=5OuHzyvTQU*^~KbLh* G2~7YkP%CQy literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/78.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/78.png new file mode 100644 index 0000000000000000000000000000000000000000..2333dba5c81a8c9cb36bac9f0e605f8df48f04f7 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*?w-xgFG4V4RSWk|M*)dWwPJ%N-V`*OP7l?P6f?boFyt I=akR{0Nk}N6#xJL literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/8.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/8.png new file mode 100644 index 0000000000000000000000000000000000000000..12472cb9211843b3882671706690e8033ec0cd03 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjvsp2_0YO`!0hilB4GC5eMg~@H7A7(O^Iw2U89ZJ6T-G@y GGywo~b1Itv literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/80.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/80.png new file mode 100644 index 0000000000000000000000000000000000000000..873fdc264a6ee2ccc8ced2ed672cb813a8fbc36f GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1K9a#5JPCIX^cyHLrxhxhOTUBsE2$JhLQ2!QIn0AiR-J z9H>a%)5S5w;&k$#|NsBjw*?w-xgFGyaA}x0ablr~2nRF6mmC(RE`Ki;O^-g5Z=fq z4pb!X>Eak-aXR_W|NsB%+X4-^+zx6;C^bx+II++~M1g_f^B)$b4;?nkfJzxWUHx3v IIVCg!0C>GEYXATM literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/84.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/84.png new file mode 100644 index 0000000000000000000000000000000000000000..86a77bcee835d7a139b9e3cfcdbf9c5f0d1473dc GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1`Ki;O^-g5Z=fq z4pb!P>Eak-aXR_W|NsB%+X4-^+zx6;s5MNSII(ca4^f8CH7rc2k8XqmRWf+G`njxg HN@xNAeMT;i literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/86.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/86.png new file mode 100644 index 0000000000000000000000000000000000000000..bd940470064fefa355a47ce8f03ce3f38875a445 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1Eu8E|NpOV3pC(zJE$SS*f4S8#6pXo>`Ki;O^-g5Z=fq z4pb!P>Eak-aXR_W|NsB%+X4-^+zx6;JZzXaabn?$ostZn=CCjct}5FBRLS7!>gTe~ HDWM4ffDbN^ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/90.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/90.png new file mode 100644 index 0000000000000000000000000000000000000000..528fc988762ebf6790f9842ca6e3757c438ce55d GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1 zaiAi3PZ!4!i_^(}{{R19-xg@V<#td*g0+HCSy}mULa{KzCm9x|z*n+GK&1?xu6{1- HoD!M<=qxQF literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/92.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/92.png new file mode 100644 index 0000000000000000000000000000000000000000..565e15edf0b48473d1789ec8e55e375715fc8443 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1r9dIc64!_l=ltB<)VvY~=c3falGGH1^30M91$R&1fbd2> zaiAi3PZ!4!i_^(}{{R19-xg@V<#td*f;ENN&CTst;|6htk84<%-rk#k7^sxN)78&q Iol`;+06Z%&7XSbN literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/94.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/94.png new file mode 100644 index 0000000000000000000000000000000000000000..5653ff0cb87a5eeb35478774066c61ca708a9f12 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1 zaiAi3PZ!4!i_^(}{{R19-xg@V<#td*g4Kkv2MD$pNi%%3VPVqu$k6~QW$<+Mb6Mw< G&;$VdGc8yE literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/progress/96.png b/script.plexmod/resources/skins/Main/media/script.plex/progress/96.png new file mode 100644 index 0000000000000000000000000000000000000000..6bfbd5cccc592eb04fcb98296c61ab13f7c7a9f7 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0y~yU@QQ#89CU1a%)5S5w;&k$#|NsBjw*?w-xgFGyU~T3zFfuZFG?|^@gAWVSVVP|UfJzxWUHx3v IIVCg!0F_iM-v9sr literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/ratings/imdb/image.rating.png b/script.plexmod/resources/skins/Main/media/script.plex/ratings/imdb/image.rating.png new file mode 100644 index 0000000000000000000000000000000000000000..adce94124530577fb8b910c9d05072d671fa17cf GIT binary patch literal 2909 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 Hu0mjf^522f literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/ratings/other/image.rating.png b/script.plexmod/resources/skins/Main/media/script.plex/ratings/other/image.rating.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f83e717ba8b8e71c0d682b7cc0f39b44aaeda5 GIT binary patch literal 662 zcmV;H0%`q;P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00I6 z7lw6acV>FrGz`>qbyvN4MZfBSh+(^Fdp0IULfkk990Jy=2AGHh&XNq_hy(o&Xg2 z_5HDEd$~kBC%`;#9N3p~D8~jkKO|rW@W3AD*t@_N*%ojOxLA^js5Sz;1-eSr_9Sov zX#7VY2716_N$>ul*Y+fEE0iUvIr%QI3fz~pnOEOFkW0W4Fj-UbEnr2`i$RBm9JlGf z#?c79Ft83hl(d?)KqJn)fSbT+V1LQvJHQ9vfu!xcMJgyhmw_uK0jx-RR+kd4SD^oA zol?A50YIk~070rxQ~)p&`bIPZXNUN5@-2q+$zX$eQh$%su{vW^-NnJ_K z6cyWKEmGs{Br%;l4V9s_TX{Qtewig2BuO!_qk~{^X wC+Qxr4E!2#iOB`9WP2|90$@+uzMAL%3%$jq)J#TR-v9sr07*qoM6N<$f;|Who&W#< literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.certified.png b/script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.certified.png new file mode 100644 index 0000000000000000000000000000000000000000..0607c9c1150bb087cf4ad2748d75c2dc4dcc2612 GIT binary patch literal 2754 zcmV;z3O)6SP)ECIxUS)MWqw02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{017HeL_t(Y$Fwv$9(N}ZCq zdi$UIN7VmxuK4dqbz)W1Oi5c^@R8MRa^IG9PSw(On?vt8^na}QLN`p!Kx>mAJ_|li zqs;VivR9w%>GNJ3x@8?aKU_KsW1o5f?bFe6{jqzU`ybkD9@zVk`{lH0g@1G;hv`@B zzE80K4aKv6AUSvx>Z=8R`L~LaGKK56X>Q4fx31K7gbn|;Xvn!SFd7{|y_L8sC1<{O0d|-u;1PTIRu%4t151lm&ZtOQe93h+x-N#ZS-1 zcx-Eqs$z$Yt0iSo!BiZAe!&~Z6}RR*wrp^XmTG-_Kp6|?hy548@;(KQ$S1n>T{||a zA6MR;(TArz1_nVXc%WNQRVk>e(;2tIe0Z~vUwlx&V#YxFBuy0-ri7)9f}AZFx(@fP z6JRRFrW{dSXlxFd;_|?#F$7ulpWyB`e{FY{@%QyDnev&eLv2h@7=l$D(B7tqTYi3a zrJR46iE(V87Rp5tz_{;nB-eU6us}G;)=&uN01^U`6@pJ zd4tXa9`d3={v(5ugrIVzLm;BKF$RMpP_@KkYlj}~zpgLNCklVHXr(+2VAl#WvbNRy z$ItCf`vXCNm4UWpP?s~w{-~JzKNa8`(#R-5U%A8$NgnI9Sp7+kkqU#ZksKY@96~n@ z==Wg{n?&0jYL~k-#3U=*1a);Tlf!{7-Oat+cQcdGAS5v5jz4=;+Z%0IAQG~S#1FeRC+i_#SZJ}OiY zAq^?er3iXTFqQJS7SC|<>M(t`#z=S?SEd~HA9#&_y*NyH+d8tr00rv!#3{H7+*EnA_RYTmI` zS^wxbpUj=3@#jBh{l}L$*Le@)r}|iS>oh}sVUjg#NKWUtdZr)E7h>&G-=+WE!-!Zd z_pI7T&(IX!;3Z}*o#%3-o@H0B(=vIB)93n0B*xj+qR7~4E}a8?d>&P%#ITmjEHy8E zkE!=18*?!lYs)zM_A87Xe2FhUu#BF!Utl<%q$3t#@cT#cEE_DB8qbH3QJi%gl!8r$ zL5ps3=*?GY2!)AClhMns6Wi>f)kldZwc+Unl>Vy`rJAe6X>4QXUpy7T(+fx*3*b2L za7UEKJIk;`4sFY7iTJ{}3mI-M50D+PiB2p0qaOCGhb|NmQ<70&3%I|in3RA-PO$xc zlaf727AAGBO}VFsCX~{zPu%g!LgAxl2Z~<2uT)?~U7S4R6N>Tb6jvJ)l!gUv?;_1^ zl+n=~zTdmU(QA2jZwjy=1%+!AP6mP(O*9QmDe+kvmJrN)3V+n0C@(oXAeddSj*Uzt zJqd93lvGS&a{_cqf)s6^;Pt73H$*Vv2ScAi2%ww>_+Y+I&)WAt*anm-XT9$Q7EV?_h zM$pHK3x~$XQ z2s6VLA>puYIo!UUWBGD}N57TliQO7TsF209k1woF(H=?h$OfC#%?wg05v$N>s3mpi zP3vXZvA%lCgMZ%np64?|hEz<9I|PD)l45~hSN{&j1tXN?)23yN=l&4&VNYa~U5 zg3@Am?rFHtV^QeE$>3d)gONW0m60wBqtDgQP8m4Cq|( zl?jouv2%*<=B)Voh6Ek$8v9-`xs!@e-4MV@JJ$w|-~J;3(73rF(6O;Jp_K;ocg`ir zFXYf2FJ}g{TPp8Pd&*1WsRfCMYlc2&FF0B9stW)8x^LS3`FCgkpKVy07*qo IM6N<$g89Ezx&QzG literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.plus.png b/script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.plus.png new file mode 100644 index 0000000000000000000000000000000000000000..57758c6a2a1bcc16cfdf2a4286b0e6a194a00a58 GIT binary patch literal 462 zcmV;<0WtoGP)EBp<(jPn`e&02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00A~hL_t(Y$K{r>O++yeL}!+Z zFXK+40~#PDp$Q@c6R}^n++Fmm6Op@7(=q?!w2SMJFal1Tw zeBA}I%W#RECMY%Zh!6k(02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00%BfL_t(Y$DNj2j9pb3$A4?B zefB=rIcH|hT-qr^Z9DBu(GhyV0ks8;AyEk-V!hNC(HI|i&?qmypwA{g7)VrjA;AZX z#F!X-K#2ho1uCgvTPP_AZRxahZs)T1*?X_GJ|E7R)`6leD_P0jYwx{&`}=?Y^{r*N z#&*lS+df|0JN1k9SoNrXYh{^_(Db!_aQ!DncFfMzzZ#WGTlk3Ws-Vs3idnyoQ@=BL zdHM9#_gYK4Z=c%rQGWcYKDhW!x3O?&$DWayp=zM?f&5InJ$KjCPe!Jyhk#)BXEv3t z1sc46Agl)}TeGr$fBUz0PkSf(hqqL|zj;^VRIMI;suik{YRT-LnysJQzA$-k%l@(L z$Dcp<%d3T|D~yFZ7A9x5?-`qFZml+hC^)3G+GjmYY1^nW5%K!NCkUG*ng=H{0(mye z{KSz5Up(+{SiKskxzb>1qC6gsM0abY?~hydmP#WW@&z57IM&52Wn}O65Uo+8MPr-g zZ9@eW?VcZ>*>~gk_WiYTu<5Op#gpK!1uE@x-HSJG9hog}D&HOq6>7zD!1)C7(4ceA z8A6&jHkg<$;*G+LhQ(|moX^Li12S7XFubtoroHt_@{iY+PFBg=!9+vgSfFV0ALYHG5EVfJ{; z;omLe6(oUTsib&i((uB3*}XSxp6;CK-2e0=$4`Ag-ut#qY@IdXCnH{*DRF+J!2Anq z-1%*X z6gM615?By@Id>k=D8`hY^YGTKQR%3;J}A`hu2i3>m4X^W8r?8R-H=5ZlL?Jg%eKXo zJIiNVwh=!?5;)VQUR30XO5(k;ae%n3X*wG5&0`i zEA-2g1BzPT7&MF-^MDco0VN`Q_i}uaL*^jszlRlYeY#Q~%%KBvgj^s4QiQe_309n2 ztUEpAGl8_9FG(~May&pU@6VWfB+ikp#rGWaJdzIJvJvJHtU%5>%#(VdC&D?OUknnF zmk@T63UmdD9NuV@fXY1-bbqVQ1xY>9wMf??9S_MM+W(T$ieLv3_M{(OPdteTvG<&J z_DFCn&z{^_2oI}FkdB~?AU;Q|NA)}^7*rV7UnY_`q~)RQk)B8V#^^F2TL+3K834Q9 z(e{qlvh<1Ir7ZdLLR36?oe6fjp2q{qYDgUv9TE&&?F3RmVh^z(iO1)cP0|PUVLkd% zCgSOO*YD18HqTx=oo7#*drH;Z3Ky;m3ik%6zFbyN8ITGjKrGPp(D6uDkVNqIvLiDf zL5M}@iqOT=_MVn^tU1e?%ek1Rypd<$i@kltJd-BuiHdJVN{>#OU>~g8PM}9WZ-Xv9 z!RP(F<%56fA$|D-OeduvzTASLh zM<>6#s}OxBQfj+W6xL0Wt}g+E#Cu}ziN(`(j<&b7ZB9GSXj_}FI`_sR^5|dS5uo$` zj-UYiw9(viM^yesU7OE3#SExnJAie?6N{tkg^tVVSj(EtShM*`$J#fRMV>tczc~g+ zulC%#p*>h{&dr9=LZHdiT;h@VBGz`v02q YKejv;Z1I+dIsgCw07*qoM6N<$g1*bSmjD0& literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.rotten.png b/script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.rotten.png new file mode 100644 index 0000000000000000000000000000000000000000..2b7c9bcf4013b5bfc9520cf5fc15768fa3dc5025 GIT binary patch literal 2358 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 Ef=R|(NdN!< literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.upright.png b/script.plexmod/resources/skins/Main/media/script.plex/ratings/rottentomatoes/image.rating.upright.png new file mode 100644 index 0000000000000000000000000000000000000000..42597e48fd6c3e326eef67fac3d00cbf31557175 GIT binary patch literal 2108 zcmV-C2*dY@P)EB?84_5(NMN02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00*Q=L_t(Y$9VWt@qz|&yGL;;JZ7n?C$E@*3i)XdCPIz!o~E4Z|u3^ML=9} zQLNFitb2h60p8hn)4BCx&FO4xWGbEJp$BfZ8vLAi_^HvB*Zz2CJl5C}HMs(-Hn;R_jU9RK)qU6A^^e;Cy)N^qbQ%CZ#BSdU{qTv0 zc0bzQ-X2X)j*>VsE@iQZT%E;_$kwUEFwOm2xbCJ)KC4tsY-x6y)NHu>g@O|{Nf5tn=U1v zDPlEjWhU|BnSpD69b1=qN3Cf8*^jRqzx3)WI~#ho;OZ&LxjA8rkmKqh%K1e~xid60 zM#;?PDdxgV#M2nLO6K$kq2MF5%oncyOmFQP(*}3|zwalH?s>Vr-EZ?dZxBYNNRA$- zIDZPSt{z=Tkt=nPITZ0*Y53?hfikqzkh0e z*}lxO8h(1|rojz&Z|!laIx} z&mN|=|0;B`K)F;PzqAa(kV&4xa%!kDk;xaU~C;3a|Mx(x*~1_H8Co7iJ|j zgDBgbIdit5v)cm6{`Whu)XwM|V-9e$VE<|ZPsjg(iXF_uSl zQy)j)ew*g5ix7GhK?I#&!DJUGjE&(=1_TfN9qY|$rag{1Ii(I;4bhubJdHT=Dqd3! z<^Fm)`@>iZA5rcRc+FkNTpUxE!#lZ5X8#0UevF8&r+8utMo&{cx{N+k#`rdNQwV*^ALU* zQCEjLc^bWxp??2ADU6L%`}IA(1MHDt*)Ad`U}iLOPA4^ ztTD!z@_~aU)zD^A^%t0PRxFu$KW0)j%_fMC7-Ni4vvVfZ*kKl$yG&q=IdJOxrGJ#ZRKLW;7Hc}NOHClr<2+P8F9!hJ}QU+}dZ0JNuMP~5W;5qpI(-TM4 zToSXf3lm7n=|!a0NZ$t`Fc`E}C~YuOVgPO1=x`XNH9ual1_}4fyMLnyfk(6 z=t(vYAca8A%vJ!di?(eP1|=m*DO7M4?uJmI5DI~uOQJ1->F;MI9v@xTEHV?5qoTbH z84e@ol1O7vwvBQelmQh4D6LTCGFpIgU8I3PKrla#^nI+B7V;w_!|UJ+W8;IOx(Zoa zL$HvpyaEK;b5R0h5FnMRjDU`KD5FtQ5u8~4K}8~HW6Qqyb&!BOC_-1S>13SOdwuPx2CstTCN6X9mWH_dYqjv8}zsDwQa` z{{f-?UV=!Za_2%|Tn{A#fi{Rp1U)-PIi8@X6?%M}iPzsa0VF@spwF7@^TG>trSeWU zpw+nc5h?LmI2S(9>KcY7&B01iDnlOafEPJjb15glPzPGY++3l mwf3P)8Eemk!TpIuY02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00cuxL_t(o!_AjXY*bYg$A9O( zkC|bnjFh%up(v1)j}T*8krldNLE=VtCWgqQCw(D zNHCa4YM_F(q7(|1HpS9*I?QxBGw;27T)c)tq{Xx_c$1gh+;`5qzjN;YoqMm)+mQhF z0i8etwQPaS1BdX;K^J%nI7F_TGZ)4}z^xUB-LgDOW9kE@f_1|AcM39E%J`i>!DOX& z*-#+uQu%x*SXCF_$;g#FdQ#r!tDD4w~6nQ#bSUWeV$0uyDtV|@hs+c7VlB;3`C z^Ycx@S6k7vhxs#yzeo@>*9(~r@elVP!$rKK7jRAwK{+Jcvk_gNg;1dsVt%=WbLz(8 zSLlHjBH+rb(z6M0?{Zt>#?PY$QP0c@IpyMgd=cpzk3C(3)CFp3w{jwkD{3yZxcAPWAFg8ul(S{kw zqq{fYd_RcRCkgj#B=PQ#RJ*oeejP*C)Zv`yC)nSPj7(v! z6smX!&Y~-pU{3uNk57jXDGCt8uml$OyX!=|T5*qGMrQoufPhl$vp^7ui&g(5iG4pH zk)jC~_uK14uWcZF`&oj{cFfrkh%Ch3j5+J2rQ;&6e&lu=8+;JrP);9 zhy#%R$wk(Yq(k`nX5>bJaQB8dPCRV)yp&}zw=&JNX1(~|d=6cfz&+N7Hm9M^LmN}b z%~Fj(N+I6CbKpD3XbGl5NV%B)Nhk)j0}%xop1OB%Iz;aC3)V&>kNi%dj~_%0=-Mol zg6O_W6Kz{bw7nUL{^L1gA-51CQPkE53CE!jeI0{%CIqGwusd23!JAtW_$Hphh@F{A z(3!1FP(Tq;RKa)r1)w;D_HU-c6FlK}xao+)}V9>A+4 zo02Aa(Fn#UBt(~pi!Mscw6D0`ma_A+yJbEny1Sj3{qo+t`SGTp(P%UpjYgxuyYtKuqahhTaY*B5r# zGzwa5xN4hO0GI@TY~X5{+ySeyuB4?AQD=d0D9kbnS7#lp$`IafWu;*XU{#83?kh#D zfKU~Qh_e{FT0jd6i`xnptjYy-4Q`Ko0c(*q?7CwB@G$Us1)pgbl}SH20aj&2QcIbT zBVf%Hr?DSvC5jut(!vabRVj;aEFaE?R-wv0e=zjb*y%_HHMI6)T`^c5-Y- zTzd%sN-86@I00>Q4&62mkSIN?LP(JUPKR8qAIEX&(0EQI(uX|qqHrzx=Gz1kDGcuZ zfz0kcxJD1GT|5JGZ?rHR;orc$!&ow@>5}khlT>d}Ik419yg+`amMytCwFIBB=s~4aZ}i3i7(}B8zyW?+c1Y1beXd zy%XXAu0JxvY=M3*MaFqdl@s?RW3-X2nrny0ZykWym6-(Oaow1*ZaCf$OVe0gI6Uu7 zIvMmRWdcrik$811mM>8Y=;u=7Di;S7lJ#>b>i1%?z}s zs02h4??(5nLv0+i7TBqkWo6LzgId65qzZTvpfVC#0Y^`OfK(F%ZGoI<0XfkEazZO$ z?2>yVK$R^^E1>kviWop;B(ws?D!o<`RPU%=xDl5&dx1(o+lP7Ro_FDy3zM|jZWvh4@?@^^CKrw2@vNj$G8}J$r|n#;F^1!jF`=+*PsNn+j2;(4 zQhYI4F-eD~T}*4^?t+A@2V%NxY>uEF0}=10sEmD~#~c!1iDeW|*hE0+iZohcA*M5x zqG<6z)=4GIn_h^?KC+7mlu~9-QV(4Fxs;5fuQbf#I8T~KNI$WT*{s4&Fh!)uJ3x+# zvfoTVA;(cj8LnMFl+CoN!ixGIo%o-?Gme=KV~mzrKe0~MCs%lmD)7(|0mB5+=CT1X zgJ~q?z>eSw?p>UOEmn<2qtR$I8jVJy2?GHC0PUw_Ri#^ZcmMzZ07*qoM6N<$f(tb; AuK)l5 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/reviews/image.review.rotten.png b/script.plexmod/resources/skins/Main/media/script.plex/reviews/image.review.rotten.png new file mode 100644 index 0000000000000000000000000000000000000000..39f6870085e4309f383c9a02615ec8b7f0007e09 GIT binary patch literal 1306 zcmV+#1?BpQP)sa4>d0MeRW}y+Z_@UgAo?vGD$PFJNy4km53kyh%R2 zk}tL9TnwM7gVv2k7}-$hxXowByH z%WV!?3le3?h}c-5h^GVrN*UDW|G}EVXnZd5i`SX{0IjO0rUt1Nw}{hyh~2~w!kETH zYu<*aN+Ju0=}PUW3=riSuSKg$nv+S(L=hYdoHET_i+E2+6`BIe4&gl~j4@ep&V9vCl!;^ z&NA7e`x?*!o|)FioFH=g2E|kG<2nFQHom{0>ot+r#1+=NS#YNCA4_69B0}yMw&mw& zOMUJrkm)|*f_gDYKm?DaXjuQ4VUJApxzueQ3cl*Pa{tuQ!cvtS%?VOvLz==C8jyN0 z`&IEO&u!bCP_nLyr(_$Jniy~_o8to|wPsV4`%QdCZ9)tYuj@V&FrnVc5s>T`HkfT% z-Uie%Z)@&Z#OaxIeRl(Lw!snb(!dI@Tf|e02JEn<)}0AwNfmNnBMXR{lCumrhh=O9 zL4;G)Y~3aT7h%gElC7E5je#{CwlpzwOk2vA;dW2PO;(8X-XDw|1a*9HDK0 zP~D-5{BF)@ZjzmKh4ZE^cM+!-QI_lpbHs1d3%wk;E)gW>`)#Qe@wh`Bk42o4_wjf; zsU$q&-@2t&TOu|BZ~{xt^`kzIdfC`n)d+mzh?qf?Ys;(#tk0ufPFB<4kF_;kAOMY# zdzR6^>|7h=xxRhiFGEXY75rV|`?RLX=Eikj#8W*G@YiB|#PpN<(K&iZ71 z%C`@!g5KWAmg;1I(@!=V23F{efK@7I@K(OIYy<*eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{03ZNKL_t(|+SPqauWs9MRn@u6c5ElH z6d6R2B7u|!4J7EKLxX01GonF}M;Xdr=*MHB=!vZKU?_!ZwO8uy;P*PL@aYHi=g zIop!&IcM+ved}9m&YGh}jT)8zuH&Qp>d5GqKgaT?Uj7yTx0l!2U*Y_X^S9Rb?d7V@ zpWDCF$M?@qh2O2o`%LaaMjgM=%e&sMCy&py|K|1aE}VuB>HYU#KX8NJ{Or&7Ta14y z;KJG$VlJ-RtpeBhe!<+A6~42t|9X9FONTw~ zhChXFZOflJUtcYq05=*(p%(A^x|EwnHoh>LTy>k6)$snZ82x_H=EoX+)FISx2ckoc z#Rhg*C0r6sm+t+FPz1yew&ZPdkj2`FyhWY$E+lyW^FFOH|Fi$UKDMZ{e`WM> zQ`|w+qXmi3MZ;yn7P(#$>*6bdKSD%77BgQD!hCt35>fT_xL2{Zz-G8UhNaWsCN|y4 z`*F~>rI6&Y;7}h2lJduzg2(4;mU-`xv1>T*o=@JBP z^vKU!xP#t%%-G{gi6bwMSi&+Dh2d6w5)@CJzs++lgu!x49o+GH$7lO@uMc_Y^a%G9 zMK*f?KjC(h$HrpYJzqPIxUw_>qX^DTfiPKF+;%?jJ)+#VRKv{~7Aw9+z3XF%IqtaP zhfNXu(=sE|`C8&l}S;5}@7Zh(LwT>H&jZ^nL31oC!aBnJkho3`JS& z>VdD6b#6f3ohdD<6RlCEAUs7M-PP7x92lO(UEy{m%ngM%4tH=-*HY4x!-$P53{yu*xeT4TZ>$G(CW6*RBVb~t?2=DX0I&~CSOvX z9QhKLPt((V&$1NH+_IX)YFz7Y^H{;+R?B6hQ{j-RX)YRR6PM3VS|ER1Kam%zg<#!O z?XkZs*15$+<^p|_-0lo6!3we*(at(i15Uh?oa(Ar8U~$dtz(nLrvdlLakXLR+p_!k z*yU%(d2QDhyL6heJh=(CS|s%Nu*riZNhpEpgT+xhon#*D+x}aFMWY!buPktf-EUPgMZ#(>kSb8`b;Sj?^HoOEKp=&MUAR)^VJzz=J2~or zd{1rY&I#3=vXJ4RQ{SBwy(K9kwZMFzegArU+$q9sVzsWO(DA~_Q3bv!?RTE)eJo?n z2Q^)wX9Wr$wd~WkEa1$A@-tjlrXbV<#t6sz$IFMQbMi=&RV$jmMGaV=S(R*xb9!lF zNvUK+4{Vz5A|ZXmUXh<}DPF2UIj2T`Nzj?&?)$Bo7n3=jWx5swqFdK1`&*_?6qIXb z`oY+su@2NNB_Xw_3wu)=o)Dascb_!*L}-C~g%`l%a!uN9|NE1ExO`fqttmeoQr`qE zBC=yhi?#6nV$@`c@Xc>{Qg-E3DdsIrPO;Q=6VOac$#755$eHx6YX*G(?=_1#VH@`G zA+s~GDOm{@w5O*ss|7XTdvvObl>sh=ziR_(gkmQC9W3!UBZt74RM6Mw+X!~&q^9b0VIP>L9Znhu(RATgURIAs9FQ6fghet zQ-%G#i&prq34`p&tJmAKXE9pD=@t&J;OLY&V4~f^BV*@_Q=a~9EAr}k!W|h_7xlKR^l0eMqyP2?+_mrOyf5LP5 zw89-#WuJ3UXQ2%`yFMX)8Y3eDEk5E*sYm>1hbVdZjurHwhS{fy8d`m>6bW+xk^-x< z^YBEQ9f$kr&=zMU$ubjU-xt1d35Y-@r6@srvARrCHfP2Qp(S(j8t;fZMoM02+Iuif zsoS>91nIHZTWJb-6Kb0F-wDCX9eO(@zV zG7gL|_oFRdqt991Z_=Tdn|9D!s|9H-2}{9ouz6oP>!Wb(d<8pKSuA0PC$HQmy^`2` z275$9gjk?SQwZiHr(5NOJeyVFXuA=+`__dMA8VjV}+ssw@sx>`-ri3 zP=(+gQKT~k!Gz4feWn>&gi*3xGbDDszwWgs)Qqm5FdHsyPY~YuBP|N&yhvhCyK!>A zMy?6cXB(o`syA!SaT$T(MzKbK(4Ei?5W55<%5D{E)r{3S(+&L+r)>7OHYsA zD}--p3X{4Z0(ln^rZMCENv=`$O^$7+PsRn$)H&z~SB* zQxp%PQrRYyd>+-UsayM$BW`m@Hz6FKzJt;uWK1Vww5W+*Dp;0T*^V>N+TDrS6MBb= zup-&H@Ia^YMVFv%1AfxaP^Q@84?1U_=StC>AazgUQp9_XAB79MAv-Yr*pV3*{pv3o z0O7rxY-@bnQfoyF|m`R<$!;s%28z!gd>(Cuqi`2va?)=;Nwh z(HbRpVV($8u`w&*=B6oJFj={hSe zD1tFqgEcOR>Z%mCKxxXktnaA%mr(3J@v&_qj)mQNo3X#Amb|% z2KJ>|B#Z2w#@9%v(ug0t|REQyfqS(pyWzyq)9!QslzeYh)Rww492N;d=rlz0_YrRxn44C2&pAEuJEURpJuf>b#dSlQax6w8O9h zF2ls=z}1IU67z^z%vaW-6Mf*}uVJQ`iwKW0pAw?;g znK8iUg_vC~U*i^Lghkw-+lk0uchOC|GEy9ss_zbaBc3?(yyq8Fu{p70&=9{D{`J_6 zyO^}-W0;O<BF`r;&TZMuic4||WI4$1) z`Es+$Rj)W^DoXlxPWlp<9VYT8o0`pWh>03vO7x&&=|Wiet7l8NPryqv)5hnv#Ryk! z+JVaAu;H3LTA+cwa?71o^`2SDNTi7?a99Q<{U=WFxbB7NwzI(46e+kl>d%HB;ocHw zr-xoKNi!wm#7oraE;m%jCFQ*xc}Q54ptYvxV^bq>+f?549(1*OZasw=DyHkh#*<~y zPgn}2E$fDGsQZjK1y5n^tZfeWg8hq-j1#^tXQS%}{5^(g; zqmU`)CKf2H;ic(Stw#cr#PTam!T|R${Z&$y1`r;VMVhi`7zL*3irGc8jO{uq?oDeo zYjj9aCBFL%HaV$#ymxd&(Q4-w86KM5j$>BPsCU2BDJX}e>YW@xXXnqOZP#^EQ-XHu z7_#mJI%^}?4ri9x@nkwNpM9lH`nL5M=2yS(q7uh$8wR=LRKx;A=o+gg3^HcwD?&(I zl=+Nn-s#~et^L)mSo(d?&eQO)hj>X5@Xjn?_HkaDXeWc4m?R2Eh#W5Lh!B)STB2~$ zp6EpOj^%1u<(w5uwoZ!>Q|cTM#c4Xk#*{h7d%Ubze$%2>J=p+BD|1Qo%?+uz{nJmj zMVU>*5tPd0+T>h4z-{cobJBK`G9_@&WH0;hY*n=#o_F!$d5bHtv5A7JXDF>WiuD`Zv%nIZ zN}Fo-8opgSUJC2V^Xf8M8hoDy+dXP6Ml2TV|5WEg5pJ%@oHbW**t`w7y<>tZ*1mL- z_HVxK>#wT#kl6=rVDWxUxn^ zH7)2Wdm1AkUGS!qd2Gx*5jW*(Dv?)ZJj=_34rO+47zecZ1k@y>P@KCDZ)S7|^sfAw zM3$miaId^if~2p>S)akI`}+au#Op67ftA3ntx3|!dRfnzf!?ZI!T%N*EhPqB}^}wS5v}#WoeVjHB@@}*1=9mkXTD3rRjy!dSO!V#G1((HWj-E z!urL^e7{M)il>K6qO;3!PaJvaYEf<4Xa15}B7xO0>i^TY|J7#b6qbn8MkajOD`g&^ zvmPVfrbSf24>xJMlbYwDrcFBylbXeI=?~Sy;VQ^E&OB=-uFlxOeSNP4Oc9gnql_Z0 zK+cWDRIvJ~ykG5cy|sCXmnQ_OM!**}{|whe4b1ov??976C!|YzA^m$An8NJUn&*BTX)^j58D_GX%e-RbAW$dr1EM^Q5?ruQ-&DH3=})vrlK?@ z0?+sG4Zumt7AY3pS!m%CZ)WwfnLla|O318SGo1_1NRyCt&uyZPW>cDsUyEa>Pg_yTIKaxqe94Ziv$n=-b$t+!maYI z(Z$gOe)Eop4Km(9x5_rPapa1^UM6oe6q!5MEtizz)Z#ThRJg{=9#;Z2F{z_f2=@Vw z*Ivx&m=F^e4c#P$vn_>B+fwa@yG{mAyh@oJx+91CzfS7>6L{GY_bHV)1Hef|7=Dge z4vxka2AOAMz8ao!5qer3|DbJCSxmXFe@@7I#DP^B8X~wIsNBHXMwA}-QKz*}Q3<`9 z$%R2}fe5DyC@F@m_#wKRIUU~XJkwBpL{G^wx7;x7Zu5KGuzx0W4OwDPDY=6CoM3JE z@Y@tEoUOX|CJ6HL-aGCJ5Ha}N9B2E_N$1l%9bui}UCm+`as`*{0T#~1VUN&Ig7e zFPlK}veTQ}JA4xP`+xgs{M-2OzJ3}1A^uf-*VX~2 znW}P4yC)1>qS8>%;j0JhpWeMb@Fca_xPhkLVBPD|tEJQQB=g^YzaRu|I5%hAMW6j^ zfsEnx-+mo`79Z-@e~#bC1;94T-og8NCt5O7easYVne9zRhBgvx@Q}r8PP0Aa2GM&D zz?P9`e*`~^pM9{)=kMb0K0m1qI5Bc}F?tDH3i z1EB{Lts~AN0#4mKnWWt!<%jVhfBhtWfBVEqUGvWeU1E$>26yY=xQLHr;AQYbDnBU+ zdN#&gcoT(Cfnp$<{n?-+j{>*ouc{Kf*D?|vj)?d-x1ao@_~To|`1kSa+tn$f2_7Yaq~(63C#NNI5H`F= zz{Sd$DS6x)t<{EMR`)OTpz|T2IOF`SPvhOo@6>h>1ko0?D4H+}&Z3Obr((3xol?!< zbLDxJ%w?vmhNedc<8YF&k?>;cPMwDML)OB67Ca1c&`Rs;I~96-)E>?FocWU>$>C@x z{jMo`MDD+rur`Lh9B~s|^02$M>L_zruAGa40%{5cTRGM}a*gTT>!Pw1g`)V%KaLv?|B zzw#E@89qB(&fGy;lJ65=x zzW0MiiF}enH6%vj-CPCH69~{Tn9M8A4NIX(lg5oPvGnB50o5ZC5x(MH+_BA#eXp>bW;WM5t zq8?SVr_#)z$(fB{zeQyY=gv@vlFBkR1{KEq-824Zg&P-gD=H|1kdP%d31E ze|{*g@jMBhf$hw9$!<08#GRBF&hSHck3KJM2Ib~k^dnz9F7Ut&$jTO&OXqQ|C&j=g z&A#3zLbGGJ4o)fMPIsdQ6#Gr4U;0>6!nq9;bFX;&FWLw}~a`aVT zYr~T1Y})$lvGWlIb>NB~9h2yH%EIA0A_pQ)p2UnYnOph(lO$l6D z(gaMi_?3ppy_)(JKY?Su+=)6U_YV=)k3yNt?$Ptp_{;d@<-30iq4V6hJOrD*{`>!p z|9!j4Pie(XtDl%-zU%8n%Sa7D$xwC*4y0esnRxDntOQg|vMB}Tuo@7XMImwfr}5uM z$C{sQgT=9o`T1%5)E;b2G<+q<5GP(Ka>s)nk7{Jo%-rsJR-OnG5wK0k`3RocF|2Y| zMPSZZXKY*>vM{3gl_zz!9zpGCN7$5gMl3fN9G=>r1Lu-_|5?qeLrr0x9U#x;8bP)fGo?DCy|&U)l&>;qNHH%2=bu-bqI{2} zOmkcNeiL=IGr%eIKhr3XMnxQtvXf^EXf|`2&#YF5VZ#HO33HfSrwsNzcptqUbxR66 zjd2MsM-GQUcpfb206nY#03MM^L_t(Ve~W0tms@h6M0!^3_k(@oaXl-BOGjs&3jeZq zzDi!CnpB6YG}z`>x7mdl^p;>k1(H;rG2n`S5$|5Eo=4;N68UFCQ9xMQ3A!k3?9pLxq$u5T;47u=-1iRQmRCH(hZc%O`K zZQRV4_w|kV-IuHRbi0$fkbswEnw)f+sb%z|@2mso@S?pib)+Zds0if-5Me5@j$oS> zuBJ_*TUwKRSzj%ictUPWUbMlBEl0~x_vZF!P6%EdS4R(qXFMM~J1sqO&PDGP-6Qt) zW9f@pLi)YEf3+?b6m=9R%V5WVXN#D~W?w4q+Ag38Q_-OuQ{6nkQ|69}5>3fIzi?`+ zIeqmD$Vol+yPiO0*)K!|x(oSv$7_b4BJJ{L{+Dl>djD1$i|^Mt~En@M%*WZjcIOm&I$z?4gK-7`WrhI>d z@gE1Q^Mp-l+2FW;uAkgWrc?gsEH0$XnpuVTn<=;A)oT7;;=ogMm{AC-vw@R(yG*2S^Cax_x);7J5OxE)6N6JV;ZlxZol)( zan2Qny9$w>Ggeq1R~?g@f~tO9El%@E6S1xXyO5|@g`)VU2-CYR!cXF#-DIWzYiUxR z6hhxa#2QzvKKuIp`2OuD{>QCJS=auYkkn1Rh%tx7GdfN<;-`4IN=h3_-&KY9)XfsW zbhbO!n~a!@ccJE=v(I;zW#oXyR|yNd3~w3T6( zlu!L)c-FOguQR!P1+J?*S7+Sz!*CT#e{+;+v8BshF)&e($3O$zu&liznO|B9iZJ3F zdwd1l4^IT_Y(C6HGaZyY3R0Ju3&-6|(Y6oE$3^Bp!5Q(U@eo@9H%(}EgRLe!`Bc+* zDkBOk^tCPVQpc4tgHz$P2M}=A47;JL>rHDB9o_C%tS`Sp_F1uMUy% zRkVuSOAa~Edt=Y**xvIx`?xr|s8QMB8JgKU$yn}i&WNueqk)p^w8(9>4cFOCiYrM{ z#Bp0zF=)D?r6BfsEeWXr9l3gEofXngd5|$g&;xSuywLkh_VsbMtiZkh@7)sN)A*~~ z-+r;Y-d_!))LXvu^IL0jFN-`M6g*L7Esx#r6Bjk19WU1>{a{zYRetiXoB=9I6}oAt zxI|E+L=qn+-(24BZ|I}{+xYUne!XFsI;v-=$mq8lroLEv%e2xB;N%~Du(9V4hz!0#FKd&bd!PNS06nojr`PY)sAh0~@=hds z|Cg%`UiV64ydw~y<@&65Y&313zW?pJ@yGFluf>o~eP#TE_*Uq7jp_t&1GBUif;VNZ zwXGgUsD7mlnKh=f%hl#Ae5M|2G)6foKNE0@x4tI zo|KFBW!f2<^m5aEVb-I@=EE8@C_O(Bu)4u!A^RFqjwNvxl4qL#kKzxlTg9X_;F4em zdD+mYqH$MSicWBj^J7KNq-61ef1XRbJxnc0+Ei_NVBPq{fF!AqQ+KYG3H7@eL@BA2 zjX;T7`lN?NU8UoBg77>cC&>DU19=~OETHB!HvQAZBQ|=3xuhzw+8+JV074gWl%P$? zuBO&?&&TR$AlV?xT2V}!{r^5p^r~Dq*{BczTTK~GHF4! zokzo|mEIZ2P+ctLksKoypAo8DU^mh_;Gm?_O;7?VtDh+8k0>xJ%&-D#$a@isI$g$<4^x_CL31J{n`Jbyhf6Orri~lT_*_rl{TvMBj6M1^tiCI$ zgkHsrjn)mds+X(>o>v>8dm>qu&Kz8^E5rBYdL_icq5G`&U%wyYGY+JE0*68N%`fb&&+C18qYH@~aFkv30e zy(nrbh3G+cF||NvJ^KtiPh0Cw?RMJiit*yOA)Hs+O0s5-q}bJxwaUfZps|)}xkxc@iJ)^n3!BYe%Dqd~NwFKz+1|1uxp zp=4c8W>KwS-jx_;DXL~+nv(VYfpccWMG^cv1(0PD)VKGsGYc9&S%Z-g>Qp%9xJPg; zi)+(m{un22n6nbhU7lC^XUw?clKipfZmrgVPs$0W&pr~lInzItEAn=8UcSQJG*?*n zFIWF@{T6NZWCZe6?Pc)n=>s%Ly=SMoZw;PjDf8=TK#%(2B@wE9=ades79HOF7ldOv zfA?xDc~G!0BuC*YEUL~HOF1%w`*O_pxSCSMp)IqG*!i4iM%_Wk0OwxTgeIBUdn(3S zFGwsZyD(aD2{_wfMT=|dV0_jN==t4AXOvQCJ3pK~K0AY5cdSkv*6#@*n>%+L9kem-R~Qe-E_Zc@u5aB z#~(QTc;O%*jfU*?NEq_jPhRKFPTN?Q0%>@vY^|nuuvQW-4RLUHrv}r4$O*rM2PY)q zY^D)L&u8>^bGCSz*4lbI;Ad0|Y*KDIOP%F4Eo&%2c%vdTqUK6wqhFhz-68Oa=ZRaq zwmNM5V&zFlKaMZ!>>F-0RfNIoN0G93iv-4DGIKLu1a))Y6|3P60cK1dkjaQ~nZ&y! zx5!R>##7=5OvzEt9R*lzzJ^C+jAmnBEdX7EYEqC|jW>!6x~EXnAIC1rk<7XM?7vx} zI667>u+^=XwDWNb9HoTh!o5*M+cI#<;dm$kxHM_M-$G_Bm!=QE536)u4)1fS3}tiV z97P!kimO)M00MJD+SJXZ2d)KN*V0%{I+TPA&V*TB=zd@5fO#?zxx@}C`(VAc z+UfOlRGZ~hI9ocUoM~#`jCnuzZjuovX=+pvZZx(+D@_ksXN-Uj=*3yJVs4SYE~$b^ z;d8+kvKDZnrWw!M3&ui^w}$mB95a~X8s}M1l+e8sGYen7NG5tFH=*{tn#6*{R0=)!dOoOgBfEpOM?Pcfkm?p-%i3W+GWwoDWY1sq zo_XQXNeCTqN`Er(9qWYBCd$+AwE)v$wcG*7I|pW6eP}YB4^^L@jCGsVyxv+yVXt-V zkCHnp&*lp<F0T1Ubp=e4Pb^l|^q21?Q#Usyw!nSwzQMZfRkf+fIVg?V6Q||rmX!{si!W#@?^b}pYK;vAa7)Qz3dX5>7OIsq99O(93R;gY`>ZtnA!s+8WAdhHim-oV3)up3Gh0 z;V{QIXJ+Q2A9+NWzE`}DPQE#}*9y9!_(Ar(??IDvNEw90u}@~2PIKoOfR_F~N?gwD z2pZytd}HZ>l?L3XTJ|87-fmJ9ICTl!Y_8~`8qj zUe6!n+mE}dlGbr%kHy2m`FMdatndT_%)C7~9Nm9Ap)LDdis6V9UwQP;I~n#V8?HSe z*J4-st_+_FKO29|jwUW9NvQRnX!GXdv7gwqweCxYzxknU81VR zlJ}Nvu_x-v!}dPL#Jp;mnJpz%4|^_cXq*3NT)`fw%X&i;ANIK&6E;X;Fe%swQDkUo z!#2^?=vn72BcSJHV<8UqyiHO2ZlnM^I+T%#UYyfxD@GZfYBEfke=>}tH_0_0{i-fq zjZ14e&Zr*YAFS~UgVKDH;@nOtK&5?BPoGt?oL<{4!xWD3EdlYa+T-S0({Ls zH=pYV%m!Dkw1B9(aLJw2rb`De^b}2uPs$bw`;<85*Nq{BXDL^6?D&=8)i4?B;7fF)@&PTdF7ZkHnjVp!Y4UZcdGTR~)i|GniMzf)-|qKh zP_*j4c6ydJ3lMi+qLN0BGNj31-2 zxt;-#OMy(ln*n$SW_C1|G0R1GfZxoFsg{r_iB(tatZ*IS$JS2T3}%9R^tY>wau&7w z1@#Z~G}~^Bn{x79ZXHt-zb#xn<2j*A4MH{{Jv*A-e`Y=Fz3GE1`PfPZljOtcyG&!Gsquu2lPq*jS zOZ0io8D3co-m~2hhPJIYIj_MUrtqi-%5lIL1>|5@Q9&Q(l=Hs0#$f-+I+`*SL7SrQ zlr!b?#lt|fuI^pPTE9a(mLlF6`$zCo-YbaNgL#{q@?_eV#t(dalOqlB_0G&(H23dq zy4;w)=f3`NChqeNZ)M_}F`3~$Bk28uX>?oc9iw;MjNVO8;%3TZ+ceolZebSW_?Rx=G45!c5P}5puEK<(l$RRy9X3vi^#yb z^YMzz9-_a zCyVE$Nttnz4Z&JdFEWRmCIj7i0Nu-!Qh5T(55OL>=<`m6$qc_RhtZ^_<>au_rSfFq zY|vSU*1KUX&pPy^z110SJ|Hm%I7c~RO;C*=tB^-({md2tFX5SKOc-8EKmH!ZnCFWJ zRNNJ*$E{kPDOa$m6mBteqNka)ruJcV-qq}9y?u&nH;fS;OA{%dIfCh|>*4a@yywiX zqDOP<8Wu+}El^8zLgXZ0I(Wnhs`Vsc(Pt_G7x5IY6eePDYrHTh#&vU@5$?BJJfANg zWre0K!ebC_aepTE3Bo(QN5OkyEsKFaBNQfHsBVJCJTZ2)a(9?b8v$pG&iL?Rw?pYk zxYg|wfb1EbXX?Kk&~!KwlmW@w>VNiNw6^Ch1x=rw;j7Evdf5Qz>_;lKlvX*dit15_ z!R^qfN-W-Myrjh>M;U3|P-epWE~!lI9|-c?mAol^IsUGq+eNAWe{x9?E@( z?1JrYcHp69Z>8?)%gB>k2{h>D);<0epQ6=Oy~&qtOEs zVYgy{UH8yboTWJ;tbBPYsnGBGL^jWlGk>7fh=Tm87tTxcDfs4P63NLJM)vUvhTf?y z3L?Q~ZZs~VQ?|PS4{q;_st#M;0F$QlF_V&hCDG??w=06V=((7st^e5|N)EQMZdJ8()qwEo(o4!}OT#kdGq%!t8GQKm>aBK@9OF`ZFhV!?Kjdo3UR zR1djdbBZ`J6PJCxi^fJDG|Ow2uuj^AV+;g6OM{2l`2j}in5meWKI}`!nJ6S({3(<6 z{y?G)i9ReY^oY+%ij+bm!+Mc$3K4_hndTV3p56|s#~Vdg)^gAh!iB6pqL@Qy!yR|j z!CLlUoQ88WZA)&c!i7IdoM9V}dKmGgY#jE^);jJ^AokY{kjJ#4GRmAJ!EBsTQe-e| zkeRDhp4YdOt=pVr;J%Ie+W4{k;V+)0=9QuWj~#7@9z(mPXx8N)Y(I)7XPlf3j_Zd< zn#+aCcBNyu?o)yfF#7c17OAv-g@t_bAlC0bUlJONu_PczmGMb&K_QdbQfqx1$yA zX+tXN&++8ZV~K>L51-5niH~Rbs0TVPSL!`h!A^80CHa zRq`(!I?tC*+DGd$pNS$c>{JQA;Wk z=20oXA|>G0KpO@L`_3>$Ge%P#k;huT>OQNU&3sX(p0ieSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{03ZNKL_t(|+SPsAk{w5qTm(=AK@dBl z_F|IBOlJB5{eb>mZ~BA%g&EmuX4iIy{pZ&2^!EMzQ{i`O@;;Nh zkWt%j^yOX8*OS}lT7UESbQey;hxG9M#}C}#H-G;B^DV|d6>wp#3o$RRgCAqOdvMnW zu`e9_Q+aybKD`>cGW@{f@>>P2@nON7mleLVkAHi7YDwMmD}Mnp}08nAPz9vKalaX!BEzKI#x^xC7B4$6^CJtP(DXrc3vHMJNK| z2V3;eQ%7TiWyoS}M4qC~^)4iM|NTB)WB$+oK0dXmvwmgtc2nFz)T0H7vWtexge`Kt zB(96ENd6Hb3bL5_co63M_bCxoACG$#YYS|K<5O5V4Q^u7oxC0geOd}h9t#fjv1L;J zSX1fo{+eapJ7nxyv%J_2yz>$-@rijp#lN4w@52k72d*jQ{k z*K7L`R~9B<5W&7FP)=4hZ`&XE8d1($s^R7gn=3v>z2j4fIqtaPhfR_Er)5Q^_czOt zbn1&YM4ICYE$;QWswLvarA}IxATH_=JkaJD9KW|^R~MQTO0G0(^Q!@C~8ugH_40B4Cbx~=Ge=JF0j zkzrNgsBGi<3VB(`IHsKcjT2y=vL^*9T^2K2=;u##y|()O6z(o~yHeHPpvNlb3dCc? z`XS^`vM&X^wS8m-lh^epOQ2Il(`@J<669MxT~N zlAVJJdYzJ9Q*IXVO1zJYNeU1=N0citux2K;y=&6SlOfq_RBBnDAtBtW~*0f8zzs~ZS<(f6tCb0+-kWvWQNFcf65vIjmY>f8Xl z+e=#1C%Q(Ng6S#x=&rZk;=u4I?ls-c8!R4$ASZ!7SKzYAE8)8w@_jg#t-+Izcz88U z&`{OXG_~eAN66|+MYlGIJa3usze64M08JGi{c^jG1hrX`dXF_Fn$(J@Nt~B>xGv7) z!!H~UuX9K(?N2vciuybcnK9+43#2;g7_I58Y;TLr6a_fZvDRk0q<{k3B2(y9j}O0a zcF1W0)1UL49%8@ewjM@p)1bR8!nY>5u1TxgN>j2adbOqp&|bZ^%rNP%q_l|M3LFe0|`}o-9XUBeR z$FI9|nxZ_p5Vu+s^!TvJ4JAoPf$9y#Q9GSgHhcEvImYOEOEzIJKGpOPOGB~c;J}$U zr}C(#)gM~I$FCoC_=m~}nQZFQx|hAd9_E!06%@^J%$wf!Iquf8{am7a@GwD8^c@qo z7?vF-_9?7cB}bfKPl6U-;zl29?FPR!vL;yo=sk56OU z{#}DbqY)#|EO3Y2FKU@0Vl^j773lZ6<^tRKs-kH?kix_++^ON%Ae*3B3+cM^OP}2pv zccAc5%RYU}2F{!)Kg;XNG=zG97~yz-d-*VSPHttg8b$NBr~&FT>yl0LoW2aPq+~Lp z2R1Et5s^M(?Z{8J6mQj_np0=mQBbUz@dsl` zjdh@INeQV7yRa9w;huuC_U@e_p9oEGukZwT+^$JG?SFpKHly)H|9i}0PS}Bce8{Yb zY)VwZ1?}mn%z8mh@E%>NVrGCV;m_QF8f7sP{SH=m?2$ur#v5RA{0jIK{V~mR_I{M> z%b;~!m#!2(uY1`3xce}41Y#B1ejGJ~?_-pF-#L!hOzd7up*zc9OqFEgXU{tEGT{(im;-60jHR%QQuEX1EYqGCQvEjHqLz#D%7_2h)wM2H2Nl-}ZcXErbM~$jkW(0FSWn8<8{uuDL?d1h-A6OY4ZS zcTkPs9zmot2Ehc(z;mVKS4HJ*`6T0^G8}Vo%1A#wd}^l z{WWq;GM%Q~I*x}irljxgp@TI?BpAIkdP~T4Hn27jCQFj490 z@q2~PElnX(7la`1BEmFg>_5pl%6`bPO_!}~3Dl!k#&q9fO62ZaVeNW5YNIB#X$$al zZ;vSo2T`SL6G%R{?$%VTeToscIi#Baj(6Wd@ewknjuN6Hp5sU1!fwb3Om90f!=fMc zMMI?QVQ+X#=@-`0VSOZA60kdwF_}bFaiJj|whPp09Yh!J-U+lgb)6Z6@3SEed$~3S zlSe^);}wEjbw?*mJ~V!)x>_>yhfiHvn|X7qCX(^ z9=Do{NCT3oA)clw@LE6aW72K%9NbRS6pG0hUeUOv#CyZ$po%)fB_B{AS<{)LEL^oJ zvwMn#Hs2^AUxLo&wgEbYJyXk|UZNMb&tdSovqBpsg^A@()!Aj3Y9>8FKTS``+ma^8=Rf^d3ho}a8?%F|tQx#Rf)Vp0UDo^|wb zSFdP~lB+OJh$@(Mz&_v6@0Ym$|aJvrG&K=Mb9%~0~5C#rLkp*R9Mc{aSOdi-kN)KAK9t2 z`>Bo+CAzmwa{O+mDHhwk@-&)QUad(d5M$K-^BmV(n>Q4&xL1@Ky>Z^6=eSTL9iF=D zT=Rk=IR+cB#w}6ZmEsa8O);12JL-8kjqYp0FY8s-V62%{ZU^>wnhCCOr`{e3yt)x% z^+-56io_+S@TMBXU2#`3ZiLB(mCnQ)Kc|Pb)v>2uLG=cwV{Zx3 zRri|egNB6t+blg^5HJA~WO&4;@KxTYZEiK=Py0ism|tZ`*>yQ)co8~1TAe>vUY@M( zI^hc2^aP6-O<-w|GO6^4!mxuB`sY1gqB8PR=S@nHv;rv|$Ptj|aQHJQdPmba)V5FQ zRC)D45d*(iEcuB}lEXri&ft~-Y$*jCaM_(w_M3Zbc}Zb)02CZ-QoXAgQr3gy{0f1p z@kb>QzBuY|g}^eXWSQHhIJ3O->~JFlGRy>7STdO5T$8m*yYC!veX>bQbi$EDVhsT* zz9L~@U8+TDzGY01$w}u3!%>1Pv*EQM9~*IA+9DibbUtR{oMlq%I}$2WN||yibJ8vn>_c15_;cP!x57w^fG6F>E4mr=(C~6jRg^ zXS=sA{lpl_lCv3>!_lZ)Wusx&7kxJ5N&}~^(M*is znvmmtRWvQ<<|bNGtnEp!D!6G9&N8hTBw@AlbU#&=t4H~aBe|j>i!>C_K9G!1# zURr4Ffu(Tw9~14YG*w3gSH#%K;VkN?8qW9jHK#F&>S%zRiqE`;Eq(RG7)piHQs0Ak zxjP#1p3ATVo155d5(z=zGz9ba7H=ka4{j4O!2~WRz?JLujz(1b4yR^@j|?Zke-sXV*2YG z`ezHLB;tZ2i%Q;k_USu+DnFWUa5uTK{{6vqJQIZ7B6`X((u-G)>t2o^Mca~3N$M5> zO0knfgS6VGVUV7cf*o%0-;f?S$m7r|70r87YoRHFt-#5%)ZEzvl;Iu{pA1&=9{i z{Gg4|fI@6o&Qf#rt(d|*pNix?J03J|Y5Pjk)7R4C|Sr#5AY z)8gU(59d{`X2mg5QBt>aGMB*QFp)mlRBVo?m}nrT#0)B?E`&{gwYP-(1iUpf9ei%v zjBxFyHBq@JY`9^M7TLhsx#dc$de2i5i# z@N9{b(?hSAWSEj+;wAcYhcgv&MR_kr9wHVc7_BM#*pwx1o6eiwgRWQ4rKd1L#dv*K zc(QEv6Ba^gi@Kpa)P2S_7#XMR9ZIx&O6$V^cg^WrC%k7LkHQ0_L!OA>)|2f1klK^;><=Bc^KRq>W5y5n^MZfdF88hq-b1#*n+sCkng z5jc9NQOFo`6A2VH@Y3|Eu15l+#PTamf&llh{8dzz1}Qvhi!?>ia2A+mDrP0kGPG;! zxHs+9T%$vZF7a7su*pf??Qmk59e3P`x%ZVi>D%^am|p$5i%J~3Z4l&=u80MI&}*!kAjlZ0 zuLwbLQQ|Xhc&CR}TI;JFahdl)J5Q&FJ4geN7#Wkpy`x zu76w?Esdy@Z`V$`eV){pwC$Zn{&(*s94PcY$|JZ*Ys50q?au21MR@}1fpafBKRb@2 z>-7_|$#6y=X%bJ;wj>kCYfi>)QkDennXGLeUahLJ!~HHEyl!zVHs&a(W`@#|qu9K` zxe6?SskG^4U&FT>$4enyxnEsIOM&lQV7o`7#R$b>^PlQ`D1yy3@mX^nheg|v%R46M zVy#Oj>HOy7POi&9q4SJDWGGg$w>gM7@r$Lo+|@lz!5y;I+Oju=mu<(2&*jMcLAQyU z#FcAwRBk~>+0z&$(gklyna9S|6Y)^4h7x&K#-qH9=ul?&hEYJ9JD?`9LUHOoe3;Q? zpl9aKB(fB(g8Pd5Bq;itob?$@y1#FLPQ3rJ16T><+L{!dY?gKR4D?dvD*bPfqovHj zW{dKiow@w3KqI$JvK*s6n=6>!S6)p4^D9c5l&+!5%cmMUCCS8EW>Okn*rgXH4NuIO ztl?0xdmwCHtjzbD)T`J%WD=cSjl1WOhwc{D!hPm1sVNee9i#r8M*XiAL8q`lq!u#a z%U&__xX*fwaGMrU1wY)R<4(%YL%B^m4wLfYIrN8Wp>P%C9A}y}6IExd;C_9t1V|C1 z>Z6JxEkVxNVyd+IF1=svalN&9iNI z-J2%6xNUMBW(E{zVM-Bk0_O#MZ!O(*&VJa&Xb6+2rJRHO=RH+k*%ZZgj5S4w5zRoM z(``CRQy_4E4?h5$q-~L6(d~^E?szlnm(BE1d(c8=?V71CJOfQa_B|Iz9gU_mv0saA zr%y*#Fl?nh)YMhNH2{zuHxuBVJ_0AGhvIo!S(T|lFvh;8%@D;=ii?fOt%chNy6iUxZb!#t^?^*ozjRhYIT&uKRYt#stZjk^4z*EaK zM7UMjHM%*PKyTjRutDq%^r&o88Ar}2?2Ge8Lz1~u-Eu`aE-fD8Lxmf>>~SYh1Cu&h zg-{>h`PzGNI!46AO+)9zu#cs1w=FepxbkGM<5kM)&>cBk|8>&mpQM*9^FGBAX9;jp z5{CB?%fZpuLLhUG%tymBE<(H2@ekUzl*N$y_5Ty%9KJ7d2->Twm^i_4U`mSE8awR5vRj@omU!aj_58}=9U{yyW9L87wn%AT|>4Q@S}dj zir>W7@lAXk-$ca!GPw+wtaMwg!pW+8ZGs>_@3rHO01<=x<~Z4ZPB)mFF{P=z_@G~s zYfszSXi_EZ-6J%nRoR4;qU0B} z;ANAPJS_s$1M$rRMGQ8Mc0F#A_Jo!1j+)f)Lp$7w+)pQ5eTVl)_+5M*-^4fZO}vSp z;%)pCZ-3#EIk!`J+O>u z!u%TNUBCZz{NMOG{u+OaijKPIdHkAR_xwC!P_8`OvuQ`mbssU_9CCOEsEaAb^t*e= z8PR(Uz?P9`23D@Vtmj4cr}*di@LxT|w-omXOOanEFH$I;DDwhG<-jH?{b0oHl;6{O zMkG0^LMq0f*^MBLQG_IM*TS{FN^lF9{mF+}KnchpNmcV39Dv+LDub(a@VtmyGVnI| zMwOqm1U(w#F1!gts6aCid4D!IuJR(q$@*F;;K2`dRD}R2YQu|X(!WWRdN|i7Bq+(} zy0kh8FeRA6^9iV9Y3QCU`YIJ@{!{63q4Kvy<&Z*pspDgQIiZONZ5L4TIdP1ixs>{_ z;WYvd*3L|ceXh7AM1;e`s?Io#(d>@m&{eBtcRwpgK;=X zI7oP~b*D~4{2}XteilSHb1+KlYmkbN4py9kqM~Aa^jH*t9J}&~gDiozRo(e3jTwr= z=5a3eZcMNi_0pM0_}Zw%k_Xq_m(qcX|A}>-JD$DQx^R48#zy>jiv=C*JKdfYA`PQ} z!_kw*Z0>NlyG^s@cAWDMH3jbV%3D-t`0Q-y#S`INfjb^NGn9u-1yUDP$n%F^L>-LD zquLJ)B-9P000h1y#r*2<=r}`1%eS2>RXEg!DcmS>eaV55wJECyg6`21K4j|5)%3j{ zJSyZ9-oq6Z30jR|2v#Bay{69kl9gcXBv(<~Y0ePtp@6qLXq)C7A9v|+&$1Q`9%qMw z8ceL;b$%WN;|g{c+RKqs(_$hC5TG-nV-iOlrj$%v(9fhX_lTq?ynn5)jEsn9@hbi< zUdQYBL;RokK}NZ$FvH!(hc<`fGA?_;q!dqLC#&lEhd23WieGL#cUF+jtN|M0CVXDx zXJp{(To}?ed8V_l(JB985bTYBth|&DG#M%q9!q!zb=CJ@a4(G z1{^yl37)~)8|-uSFNiWn9PvDkcp0zW{gZSVsNFy5Ya{I>2dd&k13NDkYzX;L!%Nd5 z1vP+^wRb46L~w3^E}s`cj#`V%4O#1bVchCY^f}^1yok@@^Y}czh?ns)UWg^hT9;h1 zAwzrBE0YMeEz1@j4Y8&kdG=gT=h+-I##HW1Qe#11Hq)vkt60mA$s?_Z#w55p* zX^QFW59D5goPeMa0*x)|-o=i)kO#2yGXFAO$CvRsUd9p6<9R%fXMv{Q5{xvrX(aF% zP$X{REzy*s61Gi>65)h1Ad@W)oRsJGvxo~l89w2(?gpneha`L43Pn6cl%f33`1^Pk z`L6hW%#3oQb~pzL)jywE4Jc%*0_%Xx>b3QbxO%Y3HcVW&GqO?-vYCm~I9~sXw9o`e z#gB>&wv^OY{COXJ221)5*J#ApZJ2x!X^CWnaQ$PSUPYt6`5mV&*6$^l0qQ&(_n5T* zT2>-Wkfbu8J67@FfPjAOuru6Kdlqe3#~%FtDED#7q}~$eO1H!z9x|()fCeeFCXX<< zh;qf_Lp!KE4T@)~`~XYdp3`bKii=+xm+k9>8poJsGAAC_(aN$#%mwtJ7onAG3*1Yd zeHDzSpk+F9Tc164ZedW{%xI5}N%T75~Eb$wlRwJu3NoHFrT3z=)pV3y#-Woq4_O~j(E&{~COT{o>L(dR0Ghs;P8 zm^X|qw?i_M6t5{n3Xk+0`E#6!+a34X6Ja943URRjc~_3%N_U+Cm}|#NcZfm)X5PKo z=OJoo>7M*Op~CVqp8yHg#sPuEc?g1{{@?mV$hhKtl?@5L|yAZJP2uZVSw0?fXg4)haiY zl>bxI<9rp1S@(L$1Xfok%JeZ}rp-Ft@okmD_6Oa;h&ilpSSI(~a38%M^`I*|jd2Su zM+%2QaGoHDO#~hcPjX2B03Q=cL_t(Y=1rH7sdQX2K3>4GnFnP$>p-(^dIRMb3MWAMU zC(UkMhaLFxlk77udCU22MfZYp+M96x%V6dRg(^|&;21dZm*xkZayU&Ichl6Q(@HI) zZ+)jh6ono4w5YSfgSEVi4%p`jRfY6oC}9rV_Yl8w*@TZdNp+nyJIBwtVSse94E1bo z4>g(4>Nq-jG`Voscy`))WP);S_KJhp5_IsjpPnbbDXBiq{_7hy0h4w?QAL5eb<|Fj zh14kG(V|D9X_C2(HD4cv8;sd$?x-ojipGgMy#j;T}$)#nhx01v3&w4+- zRFJtqvAG?T1&`;TWsg6CJsJ)TnXX}uGxt4S(^l9LRXIuZn=_P~UK#;A)$nxjp<(q{ z;S{55V84kM{DdC2+J#Qym)4H-(RICVhdT9pkh3?%p&0~*QdZS`Sam-f#Wf`IqmEx( z@1^N5>4e=MBidoY!GJ;gaXVI>BHz!4N7wSYUl|v@|>El*AWVpGe-~b)1AJq5eo(s?v9x?a1lh` zQ9hzNhMtdSEZLBhzK(TY8{`Ohzw(rPGBV>lA6w{%L@3He4-li>Yv+_Y<6NVb_)rm) zr98Jc+;_6ZY*6}(yyhePc#(<(s5#6fP-d#kA&?#%XOu^p??XX0KAPt2 z&bq7wrs0Oyob)}SxH7b+Vf^5SK*xmbqkIu@*2Q2r4XWb1GHG5qG6$y7b9TZs=~$MJ z2g2FZrmJMa+`#EiOhtmZebj`V)8uh=;2E^0ccv&(Tti%mV?2`_EP^vK`DU)|fX{I9 z;YSVvH7njjq|hxgfFu~Qvt&}Tj`!7F9k~Jx4xQQBiqKjDh+*Q=Zj(2Ced`*-lY6A>YGHx&}V))B8EvN zw1p>*@;Pcy9hlIGdrvLUUIqUvNlcwW;%K+p5ySxJVbSsNRg0#_s^MAVqj4%?$toix zcs!}p(9-ec`lKWFK6Un~*$jbTEWtgVH39HEu>b|pG?Ar7jY4U z3Un)!aiE))4BD%aAHh}{6ZcJ6Av+<>H>IKW*1eg@%LUv!X**0z41l#a(cY}+cpKlv z_wi%AeQ$}|?@;T$M9zY+qMp!lhI=aNO}&m->cKRimmy_6{5p$CeClGo@ktQkRhrT1 z_GwI;&$05O80QD<0E&1U-^X9$KjQmvU%t`XGSybSK@C)TK-Y5*xYxkaacBC3JeVeI zBtAvBk^x#1awl(+l!=WqGc~kBe~7=tUt;>DxPm=Eb5`QW96l^-S@U?*)<7@m`lkbZ zV|P-(w>5=YvHnfhk@5V*-2sdvQ`jbjUlX$+dHjtx@yGZ!p8BOhQ#SOZz*q%BVojrj z6Ry5Ky*{s_2a>rBVZM^QKm3~$>T51B10yfj?z$E+P<#P2#Irw!YtHgh{L2#-k2}_z zR7ZSJa7qFT(R8`cZ%AuE=gt8s=LIK`pH3M>otBIf4#ME zQjlR3Ba`{m2PtUM8%My5hJ-55!Z74%|+l0OioEmc*UT-8p)t zXjw z%RfSn;iD6=LP-kfF&*@=A1UBPn~0qI`}3cEjK9R62c>nG129g+)wl7}&E<1Imk)HW z{LBk76Rr_7(Q><}R&>!gb-2VT4EU5=7l)PI%JL~`_%3jhQ+A~uUbEsa@yB@kq^c;y z@zIo1$i6<4iER%MWOekkK!x>j<*(?9odbOz-UXQr5$is%3yBIRFR2Sty9^kqD8yd&dZZ`&MI=#?|-ZcV+&OBslmS3dN2|!aE z*-iRqDBC;JZj^A6m43-6ZeFE&7~<#g&-k@5fR0(u$$6wjqwy6b--Z!?YP zhs5J|KeL9-p@`W$*nugUJO0WMprTNrb3?@~f*KW)8d%7ixz8&?UPs&I=b!jPyo`T~ zZ|M6xi?8Ajr-?H!#Or)0aF)ZdDi#cC)EkV@HtFv=?wBCy<;%G0`#r_>>HFm^jhuV6 zQN)*o?~QTXeiyO+Yy1>{i|^w5czgP-=kX%Gh*y^b(J4fFT)1i14woT#F}hJe-I%%} zU!>zc!xm=F4m{_7495kVq-rkHiz~glwS1n(=LT$GZG>m>I=(zT%ml|@n3&1$58GB; zi^EghW=Ea|8iBTCmuSMeNf4@PIj9;(lzu3!*m zgBqP?c>Tsu{+-OR|*xP%r7l&q)1Gd-emRZ-si#<)W0_Z+<*?V#)Xw4s|d9rAnp z&a?P$?;?sX+5a(KfL+FLkOn54eX)Y+?V5V9$Iq``fn_}#+_4B{$WTVlekJHR8-?}W z94&_boIL+*INv*IVb)!bLvw?!&a3$E@h6)BJ&*qqe+S_GDeoFDYSpdh{(wbdTi?uc zoE|HBCMBB}{PP@I?O{S13jwQ#?PjSy+C-z6r?s!+f5gAXzX}ZKKgB=9XTUK~r~Lb) zO462?ISfvKSDkfQz^YYlA&}uZMEc4d|q4K zG2?9e+6Yovnidh$>CTi6FKVCE2%%8aNo;V&6h;#eI+1qr^tha;Xk77KJ%)fEmlt7Y zQ}$f&=AJYrb3on9DA8arI!M%6=uYQ0C8DOosvTdZoNtg6qe{c8ee?h~zAm1$(*8Im zYp~IcieHz5vyMYu{v7oc^8xqKx)L}ER(cnDLG|s0M@}EN4W;VFXv!V!1n49>i z>buh=2X0q>1A7H0FBo3|{30z9t z^O>EEIP1z47$2CKM#W$&tW{f_ai7Vf^fADj3{9k`xxI(Nr6>5So?%K;END!m7kXjBGI%ibOa>zhnZw& zEJ5}y%!xb#e&A|C4joo$VNYIdqp?Fi!EvbJ*RwR{M+X`hgeT@=q zS*fgQ{oNhm*s<}p9V9J*!nMqFnt3;8WC)ioFs5p?ERszX4Yu4Tw$;a{DcDfXEMO-U z6-hErp(c-NS%^#*aMItwnDB(voTs+Bl5PSBYZAoe#4z6lIPR z@4M!)AY`0pZ^h*K*fU-wem~s^z^;efS2_$H&nndG0xt5NZZXUZNF$u})4}F^lH$u4 zo8TJrd|#h`CrR?B+K6X^IWC^BIFM-uW6rTS2d#ng-zVWFPhx;J=4RsTGwf#Gv2VDI zFVUw0+deu&47OXe=Y-~?@Y}cgd0s!()K71RC)UTYj{rw#c}dpj@ep1Ile=|Tk#4dw zc1}`|@SbMD`4x{4MWIJ~n}F{QCYvKOZXlUG(z&biR8^}-a=$FXaa_o!txa)pJP^*i zZ6#4N2U4uo2z8~4IisT9)hPYvRx*ckglSNcGq5eKcDoM4nBnVi=NKX?3V`3idjG&VGUB2L{+$Au zWs+CmJXioG`)r!hWkF~GxG|drK{mb=#CX-5PPeveJ)kkO$IdOCr?x&Q2XxBRYKeF9^o8|L)P2@}SbfkQjyQu&6#;T-uQtT$f|M$L~3-qecpD z@#H|3h7J4PDXVdmZrK5xBi4FBVp7?GvlUl>vmI8nxuy=rd*gr}-}U5K&CqswIBR@% z0=w>5ohY)!AVN(H;T+3Ip=N-r%1TW|67SL8({fRFg+;s$=)4Hk8WgNR=KhHHGz%T7 z?5b8i!-YUvwy@O}%g|o&aZR0ZM&TC0+Hz1MGt-RXPGn&)CifxRf7;2Q-y4m&=c0-` zd-u%QQ0lLZDX%{nr9{7WnldPa8va znhHX_CVKKg2XxYc8#&5nL#F(v!rhI{s^UDhDx!x_oMX1stpn~(34hgbFB+vBeC9j} zd(Am z$9|f80yVXtc1S2CusX5Zc16HdXqVw&ymZNP?&HS8)G^fnR^r2Qvq8H%7!8IE6l)iE zlNB?0>II#2%Ad2NTEu>DmfNE%)=7R3Pl)Rk9vCyYlMv2Y7LK)u`qWQNRWX^=?bLI| zu=@|<-RZ<ZJB>I2GIg{FcdFsp)PX%{`_4}_dh=&x zmhdnH#0yQPY0tBtiPHn}RP~Ns^N6FVv^o)J@tf139+cU>mq<`=TOxW)^yJskz8;2T z#TD#<6KIfJEXeNn1Io_bZ`ypQQOxlNPTyWQD3L}cdp#nC{QQ&0zO&N~)}_caJXF?; z{wNzI;nWb9?yk^a+9YyZ1~r)jSZStWR=1r8~9FfVmh*R<@R z1i_7pz=#?vnOVO!J-b8XCmttm@!IOJ@r#ugA$>c(T)l6&&{PowuWv=lUL_J3hRMXu zd=u39zAIG29Rf_4JRp)0<2H#`Np4Y{_==~*5ttIAo+}El-h2&@$QXHJA1xBP2Hm6} zy&A8L9&}Hkp+BCxC`B@-_Ot$GiRS3!(8E%Bt5(}S*rF#iHJaV*0p@*k+ zXwZJWg-lv5%^ZL?t8`ip4>eVWk~wmUq6`GZT`MmDfiWR1>gLJ=Hv+DEX{;ulNSscd z!gakIuDjj_9!#M~HDTNK5aZnCS-iSN8~kKXdGjQd$+}-Hl1t`x93=NC`1h`z*`iOc zr$5v=6J~j#`+cAT=8hwBi5*n-!Fq1B}wX{^1kogBo-%WdQ=h4 z8e3&6O%GWojDQa4i?V9PTq6IvqzV>=_X%G}TELN-W;kzOaxCWWr~14z>H$9KO%xgZG+_B413s5Yer3c(X4nlODhr8daGX&lrko$IpOR z4}ea^TILPZkYzwf;N^@Py{F2j#e-Gq<}4H&YW_Uzx}+j6vslOuH)eIm4PEKL%P!Fw|2g6*3F*Od4JZaBzOs1-D zMHi>b)`7=zCY>?$%oGOYJ+Rh*v#MneQt|C3O@W=4z{Tc@ z9=aiM;574X45paof-@_oHb1eU&b%ncsVln$YoVHyfU0$D)<3-QoHCF~0qHsw!z8XZBcpIyko%2!jewa)6n( z2Tw=W-%cpYKBrfU$di$lSvYCy(iqfxjptB zIhm42tm?bF0!XnF6!gG8=b>|Q>|e(&FyXOMaKxT#WZ>Pebcto(MR3IgUJ@`E4xHjixuxJ$71)aD>vEu7z6WaWM;OMR6p!KwV`eO zqw@;(KwZ@vqWQ4;c1+M9m4ivbMu;XuOBuEauSR>Fw~T-umyHW>u-0t~+IN-$?C4NJ zCVFvBtF0JScxuQnY5mD^9KA`7x%I2MbY+*;($1)E0;qFH^MYa?rP48HzP54d=B|kZdB2IY<{C)AczJY9T=1PkcRW~lVlG=3X;Dw%Ii1AL_ zLghXsj(K+2JB+!^Qs-IF;q+%zC*`rG${T&09`&=7sySBt%J6KMjH~e_x>0!p7Pv0) zN&K1~ksfLCeW`i#VNI)XJqHVSeSv=5?~YNln!a{?mNp9zPhO&yMvp3_iB+u<(Td^G zq@l)sLd;NOfhrtKRMxJ4I@C@nGVZ6`J+ZH6fXt;pCE&#XyaF>j8q0{~qI`hg%#10Q zkTHqXRPC&B9pP!A&oEm|9`M{TNXTI_|jnw%BJC zA%y7WFkO$#Gp|2=&js-DH>cuE{IH*LC~-(o*p8AuUSLCIw&5^P{HA*sKMBb^V>Y)G z#;4{fvTIXe0HrN9p|*LW>>fafEg}P(j^_vagoLNQ4rc7;ASg9j#s`I)WF}?tR8=iG z+Uy)d)tvyDd<#!vunI57P~vRaY|+OZP5UxX^sW7Ma;SQRWu$aESW5(* zOg^PtEhm;vM*)Umaszv59r-`9k4^sCstyErs z@&mAkDEfR-VdCKz<}jM{v>Y9Fx>W8goF#SEq4g|S%c~CUw0Bj;n;RtNAkR^XSd*;A z+bZN%THljJz)N^08WRTB(vQD~G3Nf_0UdV*>T#)-d(0IqDuqW39qDN%t*Lcbopv?* zSudaB#tmbXkEMx}_Y}c&)pc|EaNKjISJ5Nix`xeB3=7mHIw5e9FCA=gf_gnkQ1ls# zz(qWTD}{*|TpBM-7UQP5_6YaO7SFroqomNZM0gCsEuPQBIzf1+_b7Nzq-Am9&j5vq z7OHdbm>0&bSMCn8=^)??(HS3J>~<(V375LPlOTJ9=N|hn2QVFu1Z9$BE%iTpFq+%* zl!m6S&hXXcFJ3kvb@rA@EvZ$GtD+aDS<*1u-^;mL>BBpEHbPc)jdTM_hTXxUFJqg!Tas-x7lFmO`i zem-rzt`IPvuAP(;z;Cy3-bbIjWj!zaC>D`b=dL&m^7`A8I|;- zM4zYKt_Y^0=VF$Y{%1y%JQ**sGyBGZWV0k_P_hPDhr-X?fm8CK^=}?^K<=YQjEf|T z88O%?N)#zapx-?yracNwB-nOvujQkk@*&r2P7z0DttLw#)+Uu zX|Rc%H!xDiOvP06VO=^-L?P+oPg%70?YdkMNwNnNo;iST7O|A>w3s#yQ5X zr?-Qe@kY^=jU04@P$8>NDCQ8@aLqevLoIt?r{NS$+k#uFap8{=C)mcL9?tku4i0-| zYaMqdDfVxjAdg`~C6qZSf|;FC(#&8sATwvH-0yEGS+_aJz;zq-wee&7_rG{9J+Bl4 zc*GZjmb6uW2E79>o0J z`%6OSVypYhCVc*lUq&5xzDCBa$VZ{H>V)l=vB(n_Ucc1;gH;i z$DBF(F)zx!_picn0|IQ53@*jNHfbGrJ8vG9@*^<;e*@SsNZ5CRDH<`F@`!w{<-6{) p?%7Nib*ecV=2ewU=BNGj{{daa*dw`?TUP)8002ovPDHLkV1o4eDc%48 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/section_type/photo.png b/script.plexmod/resources/skins/Main/media/script.plex/section_type/photo.png new file mode 100644 index 0000000000000000000000000000000000000000..814e233cd96fc5b3d22af4f2afbfab7132ee4b55 GIT binary patch literal 16385 zcmV+cK>ojpP)eSad^g zZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{03ZNKL_t(|+SPqovu0P3U1o7qLPA0W zgXtD@1Ra1oqQimR;ePR-cZA%SlHRQgxBvpM6 zQdQmiP3Pp!Vdct|`JXFZ$VWv+-TpZ)f2zyB;{Vs>wdPk?pRqpc`o4AfRO|1}KdI&C z>$k%1R^)v;S0Q68ðo0Vz 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/settings/checkmark.png b/script.plexmod/resources/skins/Main/media/script.plex/settings/checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..641a45902bc344cce008efef10a66145fb44f7ca GIT binary patch literal 512 zcmV+b0{{JqP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00C%8L_t(o!|m5WOH@%5!0|g^ zt3bhEU>s9|1Q7wtt2Y+GV@pNgV3U7RHJ^yn?w~zVj5j5#fD2Df-6V z<1=P*#t&jIB7B75B4r2B>^Sh_O{EGC(TWHkqFSVIJ*%hPv|_o4T9&K5I6$N5l&E7n zBGAO+uJ|f8BJsz0Q|oVtkKjv0CTj_J3gNzUplQ zpROri@Vo2zH@vv-MzN5I|gW!U_%O?XxI14-? ziy0XBj({-ZRBb+KpdfpRr>`sf19oXK1%{+{w=+N?$r9Iy66gHf+|;}h2Ir#G#FEq$ zh4Rdj3Xa3;F+DRT&Wpj;8K=emiy=HzW>kp4|nyjoOu$?n4U0|dw#`g<`}ISmbjWLOt+^z zF|;u&l-i@bjxQo=_i>+?Jl@-W4Xufju34R|fAeI~j5`fqZ5YIrHU*x0uBUW9plb0F zbGs+jH<{XlycdK$u$q?Bcsk&h>FUkx+6(;O*%;nr<}ZHUa56DT=-nEhOTXue?EIfJ c^-~=~u}ELse1`L{fWBbxboFyt=akR{0DEM9P5=M^ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/back.jpg b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/back.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ea94ee0177d90becb8c902a2863646e36be5f6e GIT binary patch literal 130557 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
  • 7r&%5Om07IxFD&~lKhWDp?=<>M=d4}6>Ygwg`|?%)7)5rb U>4v3EHU;HuPgg&ebxsLQ051Q&DgXcg literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/K.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/K.png new file mode 100644 index 0000000000000000000000000000000000000000..6d99e483c5caca9dd6c601266fed4324770cac97 GIT binary patch literal 3368 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 BZ`=R? literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/M.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/M.png new file mode 100644 index 0000000000000000000000000000000000000000..c15ebec1d334d5bafa3dd736778db85168cd77a6 GIT binary patch literal 4291 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 Dr0#Tz literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/N.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/N.png new file mode 100644 index 0000000000000000000000000000000000000000..2e00eedba88c98203e848ab246d427ca8c0c78d7 GIT binary patch literal 3641 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/O.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/O.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b01dc2c106e8c6d7112f4edee7ad10ed978309 GIT binary patch literal 5231 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 SXH-TbpX*&R)On$8_uzj56#C=< literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/P.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/P.png new file mode 100644 index 0000000000000000000000000000000000000000..2a30131bf2216bdb4063ea9462ad1a57db640f21 GIT binary patch literal 2346 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 ol#PwtI(hm3i%i_@% literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/Q.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/Q.png new file mode 100644 index 0000000000000000000000000000000000000000..672ec0159ff0fe35211f7583eb48a38d67bdc8b0 GIT binary patch literal 5435 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 ONfW~p1_k=g;r|2a9J>Sn literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/R.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/R.png new file mode 100644 index 0000000000000000000000000000000000000000..438182e5c186477708e4024b35aea2f7362d2c76 GIT binary patch literal 3523 zcmbtXdpr~R`={94V$9*VW)hQYgfeN?klZ%9ImO8Bh_hT;%jHN&Ba%!vCYNI5a!MB? zg-)f5sjL(uC3cz`(o9jl&+6abf4}$ZwRyds&+~cqd_JG&dA}dIBtOp;O1eriGBPW? zwh#m0Z;$k&fPnADT}|a+&+{U>Z97!cDr-!9#a`WL)lBxZS*v^jFKLYApQl{{x$=D=kg4QA{!KsYK7Ow*TwbSwY`v z%B|$tiQbmzzVeQ=ub(dsOo|gJxE}2p_F27eO07{<`x={H@PzOY0hG2)1D1<5ueir z7#SG}5ydWxT9*EpdUNP9zzkxaOD)V$r>{cbF7yf74}5rjiIXJYj*nP`b`ED$UTkV= zvbMLkFHY^lyYqdu_wBJhbGg30ejkrbu5Oj6ZtEP5udHurX-S&<__~E7Q8O8%UL#G+ z9C8^4=oaLBDRx&d=KE@?HtpdguC}(eK9Oqk7Pn|%q99HCypL%holbX>Tqio~pEP>G z=ksrcc4f-%xcuVL-&RE`NE3#GlarISmX_9>SS(JUcwc;;NRe3#N>5M!F*Ej{Fo}Xh zy-iEf<8Jl#_U1?&1LVctmJY6;c}uow^V4s`@8|0jp8}MXmBp>oE!Y5f4LAoN1FklY z`@0wxMo&CBXWtvua&A&LLq^Oh#`)iA1ylj@0CRJ52Zd!>VUDG}e>7^@@5LIScs?jBEDS^U_}y4&I?6?}g+k#zp~DCI`<|jz{I8)5c4-FAzoM$Tx_W4E zaF9LVu7DYVB1KS|l-BZmJ6XpvA4b@bo4xPo*hf7Xwvu5A;-Bs-aznL*5XRU~n>w35SHUdQoh1s>H!ZKf)nvgBM8fq&=l zk}EA(AH|8sZ#ytG(viw@NWj1EmL-!@Q&Vv?-(M?VzKJIXcn;7q8_)mRTa>?CLr+i7 zI~a`^&0uf2U%P89faeev*69(SF{m@=@vE4GT)%UDz*fLsgAsp*slj3s7k9qp^ zX^-I9yT{a4vVZwRMn^{n4x~v$!#Lr2TNwz`U+aItFSw<#v9aJ+qF&noR4Ub)HVjLy zmwtt^+Yhf}=Q{EC=l2iMzqYRSK5ZF92%dcbuQF};Gkc<^r>9MD+W~Xha86DRLU?|9 z3DWo{ar{wl1&v{b!C;QyR;tL-(C~UB zsAximH9-M0DM^P7KTBvHK!+=@4$;PBzxpTaE<%)MOOzIi8OZ^_i#5(hNo!e4TU+}9 zOD%`drrtU$SJlwake{;g+rw|y51q`Hn&xAB&pX6MY*Zb58^1mvFffo~pShA$Yr!)T4xuJLlGKoN?&Y!a%S82Cd!?37S2YF(Pj=yCp@a3 zX#&}lJJW>B$K#3Q=pU?```_FynW1dQNAe1~ShW|rLT%3iZ9yL6kI&dp0tAbCXC9A3 z>Mt!t4vcNiBIQxXMPx@v^U94WU;bmReBR&R-*UJIdj0u_1NF@%eS+D>pq40KIAQVN zlH-<&36_IK+~Bnsw4{6)MwFwZ4b@ZN-_VVshab%X{%w+1*0LNO@jjW+&LOZ~$2t0+ zUl*exam_U0uh6RJQ*SPG9$Ai*HZ4bjGIYQ#WG>d zTW-INg@uJw*6Q2a+e@9t`pW!jlelFYl3HgoO?WHrvIIL70Z27N7wqhSkEPb}dw;Ie z<+NnV@p`*i0{^QZfRVSq?2Czsc{V9d5tZTd+sIH(zR|G zeJ%?}4-klU?%A{F2}@0Z?4$rNL6R<2z5;qn7cLUg z4r^8B-$BYQ7fy_F?KO1^Jd&is#fvq{MwL44ACU$lIU!(2UT$t~^5XnVxRCZAaJ*C; z$GAw@Dyj+y#96z@N18f^NiK(fEGCQMP)5R`9RX+^raFxeN{60nG5s|O(OH;^I2la0AOo9MwQc9loq^4LN0qg$;{}t5r>axTH?EiNCg zQC2TU63Op@TD2+*x4ZROA_Z@9b(iI7sZ3Ni)V6S7sJ--ypp?0&NM z$}aXD3>#+6c~J_g>Xx#Sx(=F1)?5v`SCo?X1u)t^dE~B~;<5{_e}5xxbl)2u9xmlT z)>TtE#%EP5@x2eqy~y6Z4SEHRfjf=cjRkiNyBY>iBeSHWg#0pFhBWd$o6+#=JaEkW z4<0;#^K3tBD5z932I2~1t(&GhS2KC$-92S^kuk28lC4{2S-$xxsGHj< zKzB@sFcfwwkr0~srFgCT;Ly;}u@!ob`MBN0NNE9fV zN~whx_#SB2|N0+RAyJo)CeCJe%6=`$H@~{~Ufyrui4adD2oxRdYPQ72#$E=IijO|7 zz|=F7Q|+08Tape+PgoYlr2YEz@=%lTJU$SeA-#!#=fn_3GZu3pQvBQQqkK-cp|}Pj z?SM$2KWKW>Kc1X0sY^k=xgGGqS8&l4=YUI;G_7F(b26Ahq4cqo|Ihz_M%$NU>y*^F RwW3mi)WOT$kJtnk@IPij5W+vDMNlLdm&3?NhreL zYDi3FPYhWmV_(MD{ho90{qOhR@BMl)uj8CK=X;*-^L(DqORp51JUAJWoiO>JP?RUtdFco4ynmSgublw#?16H82_y)izqb z8h`Lwi^16QhO12MwWn&9ZZXn6>N3r)8u16eHL7j9liX{>F#0>}p-aro>?*lJ(wYNWSy>`dL!()QQZw|14Q$WX+2nORTCqEw_AA#NP zPj{-iJN096anTP};?Gp?4Ijo7z5)sh3vsWk@|eIy2L}hOnBiP1FK*)_st)_vrH~a8u}({t8NjV`79wDs-|5b59D9_@5Rw)XAl3I*`Oh3rZoS4NjTPiF zM5O27rQZ}36l6KOw8ap2ImMwSg!u#o1$6_LCVQ{8JUw`2!=5APicBmLv(KMDo01G) zx~yn%6dbPV+zS{%1eEsd*<&C4SH378k5I73SM1*-1IiDKl=h?1=rb5f@7$(@*`MM9 zWO<#tYU=9haWg;A?m@u3gfs<=G*W@GjlK(hJN13U3YIKmGGV10$S}G!0DkRd@-*Vl$>UZf0a= zW-iRn&mRCzpE+~p)_7v2RB_$QQ&B>5Wy|T=$UErk>(l%C`jRUdQlkt8qvCddB|Zn2 zs(sbmE|)57YXwmY{AuXB`1@PtJ)mP_{<4PJRe%;anM)P4)xJB~qyDsxfLt&+IqAtf zVb2e7>MOZIjVUiLKhER!*8_N|3OhAP+o9jU{l||VznX4${tm>*Y5BT&dU^_SCUTkr zcBD+$gH%^lg)<^@a&jL%x(l5U`0mFGKq)+57d~EtMBp-kK)~S19lEe{cL4OInxI6Y z+H82aXYX5*F$U7!GVlC>yfyA(6KiYh9noPybB$7$EZDp*JCNiNjd}X?sid&5@E9$R zLsvL|W-NHBtlN3`j$-_Yt@Q<3>$TEE<69h6mwi~wncA(*r3VzDBAeI-*Jx>a$;cDnEV0^|#x^J> zqmk#FJ%9eZIQ=T*3yqfh;|yA)A-36aOAGlv2dku(kJ<|$6F;S87^tmCdhy}j`* z!&vS1WzJ%f4d;i@tJSLT*wRpxLP%4_p)jXWIGW#}h(mQiFn(>FqKr3>`f5do zdCO6!etx*4f)C|5J~1;hb6r%V+PR48CF)JQ4$Es%Qk0|mKnAy-06O%z?5fdSD+>(T zf>vzaF94UO8(^g-8EqfT%VBMmcm6X|P$Lgw$*YqZ){c~tMAvSR(xe2{3x!$J5`&~$ zkg2K@Vb}xv_wTRU{&?{GI_NH5JGISuw|XKr8@VTGo7ADKY5Bnqav1Nyuxc(18&Gf- zN+D>LGo&fvRJ`e{@6_sZG-p5U)M?1yGe-cQo6>StmX?;HHU`-;va+%|NO|4rE58*D zX^b?2RgL3e$;rvGXxV*d_llW-c;{zUTYCeuH2tmhQpoypq%2EHN_;>Z?-LydbqReY zd*R*-9eLI{%de?i)D3p)2Sn^IC_93*CqcbikheQhH0ePL+gaTOQdgk|Z3m)+{ zO0&KJJ>h)HbCn_>2)RgU!FxZTRW4<>kNY8)#$Qitd4|3;4ZR>^msF3!%$8Nn;&(H2 zXIEF(XE%+V^s@bVo$jnr{sRf7ojpB07;SBBQ@umph8hqp*vpPf>2}BqS9uTBlR(bG zUzt5S)Yz>-*u70s&F*mfDUAfUYICvuoPPDjQlD3}k&-BD4y7U@BO~KZmX(ojg;q%+ z>u)X(zqZM@hMjZDN*I9rpBd341<8$dd# zHQLrR73c*z7C41Ix3siO#GgB{G6IcKGfztORYR1p!lzR%v*+Q_D;sQjs27bIAm7ZI z=q?&AaU~!vX61J#`Gj`x>f$);kR_AkaZWoG$6lQ%s>SJ{2KNR*W4Yt&>l?Dc>b`{H z<>k$lD%O)0ip<5g5b14{~aH3k_wbMK!J`l8{T3T8Gy>G9!i0uHx#Kclo zY}%o%#X={t1fO80CwW2R3b#h8fuhLA`Om6F>(}euZXorOM_u~Ji$bB0FHJ+ECc|Cp zuX4>}xb7J!K5H4>O8gW@_k~vp-ADipJr1>u)06Z*nFfFxFmZqeauHzO_g6$VNR#Em z<&8-6!tCtqS#UT9p%+yKuPxnTdV^vlg8MNvG~{BHa4swO0BcKAeciAfCOe-bB_+u) zuW-&98NRew?sD*|wt=cVDe7}KBO}k7j;ieiN+$$H*0$5AZfq2fH6|OdWQc9U&jX5$Ku}7 z>$DT0o9h8xoV~T7TOmwm&H^RL=*9wn-#6Oj2NBj?XCTljzWe3F3r7W=mO34ZiOQBNU zxQdFz48KoY`mW?{sd@Y7`#L2>kFEmyQ~iC|2!(N;hhWR>J5u#SH-jYcPCK~_2S=LY zRqQ(wASwU*!{){s+X2G9Tqr9lDq81nejzGM1Zjaa9)CqeMJ+hBckWg+Vopp3mN@kH`PzX?P<&~o88Q$$2bjq6uapM;hwPh=Bxyfrlam=Eue0+*o?1Z}18CK#ch zZa+L9pC~w-!K$&QrY1i6F(-L0!^p<&-8_+@aOM(F`c_IxQ9UbMOpFR5b zhyvcaYtG3!r+vKmo*YIm?(E)GMtbPx&{}|>=UM}Ao8sN4h(v>j_~PFWGUoKFN;%AF zWqEnIn22|Pa@4?w9&QBDKqKwiirkPm3CWI*_FiPO*@56LEZ8V(EDi@gXWu4^ST3Pz zTW}aGt0bouVRrB&bJHbhJl<~%EH>fT-0&YzFr`7Nx2>$K#PH<9t?|nF85tRfC5<2k z#kfNMxKnhgHYC*sgP8QZz(^{g>+fTlnwnlc#g`+XiCB^oObq~V{@nRUUEHGA1nc0_ zXQgR6_xb@CEJ$jbjGnkgpuakheW=CzM%l$Th&N;lkmoYuZ-RCr6G0+yWaDAWr^m9I zLf~*p`5Mm$03Fr!J9;!q5U;z&o}nwq%gdYhqtZbiCt-PvWdTaN-`%@+A2zzG<7u-z zLFS7ffnL){Ilyf5)Pn8y22}d1S1m|CbT;*xn3hscSUxwNJ}a)Kyn%>C?Iy@xJCHg= z4TiF=_ooN5Q=N;tOEJ67SwS_P?$^=fo-lsVJ;8!8!Uh>?%3K>CO2mjsLq0TtNPB@B zbPE>Tl~Yksp$XnTauxGl;9gm1+%P7Fc2Bnj4CIX~z=HTch2oou=u&LU=={jYh#Rzr zFOZjT=xdwK)_q%ATDrA7OxFLCI%t}rtawhQp_)In9R{DpN5F3uapQMnbHAXmQd|=# zzu8`~2kQXRKDb~Eh=5Ne0Jbt?#P@?E%!b#XeMDE%Oc0g2U}tA{R!@i^Bz_6)*ek5R zKFiHYsZz>05%K;ZcADk>_dp%?eUFvStz;T@}qEO$wr zI_@hS^ycdt(T%Rn5P_VuE5)2FrKG$L_c9sswl5qV+iogr`;Ih;o~bMlJdW7se%O>W zL}@de?b@b?ph+RdC66I4jaY3o)SA1OmsgInXImCnd@t}WeIEgswI=t1VAm8E7h6EA zz-*C-qS{KSxST#1$(%oS|7=83+3V+fpJBxIR^f8mEzwwa#I>b|td8e|03CO@g+4Vj zH0;^8Z{I7pQ*mWw<&QKP&f@#HUnSJw3S$&(NKP6z!N->F?y3sH;an56g3OzK@K7w+ z{G|OCyusg$EsnS6zqbIp!vvnr5xYv zc34^vY&V8QLrey&X)5(J{DuzQC(84G{xv}e-$L>1XJpl>tBxWkO^k6yg@!KS{|m#; BzvKV_ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/T.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/T.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a467b485863fb36ca1fe91074f19aba0069142 GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>f$_Yji(^Q|oVT|Ra<(`KxH?vU zK3{p}!NDdAtx&-~rx*Lz$^g~k1OI1ky>`pCsrt;BH}^i6?Z3tYK4 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/U.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/U.png new file mode 100644 index 0000000000000000000000000000000000000000..bef0ab8d6ad2bc811195ca5342a0e680e7a299df GIT binary patch literal 2371 zcmeH}X;>3U8pm058AL7*5Rg+5QIIep;gHBRM8bUvL?sBL#2w|32@r@FQ4!*?2q-L9 z03}2)5QIe_PGDVBK#*`K0b+s*f)PkI2~31QGLvT{mS&y`}D2O_~^H;I@*}sj+T3cFL%w1Tw zyj2T%=T*^0IlIXy^M;7S2Yx)r`jXmZxq!}H>DKKR-xBY5xwx8j;J~9A634P|+6U|_(PtPcsDDU%9kATIQG zzQVqdkrCbGj9BvI5A|w*x`e5VTg49iO#@?N9@rGD}2nGu#&q8rOADk><%Cw=?-g@>l8(T){wCjeH*+ICkV zGR1Xsh+cb5)zOc=c{*mAoNIBd3N+Ml}hyydua9AYn!=Uj+QcT&Z%?#JNQi4Y$)%| z%O137O|rnEU@_g7*IHMG!czES6#p@Y*x&FXuPiJ1Rn~&!9JK7t9Fx}poP)z)u&i+MHYcI3H$)wNw3+;%uAQax=~VT+j$Hx$n4K?h$5QFd32gkPy?7O^owj zPXQ|AB~q-3bIQl7hBEf_^mHR3u_ap}`D-y?><5Isz5SV0`hm3PTtRJZtp%TX`}m_! zIn8@VSEgh>kpGjTW^d=O3&SSd3l8B?QBkFavh>;4clR>bH_g6Zc8i6U1^Aia>`Dhs zT+^5SAy_S|ZEtUfmkxfZliC)dEE@qhx{mvgi=k(e07^U3=)pxZLTSaNym$jd*6t&8 z_F@$PK0AUezEsvTtHx8pa}y1 zpBe#N?yhZe6n8!=D{Go|jFG-P4d-6C@$YZ%pG5gQ8hwo3<8ibqsM<9{P$@{0L+nm> zrg*L+-<#bnC@6@Eh=}-#Iao3Zf+t}Dc~AOv^pVed0E4~mI?;5hLm-;%D|pK*-gPjj za)cSVQ4a#j4JNym-#07rFxR!Vv9Wp6!#foj8L6+nRaJyXB>j#7qCVybRzK_DnHahu z#MJH_9*=j{Ro{v*E%1>t5}yfYZW(~yW63d!2P6_{oBU_YHDJp0(D!2s`pfvIlgpfr zWG4W~Jc0%Lmk!SIm7W>mA`leYb7k}7V>q^L$~L&kZxT$AuKz85Efi*Sm-jqF$ZH6v z29>QY=s6}%|FeO~WF9lnROY)iA=WrK$m63|(s@HeLjho? zxufJR0IW*^C|<=sjs6xZ0h9$;&Ek$$*$_ic0Hk!KR;AUG%Gg|8WYgJQ^&!@~8F)Hn`d?yHVz4g9K5%1nLZyu9Xc00@2C!vf%DHeW;75kY~H8td_bEeqTbj z@x+OG181RAqobp>GFpvqHh@SZ_6W8=HCUBOrEI{W+y3+ODbB{qD7y_{K;Fc+bar-5 zPEAemK|6z`hO7g@|Kbk4=gGX?=;O2Fe(S^SZ@Za_&%i9VN5urm&rq9l^Y zoqJp1lspaOZ{M8vi$?tf07(*M;T9FD-UfJa#$K5{RSc=VK8R%mcDT}I7uemvV${mK z6uW@*wWX;xtO?*rWYb9s0TOo!d|@(IKr{kRnXXVM^r7oj%H{PHez?7Xrm6dtjn4Ny z7GsBPWrz+2gOMc+ewM^#w1>DW21_Baa>;e2GgV|V+3p=HPjgVM^*;Q<1Z}GI++c~) zyg>KI4Gj&VEG7obVwgC;Uy%&5_03sm*#_2IA0Sqc!3KNVE)Ivo!N6xBjlSp4KO-J5 ZHny-X!wz>BE(IyueUU-l&0c4&{Q-(AU2y;a literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/V.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/V.png new file mode 100644 index 0000000000000000000000000000000000000000..520ccf7418f3c177dd79eaf4403bc453bd706ce5 GIT binary patch literal 4241 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/W.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/W.png new file mode 100644 index 0000000000000000000000000000000000000000..8407f61dd03e0795cff09c7fe113445afb7ce026 GIT binary patch literal 5489 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 Y_c^KT7G`nqpV}?dkzha8;W+Al0Cbj={r~^~ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/Z.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/Z.png new file mode 100644 index 0000000000000000000000000000000000000000..64e62120bba6f0201195d8e04022214a712ccf12 GIT binary patch literal 2550 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 QK?k~bns~;f(#Rv>HxUBT%m4rY literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/generating-code.jpg b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/generating-code.jpg new file mode 100644 index 0000000000000000000000000000000000000000..84bc808b7b263afe3bcb1c4aaa77bba7eeab29f2 GIT binary patch literal 110012 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%0D!43yC3tiq^+ogh<0XaAY8o;njOeI8~P2=&bh-v zS2*5Nv>}jG{{Cdb?tdDcW~(ZpUyhUV>)b7xG>aSF9B*ZN_?C3Oth#V$bOlqXVRN`6 zBx=q6MUekbmwCu)qk>TZ?hRS!z5 zZ}o~~TjW`y?-ls>2RTXF7kacGq%X~|ua-{Fah3L`Wk@&RB`Pr7Q5v);O9zsEBgp|T zqf$6FKaQvCA&MO=;uXNa!DYAxlptyAS@|($78<|IblKciKV;H?ZX=NQCn$s&mTsY+u^IvjkR}bot8Nq6sE~0 zRoOw`o71g5T6ppe2GHApFzle~6?i%H^ewN>n zzB{NAQ8MQ`9KxrUcgExkHN^cy?ZBC#>eJCkHDWF;fi%UU!yWyuSIY14tg5K#8Abcm zjcSpx{P7e?1qXQL8T`u~PQP*YguSc1B;)JCwVHPl*Gz2pWfZq=lrCP^25t!wYP6dxO6~OoJ?DIrdPG>k z#?Z%=U)h_EdMO@5Y3EiQZS}rx#MjFi&+BoJq-iCjo8Vu+dQ16Ho65}3GW{m=yuYxFyX6e1 zvc;?Eqls7fU#`nkd3x6ET8!sU_utA{tQ^Y8k{k>=wB>iVb#%xoQ%x=o7AJ56XGL^! zuz$~+VapN;#f@MY+!=F2_SpiJlgS=WV&gPM@u43I<@+nXu#`1VtXT8+a!0uogqEk>xdwbP@Nw?2NnHN>!CD!Ow~9iZ86~x<#*puq-z(3E zpY7)(ybz@eze!p2?fbG;*ZwtATG`RknC%3=x>CG2%M_{cuJ{{X|FF5I!9fb3(ps4$x;W9_bu$jqNPluljEJ+e0G9g z869`_D#X}+E=+FUF7+<%t2nd%(OgitAn|@=I@(0ifGEK7*C;F8TWPvw3rR_ z9{+{vRip?R25Yi8K1D40ZLaH)axwMq=8~1;HO?-4`3t#5cmBzhbXVFnGYq`&CUfuN zGSzcIF$?@9{u@G45E1qv9N5cdF?OG){}cWq;H@Ta+wQ%zG2e4bYi^@%f*Lu2_9NMo z?6HZD@Nrs+QCAUrSGL)j2DYN<@gTQqWhukMK1G1jyr4qMU5ZK2IeiLA^(Nu#xZ_cR zYe$bHQgB^LQ!6J}F3qn#UH(sUiN<)(jgsMA1$lAg6w?{to^!w9aBEVKlKV+ObGU#p zOwv2}L4m-@w3RvU!Fs7vSB!M^E|-qc%Py=CNkUg^iCRBT_!p|Jp3bei@TNGFEqQ5M zFNA{$bw<{zVhSbRK+;#B4uDb^c^e>qXFlT_^ zo#3iOpW!XXPT44lkG6tqILVV<`tN$RU%je`E30g{ST&-Z8aLDuxS@rjuTQ3W*h%Rj z1E@uomAq^s1Q27~>27gieZ=vH!>U#C*hXcUt%$UF-WmJ%>5Dgt`?)WrNps<{P{ftq zDp&q0`w-egS^#lIqF+h+Ai@6jV^a-~>W8qFie#CW+1_ z=IW^?fnSdkBJOCogj{~`2pw=ZdC(*vQynGme|v35-NnB;BTVrZXF*_G@`hCA=t@V7 z$GwMtNE|$*jKvUwM57)qIv~m?UV^HR(pQf6Y2u1POvaxYab(ZOwWoK3ZAlOfE{F%Q8*yThx^rnFt9eBQQYax^*+4R7w(uKaP+f34bCjOaQ(T(^y{T|lPnk- zh*)VYVfji!fjY6cEF?JUa*(fLOIhLBJ>8YWP&3=yI+KsokfuargNCF2gYL{`y{C!I zll)~$@sj+L_L8t2${(J+?RoLZ&0KNnu2u9h%2PP*RNqE?v8+o(6J95irHQ**Z7m^p z&qczoKd$3-;Ol|8uu;G1;`H4n4VBGIvsSx1;})8ze^qZpTXk3cr)e^DZrsFlu67~s z@=A;Cc>aHd!I95~cU4_87a!?)n@Rw2IO~dOZ2TRcWsPy+@sMCzh|B1%eA}2gW_a3V z!(U`bpj=|8!N(uPp}=V0pj)6oxQaN)u>JO^{UE1*_M@o^r`zKBG)+^Dp^(-j)n$`M zej@@>jN*)nw8w%)M7bywlQrpS4R?(iN=NWU#<7BI4BoJv!ZE<77r(Mwyq zpJ6>ju%-v^Kl3;=J`=s9aD1pmM2pjipS~#YMn1~bC}T{g2V>K%X6<0rd$LalzVmKz z>8)eth=9Lz;0SWpUBP?+O~SRlpvAk2KH^OB-BVxHRPo4K6iAXMo=Enj@sIYfwFzGC zRyGa)t>?X3!(^%1LK4)vTdt{MR5au8I7mzCrdz{*rh*yO#2bx>y>b4_IdQn+>&LIt z<@NhWV5FnM;PL8kz%X!v}6bbDR2(~jCgg`D|R+l^8YBA=5cpe7*G|*G9xin zu@o8KcSmFMMlu-eVvW;b^dRgxc)20Zk4Z5?I&3zXKcfzY1B-pIt_P_cnp$}DzX(98 z0y6`-w>X>k*an&y?>Xc*il!8nhk|hclLVg1`yxD*?!cALL(z1}$_Hk$Bl3l}u2N(r z5nHZHW0IzDCb0nszq80Fn7xt#rReDanN%-(%IqmCfeL#hrtS-``AH6@fUUugHF!JL zS?D*`1@?*o_2bTQF1F_#Px)_?L8!pjBZiUn204J$9t`HM&O$k-9RQBvq%0H!V2&Rv zQ1UfC5*s8qvcD^p_wQ>Bn-eei6q z=fz)$hwqODhhTsGUqJ5FpiZzp+|j%@)?P`UM0K;`Tu)|>>ppe5QbH}XYk05y+Nh!J z{IceU_;R$}%GY-_rMmSjT+Lzk7mugQ&x2dCIAlt7L7?+=UtKO^af+=!qEg&|pI#;# zg&|^Us8ddLOhYR%369MrTPbh0jPKKPg5W1urkG@;N~5m+h2~jXpBx@DX?QL_o*-5} zvKuDC#B6PnPBrQuM-~(RRic6Fn|5+s#;P~zzH;rIP?JiF5<26Q+ZmkUoR0DQ_L zo&#PR7rv&9gDbHgZ%MBXU%_xc!h~fkwxxggK?(V&{#s%5+KG95D_$%011MibR9in zB@|;w0BJ@Qevw-m-b*=D1ZO^zFr+^FCy}@GfM@l9sOW zE{$4z*Ta4>OZC7k&-A*}u1Kz1ruEsjIoB7i00NoSk`+tqcPLd$**ju7&&(+N{j=6L zK(zM6y~wXC?^c?fE$Fo4mAwqweJ?7m@aO7j*-p;l_Wger?Q`(k@Qs#+2M^Ntjy5#4VsY&bT%Wh7NIqE3M655?U$UAmlPPuQa~IS;pPtbH>6pD6bLWWSEF(fK3~gm#d$7FTF723o1@Fjey`@geLfl^QUZ?Dt zxKOS|egv-q9^bdHe5PXAiE-KU={);5c>CRQmtcr8kEfoV>fki`P(I5p?OJj?DcM zExiBBM*`#`S1doD|2=r%dydh%@lB3S;_Wj>Le{MR^-#6zBPp+IczyVm!#n=TxbxHd z{YGHn-`%5HSd-HCV1b9*gS*RScSdNo&YoF1zMXx_exL2MwX3`9{(faaufhX@js!pX zo#yt3-J-mCrz1X&9NI8k1G{QV_W{*PP0NBL_)CVZqO;C7eA9pSWzGgmu>K~QZ@21Kalz7+UW)hYmG?h>b23@7f}h+u%Tl?>dRSq`y3XY%<dyTYst=xoXqr@HQC%hRcCL#+N-z~byqZh z_}6jg-1df@&hqE!Zo0EB{$UHR!SzMdcK3hk>TS6{y3k3byKg=Wso2_f=Hn#at*;** zxtYD8M#^EOv%dNB>+Oz@_qIJEx!~c%)pT`;x*WJgSy_8H3r7|eWY1h{W_~A2x^|K= zE26HX>UE)2PH@{e-<_Vaz{wv!Wdjh08_4f@?fzpr=QyF*;H9WL~DFTQTs2-#;!j zXnU{nTPbL~!E?ypJJocXLT|@F{L#Yps(SkTgY{QECoUXwdoTp}%;!kc&p|9IHB zu+HsM_GB?@&o|eW`ejd8MXc&Sf0ti8+#6DIGHlAt@5@J=CU3nr?~Fsl@x2fcx{#(f z)n(0cl?Sh^PjBiUf!U&$erEF%yib^a7`~S8_-)3NWyjZ9e;V^OyR^xC<16lh4Yi+F zP1!IU-{H~!?Rl5Ot$FEEoek}h$Cp@+Tg2wu3e&m#yiZF62ky&qkNdtqa&COV#}zlC zye@?Wm{wNC{3zUWYW`i#@AYS;QgQmdm3LQ8b4;&0v{#tia-mdf*FX(^GFjm`zHM#Z zM_#=s$!YfVfQHGH6w#ruUK|}Hk zw8VRXJ-PfVSfJ)2lj=wV=(#PhOSJ8g23AP$i8i=m26ZE%K(4@=V+xxSq_zn(f0GXA zE;LJ!T;h{;8EoucAz-QrijaLcUu@4B{-kY`K=BVL2QqVtO(QbZH(BXdU3`kh&q}4I z!|IWxh>t<jZP_-#|(SMScuG z;}8l@0@iuzzY*bCf~$GiiiyxiQ?2~L@5r3OS&1lonkk`MiJ%^cEPvqDNC}ov`$)Ff z7aSHm=!GCsE6E6-Tib{Yk7MD`ZYjaKsFUdFLGH^5F#!=uHm#Uh8tT`s{kPNW4xL`I z?CEE)daeKqb8`S_Z302RA*F*i6cwo&QW=s&stOQw=r^;C1g5&JT!)uwMQ9*?OY`54 zdCu!I(Fb~w3+vDnTC+gya?@jRKPXZvqaWf63J|i23=wlkFS<5_gp7-&SdWW+u{&g| z_tQ4M8 zJ8z}jxhNNRov5_mWxS=*-X|XTKw`zxhl^F|9rOKuynB{8BcQUa&c)Sl9ixGjw8U{& z=$=qs`S<<%s{%LZY|Xnf@rCWptviqX>7w!LEImHa*4XE)_uB9^qNx#oXdJ4JWnI5? zv>j}jdTP_jL)MYs4N4FEpkS(!J@r$$l@6PF6_Yr}8V_Y(9KXIYdIN7qz>;s$8;X39 z``n_5ITQayoHQPcyh87&qWt8U$+o49c@fj~TAWsG2pG*iR{efz@jOLj%J-jrd2V3= z=`Hv3U4;*pt@fV2{6fN#f%?$?f_Cm2A1`m!G*)cTS(T+(UdT3PG5e2;Sr;R2O}w+D zX48~=JKH=@*My`oe00PoN=qYJ7^TL&P##u=7}K6sj(<`1#i#M=3%B|ADkkRLi@ujr zH)rXClU*727EbgH&8X`3TYAWd%S{#)wb(W|eTaIo*Q(aiviHi~=g(uFuU&9$l1xxl z#IjCaJlY$-v-|MYd&kR`s$>b?aWftN_kXX9U;6)hWzs9MN40JHbGQ2CEEqlYC~soq z|GhB3fdB7>)myR8?U#bbr(04(CM`~0dcnhCf8F1wd<&%CjxBLpa_iK|5qfau3!ZuD z=|g8YN6AKMQ+XoR$I=TIJ!=YDAD)~Y{`TpD^TKD}ZcmK#THZ*D5PpBjTYSB6s^Dns z5qAmy^pgNvciWJ=3RY{sd3Q7bkiR zu4O!PcgedCz=Pj1Gk~ymP0w5uHlu|XdU;rFk}1EDY29=F#HJZHYkt01r0~<+dv;vO zpS_sF-+NjSFoEkV%1W`c`%U5%`pg&mcxNr81`VnLDj#MQe+fx@U;CRrGW+KV+Z$6) z)!M~+Z9S56VWHsY%6+kwH^6*ieDb!QP5X<&-<~YGH|ib7aoqazue@xrv&=hmk--Ze zQ_ad*Ikuk;ZClw;bs4Fiat55r9FJ;epw;}HjC&jsOIODG_V|tWHjTe){vcJePPS^P zwC(8<-|{@_UgIhL$!(_K-e9wMTZ{SinrYX=pD%D4s$5drf6z~`F6#EG_?2cs?xLv< zdC4~UNA4aft6ctJS(Zun+rajJSfAHhKQ4-_uzU7nah%Drg^Ih+lg{pA$zBzEtXZmR zIcR-&I%O$<)DQH`vW|u%ai8zb#NS7scUo^QpZL$RnwP(JFTT)Hciq0!!Dm~GQ;TZp z_y;0e;-W*sZ6OfIcCRh`JuLm5{9JUgXZ$XMISR+M3m0Er=hDq<%!idxET!<5Zb5hG ziVW!)tB*b5Wj8mxkKzYyk}s;fL2e^xQRd*7m-DMzMGUK?*|_xW^a zdkp9MD#bF_7jI}c{c<;079LyXB{Zo7DM-PR-Cv7pWAy5--wEFEIW=+<`_A&>j)|uy zo^V+yC_3oK0GROl_#@%<;yY$f4YzdZdn*?Gc>L&QSVZT%ztV~In%@LHNRpR zyy0cnrjn!a9vA-d@1i}uz3E3y-|1yvH{7kD-^%t~p>%ih1WS{`nPIUvyT319be1mO z-CI_AS$ZPzX!eHO{#@VSbSvKeVA{HWkq!H-Dn8vl{3LX9)uYh*wDXPJi_*J)xZb*G zYmzJNnjd^>YlMSaWQ>Se_~p21!0Sr;%7-HHV8W6j=Y+ePLqEnXs=cPOBHMBE2`A|@ zN#VMci`RH5p3|aNnO@`9F#epAU+J`C`Z!SY^%Hk5FX}9N617(E@6(0i zDG{`x%frvJdft6|;(O7hEpGnm6T_eP-TT|NT{^+zNU>{Y)BS6nMS@8V`ZGO?0&@9y)8avE7S5J5d+Y`CK#Zc^gwn=2A3 zKYm#emubD~ThblZYuqD7FNdYpqk{Zw`yU&RBn?K~dNh9hr;x1oO$*N^9iDmj@wXgM z%DerKClZ@kFCCYEB&t%i^hS%5hf@G8f780wn(*(Jm(DBLnsoNnvDIfAr=;(RH`+vT zmK7d4j#sW*I4g9^fv(BN6K&@-J-xX4`GOhGZD!oPwsPe<$E3(5C%6-XN;K((vO{}q z4w)!{bP6x?sGLoH(5S^ zjBR^i-S;%KI+poZ_z@)6j(RWUw}RWgApx(+y+gm0UJ3IDtdgm(w&99U3}UnR=_CWC zIk_>ifK>E_;OG5RnqP}SeS46ha3uRaWd~8&z@`JC`EK8O)H6V;RX>rrJnYo{0vb5& z?-A(6ds$da2m@Pbs-K9$2~Fh!>B8@dfDU|Svb!q=V5RPErBL(<4ZNhDs}^o%QIE4_ zS{f=*41v3&D#|zT1C{ENjCMSO>>Mz@w_ZMiCxU~QSV=0x(u#;<^$@c+K)YlOQtSO= z6vUT7{~ytWhm(v1z#}z4C`Hwr2ZXcXQ!wO$Kn5PRP6gR5mS3S|?gQ4?B=FX!rD8=ujRz%_j^TTG%kU#e66%ZWAqFp5Wo}`j^5j;cBvshtaf3TRwyk2NFFe4 z*p=srJlqrpgN;Rv4tgd9xV^nUh|iT9@}8ZXKNKx@yUD$M@vz%n&B}akC@s8B*tyVt zuR_l$eyRPDr23aOi+`**)8QV_mdQC(blYw3iCF;7v6iqLvpuFI-+fT|u+TO+=^wqN z3!;~%wjIpv&%U$j3HQ#oCo^xa3RgCl@e0LGGuA}d9NAc_yw`7Bsk0d42WReC)Al)9({b4?=1bq{*^fJKoOPSGmG4@~O3fZSx?CI>^`-UUdC{%! z3yPo5N$4$QZ8?;nRI71ga(~no z?RuHY(^&Rb>qqMQPD#~`mS+)%@feiX_X7c^@DjF<+Foz-Esa}AKm)$&r;=Zf+PuI* zFZE*LRy3*~Om87x5zejKfYA_QPI32tiVR<%We%Yao3-?yYNvZUz)L%z{D@Mxfvw@* z0>kvOrbW+?U+|J+A{<^oxnzofFUXVg+Vs9fEEntvUQ}2S^Imai9);hrD z5v;;^BK{P`{hdcHc%}Q_Fwp@LVeyh%SgtvHrj$Nxd?13PJggSqW|)Lw>8enG2mz* z4q>})gKUG(gvP-$9TQK0c%LG$=AIiRaHPk}ILR%YRnk{(Q?GO^OXtYJ?* zmZdYy9H9R>1gu({FZvMf;GV)71x06ZDo1J;b)K2llm%jC7jf z(}gtx_5qmV$lsu7tj3#I0`AZk0B2zTy>9-2lMaL(PT;s z6S-%?GxV?NM7adv!zyk{CuL2Aasi!f^#xPZr_fe_LM8|d(u2TsL#)gZ3cl~ ztC{`45vvFG@}#a-aA(i{LTr}LXK-(2QM1*o(__ZT)b|6EB@~{LP8i_c+f@39j%8UX zl1e>AhJd+p9fmo+Gvq;R8sy78{6vKJBk5PiMbH|Cna@%G0z*;^3!cDr4S!kmF0u$FT zGGptg=Pt2XpbJ1M2IwGsF8Z<$l8rwgTpoL!a&;D}3@+-&PI+YL1SxHqMOk|22}?b|R`-hzfnNRdjzW)kGk+hT{ort>QS(X;guGtxE0+z);) zM`^-O=lvn~pO0C6pV8hN2szJkqI`V`5H_S}-?N*DAHc5@_ZjfL9Qu43F z&Q?z!H;9Q<)Xef!tAu9qqk{_s=Jzw@yl(Ov4&)Un_~gf%8CLI5V$tO>&ciK8gMfZS zIk#TU8zovWkYGDc5K(p#?!k}L@WIcXiwhOs3utjj@j?mwx4aTNh4Qd8)p@Y`#K6&8 zz#6@wyX*sOU)^1+69O@D66{Zl7k0{h6>3|^Gdv4fM+?Czv})BT)_j3PRHd>MxbnP| zeo$0H@XuJYhTr@bE`XG^L(B_2qk?Onz<}&M3bGl5I{G@fjvaSg?l8j!5Z z0R2`sX%CoxJ;2>?JE9M%?2`D8GOWreAzpYau;q8yBFgzrPX8h+c~a9Jg2SFvLvg9o zL8~vM(oV3{!q_*_@_q1`bs$026Jp2*`>?$y4kVH{7jS%=$^RnW9$C!35<*?Hn?b`u zlo0ydr1V8B|3w%S9vm{)<94tKm(xUM8e~c*xv3p@%S;nwqWp4FKBNr&BHRU5iBzfu zv$auT`I6XzI&>>JJD(qvsU;r9U;%eXUd}9a0$x$lQLtuk@A@=%s1pT(%2d z@fa8S)qaL|?*q-K6(5m|n=SX>f`(c6%m_G;MT-sE1hjdFGFAx}5-fYsYNDJ906Tr4o~3&#R(qXEcCc!xsBfn?sNK8eo`D1g@Vs8Knu z7u(Ef!yHgriPEbO3+=^1zaakA96qY`xub+;fk&!xW8P1-?GGF)x1{iww@!{JjQyH%KgQL13LFRWK(?IYy1>>RU%UQDGBbq(3t=p z2Y~bivYl!19RO7mzU>eO#Hd>JMGgYO;-zD{kQ}-R^<0VPrgCoyjMonV&w%UnDV=n6 zB3=w0b31S$Xqea>wO@lrK(awY2=uzpqsAC(c)!_Pek1wIMofK6W0H3so*#G&cQt9j zZID|X)86X#P$uW$UTabyP#q!%(PM|3tnIBc@PJ#k&N|I`XB} z5=u0<*u}RKkgqhrnT@_1eVqo;_E}Je0EmY~zKQ`V+N>i#d5z{<&FKW=+56q_Bh&m^ zf~9_}3c&NNnK^2&Zd3xtjtarQ^o$5X^u7-hRirI$3?1ME!5!jt3cU4<>TBQ|Ih~+2 z)T1E6#y<9%MHap2dnl!JbKL7J`NE92`+*8;YAo|%D0;AYfUn@L%~8x!vxQCC%aXhD zq>?Ix7+2+bkmHpEVJ{d#nYSr(N7)YE6fhnv=pNvnqlsU&(i*ezM982zhpcv+rfzMs zW7oS#X(y%BXuMMgf-y7X@o2^JiBdB~3=$yI$Fw2UG~dx`5S`^BuHc|!@1kd#J3#Yg zw%lft21z@p5;S-QHCkz0Lvh}v;kc_II)It}Nr+xiu4;uOoJ3sh;F*03DIoeuIf>e| z4!B54FAxyi#w+_k7{$^PLsB{7=yr06Z(}N?QbXu9YWGVBL~lwwp`PY`pWHMd5i9go zf{t_$y^EZAOoLR?Sk?d?yO(SLQJm%9KT;At*CU9jiOAcFD)SwTwaS*=PscWdGSR0785B2m@ z7o)xhB9stfg-XI<<)XFCfZ#i&HhR}w9f&y0!~GeKoMYIDLFhcu&i*XjX3CXR%7_0B zb~xPOJ(yo03o^&dsOay!pPcqPbt~~+l^DWQM2yf;T)fQ4=nwco8WzK851OCtb#ts*TD;l=CXw`a-Tz< zTyD_>3WDsk}QHok_S4ybI=KN-uY$Yzxw~UBGdYOTvp= zNXaBT1JXsR5T6a=ff+ipQjPa-$RUsRe)FfH_XS1Br^;?bn0@Vpj483d+6K^RYvk&U2dIc&kyc6%m7!b{y{C>%MImkBF83nz{I?n}8O zO5FbfVyfgTMzGxPa^ZatMEW(c%|XECo2B!TsCEuh>EayUA1w!F%<#Pdn>v%cfGQN9 zaGU%E80-^W_MF zFbPb-X5J=fza`v<_!%cTf4LbsDFyObf}PNJ-Av$J3Cwg7@K6vuK4yCnB~i%eu+b2O z)|j@GWvzFv50N4ce5BBu41S;7#rv+L$L@yQn{8oDop5(GcYtbY-R4W$N*Qg$Nnxq(=Z)09H%{fc__{$QbM|B0~R#Nt6wYTJWG z04Xk3ca4ChSUSuaNrZ|IzB^zB4{kPZn`w}hH3-rlC}ofn{fjM2fT6FT?5&q^_Rcp@wy}JHp36Ka0pLenJ4>2Z52HCsu?&$#n4Q*T(CZgMd$W z2B}faLDv%8P$e=~Z6O<{yRB6fg*&lbH_Ks|8-Ou0eY6AZQ`&UkuG&0XDAIonaPDko zkpK4`52{O_qh~sTyDdH#3%NmXp(^1U6d&X~kDk*U}NxY`GjODsWfJfo^jX+P3XsynakJ(T*+-mpR3^!sy0L@kC#I}Y^iA>MBIiT!}7ow zJ{&;EMT%$8GX&gsJuo(Fla%EfT6CJe6FZTz5jb4QG=2j_wt5P5KW4aZS34TYV&Hz& za9u95h2q&K6G=@AVbm3hzsMm&y}2MS804slaH!!onJNHaL7++$dLz*IK??aUwK=nT z&S5A<-(q#=OCaM2pbOB8^+Ty%z+fGdnC?a#h)lYY{yUXcg3N0rD=ney<2B=w5tP@cv{`);g2*9ka(0~#7qHxwjRTVh=1qFZ@z@hfYbH18=`Pm2pkpyG zi55Is4iB=$m%bLkog%F-PCg%-e zp(#{h73Fj|84xTbwI1=xw+Ckm82;fl?I9r#5U`hapNr4CFtxJZIwp{EC_wuc4$fTe z#e#@e>vIT3fiU|x*i0y7S%8R%A!6E|hM9f*i4;bm{ir$H zWd}eAnhEN36)k!@$OwlJ7XVAo%k-nw;M$<4(~e#OAe|HsQvgYX{ZyN&tr|(CkdSIq zmpV!9wFSLlAbLs4X%O3+cRgoI7^UaXJ5cXL#_%svPFbu`B0WlAq#>6G7F`~&r+d9X z$Pg-8tW6|F{eQ1SUh}b&-{GJzv(;4&fQ2xOch$mKc>^eh-`RR3egb5QTOdrO%`;LW zaWkW!GoEmz zAN0G)dI6YS@eG`(QU)nBZZ&i|yBdmmRbA11$a_QS42T9~9vLCaNV9 z4oAQcR-oeKX@>`EU(NCt^40bx;prs83ivwbaZB9ZFyJ*rEmF7wbVxbHezw{{Oo#}{ zq(t2tB=9wjX~i012_IjnQ7dTv^{^jmZ>JfQiY!vKeBfKTVy50U4Z?zUhj5#VSWK=S z7x?3egsFgq!(v+BwgG_qT}g!kLk(4==6FCdn!l2M7|&cxDr_F$h*F{UX=tL`0Nyc8 zU_g*HDOqsW?yUkh7u;OU>1aitT%g!6cR;U+p2GbtAfH)w8{KKhHSn#52{s7pDjUn7 zHod1p5wdCtbftbxW*b(_WgD00&Es9FL#q)DSb|MqyD-d75?G%-P(o9=^V!rDFX5!o z0`x2p_`q_O&#?9ErZ}mMRzg(du~waMY;VsTyh6jNMMDQnK|^2D4ry&>JurM|=Cq)^ zqxWIdx%|bIZXub}kA?@4=)%@cSi5Mc6get9Q5I*Vo9wemHScnJF4Ufas zE;3rrrU52Qn(Eb1S1zg`fyFZmv0#!mzC|kfZy1BsjRM6%`gzHvn)VKsFt2fFSNL!a zD)r`z+mx74|!=P(Ur3s6c!-D7VGgK{1Z0+eH$6we;tu)xUewRFH{=tpR9TJ6fE0}k*(5{GuU8`q@xE|Jk zy<~amau}2b(Mw9p@3>~F7`ZlviK-q`V~yTJgf8r}bZrLW1kAE~023Fr=o$y?WAm>_ zTraBQ>ZpynF7R0Sp|?MeL4R!bTWR^IiEU9s4x|kFb|99q0Q{{RMue3!qCuTud?#M;aiIa(=9x~DvQ7^R8(V4EdALgt#k@3eiJ+w;ln<#k<=C|g`ub~Q zUxTqsS=@Fo(VTs)^h>iLC|;;A77E2Sv2p@=^b#4tlVT}hNQFc)u@T#>(rE>;eFJpw z#scsbf{UOJ+p?Qs2w94hu?cE0osiEBRk8tTR=Ww|!WNaBgSL!xDpr0gRO!|kgWeL$ zZwY;p>6;*Byt3N-ehD#D=mAbU3Wi&mjLIhz0YET@2e<39JfN4{PDwZqs}gRX(sVPB zJU2|ESQdoBf=CKjoiY3xLBb2I^vK;5%k#)NHQ;eM1jm)wp+*8CXibeeK{{)(a-6Kv z)dQ)H3E1sa-Z1drg_|q6njc6p|81Rac~1+)6;%AXi%aQJ4;WTw1{{#mz`)#h(-YWJ zgiyla@SR6}Vemlsjd`?K<5$iwTM7!b`!~)??Mluvb`Hbj*>8yy;XYD_gLz0Zh2sP8 zfBcp zWO#0$ilj7gg}2b%7F*qkU}aL>P%Lyu1Stzu`@SR;@RX>n3iL>SNSH$?+rlN0z8TmE zqjIk3Ji&Xdw6Gh7l88RsJ1N<41zh(=e(CU7eqd1J@DjcWLpg1X{BowKOYXd8xfkAc zW%hM>?h_3r9H1Tli`pjzoAjncn$V-QfF?DV=Smb5&Cmj&QdW8gs}pR)9**E6;Y_$j zLnSVZN&S87`QriZg%xXBcIBtNZ4Jb#WJ(t9j@Y6SGacBOdiG$k@~|Ks6u@n`Z)QCM z8ZECtkVIQGjmKn`!{a9 z`V-2=O_iJ~QmXlw{LrNuT_;pKHweM<{*WS(9!Tul7?Vinsi^U6w^BHc6{m-d4hcAF zemabj^Sa3;Lb)$2${-Y(kKXC)BNe`N0{;pOwhn&#`d^@7LEzuYI;jjqoX1QlZxHwv zq*_gSOp1!p`Urg`t~Fy41Sv**AadK`0dxp}yZs4%H;Isw{Z;M@>ClxMw2Sdn?mZ;I zsZX-;4(OC`6r(eOWUT0;yL&K>hP061^r#OkW3vFbbpVXy=omAO!+6xle!WwS0}i zARveO-Unyek?W9&8^RO8-;E}Wlrrzj!`LQ!?8#l<5d{rx8=)@e_jsgotpi0cfJA^{09(J6}MI_;JOi1e|0 z3*dIVPioa&!63s|%MB!=Z7OPG_JtHyK}!r_uo|%{rNp3r2-Sdw&dgR$VwoVw4mHf8 z0a>UsfFPD=LJA3Xw?@%&eudg%Hqh?{+$V|f*85&dCS_5k22X`)7cY*^;6Caf_-_rO zySOYutBzFLI?2Oo;ma$6eXcYiQL<;+J}_g^R%sb@Zhj5vDDQs&y%wmj^Z}a#5e8VN z5|oVFU}PobCxIbTKLYcVa;=b}4Z!1+h=S0jyd`6F>IxW;t7cGsE?m--$I0BgzrPio zLo^mapEt=c6RCy#2HmS=E7=3|!wDXpzf-3m^fNN5cm{rE)tpKK!~n*gKeWGi5zs@} zlK}`zBDlC$-e)3C+tw9+mCvt{&{R~xI0vK$6wK%!vD+T$93pX|gW;{iK zWx*;v`4czVrWBTf9iz`CO#OJFhY%mJCKuP~^iq10Rf^Kp9i%{L3Aulyp$%?-3{dZz z#KPm646a$hG78x0LF*?Y!E{5KpeBLdfq2O3Che}Yl8RuxP8fKWH$+yyG?DO4HPC)Gure-nT`2Gj#q9Pm>2kGJ)Boc|cJ zKz&T`auzXo=}Q#}R7 zM|5WIbHn|L`Vh#WKSkO8cL4%h6O`8jECsdHIN4BEiDYg;_yE0f%mMrEz&CS=Rfn@k zdEF$BRR?6Wct+lAat6}E3Mb*I&Y{ZbdMt>BqP;@xT6M3MEUvK2fLp`w?0rDjL{%dw z_%eE_xq@cY54AhM&_!fHsG2X*&|eerW2{2>y@#mU!nl9}cx?)0fPRe4(fW(YZ>d?z zy3(bvG`c{K@@LTeZ@_h(MJT62%4HE23HQOMoIlgN>>*K5O4k#Q*~nwjPSwz*1+}? zFY4g;LZ6vL7>}|2*2r{w>U4rkhILjYVjHol-x7WqY!nYQH3JXC;2ZHSPVRenJD#ht zH|!%tlfY&j%dG*^!EHElDG@?2OHW}>ZXn|burk`AjvZ_Tf%Y&$x`nUM(^uQSjZ?ua zuHl@+f^CH4vYYs6sEC24x|EHi9EGDYP8>iCmciLm(|O&xPU1RUC($eAR)4meob6Ez zGxC85s%$&d!yIkc$?i!kCw7ue)u@0fwp0%|7hZ zuK`mvys$f~Om3#oe3f+cl_iY1B%(|ST&;r6T?0aKqE=}nv-w7LRy)TG&D<70W~%U} z%q`bl21lvj8v!I6?h_@<(GYN7#_&k57@z=9UAX%Yb}kIyokwiAc!WFD=A_qf5J5-2 ziC9aN`@F!Ah5`)!@{_MoaEwCg3>zu(DeMVm%()TP9}pmI#p9K=1h1NN7cBA!iyB>Z z$?8`AHJkOPs4_G3*9@vK>r9fQ5Os=S0OQlm2MZ-5afln+!aP(%6EMf90#+exBr;tM ztIwUTt$2eV)P#Om($e3jksCwPx-;DtQ}--43TJ5-w|p$R1r3NnGvueEK;bRcSL+)C zgqE(m_y#43Fk#%6djw_I>_S=POldtUm06#S*0 zs6l6gSug^O1MGVadP#v?eTO_FNHgJ{mJ=SO&}pJ`)jmX=5Ldt%td!phgo2lpVt!xg z`hPWX@V>6GwShm|)h2}=1&4A)E4g&^hIyBY3e%B0L>6rRo56Y=0OUP3thR8O&+07W zW}s8i4`OMl?y+!B#0M+k{{$kB@QbDBmSAuh!`?Aw7+#AP*c-&G??t z5;n~|_-}nIy@YU|gI4yFY+-~h?IuAE9!pCZ3w7zh6hGv=U$8d=avSY9n@N5wVCE{v zH!3-5`&%hAnKSN9Dh;d#_r-$GxMnWdX+Z}i`nCLCg+2MDwQ&6)lHNYBU!Hgw5ei8u z*a?R!C&{DIgc>SOkZC=&)FTTGa%u@C@iPtF$-ya=#iu-B8#0^HLL*o|U=c~=5- zF&eir_^O;P%W5D7m2PG0)LZ<&Na;}lB0Um3EUom!^Y~C{FBxSoxiu{31*`(tY=|u$ zWt(0e4^D9Rb$zR$2nJgC{Xka0O<5YBLy?zs>k5!4AvohAF~euk^Xp<+x=y)u>&*p_-c>7=-x^Odj^n@}PQad%(Pq4mPZ>jHC9E-wo{w(WoY z2laF#zti?{R&Ip&u2Ffs{1|fbd?cK78jL%9%5DZ#c(RGXd*Et-b^Ry+!$3QMF#*U6 zG#o|pKQus?ONUWpxiRzYR;xf+C5H zEbs1Ib|6kckG7H$p)e8~ze3?7zd{pfu*)$RM%Tum4QR=I3TJhR%_MSx4%?;`s9%qk zn^AaWZC-nOQVe@kG#}tcz(7GVs!27e$Ni^dndZfO6F+1@D!lj&4pmT$gkVF(MlNw^SK}DGQ_87Ui9LS=S^Ox28lB7Y~^Qis$@ZFg+ zsQ%p=X1_{b$^WJvD*YM)cW(lNSs{rN55WBl#qPh-7p@7d8Qx?5WVHP=Ox_pjPXEy}?Br+}W@nsT^h&5GVIn z&(_TLe~Y{`u^MN>=5nEmN5$ihkW{C;@x#V0ftccp_Ui2}Qw#Cc|23y5kCb2ZACyS( zNu26?2q{oi`&fQRgQ58+EJJjcg+tSLHeo`14@wz-l`$af{$Kyp8 zLcJhESmZXB^R5RP4fGx&BosD@n8Hvwp%Yv!+pvw`C{NUpvQnu6<5zR>Kh`&suE6D= zOv?R+dX`AWcaTiSfy}uVUOz;XhCb~^?_LGBn?q16jI1d!yOh2b(2B*9Z-OoZ0W|0V zFv)gYJJcg!rNf<5@Dh-UUkhnKvQC#v{Mk<2OJCBt+&AbNgBTdv!gbIJthpPM+src% zX9Gd1dkV01eb~taDRsqon*crIIk?k+ojh4T`ii~DgJzS00@x@&1)ilLiJ67)*L*|X zYj`)$Lpx|QPHjNi^pbda6SxRS5~1@3=y^AhI}RkI=`rrEoDWkFu>RnW0WrGtVgpe< z^^XC=lS9Z<$s%xM4=B{1k26!PkcFfAW`IARY(&M*5)SUL$rTvv%#ldaNkB#&NN0k= zV%Arh#qW#hEh zS+Sm}VhyR7!5VN6!Bk&~;arI<-wzqioMo)xI?3;{W!K)r>!bByia_I?hSdgqyr2+p zPtd+UN21671niRuZ41DaxbtQ<=Ta&sggwbo?R!J#Et)}8Q%R7y!=A+2VnWXZiqVe- z;?z873CV{5;t?Um#LO z0rt&VDYal$jUdCj2;d~bxOG_)xQJN>G8~F~0Lvzs^iK_t!2pC;i?9DuThsw|j*BxZ z3n+vG8mgfm&NHDRZ0+bP{DJ4G(HYnBB=MMIe@=u|EXxy!&kanNURYDEmb^jOx!_*CZ*a?}k zUP}{C-Df$*gwYMW`)i>=Dk`^4KH{t74UOrvLNIQ@4IPH_{jl%qf+9n#MMGJ2;1!a7 z6LN}>D7>J6`V`i4U}*ggfjX%x(itYdL0UDFlzs`Y#ndW#a*=szQvL_@Em}u19I&}2 zqh5m>ZHEEk4U;(Pig*8=3_X};zs)y%)ofty0)k@eAp~N&Q7l#F>hVw~wz!{MIt+(S z_Xa(xSEh~=?%f10XVnv8_@_Vi`5MllUUHUCu0M*J$mY5X>cwd|pb5L}fZQ$`uTX z2_4JZhV!GIBB{J!rFp82$(Vj30cUJ0Q5C3kG<@2uy-<}d43ptc(LmC;$+o$LKT z_W*ELKnC2m-+@#KSY|JQnYefkgO&4WrqV8%tHE-CSFHtc@_^+;p zo!AZb3UeUPjt|%A*XKwzXcDL@!+@as|oi?0aB?kp%gkm=Crki zQJ}|peB|&DNl8EGy+@A)Dy5mPb|6JJTTpYg=oX@}X~z1`+fx!?H?mH|RSR#~&UoY+Qvz;V7%Pk*Y?(W!webx%i71J!a)64F~4I6(R$Y5pZHcC|gib!aCUT4qF(N z|91)n7L43f_Zf6}gwNu`3a>f}Fb%Tjp!h_M?oz@hRKUHYQGN&Vv0e`##2~5A%07kBIk}~$|!0&y2}=AOy%}T z>g}Cczzwb`}=~XYiyf8WE zInQ%H_c)~U-E5SR!-08DdY>j5{7Qu3N{rn{gMZMfkT8cgx;y-+4C~U$rw(T@5CXtK zt(86ex&Xo9+SF8A#vsIGL>smstOxDGbx7{G>nXho!&YaO76n8LnWGA-{a4~f#C3A( zYc{TmPcf}W#7{R|0J0HBslHl*_=Ux+Y+)ASRjeqLxA8_GlO>e-HEt5ooj@Of1Ik*i!!T28eVcP=1@?R8y4ZTT8BThBsI9KWvj6if{#OY=X(w0=->X)`^F-{bl#k!`R2d~ODyc{VtR2Lp|Mnc!r@M{; zrS{TvReF%h8*8{rUWsVUg6ysLV5UZAqQ_*+gEcB#H56gd1Dc*T@zB5 z5G918mIH~@&Hp3o8H_wCnC(%Q+_%{4By@K3radMj=k2*QArmyR>+H1uBMTbc^x)hg z49ssAB^i&|5Ejemf316_8)z3Rhqr`4d$x1Kp}{ zzU6IPnGkR(uksYT2k8?2FwJxVpHA$c@X2=5UW{~#!a0j4RoY@gVdKE$e?oUCL&HqZ zKchh|no9ZA_wEc*d%GcQ@Ie>vdx`L_ApIQ`w3zYmVryNgpkz=?3?9SpW-9w0{FnsF z-A$*YyH8H0D*4c?)x}CCZNk$8W=T6=vHR3phI;x9zo1SOxJ42@UCc8`UKMWO5Nx8j zxTizM)HcMc76Wvk3SiAw1m@V=@q%(UhbwzBU zlMd*lM`yO;k~`&>KZe&Lw7zhG#M_oB^st|MMnrg0mm~|m8*i5%DOY$jjPXxDALO)&Mf+PgOsO>H=U%mTXRdknBn`pnD?8b=OVnBpO8vSCv zWP-#^zjbsH_#3zlbtI{Fq6%D{EC`HmwBjh`W`DH7x{)pREaW^c>hO+N#VNV z%CM8nFW#y;560^dXGeVg9rt`Xw!LCPUXM~agS_(dfI>b|h0Je10&oD@4v-0O{+Z*R`? z<+nW2l?rC`n{856EeLB+NT%Obkub(K0`~yX*+b-p6XudS#)#^K(-gZUfUR9+BWy{g z+gV`Z)Y&eu`$BXZl6a1zl)dq`5z`+zp?K;^4Dt)QIR;}oE0NzpqMzkWKoStWe@Jb1 zS74N9tr1=2E4-quOEG$J0nnn<DLUl~%_UO3VV9jzza@hTq;)34>=D~?HtOSjIl=vK3wKm5^ zFLXg(zDj@Fc%OpO&WfFk3D|#%<$-a`V`$^OZRgk+zkOzp=Gi7z@ieZT%EjJ7wtCc?)H}kSs?-i=h z2uvFBd9t(Mm1!x}mp;-c%`ZsdcNlDbYmT;EU%*=kJ&IY!7?}8=65RbrM#_{x0@mC>@9_d~ z@H_G-Hw3HsnLyA$U&{k7Z}euD$+H0_ExX!Em3~ajJu{T&rhA$<-`;{>E<#Fxqls!p z9}%_Hil^X3?BE_#auU#s@NDJ8cz_fPYn#1LtRHs(3LF`itB+<|5eqQq*C7Uk-SWzp zO#SGX>9!D=Y*{}qCoa*MqG};l9fh=HMB~aAKeU1=pzQWox-~<{+ zJ;q=Xr!i6r2M}}G-{o{jd-Bd54YsGm7d^&?A?e%$>5P7TI zgu@@$TDVlsV$NUp=>_4hL}k~<1ZuWL^E(WHLr!A-OJC*kqW)o$#Jnsyb<|gw#X5$> zBnqUuK~Me*+RcBjic7M3Mu+cXOCWBU1`sC@Eg;SvXIBQ0?ikf@?cHEt+NP_iUg&A? z>+(O=C>)Ly8zcu9ajU0FRf*sSb!H1s(4HpI4OQSFJLv|W!6WjtR28~nHRn*M&g_1j z*+T^eJD$gL4s9^fnGGz<1@y50$hz-n6}9^rg<)kZyP=z_D9&OElc7snFr*DXLMYP$ zZuM6oQorsz5h8#3A*S!OTOthMD;%zJa)pnm7nBRJeUX69e1K6+J?URMh^j8m#!}Gym0bP1sRt?jsyYJcosd`}l)i)@X1bhBxj0wh?PJY}@Kz%&H1u08y-wj5xItx|^9Nnu>kS2OW=emx~r3yoQ86GSorch#%#U=5vsvN1dTl6_@)MTE+ZRo-s9-AJ+0%+s{^IE64H9A9k>bU*mY+~{|Y**1@xkQTU-nvIVegeC%EsJg!d$L@u!Nd z`8^jda<6q!EkVtEMR5tOh9zO4auUcDatnH%6d5huu*uh}r64dOsb>W}Go)x#$w{^-Y+R zX0T1oi`e$OS-^oJ#Kll^EqC~Fr^bq!A@O3W6;z7!}%ZyWI0ccj?#<3aGk}dlYO(Qd|@c`zHDFP$+Had_FafDNUrdXLC{&4uNqf zmU&V?s`D)yzMlzH&6GRA8zfvgy<*#laW}o7aa@wPj0x4cnkSjwS6L~A&sS2RY|nc{tY1D>|oF?3}wq1nBSX1A0GLJ;@`OPQ+L9yruKf zQU6yQ(#URfDqa5zLOgvJg_L)Go?Qlu%uvAogpV zfSXqK@jUBz9&*Rrqd^7IpcEDAbC4WB^py^t`%CuJlteUpPpg3)O&MS-PYH|$+L_AE zznLNhXf1b+ODxx)MLrqh5#Nv}oI66bv*l0O6{NgEWwh^mf}MX$d@VSut3LtfnH_H=8w95)g8XyDE{s`ITDc@Nb@Nk4%MK z9l3fN%#aKitOo*<9>&isy-)yy3r9UAbo7**WEOA_N1M>Y8(Lw=$#ZD5y>o_-M%_cb zRqY&&4zSi@RXA@Kz}Uerp)^MYVV1oXB-COB19X*Y0bAT4zpZcC%ipo!D-ednW|Dd1 zPtPe?*j1kQ!Wo({c6u|{f^69CO`09N3l=F9{Yus#mF!5d~ zNujBaC%7Z%Hie(Ykos83ma1+v7UZ`Ng;q(#Zt|`LLRj(IrC~2aU-s z#&{-Bn$VMSS?5BzUKsS|Vm_N{^AFY%!a!Hzzfoezh4ysi_Ca7fT|75BY>=)mpu<4j zIB*818pOL;W%@8FyCq2)x7nFPTK~Jv_0ROr)Y%Pk|-WDt(#>&UwOqPP$IC=rp%tDg~0a3lDM(ESX@Xg89wl zy26vxA$)BxP-S(EI*3EOES-P#3dxYz4#TbGVYqUJ1oBm!HCO6H0v)L+W-g8iQ*(BP z5zi%qF>)eBrw%f@ z500X-y`Ef4-jR_T4RMlyEpl7$t9-mf_6W&z{)Z_EQh(OXZP}4r8Ddoa7U!`sb;5|4 zKgJdxAdd2H$cC_(uE_?`K}I%)|iZNst3!jBUzk7_gC_& z9sXhVZV^NO8uS`q;t{VLC)f>*6Y~|(b#w*Y0BmH;q+s|hxM7z7!wk~-`=u2@zNVn@ zPNjkpAtB7fBxgX^4~GK<#FB05iAGs9DR`=ouLx_>V2$S54#4$KT!6T**B-+m!xcC-E zSlvMFdO$Vx@u}*yOctBaNVk8l#0qnvFG$Vyd?I*2ZUlU!Je)+Yq6tW8dSr4Xyg}H| zL*k%*U03!MdK`M>n=Bo%p#W1fUWiEL=Mu>KD&kR|dqDd^`tICu{X{3D(eRP(q%pP^ zdu|3ONbOBHJ`X$~O1sQwKy$Ei31A<>Ql^JHoP;w6AwxAfMOHf|*SrE50@F+QTHf!~ zQ!vcp8!%NMPQ)``T+0MOHhlgQW6{I*{vA$V-L!S?XQYP3 zk6V7B11HV|&+sT43ipR7Ow#`V zytq!3e1!VyP!HrAoRzd?E`7wGz6FJ(cCpWA={k(V|C=j#h)G(^o{!X|H7CVp{ArijmYYD=s0#=zJeXzp zzle<*pMu+M40zKiWMMyFu@X}9o62bOJelkVrm{zuzFelnLNBeT@C|@}T+#ia5~a`= zQ}C${Jc1w!j)Qbk7@(?b*C}R$RG?AaR%^*rlpmpFw+lqco0XOh;kflJ*V*!+f5paB zD-=GY@(*Q_MM)zhjQT%Ei-Oez5UJW@sG2!2X{9`JaxVWJW5b7{Rw^FKbUTmumW#2_KS6kEWRrba|t9sh9X>VZ^;i@DAk;YdgBOigJ57$&&gx0^e!ivj&(6k zn4};+ol5_5kQ+s7LNiz5n{qRVq|Sy?4p+?{LVIWXR;nds@0o(xS>^2f5BuQGRbgnV z0{!3~lTEw$=UogOPvF%jw}9#s86N&io=f3*qZ2aer{j6D&KXPwR1BC>w1qDt)WG2R$ z-MMEtP=u)g%8TesMm4FwT)65D73n-(GG5J5^2Ur5UTrN3q)uyS;an0e_6<}?tq z#%zBc)^I3cE^V;0U>2=%G2N97lPsP>7;&8nqM1PYZ}Pd=yt~iSN53M0m{BvL8OLZn zPqwI!Gp3M%u~D_eoI_iL6=UDcuQS{p?EsQk;HP|gDcv93$Wjl1Eh zfQ?!xyy!wR6$OUBB!DfumP~a=7oBe+bpDvsf8c}4jl+~OaR@Uq4hMFY>Uf(^rS6Ov zBSU%CBr5X;eNk=lz5&m&mfRShX7UhDia24R$w@loITgGsgPAr;p5GANC68bh6#O&f zvW!W6-sjnd_rv#TJ=1RWP_hABOn8qqx;GAV@Zup#-xKwK7sGSM)fLN{&fx_%^R`v~ z;;ALh)GL#Loa~QcN0bg&WrSMnx(|*Am#BCAbJjC6Gln&@P|I z%^E6!t-l6N*zOIRRmM3?xY9J*Fjvfb=0$i3zB+EaU#s}fh>A1J!&HMg_&}c7N|Idq zH~c$v1wMdNGk;eRGCHbsOqScw89*g3)XAc}GSkn08Y zaH-Dr1nS0mHtP`gJ!`>tNV7e!^fjts3&Ah=sf9WttMRq^q!Nar{PmduzbnD&E)^$G zcWvq!6d{MXxBokw-vTi7vJXw9W3w8;2b5_`Q_x4Ydc#>#@Rk`VXgAos_W^IwAl<0A z0;983#ic(S{1;v0R9WnGQ~1@OBg%GAfk~)8Kp)K(4p1!blLRJ>oFz8P82+%tBG0Z4 z^BjPi#c>+_p?B2Rl5r1kydo&FVga{xRTiHOUF0F%NQxAW54EY*r7Hi!c&}ZI)V3G$ zq(@*gCihTHR4!WV)j6A2 zW1`)aiLl?cQ57OYjpi1>oI>7<#nEXPLNK9k066`;INlWG3&I20dR(O?i{gEPP^5h*XwyKYozhQ43cs;VChlG^h7 z-4vpL=Voq#6qRW#Q}j=d5QH(MllC#&am8%J1Q)aX?xP+`lD-W5 zz`JkHN1F`nM>7Y?+u>tIm&>m&?7{z6vm?LW;ME^bLR%QbM5XKX@TgXMEZTUB3K*!6dPk zVQCse;5oCzSLYk0Ybv|emRbyhzZ6V(<&w}t)J=)=+JYk+nT5v(K#4-3sHD`?Ov!{X z_`C5|!y76IXO(j9E>%X#Kw)wwsn0ZyZv|4kG)JS3e^N2TJ**kL8q*LxXKIr$Qc5|D zvCk=o@X3@z6`dPa@?KRKkDYICXikM6y%fOAXwKoT=>5}~wNXp-8f9mXkQ-^QDJQgN zgLDk%vlT(NC9i(#567%vZbDly)eZI}bn%i9F% zWTS~%#ztFU7D-4|1m$Av`42yUVNL`Uv|~Abp{2f|;U-0BrPpGIfvFXyQS_ zWqF9zHM=uM9Rf({PolMd>wOKPI`5_` z^6kaOFH}V>zzB}NrHb-AL3f$2#u(uglh0qou^dP4f^qJycGF8T2M8bZ2Ci7rSifN{ zO!ydn%e%4t#&S+zRNmV|x0nGD1fIPIW;2PL()s;(wmbdF^`S0qrG{shuG1rYf--nf z?4sWdW67w!6yuFk4}QMAUYcnF?3Tbe$fq?Zf~E;Ci2rZ)rjcVh{)|26w@=EXu+N>* z1*FyPrz3cZ7b|~YV_-$-3&&D4z@U?Y$@U13sR=%e>E0^Pi2Qu5jR)wuy-7B=ozj!| zZJA1g-9NCXd8vx(ZhnVc<{A3DPG>JXPRCeeLEWWEXS|H?qd5X26AE-}F32}ZquM)Z zI^V`C^)Uh+O|sy7j60!r%;m9>0F{K+PN3&f4nu?oYx%b$I*GjqBanoT>HCIi-g<=EnE`NZ}Oz zT4hxJ&gb$CR1dH3$D~nhyF$t7w@jg}#6Q0$r*i2im<0XAKefp2+Mq_?H>NN`qrVGB z@GZOHWR}UzW7I+yS$hm`ld8O5+&JlUA633H_~lk>j9kXia7C_so9mySMLaV~tu2dN=npc~XMI!N|3!CD_+UBU{w?s%>a%#p9w=%#V6KKMrkvf&YD zI`yB~5Ij3#-zakGpgfsH>DKRN%}m)?S~-xAcaHb@*Qd&8)peX1y|xlrsj zpyj&@>IT)$9J*XyD>k`7DI=80VgE2Il_AD*Ye4EApZ5XpVUv>yHhr>;H>p<%z3~$D zvYQLK{!um)Nvpn1+hQ8EpVn2Ln?C1jK>*YGjQDp-jMH>Emi>=N!N00VJJL=~pK0`m zyI45nlw^60Lu$!ihAzDCHLec7W3rV?RmP#J^1}vV0u)!}gnwn9sO=RsMD2`K8pkA_ z5*uYtSg%?P-t;J;7c{8#hu{Sa96FLtiRtcLpUV)Z5dp3Gp^kGrM9l9~3-d!-Y+E}< zeBuXn0=VkdI8gvhGtv*WM9;+ZRJXO&!=?_6{>(X(8% zMsQhMVG9?=+6x->Bfj}^ONf;gGjGDT9%lBOl0-UQpqZ&kVpKlLYWo3m{`xeddd6}> zBmYe(m!-*RcGXh|`0OYzbfB1bZz!Di#WI%TR^hs+Eb^rAwFA+nd&Gk4@Pu&)PzJkb z!Ly^${6A~3&7|V5ZDib;h>s+TU2QMQIAhMgc`92Gdos(gSTFY6Ly<+EaY8?>F~~Et zv2Lb3_nVE~)SFTkS1{nqKbL1O8uSg#-xr^Y{uZzan8Pukt^^GRunkt#LAru$-*Wwu~1 zh__mH|1~O?FEL}&Z;!d?b>EMtBbqrI#YXDSt{%b~HT>x};N=WMWZZ1#Sfz0h+_7*4;5`90P#%iVIjv1N= zHDoZ_8DdqMB2wY^f*=mD@{fZ$Vw18ZJCEh^)HxmwcY#82rIBw~HLC~v`ti3zeA>gF z!{djpqZW+#EtTl+))>K};~j_G5y6%fM2$twI^n{h4lPbq&{jhM7g{1*mBeWnrc+}$ zhIi?e9m=U+$l$R@=jZc0o2cW;3Pq<1idHB?nJk+hzLyNIw-jdwaA9rbl4+f&1y9nySnE`|F;6$i+>E9`-!A zb*rFK_`{=@B>@HY4K@FJ_Hz^LG*cFZUvUpQ=pJFxd;jfJw+~Jum417q)4rd#_o2mx z%DCkdzb*M-EQm5}aQ*7D9P0(^dk_4)^YUMF0dCq&z%(IwLrssMqbiyW1CazdHVw<5!XGK5)T2N_6+i#Wlspj=RqZ z`8POff%Mxk)74=FOF!l0nh`Qi#X1SwU_P(iRY9VydxiA6t8F6{?d)x&Y#Oe78Fj`s z?C|&#KYKrntK8$cv}W#mn@hHzRa9=PI&FHRIQ{fzM+PpYSMGXzHzMQGv!oC1Bbn8U z*Zl2ps6pse+VO1cJWs6O8rPR zS-Fb(dRO##5E|b#qF5KUyrKSCX1A$y+04+XO-(a)%9LkE4)PMm$J;mt87;24n00#a z;F!Y~k7}waKbNn~{LOa9z2Cj(6^7n_ztTC(Ib1#4ab)YFWjBqF*m!NWIl&41YTO$4 zCFunpJokou=@4kGx7R7$WM^=$gE%|v^UYi4?fEY8Tf5BbamOZ}oBDlJQ2u>4|AXi3 zqb$7r5pGw3)WGcENf&2Iu2z2~Criby>Tb}5nC}FkDKX)-sw8pkMcn|llnJ$+xI7{= z92pJVYUfYgdE}^Q;A6O%?b|UU%Aa1GoBx-v)UAyoMolK=lU^T$3@&fiZ3)?QT zc(sGvMelYG{o#ZbY4#Ws^J}AxBgc$){msfe+t3q^84a+YQFtZ^S7$P0K{MCDQOcCA2RK%COWDB0q^=m>+iq3Z+ zU&T|Ps|hH5ZzS`hH>sTPbeLPkysFKw_vOP_uj%;ZUa1XdX^0uWRevxfl)cG}@D~+} zT9&sxX1Q0JtH4gO7*czjuQ`q(uOIrHEVxBq-+*Po3nNjr%Crj{%%Qwv9n=ho-27p= z!5&HmR)cDD>+ATw@cAeA^gcAVop91C(J^%I#hy7kwqG-M_-gUB9E_5PatS6bPA zGV{oX=%p4;+x@0~oAFzqQCEi|J-sC%!YV9$@s-fKhE*?zPq%GoJRI=Vc*mb6^)>4z z=}D|YYIl+w(+=8+Ots$Lx%0ZewS!*x?p4X|pz4$7~U-HEvGWJ?*FM-fOmY z)$DVLdaGBMe&$H3>(+^%ANBX1XYqSN(80Iuqp!$@Cwrgv&N;At>P5GmfnNsY^^T7) z`fZy_xTN7}#JkVpk{-<-Jbb19KxUOcqclho6WwEPsE1F{#Vy3MJI0I17I0!gt`JZ| z0{=GlmL%1s`Ona;6H*h;d|CGD;x~ES&Ob#I%u`1_U31W|cr^3!E4}@h$UaMnmP%zZ}k1HQg%NYj=3IENS^X3-^OD1;yP}-Cu`%KI`?* z?*B(tyZtcj!N|9LdmJjxKKXfil*y-`ogPgNUt##;PZj3{3l>9#B%$n@V2`49)Bf2%> zuknWp-h~;q+HLsqyQ1HZ&s}N_%%o;R@B<5{fy4V|#`_e1G5(Y^NGgqcz2nC)^SAOn zIjd{0Z1?`^>zotDr8TL9CO7A0>q!!8-{*)1@qUR4oG0a6L(9HBen2;X+51}IksvZb z{E1MmJnBcsHd9T{dAqmYW&D)mYEZ8W9Nw68sOMsQCrC+cZ6jSdZMVxwFBU6kK0rsyp*#gds!ZYLQ}4rhPQ zM(A*KJ^mv}Zeg2VF}EfL?o&+$ZIv%$x6Y}-#%C23UGbs2XD#KtPhy$%_#P-*gPfI| z(ESed8RC9CufoH06ALpxSr5l-%!1bn2ZjV}a6xgEc_zXV%;bqGY5bxu3bTZzH57~- z;)X0j84dS1wCdsyLxmNWm;o?!lV3Xxj zUW;0+tb1^XTQ$A|EKr72PXojUamG3 zIFt#`st>G_`DZ(9zZUoXA%}tVIgd9_?f&1zH??sx=&Y4jCJPROJ6*BTk>VSYeko%e=K!4R2lWVWA@@P56>k}KRzgw zF5kMxT;`gShBS2fh69o8kMiPgU4NV?h&AsqJUF;`|1SsJI=@PMJ+EPx?ELcTU#zc9 za@{^;e17`zqvbOlg}Yb9sH71j2wnixH33iwmRdOsH2TG6dB7o!L##?ZJ^`3sDDa$s z5FLu$eCD3+w0RFF1x%gsnfcdtZwgFy41}9ibz2u#em#HW@Uo)zw+FhN`#6u^Rm@C3 zbT0ibk0riwUv%yLa-B3fq2*im&3W11w_7<5jhxy&VNc|_&hI=IZPLt5=QfZ>$nT;S z0L&W>F@6rQWHXes^-q+Jy>EFx72^ezeI++@GFZ7|MUuJFY_*q@e+DECp$XZFqN2(+ zBlbMGv(KlEEmHW?1!d)mRx?-Gdb)moLVk6wVV=%+Vv{3gjk4o%gqH`*l!qVWk6UXr z;d!1xqt6~M{mT%71f+dpE>@X3e?xC7*QYH&32}_(B@?yz))>CSItT)NB0R1zwM0G9 zo2|ObA*WBhhp_`-_?fU|0?Ln^keUkQE_tkD)7Tf(U+39M$aML4X~tc$R6OPXNT0A5 z>lN2niR&h|(1w$s}b#QC+3*~W!SMtmb=YhA$O1;xuFV=GH$6)pSmcv@sw zfkSKMV`E*Tg4aG~6XqXS-gUg7C(LYn&)@RJ7DT_BH{W&EN@40rPgcf|+E_IT_mRy0 z=%TmKvk_n2PplzW_~$v=g%KAB7Z!;_u9WxesI|Bd*py@LDi`{;TsHI#06Y% z3q;rc^7n%SwRREilYUv^)|l;>8WbQ({O<9b)t)8eO|E_QdF=W{_t)$x*neV|?b)R3 z`43VG=S7%WOFztcyy2kk#KgSq?yKMKPp%n#edXMn)1#LRcD`p9dJ(BIL}ykV7Y6Yl zopGh!DqxePV)L?e0sXv6ix{3}$>^DAZf%xfV^`jq|0BOFnf9A)Uq_H{hv44X9Bcl9 z8`Tc8owh~^Vg=o2q9PivM@0Nt@BVtPsOm)H+gs~HE(t`}Kr?(sS6#nJww9Dzj_~2!icFws{Yaf{O=va1`iPZk5=0l&gy6$dlsEW9-pnYx4 ziM%I4)`@TK-5YJjOV9xfi?%3W;St{gC~*@bx77EemdaTC zH-X&NuTv#o?K$(@F@1mOGLgSt&F=NVOV9mJaAn@5JHLfHZM`CR(sbt3fxi}|Ut8u~ z{b2K+3tdN&maaSdOVFJ1^*o~p(anM@J~<(e8>-5FKX|IB;V<^e=f2M4F7^GCKb{}? zIF;0KK|8e;XY)z#R08N=+okg}u7ToEh^u~jUKMitL^UC#7 zqCPS5P|rQ~;Gy#B8$PNMU^d;E?yOwACC!aWPS`^bnQAHf28^c#JkQrK*5Y}HijT^J zC7xNL6;fXdrZ?y%-Nw2}eIHPn*^p%wkg!Tpvekkoc9jhZbp)*l`p>kJ7N~BZEISb%>RQpMiWPSrad;N3?rSw1S%M0hW z#tz9pyQ*~2OSzNHpU}uvI2XfT(4Lc+gf)ciSr~K{oO|BPV=cLXT&;QKI%ZJ^*ynOl zpfVr>8i^Mq1yw4PIl!8e$@>ZaoJRlEWu8JmS3j=;+)`?juFb4`q7$Q{mZ$!8mA9Ba z8n|vvl;I$6nD(_$JDRFx$5L|i>59xA8g!Hl#m;`-`Z_SS4u8}1ma%K5+!xq*t|nNQ zm)4oBvZvYdX9*nAQ^hM6`d6kQh|5Jk^dLUfMAky}LpQAwqEf9?oBhkqlNUTAquJUJ zBX71r>~^pw^^$)Y<|a?@PBG-GJ4wV{_?j0s3B;6BTK&DKBlf-{pbJ+@vFPg zTjJQkS$~W-;fqsdNLA#x6u5e;D$^;yrwZBJTl~T38!LRd<)RQCrCg;~F7jXco_!T! znCrJ;3{1uN%OMA#s2>(YRFkrs zU!rmFVgTtkx?X1Qf~vbP5CKpeXglG8xSl2Bi1T#DgYl3A6@$sgZ+lFq5VZ(Gn>O&( z)X}AiOw--sGA;`&ndwUZn#?{l#dgP^k?VQVc2?@@13nrb zvZMMQj;ZFiK4!lb*u6X}9gXUB#lfVMw#2tAr*-n`YiHV(GMR+j^eHLmf%h=dmF0-g z$Tfw7*OV72Y7 zV{o-Y@r@k+Kt)|vyG=aiMMD~P0*=1CY*$31lEa&Obs*j=luBHXMWGcM1&jv~TokF+ z*&^TtQ*9^3mPz94?INTXt-vk}*6%#OF09R%S+QBp3Q>>Q`5ow|T3(_5&vSR^;w5By zA$la@K1Gt(vD>iIOA_H1ljKaj+}S33f4jL@LJ=lM3h~6q~SWldrkS*&?N# zx$fQNktS>e*ze&76AJi5G%JHGtJkzRE;$Mno)pzO-i6P8%-Fhp(elNlWg)4(FPba1 z;Cd{!ioiF*WyP?RT&X$ zt>bn_Rl+btr1}b=KQ#JHsCusQ;J@JduY4o1H2*DQ}nCRrR9F$L8#-U-$97&~%X&67QX{cv@|h`~7~sGC2?cii|GyiGSz zo5@9(U5nsWw25&H#_FJA-ijmSSRMT^7Hs#3I?e`_<*s6#Uz_#7EuJB9l_}-3Hhr^n zYbpBbmgq5a}k(WH$1(GEuo0IloJx@F>?y7jtX7On${k%YC;MemM|s_n09|mp6Yv zCNcQgn63Mo z$ovKn8ax$R2VOW6|AC#nUst$nR}#IkJm+nnIOV*{c=;@)5&wChPe6&v@g2v9xGroo z-aIASNf7#5Hg}Z`UHj^(Fp*us%3RZQS8tYkYEkvS*@%1pT_NT3T+35ZK=w`f^ zvkq-RStz(+u-X2=#8Hcnhz*eP&Z0H3Y-bk}o_C0iDD=>MFMZBxGdKNI^*1l+hJWS8 zX^lZaf(VEL(o9A=LiC@Q{Gtq9#iqVuZ|Wj+1ki2p|8$L-Y-{` znAwSCN1nABI)#A_@vq%xYS#s!v^gt1Pj!Q*a{Nyx%?|i#;$&&0EQkrca?(R?cO5d+Ml~wfzY$T0FjWDaM7kM-h`im%xD;+sS!vTbrYgBAS2hJ@wR?;hXtl@1 zI_<(VUI0=`797E5w`MI<#GY!_o|3IS)!ZV5EO3L;0*h+KQq!lNHX3Bi^#9VwYdKB$m4j&KQd44-au#DkicaWU9bI zo2t5Mr4iB*%)AZg6Y_BvIpv&a$Jt8Fcs=Vm5zN;{=FA_#dVER4iORFaOL4JZfgw+W$Cs>VTFpcOQA-+1#RK9B= zZ8fxa0o9~vXQKJ>H2biFhtzB3490aMj9a*WV0bxZ>;vcbk$>gRkJ(dQ^q8T*P#mqc zgrK%wF1O4%DL3bLz9BUg8P3e)@`)}z{G1m50&wnh1bR~x(TN=LCrM{;;|n0hr5D%3 z1C8Ck&}H1$k_i%NXB0z7-Bf>ifGu5tvF}cvaSvymKS!VyNBM?^vEVot^qZAEB%vp> z^>l;9p73aY{f7@0X!$+O0G;ifW&OOx)DRi1PPUvh!aY-cgbdn8l;v5%&VW6+e9=z1 zWj%+vZm*L$NKI$t}WH7eR?-Xi)6LbV06 z@~KNt$dJH_+aa-T<_`bOZPb5Hf*Xw>vBp1psTJe$N#z}{G}zLmW7tnc{Hye0VmFLo z6>6EyV|^_O7bKa~sA8@Y!u?yBC)=a}phvYjw==gSOUI0EtYc(T0kG+9QyWiZ97BwM zr1yxmNz-+la2N;%df?ko>;z$`E!XH8*sF52e&Jatf-Le5HfaeIRJDys>18%5owKyq zV84`R)SjlS{|WBSwg>Mzvz4L6*q~Rlzd+QHAdV zr?9Qy`&!svndrr|!UX+zv|$flQBxSJecrcCuA*CTzW#Ei zUJ6zn$aDP)6{_bxueMw=H%mZ>{#poe8Ydpt95Xv(=n8P%xtqSHlv}>!kUEL)ERPct zlhLY+UTkI~%E}nHsNJH{_#>vn*gDXm^v!lQs2NqOOg%+yMxB(HUDxLHq-jSgaInVb z>bKUbZLgB{Jn5ZwLnCGp#3if5cFPwgg@C|%p4q!V*NMYCL~46Z+wtiLLo{*w=PR#0Rpr2mwO$fjsIrKVRwApg@5iS+53_% z944g=T_A)=T;u6dvphGwldpuvUIvW@jy+05DP+D@L}&WwYYa-WY}#^l&L}1lJrYnX zmInIjA}6@vv0{=i;-u2(VH&%ZNEdchjheZY{&^+joh zuJHKVo+LV+MGQs|@s&;QhT$P)5xaZbg=Pa zW8dfOgmwH6NZ{#{IHmTZ0~#7_j5&h*5%Rnp(F)TyJc5h!5CG|kf!ae5UT-5OuAwMR zqOg-LuovIc#W6lgM%fkTOvi-eCQ-tNFvMq17QKu<@@bc8k9a!R$U6{5nq8%%wKx8I z7avyjOblkUl^y7X5}+Jr<9v12ZC1L*aBDY=nGRv10s5N-K99%3T)i1EdJy`bEQjA4 z<9}0SL0|pE#%Af^q`i772%Ln-u%QlaJL01p&$DIds5}ren=kT#S`#T^pU>VdRu%$W0ZDc zUbvZz@y}dMGStS;bxk{ny%UnI8{3MVzY4*8KCBzInj95^v)Cx|Ce?8v<=1wO>3sVV z-E;iq(~A77RGn{3nTt8USrVxgnpu2Qxe(y2R-OPzP2eSE|f*>LyDj=Q|$_i~nMMc4ppAp^=GxJvM?=|~Jn~!bVhcch}eBPJW>-kFJDlt>c zhY8wc-c=zEb#F~46W=4cL3Ev4fFCA5j(yKgam&P+u6s&~G4Y@guY8p{31)b@T2>Dl zG%dQpifeXgmEj{8bsOgEQL59J_GW7NC8RpF$O)<(KV}~F-IRc0Nv0oQLS9qWKjg}n zs$AY)M6EEW@QGRdt!_o3V$9isAYoxBl{krYd)wd)7s{uFiVS7K^O!sYYay;IS`59; zkF52?F2a9n9S&BfonA<9ES7F2lz!Js9=*lq_mFAB z!#T(0A$IYWFtb3xM$lW2<0$wKya-QT^p~g$p%X7LB&j8vb&6e7InTxh)xc?L@CzCb z>C3Wh-iGo8Ickqn8;6=aF-`arbjTxtE=iJ3s$G>%#)+n3d)4cf6Dr4m0ZDJYwO^9Ps8jKBHfDiv2|nFg*~=J^8L zK13waHbV9EP@Bxk?F9tv($LDct*R|>bg)|5Os{Id!8SE z1ON+WlXqBl0al&DtaRf?)Y>O%*9}6Vf-C+B_#lI}_xwG$gjR8}Ns?F52v_4~sC8Hj zNWkDYUX4n;!V$r`GSpQOqRBJQsorrLB$e=i8IFxxt1dX@q+0Zbi(s_~+o1mvT@%AW zc?eUhh5tJTF1G%|0w=gy-M-C}oFKh)_Rlxb@-0G@3mHNtpTPkJuXssL4)TMC4AK;e zmxFM!n5W~yRe+pPwPfe5W=XFd3!{fJI{BPde5Zgerr;DmB@I^;2RAjv3Yj*@{x=}r#h!v}z+c3nzb@V+d@?C3yAR}(b{#MjrAu1P@nN}BG9TD!DE zW?>Cp;4OM)ba11ZC4*%WWC}7w(^*D0?AGd7yd5pQvqv3&%*MXTtXF2w1)aE_7CrrE zK*H9;#{T#jkG$ONkaiC6@bhQ&jqnmYf5eStCy{ObypOs%=QLyE|#811c z#ik2u;IrI@+o`IDC?PGQ3q`xu=A17g(4HIO^GMRI?&7y~EK z)y}U$B2NM7@)%r{XYQn9W#wV>6um=KytnHhUkkP;v3YSYKLk4V&~wL%VVu9WT!?ZDA!jL+4M1Q)`)HsAx7rO>_H_8h1YEU`n{b5pHZu%v< zmS2fCuc(#sNy~(JCw9}^0$IQ8B9d744mwhj@h#vTYnUEM7og!a>XBha>HL`@9ak`d zY&N+GKDxj8TTvc|UyCsfQByU(*SYPJ^4R&|F5Y^F<$P30z%i1o2TW*_T7x$m30Xbl zw@R>fovCJ<<>G7p&<8^B8h%n4ASM1*jHYGO>dHpy*5r&C0tRTa2jMeKmpr5~${M~D zAXyPJb@Gxjy?;PzA;F;V@hdsx{GF{B5=5s^92(ut722CA@^|+wpv7O*5LBLTro2Q5 z_jE|``R0dF2@wve*cWzQi~mZh%(1RtV^#Dhz5ilIX3PB~D=Xw~ntv}~793$GvaWed zJhN!>61tgl*)ZRP6o3;85!blH)PIW2z`PTb)E;WR!TB70KPo@|%o02KthhTcDXN;8 z)h^B6=5bV_dl#@g=ZD&o8!~8w1l_n3f=lWn-~22pA&U&WA##`QVgO(z7Pj=diNy_Edc}Vp9hI9b zrGiTY?GePpG;rHPrzpSIY==SB;*_m9d~TQo``*;-==&hQmH4r63Vxg=@dbnL70J11 zEv62~hggDFDU;2u@|CEfA<~kp(3V81HT&#_ooPYJY!9hr+RXI&w?YD5@*V5D6=BeuR?T2R zoS=6nrQ+(rW_oa}V?CYVTBbxe483|YG8fmg9w!e-$10+S$?EB)O^@lUQ@|^M(jobi zPsRw@{^~+Y9mslzNXbmI9MrRwyw&Fx_G5eD+H-x$Zz9(MASd>I-O3zGqn=Sm=FY

    e!E$!sSPLDm=7Rq$t2)ZbXkQM0F}AZcO6F0qtZwgWYeDTtVftw-;J}V0yZ~Zkk}p63$VR71{7g7Bs#k z44LDnpFhs(dl{MQMZ@b7k+`=bPjaUeGH-dzQ_}yK%tTzxl>CIT@L@_LT_1?6E>(C> zgvP~piZb^B{;>Te)9FMiPFi^dr#6W{1g_x|61#?rYhp+9v6=M2C_ahz>NYs-dP>r9 zWvs8a1U;l;qoLD@Ai6Lfh@8qNR9J@%c`2A7MB}&-$*5V>qSfMJ)^EtrD_(moSJY!2 zRy@gx+D06*P@iIKbJxddU%dn+xIB!y{Pdnow|tEtG^(dE6y9aQ&2DUDG=DD@YYQv&MzfOgo#Buql0k zQH6A4qWXRA7U@`DZYMp0t|KMk?B8fX8MS9#t)}Xh z6}sFZMVdXrTf{fvdH(te)0^ZIp_n_zoO!GY&cGf`$XLiMbNFyUu3Ao= z!a6De*DAm5MSh&w$zg^%v;%|(hnZ$YcJ$-xnU+go#p=l>1$i_eiTFW>JgS!$IMJb&RDy}B27<3KC_Tlmn?c3#Re8J~_Qt$z!*eV55JFCvMmCe8&!aU}9X-r4B#XM0 zETwrqEDzH6Edv#j%Dpz11)YqC;|%6=%C&|N#oI891%>P?hXJ(A_Zozl;QLETjYy* zU4QasoTZi^SZ#oxh=EzDht8^CRwKQ_nEKihL^mLWqqhF%_5G?yF4Pj7ui3V4+jXP? zeAO)sS34gJWEV@4b(QIGFpMUBQbMl`-)+swGzLFP< zb<^p1p`hx9%@^YCe~m+o%%=RAbL_c>qwgaD3Nb0o>Q%qwX&#E+(kECDV%QP21?f=0 zx^JzMMjpR}o;_hz+6NJX$$Pr!t$hTs7?E`xu+F%|sLS+jcw~(G>)dKX?+C-B2b<1j zaQx_MYFxeYY}?~#)q|J#vU7+R>-!yhe$P#2Y0XOuYpi+0?kD6T^iw%ds}j7q2%~jU=7o1nfxCGS$neUdT6sxB1rv}8-9#igh0o0#%Wdm0}#v`^dLt% z&VTWM>SnlK+^lYrJQQ)dRD;`sK5}HhrUv~9!# zj}hxdYyHjF)I2SS>P@+ee3%1FJLg~PoR-WWVV;m;7=6{mXCrLS@%y1*FY)sYiwlVY zNip6{-B+I0Dyf{TD+6Gor_UbIeM({e4ttNtkLsxF`SN$Um@P=pr4!bLpWvVGIUxOC z4n`!GsKm+2`3(2m%@J|@QG|qUsoI}`yrIK`-VR!u&c9K5Lso9zKGZfKkn-p$<;+4R z_dOe&F1Mwl;0<@`>Y~0_h#y4{+4~beQgB<#54*@AGq!P$b<}DH=?G~ZKVX^oQ=(bc zFU=y^c3KfYDy@REX}D9{@TnEK3ya|TO-D9-qsiShFKF5z|C9>HV4)1wQj_v;9+~X# znZgqMhB#k<$>tg$rqzfdqrnV<#^g&G@tE5#%|fHMk}BoTwkE^73OPKU5O6|5%4&YT z#U)sso2AKAWOz&zNGtyoL8VbvRhKL|I4GaoBpA^W2O^G zh|~EK&9vxll=Nmx9#BmyMeh@c@u-H1W+f$XZnCkMV-<~RB+_oHw+)UsDl*lEej9QR za>S-<8e<7>*o|;N-)dOFIM-@9WRhIS4T;@z#<`k?Cg((L{Z-J{K)RAi%u($oz(fk^ zEpDQ}_|82opaNx2IK|zdw2zSJ&8RZhZFr)6OD!m83mAYtwt0Q9?gbfy{ZA|Cpnjn~ zQp+>D5iQ1Id67cRWwlje%rVm2s@aam#%8&`#pauwuPL8?(Bf~<#~*>R+Eh?EYiX0H zKkTr=$nTru?pEAXCl5o&kx5f78D94hnZ@jS9VMT9i2&9f%S!za43EI)FYbXY2h^s{ zpV$8O0J&#Xy>d?Hf3q?AP(Zr#hBJ+_8*cT7mq0Zo%+p9uDb2S8lXt4tf6&!5=M0|9 zr}%!_i8Jr`v4s^rA2a zjqG$K=4L~_emHzorSA74=SS=6mFFZn&WpOThIA0eboo4d4Nur&_#~!KRSy9GaD`N| z2p#yIOOkp3>mh8J8iN0LMgko(_%-64UWberNv9R`>g!02KEF^&br@$B65Wk>X@qp0 zMY*}0fD>`lL2~y^Z?c=L(J;;#J%t2;Zb6Gp2Co1nC01`$hnjdjV|M#Wz=58wSBu_+YT+MTvw^hTJDiRAYSRs2~ z)GO(@YWkyBJeVqF3S&0k6%CsAS9f%Ds+>xlpQk}NuXg#2TO_2r^fL60yIuFGYy_-S zD86^Yu$v7brz8!A2I}yj#S)8H0H@qJzF*v`cdO+26a0+(lYjZkM~@UES4w8j$CEaV{6r zG|yU48J8uQ&{QXBa?mFrKw!S0xqpz^wMD%>_8E-_c-0SoPgdv;FrDDYjel(Y=GF-1 zN~}-!_(`fjoSM1}!Om;e1#~X6To&U>r4dUuczc62n&4ckeYih!bD_3;0o@`&mfx-d zW$q*S)agaohnICq?K$r{e~5DgLdw@->hm%A9UBmU-7wB~>7hDbSXf_d_C0TLq@B%* zS2Wmpvz`KwI}zf`=l&nI{(0JdnprQZ!vg7~5$89kmkwm$bVb}x4Yh{JY2Ziw#2?a2 zy6l{jeiYA8T7V|?8JD%)c}e3E^u&V{Vp30MLW_7cOXX?pSS&&unjNo;3zY580#)d zI|uG!-8$?*=g~Z(>{SKbrFfxKXPVlooQY_}&lL;K(Zf2ZWPU-mD*G7k`Rr}`SF@_@%=q#9^=Nmf!ak6412LipOCBbhC-KDxgTOorOK2odO3rMs1=b(l{gHy3s_|Cd_ZiM)82GGZSK zel!w-jb**0s?M&vm~p}NSK$Lb5CoFXL@dwz`mpOANm zqjZd#eMBJ1R=1ys64AMdcALK*P~{T~-jJydlAhAqwgJ#voglqhMb@M-y~b%=?HI%c zUsZRAs;1QsNoV#pMdO`%pK0;O$+HmcUQcn!v_)s3|9MraB&7CPl4B&Bh_QSSrtsy6l=Dr}3M}ObVm{}kY zZS6a`3l;RwBvc&PNcYrgwmr_EGA5NuzoJve4|>QdKiF{MdNrN;Lb92TuV^y+T)f52 ztX`F`spY5dMPvlx?nO&?BoS$w&3=A&nnf8u}|$*{(J4W{|O zO3JTL`uIzvg!?8q=B!%#@H#hvjjKIbO#Q0}n7#dy?qcSE zG_Qf*4k6@K#--&4z$II1$2yh>nAqnjN(phlS~T1Q&>+FI0&6~Qam#w?>YK&# zQ?j>;zy_73&|({$p5c;lWwN*UVQOj{tE@ei$8XX|N0t#hp)EpyR?zI&7!7%qF@rvq z+ME>Of%cqadlnqajE?%u7FS!LYRZ9a(EN;)p9*~m1~ui>mERe~#q@05_Key3I5_B3avOV_>)^e!hz^u{{8Br8sx=GS17 zzDo>hv_~^#zTkl`;muwYYeYJF4i}M?=U(WjZ)g#a9AWb#((HCn`Jf52zT+hL_M%^m zGqc%v`i8RsuH_q^5ofXoVqenxT0|V)RpV^p)QU+^`Tp4!`?z6@pRzwl32|%#Ry14Y zyfjH;{^Y0sNHFDo$p>l#=k@CGRzKpB?zz$A(Ik3NKT-TC#`Lv{Q+IfRid48F`S;`7h}~M-V|q6)J94Fy-mm zgBbDM=3>rHLDQMTiQ|kPqgr*3`-=sNzba1#fnQn+oWTcAaIO{dLWM}hk=dPUXNdm4 z@8MN8PnDp(nZI?t)#D_;vYc8q=+don&BhNs`B!S&x|3h*N>bT?q?`Qyf@@^gx-WK~ z`{4s|B(%MQ>$YkMy}q6<>!rS=6Y^@8|3(GxTEdzInbs|Z{+Z&HmO6T9- zrEz6QR$023l)rzNHoQeVE9ryHlJXhR#I2{1{x7-6hWy2oholsNk0{6k4oeP~;Tq3V zK`IzZJ^kp1GZjsK#A7j#ZCN~B63LZ3<69uoxk@kQXIs%12Jls$t8X*EbfL|F(B51w%7q&f`RKFYN0cfwviWZPSX|Kmgr+hYPI1oIbd2~T9B z4DWxt2?hFr2|Njc5L?_ZwYp8_5GU7OixQnBA<2;PYBSgak zhw&arf}ke`A|RF|mh#*BCEt4)AYM$RYoAd3M{37+P0n-zB4WZn1{Z7sB+t@c98|m> z2HoLmcb8R$QLp(lCGzr?imr8x^OF$ST`07>yHsR4*7!39=cH*VuzpLUimAvC{)0|7 zFA^ z17mbS`3+tyh%h;q%7VY%ffUf~WW_&RTq)&`pit}@v?V#yv?Vbwapg_@9f=cD5so)@ zT_tPQAEPdh-D8x`bh{9DAmJu+NOay1AJNk>bqZMPS$b)B5K6|&x41a2;(@_+DStGS zK6j(fPkF4xgpbTiN}A5qm`Eg=4#M0c(AG9G0Lk_;qXAMn!N)>v^IpKvr%%#%iX$KJ zc_+CDllv(y!r=Z?iWC64N1bmtQSc6~BJSToNZcV$$oWRP^96sjXh_izO#JBmpR%K; zOJQ%)0~I_TQBpGtml->o6e`(G6AraMI>ZtOTs1BEJ9W(fL-dO)BH$SwMqFTN5MNp!PT;W zYeFtH&+3x3kSVvXdP8}To+Ws_rUOOX?BBsWUNTu> zJX_|R*{UuHSco>l^XaT<`jXCWhmY+Ktusa^_@^0hbjp2g8x>rPU*^R`A!}KG<^|f2 zI86CE3d;4nZey&cFxKAvlQ-5r#)#{S>FTl$(zeQ^m__eKz%!bP25v%We)s>iW4iKa zi@g9uI(@DhXA;xA18)5#WBR@K_;dYxdgW6NJ2T~972{Wxe1})&&$wrr|n%VFy>uR;|nT8i8RnL7rSReyqK!OJ&b(&gcJJx1oE-q$15tj7nl=7Em9CO3R$iH_N1l&#hkoGuF>M zRwB#iq>1B74df!#^yI-U%7tw2fi2Mw+vV=b_)fS zsYPE*n)3vSlgY)_?c)Ll@FE`vQ#1ZMoZY$OF!kHwqsV={qj{w3}!Rq$1#DK??azU+Sae+4RizBIt~-W#+Q>S40vq%dXH6y;KJ zZh=#)reoa%F7R*IuHLDycP>@cIyL;hR&YeA2>r(SIw^|&WLa1KmfFxrA)GsuhCh>2 zX>Iotvt{Oeaw8l_I+y|%KnjK~FysZF^iYWX<7cz-n1~8w+>6y*1Q&_MrPle4m}GMS zKzcD<{s2#R$dFJJ6QA;${{3uXGt-a-!Xh?+iWwI$EpWf`6f2F{7B77%N(HRvhyE&f z`nj})3@vc7OAH+`85|9d(N5+zK}6RMG))Q5$y16am(*n^7X$WBFG_d1h5*gIZ2j3X z>0gkt4a2DT+|`zB#dL!#Nqha%S%6(eb;z0yGX?u6PF@@YYh4RqWwG~-NhpSlg5>5o z$6-GW2l-xCE2xY5ReC)FVaNHK@Hn&6k2tKzVYjmwB_{QifA*ci z;ME=G@cvGS9^)%>^Wz>)!srq+>i2)gJf>&uU_qCa=s^kU?xG=7Vrnq>OK150U6-C< z@cO?RuMSxm3ri|*;jYBlLlng(G|~TCeLN~zxxXDZWtx1-_1s6w|NZj?Bg{}4luWHg zJfQ6aq)(S|N$xS3yfcv=Ma8bO9fxSUhCUel^>E6|=yGbkX=I{(`c1_G#~nm{kw>JN6^i2y+RY|{6sbzXGQpVeg8v@57Cm&680;qz zKy39A^;v6KU8;@5Y+4E4ho+*1tU>-X+u7J7pK$xsUVTf_G2xR` z&Sh5^1w75_n4KkoCpY5I^*XFbuuo{d%|i=9#~&&P7LAs#wfP`8C|+Art3_O{S-+#&GNTYh zB6t7amDsDHF09#da!M5f?GjHuLL>6?nJv;;>zc3`!Od7wCtrA2f+&fi$Vi8{1NO=i zXLI9UsJgmT#-%s$e=N<0e*PP~U3YE}ePy<1kEl2zgrA^tC?wm?z`EPx8X zt<4*JtEFP!be!Y9HTaFSG#`30e8N}Mj{>L^JsB>4=sKjYH+p3v%!xw zP&>3h#`^ixP<1ucV&HOn_83*ZaZq$*j70$(`=jp_>)OHk$#5_(edy)^amhTjUp*Pm zmuJ9arHsKI-eaH^6Hk-JG2>ls1b%6yoo!k8Fj-M>j5 z`r^k{Ws$s)K8!*ClX|w77JqPad-fBS@V7{7Cj^frBcJ#FX9*j35J94kwtr-$EQsgJS&m)(FV0G2oEDgv&K3CNX$Q6(7R%Ank#J3KB|Bxi9Q2cHk zONJKMRfArP%W1p=+)M}80tX;<_OY6J?7-quBv4yAhM(f_e((4T^XxlTM<)1lhhea! z;S5F_Yc2j;)s8wQl-d|;3&;x^A5NT(npBgxF=E5nGQ~-?Jl1d4?}0IVE*BmI8PoP^ z!!9upX}9LK4J(QzRqF@6y8Se^FT&QAZ%9TaX-oF@z)5N!{XbiZe#=&veea_s$xn$t zh{KfBSGC_c^ClwFj#TYe7!Ta!c28or2gG?j0x7L-2u4Dp zCouihB|J+AID$Dk|g*^h;b`&{?61z_wVWEAU!Rs2)eR(Nihij3|ET`3tWKQ z_36}m@zj;LoSQs8lCkgBtoQsi=xb#yDgERWL}pL4tHb{;CEv*;Kbm*|o;kZ;ZV zO!RhEzr`vO(_x`?O~t`97XM6;s9J2#Z?dPp4dObSS!yvYdJ`q#a}$ImCVSLVFV*x# zsV_fo=tlYUdzKkwCx0|Jh}qRDy#e;?nFDR}vESJI>9nAw_}+>W*`VlQz^Z{Q4K+&pTbY(VX? zD4|>Me!z31c0QSzIK!*h6e%#Lyae1w$Ze zUO%XM31iaiT6bO~%m4TbzwT+4SuWlZmo8EU`!VIOkc;NTa6d>7xzvD~PY5@xJWb^d z?@ibr%86p_GSTFc?$Pqewvqr9Vw`GT+<;|Vk@zU7ukxHrhPZ1Zt@7G_NwYl_?XThe zjT<%P%O&BJvlJ`J44U%K+BRn-KESM|3J0_CI|XtR4l7p79@PA^#riY3_sEAXk%TME z+@vyJGF$!5VSs|r5JZ^JmY-vmnw4gQbmRdlJO}liUOGXHtF>JA-<7AkQfRr{fnOGS zyHtO3IU>JXQ?URMS9YDKI&xN39tMWE`F{D7`F7`ys68(89e|(Qydj>HUAxAV4`O%1 z8o8=$OB{KyZbO1iC&G^}{6?~67YFG*1cTE#h0H(w#A>-MTGXNnpMLhJap(O2E7_A6s^xjBDA7GrZNxzWHary8g;wm`>L3~|Q7 zX>c%I0+(+!`{AM;oOdU^6 zaHINYD78+|Bw52$(B>#QHD!0G)rEqYyG5>^{!TeFN4hb#3xR@z9_sqrfi7>L+S#kt z-HMZJ{*-&fxt#cu&tY}HyaI7$Ncypf(;&hpx95RJ+=FtrVLvyK`&T80u+xZQrkXlV z@ylSW_oagKTsPdd#kM1O&_a^8ek#Q7W=CTqpTi~HKL~3p#`P!pkD>qd#kXvaZMa$q zIYypzhU8X(5<~hKjgpfup}@{U$>CjyVI$T7tg6(3$*Z;C(sZtnr_nh^VXR{}>A4_T zH%fcf1mU{RB!YAT>?cE{UllVAtHqfYKst~;TDO<=J;il=pBJ@tRlnvpd=>@89u0U{ zDgRk%35}AcRGa>0sls@2Q_L>D@5p3lJi*QxJvwLeMkF}>7A>F^u9Lg}vCUUs>T~gz zMA66Jpw`^$pPr$!tMjc3HmL4-@182;tl&Kdq#iq);aXnJf*(0NO4Xc^Pt)7L)a^IKT#Rt`^olvSm>cL zF)YbNJP1MEXC39>?!~T&`11H^qn?8S{K!a_xTsj}3J={fwEq;B@^<|8NHwy{B z6h)O3)XvP4J%5t!`s;Urwfhg-O_pOo{$|Ie7BfxdUooKsWiUT-8ul8A<&eDAdRnRph!8?lZGLd<9=k~0McgE6jqfe`#(NN?jX#+# z-IIzeEvV8+x(fbzN71u@=C(a1&D;1>MNVsL-}*xBviuq~0}2UWFVQ8Ns1{S7aiOUY z*^F-)3{kd9EF0tA71M{BB$mki`X1;x)^M(kj2VjxM=I?s=mIPu4UGohc6z}P-~Tjh z`BggM;AxZ({T_yO0o8JLT*3;=#e`*VHhEopgJy%%7bpD|U77E7ZJqFOVu8=4tu_Ph z$&{$L7rmAwjogK*KJg~%P^sqTGdHLNg3HTT9fb*~IFVRH!a>muuux-e19Vi-a4Pw)i w#gXVd5IniFUou!v$9b{Pyvdzx?h$AWTvEv%VGQKW2#9E;nz*F5{(JNP12SImHvj+t literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/linking-account.jpg b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/linking-account.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6a6618ad20d0bbf54db4a30ae056d3f6f546d39d GIT binary patch literal 113729 zcmb5Wd0Z1`^e_C(OcoL#rtBirv1JV|sO-2*)m8`vQ%C?2G%VHtvdQW`vDo6;R6s3@ zjtBw)6fw8}YKov}tBt5AD2S+tii-PEmG`8*pZmLiy!ZWl-e_T*Ewh~Gobz3tj@}sU zM?&#;{@)=C!;l>QpwZ9Bbnc3!(HTqQ$n5wG1v%e8P%=7z*Za?%yF?Pa;5+~CzlFUK z!kOil)~{u%FiZSajY|6b6)KmOMRA-EzI zTml=mdVK-ci4i!#=CC;Uzb_EOi7%$ICa}Nxfn#DeE!y;}H09+xUx)m*&)j0i;Xg*W z(%_g4qdmxoz~HutFVJi>il&_9tG#~gxIM@lUlJ4)KJxI(=(Ipvg%SQJYsl1=k8al+ zR~dyVj0kIvvS3&_2@gBVs;0!p=)x3C#0Zjq7J47rDo7yqxO%G#>;$5>cX;W+waRuX zJ?r)buDi%kGXBdSB!fy($TRGsnAlvHBS?;+_d3SfIg%z*rS%VY740`)Fr3%%3PPI`K#Hrngv6;F4UyjwGT%+VAUMHRd;ms-suv z;k_-&7j_T38n|&Ew-F80a1naXyC$(!apTk%f*D^sem)$)o%fn9|8#*kNP1eC>39p~ z@x?K07eCfBjIxbm*D$i;;~T6k`Z`!wn($JU@-W5zp%xY_gE6h^Gxm0k&Q@Z7@g3xz zg4^gZ8E_b*V-6)NMJ-s^QM&jYwacT!isR!&*;4_hC_CakwF2Q$W2)E(Q%d;jorIju zQi*eT8bl4}wa(MPjB`xQ9w4GFp`zvVE6iWVcFZBl!qrdE$reUb_m~P!ZsW}tnr~4| z*ta}&?o=#eSSe~^O9>&{(fI1d!d(7CRBKE)ccbEiSkx_2fu?GMWx{b(pgbhziNtm{ zYQaPetN~1|az2lGqNjCrNRHgKzQ>ISAFV5$@xvv8`YQ-eq|6F>-eKn0&|a$Jt7Sw6Et*i8Vc)UU1e!_%PE)DovbIT z5j`Q|q{N{vkxUDw3xBBPx;qI(`^)ve5~O&fl<}&j(hG>K<>iYs|85JJMWzQIRTIVZ z;Db=ct7cgbt2*KsRS5fsbh4^{$kYiQV3Tu9hUnlDR`ZB*3i>SJOR3B(Y6d@(vH!>f z%a)R!v=?WH8{JA6%WcBl@CEu1`92ySp5}YdEA&VUoADp&DB^}3QFa!6FQzm z3$(;xOw`GC4s9&XBkk)@tX;Fo)z@x}O66-GTEdNcO%HE5PiS`A=2Nz&YHq?+wmp^6OB}GEgD$C@ z;W|^CnGjm%-bEc8!DvIm{6J?C%UOhdr(3u_!x(YAH}|1BiB*#};B+o$3T?iIm+i-E z+l9_3c(N^&2d%X;%7{wrVl@vdxE`+=dnujCcvn+4n2s`eY_~zS>=yQs@$F<`YKGI0 zs&v1D*9;X1w!bYg!awy>7M~@~9%+~dRqHG<41?RLH|^DioX|=vSOfUuW;MiWeR~eE zPU37sO-(^vxcVQYn^w1s<=iVgd^}iK+V6ZzH;$QUnX{pXv-~)F{RKje`QX+Z-_Q$PK{?M93a|$30v^eBQSe$}0E}(G!Wt>j4YPjxS^dVXHO*AuE>zt` zFI2GYjB3YxoAXD_o&8^(xu~*>9Yt-I{>`f~DQ*WgcVeqdOqOpPM@{@hS+ibK70F6E zrjgcu9j_G^u)0_^alDXITJLHJQB>W=s!<3;y%3G@#O8y__9)dZ_a71$UE-R%CDcjT$jgXW#8G-ub$fKyoJv2l!f(5>si9{YetuYhRB+xf zBVWe&*oPOkapUg1N5gwI5%);J`Eo(0JS&KvHLr+%&r7EtItFA>kVc7y<=ABrZCkD# zDhVRWl9c}SDj$a}UUd0G{I@pt8dNz0Uyd=0ZTEU{U(neX*r5ksq0D~45e3Alw0;`n z-jzjVE7;L~?BLsZCc`33b4bEnOH*U>I2U!^>V9@4V!c(E9Ly8Ep?4u!g^7KH);7<1 zG8$g2bLH3CwXtIG+T*-#f--a0CJUz*ajtUiVjY|=ynfPks%EcbT)6di(%JbR%J&}r z=UBDQS(_wJjKstne4o>28r#^JYqYLi7~|W<57n_<%2@*m^r14LwCf-AgNBIXkcXv@ zQDzP0kxFMI`3&*3(WnULqBC*ab9n>>*PhDiZNW&F&vG{-iBVu1VZcUVQe(n4UTdRu z$>7!E)%b}n*l`!eER*un-yWxBm+%ld+`da3K}nye%s){9i`mNU4gIc0ZFR|{n^89w ztkq4=7&9;Dk5RPzz2(P0zJB@p`9Ht3{razO-DOybPJrsjiJ#stVke5~vN>-Y?G;N5y zdZ-Pe^9huBHPn6sI7p;Vw}TZf=Kc2KZTDk{BKpCmTk?R@n<1C2IY8Qrf6AoVV~9vj zC>z_39*06nv$>RN!C4RGNXnB~v)`5@!>+V6<luJr{+{=}Wrm(Cbvctcr2zK+#ZZ{Ks2o_{2cH%v=RHLN>5cIIj`OeEnb=~!BH zgN;%-w9IVbYt+lL!EOy~yvmABwPwcW#+fSq{wL`1H#pQNp*iM}Ngw=3n;huA zhK0FDLSCOMWYG$1j&l?=QDaki!I^6**+E#5Nk_M^yIAn`7miVxlx}L21$`)oEf;B2 z{2si7RY}1?i&Mh+qX^nEryexqeFOGl#K)+FV^{GJ;{rN~;g=h=a_;mX^%Q+scVFWc z7ruTNdeHxJr97RVP}79@zo%UM_%|P7E!feu{mDW*Wb+uOe|e!qvDDxxSMP&cNO9ri zm&%I~+Vs#48|mW<53!4Dj*Kn+oVMaR@zy(W7o*3Mp^^)JhO&)ID@7eKH8|vgdGyKcFlsnXV;bh=-Va231Q2U7#ZU*o*OyaYv~_mnK>}m2p)v zF}0|gT#ztg-h*_`qRmfMlbkMgg%6W)ye3L`%-^ktC@;OLy!noL=qOkAEP%S6uuY|J zKUJkDE2w__1Ro|VA1eNEA5p%0`~=aeOnRtP;_GnEO|VJoP7SGi97Bi9O82PD`^eys z%Mb?;qIa-0{GgYV7A<~6$R73I+W&L!w)I<84N1}4HtNECiS~yOmJ`1 zn&Wc3`_&&wB?#5u`4ZfbE)2>6jvkC+)wZnd-xh-Vr0mCy(?QJcuQB|!I(#( z0#`sKPkx9F)|=+=dkDl#ZT3OhX)jZc3Hhb3Xx-NZFnkY{;MePU*lGp(a?A6dLOu+2 zXx4X_%=RuRIee#cMtkBT=duhsmDR||tsZM_G$(l9kJOnbZHU_ zUQLEHQuYfZW;NrHK!d5V=h%-!<`40twUpd?8y^j#_Jk33vc3`to~kS<=S7sb09zvu z*aQ80Kz)^w9j+Sc!=nI~npC0m=h);HECSU}IFB#6z;=0t2Qw~V3WD|~6;>5kkS6$B z6iE7N1%)1+Noeo`75X4S>3^WZJdfXpZcgsP57Bsj4uAO+6f|UZlZuXcf^hAn25O1l z*j(ele%=Bpr^AAkMN4y^R`Ekgd#x-dm~}mmA53X~?y@MjftOy!vyvf7H%1fq6^Ugq z9oE8n+kp9=suwI}oV9X_Q!RN`KFRm`hOv2*su^;y8`r9w4C*ZD`l-%CN|#QRC0!Zu zN-647z&Adkv#Qt<42Bj*xxI-)BUS`{l-{`lWvVQw&}K@M`sL>5xpVf6ZJ4>_)9v35 zeZJ!D9ebvHGHB*NCD+PGf#`K9VC?QJ_2<{Nk|FnC%Bu0hIfdN-ki>(`X&&5f1#Cb(^qjUmSTE^nB;LQ}D%*j!_d$os*!B{QiWes3 z*D)@Nae0Q~b=Og{P^8Y%=b~}pbW|T+m~(iaQSx{%v+{F7YtF6gRrJn!JW0tcQ{dHu z`bt6Irn!^UI@a3_6o!5z;ad)C2n*eqHq5h;w&Mr(JNrfnT^iVS`nrCZ%nI7To%c|W z%nLJ*Yu}q>L=g>M^l;%f2Z?(Qt@INI#@Aoh@9Wq?y*C(u9BP|imn+!R!kssS=eKYv zpDe0LdvnHpOpdP7z4$>oNHwlk=xJb8p75kSTp+yMjAiu>4F7EvFO{1??Rr7q zCyEN|`e^H(YE3!~CD^S55Ohd#oHZ@Gh9PVO`MWF%MOPHP`*Jxad%L zM2$hvC7}S4u}<)ma3N$2=K{6-z_Z=NzNHi-@NC-Tv&4o$Q1Tp~qf^8(4KSOFHQcg~ z@~fXuG`Np{!TR-*qvOP!j9*(XZO;1c;%dE+aQb5j(;-!V< zDBJys%^Iv-+|ch`(@YOkEGATAo4D>F8N5)HeW*1{4ZY{OeuDu#zX^jNEeGOdoHjUv zZsJO&`t<2sYJsV-;`HKbg<*dj8zoW21M#H%-f)Ok33@Sl`p6cw6 zMrBM~ZjBv1TE@b5(@va8sxMjrs>CS9LH1yrXZBmv1`&*{X#Ji+;pVP&^xh#E5I z@@{=(K5?ia*KBgfdcKEk+V?yiw?n*`@p1IC-NBt#E;uipf?al7tS~DfGl&XGmXyjl zJ7iWEgXd?*8523rTyluwCPKl^O2PvDOo}KU(wDR$YB|`h&f9Y1YtTiS+=t8o%$SLt zb76>v)hsmK(n$=khI?^o)d^~{(rEzgsbcA9;9&N2nEyOvGW3#SP{1jP6W7V?+G4a# zge~!6zcwpW?)Bq0$9qufV^pOR=THa6$nGh_DCh<;*;=4GkX0j9iBYDS@K`Lg-aNRu zi=*5$L}z5@adsMGStA0d3uZM562pG^*lw%~-ME8&ukRn-9?{Ji+#Ka@nwf68mYz&6 zfZQ$1;HR4OTV5qHh~;$l4Sa+{Kh=##JRK)@TE#H^4r7+~oA1xS70tQCiSuxFK>SiX z1NGoh<7@euMQE>|po-HMO7gB@8*fqGOi&jo>NibqV2j?4&|>;k*w(Lpz3wr;a{kcA zUoS2DFEFbmO(EaHnMYuJlj16ZYJ*;A8e^`s?1bWOMC2E+)Nh7tt}P9t2Gp~(-s)?$ zRC=h+X6ayIckK6MnvC{7E|^x(n_bS64VDY0 z+{f3E3nowTvO)&%c0hKqp+p+CeFS5wVJoZs%-E41Xjv{lkQCuXj7zrA?Dmj$;Whkl z3hKp2cIIZ$2YPw{jhb+dj+d|=(S5I3_EJpT!fLL?0#jOejUTnPojA3EHe3KjGCKt= zSU5}P7{`CA<8@*_)N&ef@_gZ!|o7eGGIQ_0Hrr@=fN+Z3q)BaUH(Yve`b)V7~x4NC~1w)@Va1} z;kOZScs2$3XB~7Wc=cU)p6W|FYnG_J-|#NJn)0R6-|gUs`8m&E0wYe*0_bhhwY%1l z{B(McLO==pgzRXXx{gxKo~AgN9BMJHHC{#<$x;2Z*ShHj;w#?{Y|MV6q{CTiG8oXy z6R6_2?5&at&eABEgwqAaL_(5^Cox|ey2S_uuj{vmHgd=AmsDg(0Re-@w++vvq(I%OwHvT&LeiKoEI%(#$|`|mXQ{$ zSnQV^Jey8&VrS92Fv>)QytR~Ngt=nOymx@mlg3)UT{r)MY5vX`KJ$M!Ek95p`lSc! zqP%I_OZegC@3n=FLT;iHr-m;6T+f5-Ao>T!t?7zOLi-5x0N5f0aP-`#on0T=!t$n|Q%ZB!x%=TwCxE zTU4TR7XRwTUvLY%r4zM8pcXRORdj51KYL+0U%ZMk&EVrr&D2tP3ha}KMGZulzM~F2 zjv`R=X^DwC4O=3#*FD6JZy0+KU#Bwc_oXJMV3V;fiAha0P_|3i+dh)9S=67CFkq7q zv6`HM`5zbwFHDRe%90rP0E#YBBN33 zxR~!`d`A`i3|LRy7}`)f3z_yIS1F&RIYlW?`Wxy^IUikB zhBs14m^^VwoN*goc2;HeCo2uTLT@p7Oa=<{$}({@G*W+&F`0B0<*4S)pP$2dBXm9~boOCHO`2*;khOrWlAJZf1S zA-_olHP9+#u4X~l4LNarI#^FIcW>>4Z&gZ{-5}$}cl@BzVC`;S~ z#F4^wM-7z`xRqLyJKPIs{LZkl=iAUEw=t^X>ww2Yl`l*oNR>T7H*8HaJx)>?3;YB( zt6yW6J&yvHNtC5v{&-CbF*JY|?CwS7%0-mIYS5Xq?Zmp_&wY2=i-$)+EZUmWkCcreM!;DZfr?CyTHkq$dnQ}>|PzO ziG$@Jq+w?r*B1Yim+Wt6$mW@p0wXzX0%gz|5w+2m&Cv5tjWAWN?kUqWZevtP{tdCL-P$Hd-vgaA& zsVdj{C00fr2bIUEp4S2upY?1+5AMiZ9yOE|h6k4|eHFIYOcX zFX(r<_8<2p;vNOq4LSm`mn*%JBCucjgg#z0ddqHLem?Lrn01^V9Gk~Ws#6J2fpX}y z)$AvgU%fv)|K7Uv{}9k7QFCobn8d1-42;JMFXM|6<8UCa(e|h4iQHc58OKwY)ZAp! zWm*{8h0agkqrti`tbIwU&9!oY=oHsH`2%|3#61Tf$4lL=nl+{Mx&3?ZX8{$EFtaSM}=ThCpX@g2DVb) zKjy#1UYG{Z!^MnV5F-CA=dY=uqGSN)AR=*dpqgi$glb6*4fX=1$EgH?sGReHD%U+L z!#q)i3$%*;ps3z{t(-wmq-)9mf{PD z*v~rCD8?QNhY=ymyZ{Y=&qWn)-)bqlnDoBY|Fg2Lu>~I_1$g}vZ1SLz3b!gnrVPKS zY@>s9=qD(DtPPm=!}(&pBX>^5#fr3eJ;b8ABEGpY)L~_ z4=Sc@-_Z_RdbHM~XbT0poVCs?a81jGxba+u$M8qhYmhRcsXkABLxaW5;WBc z^eWflaJ=CpggwP&rGmoeCWKhL6By@xsD+sUUudo3!a+IoQQTTJa9<*nn|l zdME((I04l8f%0MH^ZV}9T_=^-g-rV0qZaPiz!XKm-6}!iUE;19C?jAz!{+A+685cT zRuE=&QsqVeeUsttZLl83wA=`>4-`1zA#sA=%5*H{WjAb*2>(4{#H^GITTO;r-HfuzJ%}9^ zC8SK}@V6Vc6Y0#W*m4_-7BVRj@VRFsHB?GUOZ%#9OO2=u;L;sBZ1c+@SvG4k#8AcK zyIy16BB=7?zY5f51)ipD^K$_CL~`dnQg%D*NvCcyIG7uFi*kL8g*O(keaqQCmo9Z6 z^QUy<7C%FBrq-t4(oE<0YY7$>iC+PcykCJPbS+nkq&5e3>^D8G-P2(>`vMpO>~-Nr zlW=Mm0xSs3xU!I~G3sptsXK)=jsfu4sH_^mQFFhil+MywivPc&yd z4Xp1k2CS}m0)))i=U5-IZljYboM`pPm`yR1FW70qw7gd;5H+n*F#8ShHx% z&X9Ilauo#BNdQ!d0*^`XA@<47Q3WJ5R~=Pyl*tB#wlBQ z)d#U|;5M&+b0J7*c?*b{U-r+CkD{Y%wtSZV_WrMX_kR`qHfUCGWr*G`6rdqmyi%*M zs_B(~ZD3u8%!(;-9VWVl%jCS!ODd?~CI_o*w1ag}#1o;4Ly$phc`^^uBAK?t%0@B4lTwmX~1a#G;$nqf&m^pRM==Agzwn9 zOK4UU(n1XtV*ZtniH1ySsAQ6c8}~_@m485IYxl4ZI87+qPoR^e-kYrU070mU8~0S% z?eUf#E~po5k}o{6%n~>I;;1s#aWuCB6qY0cV^)Vs%|dXEZF$B&BinL8LlL z8^ls6Sd^UCJ){gno@1o^q`Ez%V<+$vP1mW)`9;{V%*}o`$*|+>uqJH?RgX}MM-qaX z4tyqQ$_RFKat4U0UdC0%Vup3wKSmvo{rEiQsO%AJtj~zl@qtz(%qdpy2TC!v3l%)7 zEQ9)06V-2w9+wlbmvE{gYNEIrl@DNbxwIDHr~3JabJ^|a+Qf-3X@@=`zu{0hRgi0IdBu)Ew?t6X+W z%DHe**+{o?JT6Evt^CWa&vSqH@SsBjx%hwQN=LIRi9+sL#s!OlPNPTb+KsPnW49^8 zLK@%&yWGXm#S#i=DSQ7Mn``1;4NLvB%4R7VtoOPQk|UT_bb}gzxRo90B<@~F%AoH$ z?NQmtVjsc3SSJ9gZ-)Y|roF0<(gSK}1t81T0yzY-kXQo^%*Fn3q=||*)X9zj+eP@e z#Bjm31_mM`=qV~CGXhKdoRt1Y8RuH)>HWJ5K-zGAhMX%vBEmvL;@Isj_mOZHCVr%J zkH(klILcx#s;KnG5w-%CQKlRHp>sE%M4Dl}!lTOBZ5&5X&0L_kr`WNd-RZO_SEJx; z>fmLfOv+BD^{P%Sw*$)aWqp#I;Dd&X`?G?8crUG=HE$2{bzDeh{=?3d&KV^~)2QEz8d zh110W5-#SRyknnqSczf|tv6sh84>0!tPfxfO{$agPd>%E@sy2)s1>ibq8Cf%Qde*2 z*q&03EAJnzXNf*--VA(+hLsh@fhZ(3w|d6Ex?>xZi%_9w3#wdFvtO$vKF}NZ? z5>+lw*PctlHbL)tB$wSU*r2ulCMJ1U=`X7xWqXw%Dst!b0A*fN1m2D=YG`lE7}a*t z$4+qmaRNZ}-Oy{UNq&v>EP$ZRZwA7svQ+5P#m#tv^#m0}5Sr4xdA9k{B$&v2CPXk9 zLD%|y9CQ|(u4|a=iiU%owDYMoi319ATV4rjqaA zE4A?8YuCybwBZMPQ4J-I|A*3I%Y$g+oH@-C;*+b43t4W)y=`oyWh;;Ez(|vwz>;1= z1?^0-$+hzTTbBP>x ziurQHJObgC!H9E&Uah53LM;|b(HlinK;w+#Nvv2de_w<# z#k~x!2+lNXZLk#oR4Uo%NJZpdHjwSYB5zGd5Fe$6p2%Ga_}3(JYIQ^d+cEnpI~Hvx z*+1>TfXVpCAo^!D?chZvIdOzvF;m4`BC+#`Rq?$aHzS5s^GspdM~>TagVh`{6rtT# z{((+JSy!l-7GPY0o4!dTOc(em{r$`!8XdH@w!jDV9oh1|K0*cOTYxqyW9xA}zZVZtbCgL>5Eeomyx8yXfwo`b9Mdt@R)nvlEL>_a##W7k#`z?{Krn)} zaH5GtZ+6;;ueLL;I!w>hVOwqiE1Z#L;p~I~Z~`WeMZHoQ;nsaRe%L(zuyRJf z^?5Aep?o_DXbhxBJfs=aF7!|@p zG$`|{BPlbLeON6W_yl;PA(P5w4+mYV(|gV`3NV zA=p#_b|e7$5EqgCZh~e;_DRPp8?xry)=L3wDPBKy5fym#6KQ>+4H^qqqa$k8TZY$j z&3^uBQhW@wmg5KMuH!_Q&@^lwUL9_NAJXs|bS?>3=)K8RoE|9bzw6`D8)!2QnrOUV zfzvwA47^~(xqk6OitX@gy?q$cc{CrTJbX^6Tn&S&gzPtsbou4gH}pmhQ-&>Cm0Wd4XtLT~2+qHr%S9 zb;#tFGnDijZrnwR`o}1E`4jZ&A3w;Ps7QkKXf4ljVhE22Hfrm09XI(EIvXBKf~@1x zNz@W5Tvi({dyUQ#Swn`@B&5N_4_07k5u-y>7osB1V7M({CFz9ZZmaL)irpR@!9Gn*c$lY3Rql+T(`VN7hTxB;4E-gw)vgSp2q zEY1T*yazp4M?$>^0Uiz1Nr1T@0Llc#!g9z#CB5jB1SOL`2X2^^_D?hn zyq#)Rw2tBZLzfTXHJHRQ+&Wx#ZuM5S3Q90IBz*P}peKlA4F4$JsPv$AWzb337p$*qrv~w1xv*_c7GKdP7w>*yseC@vEiGL}T%)d4f$0KYzak>GO4-VAD~? z$KjoAJ}5!MPJ;7(`lj=VGrUWtj3=km=s1}ADC-v1azMGam9<(Mi{l%<>ndifIoNhE zpwufT4Jk?UPIO}c;W|!xHsx7P80OIG_xcX)XbDHT?XH+U@QLwU%ZP}IKb=wWQEC-c z)#pz^W4qYI4$odohECF#a{HTlCCx|2O+>N>3-S8n#)JpeL|+;Kb)q>^J{h5>d1g-) zCgH2;I>yeBi~+NO!sHgUFxI6Nw+?2#K-F3liRZ5@=Ru9W)^C-9k}nS6?~Jd~NNs`Y z#kIYpOA=#|d)#wZu}!^%xADF9*(a65x5%g4h|*M9E4b&~z0qQ0IIY zOXc-p&mozZm$MHjWnR1$R3_zFg#SH&+46z=jWFQ!#K&G<=b9ICX4bdry(6FnO$RN= zV@6wFb)cw?(D=C-!&D_41oY*~LgnUiB;>eAf&am!hmLfD`~w~ij85$%Howyj)S)U+f;7nU;o~l^BGQ-Xfsh%axZ#Ou(r94B1cMgILsv zog6}JN5CE6&vht;%u}NVFC|E6&L5dC+PGqE^am=WUVRzrM*T0uHM&vA^@GrWr}~hPRAUWn!%k{ISdv3 z$zF-A2{*2fC|mnsEy^T9^b0DXD_BAkJEZ@?5 ze}t7FKmUam0AakNyxg#r71{Ta4inQ>^v*}hLhN8;E#qd8GS3hCeeYlsfX@+j-ILnnWa1as6W$0#o~VoPr14Xt_w|SXcT&r3<-v&GKQ|ZNd~NB zP{l((lN%w=5#?h=$8@9cuk*NW^ec4wIW%;}JrieYA;x@;)9G|9c8Q!y2aX_D)P<#y z=5=|Tair~dxgaf8M92an^!|sGDq>xbs}nmXS?OK|f>z}1aF%Xc0j;HWS%6ep{04*S z#_o4Djt8H{L!`6!wg2_IoK|oVpBSgtDF2JgbG_~EGa2XRS$eDeybTH`pK2@|tgC@k zOfmF>3!tUNL|wS72Tub&2<8R_MFFGqI1RfLQU=nvKX`%%${V$5VK3UoY%l*T^n#*2 zmYU_WAyQhUfeNoTbDaIb3%b*T^)^>a6SZlwdPtaH<@k&yD@CYcp+U$NV?Yp34+BXY zoLRtj=+Z$0=q&2NOOdmPHd9Y7=LdGS!&D5zV#eg)cAXIg>WOj@nSNFn4Q5@^q~^j~ zrHG&&#%s?=x zzk?k4NuK35{;LHD(%^d@qbK4!#LJCAM-mWb=rKycvWZYyFUYSc;cZ-F5$Qxje$<1MOiMfq^Z& znU?m-U5#qWh#YR4F|d-mS8B)A5<>G((xZObka^t$EY%Q4=#j<^b(1| zkiiDh(uoWR{n{^aHY?wRQ@Uax)<)X1$51> zR2=J~_dLbbT^dXpGm)~u!7F!?3G+fm2(2+R-cya#Nft2K@Et-f;U>k5j3Eu{^yXku z&lV0iO^t!WoB`;})%fJH8yrL=RK|_@_T3+Mtx_-lrWi$*dhzEgNRB&t+&DUuJsoCs zi?jh$1$d{)q)((6G^lI}jPo*2DXZ%yxCs9SWqMY<_rHXBQ6Wd!4iR}V3X1ilzLyYY z9$C}_r{Ykc*7rl383-CsWgiGay!6nj@wVbYvtx_vWwuQcBG6# z>7pX+<38T@ji|NXfpInJZX*=Dh(?;8bRO$|nLry-){iejd&y0d5=o0+)2UW$dT?X4 z4@y>ES6{DFG0^;11ECXaeioW2Z5{ zIrdUn;s|{oX`7!l0&OOYoqCXd1e>lAWvj_xFS_PUJ>A5%kLn~c_`$z7v0%4Gg86?a|l4={b^}$9|%7_9b1?g8|ZrV+tM>7$1ovB72#_`EzK%JEby|0AAdM zxc2N@KeK{QT6mK(jEP;?4StM2TKY&{Cq6*c%+P_EF2nM6o*_QD4`EVzB2eLOeb`&& zak?+nG^B(;X1BbK(|=L1wJPVZwP*puKXFkPz5}~F(ZD#8a*NX7r>ocs|LFA9TZs~A z@A1ObeTb(nRf#$bkI~V+6I~JM(ty>s5>`e_fAR*R-Vj=;zE&2(pCWjjEDo~Qx*oIq z-F`DzspGMekMR68P)k%U2Bw`vNI8D$HFjL@Hv0O_-@nB-f0(VGeDTHM!RZm_%-jsX z2mMUwW)Qp@jHN19qv6LG^X&+DV^BLt7dqCHXh@C^XhA{+7~H#tYyb$!#OSWmZoOUe zjpI+im9BRhdHaXOH-DcvwKi~t+xF0p`;It&UsS!+|Gjft`PO);{e-}&`IYl+Im5+S z>(?DJ?F!qz-SmL#C^~Wd)5wjtzl}FN75?kz{K46emX4w|9zjooPdUywX4c-~_}5oz zQSJ(#I|k>j+~0Pi_cJH>`HTmzN_rD^FY8LWwDfMELCN_byO6RP$(*~Ds*AvTTu9$q zT=-(mWBa9Jn|_}(eNTtzy9n{Dr4uB%(c`~2O8j_V0z>Z_ar2a5&%_y(cgAS@Qc{2N zyo1O8X1C(>edFEYdyN62fb&82abJt?h>GI3=4<8#a)vM7j-B6jc<266C=IzY$C|Id zJ?@C-+DUho4GdkFWoTpRzpUihEQb^AUpp7Xtyq6=g|~Y!KX<7~qxa>4&|e+Pwoms+ zem1V=>D2x2sS?isE8)3J>UE{^*_Kh{loR>mtcXkA2UZ0hi686f^f^V^x5!bQHrDUG zo!DDf5NJ76ww;{yaTKkbKk16q=f*+vQ8fH5JXqq>{fQ?&hdPXZr2iLteM|MuQFNi@ z%qPFo&*-^r)jRj`XGdHa^ZKh%@J>b#g#MX2iaIs_Z5~Cw-Yr4iu^#D(E=x00_f6du zw4f*;=&rrdR!w{AoUaaCxvxI3*_n8`S2547S7(+|JL=zIsVw^zfE622JZL$bL`@bP31iSn=Wj-KYx?+M$y)seFo?9#^@9| zyQke3R&MmqoiXzBw^8G7B6uz9C(U2LKVo(6@Arl4Z)1C(O~s5)x7wW9 zKbN$g|7bq4ch}4L4iC(BX8PS*+4kd(--G9*+_SsCG@oy8QqV3wz+03b=-xhctB4sh zu)LR;%9?tEE=0>Cu?QwGNQ2#0m^?d5QsXowvqr{Ehy^{`4{W(tA5+#hy{PDSN@~_l zmCGXOL~)v%VB3%~6xP8h5Tdo*emx|M+jIEqs zaeE$5mJ68tBNJGxm4}3A{2W_Q!42$}hv;XRC)S3Y&N0v6`9T#kDW-gn6N?#F<0dwO zHl|T|vY+kP2UUK~jy?4zy^=ytsSzYMejt!OR_r7@FeQ*OHIfd}J*Ys#SFj#}%jV=_ z71-yEm2o3$ec>#&z;(U^hGxcQ|yVcKijf zhe!EMH0g^+x2Q?coy3@ydU70aU$^u4S}Hrw@css`Jbn`ej9fqj77;KmPr0c}Ht+{b z{0_T874Kdvms{ViCz2Lo8AiAo%Y$j0txliP??tR{*E3gs+kTzu;jvB8`LnVxilF{< z!>p*AlZjQNL|BTzRQ$BV1SWI^*Y*&_;8*sifmj7fb?{)GjqI&{>ib>&Jo#qDn4VuP zmoDbc7(a^o#y{bm|KZY$S1W75R=~aX(dV7Vk7IH}lP|=zJnz^M@_Wu#&c#a?woGuG z`TN-!D}puOxgI=vw&3jME5g~PGbYZkc)8_|CAm}nS{NGga_9U#_QCI6CZ0e4tx5U` zr|FkJNrd$tZ40*YS-P@pB~yW|HF=vH2ql6RDL_}dgZp*wsoHB z7PA9;Tk>ZQSNv7?Yx@Ri$zodYLo7PSnk}F4y>LIh=Iy8Zzg~<(pSWR-k$on7f%}{I3Uugf~$OM;tCMBwYF#9iB*G=z9 zF&IT(JUn$%yxvss^6`uZAOAiy@M*R(XV)KzpY~Mz^ZO`DyuW@)_mg*XcJJk{UD_l5 zE`R63<+C_BKYo91*2~4~RWCL>7YE(z8JcsoNK+Ai|NCfz58Hb!^Ag^z5BViz|LVKz z57mBruqhsrQSY=UiB^y!5a8R#mN!u2i@z_-dck zcVFgzh~4)%qh{IXOvCmd6QLl5J%~^19 zto7vnc3 zPN`|YmUAL7Z9x4?D!LontTP=k^wsc_&vn56%mpa+HUcI{sxe=!O!@>ZkPl_QIt2IP`~ytZaAe{!IGX z&xB5qvb6)qk`GjQiHK+bgUGheK%s+^3D9^JJp`t)VoLU^3M{W(cun?m%njtc9~%m= z`Zt&reO*6wj{RIY*$+$>9QO2wD0r`ivtw$naB}_EAc`E1MpCLX6M6EQNGoc`@i%0+V@;msOe zFg;zxPCj#iIBEY&4q7f#u%A_dE0o$Z;>S(;$Ux($YYB&Gy#|(B)Y$P<Gy(b*Z|;2CHR=eTIogQ-0Yz=ubGR!yddg$q^yHh!non}MqIX=S<7 zhP+CFT;KnHKeI8DElY_ookD{`*(uM_W+!_jl4?*WdkfEWR4UaROJvEE zv1CuEq?)8crAbi~Nkl7IN|FB8^!xsn|9QR6k<6)K?z!%3`F!4&Nxpcap`g?98Ts)| z6$|R4t1+XIZJW=Xt=_)(n>BZfXNzo=!-``W|Ju7RFaW%RSCW?FN%@kw{hahmQ_PBE zTJi6vYJyI4bj9S~|3>e1zoiWqXH9%9i%q>Z{>$y%{|2rLZv9@5xGG!@9xsT^wDkWm zGTow<)y(-RB{urXWHeu0P(-=*ByYu!RdL>SiykdDcWZU@khMLNxLDkXk-T_)uEAPq z>YDq$|1SQGE*$%fetuSa#i{z*8R+%CuP{M+TJ-6yk&XesF;~mq$TxqQYuVEFc;S%^ zZJRqDm@cxI@5EO~({OoeZF^tmyz^R*q=IL0O2dU&Xr|HOvrtP(R;8aeCbDgnHf+#h)0?VTpe^rm?<*gi_IOy5+ z8_7=HP^)@&D?xf>Rl;)Jf$5*?*ZydWyXEnteZ|6~sX8xy&To9lVGo@OiBB82C^lGj zT3zwMUk*kE?}X*fgU7YqOjRTe)U3X(ykE4Y@9}kgE$--3(GG`0eB4 zHCWe*FtCaj8bc{9fW%5AB`*yIHqhSgf#CQJ`rW6(!4-*rN&|tKvA4(yA!_xcixM;b zx$k_&5VpIE^pr1^!}ClqnbR8M1*#P7xE*I*(I)bZUK)w$4G5OxpIrN%7DKaUm zPm{hF#$upYb;V!soGzxDU;`UNNnp5Fjklew0jXaALjMyfO>W*Jc^(dLpwI~ zC(P(D&o5nA4=AFscp=OQga#50NPicH7ZODXjJ`C(EYKSnFs2Y`Khv3ZXMVBRK3psD zD$Kh#>4+;kE0Tqx8FWRn+^A?6ZBP`}04v z#U*o?tG<%ZOW5ZmsK6dQNDC+U2=f{%vfY>Cu5(VQ%qtL@!CHGeRu*J#& z@8RD_>_4rZyC>c&J-Z5mQBKoghu)=H!13q=O@A#iCbWITrNU*~aHyc8K|xOJg&wxy zK|I18+Ti#*el3h=z_c@dkl5qFwG5i^ef{hs)X>v+ew{bfGVR@R%J8((ROhWyN@woe zwgm<74wt`{?lm?O>v70?Ky3K*apl7^`HOSAI&SBDiC`^D+5T?h1J?!W_tKi}7O_*) z4;^@He_^pAd-lX}{gdW$e#Hg)+E&};M%v_HW9_7*FZfRy6_-n{xO-g=C z;KNe0vwtN$Wh@yyljOP9@PKep*h}eorzh3>-p-EwMnR6pk5xJ;-9Kg#X4&BwG~Kdt zwsmvsiy3cqM_VViOIqhEzM&@CpCoN=5hQ8jvnluARipSsY{K|x!X*C2b*AlRH~t&t zE%X7IB7YCsAR`ZOj&L>M4vo0SQu-o{%yTF=dZ2t|WNK6I>W-(Aic#JsAA@?I&;CX`CuL;~ zzN+=_%)UNk^XRGOsPxI0#+ZpYdOKzm0vEj6m=Te+p>=Rwi`KK(nokv1tY$yZ zn(Np3_ zlVp)fW?eX}CQ|8g(pN0AghXuJYqkCZ$KSy}cppqL`e243R6WsvyYhPc)mQmzvw@9M zDFbz&0Z=4Zx02``?%bs?hlFw0b)G^E67!;6$syIIAZnR6{tDk+`Hr+_7g6oy4-N+% zQyje`nC9)I$vy@!PTuO6HBkk0d-M8P@44Izt#h9GRU(u#T&d__S#jXR`qNK-C?&M-T(bUt=Bp4};TcYWgky@; z$qWC$R9vXY`RNyL{wB)a_r9ztP}-XJjUw79nqa4zHGw^Xpwu^v&g+`?d#P-`h0VZQgFi z+yBqq1zF<{&%Y7N*%WH);Fn#!15ZoIICCMb(Z$=_uI0kHrT1j_{`+q2i`HLJET-Cc z+#OZ-e;+jH3{|*f|3;H>?|kwcm%Q)TT;Cy`vV=A5(BD4Gf3*-Qy}>^TQ|rWgQNr{U z5~j3-NBk&TgfH#iG7kj7B3$zeeO4Exb&lpP&JKj->R_2rbx$9-X^g?UX+b7!y4ULBtbn~1;FH8OYVpx=>aw_=vB&iMXIbuzn! zT|B$@vF201Ve4ksbsLUayqGQ0A3qgw_Uvt=)`(zt%DU=mwai7{ z{>|QO@}sYICrGr>9g!j-M0j9HY6T6d3(OtwFHaH zhy0oYlTRADeel*xURbYXpB2dSAgxti0tnve>*Ly!=dT=o@2`l`l=y|0>H* zAF@4@oTi|lVdbzEO>+leh}JjGzC-w0_P?gNBIhY1mt!^n+F~2 z8#3C`4J6k`r0n^~b~iA&gobtH`v`vFqTtYC`4?pnHYkOX*V&vW1;=f7@9)DuyXJ_k z|A^Vx`$S5$*oQ?C?=>=Oq*@$6sl2=fGMG+K+5_gs$v~>59m>EQ5bc2m3M9=>FC#OJ z97u3rayG1@wHsuF;CBkSK{&%`%zq~v2C|NX_P$o)xS(kd8bJyMq*ONDw(2Uau1ahZ zc0?%q3Cv8|7vzP;K|E0KEw5T4IV7vyPk!YL5~kfkg^OE8bGwR_V;h0s-f|+yDd*L>G}lY3V&Lw;O#F zF+Rx+GmefG?7u*{E>0=sd-3+x4G-oZ4*z0s`8ZO@c!fh@c% z0fawu`Ij@u!K>;$i3l+uxdw7hc45v+G!HVwn2S23l-EJq^ko!@?kq}4I#G^{aP5J9 z5|Q>TiZJZcyE1@=ieXOGm;k_~Kcmu=#oHd*xTkctuMdC$4yG z46Tg9meB81Q@$r6!6K2tXe3;=9PK5iyG_p9J*OoD5L^lvose}YQh zTiu5b-#or0W>e?zDCeKF@e@mnmOm=UU)i$K)aF^uT)HWHoqekPwzZ2DJ=ZA+TDu;M zUD_gXKu=3A(S-GQ-&?2I(8re7^`FL0oBty{f4<~_CEHo@P7x6k=IZP9#xBp?V9}Re zSQu&DsGsI`pmVFVg}>4Ik&ef-Jlf35(QSQWPDXnfgPNDm2068^IO3l37d`!)-NrTf z;=cBaTsGRXk1pH>jg5?#%!9sf%p04Ik}SwW=VDszG}cG0$Xq6;xXx`|#5L zfNTL@&pi4`?bsoM(YgN<#dv+9_F7UySYF5a|D;gTcQXzWE^bu9p6^_2tD$duUTLc$ zG|e2&8G(1FOpQWLoCckHuHL91b=|Sh$VG}9g6BRF7tDHnyDz9b zGr=0st$LGH&^%pLdvX|v>x1{Jdw!#nHwv?qp5Ly|x%nmL zfNtTISSUr`9ZZ8RBm*j&$Efq>#WctU@v$?24!+^8b}xA4v@;bN%2e%J$1iuMcNWE)AQ^6jVt#M z`E1%S74s3OH1tWRT!nvxI)Dt(_W$?-#(o#F>xS=EH}kz-~>-r2#_dGiGBg_ql`Vp>}NR z0b&SscfgDh04t}C1ypg3ret%O3bpO14?vLZlp;Pk3Ri~k*$$%pGeitQnZRMtsBSs> z_}^_8)bhs+f1~a{c}-OP`r34P!#W#rQ%{u=^Y)9KuF&X(M z{o(Dkdbw+Bs>QL?BGWZX9r-&}E-1??C>UCK*4n0}WszQitxLY!B5|usDD3s88fR86 zX;^%@A|%`NqAu&_t>%H`|8o~MZU9#63 zPUrPMJ*-NZS$Jn=aJD^HL2gTq;c3~}-h`60=ig85{FQbMnnl$Gvi#DJyeYO?A<26+0`lgd>;Lb*X`YJ_+;m@4`ZKA^8EZB%qECk+0mM~)biZ; z>DQLevMXeG@T^Vi{hsfj?Y0{V-Sg<(nC<4Y#N@5ZbageA{z`1L*w~-E&23e~hL5ZM z9aRZi_|;*R&a(RwIuCS;LYCb0Y<=0C;HUXRmDTy?No3dd{V%(ne17h`#j-Fnp|v(( zQ)_oFY>m@4%?oU}Vv_d2bS29%U7;dEU8k1i?EQA%#yQ8i#rLj0p>7n{68rYx?c>!~ zX~1{rq+Qe%V#eT!Y6Op*Arn{%!}6dGDjX*Y_agKn40EUj{0ko57M)jxa%%p zdws@u-mVhhWD!mL`BKM#p0dI}`dbKu92s*BryyWWxI9i$kraDzfL;qIwD>H^wPcjc#H%S7@feH8WaHD)r9dv5aprA<}puGxKurGXmWd$Rp{S z5jEgD2T&aD!H)yUX=ESpe9%3Zj3O_VVSghvw3zNvdkJ%g20Im(rLM68_c>LgmkGKw z4S{toPYXl>zql$qJv6TkN4s%->^f+Cuo{S{R~ks=LWVtF4uUu%{1ww$!Ar69DpB%^ zRD>;q2E7}Qe&9~>CV5l6>q(VWV zG%8ZN$Cxtx=MR6wR`rvmhUYkvpPbW6Y6LmAcVzq@A7RpqvDvTX>;;Ff9#^QhW-;aV zdr2aSQD+PO3D@5Q#?xqmtA44TQrE#%zk+kYc>S)#n0N>9J?5TbsbD}$j!38@(eOibvHx^!7)Z&v=*T6lD$zRS>_ zxBdUx<~wXGeKJJ!Twk61X7Rn}x6gz+4D!b}{Ixx2G*6>{a3ejr)8dl%`?Se8{cD#6 zs&jjla@1pO*ST6;Pn(+(5zILBFL#A2zwk-&V*AC~_5l~&t&-M1+a|vL>faj1JM+@* ze3S0oG^^oE=l4JR6R{dCr|o_fm}zO;FbPpz^0gts-LycjP>r8zmN3hT(BAfSw@tNe z&I1{mRtC1bHbyA(i}O{t@f0cI?e{a5hFr-?A#q=LQ&k~WZS&fWsiPg7??{84G7~zk{UwGHHA@g0^y3B!`Z06aT#_fNd zr7u`AZ0pKc^#1fYi#=tt>pmLR?z^#TaTM{O?6)ZnCodm+vYi9HGQ2fojBNp-IuZ^26 zJS%S`Y}}it^Vw3`@6p83Wb*BQSIb(6IX+3%ICkc-&g*#R=2qLFwDjafzjV6QCNA19 z5)UbKdKlj|yK?jxdvn%>bSqYxJv(_Z^ydgt2x*kV>LKHuL=)9WnWwxnkmN!x;c4~b zg+y-?v}L10ISw7xlormD3buE4JHTWjYd8+WoGng5s=8&kywJ>m<1h`G(7j>#v@V$F zhjN~*@Q-ARW@|wPZ`}LLVAcl7QKYR`AsCwp6}f%St)-4Rnf&PnWzN3 ztqaz8H#-Ah)L;%te-l6m&|R>4k|y0`t5!T8$2=tgQ+KJOPEPI7SG|CgFZJ8SERj~#J2R&9k|F*?I@Er0XZP5M$~;gLqemc zZ=q08umuPd*pvE7FJQa~$#GkF(0{!S4BaDpk;7-M5^psmErCde`fLdG)?>D)4OiSn zBrKitd2bxgZXXT;u`x|8F$=7)s_6PfjHTl ziml=To=9CE6-0o-Or%hFnJoZ={#>Vz`HMFeO~kJmS}Cg1mK$D(Cfbh}UdNYhS+Ya+ zu&klaIywNV0C};R>8Qe$ddFFQWO))bh~&OY%HIx@{K&T0iU4qgLNMp9$F50yhz0GR zExKwS_GhYnKRRu-*Da#qhEj;C$=8ynv+r2tYHuk|r&$qNmj6f(NF$veD~rnn<-Q1#oX$4y>KDq>5)tQe#*BdU9;lH?0=)`j1_g3^W}5% z{?>|c|JZ2<3=1l>xLmB%s#G-;HwxD8pB?+t3;u^Qp?mb`q~-tgg3tXVYGa%wd0LNw zzaDj`npU9i%}Z<4N=s&6kg3pL(R2N2#_-O6q$xIil`G~hTlMduh<~*HUNPQWGLH{6 zkm|0*O40c$2Kel*ZWi?CBdh>k_vmZds0NVTILp*1(Rj$VSVj8^!N#JSyj3 zyzzlj?CGk6x6mTqQCB&2W#j3d`*muY8^&g?=K0;8N?!U?Ov#(DG zhbH8P{MAm}G_a&C4L5I`So!uZ`o$qJ3ezIN!dX><#rE()zFO>emX$7xY7twkt5Kt z-PS{i&3t0`1@>e`G-xZ~?QWl`BAeI$ zN8r=a-@p~Y2Zz(Z1r)K17yW&sqZTTn$XA3z}r&>K?EzQ=E?}UdeR_R|NojW%AT7;HiRI@Hl{+ajn#Fg z?QV{bz#j-AKtipibe3MhFmD`NlGimzk zfw$%f&mtT;rA%SAv#HgaTlb{xO&nTMF1vCQKc!&% zcDI3NX&Q5rx3!34QYiRgKl_RL;@=Ru9<#X7kq>|D^ZA#Ys%<8&3hPwcStSXA!o z53J|k{q5fp=VS|0R-}y0sP1%2PEHA^ZM6-wX?00#l)tB+ym9R!@jaZGm3uH>=T+3c zv$u6tmYQ1H?#($-y~Q@|=)ik7tur}|Nq3%7+$!x|TMvwMgG_wNF|V&C>~&kr&u!CR zMZM?yU9TmlPWl~tmKUSC`U)r-51xC?J#*oozOMeC5kt)n#?Dz(ZToRk!NfUp)ID>2 z=9a~UjeBjzB7!a#CpXkr{H0p|R&}YBe!u0D(bM7`Ur$|;N_DE6d2KV4;N(-2ko$Zx zGji2x@2($vR)wX3rqijyV$-?#sWUI$RI=Vh#}1l22u%Kw`y*&UQ+2WZYpwP2f1O&Y z;jU+&s~XwDPW&suGxCN}#)k7poz5HGUr=-U#D@<Vy$A*-> z-wjxuu!6(plC%5^%%NhWOouIhR!_U7tA?tvmSLY~BE<`q1G1u{P`=FyIy{o-te%;= zJ~@Be6wc>MorG4<6LL|iQw}tY1pG<-{lJLXD1=1rpQdyn0=A127{;pRkV}I4NhQ#e z3Uax$B?){rL!xyh8U&+VcM<-Y#}9L zkWz|%`5WQz|NP?zeFti{xv^=1%ao)0#t3xlIbGV6P0`2v}u9!@+ z7s&)KFT;&$VSZFE(E9{yEFc$(?^{a$09L$OBDWC8Z}4-Nm61Ggh1hi!F>={RY!&WO zmY^pWj-)qKAs7@nwu8rB@k$NC+K|Y)24Fiy8L9_(D-Qyr2D}tuzrc#2X{`{FL#dH0 zrjz#xF%>1V{q**4*pywM0ABNL%r4G7 z*Aa5^1^g{5TuQ4bN%~dgyepHezM1_qw$nx!4u#!_@SyCle^qea|RE!Eyh%&+r(Y=TpsYw119-XBhnKD{^F{PWSS zNP{1@UVivB_mMj0o@^h9v9de7jyKyi%C^;@5!DKSmqsX^1Z)17P z18vAm2Jd`6XzX;qBPAkpk$&MmM(Z9$Ow-$7}qZZ3SSxrK8Rw{Bi6 z{xz>Ie$VvlKHWFV7QfL2-%)F7OPtBj4(m|I2PrZqD|IrxGV(p#^$uMW4i(N15W9e| zA1B_1js_NuEmvA0@pMCK%a5jGCi~=!bM6nMxFrl1AIaqWNCFd{BdB#*1XTmxOuv9Q zV>|^33?SutNYKe$5$eFZ#1j3AMJnzlrT#JF!3S!b@d>6$W0M0W@C#&TqLlsv@T; z0T0b})^6#JsggSRj`M^U3A>Rr>=_Q0UMfmrYg=j^e<1k7Nhvw2VZ)6cWKBXdxbSy# zwcle7LrbLcz?kgh#sEx(4-c^Cop=e@#Se!VkO_gd%-kbFAj2pUyuXCbB{&Pjz8rUN zQdGS@f<-ZPyAd`@5;SjdRye#$i{$C7+|_{~sPKy!)(Wvy2cQu!a1mV8K*F&~K9{$= zY7x^H-=SKiNadKDGd*+(*)##Ep69$ENdi_e-B1#^nxe%?FpEMCYR(9{F7<+Cs5X)u z0PSE|9&EmozlN{sQx0nAQ~28R7GuNGH4yV4tePuzr-a1EjK4!ZccPc4FoJGUu;^>B zCn=H)&syQSh}889(j1lu{Po}`kzd;6! zHo(VbGdjIIM)-J{zhlKE|H=l!T@g1P3$KRa7BY~-A(nW-doEUp0AwKV>rxmq~shHNtmhpK)%5C8V5g3 z@D)5SmXSjliNv!6LQ~L3y5_>t4_^|%M-?=lf|s;P1c91-E6_c>@ZqD!l$m=iT|Va3 z^Xyw?Ei>Xa@xQaIn_DlOoq6NDSH5_?e4}16>qt_g`r1uB-@kvn{!iuCX=q#%f zJHIDQQ_GH9(5P3SpSacDVEtU^+00i}ja_-<+}sF9)tqZavn##gZ(dyiiQToL*@mp& zNKyLvYntDnvH?8ZRKF4Q`1ugc5L;?@7K=Yo$`==C ztvcPG^hVcUr6$K>ENf_9RG|GoX6bE;tu4*lE%Fx|c|ZAKkgP%}cTV1FznBsC*Mcpd ze|c;@h2q20ao$Nzb* zNB{S^X1`f^bcvmRf^6@v~Rx-YO{tWJNpB1sC zeW&yXbh;kecYAoZ#zib?+5W0HbN!0Fsa;F8!WI=QJ>Rk3IRDYnxo`~xo1MB``C+x% z20QJdqrZ_)?~h)S9H+J)H&gqRRvB-||JGffIsN0{&L9wf8h+pTes)(va@^uyW_DAj zq2YIQGOy*qFXM^$%C}}=@815}=GsWxWo5Wi)dq|#DYJ_$@6B;Z+-Nt$T;`$*oA;&K}~I&R&cpoVX;f*y~A1~=exBmw|%-#>@4p% z;N*EY^G#Frqp`7})`+Q3Gxtx&)+y~%+xm2H`KE~NuY;y%E7c69*SuS=ZA?t~5tWJj z%6~RUZL(xJZSTx^`arU!E7Uf#c7>Mvv3-X8^pJJS_HB)oez`RK$L-{;;&&2vwI?s$ zy!gjhh~Mm}&ISo z9&Raz$z^=;bGO+1wfM}uH>Lj^Q)Ns!wMjhB8jL&VmubIqZsKDtdrk3-lw607V4HB4 z#qv+(?@1*t-tO#XLd-6^!DQ8gk=e|EyeW`j8&2%zURldu8v74h0xx4w;7n%V4A&NM(W?ivEfTJ zQ5%2aX_I(`P>HtrE_7aiwDAV(Wq4BM|APYAc_KMt+xsJgv$y22~8vx=w8b8+!{xK`q7DPUusL2d_GDGJ*OwX#nj#oUMh z0HW3jTM~Nto|H2!aDWPS-bk7_u&Q|bbnnTDSQdYXlm9BKZe3Q^yF`W7?YzKCdB+!~ z4t?p)SdPE7;*fU}RtMf@xud!o z=1ZjZ=K7nIjH;;sUq3}mAqaqzC%k!k(j2&8r`7tyTe)anLC)R^i{Svh5AsB(7g*K1 zVlt4h-h(=x)VYjl);gXD=w7;TUSXGbaJ=6&g*XYd0EK+FmU zs1&P>T2jCvUfK#?FfMm zeRp=jai&A8$T^jbyVkRG^tr12P1lYyVOJdNpuIOL*9Hw4ccL3!;Mypr5foBpF90k| zpl2mW>7h3+FnWql`2GI{Nn?mtWj;^_3>Zrz%KnW?Q||;((0trIafz+fsbaZS1e*c0 z+9`Ety^OwRIra#TaLs^i4x!+&`T<2nE$Hre>UTXW!Mwc;sOE4sQ@1-n!Qn5a@D*UG zayw!9Q~nFM{QuY`Qee0Z8Nn=5-KK-&mU%|qr!ET5(;P@At0)Jz;)VT9RO9(x3^vfAE)BmYWzPdLn)N&yH2TK&pyz<; zNyP>P!>?8gS**)!hCOUm82H76RFMyR!&vX*fG-;<3XE4lf)dzI)o{v!l36H!b~P6Q ztB7;DwxCb;+y0hgg)^dN>~NsUXl>(}#x(Eoi5%O+807>@74gmB_5t3^19$1nh=G{Q)XcOtqKBJ2lv4|Q-u+72N zvjoV3&d~ou!Np!;m^+h{9!LkLAynpoY5ho4;F@JT;Q8xpB>^KlW)Esg2lXq{S~*g( zj1I*zHI@KpQ|X5&p+@3I1iBK~gyhF$RP|s7dAsr5AtcoMjqnz&**W}wk(3Zj0}RWe zbpZEA>tq6Y_9ho_*>2Zyl_^`PX2zF(^b!Y@FmCJa^n_uG8wuswNIpnUea>4(g!>6C zQal2ZZ-(I(2EeK8vMP5|OkCz`lkMCLn>%O5F*4 zLx*=gB9Omnolus4yBx~$KzgX=yoG)0JY_b6O(S;qgzA|YjkID_QE=!8dGP-Oh@X_Y z6&C7=4jYtaNMHtcw+814C}tqg8S-3Q*^He`*sThluQU;cH9I60TG>#}hXeC`sc`wU%dm?>!C4{V`6p6p=yNw}@D%4N{;ZuE0JHKe82*$-_zos1O79rXOYB(G|0G}^-mmw&EwEL(g>OdrXM5=q{gZ!3E;r}X&t0$2Hg~Bw^T9MDi*msdTOjAj;I6@;W@_+u=n<4|5pGl@7D2&wpJ3r^re{sZN`HG#O{h>`D{UCFbGYs@-EWL z9j&7OPb_tU1Ad$VK_L;01AyJ=aTCb}pnKz(N6jSBO*9pbDkSuixr_(|>kNJUwSbxC z06CZ}grw)YF{!(svBNxh-uwx$HxE-a+KMGs6DrOO=LLxpQ^bh%ocCBDyc}1FSB~|V zu)dGgEr?85N-2>Nk&W*rs{05$uQG128CR*ht}@Db##MxE8OPSsfHthKgS%K}9+0Tc zRmmN5oa8u?!#T|0&|d5yu5y^^!tShw<*X3AK%X@S`U<8f<{OI8nMU4--@s^~bYUY{ zFH@xA?Mtg4rcdcUA-q}2$@c-UXbf*|HnX+TZz1{g*)NN4ea%_R3o>Pwyyxd9d4M)*8R zk+pK7ga=n)E9Nce7Br2(W=Unh546BOyuqsx1owfjg9Y$b(SHHih@u<271ms-x2+fr;T|M2gn zp-jyjXidI!bY9pk|E}_?`Xk30F$-n*H2JfC$xUk#jDD zzahW9xU3rX>hl7VZBM_W`RKIS7Da*eq6>Pr@({jiQmxYWy^Xv)96{Vg44J9A?#yzBlEN{5Tp_wMCpp4u@k{P>sELIYDD;$o&<1rwe z!&{OS4}TFrOAXJ!HBZV`W7F>BPz}Ko2HZ0?GOWuHD&zj3IHK2J25%Y=iCvxRJpUTc zrDom|$tJwFLP)jU)J;k&W7_2c0Bu;dk0Hba3*})gUOdv8#y#u7rv-u0AK>@<1!X?? zLh2HRZ4TA#Bd+`nYX_@F{rP3ZbD;l*!BQ*^4reY&MV@lgjOW>oIW|iGF}fOHn=y9D zAj~4a%b#K2uxcL^hoL&=xVg8$5#D#5 z&5W0UfKr$NXfPsl#7SMv&}hSv;bV`7$V39rEF&^1{u&Q(jWg4Pz*uUS(oQH`e~+9* zNWHDqRA^E)V5?O66uhAn`#^m51w-<(8m>AEd~^OvBLF2G$5>Tj7c92s)g_;J_e)I# zN>6$*F1=4OsF$lc3h+z!2~H*vKz9Fo4gTQypT4_n-|&g(ak0 zZ9>Xny9NHP%mX-9nH&)@s3TBn#ko<_i~2M8fhdh;Kvl|!3MYrY)fW6e%m7#%rOt!# zqPHL-3|I|SrWf^wux02)f}ZS)=|RbCOHoM9gS4u0rZOLH7{*E z4N7xc|2`J1kkhaS?OdL<=v=PwhihKyWP*UP%bCZzN(`s{Y7#}mC#+)uDJj%A$TtH8 z!0~Cw6jeYMp)>2R-BP=Hlr9pYWaDxj&La4Z>#k|I;{l%re>DV7V=q$Bm1%yZVai5zvNs9L8*>iHxPNhF;EIuc#f0lY&S)dF;7QA~^-hW>}nn`IMuWwH&X5 zXd$Ik5lL0cv+#w}JSPK2`D+=?>(Hr8{62}@U?SA94_xc+OP<5-aQRm_KJOG0*}6B78}N!^IREKbP9M}f4OpACq)=I)Q^RnF zk}IGX7M{e4BiO4wXE_37AhZle{3yKrEuADmSY_;=>r-nF~pI8{yg z-smdSXWQDbws#y8Q7&D<0sfWbQUF2P6!9rf9`%rXWYRfE_wWi{8t1r(QVoDrD5y^M zsk;H)3g46VC)>Pe2}||h{x`w_IdoM@tLqzf*9IWgOGIQWlh-8o1~JpMlhEqD^MX=h zPj|t!zKzPZS>3j2!pdPoi>>1W$U+047Aov&pc;!S47`GJ-4VIC!U`ZK&ER25A&RuM zmT$kSuGc_?{k5s_x{xIFLOIWcIYA<1lMI*v{@DIT8Q@iQ1 z#h8yVQ2<_KsDewGfMuiTl`V+XU0v7pG0qF*>S26Pz?9Dfe{v_yNGK1ORR!Dc zu|#E(4E3T1VaBu#6}<|mJEw1{M6m>0!jVLrxwgC>7M()_jOn=#<@m|yNrnh`Or+d^ zJ?2Y$0v0)PG;i>~=N2^UJ3z=ytE?WsV_V*)bvDiH=)Bxna5OC5fOvy8N0+ZqXeMu@utO(+b&57&dg;00(2cNO5SE?8B# zf(ubk+=E?%24pwtJ`~`dXFUgB4ygS?B8oplXuqFlEWW^REje-Q>rFqR1(0yyOO`V|DglrFnX6oam61hI-&d4z zqCAabY>vxkpqtsS*jT@laH~=*8XM9P1F=}bbu)I0DYoVV-J0stjXh#7oMzglf+7n)(@oA}O9eMj zN?>4Va#2r|X_~^~n!C`S>gU5M-C+B0KKuvu^KamL+%iRAAQ%4#mjKESgCBx36L|U( zI$LDsXt_5`yM%kDo)ofH#1I;eOLbga6QxcDgmMAO)P|eE=2ywR*`NPlURq}Vx(i1W z+DR~Bl|O6JuM-(&0w>D`7qyf?9p3|0{CrT(r~Xri7YZ0-`*^N?kgLw4)i7-1MZuD4 zv`|Qg_7s##9}!eVleL5q#A^avg^lSkk>ox5kziRJK{=VEaCB!fDV4@yg}p#jhb}@k zD~_k#M0=wXP($1aq{mp(f!r$9Q;l_Ik<8p6cK8O8b`u|pK|R)CEzeU24*LMWpKhC%2;c)0&9=<~H3+^Ep^GGUN%tA(t# z25K}cky^C;m=Mz<#3JzWie~vf1(EE`#r-f-MaEcW!7%B%K$09B`Vd+KI|IeojHq&d z%}9p(XCC9yS4bsU3vs#9{cRZBnznc_f&CG~M{&_Aff)~+H4XE^+rDBDdvlro$haT#B#h`l!y>|Bv8(t|Z&FUV z4=`rfl6}foa6enTpwx>VT}*k8vXrY~XN8_5n;Jz-Y)D?AcT{qLQr_49=u{uvtG!+_ zLBMSZeM(eKMwE$bICk~8JWX8>3I8=i?vavYLlCJ(56hiklWJgxE`q}KK+gv865zijDwoSdZBppu56Z#TDVK1_2*}w{5HugRz#`!Qatq-djl)zHsq;Kj z*$~jGZ`bn~!FZgpNak#jsRAA>usamqfbu+sP+ujIMT(|INFCm)BEXp|%tMA@_LKFw z!WkUw^Y>sP<@5?xH|g3H@S7Dhi8*O>a$urF~ z)}`HGcaZR?#nA-E$6K(2X?XP}&gdlVNi2l{hV8aTq!^s#bq(ewAC2tfZtx|^3t?0Q zn{UUE!>D4tKqZN~U$Br5prMXx@|z@5dMu)pjLHw^U$9DhvCK@c&OhYrWos%6NV~Jn zQfvv)D=9S$UJYQqssTcSR6>^9ZfVW9TLzjW`SNqi0IUE_f`iUdunrPdAu2>4@&$LD zyNr%R%qyx1$vu|(5O;BBGv0AvQ|KnrC381=(}y}T29}P2;nBrm8=ba8?7Z2G)gLcuCJ{;Rfs zWef7`J=k!VqTlDzznh*Rgztz0!RO1J8XBzjv=;mp-)V?aH`K;F+Sr{ zVlFRVj`04Fc)Z{dSVXjYFrVF6I>y|#i_=!e(JJ}?>1R91Erav;JqBkG0;&SkOV2XD zh)!fys%S^gDkeBcL`PSsPB^7HWzxsO!)1k%sK;N`Q3wkCEe=eJ9OV*76^YPVxPV<; z0g_rI1L@=z2ROZ*qy`X#Ky~B-6>;j(PM8Zi0Q#j3Mnh2j3p`Uv4d>=#4h=lXBQj>j zUr<^XscKpPTX(_21RJ+ST9_r0jF3%yvKMvhcXa0lAHkT=V_3dVs+!bRCH0kTwJDah zNZq5BfU2_#4RDqp3)l^iEawxrwd`;NUKBimXP}7Huyse@tq0rwlDRCNNxxo=nc;$E z!ba?21a2-Jc$hw9LTi&@@M(GsQ2zT4V#}uSP4!fF;QEKlW5OV2y1dT66_+nJIT!u? z2=%eFk`xl6nC^GO5G=hp=83C&5OCyRzjznQGFzlY%54MFhy{?e9-}WaIMgI8PkbLL z(t}ui4fg1y0a)t^8BZ)`M0JDpTy*1a|MrRK#zs*o@}F1k4wKHPGoUzuO?YMo2he7Z zV(5ZueSmKgcrxzo06~wg1QLW+%~q0ME0on}Ro|*U?f1xigrL3bLfPez6G8XtMU6P= zX%wy-1~Xiq@^%5B5n(xi=Th1S&Z=&57C8%J?cD=YsFyq=K)_>eTgj-02c!$Pm-R?s z*orx%Z^E_bCqY9$K&VK&=qsaD`wIs} zg&9gu*^DWS@S5WZi7}(6hZNES{z`3y{=`1Imt3NR3tnEyru2})fM`R7v9%11WrU{* z#SGN}Ku^J1M@0zMXW7gMx6FkvFTaN_Q`Dc#(x!$YI*qW^Cx@`*zbXAda@Sr3UX$pXp^6 z9MMowQc4(^i-bnQX+7ccFPX}R1t3M|IQ)Yb-iIF(DGPSdQ8ja*d8Ci+u6~8Hl^f&% z$k<4#GQPnyx&(_y_$Qm3c^cL0uXvGt*}R@f_?cfJ&K1w8!_$51Wz9^&pd6<+ksId7 z1zjOBd!4B+pLv=dLdp|1JqETmmSe|<#n5MTH&8V72<0=PJGk_2?D%J%F`dDdEkW9_ zngzxsK(vJ$(Q>~*YA8R5*}%35cNvy37pUQc8I)`vv5R#F9~$3d*r=EXo|d8<+1y#I9lhD#5Zy4}fJ0OndW8 zC?(>M)oKQkZ}!oP3KB`~hqqKo)o`^Xx%4l6kT1LQjClHH&`P-P-9Tk|z>=7|k+5JB zNJS$u3!#~B8%;p}O&U4;ku0$*G(wNwMJ(BEInI!hNKv}{T z@!vSp{vT849?$d}|NSASC1>SOIgV{|n)4yF5VH;25Xm9t5an1XAx+^sIc<(}o;l=D z=vzvKN;YRY=_@&Gq@$(-CEZuQ`@SFd{g(&-?BM!b*ZX?EU$5t@$ErqOzz(v{T~}cq zV!sEhd^Lp>5H5Rfu4dmNL>%|}Zx0`E69Df`WJ28UwbuKKUR6kosv1V3x*f?th(K>|P91FdH|xDT}mu^)mi zs9AcloxQ4o7B}LPKL@2`r;QC$a!NDU&BlcmBI$HmuKWaz1ti`Mnl(~%hEHvAmszro z$?(knv;v*D&KSDGWsmaqXgJf!h@!BgUHX4Zk~Eivw#Ie3l0e^-_F-;H7`y}!75lq= z5c=6WF<*bMYdb>Ea+EqgJoCh~qJxbYLpfnfDm8Ekgl9;c5k=D>NLfR1I|yE98~7~Q z7W4;z)OD{t82cxifLquMm^M8W+X3SIRHh){DwbSBjD`qSOaTG#V=X9d-f&m+f{(A3ubB2O=m0`s7;Lv;J;S zCqWDg(6cmvY+a{2dx}6tvf$081GovqL3fI9$E2mEj;`5S$9nl4@PN zq!Gw&(1IlaqE=yBzM_5Oi2>lEfX0aW%q)uU6#zki+TW#BKnWa{AffuxZ~||M_pI6AARF40>-SnK3x|La+UxM!{slK zW;S>VWZU0Cn0>=xH_ahBWDe;!BdhyZ^t9 ze7ZBz`GkPK!BJ@XwQM}-JmBVaAv>l%20|b$A87jmRn)Gp-Az) zji*57r}pBlbcCKz>HhgO!Fj2Ss{O_~Rw2eu%!25~d0OKIiufX$4nc@qCaM422?14 z*%LWoWxf|QjS5@J72vluWb(8SLSNGcuJj$bwD;xwPOHx6Aa-dC}< z9ODp9y9?j>Fj2J5kYv~3SDe-N-212hejC+LDPcb|O_Oy|4IPb9Z6zy5;#YK{fkn;= z>Z*U4XS*Rq>lus$pO$f6KgXQ86HIviSpey3|I4`ll1b<83o*aTl8xl>Tg8l!QKuGa?^J*W>w;zBR=a=9 zw-$dN>0Hz`zaUa^mXox69&*##$s}C%<;fXmkyk%1>Mb`3GW&qx3R~GA@Z(ncK-!ni z`9&+cwQtV=FdL)H`BgnQmZdu&YKHg&*{zkDXeFPwZgafosxT9E`P}x+qKfL0L8rs( zQSr61n2Jq5sqS zeK@?X{B2$NNaUv1LuvV!W}ls*7;y43Mcm$0j zn-geSN*{c&kY~A;SiE+AG$AI6@fshOoGitDV4^Nv#X8Ks#!2;-f5rM}>otAtic)i) zgmM03uo;)HA#Onas+o%~9y@B!{E@CK^3C2%7u?zmcb#rY?`vr6q6iYeMbJ1OdVdjp z%LEMVfY)^Nl^`)43gR@6so~a;_vZJ=g@fc?Z6I{J2!RY&+>fDsnuD|nX9p+>>wa*T zdtC!kUO{5kMa>1!B}6xNnws79DSmp#pDno(}SxBCQgUeG@F?_Zx!kfUhTzmaq#Vf=ow@ zXkns#cFGF$g)7c0XhA~RbX+eB120{hztAW~*IsHi3>mNtx znU18t24&;6Fi;KkHU934b{J6e4t$x3B zHo?!(++BpWT= zLf2t)j=Vs?5UNL+X|;=s^FO|h51_;7Fy?XNQ8wdW50d9jBRbWFMmuQ2ag6x`sh94E zk0CzXJD#a3W~;Jsu(D0Awakz*hlw^PMPy8r8L(IKsWua|sDq(5Hq{6GL+}17?!UlT=r#Da?2N zv4u8Q9Y@)%jew5S!w*)n(9Z(O;)u++e*nmJP`XZu#{jnAUMlDix&wtrVx0g(t}l-cTD9SMVH+;@H?)!Q5H<0SV7 zBF=O6-}*-br@fsMi~u{>cjys*m1LDDs!G~MA*?uw9Tu=0;rE8r;!y*gaUP5 zkQ9PP;GBN#sT?`6>&??7RMOq9>MPi}iWR&+Cx2vXhS9%nii}o@c=|OPz3dSP*O3K$GEG?PO#Yw-A;|lUPR`%5^PSVs9O_R#9rA|h5R_bDd0v}xL z6fTE_bPsX2ZVqf|#c^BJ9dbeoQSQ{>M`fm%$C&Q}1t4KTV8Lj9PgRvTu7-d;@`)35~5ET zozi3F1Up)t2oAWg{N^H1?_2dM5Fbjqjv-vQzhg;SU7<%{k0WV0Vbw)W;>DCUqg-jA zad-K^uK=I5qyI_Ha++R6S5(`8*Lj?=E#bH!2^BSmlkF@_7%1jonj;((BrUX|SKu=h z52nUHE0}zDHRr`u1+I)-jTw{8YR3f8v{wr#i&wQ=8)9)rlTe}ppmI&%(ZWM^(`|F~0Ws?ef&LEuKxqsGZu@vrY3NekZE1onPgXFv)#ed!1E& zvhLE^(9ca4kol5tO9ONEBY9&F%7W;g2dal3=xo)qlP$$v0yb{Jo^Dzh9LCv@1b)=n z_-%fqB}EM<7Zt|Qs7q>G3XTU`XPq~r&N;f%3o$Rt;D}hlf?~_AjHWKJK}3Sc;OE=R zsk(ks43@FDz5)-%=g940VaVVSHk|&whn}E52A=zpEo~d=u8#h?M3WK@fo~aU9@be< zSkB9?)1V9zq^T*4I!$cI3q`aM1te66Ib{uIO`QH*e=OkW;Jst>ON(1$V|!5&|50e>`8|^4t_cGU^7cRC*BL09E(vqO#gZ6^rIYuBLQns^btz!azws-i|LlO9_0GE0`HGz(TAE;o&~^Cn z6V9=e&8Iu4D4JyrK<_YQtq_YN!Jy7D>gc6f0#+UVBL31Ao=yfL5aX6z|%ai$4FzHN_ zT4_S9t^;CHQFo-Y?1t_Wk4%|5Qzvc2J5|v?5W%z;jY2)gY?rD6%Iwri7(?69TQ4>b zZ_x_9-Dv!wx)P7G0FWN3H^ckvvMVjP?}uo0+f}))coRE|)RS9ZtSJBS$2EDqxrS7~ zC$Lv0L;>jbuYqg*9lu9<{wv_CuBxu;tcd6F9?-TAZyFSB7dS_z)UDpdnLNZ_ikd0> zw3!Oszq4Simb3ZL__xk)<*jLTm>v&2K^>fXm`wR(lG$bcs_f}wUB9mX|_)xzk3m_>$gn6#bOpTVc2~RK@Oe@Xz5(ipdnSQDDHLj$Bko2yF&~_ zK1rcMW3k4a$;FMt5hk^I^T1*hMLUa)(Q~B`+6{EXJh~6OEJ-Y)Mw;1weRAnadVBoF zq0mQH6AoLTLhVP{KAuA?A9w0EzQze*HCdiW>QJTWZdr_1i+d#%R|ST{mWz zwRxBeh55?sj9PQV2v26B+j**7MlqZ~hn}RWD>@Z^C*QUGO#9-sJp0axa0<16ImNqYHv}9P$@0LN)R>ca@p&8K-o-tqA@2en& zlpm0xs^crQ^%K+F=D*B0R^6AGUL}WEA`VpMFJGfD-s`zFQ!*49vMB1WeC}!{mfIZIk|W#f;qg@f z6OCb<(xDWs4ij%-ty9prc0wVq;ok-5alfSQ$=nM;{RTpt(+@8vIxl~U;PTuWhuvs& znxBuRdC}!E7tgntAgpDu;(#lsH5g7+I+?Bzy!!%v>lgp?1TP-%UmPwo*DabkU_b18tBi}9#h(sND;GOS1OqBoeFp-8S3D(#)Kr zk+;E#U|E@Xx&KlDHl;mI=VC5ZmJOR#@hl}?kEUePRxHiexu2pH+s`X0d8)e>6eJ*U z<-v;WU{^sSshWr56K4ZHA6;(uDdW_u$Fw0Vs@dqN2O5PXMU-Sh_EAT}Z@;jwD|$~o z{CsKoOp;YtPTc-@7Z;4iahc*WvN-cZbMGg-Oq~%Hz@ua+Ckfz({KFhWYHUZZjp&wi z$c7KcN7W8B7K_!k+^NkYIk{;K%)UF1&|tR1NtzDQ;9w$(I++e+MF@8UB?Tm@jcjRk zm8g*|pQk#9W^_hP#)mt*V&yETUBxRzrDQAkq@#>PYU+mPh5^n-In3v#rs=rl-nGj| z9TrZKs2sUy_7*Ka36EBl>8L&ITMi+~>$KRng8-E9d9RR|Jix9W+qCaMoUxayfjXlLo9?X1uRw4R;=gSIfsw80 zaTs|3VC&o4hxpGn-DKCzR$(AeYTMEL;zk@K90bVOzn+)O&6ixg0BE#xkAxsQ|ErM! zvv>hay}~Col^SB352T{`*^)cx6-i4b34?(fvJW^=&39iHy^wBwTe!MO5U5VOS(g*JdveE_ay%%`y4A~9T`8!_D{hi(7hok_61dIjJ!_-9j|F!p! zFatp$fLxajR1JIjqUHpTje+qG5awpz5$Fqq7}>5FNGqjIw?STmzg2>3{CgnZ{yV;d zC^O%szX}%%cb05d1FEk}U#@sQ#5?9~y~+O{9U=eQl5Ybsu@$7)b_(tK&mIUc%yc1D z*A;+>rw@qQq829HU#0(7s}cUQ4@5j)3k14Fh)B?BeM2qb(F!$kAetun%};iv^R~sp z5!3iuC`rArlSX+*5T9x`X_s5tVO6csusiF3r*p?t& z&4BX#cyFd>NXq!0%SX!Bi1Vw}vv9JdSzSzXM3R%K?J46z(#gC7bq&NLm4?zC21zPw zH?2micS>9=LD80terr^5Mo<)H@DUp6ol%`pUd6Bz&c9wI;8oISlI7)-Yd_4#ES0oJ zjmrbG&mg7iWEjqqFoamVx~3w(MWf(t>Q2w?m5$vXe&`?h0}mnQV~mkKG&QnL_|}VQ?|<1xxAWZ6VJS_{|AEXu zsIb`|gDXUJFQ2!_h)e1Hp+3Tck(o?FR*S!HnS~SFuVrcHvBZ%?Xpv)6_iyTK{lBl3=Uw;iiNZ;ucfc)4O=!3_`7llN@rw^TZ_y5Zko{w z7??qvIIRM&DLf!UA}VM|Em0W}ER*slTtWo8hB;_R0wlOyhA@Y2CUZ5G+FIAJXCKnH zUh$XxZ|g7aIPQv{RM-fmQx2i2TO62K>&}8=L*G(@Wa}c?+lp24O7WRnzd6bG3d5#) z3@**)9cZmCigOtC$Dn;=J;LZTOn3(46;bRdZBh(f9=tay`Mv=`7Qivl5jjM~XV8R+ z;DA;iYc=v`;m;68wPva1?(??ej1H6h5}FsjtR+@Id-k0)iP=(^1Y5Ob%MRqpyjx_3!xXi>u_7 zvDi?4gC@MSh}LK<)^6pggz(g;YDT7IbKk|No=cKC{0E{uC;8z0@b-ZFOU|#n!TTjK zzbb6gCd*VS@tK;xI^?nNs+h*(c9Y!kl(#QAU&18W!1=phM&S>{f}b}=7LWWU)mLGq zWvtqFSZihPsx9GEp>}cr98)J#%Ps_KNK@(rhEGoQj-d~nj*GclB{#b?Ms3uiby9gJ zNj7y$N|y42CIfh!$pq!FgPb7g>*s$|C?hxXlg>DWvCiuu@=@HeSS6R77m92Re-{}V zwuShpMH>9)r-i+7()Gc*o2rUcr$;;YWO~K5pQH>m!g0%8&uR_pq)0i0rk{&hEjBl@ znCBWFA6C@Ni26nfc2F-aQXI7VDrSbde`O86W|O~QiCIvwn<~o_oiTMSE-a|jWjDf| z@TJYJ0L*nr-jM^Uer2^5qnq1lmpd*yG)hdrT=ojZ=<2K`7rod))T-9m%VHiU5s4v0 z2gR$-NW+Hfm_nQK>g3$invEy5ZW&Hw@I6O`{DG9=q0M<}8$#&3ol$*xRfObqM7(C? zbd~Y;zPRP6;bjoE;Ufii<+AU)mt8}U9Y;&#_5Ja>BnFM<37x?*n4Xf>w!x8_>+Qid z3~mpX@+r)MUXJJP5qCi(i#yj5aPI9;Os$`$l#Mv?nsSGtu|k&zVunNGX=ReUDk8WK&*vKLs83h5ctv|?b%lK z<$q*bMj~hLqqdd##X(%`fAcTQ!gPnGl$=gBKm7yYTWrF&F{PW9h#j}kn)2TPhnD*BazLPE~bakg-j5TmK=zwzCO2W*3j+t zsWpPXKZl=RJRF})Th|%q)ruYFaM&7#8B1cZ%`)ivx|>cpIk;4dg-#6Ry@eEE<4)4C z-^XKqm=6{8MC%mBx45n+Fcp;L#78t0aL-nADs`lO5`%TCsjeB-&)!hv*L6pkDOIjx z*?=LjHm7m=?ab1FXn*YImQY2%j6R~XAQcnFtF#&9%bsI7|$%(_V7!&m}^syOJTX#Tunz7eQk-z2)Kjt9Xwgjj$=bG|K9rTBn1ps~K!s$4&KMhv z7SOp|t!Xh0yvIobj3|YfXqbHT<(S2}jy|EEm0@AO&m&S^IpgJ$Qv>hpRFA%GBW2gR zA{wwlI!lV;m0WpaYZ~xsIqVOlbZI^Na2&66?GGgQ@nN^sL^0AI$R@~HD7+-6!>`(J zE9>K*Slx5@(%z{`1GVL=hy6ly;*<{hAK}l8oWk5k)ES{kP5pN?nh+kWQupqHrE2&C z9eJw*RKHgz8^;eJokdNgez3|m8ATG$ibu2Ck8|Xr=88*5%ih|~V_w<4txN()hjh?H z*Q1Hht-iGCqUB`J4Z87;!fi$F|MxKnS(Lek7(sQ&F&`0gwK!e4(J$&B_Y?s%ogIWY>khWZIu+W3%i=e z!a8F!5q{Jh1!VV;0&JK?Hm5_%cVpNhbvU_;j?DE(??X znNY5|11*+QSL(S(yHc2(Qbt`*O~I~AGb*i%DshdnT|OfWzw8Kw$2+kpYb0F?x-zWm zLjz+oD87ul91jj=zL!)9gVW;W>l2$R-;4q6!YAX37k^eP$W`uKGg@;RO71Cpj~&(< z-aJsCZc~U=>jsM!oaBj1^6gn)kRC>hx)l7k&0{n^WBq^|tg*)_(coaUD^i!vz>^ga z2zb*M(3J{S)^-yG5Ik>lxq$spUkRRBL*Copnb|_P5Cz zjy+@7f48stKnxvWTtpxCK}T2&%if@6%Fv=bbxaC!x;ss@Z3^ff5vh@3bE)KQ+4!pD zlJycK9(CWdQeT%=!q7LWE1llK0zHoKj35VfXf33%J|&<^x-9_Kptb*1LmFzH;wADoS^Nc{U%BQ#)Cfn4#S2?u@&U4GBfO4Sf#P^ zI4qyikJxI4Ms)}6Y65+q_2!d#ikcI1NMstZ=Z)eQ-seA%l|qS*5yb1VM_o6cg*}(w z{?-5dff!yw6Z9rg0b|@t`|p3bMcn*+$;xi)zWYaK6(voLm{?a-9^YIAA zj@uml@sj3%I%dUJ@EZDFpKAu~y#tUhI78DZQ=6t3(f9_?Yo=jbA9BNQ7!33?02L0`uo z>X`q5yoSx+>;E^I+pMJv$Bc*WycFbCMB$6)(~7>iwm8YWMi^~JQ^zerXa4CcJ`s~# z4bVcDH(x)F{Im z$i`=4g)iRyfn5GUIh&khw){MbOnt^K(}X*d#b;Zm&bGFx>%wVBu?+5fwGJ`|bdCw- z5tENRLy`sjP5pOIgZDWy@&|$j@u%xfr(c(MC|B=9HW-b57^yQ&`-XS}Xk_MQN&PO* zjM`5+t2WsphCKRh&!tsO|IUDBcZ|3!YAQYL4OR|Ta`b)=bIaq-bhfM6g{7!%#E(ge zq$tMiP7U=N)+Q^U-E{6*VlV`+L&gyi7HB9%izlP(*KC0{ne@*n{8IAkeTrV%KRqSe znbu$+MSXo&^>gc5&$j+@z)uOVmz1ki*c4QiO8)$`*^k0bEn>b2S%u^R`)s2Rbf2_z5D&uG38EKlbFFm0$Z& z5pWk}X9cD(Km6e@J!}?SxAU~muQ&~Q|6_61ZOeQubNROh$Ig-l>zJ6^Q7^yI#vhfb zvnxe?u=_Dx*ju)|buUt!ICWqD!FzIf+PCB%qc9w`+!8ahY5H|mx-CE3o_AzaiY!_pOBSTu!9QTH%FzKdj zq?HY`(vXs}mg7lmGU{MbBfp6b9(4OvXso;SrD&UMfn?cSnwKbjIPk(SZB?flRf00R z-~XkyrCMyZLTs?y`0OdMw5|1v&U{%ya6qHwO~pTudt^Q3$gL;V9ozrGy$e(3?AN5L zoJUd)B-zqRaso45@ywc!tzf^M<)8r)lNm{J2d`YL@!I3u$#yT$QK5klU zHV@(8GEiD4vwb-kCh5>F`PG^3VeM@P*~&ATH|~$NzU?`TiotYJV2#&V4f?0dG77Y^ zh=V-=x?;(*1v}?HY%P!3JUBSkJI_guL|_I3;AEu{=BHTQy>W#(Ids*i6PPzFf0>xe zu^YEh2iA4^`LaHHG+dkE?GzSDoMd?;H}#~3ccG5K@Xc^o^qrKQoe3+54Ud@fFmo)a zn=Cfma#hQPt#|SrOS^OJ*TcbUG%c8g@2GgWM(LPVoEDj^zRM89>OhVySY7 zT%+GwV7>d8)A6du-UveeK%$M~Lz96BsK7W;=NA7%+rfg;A=?jo;J4L{@?gkTsVV9o zNdA1$9g0b4(GMc)t0Ul(AOc3wcaqVz{M4N zvx%0o-Ly$4w(vyrEH&^Y0z*}IR1TJlmSFUrS>#qZkES3x9gVSp!GY2Nd}5(?;gr$UES8i*_=-B3AN-J$mi7F>i;+$4RkyL( zY%7Mobj8p(6Gql(+eN7hR=(ga^fhwuRuQk^HfkiB4>CiK=yIIf+$V+gos8Vr+I1~P zsiB44=Q9GDed4!tz8q(7pSs2EIvuTG{0A~UTt9r?rf~JEL-*!`1Ft8c7fR-biyHWi z6gQDVxsb<%{4oTj`xr~y;m+=+pM|AQo+^H;&h3H^8R*A^8DWW=Sn3cFkEJ-3j@r4_q=5e=33ERE#Ev3`jl9-g` z)2B{d&{=3{x;9WvIXY4-_eL6SW(Rnin z{N^R*VxWU*S_nv_lARN~?_b{)xT^+;B2Cg)On|SC2WiiONN^zn6Y;>9D8d9nAfSO7 zUKPlm4Mc{E@_~!-bcZu!r_IMe^-)i;#1wgZq9({69KY z0Itio0{@vQ(Ymu$2$<+k1LL^fUV9Y4o@h2&lQH)eC(+_L$Bvwpp8hK-n+Z$yB!}*Y+MBJQVvt-LjBMYYAdY=}7rC zB0NmLJ;_zETPU&c8Qq#Lpe4Lf<8BOdSTc7FEPxuqX>Va%oX3g-=j9hdQRGx`K+~MQ z#M|b4 zm8dg>Jtj88zeXXKsJemFgG7n8Joq)4+|-7c!vkjIjWZjz+wJiKY2vKp(NKPP2`JR? z3c4_;)=HpG*J$z?lh@;4g+iB%lt)P!OCP~=z?b$3>#2l%4#DI3=| z9N5Vx{gtkjp!EHQ-ub0an0(Lphymhb;f5TX;d+DTWSz3a%-y?ODTVekBb|PKAjp-f zvs`MCaoK2tj!Zr~#&6l<6qfX|Ii?6>5^?jbib}7;RZZn&3q7?9OY@G<6kQ8zPI3cL=P?{VtYTe&*}Q7E2lUT&?tKbA;PCkU2xJsFt!?SR zm2DH_A)t}$sSedBShZ77{ZMc72l7_{A~NW`oWe=79@@m9(~KAxoKBZd$nX$e%TvDH zCBhRy2;K!|bYcTq%|A=}zsH5HP|ZQHT~YR^M~QVlq?;wnZ^EjYRUR^;&_3bpw)ZwP zAq>~sOntKb8m}zlQ)_Wf=6Em)94*3hnr`>sBNMvQZ@Y22`;#C6PBu#1_p`6CI=dGPP^}BnX zV3P%kC#4&IARC?ZKM z&6Ph=XasY6ir>9qJsPd(EjY8&qU-R1QI^ufqS>C_FqxbO+BDxFUT9INwj?eB8`y+4 z4`dD)dY<7VB`2zH+_>#qO^&d<@6O;#l%O)2XjLsq%}33zBG4Y#;AP6O)r%G8iFYja zv6IWnQv}0A!j_#pE+1uYcIa5M<40=BHOi7d=To{nYnq%4bK@o`;ncv=0mQ(`fPb1_ z!A=l9&g&`?-`v+r*(zT-dvfKCP){6@gVUMz@!>vqiEWr7H1myV=xS_v?XHF=VRqS8?93W~S0&3u( z!nh7`8|@Ws{AF*48G;yz>Z#N_32k#J%BdB`aN4u9r89!|8D^RcYT(LFe-_$sjCo?Y z@Fugjr*f*(wF0-YlS1X3ygjWX-l;ZY@}$`Crm_*j!T)__RsWZOn4SV==l zr!%~A)sMjr!DbhQLUX2d5C-rvQ=|+@w!tYA4fT}9$SHU=wTQ599k`YFY#X!~KmFep zBZ_w$v>3x4gM8@96!o;Hq1CT264)xjTH*HfE$wYSPnE%uOC~LRyAH8yo3F5$>|cQ@ zH8S{}vBmjpCBmtL^dbj6Juw=FE*AF~s5C@ZOD^xZ#C(uB7rJ~kVJ)qgpYkpiRY>!D zGmIIOm7D3krb&*W_;x>5))b5QdrkEj(pzOo;6s#XH4Rxn>Z^vcN z!pOaak;LG`awN?N%r%_MMCj=2)ztm#FHDU;_eojl%;a;IA3cxOEDCidXk@YQ(YA#J zI1k{@(3)=|9wU_piA@WE8u0-t$zVYg9^*5xJ9_0bjQ>HDrc1jgEx(kU@~Rqp z+=20la7I^Cu`vgEq>xJ7@9gMbTGn;p?a%3fuzpPhfZ9qtV~`mSOgNiI^f-9;9&u_; zElgb;?&8$YlGR>~0NS`ER=w(lqv688oq0k&KP>X|*R}K9$6rX6cd;4cBu}4+a*jA178@np^51M^c)LP-FHqS`O=N_3$A2j7I4ovwein zqE4(;e%o+;!sG78HzEc?t(Ef)7L{wY168ryX2f@VMY~+c5a$R#f+}Cy5SjB#%rWi; z_Cyv8@mP7E;=skbkLGs!Sw9)rbJ?bW0lve6q3Hze;6g4rT01Ih(2!93sG-@_FX+)b z-Mai2^}SxR#v#;K!!ztsOaEjTs$|%;uqx!HD^eWW+8HFzaX}kBVs;{~s3<(KC#R&U zr1&U()Ef}-;`m&#VH3CBRF8RE6qJvHleDD#o(CypNsNUc5OLCASQ-RfSW$U!V_vA= zO><*EkDVuOqaUV?#gnitp*||Gkv&Sz=vckqD$OK0g?4e@7Azc#AO(})QeRR|z1fVu zWcTxL160tC_Ju(F$scP;d(3uYjB?sKm|Lb`gUdA+>n%G1xR z$Uv7`Xz`h4Ng%81`M^08Q-tmA3JL3q@M=RA(SY6<2seU{dt}u6!Rxe-tUQsNldxQ! ze{VV@J2S_q)NZ}0^hld;j2IyoS8H-#E6h;T-RL-ZCo9c*>Wdq<;cF7}53PH5qfW<> z6~>krn{FD{kg4aeUtAoX6W}@Xr7i;pa%4yfSWU%=mIY6d(_8bn>u+^i?X`phz567D zY_pEm9lHKqAe|f#t_%@t>w|dSW& zuOTMG<=>Bq%RPg7R&8C>@PtU_U566Vj|o&x^%6yP2G@3^#z zy>%ZHa|7blHlfok3>yUnyK6mgr5^{F(7(=L0qZ{9N5WA|;8NC}m)kfYY%Tp44(0V$ z7zyYFK7&K?Z~fMCjN~`#|6xJ!S8# zG75MX?cJcA`Bh6oD6tKKZxWdiiWIb;HD?I0g&=p;4qSZerkMD#QDgh_P|E+{a?Wr} z8|KBI3*LzIcm#~UH5g(zwEMmPgs$SQr|HqAeNctW`!8kpfNVQi>vEBcrK$PKfWWga z&`^R9DCGE`n(0k@b00OlsbPA_?UyVsLS4=lY*ufA6g^is>o^A32 zdIaV(F(6Bqsn3_nW+?U3jj!qAQSH7Q;>ZmeuU>4}EsX!Zq?lG~h~0a05U7nQ>V64m zX`!tV+cmqI(f!i#jfM?6x}yvpXY)?aQ#tW7A!S>w&r#QLdKp{gHSZ9)@^4vcX?ewQ zkHAnIMg0utxqMwgkd-(~2m`B1Fs||P^q6YU^Pqa}Kl(^2>%O6WgmpcEnSNswz0z~YfE!Qst~Ip=IZ8&Y&x8r@PucYw-o<` z@?mX3)_sx+@6ONs6Yjx)@RV$vTqasn~ABLbe-aodkSUWR8OH|B2^~ zNLLNx8bJ5&F+LfR&2n4VV-XTMbjbsTu=Q(|kwOJ1PD(l}KiRP4J+w_-%hlu>SKGwR z`Bf0zxYILV>$pLxc16@x zptvwso_~7%<|*m%@Glg?kx7Wc(#}{V@Q!X^@W3u)zdS*)Er;)mdFcBY)QX;%r zx`?`t7%Q1HlMKtIyJ>QkqRo=78u>6Mx)7iXL(peSl)}Xbd(KCjr!r*wMtU;Na z6HF(WoCu1hQ%=o}728DKhwmJBj?d#_{?!1EVG)IfKc z_zH5l{b&Wx4`}*e)s^e!F>Y*IMX05@X%1XX9$okTdg6$6 z=ZC6Oov47aB3eVOafqjaqpjme9Y_XI^kA7>+#1xIx0@S1@MFxTk5f<`x_pddDVSP; zEM~9Mhx84f5rd&YY~}RrTb3y>3(~kmac>2E{SU+dzbu;_!hFMjRx6vmt}jmAC+R#D zxqoZTWoWuew0FmPwLWjg6ic+r=UB$!@xHsf3rVk0ah^v4*l5Ihf5dtPcif!!;%s4U zjn{SJf2q22;yON&l&H4q=`w^v$Vj#sX)F@qC#P#g&xBGm2WQNQl5mcO_9O03*M|m~ z%(aIPw_|xOtq)4ra>5T`T%NWG3xzTnKw?vd{m6SH9s9i4-4`^riON=)&qZg-ga*Pg zsV~{=(vUgn_zZL?<)$pMTHgbHrA(iCOw!psqB{*%wO2jNPR#i0*m|`^TvY%=qZmU* zyy7ip9l^@JeSDppxkGA&k#99LjKMV&=)&O52p`xXXJ1Wpks^>E?~)PvuvNX_J+SRk zrX69npkfiEM!SiigI96CQV#Vry3!qutKW#~s@il!ZchGPndNW$IbbM;TnsW)H#=D|eu`$d+E-;srF!8THytz}KOSSiiXKMdZY{ z-lT>3fP`e;%KGL=OGBev^9Yj+BR420lWu~Cm(&EF_h98E#fx8zE=b=@47Z=Z^+cvThS8@4?%oYKf?2|O6UcI!Y=aOuc` zY2kvVMLkT+Oa@%lJrbf@=qaqO@Sk8fZai$Ta-VS3eeA$38tTJO!+JiW!OE|fslJ?1 zqBtlGtTJDoxt{EDcKwj@a;J?P8jE-a%x!6W_E{g~=# z*e&sy*8?`ajDHhW%sj`0*@I;kWF;=MGvo)MX;Azd8j^;3f2b8h%RJ;xB{VseI?2=- zW~oMm1VH`wbfpHtP^B@s3{*S`)>H%*qG$dhMdS9M;T0_t5xdJ{t-r?nzH`<%Wsgfb zi~Tr=yH*^zhGC3`{InPhLk*|cObD?OW3E(|ZTEDp*8`JDoPMM*`jC%*nywXEi%!1q{ zOIoN;M^$o|#)zllHNIu{$C&(#dX`}k^+c(YZ4x^F$!6J)fvbsY)zuom z-#!1Td!@c7%Ft8tM6j|9PMVd4E(h;%ikXgtSyC=Z73N` zJ*M#0Nld-sRH>(OFjmvqe|)J$;EbKa#hOrQ1#-Z=hLIdJZxVd)2ou+n!kS8o+lhQ_>Rwu%Q^)kYe8mlH?Jg|G+ny=8LiG4$-{gk&5;*y(4wg;4vui<4V5w#E69z=3N8v4CQ# zY6_5<6AA(@B-;t`DPgN2(AWmC0bc2nscXs*2>@KlekL$CA)ywoys`kPoQI8qOkaWK z28i`-k$vrIh?GEb;Hg$$d-^fKN`CsU^fLrOklHPNHB-RedIBP9BAhSI6uM&%DAElA z766iQDj#AA0lXR9NAP*P@+Bd3duUsrYil~7{0g+VgU|~BHOQ>Be~jdE`srbNke8%5 zzmE*TrNbeT?gvGI%l;-8^A@Q8xVG_@8fG@V)4mhN<-!54oOhBg)|^aTgNwA-U#o^F z09xL8N8!rgDCQv0oJW5%h#?{_TF&(fx?5}|mcxiKX zD7Yw&qvZiJuwjG@VGywyLC_!r^E^5U`B?1St`8+c?9I>f)@9S(ekl;!08DRCMs&)z3RSBxg?V>y%wTY{E}iQeUQc(Z|R-u~;4BWhWZU1$%<# z0@`X|3~cnjsQS~erp~Af7{1TRM8aSU2_k}qYJdbmP-YyCI23{)h6E4<0Z}6eqRfsb z78R#9Du@Nth+ztYh=2;HsiH*`4OCE2FwQvRP_09K-km~iG!-^?!>Eh?oC6K-toq1_vr~wO`ZmB7d9L(8Sb3ATX`@A)HWUo#peHmewlZ& zi5aMSaKFP z+7O5%TDD}_0?*8V7bB7RcPCZ(-1ldJ83W%mXxCLsdMlfO2C)X6T`ylA#lf3iDYD7! z4=z2$BqyjWuwi{lrh7xoW!dUM2j4RcIrF1p`d!<}lUIyELtqz(4d79xQA@y{tdaT< z>>((d33o3d4&Qo6FM5$@!neXMWLsHu^~_$HZLH@|U&lW}y_j69Gb z48f$SR`iGX1}#71HMH*F#~#CW7j39T>8Yf6H}A;|6nY%IT2^V(e`a%^m5GB?VB)6V z@pI(I2ahSyjkGhkEWwy!{p~c-v#o5=f02DBk+>G@3Xg)9&@GCN5u_Jr!=0yi8CNl7 zSI8j#f3Ce^5?!I+qE`{#HgfQhdxYm>cf-JbMP@-(zr=Q`qGRW2AxIURp$0=NHj%FD zk&m^`Y&YpMVo4hcJc+ObI)eFBH24I;`#FX~;pxX@5$-z&1`z&_G09OPYdxzM>!4zq zW2eb1x#^%D?5;%}<3eBuKDr%@Dg`?H1;rzu+J}jjD}@*G@B@ZfSCn!KX%QNDqlh?< z44dIVJe^~RY!(x=o^EA61USNv1Ix?gVe7T#q zN_8%#Z*;uBV75(`o8K_l&C;=2cn)eP&oNPOJItkC+MjZ76Y^fLX zQf&j6DF-_*%`&1DF?qw5AqVrOf>*B@n+(T&uWSGz$H56khRT17pRWvDTpQEP_Ss?h7OhW|MaaoYg%_u`T!Gy5Zp$N;D;H+1^k?>WseLN&Ia2SYQ zDI>z$SmND`IVH55Kqm-`tYoFVi!>OgZ08F_Mxm;w5RL}qDaxE8=N8P<#_-+mgO|I{ zWtRAmQg{zg4!YvpJ#b<%#%<&*Fz-4HYn`YM>U-}dEg15d05j=pKrN7G1I_2Amie?FKd0v&B7^I}g`;Hl=i6+D9;SC#+R_EO*f%TKD}5qQ^|{}BU25=>^f7Z z{&KSpa4^ugkl-r_XZ_=pJwA0->n3k``hCa$M!W?jS>e?hunhB%V3DeEN?DQel&uk=+l4}OANWuf$`F!sXVK0f9dFIBQSXApfZ1Q6~ zivEgx4Q|z%MLGOH2^P?cATk%5p%S#*)sE{%MdsOHUk{!{q3ij+?O=FW&bI=zhGGmG zMbX5%SBj|n5$2FwKm>jvz)y$LOw7thyd6?7N)p_JaFw{vmBQGxi?lL$WK31O=P%J( zzMl60mF1ixXXcsMu3)>FtX@*P#>G5lLWoH?sret2kIVWVVYx;%rh`TiqX#H1`P1|W z-+!IYJ(9<{pWj&QL_vGufFjpU@Xl)T%r~WsTRuZoHi=TB9H;dJTh>3LDa@#~i(imy zJa5pkovm&7UX{S(O+Vk-!m)xXKLRy(l`Wr4GmA(QwvJU@<7<_Vt4 zG4pnbF~wXcw++U^*nqTQPkaa&(vCB^v;i^HM<&^_}%v8*3u;Kstnd25;@5C8KAUDybzVb>Ho+d!s`RDk6yc z{s!tC3xBtsEZjswI-(~T12&nmPOWZQE2%@EA%w!@Oa|qH{Uj%}4|buzXmU8xpBGBl zM?J<@ZJ+cNsm2B2Ib9*V4!na+`vzeds1F70)w>w~%r?(vF6_ond?!Sti%Aealqkq( zB0a&TvWFIfuOU}YfwR3P+t`q@l5wNI0lW*7yd&KZxF>6RFb@bvo3+P-JM#aEBR#jW zBuTbI%B(T2GzoHEM}|FC1g9cTBP*SwoL0m#dj|$j518iZwC@B@&60uR7EQ%k=nw6R zojM-dvB8L|zQmr8GUD{d(3~44g|n`C-?V+QZp#x+s8Aylo%IsQ#JNJq@>>?UZo@`@;XA1$7s5 zpA>FSy}Oi^^M{dNL5_6GihVh&AAFy^moUAhaC(-a@P$Jh_Zh2gr(+Th=TudW_t;7E zC1Hy~{Md&@V2ovpX4O4d=(6vRzEuB&_8T%EN%{VDFY_gFES{xibguX0;uY5mv)=WF zHZBX)I*W7@QvPxI(IeRMf^$yI`%QRlM_>P47%+3vezZFMTe@fUgCBugM(=e$iOx_E zJL2{{RS@C0Za;X=Gcd0c1{1TFk=mL3KvHGjfC0)23ESYHFRp1FjY^OWyUd$!uA&^l zf3VG(8tGF1Tf`hK+rsk=m^(fiyT*sujCe?LUc*a zd_|robQ4P~Rx9{H?XMJ~7CrdlZO}3$$3LNry(%c*;zphQ;b9QDfKl8kt$b`>h(T3y zdfGokVLB`mCJnK{Vl&0C94Nej3S3SGQ({+ShA(Hv3JjoOQl_{QtT5qriyGF!84#Q%k zcfbqYufoDAIR&#j{lV_WGK;)UEdNIEK4Xx71>X)|KV4-_eYo%{V)gYR==YE0(f`%^ zYH3=>26)S=DN`^q45E#~hUtd@>asQ#TETUtp+FpqfHbYOjhvz+L!2i~b^CUKqjy1Ha9h$XH z_5!;@b&C?WO7brry5g!~lM_-$F8FR=wxTZS>5|Sx`#&spySXyyz~0Sahq_}vhEI@) z&*vTfc6|FP?#k`*6@44K4vZ2y3YhA@m90XS{FBIdN9|9a-}Ddvn4^dQzU0?6@2`pK z;`fv^kE9NMTXcg}^`l@yzd9!1(wof|4SoLCuQvN#Yv^~LBYM&wP-FL(Td@B5*h%GV zNg?;$mC;h$Q42?hH%$C~#Oxpc0}r-t@#?A>?&zN>`@N|3wJFub*XdRGjT4c zhbeV{ySN+ewJTKp{{L8&(j^X>KCX@)u{<7?*U2$u2{f#?W-LL zfxGNKEH?5pist&b`Q?RzMN0Xu2MZ=H_<34p@a=?DTjh$-jU6{8znC9z;M&=B31_Z$ zmG7_G5JxQw-n#K!dd})aEaB*;k?se=!ZE_J)@A$FP5-ni$hdg^?10koa!KXI@n`0y ztp1VZa_W8BelOztDf{ay%;n3yAC4aD(BbD&d`wc9@X@2PJN(eqsAaEzwK}uxhV`YJ z%<0AZAGv@3JyaU_^ELmo!Mh5KZZDXw6Ad1)d+W7)$uY-*hWt01obONZDp=BZJZ`Qv zz*nW?4=F3IckNL)mVCK%ph3Fpcj5HH1-l=yqKvLItv|M4)BNAsK0M3y{tf@@?BxEg z>HDUBFZT-&9S(lxzpIyL*t9Qo*(0-D1ju*k89%mYuyyX$3se67hkJ8l@x}3LZ`h}` z?Q^@@f6YxP-QsYlEU(00QDD&SjlWczwaCYx?k2>zSJuE2r(A)MdALO@}6IRsITjqUNu1*S#(pw@}OZ z++kJlvr*Nj#t5!G4j!}4V`0ffc1h6G#*$pM?Xj!*rEVLT@KAhPv#sXut4l0bs$YZ) z5>}~!t*IE9`*iK}qh-&PfwB3=*xN?u#^2GnzkByC%06QSJ*O*s<312ymGu9Vu=9mo zccJn~5Rj>*+&^6R2=^?b`H2=J?j2n>ddJb6$^9QaQl8el^h#@4shreH4Gg@o#a=R8 zZj?K5RZOLy>))J;dpS=oF1V(ssrWkW_b=m@F&7t^Gw=P#vgdV*orSsba-cJ$s_KGov?+gcWVUxXEohub6T19n9cQ88&UY<^u-rPu z)yp}5hc_*VjMf-($)%P5gIqYUX3$)MX*nuD9nMo2@6d%j=&(f9k$)_}2NQ2M;;E>C z=KBf@8~@XM#i5#q*tTQKNXK-rq8x zlLoAmrzk{yU=H8x1?Jcy9raT)NxDX&EU+~7ti&_gv}3MNtNrN;k4k)r%4~NLrsXB` z1JB=5h@q_~;=?LwBAo?9b8riiQ9AfcZsq0S`H(sqp5G8Lpl#If%~!KB>uoqHW(aR( z1S^%Q(akB9t>|FH!?5ue?}&?8HUsMxHS}zcqevEOQPLwrvi_}>1@wglVC%Nu$qjri-g5hlI_$UM_w zblP?N3*kj8L~ryEQfGJhrD|Lar3sm3161%Duj$XKq$S}HG__r4Ndx=+p%Hw;8L+){ zFr{!P*^~&3FCQB=0Zh=a2yQKZVK!{QxS0l@A_ufe&o(3)8NcJ*_RRz9ATj#?#tFxB zz3ycxka4PhKuLiJ4i9oYQ9rGSqNge9PPK$+4}uB(8*&go%tde6rn``ACm#tWx4uA# zwk2Xh!U(hIea?oNlb-#RH|M?e{@*&EaI5R3&VDmnm)t2ZU)r<$$oNx9!sWu8oEx#% zr{=4rcY-U#2c+uKILR`rgyS~sZPHsQuloPBShX@`{(}vk@1gvyqu%$7Kijzc@g%jy zp<{vN7L{W2xv}Lx9~`f^8UN|c*J8zUT37bsj&+>MJtd7L59E=&GSOBZDCBNLWv?_n z+B6xOK=E&{dZsv)%xW4rxM$-L`9+^ulk)!ueeJ5c{Qd1O6|en36g1oEPTrpfpIrLl zJUZzC#k>00(voMh1}d*zTRE!XgX7nxXKVgl8}pp9@%N`M^{*|Lo7}m%r@+>7bCg%n zrK{ydy<&m+`}r=P@;bjdt&)r{@DobF;}i6-7>3LAGuaA?ZF(+<$~izbKd7&z3AE};pTrosW_D%Ghxb(vwIr<+P0)=Y{Y!_ z!9684MaOr#9#|mU0hO!r?lt>SpTCc>>uG4?FBI%Q^hIcW1BE8gh`uz8NcAn zmfsG2=pVadRA|oP>_4Wi?d*A<{^#Pgk)iK3__~~#vqqg_<{V|6T`^U+D|E`^C+c2n z|2;)<3udJ5nc??7c!KXAoy(nkABdMZPC9fYc$KY_(9u%9H9oJD`?VMIp2GazAl~x8 za%Yaw9}@AktGPVW(WOA(j4xvR{`kp*u~ymPo#}th&Ci|nIY4w^$Jg_$TR%>&Y#jRD zFZ{PgxqZp34*ii06Q@2HS|*%gDPSGBk#NlNrPI`%3!6o`GnQR%n|1a<;Px8*^^z~0 zi$!D2e-d|Gz3jN}U`bb4S*L9Pv@utVb0_|3YQ1P&L(roy5!t~je@ZAzP`{t=w=Y){ zUoc;s>~QD`cT3N@y?5W7SBb%%&1k;s2jViM)m#l6eJo_xvZr~Lcbaa^YwTXgHt)rk zV0TLB3bP$B;E@$5vl2o>MjbNdJYq#NU-%ZTN%iOob!(5GBOrkj0Hh-cItx|9x{9n11)Dna)}tU2@z zI#S7{$5E_kkhT5(_5!5cL#1fFEXH z;uoY*=&=M=Cifj!-*T`%khY%;2%kS7VHmJ@FX%zY)Mw66KV~D z6+mrh%RCCq&5+Xj1=!uPVEd*KCKEO>_pAMUDNrgt;&0N~gNBT15+)$#<@ zHWQuX?Zu!%Z=t>d@%;wA93gbi2^#>E(Wbi}OJ^h+Ajx`KAPn8^8H77OmKQR*DVOyc z0lOe;<=Y0}a;{ytz@=pDtorGT~0$UVGX%os&0SswJ zx{R8eeJRv(qZ;Yq`CvU)-eM zz4}W>r`5IY7MF(od*F1|?TDSBU#+z_npT8mJ$`k<@3!El7J+iF=z!EgY8$j@@8~^o z3$6L9UtJsgcXIibgt2Cp>Qi;gJ&qi=n;-gqCm4^Fa!%};NLys&oCku^CD{*C{{6gS zuz8Cs^l@FME=_-bB>eZ%u;65$NNH~1MfMU~>O~$HEqS#)4g2%sk}0XX52Sq^JL<#6 z+!yn`XU>*L>JQrr)8p^fN)u1nxQ$DBbztR}>D-ljuDMR@TvM>}z2yC0U}ZRW-n4|W zz_Nf+-h7uGoe8ZTUH2b6i;?ZWcJ}7MsriGBb93M4IC&jdpthyWc3dJec)M}CCwNV` z{q(cZS>H(`^9rX$M*5}K9G_V-KTIq$T99ze=wk54c+IMlHtgRkspXW^T^6#uj`{^SI_LdC#t{P7@Zv%lbz7tJn!lOYQmDCqAQ~h{C;(Q(-o_q zG`2>IOx`be zwPq;jNZ4|RTh%wC{sMoza<}N1qzrQee zPf3Z)vdnc)dN<29z;WX$Vb0>lwvxuJz4nfFl}?T>>`G@8$lDf(F zCRBaO|IMWT+~Iz^B=?*52J<@)R5e8I{C+v8KWk;I7kqd-^tgZuYP^y?lIYSdfmQh9miy@jS{PapAiPWHTcuRkpGa8S>! zo8_Xd%Xy>b9I(uJWF#{DloiQmw(KiRd;81p&2x@+O-q|5P(M3R#p@`~$rmiCvea;A zxa=xi;_dM9m&AXpnW=>bvZq}O{W7%Z(6!*dyp_58!#%eybI7~s)}830nV#{E@awvN zeWG{y)tkdB8BZY-6QXn__8yRnYM3 zp3-GO&IYHq%9y=t>4Wzr7xFK&!T^#XMI`fdwh4Z}6aNHEjRWfynZ8=dYl=E1{s{5E z)sdtR1gYO&WxMSj5!MN5k=q*TJw_lxW=uX1ia}wdNGW>JOiHQEBfQ*`s^yR<#rsSq zt43dBd-C*VC_mpmNdxy?${^O1%lu5rJP8kvCUPAa+*900u>_O!wp%2)Neu`R2QXPh z4AzB1lxI7ofjH{Vwz%i9DFEH^Vx~AwCl^MT;@+yXu%68ba3c4!=XHYC34HSw>W8x` zah*aGf&^l)F=t@Tjkm~*6aG}qgih=_cpkqFFoXvnTZjpr zG%wqL5bo15g9EegJIHo8+1;I?7j~iocMybjL(BqzXP?M4q^`8>)^cj2_%@&53cW>( z|A<~<0cS$&E)v7T4-AaRuOqzP5aUl^s_YLa_69v&L7>}_4IG~iGZ-5*`6vTuKDp8J z5L2BQs_ugPcxrWM zMJKTa_4R&0GLnS>Y)^PG+yVXD-m9~Tbu&o^$W5d(t*f`93&V)TYSy_H>S+j=o-yi? z$-j*Wk^eE(oBv~~|7b{({ukjGF?NV=P4npEyCKUmu246uAX9p_N~u_8i`G1|!#U9Nt{@~2;l9D!Ekb%=|}SHhPFKHY&yoreL- z)H;|&Y)0V`f+H3iswUSolS1wVLKzWC$wAPzn1s?~8pI*@>5^gg1xKn>-t${Vv39QhkIA z<EbYprBlI?gs zQ%%1{I%dJd=!1 zN`d5%pTUmYRU24~B&ws8j08%}8->@o5rm!N3#2KKm3)WvIw=g*7Kl7kNl7X715qGy z3a;do5huN(U*ovtOTvRFMCqIBAq9A8c0{d`sUs>fK%YHB1x%}se#`G*SsLNM3LZAq z3xzxRMXCSBj&8T8({Yu8`X8~p$@F*l@p&qCJ5XP4rl36Ws!>E~XQFWl^|g?)39Jk) zd~=A4=|8y>N42piR+xu&5>vc-;2c|cEE%_=D-J)TDfXhF-%4mBOqD`4hghvB*ak^c z8sd=LpQ95ZIG;2pEEu%v@hvoO*kpC=l=`zX)d)$pXj?KC5LOR| zzv&G+@8Y3yzgazCknzk@NuvKoss6Cz1zv(v_JD%D#;uXj-A?^iFKIf71q{MUtac8Y z)eDTmVhV9tj`Td+m=RVFT~TmW#Zxi5(NGHCjHKQjz#6EZhzbv#`6?~Mfb()8!Nx{U z6Om@539%r((iqY0c59H5*^J-x!dGFr^pWwq-)##WZ#8wY%a7mwFZPw}BSV+nz#!-? z)MN%*)T#>1r-cDz(-s05I1r?yJJ3kK#l4>zKqB+a9b9aX&kVcm#T;mZU)j}tB?>1w z$V@3N3XNc#0u6wefOBygy@;YGH&4B}WxpJTtYx z(O(k%iCR$-QB;IU&zPlvCP7E7nzt1`(!^ZB-C8_x4GeLRUg;=@{aQ|SjPm3lAAUZ; zTv)k%i`TdW)A;k8BjOtII0JishFp3_?w^V!;{*NhFIS!RET=0 zF9rNS0`y)fo<`;$Nv-XD2hJ-mGCYBDJb@9W1Pa%ZSgbOo#AOiST1w5(0D_={eSLWT zi6(yNA)1dd{C=`&Dp$`80Wm=<5qgLX*RuU(RYd)i>}GnvWR>0j`l@ zY6!~9Bn7kKkDU-guHhL9d4l8?5ULXqkPcJK=T!9Lhizib;F$AyIY9_sj#^`Rj*zVS zO2(lA0$<;9Oq6Ml))Cc9^rN02S~#Q{n+gqSoDi8rP%8nY49_84y$#HFAH*=4lRi42 zF|nof6i~69*W0I?wA0HXRiR`-CSgeEYSVlEL;e}rf^}l)^bT5j72cexfFRL_k(6|! z8slC_ydJ)9Id4|op55~%e7P{O;>Rh2dhB9S#9e};G=*HX9tyg%#Ge*%S~sjt!ATe(%Y$)lIp<41ot5u2MVWhU-#s|TFg^Q$!7jqfH^)g{7zvM zrsLGUZ(|Pe(<>Pp z__8Q%_{uo}ynaZ=u_*eYm2>Hf8j12h2;X)}>IZToN;8DQPrplqxs2IdkI;G|tmlss za?BODR3_#bQ8w_$b$w9G2oe1S!4mafwVp=wfj)}SI2#rO6hX$eV}_2^g10S+Th;p< zNme)FV3aD(-JDkzqXNOqSnhf^6n>M6Fgkvg$=mUJ%`D9A1X#*;}N zyaZ53BIMg*zwWMu>pUM5W1z_KB70MYDO>VPAW)09(2aJGJk|99g;kn$FcK>bpb;J# zJL>1`i_3mC`7);K>#T_%e!n{U7fT}Z76r!-IpQ2aFnV{?R=R8BFy6}u9 z_?y(04l8;J8A5YB+)3xU4)P};v*&2Ao!Y_=1efJ`J0&D2=eFrAi?2|t!UC;tRnOEb z#LwY|B_+p`0P%CM>djni{8Ws5Kq>KMTbl_T54%Q75W;O@hj`lkRfmK z4AK4?Nm38;QXt}fTtpyZ_3{H(lVO$IyBql8bOiyOfbglBvRQiyBCAbaDaiN(tGbYy zgrL4GBCdgYJDn*Tr-dxWf<=F8nP(W&o&7l)_tgqfXq}pwYW)R73I^KbCRAX)ixE7L z&X@a8wXgyEu9~5@VKcvJD}H9f9gFl%Uc`+zc+t%~3%ainSMO#lIfC84NL%uc7MCUJ zxWkHwNNhkGdiE+B-T+vhj(8<%00{u3$0dFv)YUiJBGi?nxYoi4B9iM3GOiMu_b$V+ zYo~jhMZL%k>~xfq4+s-*qs%xtR>1!>SoJkC^|PY&GG(h(ebKHGRd}&=`Oh zW0&_X#$tx4V0Z>lqL`Nicdj`Yi5cSUE8B3Dn@Q&BxlGA1m^+Oaz%O52imOe94<6Z~0FJ3M}%K+?A) zQlcRWHIfZyX2vSWldE3bl$no$i z)V{k=N9$uGw#H#uQ22>9J5^SP+f)wvly;U?gF|hLFHWXiMpxWWC2tH;Rf=vGLfP z{TzEKULdE*WiPcMw0DXbu_8kPRPc9T=Qa_`iTKPCDCNY7Jfl_q3{3cn3_DRz8-WP7 z{NgG+iY@FT4t^jZld}T}!_dKXDEtE!3?HbPB>_23o8guBsti>TVh0lBNfh>aPGD({>PmA+Wdt} zbD5G7C}rSALlg*~<4d3dG9r=Qe&roQ%{ye_O~7g*{mUdUKc7>o8aA$YDstub4#L#h3_y~YYpbvL`2GIA=tqA zdgk#G%m)ei;StPW(#@orr(-o&6V@uz2D+kH>*06fosmCvE$wJ3_l~EG@H`hAxa%z8wb0#n2!cOZ1IBB01xbpUWs6c24Zz(IxENty@bB86#C5bA&`m~ zx|<8bW6i;DjAT(*~wN{1KkeGtS8T?gaemZ8PzHqsJ;*dE+&1<@Dj|ehV>Xf zoY+I!{hDh0O(j|X$4{%vp+oGuOL#(`BsVeuYaNg^j3P$wY>SN;J)~nqHc*scYzSsM zm@exbLX>l8f!icjBZAf{{!||*rI0n`sWK)}&T1!?FGkl&a=}-`0Vd0$4K$mT$2o? z*`lA8VB&A6z%c?ZU<)?JiVG5$?Nm*EBr1#kj5!ZiIypmVk;Vp&JFVSVdW z&|jS(;jxSUlq2hx!=G}{?r$Yarp&FDGAn5#Hu?~q z?S+dpkK0m4&!p(sWkd~@I0&D>79l>O;AaHAeSlZ>+ls~Un1}WS-LuGF{rA?}xh5^x zIZG_!Tsy5=Wl%cTPt?#nyvVez{UJ8!O0&)qnQrqSbdyYyl@^;p5a(G$liq?T=ul)z znm4f3FDjixI*M7nsmc`Hjp7?36#s#YY}HTo?vcomFn@z?W4=`%6<$QqK}xn+#_4f5pHSQW7iQVpS_A5c37rwopCFxkHyrtJLOt{udeSnF z5k~q}&@@P7?-fx*Xsh~I6x=0Q|CLsNXpp*E1AkRgi$H$PYs2pI8Ppn+A)P^pjok!c ze9E)c;MNb?2g2&vLwsL5Wz-qEi$&@%f_q)cXJnI*O>cl3c!nw7tQ{H;G%KIdL~c+a zrmPo>+yJ1|T!xC-ptG#0WQmVwXlJ1HbFP@PvR8G~L-y4Fv2Jk-hmz*S;L*91QVM(+ zI#cMUvOGw$Ve$#qx*Q%%9JXCzVe7_)Rtt*?a?9aCJhh2f=)hPEYH*lTtvJ+&SqaRr z5zZ?@T#!BaE!*CRF%JdF@#t}cO%Hk*MZirAEpZ)mG-P@Pyz6tK8$*UtS@|c_)H9~- z5z2!?VqWZ`ctmAY7@4OtYg9qgpJ1wlRgIXi(I0H82KjP}dokLkG@?3}C61+`)qaP^ zb@M}09>Dtoai{#lI%wJl=*=HUO%co+fl~8@Sx@K(#Ck1;NngXk`QTpwhvdq%*F;Z95$Kz-PZ z5Nq93m2LDS5*ADH%!v5fO0&dXnaaDmh0xkc<0(gmt#4I2LUm-gOZ0Xl*0)sl(D15u zY$Ri?3$Gw%x{D$>&$y4kWdAOLKuEm!6BZD{DUJ=#RzSchZD}%~1~d2*=CabmRAv|T zjyj4Gm(n((WK^|*4@Hs}%SttadKbKXgsOwf8gjK&oEkV_y#6n!Vx!8JpDwPo593RC zjcj#iI_YJ$GxQqwStW(6n8ZpC84MA2Lw}|h-iF&h(~q}_AKFAz|LPD5?qGMwibzBI z$OrjFaZ4AkDp#zNr? z&tscjAc6O&7HU}q&1OhA=n){dl=WJODvkSZ0BonQVYva9)zB175Na(o za}lWI>>Grj20N9@?8j4H!O%g+u14|GWUrM1?K+&NGRugk6g3l1%Lryzy|uQ$QB8dS zDe~155bGORXrSpc?cGc$nM7^a5SGBo>cqdcsAOFzT*?Ykp>%)KHTih+dcM?c5}Y^m z8HM$paN!MLEzsBa=%DIp+k47D~G(iO6qw_0) zdKOyK%8Unzzvl@oIBYU#4um4Z3JRRh*`OvfBxc?r1@p{y_M&1WDOkl1m(r&I5HAkp zFvM@F*=%Hdt^xXnUZi)l=p?iU?+sx?d^zwIqHBbJ;5C3}G3;~UUx9-090TAK8LaeV zb7=7tD~d7v0rTo!tp5=um29W4hOpe|Cs>n$k3R0$Gwst~`?h5L-wNO#ZAlSyfY+%l zU6AaOOjut|fwTA0*PuW1<_BKLgP7rae8bwoTY>{02HeAq7@!e-TYG+l2>L+2O$wJ@ zq+@1@nXpNKN3YPC1Dc3$LcTyA7)C&7XYR|Xm9WN$DyCCf1dQxlM-2w5^0)OTotbjW zhwUvl&*04jRdDhtnXIzbGZ&=f+m+69WA&n2+p1LK5?FF8qH!%2{49rT;Pxp12*ak%^waZBS_4+YdPD;Ov`Gz^pP{z@v$z5A<)(9)hi z?!dSlo^G}?tgG4p{zMUy<&zZw71=EDSyi~)Kp;LQ*ZLhGxKGo_3fL%t;aupU)w#p= z%7#&v(2V)|XklI!QT!rbFO8ty^QXTW#v1Be3=i-1@J;;iEChp_5ibYWMKdKJbda5T z>p8Yfo5G(uGA>Uz=3*or!rVJCu!6a(inUbEuzh5@*V^s>AM)&C)dy3jO*Y>8O5xm# z9+MK_zC?NOr3QxT`KA&Qyus0p*Qfx6a9#nVv|=POIuC{km_2;>X@H$%rUOeb$%w** z7HC-E+^7>=MQ`1e<3oF>0IB+xD4F4I6cPac3dn_KhN9|L0qaBw+nxa1$k!-ww^>Jk z;c=>!T*_u9A8gjqAAF)(N?<{0HJJ>Rx`doe2J0Zq7|vjrJr)oEZ>=UsDTIFcnD`mn zfz^-KafBD-5rZM34rKg@AMQm9OtrAM@}L*^0Ljx2uw<}2Q1%v1S_SYRmM}P8OI48Q z?hDWk`JTZ~z^igG>Bo|au#>R&@H&>|PYa>9%1vZ^529r0TnZs@#WvDL40|}ir~M5- zr;C}S*b4}tKE8Jqk@hRwyIRfg4pMn*l-`=lHT<+hD0^w-)3QiPQGsy;{6T(NSO=#7 z6IB%9p8Kh-#n12)jm!pGMl%60;UM2K1sb;Tk}h>B9g9@*ums4nVo}q&E?I>=kTK59!8-h8wUQ z(^ODuc^?B^Y~{)5!?8g2(Y#M@QiYc49eH{KzO@ceOI+4v6bdjntZZEM%U2ml?74=y zxj1$O-|6aCV30$b$@b^?VK}%&*mVSFk#)O`Cgo)0_!V*5|GI%iEVAay{kfX0i^A(! zGV56JmP5keRt={h`Xv?|Vph)?R03N98)?`(Q(j7l(#X4GpG$;A0MGs1NYgM#E)z7~cA&TGJXMnYC^T+wxA?Qntl;*fI={ zpuLiTwrqgB29~Qpsb@)Hu`vYe$2T<6cQ+G@zw(11kgMuD;m@W!Fq5>88PoakClVE1 zMA}kI>sz(e{I!x3*flo0*6Ag7S&BKgGu#(JsR?&zZrigbZq-Cs7aVkc)92BC^z29H`ysO(zIgiTq4nZp2~x zEtIqaSl99;w11&w#m@tDEF1YaeO3fNRRomxRud8#95fwcZFIk3k!W6cWJCoP6AGtQ zDEf8yKeSNC{XIAjCKdB@H;mG^fhObrL-cB%Sz$h0W;DPoVPQ1%cQxEMgM{o~aGmW! zhYk25e5w~|iegwE>eLRsqxeO&aWhFrf%v1F{Efdi*&r`Qm&S7s8d~nO z9I#t(^58@)Van0ehW588rIM>2kaKP+qE);tF4XQ%hGsOI99o6$5}{kzJef}DbH-nC zAQfMg(qTa_n=&8(g@e!quRq<0)wh6h+&G_>DYeLIpne80xJeIqsud{ueUKV{j!%l1 z!B|iB=#8v@pkTInkcB^gA(OMz_AX?Mwmz6y+b^$tLJFEPlMS4Wmk(j>~SiIt{TGFytH+F6pgqqvPiNd}FlN>@X=tKCl%a-!St-2l0LL--axQ?qwvoqJ;wGXZ@u2W-4EY~{ z!y+!~E3YiY~?N|}w8`YMF~1 zWk+i$5i~oca0Ul!@}3dP)LEn$-W70#4o|0T)>@J}k74>ph^3#BN`GPS+h_)evA>-X z)rbY;@e-gjDPMV!U&dF_153U90b)F1TfLH(Xl>|H+UC{ z;(4v<*1OeLXrAFP`SE)BuCOxiaT4nLOH4IS2|LdNNd1xYT=sY}(3A05W8-!_q`o09 zhw%DP!Tb&?G~t*`?*>MF6iJ1*7Zhu5!D{k-kt)LK^@#=OgwRY*jQ9w`c7v#z6?{5@ zmC8tmX_|6;KQ>i~A2y8@ib%ixDo0C`<#7F1ME0YCIN)${epVv@;|)Yz0D>=nk=}BR z6x`KvRF3IPu#(VEV~^XVW1U=!z~e$5=<-Ste35IX4G1x@ozHh;QdYmjED06luQ--a zTiN6HyxVoro*oIhGA8@y^>v7$`jw z(~6}!0D3ZY+%n902QcM6j{YnU@`%pZu#_EmK4jDrN--&%y-K!SDF7ivBFGhB8T2VA zDO9!t5L=0P0Ojh-m+WSUKEagt%U0e-Xc70*1hx2i0V~Lh)NKPZLyOlIE~c-kdozkv zyg(B4<71#Tu(RQto@@lzEfiSLeAoc>%P(55#^rdiu~s6Xd2~C<#|=OQ3O}O=+NK-d z6+5;5G%>YWYwpk6@)DQ%gVl^|P~~)&SlP}<+QUkZ>I8lXo@6kv$R|^Q^)+p$6d~G6 zE$m!}=z0GVXai|qO6j3wS@2B(*hOX^F<;dbbgAizN&t>62iu_`Rx`sh6~3TdRJxe4 zdf?pkLYKK)yH+;hU44(iTSY0V?1O(Ybl#3^Ypv2Y?5_sugI+v(d`brg;D&;KNZ2FR zM3EKo{#;;9)8qxmC4DrLJpp#PDP^U7B9|fPbf&ALfYm>YtSOzqu;c-q zs)CC_-MLXEk!7>8074S}L-kO3-2PzU1MRiJZ{!&U!bkv^^adSU)*YDHHv$RN&MtG5 zV=%f4m&Swb1GqC}R>JiJq8$eM1V=N3tM^d3YQyZ_DNvLI6SdJIKcUxf0K({lxb`>F zcrVjN!v)>L2>_$Qy|p|jTZ%KJ)~uJ(J=3*d(WR8RJBmHkkoMGm!+-CeI}UPdW2Q+9 zXG0MLI%Vg_gRBtq`Q2d8ADR!2BLu^RvLEy#z2N;b1;mf2TLK|YWekd_8^Ib?K6YB(5Q>;1 zp$V42F;In{Io2(FMm5EY<+y~FwKMkaQZ!j$+J@aBJSId~P_ZDSn`UHDWX&zJFD0^4 zxxn4E^38!|35e8c$h)V>B>||&2@CI`#TzdKYZr43u427W3Zn>X?HDp_cR0+m$v1l0Yl@ zXv{60>2M`|LN;R(8XE%ly9v&lUujM<2k=Bn(SBIpv+f0b<3*i!bsNk+So?pKvw8zz zEmgTjkosD^x8aYh$!5w1L%gdA!y1W?Gro59pKR`{aH8Iw536)UdeDRjULz>X%y#1Y zl|Cs$_<_tWXkb8sm>e6eK}*7Fkq6l}mq}S04XxYW;V;^Qy3MHClHe?tZ#-*(nI0zvLV_52YAkl$dNH)gFOID|V~6%@jl#L5KEsPHJl_$t0% zwe10{2c`#dU&1vFCs6{B8e^^oamumargRp-=)s_(mJEJ2?)0R_Bsn6T=;3ukCgw6Q&Xl-uY4#iTnqzO2qUo{(wFe1&@u!A z?&J68CKb0Dcvb-HWqDxmLKB9OJ{~0O?-#(t-n$Cq8rUv_sLr|R9V*+T7oXPyMmY z&~H~{pMyFGzOM)5^)E>9uF=sHhX_x$SqJxCnWuwmgr7GU-=Q{@pw6^4RJF$Pgm3eV(^XBp%goa_G0#?n#S6dzr@5XDnJPZ zo%w_4F9Z8XA(-NlRG zPG1KwUK>$;SL?c=l%}XsnU&~;KB(TO0@kncEEv+4KrM%=%~a@?niXV*?w_1XN$F4J zGTb-mWB9f$L-nADzFmp8-N2&~m?yIF7S&`8prRhPls2ysOqsRKn__(~Z@2h=h@$feLMnnOpFJ#G`%0tRZ@491v;zF!5f2P;P^ zxp@)vTip@4G$c>3`V0w<;Kk7SS6MouIvSrY5^XkkX57~P{XcTJVS-Vzx+C_F1Ncz+9Il zY!}y4bMJzBm^`Lge3yENe-fQ}M)i_`40DAYXWcVI{{RiWacvS(nM+indA_1Ww&G_S zY3u%jEAD4cR=dx=OE1tm#r5ez)^k%du6KBamHinGJ)ho!fK1aF&EAJ6@BdC{PZj4| z{fxJ>JpNZBuY?98YfS1#JC0GE5t>fJ%{AXNC_c-tgdk3IbQIi>N$6O%(!(FK(Ed6{ zOU|UmB#iZ+jE*y1V*QQ8&M2b%u*6X-zb|n$A2pq&ay9#XHg!6ahT2Ar!oG)%l!oa| z!+7MEJ#kcBnqIJmDVQXv?SrEB7xzA@&n?XHG0=@JAc`ZJCQ6!o=!sT-4c@&M1jnWu zA~h_r1MFl)$$5us7lP52Z>?Qu9DazE$=xhvjdwLc5nC|au)~j;a2EBxr0WjG87cai zps0#~k|woyt((+w1rndws+AiV=dU$kTeKb~p}-IP4j|P!hJ1LMQ`Cu=sw65dW;`5zfc1emknEx z(BDmUT|lnR4jSX@Qu@RhF3eHuVV1$a@dp({5?iTj8yMw=i#vK0R{5G3Qaa2#6#jNA zUTB$&*3~dc;T!L{D8swy^R@%IR{3qFyf}k-(~mfPoGqxw$@27PZB}2&X zhIr9yaEd0|B=tb9_+g)kQi)kSO_Oj7+NZh1$>SYz(X1nHa$)V(+inS|rkBiWEJ}Pv z90w`L(R3ej)8VwA@_N)mU)<0hJ4*63 zzVsL-<{ET(M=J!1n@lj9*qdQd3q}ExIGm&VG*?QN?=(+pHS$`)E9M+}O3md@^?nuR z@*6nEyd4z-2FiP=TDKZ6yHgx(^?y9(it6F@Cf?hO>+ zJ0*4EB)jJoQ;^1{Rx?N)e?k?o6(ZgO&Pi%-m2P8x{1scisZbZ@Xy_W8wdTpJZmKOP z6JYbbXQi1L7Ed_;8MPc3B`6&o!F5M$dS7CYYer1jBfABx6tjG3l{@cHM-gIU%f^=S*jHnA?(xjH_g_WLv--01@~)5z+wvWA-9J)@*4E)r zN<&Vey8OjxiGj3%dMRIoXJBwF>oku(<|35HWIQN85^99K!UXCD^-YY>UFAXEYvorx ztuUP-4ZGGT#*?Tw1WAFJP|aUrS!MLOFHoDzu)49iX2#*naEUZB_0?^J)&15WaDF&D z4tUyoY% zweW|IKcbqxChnlam@tV~eLuBBZzs9Rp}o;b3U#j!+51VRJNw1RW+|*% zopH=2a=&&tuyvr;8!-XlQw5~t(8D+^voP`suQKxTDKs)=Rw*2MjjYoQ|3QH=Thkfz zReZK6s`IIbQ*a~iv_Wv%%eFE}zAQ$MH0cZ#3cJ74j41Z;pg$n^&n1qQ>mtnA%up8T zdj?A1NgBRbEp$KXA?lZoOB%J%BaQDFNjj==2hLC`N@5EB%P0~O!cUzfN~;sXrXqCZ z!bSx)=7{cRg4O**D@TlJp!GLu!A2eAzkbNDP}m8dLKQ&;DeQAiGS@eeVD155)>}(; z`I{KU0=wtTdFA=9NbtdIcy(}YS5HHic_M{vk(4t~70UFmZ_6+&`HHJvFt?=EPsvAMoAZx3qs= z9lqP@yWYDj=Lk;z@M^a3VIOtRon)qIJX6V<0~tn(DGK?Z?!lwn^RlBK`mA8ena`LW8>)fsCgq%~yTPyMuo8Y7v@It#5UNc~WTa4PJ@Puh+=`4U*pAM;u|5 z>%rE+rqVL#nkC+SdZ{?{5w5QmVzbOpk{Pgu8P@twjxgVjT4e}5akO0F&2px9d50P2 zU23ZVtpz+@r7)(XNu7dt%%w}+Okw|0Ug}2nK4eX*aS6SBgqs+{UM!EHca!N7+kw5d z$T6%Q81$f)*e_oy(3w-4-Khp7F%EhFgI3w#H7|P#&lO1YZH>G`MxW0?2U;E%Xd~P# z*)|WUE0`Y_x`lJdRWac3Zf3!ULF+Fyut-mH`4tnxfZK!Gk};3a41o6XCI+f16K}tB zK6L0mt!8VVsVp~Ui9>Jd9G4I9Pf4T3QeMa2VmJt>M`Ez{lF{!2A9gfnw$DFwU^MNM z2jPdtZX4tLXQ-lH7sC1)n9 z9$xnDUaCRhbzuGyPPmHtO=A6JA;#5-(H4S;r|7@}O{5lDH_>^)wOl&fg!5*j1Sx;8 zJ`rYZLgz=!dEvEnWA=$J*{JBj@@PD3W+AnVi={LCyc2j(o8a)VVSSr&a9`S%Z;1#$1lmSk0`C#6k{V zaG8(_`F1#ejDQ|ys8rLrD8nH_NVS=&ZH0?*5c}!yPxn%)q!cx;^Z=|fQPzp{?oH;~ z`*?@as4mZD^X(UwamvV~cE{bl^zP4wtxcJ=m@qP_$V3`Yxtp-F8`y#$DVSV{TPu@> zEP2K3e?qENA#0dDWy2P|@OeB!prwbXO-L#^G|6o0py*J$Wv-dq7t*n$MfcNe4s_@s z?t){LL31nrYBPxpMiCABc7MCou$v(R=o#|(>aq>sLG(8uNO2t5(he{LhC{fD<;=fp z6K7aqp6`V#?e8OoqfDyDRG4o+3^T8Fzg~7lVe}c+K1XWDv$AWf-@j*2EeC;?7uhU; zHua4KVeCqzoBz5q|5CWy=xCo6?i z^IH6+@&s>)DSeX*g_h$(lW8m-W82Mx%K9Ys)N@jThm0Py6Z(v4AnuUZ8!9-^mD4dy z#A(L5i@J=U(nbN%(LICW@Or%Tb!8g66_7`7NdFW@OUPjjH=a@p@{>zp4^>t+-W`uo-ep9QHW zfEF%lEHTjYFvfaPL62`6rlZKT{$68z&^m*(SQojdLlJRCJB71lwC;a%@3p}{;pi|a zmls~c8>54~;tPGuJ<59p@7eF;ay~w`^DEQ%iPJ+>7%6?Y`mPn(Bo9QXYd#nxFv_XOV3UO#Zo{q*r*U+0%E3I{n5DR{2 zatjZK-7Ts8TXs)>n^1$SF@H21aVv(%bqo~Cs&y7cTqgQRX=WN)R9bhn>^HWw6d|fz z@a;diZAwj^4l1vfR`;yRwly?Nxs{gQV>QbJn&eIed zjRJ)uY(o?IdkS6Ms&#Iv5QFf63fg(ptXAiJS9FE67@vo+5p9< zQE~z)BJ#Br$VD&Jgr&8MN3%tN=5+!!k11x-v)EOL-)tpCQe`9MddI|_Dxl21hSS$Q zg5m;NIPg6Ds&AT^p{lt54yO#`4<1{2Xc4D!uOQS*2*R5(0{u@}5$M1_{7xHi~r)vpxT@f1G-zAJs zgb1Q~wNN7u)lOFPQbD3fMJ;;5*hdyK)1s&&+k1O?%&#+~(>CfhORT+ztsAHaOk{qB z$O1IEPskb!@sRa7B}fq5jrs|3dgf-0IJkDB&T0NT-SF@u8_~%XOeDyp`N_vf$a)># z?%!38z@B>x1?c%CKY19M(Es#Kj@?nx>F)*fXY<(7{z)GF2Jb%X-34*)q>jBNRysrU0+w{f!!`q6#dhm~(q38U{e0-n@f*;l#vV!e+Oa>(Xs>Br3Y8Y|r!)`S2 zGMxg4ct>Jb=L;}YPqnp<#NmY0#E*+|WuT=MM0e(nQ&ux1 zEhENqRbr+lv_&w)Q$jWrh3RPC04JM)61rX*buC7G0Z&EjBf3^W0eLG!uD-F^O`U?+ zu4Aft`Ga)P@+^Q+oN&~JFCWFe--6V$gMj!7Khn#N4cvh)D(qMUZ#^`oUS}Em>uegE z`4Q)+5}g^=3l=vH5_!g$R$}t7m(W8^5Ly#!=(RRp6)gHA+tc(+rd#B9EL3u{hUnk6 zj#JnTg9ntiQ1bLkaMum-7}oVTG26k!4v<=EMS~>P1YMvt>>7D*bqmxEkLZXZX6}*S z8H2nRwGsNtQq9GdYYZSI@I&Po*>{{|hmPi2;MYpkX=!lf5a9YYoR`vOuo96zhIEL} zhQ7hY$AqI<(SwJ^aW`79DUj{rY%;?|Cz#>=O?v;y-{a5{WjOJ7X7TPSw~V?G+X1b0 zAH5|vctjdFZX4|6sEY>uXEBR=VmIm(bYCM6vqEYIyQdLOSD8N-%zEN?+3V)HjL9-# zNYTaZ@1)@=8g}_wwnFIq7n8y^3wj|4%+y348Z|qnMIf_SdALPyANEQU)&`OYle+=# zUZxA*%D-7*UeYJiKLpkR_HQfm3>peRt_+&(VbBp7m(HH;O0adM;$vBYC+P7B5noV%YsAGbKv2j&=?0-(@A&R(>{!a%}E1ki( zr?JY#RS2lE3=}rOMYSY!=ZFyg~j z#xGRCceOl=S4%Er(T!wXAdih}5k?4~;=BN4Faz!58Z`=PJ%=+(S;rO)I+FM6rbYFr zMLnDd$FNrA*O5+jM(1h$ZmS)7f_3+6^?t{8$}Yx{2QE0Py^woM8PQzaq*@IlSr617 zPgXN~e!Nx4g(MC-1(Bac0wzGwj;I$fim_ROWWqf+t3A%wY%M?23%iohb5HXW zs2rDy8}ws=c-sn_#X5jku$0Gf2(Eyt4ok!Fx<{gYJ9gVR{P1Jmp@^9EfxcMzC)A`H z0`Gkdfc(PwaE_I9(WO23kPYg2t3exhF1aXTbBwHJoR}F4RE}mU@nN&yeI>%mIGt+3 zmbaHbP9JCTCMo@8Wmm^Z^YKAvmvDokeyT+fn_;3;i2DSHe9&aEWo+o6zw?iYMaP%# zbc(B_**^A+%_gwaR*?Ulk-C{xOOU_tbvBlT6gf!eE#)CJhmJ?DG@*vKHiiAxo7H=9 zDw|zWvqoXB;2(*n$#SW6Bq#IqIw!>n6-OYLxqywC9)Bo4@aUHI)A5Z0XUt!OeAsk@ zlo*`()Mt8=U4Js3MoR@TY;?6+=%|%6Ysc!UY7E$&54+$kdojjD=dX+2s0#tQ6u#7~ z#`H@UXhItSZjH6$9TKD`%##4+Hhuhtot^VB0{TbIN2$$d`5fis0r0^MfEY{JW(?YP z_pnE165UjfoMzKSlKP-N8d!TWiFAPr1eVDHH68IxB@se|ULAei$SPoSZS6Ys5$K*nOr8hfNMGO;9P#eUYuW>NnXgZ+|5f8$RM#p(T>yo))1r$u-uIrDGN^UiP(e%KI`(^RM*t(ztTzb#Jp6{m8pS@od}7G)>&R$vBV3?1W$CUmpb zHq{v-werXyxFHMr=ps`X71A`J>qc=>e`u%9$rR})4a}XP+m8FUJWmk zPHUvs=Id>l$pC~wWmSqZ>U$oIrnoiDYue{yjI&AP3SNF)87r+=yqx%-8q7;-U-~WL1>BkB;Pc3|M#Eh(-zsRWC_V@SA$sA^<7Ad3@w@z)iP|Sq=R2@g{a$ zJN8^$4rn_uYH>?y$>3wP9WJVsl(Z!uwn^RmkrX)b@X7L`RAOSh@ z=HJ~j4nI+-bzSz+q4RGc4ee?GcRUQDq+k{-9dGV{Z|axI^sNGx=a>s=Fj67aXf_IM zoaWPv|3|u6f;&FpSsU9OPBrYV@=T9DFb+8Zt#wPNCfta3b%kR%B53ppS~n;eM%SAJ~rUh!gQh*4$Z5; z>Q@<>?|E~0D)vLpz3w%uOkIOY9K3;vgt2B81|n>r0I|VdY%mHP6x}#4)U4|UM4x_x zj2{&##(dr=Rtx{(rfkOJ!duhKI+qM6+)N*=W)}eoFi2^!QDDh>#__VkIt$kW7LwF* zf)f;`wU_$oqCA{rjRNqUoY)ZGfJW)94zf^?qO%x{CZ;9fO}{FnehfMe8G-}L*xi&X1e5C7 zMJ{N_L+P4kbTj7LcQ;{HPkTp(OBOJhyhAA%IZ75lvc{s#M9DM_omXSNeQsK|%o`%6 zqGg;VNY(-rqRVySe-6s-YsKX|(ODAIMiMn_%ZJieik5GJF2fA=?MP z$GIJdo%>(R524!k&hwkLC)K*3nlj_sV|>O$81vRKv5nBUXxJq+Y)WJnFEy47w}4{> zVDC6cm#$R_{2c}-5C{RBclxLx4`Gjv!V3Oh^Z|ZRK2zB1h@QzcE}y7;fiOjsa3{T- zJ6McJoe@JrbcB)jPsN;5eJj6FH1G%I9+d3QjcXS;d9%QuPypr{uyo|pXu4#LMssjX zH!_)h7bH2(->Uqb5}YLdP9NujFq03CjTxIGwOl_@Tq8h4x^U3|>768;dWf?=JZP~t zSD@gZG!{7bwvWrjevg95RTOMZ7ZYIDe67LTa7H?=o&WeYxsDwtjCI&Bq}=jQ4z?Ru zRF*J%&;{(P5hop^X1(7AXAG{rSsN8y!yc1h(-hM-qTxst`>S`li*G71WJ6 ziFa`0T~vuQ^0dP6qB9m{|EZaK1FY_97Anmf5tT>%m^AMe|5V32CdT$bEENwZHjGyU z95lcXI$peGpkd5`S4rugzl->uHW?FQY*x-c%FWrnbIt`*S;Vaf4EfWV4QCN>w zR{4@m&949k6@QEhI{mlQKnqqzkg^{k04M~OFldH56jo=rfqL&V$B@G0?#Mqa;m)Yj^5>Equ25cVowUJatUY#uaV?0M}3 z1ybjswI3J&(pfdtOzK0R%wC^k%jeg zJv4Fug(m}juX@%Y)TkVj;fCwxsWGHG&1(=OhDpu8t}uE5VFv`iQ{nH-H4s73GZ6GMk@lURY`MbJk$Dkf9<>Ljzyp!JmIWP$*T^cqaHPGVs zHbF$=2)kTr&WzQ?BEE11U2ubnzDl3&R{=e;k?god+!q^TSrBxSn^YbrbA=rYf&i?) z$wZDCt;?=@#FlBK?&K^nY884MH`9L=8^a3Nu-6iCH_vR)=>)r3;^cEy3WMIF42vV1 zIhEvCt4L>czY0l02>)Bd-bW;5(=ov*lu4zk&acv)cVPE-zV7mQu%9acg!@(cKoKv( zrG309=PN(ra|r8)tU#6WkLWT}_d& zC{Z~7J1W$;KU_(asTk=<$ja4hK@2W)579eC<1A-X=`BEbV&Xs1#L6ETV9^ZAhFani zVsX=-BeJP*V=sykvTDm16V|?l?jdU8J#+?~=J1h)gJ#$`C|I*eCx1xIgU&OC`sh|qE2uqIy^sgD`iYJo`|3-M@t)@WYu3Nn1ONpKESpuDewuMV(cYZYJ zJ;FwCuFDu0juswZ__xtz(3R9Pnw(iqNKFvA&sIMn{VH3sQCG1d5b3j)9dxbAEPP8Y z3m{)cK`wSD~dWEFh7|Nv-z>(~n)OtDmrt{{QZx3OIZ+;Bn8-gCq_kq=D zG5VZeDck00&Lu5?rR^ICStV6$b-d2LO0dM(($Jf{Wk`CUup;m>W7fuaN$2^}yR%Gr zc9%}+?2ixATgcQt9JmMyP~~JGvt+ZR&Z8F9DyyO>c8|s@N#njn zV)g(Ovl$leo#~dk&Q6TanI&;LaV}e|u`}F@iiEArZC9u1m3rv5a*cgg3mp<6nt2 z;(%ANp#yc|B2W=$rPJ8sty<$DsvWCDbqjFX48FUwb_Ycif|UoAE7TT+4CY`r<5%pB z8_0?@|C11$E&P)MOJ7zqHk6NHvfoo-6eHA&M>TQ+a?#$=@cxJW!pMOl0yq!Y9lu#R zH$&5T6#goMa5Iu>uip_E2NZsFvTl#2vr;^79VHL6xb}{CcNXcwKGYdC^AcI`h=rW& zi23$VSRdE4;OGgQ+y>@D_*yb{$s!oz5FZO!*Rp$K-%T>|9~Eo4^0G}|D9ZnT-ly-uwlR~OJf?Mpk{)z7 z_1<|#b0NtI@1l2a+biK~x{6t4__ixwXk{mg4fa|LJ%=s2OMjb(y`l_W`+2wM69Y9S zZH9AEB}@d)i5$!AblnYwP$N5XM&a5@e4dc}3libWEu8lup))J0&jnA&DK|<9qD8K- zRz<{zU97efz>l=|5_O`MRN5n|d|3R)8EMo*6+n%sCwam>(>GqH-1{#jp&^nw;M^piWz4>+VUq#`aw)V5C;ft7 zH46Ufmk{#72(>|P&WN6nSDI#Qh~Cg{(XTQdBK(u$G);_QO-3B)FVaQdlEjjJMSb*{ znG8d`qWT~#5_3Wu_AI~J!jK!fhAohfWeXJ499gG<7-yBtQ1!$WN~Q>+;RHqFAKzGR z1JXIHDG>O14ceOxFyLoGHXyb-(S60~R!B}>VO#A@#!dk@f>nM$+{k*6w@u6l7F`58 zdb5*jjOO6Z{fuRNqPP{ub76~0ZVsoeq|K4hSVCb+cKpJ1njKAX>0=(e>RW* z2qz#l?hlPSYt{QV*>nE6>Sk24u0V}#rGK(o5)6He)jp{xbuWnyM3fhGjE)7ByfkcKSoq$4*jty2b$i(O)UJWHguOzwjMG*jc=NJUL0kv94KrX6SkT+eXm zaaON~Gx`Pw${BhB@HnZw4^)u_E?jyFYe>0yNPb(}ZX=*}J=L0jg{1Gq$Yor3Z5)K@ zi+OUfV>X?hrg?Z}T)yn~@6vytv~L>8OkIs3{ASnoU0-b(lyTw2U{g`H0f&&Fr2(|2 zwth%ARnSE^lcfNUtnyJDO&BOe&q%Ci+!8onw-YuCrJz}+4pC+zT)#ob#~LQ|SOq&z zjm@=}Mz-eNWK?4fT5Mo7)|p~tXj}6e37K;GBurMk0s68dfn_wB?O=z6X?v{Szfxz$ zgL0uV0%wjOOFbGwJD{u2G&6K6o7$8GjN^_`6Y130K5BU(-EPjX#Dobyr3=kW$zlCy zLgWC63kk2D+@m+nWE7?<%bG`wdm@JOx4I79EfsOr0|!c(a(jqg7tncx+@Kn;?y7u7 zAHP{}G(*fT;4wML24PV#8+;ml!{=&^X6{qHQ$niBDK6mFGZKmBapDRn-Iff-6gaV= zKMDLQy$u2n>o*$r^Zeer`W9Wt2DzJky1`oH^%rNaJ{W{B2ZY0k5u)ThY<05{aa%>b zY>i5(3@pv|H*8DY{f4C3bK%GM)r|~Ci61E_PZl*P+xE*`q2A;qTU(nT{dBf_5;*%u6e|Ix+m=v7yd%A`Q#mZdD)z8KVS?i0k5~%fPz~!0Iu0zK(M{u4gQQGd zjA6T(joR9F5{sQ#<;o;BRO{DNJZMJ8*KlT=Z|Z{6h;l8nQMW$>rXH-|x+U*X0B5)2 zX-#+ry94_Z6)6>;Mc{>>bPD8+ROD0%zsj4b@@D;iCeR$c&|oniUbl+=Xj^`j3GeFo z4~GM0&Rja-KmE|RN3$|sBqW7(?b=~DO$LoxD1qk3#nECPCk|fR)lDI;0le(~T&_jZ#RYt zNorAzY_HEQ*9qb9s|RS|J@yP2H7aInwT^=p{+%H72@It)qWm{vH<~7l<-f@gICmbp zq}e_XVg4&-s+1@3xk)1jtxw+KWueVA!CGMqquwm3Y~cueJGG>Tjvq@!yWOVLv@g5J z*j@1LL;l$FzdSUCie-~(mXr`3AHtixmq3OiI*HgAaLas5EQlgt>3rC@!*VT;KQW2A z;t8bP_5_Rla#fvriC*g@|At9+VjOsCVK>MfY8lY1eavMBI>zBf(}{B*Y+&vWvzPFP zjwkn`F=NkCG@c;AyUl*j7ezifbd{ZUM&cBdYf)N1aYbXl){KtRi9);E{`9{^RhlR( zAP8C+khfnuW-{zYYxUO8>7pD1p%6OJgdR!d%qA(<=1Ye6KO}_=^5c9;10wQS`ovcL zZ`c@2(r=T(l~|CfI z0^KzyKhOJZ-A++xKG1;MuQhIWNw3Demz3V1mHUX=;`(BmnXVN@X~nJhe$Yyug*v8L zgd-092W}U+KE!k7d9iDh1XpWqvrdMlhzPt5$39dV8C_4H)wU~`orbuJ-?fH}k$x`p z_xW@_hs1h+ddE>VRPU@eVJr@PUO97FUHP_@ZC@N1O$s>oSH$qhy=`Nhj%&9?e|C`z zPh&A;@2I6hp%3~$O#2L)$P7qW$Svvo6)>ZTQ;1$(=Oz1_NmVH<5xm#IdQbQj%dXfY z7{62=vNbQ$^n~8fMU9^4W5+t=okN6tzs$5&W&ajRVzA$)?!C2K=h8h*A)lNvlYw}otttiMH0PwV4A7O9o8yILy>#+3xkhc` zV~?mFYDcGDbi_NOO`!eioUJKN-z-96?>{0pdJUrqHj&uWuQ0J5m`KQRt<;1z&oFO- zj%EdCnb;n;J0u}<;*^JiItXDcfiH#kkg8cNoV`iE%EPqQhFQn*HS!)<+MI`&D0Zx_ zutw9Q{b0q!xwIeWqqMny#E^ky#x)+-f^uZ`+eb|gga!nny2KS=xxW5n>$6r z1srXpYZB;{052d@(Rt6*I}Q@@NcCl^iavIg*T`GXgf}rd?=!b1iEsSLY+@4oqHPsd z*`{v-O^{SGQ@gf~KadfBb>PG1@C#)DN5A_|*L%47%C<3+PyB3Rzf7vIuF)QG@=nMV zC$Xg<^Fmc|3_g|K5VrQ#YT3AS%z`ABOFL&cpb-RH(OZ;GGWGCx9H`F}s?0 zUmga^9bPIXf&Nl^wIFL9yMd%HCYS;_w`Qb)c7J^%4!#%qX#Yb>;~LDObd$Rn$QVL> z`mHh+0bgd3b>i~Ja8)iw_Nx}Kip`Z`@r5sjEo(S$Zj#x#PRve(pndySAxifZ1+%V! z*3WSrR~nFMy=<1kys?^L#`YYR5c3Svk0CyR^?L(t0Yd)Ryf)sVM*f!)d$5S)=?EQJ z>INl0zS(`O_Ur1v*iHbsHfx|cZzcXS^|lZj#u&xD(y(8Ql@B8Z5%$eJ?5-S%hjB}J zqS!i1h>*WpRs8~NBlzrEjJua#B^{YX9~1ah&tClXOSYI=fjIpWXLH9mbK)Ct3)e*w z`T1jv05%FQC-M0*Hf_>#O*Cw@dOSfvXIcbNg2|0M?A0g|X4~tOnR)Ws!Lb2W*Q+y8 zW+VmCmw5q*x5v|4!{wxvck`=}s0k4YjIs9iI=7e1@CQGt z@v)#HNQ#H1-7Lk9e*$k9T3*1gLN@w9gpntYNkN1*gFvJ@wqNSaLX^Wx)Qiuk1=!B9 zE+fas*#7s+czzt04-swT==f15|A2w&=lRYbADf$F`{g%zlK+vR^3S6Wn2!$&4!HW? zD~!ykBJ7dSDs}xF9+BF_Pl^Q_u>1l4GOW&CF)oMua^8>ss+N89-m0NhX<@&yjt@yJ z?hoF-bnX$qee+7Ky-PZ;jq{6jdKi50_j%*)A5Xh7_w-p8%UqLwszFixx}MzEu#31! zkJjrpFr~xf!0ucu^DeIu+V~(~ejy^on(q;zDVEts&l%`Z`0lVzjTCM6EE@lp-MF8z@$jq&*a}7%H0t5+n8wk zN|;;M$+D(>QT%jvP+`ZF`yXD7ja$YwhyNl7I2WNxKV|v4;MEx8R{LcinSa>u#qsN9 z3sc>VtI}ue&Jh)4d-hzk4Hqx|<EKx#6JBK2gdhQwF` zRG|ME^dKo8)s3ws7n6o9mvL!QpL{H6fBm~)6CJkt&g7r(EvWX(|M`YI{9oCJLD|ce z9XvEG$IIEFK6}N>l_k?IY(a`O7kh$t|BvjNduXv}1vY_w8oX`4N4Cq$`LW{`pImci|33#5#r^hK zMrxzwYH`;Fz2$bD!i1ftb7vU)MoEG4rY=e!TcZ`%@#58@cX7YSR@H zdNbDjcq07v2d?tvAMRM{{6ev{-11bQ@`p)3eY#-fx0#>ZiYO{~E1Nd#P%`*);p*6y z`Thk5t}IhGHigWVl;??Z7G5ve+&UOtB?q%bht=#ZN$J(b%4k+UF}m1hFXhGN&kg9VN~>h-vqZ}HKXRm0qILBXMNH96 z1}2`3{jCz;IXB8+A;v}Z*6a%rRJ!tf8*DYWgbny|JxYPvdk9hp#Di zKF@VE9^(2{NKbXw%A!*jDlFi|OA8LjLoN*bgFtopr_RlPKVLh!mBtd!ddY99N?$*oTV z@_zn%{8X18Jzo47u&PP6DP>N~z72;3pBHavEKePn760bM=JRVa$cz7xoUdo+?R(%H z*wMXWYxGCj1;w?t1(U71Y+vY`Ke@Vo&GO9ywXQdpckNlQa_urzJhPY#d_^S zIUhV$?%EgjG;Xi@kCpxR$-76}9_Kji$(r8r;f}c`_D99mmip-S&sHBV z8=JC!)`|xkve5wC*AUWjR`2)^>rNs^r6!L^q%FgG!Su+nj*9GR!(4vHWNxO*#Fwkw z&igHL`_9dt7* zZ_m&!ZTMnK=!0(A)`|JfmHGLHcg>%+W6AiP78#eW`=KwK(HeasFm6AMjP)5UI^uFZ1(zBlvB7OQdnf+y@_ayUufvh2MVR_Q%8DTb?If zY5i-#$Pjh^m`O_IWcPyA>n2ZB?5xS&+1PU1czEm3zR7=ijZcjq_`E!LZPP1pql07H z!0|SLFAezJ#j=!6=T{J`{M*Qa0z`a0E@rdT9OFgAw_3BOXo7{*o5@>WD|Z(@xb-es zW@qjHgWO`}E+?m;$nigYel_#LUiYx^r88P}6V7McDVX$Pk#O7!<&JFYDcPO+{a&)* zY?p0S``+dLl5^YV=Q}f}%zPGiMu*6Hl@~*~XPH3KG@i9~{mG_fT?5qd~JSM71#8cWccE=Klbm;TEF_h`q%HJsm3oHE$_$+FMj#+?nzVL zThRN(!(fk#NjufA1K#^Xcl*H9&x#+v3yrIK=+K{oB@_yq1ypaKCHBc&wc0bJuzW}j zXd6Mv*H&|~i;qnl)p#0ZGY75R%u}}~t8F>!bYHjNHJApJiP@ThJ!K~?0380lJ>Uc= zsbD(4WT~dfW}0k0T^*a4S3So_$2*)Wj!q7=8psGCSC1T!$lGV<+?uoP@F1^PQhJkW zU>5g@(k5h$>%?LT$>bL7gE}a#p&MDuid3!>msnf9)Qq;Mj_bq_&SVeMhqFz2_P}oX zb@nypYbl)%zg!)>5-jh!6`r2||*jkMj_ z?%6@aCVesHJUUW6CMK)>_B`|0F>h8O!|}g?Qg*V`Mo;3`9MyW5Bn5oEidqz6Y;}ZG z8`}v0G1v#UBE*xv|GLgj*n^DsNfz8#T~w1`uTK7wiK2qH_0lhxbt~!J8};Drxn(*- z(C)R*M(wl5Jjt54xH1khJ*-nSP zA3Ege`S0ynp8w_N-uo_&Mr2hcT>s>n?Ta}@l{?e?*GK2Qyx?Dc>S6KpU+X_!VC`2d z-%~bXDbCA(5nw$&e)FR<8>j6a*ZAe`8=9SJgG)N{(AT{d{j;7CB}+w~)MBn&_+4yb zd^cUyMoFhWZ4(<7Y=oBzN3D(|^6uYtI60&9)^X2{)#K(l%_!^$P=+puxUl1+tk0~@ zd%T=;W9_n{&i%E&KAmuUiJ!Cb%e`S;-!FglWzaBnDv%Y^FJL!zO$TU}?{9&yar%}g*%B%TEAjSi{H8^&%mpKw3i;d}4)Q=KlSj5~LW{6v2xmR3rt zL<=S^_&|Ix)cQiGRrvVk2lp0ycwx))*SE41oyLKGF6v&er%!hHMd^&gp&w8DZD7~J zC$BaKoqv#R)v-Qrvfl)6r?FEi&o7zmp8x*7gR(i9M+bf5xyJMUNmU+qs()SRm-1lGM=!hA z`{X?Swd45Gkf7xb=Y!-q?!~_Ze5$yAG`Hl;@a?DfFkSIxZjv5fE4lb=*V#PEUTZiMaAFli~pr#+>d*g-?*};{0HTivU|%{R|a;tFHpP;7_Sbn z3Xr^H?xa1NTNHZWLEp6URv2etcCVg|99ow~y{GZIcK#m$9VIowA(KGc>u_)DN+Ifo zqf1bG^iL+SmrgjI>CP?LGU`bsCGIAoI;~lQVj(i>HKBiz!a7ap)><1k7=Pi6S(dLU zHH|#RS~pS$>G@6Vv}lorC&>JlqE3Qmkm+df5c!^&B$8; zCWst_n!QRSJ$M2JQ(NbXkV%=WODB;Z&oSfKTMy9ivH>@UY{VYYkd%Q31Uom`C8?Vw zw(E5ke8_-C1{A^@hCNBn)l(YzN4yiBP-t6iP)yx(&DEwpXd{ZLpa%ZQ7#_1+Ic9Xt=>c%-Y>N()!0G=49o)@X6465vI(EAm zJbnpu?dq){Y7|x_DU8atfYfMYk>yla51=afSgfBwptVmPW(iwpfV4~**8#$Ll5xp}{IY>z`)vclO~f_o1+zD< zpE{EzTE#BDLA6v%LscR55>MH;3X7Tqgw!|oQzlh(_)`-s#0kV>-9kdvd=pb$i`q6Z zmIsq^{ zQ4eKO$cCA!R8^oY79<)c(sBF~zZKKxYET;-koIFy<@g-w%OW5#UUx-lQqf!m=QxBc z16A@$axu#V8%_w2;=;fbHj*{Vva|X6#_8pk$(We8KmCuS#g5tSGwGw%{{F3RGhQ6I zD5#W4N#FUx{5G-LG(lmevJ<|^wQj1Ryw^1`3xeJ+$)u0w9Dq#MO%sGo7f?@^&!+Q) zRN>DimYjI?s0JE^K`}WpqmXlgIG(Ypj_173>g4a@gxTJ|A%4rMXwbwI0f+eA72|#1O7}%TG8E+Z+b>YA}CRO#x!a?{0t)Z&XxjQh{OAMqa`}K*@ zc-lJGeXnJ!kV?J-Ij}SdQIc&>Jz#>X?w}1x_aIh}YOU~#1v*U}T$z*NRueiNZW#m$LpkrT=^E?v_;5xPKb*xFPpk%FvNPmgxl$RumolLAZ2cPHP z0gNk78%AEUHJU!ljRTCXEG`ak_|%*uF-j_0!9NleaM8t-SbhD7^1nGdDXMbGG-^l4 z*6YF+y^wwVNML@x`x2FOmWuAMDjD=NPAz?*2@VP2|7Y!mi1r2VhNB50&q zBZ$(sYeU4BO{li)AxP9>-*-K zxvsg|nYNH8&+}jI`*(BR*Y;5<#2X>b-Wm+}Nq9Mxl)^ZXiTg|*$37uC=SGb@(n+** z1VUpM6mIZl9LZ$8r|WI6$09dkD=|5ho4uCP8;mxcqCjIb>kZLa1ArEIU#m2ND}4q& zy_H*|{CeJ~aw_*`?p8H>sM)HM=8x4X?FvwEeSh!w{N?Id=gv>qcX7wzcU|A9KltpR zJ_LGxUDiuK<#Z*vZoK~&#nsOuV+5K!xv4Y|XEqqBz_ zjle|l+JeRq$(YG! zq7jR@sxV&XTsE(%gKo;U-iKgvSz?LoE?MKRbo-sxIcO&JQ(I#g+GW5xC_;9f&sw(n zRJ-Da`|2^X^A$4ioNF})HBS$VkUl8d3nmFpnFGQ>@vbv1f-7wybSoy_yT2_LB?_rB z#G^ju&QOaJ*&gHfP$6Kdq+G?g2`JU5&A5>(wNm znbGx}<(nl)uBdTJ+4GoCA*q`B^8<8zt1zhBp*K=6>L{by3I)?K@7^a|_JUH!HV*0} zt&nFp%%<`!DT~R`;VDMD-pNysnP%62V49?v!`q4;rnq}tuq^5i5U0Z@Bxm+w+i73( zGv#ug)NOdRd6C8$-Ek`2v835W=};&5&8WhbqORL^Bzy?QL!V#B$QVbcq|_4C-A|@@ z1cVUc`4iXlm|l$U5W+jT%=fqV33>~JPMi3c7aO_htAUYT*hL+~T`O6u$7djG%NTcp z`*-a|64a9bsa>lz?clYXQ?t9d2b=|qAsc*F~fev3N#nKD^n z(Wli*$Y>&`+LO}Zh?Ptao%WJVrQ)Ho?}Z8yw}DFt7`M>e*$TZEeuVhK6Wg6d$CH&W zsiaSuB`1O(*4EZthALYVFsbNU%E;;*$RB9mF1FC%^d*1jL?U6SpvfocXYjjwbCtnc<&Ul4aWKFl4N`8@kh?FFMy9z3QgvXs zD-cBQkL{U#bz$v*QC*7MCp6rpl+1~84NNG)q zJVzWwpD27bycMN$NQQuw^CgyBG*KAb$O|``-ZELj6@R8QlX9dCh&YW(f9@eUH^Pu+ zN34e3KkzIBK>5;ZW6}j`i(Y7UD{5OCuwe70awM zkn^{8u4u$2$fA-oPB*$KT%wT0(ZFzD-qScBe{^D(@W&dlUb3dmM2L^9UI{!JoK8-n zH>ASsqS83AaGBkY*trjyZ^5CG)`#FozESE@vJIzo9!ZTt={=GWZEHG`!t$-vkq)1W z6PS}#HCb@8H`gcO_oiwpmX%=nwzQ%7oL=-V7@2yg-e0jza}xIB16pGKli6xm8PBDW zips)Po3?^d;L#%{^=cdnJscE%;lZ4#FjVRGr)*h?!5Dpz8ZgFA#oXg2C%8ue{SD>$ zK=UxQWti&A1?{KA;xfRZ308|FZdXhvf8Xp zcGj9I3tce!jr*nQr+JnXiqWrJ-)Y$8<}4bnktCh?XH4|Y z61Rk+J;B@ncd^F8ejbJE>2%dAEFHQ(E7Z|6ksj(mR zqcfnzU9WUCN>R;&^h2FidVBYFpf)Q@C?e~O)vU~yCc$t+zLk!Uo(^(oh(394axBtY zE@p599-|}BC4q5uY)t8v!ERCp$h2jdlNmM$(dZ79n4jnCCvbB%JTYv&5B9m&6u;C1 zu%_V5XZ}~aNNA9a3cqY)^NX4H4TChruqouNif59^T6Y94cU*!Obu(2$AaH2m3%7)E>l^o9JP7&n9zt6i|h< zLn~XcVnc*wk~Sb{AIJM84(q%kQ0*RQr%emn?DP`~33?u-NHu)DN zPB8m6E}G&Oo+C7YaJ+iAcM1!Ki5H5elU$&-Sh&AN3cJmk_HiN^;m+kqS7T&712FN) zG0m=Km#bUZv25E%ox)}PR?vO*nWC1APcYCC#EI;grc{4fg6x-3|2qbMiS|>S?cFsH zD0nQzN0(6IdZNP|xKB{M(#m0FGSkH6HKHFPf!9)*4mOWn)<+*+LYO+pqEexqSkDG^ z1BHrd-x`l4f0%P&Y;s~#YsARd+WsGsY7gNf?!Q`b4jsnXgmwmSO^L5XEE*bghbvWA6^SM9D|CE?#=O#|+UFhC{ zcElI?Y&os~k1nI)bC2Oy@^Ibe-i;FAQ#W$R`?#JIDV{9qb}5udKfuX|YiRu^N6sa` z1pU4m7MOIQmtN$RPW6(jr9L-op^s-5zHiGHd5#ON(}&+!J9H=zWp3CyB`&8BN^Ee` zo^KZ!Vt->3VWr7z#|%Ba12tl5q=`BWtLGXpAer85h0=%zY07j+B#M~7zDEkJf=ZotjSrF7KwmWhe2vcIh}Nwq#9?D z*WzpVyH&7hX`}RpF44GficO6T5&-Si<_J@aWLBvpDP=@-))=FU=l0AM=NVLw$lGr* zf9|p0T_fqD5`^2Z(%Z+nVFns;ZZ#*hMjw&r_*ht7PR-<9&StDpI=Cx+e~l(zmq=TN zi#$J1;=+PUMO5AW-2pa7SQ3xdRnn!3(A^e7|Id$>i^DFO)Sr+zt(fxfq=R>&QFnWS z;6FLAjLYbTR=P}B!@y{qsf<4o!ZclG<{h3U9Wz9o0T51xyV8~2L*P%=OSR7ybqIz5e^XD^IgJ8pVIf4cRKf|F(P{``JJhq0j ztmWMR&-cBIwbUrPM)_C0G+VfevIK&!K5iLN3?dej7j0A5yUR$)(5lY#;|T+%wfE!5nfORu3v~|rcOqE zzy(<4!e@5MlD(J>i%qu_#+kCrm)uu14xgHl7sReZZx9ZSWtz#WMNr}jr5!xg+fKE8 z=eTzkvQmiprBP>%mxijXZ1XV*gl$G=rd%jI)Sky7Rju5uE`}Pii0A|+zU_)e9r3r=BBUDOW0)uxD1{ks4tRxvi&F&GS!6=<=BDBa1!{65 zm^FTOLUI@G=t7TK1rs>P`b$B|upRMyc6gfoNC^me2yKdVeu(s#UM=`}`wOtR+gbCw z4k+6}#}foGz+YD(Hrec<>NI&P!TskJH~&m7vSb>eK4eKQXlng*!9;|kHS z3&fdOm8OLC!NWV-en>Csz@DLyNf5LlZuLHdl1i5xx}lbx1{|ApADAW`wyA8{M~h-lRm0=_fHA!(RI5jQO$&PF%VWAd(M`RbJ@ckp#OAj!r%OC$rfF0SY`D_rCj(Vy?@bl42;M=TVGg>J%_E;G(3WP{rki#R~10)Wo zQk-}_8}<`Rc^{)+b2yd6bN53kAN-zQztf;eRQ6!Ac;zcv`3NFsh7{P+UtCD)@noI zr=`BN#LW>S3xGi<(h~|Mu*8)MC83kW9dy=^1i+in9aeAWmngTmrIX6v!J>Fap#1e0=~`rFGFhb-Ufl0!j}#}DsECYb6Id~ zM1*DgRmyKYVxpyZ2UJXEN~GW!S8;`FWloc6lwStxv*>KZPFO#l&Hwx(`|&}dqR zrCl)p;zzkLzXhiVL;T<}xJ+qeS}%pvn5FQ%y?+{LqJw8+nDx9{v83%y*WXK-RVu0j zlN;0YA72~8OwNwyme8GVWe$7$y8k zPEtF~Pb47>x0VXd=bGQvOHix^u`13bsgzRvo!ehvKel#?vmjhyL%`OXsq;d8lxiu< zaxj%Cnek1H5c?QNab^HUTB4l7Z0NF~r{_joxNeN$9Z%k1-SmEbzOHmf(&o>@PCzlb zY{=Th+FK*Ihs5=a`EM=D7N785VFQjJ6@=ji8Lj$)aWAGLx&{XzuyH(YB`cA&<&6V~ zZ$k+JPxEfiCj-vhn8a13D&JdEDLu148+^A&%tCzF2q=o%3a2Oh%I(Q0+%Y*C8G@gf z*fY~S!|W9UT#@QuM@Y8%W8Q7M0?{`}YpWR|cWZf9-21I&!v#QewzH`(0bi!iD7Cuy zZ>*ez4-SopGljKb5J4em+8$F*JBUuME5k42J~mixxG~zeWv(?%Qt4D7)F|MZf1{T_ zL_xy(Ff72m*ZrBV4u6TjD?LP{%LbrLw*G~b4lq}~nm%&r+q`*yV48opweMBH%a7Ac zvnNEXJt1RKsl+Ryk{R`UH0!0Gl0S|)lw1S9rtHDw&pSoms!7g+FLF`36$&pG32N8FpccfH4*DiX)G-UYgll#?9Ts3} z?p7kdYhQLnG$(@Py#v~KyO;+ao7YkaS>*mJBx}hSTNtq7gDj|^ACR&hG!BT&AiWlz z?D%E=)Y4|*r#%+kL#rW>#5Hh_meYEw!336Gqt4CDSP6jaVDvJY9oWfOp;+hIRNYRZ zcJeo6(1-F8>X}^Zh?PDvo}9~~4rIlm1D@u$N?U(! zOR^BT65HZ487*iExLO_3eE(V~8j)`PL78;)eK+ExjiJ|VGweBlWR@PP8(c3Un`{h7k! z$7~d5u`ZLpU~KEpGF+ASy%y@nJDBa}oB+fQDV>i z3sk~D57ig^)2@OVVw4p4Yi-W#MSEn!1FFBUvP|#D#T5YNo>W+!U@;5ne7hq0F`w3`$}$28rcd zEp>`Wo6sySZL!@0x_-NgUfRR-Ec%Em^WMWjG=p@Hupc{^uN$av;Jj=l+Il4r^x+Qo z*^gs^tifN~W3DuR0RJQ-WhvAOqn2+AgFes!#j9C@1hAhv5Qs#-6kIl|F5AEdV3`Ni!E z*O33I|D%2^Teb19s{PWretypW4F~O;$(&EEtd;isM2S@fV)|fE2|XeI$Bvp5jAXam zpu5E>am6;OwtE!BIE@>~o^>2B?Wh^yfKI%-44zEKaY5ZBU4^L#@kZ0B0`_84H>!Xy zdhKm)!G*Us1JRKZU%UCyiaG2MW+&_s^^ld`MdPfwQr8_dPFFa>(<*qz3-eo&wHIh( zNw8kVAkaoXNh6-WkMb_IJ`a@ObZ}@x**ZRgx`Er#7LQj3vPH)UkW-Em)4R$wt;EX@Y_{q)=!pG05)` z{F+4;Brt%2G)hqq!r!PqoW%;?uw&5$TE7yH-TVVYQ zvv;#N1$R%W?Z@*r@#-?%zd|)-nQ%l#?BqRuXc2zAfECXI5CnSu2E(NrW)IWkIIUiq z%ZG)~tLTnOq$8#)lbtP4k4Exj_vYRdVx}-;)PFY7-BLgjk6>2(>X3!k6HQ7F}ChUlL9d=A1pI@SMe4Isn;02-BAI< zsIhC*{-4J9pDp4>-pSgfP|8fZLW3vk4f_={VsJ2+Z1hqXe?-l+cH4+hgKrgpwiU`4 zTm~A!GgiAjQozMwO+Nk$or%3U7S=Y8h}W<%kKNrNjcYP+=}qWY1{oET`n%~U6-@O1$4 zkhX7L;0-w}w+H#|ZGEIFOJGSHZyy)W-moMcB-92)WqmRO1Xn3|>?4oSdz39{jjUc` z9p7$2=-~6I&WUu$8*zh2*bVq&nyXSdAIN0fu%}E}b?RZHLij7^x!aKRqT?R5X^9!; zQ5i4a)N~J&pcBW~#770TLe(Q)VziiN6HJQs5?Pmk>bMz+Ntm~vcxu~sbJQ~0pj6;rDD)cFkB)TD|?G_odkf*96XWPsxVr?rD z`sunB>O3?MwMLDgmbcqpDGXt<9E+Br1xf@sVkv#L$&$Qm_);B}fovQ$MEaC7V$|t! zhIi8h*gVXnbo2Gn8oKNPmG~#6bYK|UVJ^QH(!ReIiUawX!3D-eYY`o{nAba5U}97Y zCRVSNfvJL13Fx6!Uzp^rcm?|VsE@j3Jiv3ED4U&`YfXf}XtHK~%fnuwg_8?*AQ#hR$Bs)M3#Zu}jg)sg2|RqQ zrx9Fpp`>SX|6@R*_(MLJM^@{l*6P~dqUBe}p`(iAvQHGg2dFt;BWuyH7cr|x5Qg!C zQa`E1vHXnDrv(_`iL38dDswQA7RFIOM6^93^PK8I@9E7M9i8TUah`;~`J9rAaM zaUs~da_HrUHR5R#78HE{%Y2I<(y~tY`m>FP=imM~X3%c?$t4QUX2iSZ@)I2j{GuLk zm;!KFRHcpj6SMR;)S$+9l|kC&;+05n;4-*CE|EB`=0HJ3(9m?w$XFxL4!2P(_qJl< z)9rKE??A%8ZgfS7%ShGtPd5nD$f!}Pv#T#`MG{!`6AsjTk2G78M=%#AL$1aRWx$da zjcNCTLk~#RVkqERPz`Q5fycqc=!zR_4F_mGO0>KqXf|{L76c#c z_2b-H$B8!>3y3|AtA{OGQE|$ zY*h?yz|z{q$V%V~YZqoBI=jYdT^zUHd!l3Mse|HR+=DtC%Rj~a#7!|=cyoZ^?~;7X z0yKDIde)Q5o;mj|^kJqLC69F7Qz|N6`-tJ~%Q6Nh$Cm-}Fx1avSf?Pj!+s>dx|2Ol z#kRGGsNPEvhbgUaZ?c8F4ons}T@P3czh+H!nw0E(?RVae7mgaIZ)9O+SxegSiLGuG z9=`qGn|;f`JA_SbEeW==6`ic5wlAL$ThKjg%_MpIth1Ks??2wHwp@k_7v$`#_&z6M zK)8&y=jCJ+*Dc35Q&)GQmM^e1JCGr?K5hbwf6h_|CwhHo@UzfJ_Hpo%@8iOa_)z&j zD}rBccHVh5pp^l^_+}yVbDfaf_Qnp&{sG9MbSGalKZ4sxDt{`Zv)>%?vu4tk%b37i zbyR%0P+KU?{et(buce#Gw`0EAYNGWYij-yX2wtsY_ZK5@z-J{;JxRvBd_0>@4Pbz3 zn(^ahdIK9*Mm!smFsrDd0ueHEkz5OqX7+XnZuV105&kNxd$LO}>Qgv`T`)`UO_p># zK!WAx!t1f5{yIx^q&#W;xV*+1#5)xNm0O5K;{{z6>v^+_#(YPq-c=}SVS$xj^8!J( zA<{dqkrBk@aeMD$MGobmll{eu$ER3xI;RQ}JM9PvP8e_*J&r|O6VtD((+) z#+^Zi29ZSFD)4y2t4mW{ZV6+NC;MNGa~z zD)a!BM_r~DmwsB~?w!DX%*x4~!FJp51Vb!rNbwDv`s67#C$Glgc2IX*$DtZGS79gz zBFE&Myoms3h8p9WirT}Jab<?6%nTt0GJd#l$j?Upv5>$chcdd2HqpDw#tWJe6B>tXc3vgGpS>szJK> z0jC!X_R}X>PqUmQNm^FL+TJqgVst92lr^oQ^UJpO#Ip%tG8<0uNddIhb|+lQ+0H`h z%k9YP%IB=VNw%JMAdUC#d2RHv62DVf4=&>x<@BUoPpHIbX`gVuno|u{ayhx^L1iY3 zi<^9Kbd%2IA{i@o7M(PQ8Dp~WBda(JN`s;2l$ChdC6sul81X+$KV=k6<>Zeet@-FS zZtCX*Ri!Iy+oTsgE5Jqx3osyRuv&E(8=Hi9`BxRF4(B3@OIOWiYz? zqkkJ0!U?g#N@RG44`Wy8RzS9ojXC{g70I^C8?n6XH+8m-2>=}tL9MT~Gt+=`7ckg~ zyEAZJq2H8xsNyYo?7{4w z+?+y>I8I$f?wpxsz^N~Sp~!^>9%#;1`k52412@)NXKMq2bD1*ePvWHhEPWTZ=FMcB)1WtN8EP1 z#fK9Fr*27rx`j4i&fYd||CDC}?3_aT`y}eJ51xT)oVeL`EPKx027@YrP91zs&DhqW zxij_;6oZ>^4RU2u0EwXdHR?3IG_Em(*3xrN`oCu552uk^hS<)bZ1Iv}%Oo%H2!qhJ za-qkm-C~t?4HthO|Z)xgmNbh){}tBws6)? zCmErBLXqid7C%9M>4Grw4*7cwU32zf}Fe$Bwv%Ylc~l230Q zzz7V;9OCeyGG?jXhD@yuH)5N{07Kq}{3J4=m^g$F5n;(hR{^z=3yQx_r$KqquEZ4! zy?Jl3yhe6i>Dy|<1eIl4IT4%u;2%)nWTg@G#gB+An|Q?NWoFO&5#=Ia*A_(5+Qwp> zK4iW<0H*I~DZP_M5b6htW2ed~Q?_kok&n});v+k@M_kzxd;`S6pWlC_mTUe@4n$>e zz|+Q((RrU;wj>gf`VC4u^<_a_=V2=GB){%8yDHtjh6AHio9&@W2<3GV$o^h8Xr->r zZNRlSQE;+0O|d2T9eI9l@2W_3so~7$EA-+%q=6gik3eAuS<8Y+`c;J_Q!LEJ{~Fxa^}N${aa(??%EH@i!N)3u#$4wplq&x zlmJmfMnd3Y9Hsn6xZJ~$6N_!sZKqkk5TSVr5w01)oDzE*{iM&D9rIz6yE16yD)dPf zBN%s4`UWGzd0FODEe4OD=A8OJ~dpQ>}DBr!!)YSDotEI69w?Q!ZepOgA` zO_Ek{#aQHhpH-2OWiV)RRG{Gm2m^h@ERU2nfCj;@EPwH5Z^*4d~FNNdF}jNB&mX5#r7mv^%V8p}}PRe*36rlD0D4};1>v&YSJ6m}ND za=nW&+$g*PnJM4_u(xkn&U|^e0Hmu%4eGc7I-6jX(bq{07+I(5CTb(IEC)#p-XWRP zcD*>P+xjY$2Fdjt6rsnb*fjW^>PSJZ^M(^rsf%1MxZxXq*)hx?iP6jQTO3pHyOZgK z$wL^2X$zXO?o$434Zx!ekcXPkbSCx5w~Ip9J)wyw9t)~F*gK7D^|n>%R_q-6rnO4f zn?1IBC=6~I?F&yOT~XY@to=e?Zhl1S4RN546i!w%A z5QB53Q%y*UZ!3^K+0A*zJ1Wpi9-eY}{@faHyys7os+&rV&#gm$jV_uwxWdY9*A)B8 z`U(5wTQzP`&N#$jq-oqbhu(DwMgW(PjSuOaNCLJ(5!LvL?t-9#-q{C<`5aKwCS=P> z4T*;-@A#cWnBT;G^ElFG79pWVKgv778J8iH+ZxV8Jxb-08j%t=Dc*4mvn{gsfA}B% zVf4V0j{SM(&yA2}t$;J$Btq5oKeXP^HJRw2Sf6C{q%CIEp`oYb5r)RfB)vFgxoaR-4DOPg_puJ0M5StM*>TqCWw zLV>c^9G63RBc?sogaDQyOX*qS%KKBvFdD0{`L;~nUkWXtb-_bI5V|NUwi`6MxtSc& zJEd^O-h;<~wY}VGGnU04v@lh>|ABZ=EWZ(dg4Q>iqNAR9dTJu#ilR8C5PA zri#6}4_uP4C=j`QrIdZ!PiLNLa0HpN51UNiS}AlPo(=A5Qjvc4ctlryrQp!GljG^V z=cj~{#6s>n`%)kS%9HmOi`RV&mT^9|zh13^7nO8V>yfg;18UB$RnTsYF1azopwfP& zkI+Wvv3HubZHq3inl3;EiK#WtA?tBL&DmC^V3G}tJcdw(wHjY_*(E$5wtLbUS}}^X zw8($KR;1}hbD{qs#QO(=v^2V-8d%Eq$=lQozk>(A@HJOWT{7mx$lNm`-E14!ocF2& z3_rEi*<VPzJ5E>xw^eW1Wf=a zAgAhvq4y*B*SmzQCwuwnff#Gg7$he|DRV-R5=N!fg9V7Y_7i-XfIJF^wgK1#o-O}rQm}S39!j%q{(xO}3 zY0N)rY)kLIHV$z7^qD0tMxVQ+{vl?br_e1>(j5PyvY)N=la~1ZLJMN z0gK0&M`EPXln$+;`;92evC~ZutwX{~+ZfeuZ=5kQ2_t&HO}a?Ihr(^g;r)G`z&p`K zc`tQ=D(aX$5AKkyzU<<>RHoGwY_-^KV2aLpOmDqAy9l#7bF$H0z1dh5XPRb}d&}Ve zneFAWDU!s?Tp0|@lDKcITnCHYRf&kls0kiAxU8CO{>A6zmKrXF1C^ZMDu%Vq z`x0(W{i?t0Y}$F+47RFx{=6RRxWyOfiUyRQCcS;xGWwrY?6ev`tszPyP6zJH`#R$K z3WPpZb|B>Gh3CM1r2_p_Eut%6B|K6%3;+-`3pN$oYw!*wh!1rv|Ma-;mfucV43D>a zUsdG1o3v}k)CgmklK$7vbd5EQ?52tN?3y7e8&+f?b^`Qa=mn-{61_Y>Kn9txa_t9y zWEXxgRwG`7EgU3YQ5}a%MJ6z@r&H|%9jpU_`kVoIoEqGsFio+^n>QQXa3O!h;{kWq8sOC)s9Fbg&I<$cM`pKeCaU4-o&JoH>O>+XN_gGWx{G*Xqb(P+!# zXD>r7{UBC}@QH7x91gJ`dq)|+dC;~duxne4949v8MF5Uxm@;SAA3YN}J{JkST2q*N z3Ig9My)VaD%F^ey-l_rSYi^{1Z<|#ruZW{mzZokBTf}oM!|d2rN3TYOcMtVx0Rt3W zVB#2{TsT=m3rA9pP9}&;xJtA)Q7<8T(eit#D8ZZV@jq{RMeP5+=?6Z#bZ#VT_UgO9 z=0sF9>V5lu<#JD#{K;JSZA8Qs#b1ksU9AWVkaXakZ#PRJ?yQtTSzb@AyCU?-A;MI= zWvF(A%U&90DIB@F!<15c4w^yL%eRmQxLN4qaO;)P1pJvOF*#VecCIwjm{ch1vb|gs z%Bp@NrofCp;*At3l?9$U^MN4={Y{;Z```!145Ktepo9oxe%#tDN=vOTC?isOLpO1bte72>pX;cUHuxzsPx8TPyAH>6fY!F(Vo2do%g(ODpCcr~vk^g>k*+s} zyXq6%Rq-r1$O)FmT%HksIWF$s8cV;9BWVaqQQUbj+n!mN{ff5bL)-gCu*JDd zC)9_}_I|RzP!fl8jq!LYHTZ8$VV{Yp%U*E(eKdz8l_tZI_+*9~*?VymRVVr*`Ho(k zx;pihhX{gUbJQGS(r_HLrZx{YPkqvaSXZsya4BH$x$uua-@G%-s{o$qi_F1Q*(v*b z*pZO{oQ!GmQroJFC1*h4{Q_H- z+(Dfj*q^t5nf!%oC}v0hZ_WAjqH`lYOxW41E=9LKaxsnkK98U{$M(&Wmc!MmgcFg7 z`sn-IWT9?)ipC8w9)$i40|HvFx3(~Vg#n@wXOXr5|1)hN)RI{+okslDC3&RqQ3$gf zy?-z{aTVud{0ulVuO7a6WP36iKABXbn=<4qU{R zGI|LX2kTP>t@vqzx*^{qr2G-34UxnhfdO3)nSK-=`mZdzZ%7KjhfBdlJ7^vAl^!)m zA38G0vBTMm^w{jC;3aDA;)D3sEYeB0d{$IR6lbQ%Ta)*G$(9e?GR)*d2Uh9TWp#qu z6nI;%FaP7dvGkPG7SAH1HEhhT=~UL`;m&cd6q+a z@C?>GIh(JP=SE_PzL<}<&^4n>jy=ZKOP{^?l3t~U#669jgIu<+^OHq>heJf8WB{VY z5YYb_=kbZ3eu=RXgvaDj^Mv;b&d*x&U)KM4<62?~YI&#qo41>`^gP+&w`;q}NM+^Z zZ#+w{c_=(?HOEz`dhs>8h;!Gi$ZE0JTDVXaLmrSQ$yd!t4rfh13a5Hxx!lKRfZLL~ z#)d&B5rqHbZ{wQA$Zgy(SJ!brD5q1iW!WL#^1hIQLrd|E1}(;BEB5vLJ)ZfmEYo^^$^{XeAihzg?2J5>U&6~=W5JdWq( zDeL0CGUJ4H;~rd&C!XIEsIp#|u4P?sJ7hxJuO8z=dQ|R`xc{oN{Q*~Ji=wm3$6^AF z$j5frpP2vILmuwO#zBsS`qhXL>_prOaU^HQZcQ4pD9O|{(d zOQ#B<#C)x^BuJlZH`>$BCql#Wn7Yu)SXpzkCNv0dQ%+nP6^P$#Tz#5m=G0%jem}W< z>i>5=RtWz{d zpQj62!`-6Rcgxv7jmy3;``UD1g^b}IwA24O&Z>+^EJN5p#nO=3c=mVr`ux%&%;g5S zuFK7Ce3|F7;lD3Z!n0py$X(Ri?jT|KQT_TIr#>|v0i{IYTZFZsQXUo6o=8L{a$0DDJ3JDI1lNd zK3Fk3>(eQAOO*1qNre?(r^_z_G48`r`G$X z*RosFcJVW0P_i4zO$JC7L0~juex;W;eSW{D$pEP9=Cp@rFyL zY}}9Ua_G9-mvkT)s8wG1af?6whB2#eCfsF=!WaYk+B4ozkbwQ8zqzEcAv9 za_>Opj;;MBAqLgz&4YniDGTXc@D&<8&Gr>k7Px%$h8m_Z6Wc#1x$W6eN!SCQ|*Y{@1XPjfbbWF8S=_1#5N9Z=l`{ zkqV{l{u000LZgc}=){~fArR=iJBGy;0Y3>>2yR-)AjhC75}mt9mu;kXQfa>vH<{_r zM4A+dxwS)#$(4&M?csKRguWWKp>Q^NQh^kbs}8n##_!8$HoV*v(2NKk$QAp)?Xopa zl^rzn?StjVj&&G3$FIvrzg+U!@ycY(9-F8C=s;ii!pv0halX$fMZt)gCYfPBpWvv~QG6TJNBxFypWn=|WJuQZJSvlFPSyBxzzPNLuk z(r{xlc5jjfo28SY)n!EkY+3wNN_+Vje z%2~N8AtLoQNG(g<@peB)s)h>t$ENHE5Jj|atc=l9%HNLkvP55634MsTjCAcP9gqFBVQdejAMwmTM_0J_1A+r!gdeM zx0jfMIk+*EdAkx#=+?z^Yronlo*x(#QDGN5VqYA81;KfZnVP=($9GyhA!FdDnkMQ5!)*I@j1ik0ay(Ik^i;nals4@#*#d zMT`FL1j!*SS3)w`tFqjUx?;b-Qr2iQ=f z3mWIuK%`?oVz!7#f~Qky!vZQJ=8hq74YsXDe043MASM~rjwRDtsIEP5b5`(fB~s*u z6bKj7nVmu)b5^F&i{G#xD1#wDm0L!eMDlUi}qpgDDR?f*6yW`fTLFbB*&d$F(VnT#1 zx3BsbTVW2VO+gT~kG}Qf33-MIZB7p2hYpt9oq}XD*W32C_yg?lzvKRB!*4v>fOdw0 zub}AQS+&)=`>!}-;T2JO3l=}z3Z0ugTUyE_AOx1xVHI;>b?wz)-(QJ+iI*<1|3 zam1nZuucXajC_EJhkM1XPEpO$+811I#R^vXq3*iUKZ|Okny$Z!nEN4V(S%;hvT#c6 z@~$?xFP+;QDPBZ3ZKUlRJT|X420>%cG$vUwPnO8Z$zC;mJe#|e*DcP)!A_^1vehJJ zJ6e`{bdaYIIUXlmqz6WXz4E}|edq#?7c>C`d+7DbxDPk-hz{YF_$cApt_~0{r{n8$ zP;(1aqdQ^$?iSI6ZL#6ZY%6E4tJx|rq`*;^# z9fHj%aTuUB0Tu?mP~aKOG-;Q>uq}Qjv1p48;qK}ITE%Q&!OUMSfnJSD|E5$#u%kcL z-i^V{w97ls4xImJ^S+;uGKUaadw2C+s#~UY)vePypV|C<;3hORSTs6@_NYvA%9~r| zst1LkJsY;U_O8ZQohfferr@z?Jn(3AZdvw_^#^V5+;%J+rjZSmZe`z?X;ilsZc9{n z-J|&B;Auumxow>;AB-tg_p`|96|>W|(BH>LbNMasC>bsV=dqRbmBJjf-Sh7=U$?uf zV|$9-cHv1!@{Xz{@}bsrd{tn2mw1id!L#w8c=_=Hze@p2lsPfu-eCt~w=Tp97J5~d zg#ESHH}*XCbeBa%4KN~Y*GpqYlUT1@-uBC%$-_)Ocr7`35nH&n91Q$=xIqMO&?BNz KO84o1`u`7kDR3QO9iF2SgBIM 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 OG_Zo>nS!N%wf}FeQn!l$ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/pre-signin.jpg b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/pre-signin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b1f9ac544cc559c23a8d7a636bbfa119035e7cb GIT binary patch literal 309135 zcmb5Vby!qU+dewM44slvLrNnppfE#+F(4fxDLF_B2o5bF42_^Tlnkk~vFp6mCWKhAfq>ntXoYt>$RZRV-_UKc+ueu5Ybbo6yVU@#bTANT`Z`~_Xo z^mVrPcXmPqx%s;yboFncFXka{^))r^(8hOk^lxedy+I%d-qX>`kL)T4*Va`2m*l- zKr_T+$L=dyD ziLoYdZ_I#^@!oh4=-MGrkNclG!B-#tscmYSCN|981~4`QSsyGD+M zf*C;&Mlh5Se9;Z!0d@!i1%7qle|zzt0)di&VQ_K^N-Ch;hXDiz)((e}las@!DBJ3fQ5r0Oi)HLJ{j00epxuMo>XR5V|yRpLWR2yju8bl zABN^ws-2OvFUmtjR``O zW*qx$qbLp&yT8K}M=5#d%+!G%&8;}L8`DH)L!}t9Xc79cHKZ-ZL0lV>k-B#jX2RGu zPf9xo5FpP~7kTY>O0QG**g<||Oo@Tg$AedpArolc2JoNzz?d6PA;L_35d}|w zNxopr=$T8hy#SH1CTfmN<-aK6-Oa-(#tl6v5x@SzV1la(vllcSi19@6aEE6a!@ z6Cdpt*WUDR$@WcjF4oxN${ftN(I@vVo+%MMcJTkkFZ zjvI2y;(9TZaXs(P?b};x?yckWD(yPYutiCPgxC1@-Y<(&;ECT`%Z$Yr zO!=mC1vWN0eLR}B52P}yF{(e4V{cRjiI!%5zuUK3&+WL;q1h% zJL1)uejU_Snzv0{2$y}6B2^Rg>zZ|g{OWwdepH)&+rCwQP_|iIT|mg6XWx{2_Lfib z_rt)Yqb;+&(Td#Igsfo#fkWogLUYTz`_twUJjs7IJyVx>zS(}Q$~Vie6YQGoHkmN> zl$So?%CCHtC}O3r&eKbKGtJ8>ZB?>MT$WPa?TOS;;`RxD`4oR2f8a6`Iy-Er*|J2K zasBm^x400**#uf?Z4$e*gnCJo5muGuH3d@!*Bql2CcFe8pzt-w1;_vlnf~3;4V$P# z*cRDfXKV`f*xeS@O~Ra*XnC%8M|xjL3RQ2~MRv_KGx)P_;Fb39xQAcoktIDK^#CaC z%o=nVkJEl%ZN}cdNIrv#=4gh7kC401)RU8tz6k3!5%4myAcHxW1o6&GGTE1 zc#$qbSjy-O%`e30=dz^DddCDOulzct$B*Co|F4r3shs-!;bL=MAJZzXK25I)o@LS2WT z?wUYF)7e>qpF|GkN?7tuSkfla>WNLa5ph z=_&9YISi5=g7Edk?ubEQ4>X(e2RNF7tv2HC9t;@bOG9#i1|1@#IwRq&vaok(1tRM_ zDtVYvN0Vt88LW9!hwv8JrE{WPqH)XL5Ge&Qy%gbl z@Qw3DSP$DbWD^22N@RP4AoF`th!w}6DkKuP4MaG%@YJJ74E-Ta=|R^TUe%QhY`u?T zJ;G7Y5a_7{tybt?B+$>FG74&6y~kSvZtck=bJAl2?;?x^;foAJGp1CV_^KWJ*s4QE ztasodk7HHpgy|Efx9TNt|5yfaoum_(m{TyG-Bm)J!`Q#v;K^kqofCCyeS}`*mJ`)o zB`4ogq7#+h&Lp5sa=zxoGuVtHKGN*}_YDU9M~TQyA_<(e5oiiBI+<5-zVORIn=I`_ zP6tvUa*B25+=)i59Qrn*C}~MtLl&1Pel@XmVFl%$tvz5W%;7fmps@pANzJ|Upy!M< z=;<_?UKH(8g)4|J3KnvmZ~iO?rB-c~Yi&K_fQ5+`L`LZvnMN@8U#n@xyqEE`pdNcX zuz@O<^61!uHk=^TlNdOYYWIWaj!`W`r+KCRc#>gZ`64}s?)@;KNV>?B0+NDchq;ly zj@lXVNl?&aRG8)5++`@%`Sr#F-8Dd29*Wlzd&@5Sdh3nNv5ae-L0^@)9-51Vq;q4Jc!~R&8cpstcqve~M*Ginfg%erLyJ*X&>YCW@SMB{b+Vk7|K5 zO60r3^>2Av85yR~YqZ@kqOql)s;bY2ab1P-6tQ6;|G&3*WZLd{dJFtG+v$Eqe+QON zC0SKj;^yzAoROxF)*|EAI=rAWJCBe&arV>Uv5#K)La8|`?k`(*gd6&kCMkD)j> zfBbLa`ACgv6_xq-KD9cgnAdsKVWS+hw@|c;s@Kogx?7}__D;jUUHeO+8O}fM%+={0 zXXG8vwBDkc`uR33>7jngkChuDj}YE-IPPNFK#xvKNUF0m6D+#+Q=}nIY7s_+T#=`) z-&vM6h0@6KicD=Ia@>3;jl)c62TH?JC@FO($n^0Nk>JDBKIX!{qz)8EJx!Q;jV#MQn%!~w3 z07B`gLxld|ofUR*xi7*?kah}Cpx~ewC_))V7OK?hihit!y5+UPQLdiQE5iFx|+|^F7=CDO1j|km(1DxT3^qB}XnzPNE|MMDN zawCDFS4PSnS;86U`?s9p$a@0GD$xIR#9+`muR9VY)la1EBq440(O2i($x(@I%4nt5 z1N=Q7Kzq^Hts+-sFdm63s0;{=ZC=+5w&j2Wl{`wIpTzP|Kz0&9@zqN}M`(SNK+2h( zY!vhZxHbDZ94!rOs0rK}$EN;ZK1xJZk2$WZcZIqc?F^R^gc0dOe@39M0uIG(sMiEq z)YcbNhxfpV%pD*kH?qZGBwuL21dcnJM$?_f8&$b!JzX$jy^n_VfNao81t2Wx496P6 zAlaz^MKJJW=pjSK0Z%JRb?{0HR>JH2DRVqd$KnVliZDL*Ls*}S@a1K~e9uk!U*50j zx_XFvHy!mYpqwo$OYYFdZmu1@q?-We(RL%#qprm#JNWQ5eT+$+UJ7(VF;I{}C`e07#gifZv35H`mwliIUG?8tA}QqOD#_>)UT#95T=2c+wVbqUyG zGb{NeKllZGem`d8!_a5U92%@qC=wUpaN?L!yKJ(U>uTX&11oaPtzEH@~=Vg{EOip1kvT+e1SI z;iwDHFnL`o3)L-QUK4W~vkIB8(eHu+rD?srzK2cX);>$OCON}KXcQO^mkz9=%11c3 z0wS}AW$8)i8%PzL3JoQKq7GsG>cJXbKw43Rw&Z#E8k~JmZD6c75>*mDWCeUCVcubm zaW@4fmXOx>@k*gYzyJs09vmU0+Cj>Uz;D`j8Tc=hYC}6ilhu`~02PAWz?*RJh;>Ir z;M1Rjk7J-u*b&$HBmAtet+jgeb2z2-0K}(7%1I-d;Z+ zTjFW95Lg)b(Gso87yQliJ{O~qs2o3TQyS%`o%qtcMarN&PqB3re~gg&+fCU{_Eg4u zYzu|>B{5wXX-e(b|;dTXL9WAtr=A)p1!CtWXU6O+WP*S+Cmzki4DBRD}`wS^-HL2CM21H zItDz^8xi*$>^&Lr#2pL`48{SvtYdo;d+r2&h-`mj35rOJgh{tV3|=XL`r>cQRz~WtV zKt;1}B9huS2m;b=5r)9+JcneD9inv=?ROF7VeZ<&iDGnDZrz=wiI{YgJW-P%JQN6+ z=-7iZ{T-pP3#ziXXG$s2bw8!NvX%^q8gl z<>X}1)^P>DqWyuGa3B0y9H44w?%K|Eb=9rx-t$Qb$nFD=ryMOi0ec7A6}QDE)!ct~ ztWT6ZJE#lhKTTmrA{ZP-IFN|1U^Ztc&6O>@ecTud@sW2MVgEkZcVP~RxTn$I7uj=z z>(H1&nz6Z~GUiQwpkfLN%C|3i*DOdmC z#baG1Gjf7y8a)T1sOQfn20br8vaY%2Ud?PdY|6O~=Lq?+Y4(uTr{NM&cS>U=>*1s5 zeq~tgvunxSS0BTtEc2+tMHKG6@u-60-+%JWEELo_H`@NgKuA-1`jkfRrtiC*hCz%x zT}4M8?VC(8#_0vGclp~jG%o|Bb*;pvlHGHoc2ch@k<1fhz2)zf4&BYpEr^tLnATG2 z9Jau(l^uv^^SH@2nHy6kWFdG4Mv+e7z9`+wNkvIf?(4=G3oO&3pV``XW;Z_g)Kvp| zi?t}1@R3&_(%#|iyJ@M-6Up!QDtzkGAMm|b&bc=(;oCu7@ojOjp!EABYsTuQ2`!uD zvh<`hpRj5DPT10yjVfzN^Y2V!D>)kTxsQA={pEGoHqY(P)DF<6n-dQ+bv2zB={08n zyr$S%G)sPw_Yx#9}YUMuU- zLMO}Yt^LEtTjj~OO&fjP19EkhUn7?7F_^`>d6z2+>gzxbo@)6NDpazM>TR!Ot3Dgp zeQc6Ye5d~FE~?@?ZxL_sWm}p%jd`TGU35uV(eg&}VQ+&~W#n{kjmEphTy>M@7L&dL zgv}75$}P?3T^99^j_#TB7Tapv`{4Db7>i_6^lT?G$CEh=Si5IZ1xwX?wMvUo5B0I` zO>LFy7e_m9GMtq}Qj&QxZX!H8m4SQ`kY0%xq`0aP#fj64;tgQvr3q|C^R6Pud0#{{ zqwV2gBedTA$PkuTE(ZNCU;F2fz9(p|jy1?4Em4o^yBft)P9`-><9Cz+ zjgxYs_MXTDpAsO#yDo=lNm8+uth99q{1EL70bD)H6(mCX0B=c&#mLq_){1;FX_YTg zXsvtrB!t4y;EoiUF|M`Vz_dn3E~7f5F@LY1mJ2S!c*3tewuk?<)wytHF2rsyUof(4fRQY1odMtpD&xSgH6-~qNRGUzL^9z7a;n<+n$%)=hp(K*UcfvmHPc*q+;42 zSs+qvt;e>mBN(9l>j;lZB*O*B7>0bpfo6NWNd6#i5^yK)KScKQMFfQsXn5-~L0D;X zNdoQPJ*X_4OO6WE?! zwlC^N2D_Am7+<_&RJ=w(mdCI8i#rWH6p?rw_TG9A%U8noA_C2cxXj z>P!t4#}LW+<|0e{;ANcUrw!gf7s-vt=t+%`$ai}7tXKGw8SjI8-ah7Noq#>lfEDY{~?YBR;l81f~(%AZCi)>K)=+~8St{GTNx${H!uxA64mv65et@2`-% zR_|=b8b4GIkMfunmzPs<$LkBEf3nREziw`O?PHEw_?wrL{tqb3hQ`5}jRxJb%AI9F z!KCr!okSe&UUa0$@45g)UT^-e>>{|C7)EjJG%Rp9ZIxeksOWd~RP93jvzmnz@+TTg zGb%q<8$TPd_rmJ2JxPYKzf2ZKSG{iNql~y2N1jOJ3Fz`1^BT?_2xaRknO3E*7^no# zmrQB-wcS*J{Os<#w$K`?cBq2MeYRY_eqiOIU-m7-^_xs{tZcXbE5BV^n@Nsh!l>2d zNIooHnad4x<PoCIlXsJ!>aUnI=4R27pOmFM`NqG6nW^bGMh9Pirjwh) zU(U{7nROrBrzt%DBy!zkZB1n5dFO&?V!flU`M13(;+m+-(yq8heg-1H@cyASZ-Hh- zs>nUDXV3j?n+?WA59(W8=fwjxGuxlWzAtvI-W9t{61n+sVcnsGaKL-w6M`BMt(9k9 zQy)UztkqN7qb+r<(lws`jrMMk?_AjAvHjlkbB*c9VLn2yRgXEbwph3Rs4z7npU0aC zl2jMcSfcaZV0Tx{0JVcpcU{;=D^9eD2r@Y`gHoKKp`Dg+RXsV3w<+j4gQG9`#u*_N zegENc7zKbDWN`4BpdZvmu_>p~Y@<>?Sm3-i5#9irz|jDnIL5(JTB1~Oj@uywnnt|3 zDWL01`XX=4tYKU4yv&4b^42DjnIj}?ASu!t$Z_9EYy%`)1*C%0mH%L%WO()SHYNz{%OKG|DQX|*n>*3jV(;Ch9GhsfddiQD^5^r&Z^Yl_1eeNxz zHhLBr`7_JOKsn)ulQc!=&nOL{d7BK3Kdmp-+0CZF;FlH^{w`WVo{_y64_KYoXo>fbP#?F47LqmYfvEyNQ z25rkc(&nFSIKRi))i!UACWCMgvcpNYv-m(m_5T?-9_49IlX{~+nQI4Z50CrjY-pF>{kdXfbJ7)A9GGwe;Tp3DR)e>@)iU7x3AHW}s`S-$l9rZYuN zO$YmZi`IvMqt=OakPd-hWP)a^urY0SBB@ z>g2G!50S2I`@!1=%h$ZR?!U>jj9$oRC8jw4c<5a)UbPS`dBZ3~N#A8}=a8Lx(>~{2QC12e*o~ zA8ty`X0rreYecW0mv0n*x&VEKYqu>F_x5v|3a3zs5tj2IG8qE19yi(_U#n$xZAd8U zEr`AVy=1gMQ8GSQf9D#^$$j&?dM=M%DW8~Ie98MJ#i8dDH4@jP6{|DbwkEAczml8Z zD&fnI&9)#W7<^fqVdQ+-h;po<<3926FL_urWL6$o=tVgcqpekY?Q5}+GBWJu!v`m6 z_2a7<9-;xq=10c3Las&Y$2g%tkDXEG~W|I)BG>$U+iFQRkIa0)>-JaPugUwb0 z+8%i?s~JlxImrVmEqt0s-zmm$Zpy_|D9Jnwr%bgfTV>aCOZ*7Ks7am^t1=IipGfiQ zb^gSA39~jy_rR2|t7}lnJw!E5>#cpH?Wh=$zijp5Yi0?3$#M87WvJ05nwU9ci9i_x zX`MfnXo=Pod@5LQex*&+xF5f_515K8s2E2jiwGbAOY0y$$4D%#af}^@&`N93@3KY7VfF`a$hsC;1cn#GLI6U%-0Ob z2jX*B3S4!i=OeovX7-9DDfUi@61sC*l^E2$cU46>?WO{{Pf9eBgr0-6PYHajJ$daG zzjQ85S^7}ey4E^*wpoW*dr6jtP2Ux8!mX}CC2BI;y?auxwLD`pS~8LOcKuDtd`n`~ z4=uV$cqNSVm4Y<7g+%=!R+VJ>Rf@uLBt*-g4|OWFVTm z1jJ0ehWESyD0Xr99It-{sMXFL%4-UB*#Y*TJ|Z!J2J!9hFvu4HnAFoY0^|c2V?t#V z=jw+@Dx0dcK}&U?&mkLg{HWgA{-OGp2SQah{fvmliTVH_s1}iJMgqtcq9VGE5#Arb z`#65`jZ*+}+(%%>Td<6$0H6p4s1DSvBqS*sNd2)rLc;)fa}-H;BZIsE93%#nB|{>- zR^$b_;1&;bA&w=cqfZX(DNpkqywQ54+Z&SQSv z0Ch5AIpN) zcS;5JmHZg8=ga8mt@!qRa+Yg#c`L^ezdl2GU&PCV66BiUL9ov91PzmIAKPpgM(0P9 z8qOaY+HYfdZ1Zx+3KBl=}-e1?=W*9`LKoT z{+f>p^FGP6WN0;v`ffo2WBJ4aqB-%ifZh+esh%3oAhF@G>NmKChbFN%sy^OGwUzW_ zGjN$UUQzLDoKM5BQ*5>JI_yr}+dA(N{S`7+bl?Hxl|R*XBvXndVJH?kClyZ)-`tWr znz1#!`y-HrC4wwegv=4VlT3RgRp!1(m`r74HIaM(9i}U7ce+))LN2dyW@Z1G=^&X( zCTO_z+0a3U^&K9F(6uGZZda^${{xr#Ym22Vygc8M*_pKqBlu?{F$o*e$6 zokKOcKHL&f78_}~tzWSv~g?30>_c9@VpwQ~2gjrBPTwSKAC3pf8!QT=)< z*J&GKp4_z>xt~?^3PUQwZ!F~F(uSWdcrE&}qA|xt&STB3lO)S116LBSrc|c5zg(Np z)lcIVn1N)vv#OuHvO!xjPl^vbTf_}bUDp!|Eu2N3&wc);s`kreVaM#}cKtJn`udb5 z2lU7b=Kb3}%{4BHS5A$)BEPfTG0`$x^ep^n-Go6)xc+X-s?9RyTCjhs+uln$!JHGC zY}H!bT8dh-7z_GNHs7k(Jipc8x{#2ZRymyO!ssPbQkp9)p3DB{hvSCxx5;(CQ}@Wr zR@ZtdKB?XbJ=}KsKJx7&H=poW7N_5}DBJApK=GA(-~8XiXznL&Y<54jCL{(8_R8t{ zZyx5}L5!Z?9g?B@W**m@ME>koGH=4?T0)C%wQF(V;M=8yWDvwVpfiN^6&;;Utkp|S z69tAZbyrWRhcD%j4tXZM38SV3 z0;aH<^h-->?Zm}6?e@%_vxlda@JWmb%aywxRCj&LIl0H;gMKELNqyZ8C^V}NwnPj4 zy-K|zjK0yU(eFz^tSvKErs`%$Xxb;A5 zNQCz&a!QkK7(S)sk&{6wnmXTx46||ShQEA_> zj83#?`Vi6sS+YGWiqTZv$?Jf?n98xtubn-K4R=6d8bA^4+Y8LFj}hT}Q~{IjQM$HE zEJpE4_x)ZC66FJ|4tea0N=vKI$4eoinAfFBXK9#D=k& zp{wVMmvsA9Bq%OGZIP}$snkX(Vl}QTd{;gR_{LP3JZP|D>Gnc5*%mpv)`y8aNn93M@wGYN zC+CMPo)b8i@o8KOLH$lvJ+lf(DP(B*Cli_wBDE>@Ez+BreAgYY6Ms4#u-;~@>mvZA z#a{a5HsaO_?ON9bh=wSO7X!mFNJ?2Ku%o|Yz(LO7$s;_u^apTuCV(afiH13W!<;~S zcgZv$#{v!*S zM~09x*ireYe|fn!>@t%04}AJ#gO&2Yc?1yxI645AfpB>Qlx)I|Tu86Q@|tIY0oc9& zZ!H`^UP}_dCrr?EB{Aqp1LO!tri_zX4@OISkv)FO{1*8#gEG+j04Mt3+=*p*zSvwM zI6TAJyhNZQ%l_~Q?MmFGN~8J~HE(2er{>%VQ^A)Mk3$>;+W-y3p!gnjT3Tl&J}Cjx zb>5955NO&6*y#{$Q8YA~t5;Q2l1peUcs8)(%sMhWyg$og*4XNC{%MsxcdfQ~sAzO4 zlOJ|y&2+|=^{8L`0+ikUcSD>yV#taq^8%FN7A*GSQ4CBjd*(Xl#_j#5oxejY&R74& z%Ig7nlg!R^S4**%@3_MZJ4q?)AR+vIsQbueqib4@#fi1@#R}w+#~WIVTUhY zbd0_d7(O~~nyGo2d)m8}yVp`%9#VJ#;ud%{-!5Mwy7*e+%LBc-ujMU@hEG1MJt#f7 zMAbN{u z=3&Uv?b+#bT3xrbJ~dV#8*EbdYBbGfOiWy|`P)FrODmpCt^iitra;OsaSitnj=nlZ z7NUYmpPKF+p{q+Bk`p!DfJH38T=#$y9n0Uf6$^$2K8pXe*(Db$gIdX*(p|b^DDhoe zN5v}Ti*v4nCtQaWM=`rDOE1?_YPu#wWhDyemclAELX$B(*&WZF(&DyET)#C+Z z_e$L2BDiut{O--4y^{azX`bsowcLHux8`q+nZerm?yHtxM%%8)r;U!!%=;*nZx z2|Dgfd-a=pj3>0r#O<<9Qfxj`^Jh4&^;!s1jabkz;=r0n^j&f#zX`&}^Yz9!*Dhg`3a_O$yQg zP}~vvY9FZtVwiKL7v-B>jy-HfEB*;{f)!%9&<{dtUVVV-MBWLKg*8V#hh!qHU6;2| zlqMX$ndPj;SFU&4DMOY4MGU2vg&`42&btV&>F&t3%t0;f-1#ST2aLaczGetCZVe&E z*ZouOR0L=VYG@ffn;CbiE#H47(q~hVUW-a?AGxG+GqPJffNXHCH?rGtei?ONcMV^| zeoBZT?EWtAA&m0LJ4B++oebXlQBmFi$jK&W>*sBHSv_Z!A^rKYrVPpJ zEYB>TL_c1FjC7wF#z~nv+!)JtCU>S2pm8K|(*I~F;bS{QeB?`8(oQzf7;$vn7qRR} zVWPqJ_f>Mgp@M7!q6vfsxDh3`-F7(oe)yXLsP{2WvK;IV&3+EvN3(^QfFJM!IXNi` z`cY)qBK&VJlx+v!OGBr|Oe6F_46;ZMP!;9ocniS2SgvruDnSDp(`fJvd>Y+)d}3z( z_K2i{tIX8(M-{XI#OO$@^iTBFvuOe|8sL3<uC&F-bGLckff5Q;qx+1O81rw&AIcF_UYIKO^EewV@blG#BCW z`leYP2k>zMFd6t`_j*vR3j zHejHL@^c5&%92wFoeeC1bfdc}CGWH(YOk!Z@sQU{y&6j;sTscT3hnQtKeNoG>USD$ z*qt&e7IUHpWkwv((X`x+om*Wj7M{%Z@WOcb1s%RI(4E;vevAlmL4Lf)%t_(%%G4jv zw$F0aMConLhYQfqJ;Rf0Enz;c{%=w%hU!?<(n>RY)AeK3NMDD%#l_aC4Q?t?GGfGe zm8@0v+To?cOooE*wY01aElg=YC4RqUV5X&cmF8JcSk89WkMgnxKciumTL40kCGOP8 zVe^$$a=Tg5X{_pY<}h!r0bg`1p{mgw_bP?8i>%7e-$VBntw|GesI2d7;L%<8#)>?K zgxVK0#Yuft-G;2QW4(bMVWyf!TCzNrSb+sE6PWd^P%JQ22@ zR@b$ZwJaVU$sVZPO&R~#q`7kH4cdGW_UmqTQd25%rA+a%RrJ@I>&`pP+2&U|%#DZ8 zG-y&dKFFWV}V3Jl{|(3(QiNrF>qW(;CBsf$yzSIbof|GJxf+WIwp0dk=0()oOAQ6aO%z@aG1 z?XozvjHD*ab7Tvaw^`$-3?DzrRtX`=qOt}!grX#b^KA2J=K z)V!;UR$%t^bcQs)c$8v3nbfp$Ir-94T@Tk(AN%bdLv3@(C7-~+G>6TdpgWMZM=m8d z9;2-Wt}gtQ4&6Qy)@v|vU)NBUOpq1c)l&>hkd+{?z>O)dC2Kg?AMvF>R&i)4Bw;__ z;Us?Watc}iM?7eyJ zTIMfqdMb&Hb%b zRbDPeY%!HAkv@@7+pHiAI5TI-KAz#UWjgBRP^_0P>GwySh!~9|F;O^a7vO3MOhy-= zSl#XLo&e29>RnQ0H-#MFNSiUd!~x=l12P1yRF2&NC&0_`;R|Kd0 zoKFeSA8!VSuVE=p2?C<*f}GKH4^dYt=8!h;&C=d7kA?O^GCnxjf!&QNh)M}1C>F4=SBPUIR99v7(8r|!|bZv z24Hxc8^FHsWeFm{H6=e|5Xp{v4yEYqN4CZIh`_f@9mU|vrr5_KwC~juAhT4^QM7Cn zc{iG84HO@j{S({Yi{$}m2YJ4e5n(3el@Zkd3eyY@nn7hcs|Q5rD60weJ^)(`Woq>xiVc$YM!%vgt@s<*=t>*^=$OW))Wt3%R~!ak}KR$IjBO#l0HWTx=L+eB|Wg zT|&m!r}s4-Ay)nR)`TQ*9Y; zV!`a??Nv0Ie;DZJ8)exi-epVH@O#oQK9oY9+D%VJ-WE|5YY;C1q)3i4YqlSAhIY_S zM|P_SHx{b+C1mMC@HglAxG>07yN=bJ{Jw%nw28`hyq|329b|2sanhTPOIi*sTA~z@6Wzu;! z?%fu4c{x_P`h?9^-3#CRKDsqwyC7uxB|PJK0u$eoFZ7A~p6bX9`mcqZrM9h)O-T`9 z_%5U8pA3h&k;U`%Y6)0z#g$msr?G~x-rrXpNq{#sQub|3Z+P;&^yjKcRz_eAk(KoP z?MZoEmHU+IIiCnnbCx5HjJ3q<-)kIkFpC-*%&dEY^s*q!-E}O=#8=k z{3!78X}cTJzZzmxg97 z@;a<6uKpY{(WD?c)_-kYzVgIick)={gaXC=R)c^0<6PH<*H-gVXl!KxL4`w1kgtRB zoo3YB_{`?!y_YJJQQ0|Vzmk%oqvNE_)V@_(|7@-L;h|HbTiS46C!hDqI}81%H8Z4} zf38jgtQnR|t07h#zZ-ol>TL61ZeQw$c6yi{(V9NKZ_h#ozl8QS))3*= zNWP`?kSjvvmp3y-NM6(J+pX<)seixUYISpaZmxdZnqjxo=cNZ57 z82x;M>-`b#1xES+F}C(Msp3t6r~~JH2Om+vR4i=gGmWiJCu2#;1qickDqj^i*r{an zB-TyuHN#(*>`RZsDxNhQdM^%NfWFMMgqZBl3fCF9g~-P0t?=b@0GtyC%ZiLpk34YRMTZtR=(YrEe5&XpFw zpEETX7C+9)*ZckSOZ?VPse#XQ2hDX8#kACjZ278}+JRMU8^ERGmh!PBePIrEc-oi7Auz#-J{@@MqVX{CI;FIX^yar}CxRHWB~QyIx}a!zlBh2FOTw5O9z9(=_|{ zpEw9@Nze?XlV&noyP*{`L<)-Y|>ZQ~zmh@|tN0 zb)`}n&31~un)#{*t|~%Hlyism0}1|VAOpyGWaB}*=u;5ORpku zOe|Xzp=6y2_CCbl0BFikXCy+^5-kzUNc&l+Xr3Q++e`TlqjQVH;iLZ&4PKXKv<)T+ ztZhFj8Ck5#Bqkeo6N{xhr$!{Yc;m@FD*K6Rxc1;~@o4Mc6!N_Y9&@OO&Upsqu z@_@P}PwCb#H4~8Hvzfj5t(0DArly8AYvGIx_Jb zKCGJ#Vjj*`)sgwS_2y1ex<613O#T{!7a%rqR)JmX=f;=le@3GEB3++=wQ>P`lvXNV zc#ojl#W}AwZnII|&~Xe))PGV!=F934{I-X|SfV)U-ZgGCX%{%;;b)U*HB=OiD`nc$ z>s?D!S+5q)HmQB;vd(xPZBfeA^r#~f;-L+m+`->)zQ2sL4mSZP$4ZDV4*_K>8^!$+ zIJ%Ju4KIhDG=r1^aZ(s3@-@J!g|-o7nvuj`X0mvPS?f#-$^H`pd0Ui-%sPUc{zWA; zMHcIF$^eU#g>3agUuB=nL^R>mz2||mc0e3O@oEN$&`5m|;Q>SeQEA{Lk62h`VE(;b zW*T{)quA{i5sd;tGfoAQKmo)QE9@`S8);Kb0@qR|9PI*JKM0uQL>v6Yon{+A_?mqTs9r zSo9y9kZn)dPMRTE6wL4NT9g|o4o6>DGnte6NaTyi5?7Z+E#-3=-o1zm&}Bt{e=^Vz zsp>J^cAxyn{)~l+bBjqUQk!#3E63Lv>9Xl#h7EI7YPsH4WKy4D>p%MNrrO5`q%b7XNN+#n;f6v)7qhplIssqX72Is#iCboE#vo9zX-Gs z%tTRKHMaKZIb#4angK1ke^`@45BFD{#8=`#8*qf=psB0B%!33e}~Xn36`*P2>k-%XTeQ(bws z?tI;&cs+bjSHUDbl`U;*l|Nv(<&MHh-=7TQoL{XOaU|2kuU?@fP~I2BLf(woTzWv7 z$R5SB85UZjv^y^oQh8O@;+zZIWmkAmr+C`>BAP3{-bYd+-h_{z|8gKl|p~l zms&zJ!0$MJdcm8fI>(knbA;~WIM3Y0xsZ)7MdG0Fpkxn)R~%cNmxs9G+LN*BouWv^`-R)qvUnjy7T1d zrMnER!%bl-&aDruJ%amc5gBU#cc%Mvh>;}5b7{a2M|`GAAhzLSwa=HCZJtI6)oyJ? z!L+G|RA;E9UlS8gWzz34tnwdT5=nP%s#(yJ(7>5wJ~;TZ(|vH*6&o`hYFYlCC;8pW zW;tT;&W|_0h_}0>{)X$NYFu}Hf3v&&|4L-Akr4IUt;wg;qu!fTnM(hWdYaj5yIoLo zdG@j>>_?-^pI4I}KVy8A+&>+#bFFI1_sjzG7RI-K=w z+YC;F;=>-fPaL-JG{Um|tCR~~zQqZU;l<7fTbsIe(kl&JLM6a(7dm4-dFL+iLWwgHu7D@RF0R_sXT4}?O&XuUo zbdG=SpIIyMdXS$K5}`IA6mN15SoMUD^)h-dQ0mOq@cz?}hPvCRwmxJ*uYprX2c49Io1m*$dAMP0Y@WS+P2+t zIs=jUMwk==ryFCQp#>pfhv8S*TNmy&3Tl>Wo-UtU9RYhX((|`ZI_?ER0+bm`QxN}w z0XTva1bFaQ-bBd8v5c>WYrI9N=>44ML-D9Q2aF46VHBdcsSI`CHK}EbiGb%4!xMsV4zj4x-PpAfw4}_x zMm-DWCe;H;eBTZ|4A1-?3@kTzxDX{VbT9#{aUTo?!9+9xND|?iy`DgXjDgd6!0BGV zO5W9jFCOM6b;ZC9{%Z-ysIqX8<`%nh2p)WOMkCQkzIv9&pz+YHP~^&k>qei1Y?E}9S-Mlsw%2>YB;`s}4_PFvB%GjoVqQ-YxKx!$=4r76>TRJU$th`$9iq9j& zm{ZUH3xP~F(93`P%v5meC}J$bZ+Wvf*5!Bo)^r2d6CynTHaJ=}WQ z^|G&Xk4*aY`>FISYo)4-)yLrnQS&zi!m{HxZRI`!H(jXkfx?_c$D zUFSCsVV#KEN_9-sh>(bj>MX2C0mHTAm1Y6~Z}EOLpFY3#EDTS#;jt@OiMRoIHqzE$mG3YUltYoL zO*5^zJPRi?#MZYuDMF{6MAH^zJ4;*5bf?_kpYA3znoVZ(-wAiwJZt+JJ5@C1_Q2pE zDp0mU6~Bnq_@jxWU>>2A|6x(t5B7=7h+Bn$Q)!_G6lJEDcZpwnolLTOcO+r3k9><70Yu^6vtuKFHpM+Q7 z@M6xN7L>Eu?PRqBLUXcYZ?V~PE=s^Y z;1KyG(4zd#xZqR5 z9W+fbcgo}R%=uJNw-;3G95y!`tJ1E2l^;0p5kw!a@kfY%cc{1W8R_6%D_>9?aoS(+ zAnO>LimU6X0dfDV0)=tev4m&MFu?v(j%lb&gC=ML~63*Q6F4 zj*xz%d0t2)VkAdJWqGR0)=f#$RF#aZ|2o=4W8B1eqJI3(4VVu@wJFDtrsB_*7?BhQjk63AtsLjv> zxpJ5pwM*8K*2ik*y z>-l{&693_iAC%}Z7BF+Dk*#kKEr9N`znrS$a2OJeZTE8a3?bx*ZMU1B6px7l>E(8A z-chOQD;%{N=&h}(DX@p+Y12qd#JzYtMsjNFI&1Y80vr_y1w+0%{Ar$B>y6PZcb=uM zG}c&k`@V))l&I5)T$f8cek%>Hq8B_==lquaVPW9bZu1A7p)43%wyT2y&G@o+v zi=E79)5*AzC$_B%#o}7L?hqN@>94)pI8B0w=y^DN8)-C`1g>V4lWUs9%{TIYA@2Pb z!J0iAyaEK8cNC?B%Zi)DL zfrV?jbPSvg4-MVhSZ0RbXEiw@7$LmCWU3Qg zs8Mu;db@I9f!1v}c}le~_?etp=f3)*7SDV)U09)17&b`@jtwwkzwj|Q=i>LW`SsP)A?3ig zLM5lQ83=v7A>`um)FGp!2aD651&gNkH_xWds@q0AsN_~_Wb`Hev@}RW-hKYv3^~p7sdGy6K6rn4(3Ywy#=BE zL{wkhg!RQ0`Lz*XA#J?2_MC~Gq%tb|2NunuL9B$9quFZy`4x~$y4s6lg1 z$@rTSX?032`lKh9pVDOVMx^Cyy`uJaug09W4pU!B8v6QhZt^Jo3rNRFT2|IuoJ^%_ zCw58mC!Af_ABCo$=t`Nfl|;olvJ*XQaUbyO_HuRFb9yX40e@s4Gx=ByErwF~!s%-N zfRWhj@t+T?qr*(T>Q5_uV$pf-+M!-a(G~OOE}fmCA*WmX-#0A%-Ec0z!9RNM{H2yc@B2{(A}&v1B#* z3n{kWJ#yQ8Of!A7_x9~2dUqwdgXh1nJ3VKy($wid=5`+2-)-ygSwr}3~ zMQ`sumQ34y#ICyb`cpAke(h~#&xOQO>&Um$Q^Mc9BiJ^2zOX)gab6vmlH)3f;wp)m zZarCLlWg5OG+`LesAPky9&qlk$gm*^xEDccH1+GS7ee>)<&Ck--P^!K5W9IR-*ubF z7{l2&;9nUpr}ZF4LnN2xx8OB%nEnkiF&qkpxK@idfPv;ITX-C}Xh>r<9v&M(fOnP| zkC)BM3SINH7$#ufYQgTEXC5ZNBin_G+59V-pC=4|N^scw?kWAw6`)-kJ^@z&31T9@&>yDJOd7;!2xf55#e>i&#OyujAjIq+5C(gG7 z@fl`~H85pP5~W=a3IO9vBMbPUJ}v#uWaV(6-_ZDUl7Q9g$n*3i`lYiu!tw{pF`~hy zAEFe&P;YmUhN&>JE?7)8lKq{HzgePfF){#sX|CsI{>jj!aO`Y&%Dk)=z%8KPbO!8X zLLZEsmQ&*$K_x&GU*6bAumQzt_c`@fc#$&X-#<%8uI_!9?`@-IZ6+_flr zkd~+i$d=zxJT$-5h(KPtPc{Q*T#cx+S(i|Q$%u*$9t%`b+~r72*=pdUN#D921crX1 z#x-~zh_Ek!PMH|m9oRldI)!r!dVLCiKx5OKgVSTflLvAeBILVq0;1Kbjo4;(agUqp z0xW+iNiGSH&ZWTqLa42dd#SID5o^~HY?{um`Toh$$)EIUg+r6{#XmFZ5U{>le`SZ+ z@aa|bE&pYm&8x*(=O=HbB9yt(U%`(bq_Bvuz*gHcRxbmCSjMKM8%@bS#?><|ss}EP zIg{B>!M=ZK1VkwXp*{E`S^h>PY5ZYpDSms3tx(C3ICj<#Rf5i4*ci`Ypg*tTQt#NH z7?o04{zAo+q<jg+M2ZEY`2|4eyiph=E~3-^zckfsTI zc7B0WT=D_ZucDtTW}I=1)f-R3qYhifCFkFKtQUFFpG(AR#xS$t*B3;{L}J%!g5P+-&OpM<{F0|EnS7FTHN6F!C-1oPUq=U$;6KL*_rF^-QQVr{R{CKNvOFk z3sKeN**{m15D~FIawAwU32goLRQYRNqkky3UYRHL6hu|-yhwnk|?ArBL%U`?Ke%bQJLDy6Xje({Ly@Ib|6&$)A zA}HF=^hNLGjRwY&X&6RMU2!)%yrA_z+<26#c;`6X50^DJi)2;OTQ@ySTET3?bCJ#t z-EF8(+S^^u^Eq&z^^nx4QSA}?t(b^XkhE9|yT3D2*;`h=a;mM<_+VC@P1)GL-Ynk&q z`5URd-(-A`t~QC=>N7Nyxc6SsKI`Qa)Y6)OJM5FqsZHusyGfqU%zuJXL9+%$mU_lf zO4)%0Hp)NhU#>-Lw^ox%b?H;#u>??_j;D^?@syKJYhTtS@>Zi_b3j2l%a7_XE9V;< z&VM9-X&ZV{JE1tQxAB49=|hh(NPG&v4aTqBawta6a9{?WQ zIPe_e0rZpzrS9$svkbtkF-{nxv^)*Jd_Qx-Tm9sSrr*Q&(J}|I%pm=KkL+$=j~uHK z2QxPp)jhH$I0wK@cAMP8?>d9N*3~5wv?Z27sI$c5u~$b@82qQZz(oP6U0ge_J8}B6 z+#$qn2>lCTr;R;r7RTgR8>pc%6ZPv;)7H*Vs@`-Ni*3F};3Q9xd!}GYkRClDxz_Ok zKqP(+LsFe!$sdU&PKkUIDf$NirfLYYWSqELTk4{#;fY$7%2QqitDz$(Dp=l!GB<05 zOgEEyPpTF5qS%mvCg5>&YEULbSGE(4KLE;cul6GYHFh4N9`2aoR6Sch4YX@q%5(gS ztiKR#9RJ+rj8^KHtnWO19RUx!7GC96yV%?%c>p9~t*(Y%EsOA7AH|R&oo5;$ewf7D z-k+jN9k?U)*_XBu(61(ZXxfAo%!IcL@Dc;eRHG-c8wh-3_<(*agRZ3o#at0g021Of zvUB-FKtaP7HiF`1-*SLb^eHt8XosK!9R)q0A1~%t(qYV5$o|56oCHX019I~WU^Nk> zcF#Zvyja{9!59^8%O`NHN9cpoh_Yt35x5&~cUpcp3>PbeHAP!a`SkWOtw6J zwIW>zagxK3d%>p47@lA_SLMGWuZGZpL%S_?&S0naAXWLF z!A4nGdePlK=UaXjF9VUXEj+YKuu z7{2PNz@dwe(`(ZYGi2(L(XqJ|WYHANVcD8|ys~M$cg2-_z(RQCTfb#cosg1@3~@IO zaD9$$G^$1?Dmh#w3#NL+fD9X!{V-MW&8?~uqc$@>2%ocw}udW=i*<&W;%$hGe5 z(T)|HC+Npd6?bImbc!pA%1`1<;!CA?MHW=a)%y0yRy?bS>^Eynbmp~aH55W#-Vj|I zPB*^evyUyLtXFi5lh&DSUJzWV^|$zGrSl5m71+(7#HlmPFQ^+tm(4djm*wU0mHG2S zf%cxuRXe66fnVKd6xVGTwly;}d3QG&B){LGKlF}dV)=%iU|p9{B*&agR0{4&5iLtu47j9A|1Gj6UKfW|=$#c<6H zNDOIb2qtig-_QR7p0%$v%##oRGi|H>iFLNL4Arpz!8w_5ADSVX`+$#eT&^E-V18bS zQ%;1k!z7h3AI^XLAu<9h%y}Jo-4h;Vx`f~x5EdK2euXgf5-8=46@Ox)g}h7jNZaey#p+u_#P0IVyr zdXRimw=I@dpcTSG>u~BP!ZjpMHpjpeu;P2x9vDfUkj!nt+8$DF8c-j-506oTykxsS z7-Bax!->Zk}!e}ZNV9PZV$dT&_8Yt0iCF*$tz#ofB{wsjw&!REf>Vf$c zF#9+M*;((3DZY<}t9b>M0~}b;Uq}V!7zk1P_mRh>edSXj<6%y8d*KSB@6tIhBW?~; zUV0iBB~Z&JHXp$?d(ZPjhl$X*j2D;m@a8|qWN^b6 zX3ttCZf%dI{YK#!6`+@>lMwDiajQ>SsRM?OL7oJ-@^8YUjIpzt^oSKA=w#G*2l*qv zTp7k3Fcp;@U~jQtGKN_5o1Mp>1QN&Xs(n(Qj-TmF(LWEruosyYcm)bIWn6(t;u>O9(YEgpS~pHh7qR>Vh& zTt``7~Y08@(KtYgg>3-RdFKXeV>foO#sB^|sHoxuG+8 z<#96e2j|mP@xo`5y-Z5p>;3#qEA7qVlB=WNYF@iqGVFd;?Ec|=TH2sqqZi1c2$QBy z7&<`D|N7+D)?9?6-|5&W?AlP^NN>)e=RKudxV@gX7B}b~lKacoZ}FQDY1!+;sS^hH zwlE!<=ZQKOZ>tTl6G!_+6Qkw#guSAlUSCfb6o2R!IM~Sy)L{tudv>jMzT7gYB2$r2 zE`3y((PCl{*6z}t6=)u9r{sN{Hf$=)%wf@|@0>e&I`>gLt){$;s69clnqu|jp0u32 zD$cOEZ+Cg+96fuKby>VC*v*%#wFY;^7NBLLXzXEgAPt(& zQVZ_x>YffgF&2*iBJfj1jZ7r;g{lkx}N1Azx)HIiY%ezBS6AK-yS z`ZX{pw1ij`16$vhUmM`jjv|**-y^|gS)>I!j&cTX8D{dCTciW)4owX0uenvj+~S`{ zVGYZnan97S@)hp-NOtp0W$}q_xk-C4V8)`!P5EEHsu{$Q?U3;WgK?ewfzpcnGn2ko!<~W6bYPANog;cLE5imJmG>UrXTW5ZOIPF&}mR zYtZWQdtLVS*Ta0L*~b(kB#RPikw zp`v(!QVDUO2BEI_-_WF5F+#=c!+f*_>lIbPiH&QySfG>qJe?6 z(1<|OC5-@(UVK!_m1&R(S8f-7R|;Wh-FQT?)_G)q%Dlvwrvr*Kf8pm9>VDI4D;7$E zs2~k$AQnztvy~PDHVWz%HHj@ggm9{@mw7i9F_+oA^2dCgB;4=C!-*;iU#U%%K7t#P=l;R@ z$HLu0MAs3bfGj8dFN8ouqI=T4h|s=dqA@coGaMt&LZ(A=zVdmlMyCYb zK$&F>_3BX_jjxAquqm?ak(QjdA+M zUmVj5W7K)&Q4#VFPOQ8_-ekW`y0P?Wd;7@wpeCk?88_DCv{Jq3$2Z~#zlKRIUp#6? zBI?zRy{yb&x13Iu6lPSz7`8N|JO$P=zQg)FSpC>r+TnKu_+q5L1$f#jfS)JHU z_Ti{|cQb=^1e42L20XgAkua)0SYo)de^<}I#HGK#&ILRVKmy0LM@X>V`x-V4eyL2q$ zPx@?^IZn=p@uQh98OXx9KODBn^|Og`n22t{4ML}olRq|fmey^Vuw^PM(@%pYW>b*E?2iSK8l7 zhbs+4%1x~9JE*a*!8rj!-}PO*E?lAC1GTwl$LqYyz5Gtt{P}K0zcn)-PWX775wm5# z(W}RqoX~ur4;O~V&cZol=1#WYpXR7n{!@F-tdsGJsdPQqzwL#k+@0S<8LH(lU0r64 z&I9GKxG0aq%k$q(L(XJYd-kLx{JCPG=-C!^G!~Th<1&j}coQLNX4;LdgLMea@ zEeOK-%=iL?4IGRD7dk`~pPvuQ8zUOT-qR&YpyQ2F$e9^C9B5T}aj*X=8kmcVgG8ZV zn@{Hqt{y%T9uDiho5BSM{0sfaeh z?I7V~RTzHgd_@sczi1p2+MB}il4gEm)rDPs`<^cf#Zg%Pof#yZD+*X=`q6&|$;iub zZNb(7m$^zJ*Fn++NXW7t-YVGD0h7nZ{IK{V6J|aSRu(LTR|Ds^7bWJ_{%@!be+x?7 z6x`E6MICU&Sb)Ey0gkp=*doZM0+#>3!OhY<9Iaa_%apf4rzb1}a7>=K&0x5`47;A- zCBE4Jq1LVn3@31YJ_|j8w79`qI-Q8~HG>TDO-(bg!+N1lrf?3Rnu)m$k@#$5PJ|~U z&EysLHyUxvG*xf1v<)8ylfQU8LiCn^!Izk5r_b`&eZ|)-WPk!u4_+0QVw4-l4W^m1 z0m;m(BWOye5n7@ms`qMLzb)sW_oX6n#N=Ks8Zl)`zPUD#mv{_IwN zY9-GnH06V;{S#?6j8#GDW+BP5Oe!s4tn=9AHzDI{D0w*0V`^!8P=Iq;`*T z?zWy}h|AY1mXZcpyZihPM;{W2&wYn@1ix6>H?3Rt8#~rxrSwo5vBHm{e$$0B+s|qs z3pe3(@F9G7PeoQC-YiB6=GwHj+k!o%K>1n9^{5d$i2S3Ps!(j-AV>PcHXak1k0uFy zZ4X5_1+Wx6<4MZN#tv!Bv!_hcoP4mb&8E!EZJ6z_EJY}?a~V_*l=(h%Iw#g`e{Cae zap)TLm~| zU(r0#=FjObj!-9c%rUSLq>+{&mSq}lxJfa|vwQKWxTJ(YJXD7dYgoG3CU!ERu+zp7 zZIVMmt)r*jR35OO*6cyb0Itc^WoaWbD(8zb9quy~8*(Yt>4~m&e7?2qc6;LdfMsi1 znsNC>NB<@V&TPG2ushooKIarXMOrmOK|cLyO1Qnw%|+tu%AbG6zkEU8k=r^(HZ8#F zwFx_&^|vd_iVS^UCwn?OloM~14XDX%g5TpTgMREAeP!TMW%S&%?)Gs-4Y6ywF>|_6 z*Da@@onGXuwJ}PmYoW93-)EV|OeO`M6erjUDjD7%TQ1iuI+=?MG6hmbGoS0oSz1X8 z)n2PC=*gtXFTsAS8Dn?YFH{9wyNWt09;Kg~y@UX!qaOB)*LZMJQ$s_}g0oKEz8*Ca zVEXg|F#`A2LvU{xaOTB&w*(_)EN8-%cn$5rg#k+x28gq5vYcjM^_dsbFFm@F1cchv z(qVLx&2N+%8yGFDp&oVC;HXO+XJVP|hQv`7?Vlr@x5`ceuv=gs1)o%~{+L(dSIt?T zsuliz%B!KZ&9DTLeRrpnsxi9ot+V^ln=j3jl-LgGT-Gmt3%z?jQIp0s?W|4uDfZOu ziJx`vY>LnTICJ!M`0#Qar3ZXUxC9~(e_SIBa}>X2nZG)TyR2RMwTkZa?8$JszZYOw z1b32OMHwaI48M@_L@rvONlN6BAO7T1oi+IR(u#!fh5hxS{sZs151xfuPPi9<2ZL2(R6$kplTH`KARyebo{;!HaW-P+ow`@A;#Izh9&5jL4q_fK?$9-?w2j(SSgP z)6y}6d)>iJ`T}MiCS-yY<_OMF3kP5H=~Q^=1scgZvImu2zsv`$YjUhi%ryTt4IC!chuC)Kgt@$x zdLDlSB*VR42sxwCPXo#ENoPA8$PA9GiO(~Wd^>lMflDRN&f+mHP|Q(~Y#^y#K&2fR z8h6WyUSohiM);k61u$}&N9EXf&b+vk?%oK27O=|%6A}QH2H-Q~3XQ>n21UdD@`FS4 zh`=12rY=(d3ay97LUY`YahH()FK5GmtcN~dRig^#W|##l6n>1&!`!b1|7oqy{UqYS z-;*4f8u;O;uQcc$UZE(O0KSo3sdBYyzy&ZPciWB zv7Cu;7y@rEnqTGLKR4hNU(+RK#`u5uZRc*cq*wVjWfaPi6>}A3iwwjF&34p2zcxfS zJ^7-!U1N-_aB6ThK%|a$bJoO=jY{4T4b%iW{8>6}I11xrinedk(IK^NQ0;F!wqVKB zz0Q9y9a1;w|sFCcPb}0H}}z#in1&@sI6p z@6ycQ;}=8JGo`e;DYiBVf@+@+?;3Xk62-FPN#@neaT{JV=tsv$Z#4i2lz^HL4_TCI zrinp?AHyj%v;Iv^=g_{}v$5S>-+474$$Ep$II7B}x8Gaqsmhaw zt||&VZmlQFmluU2B=&RYjL&P_AFhm#7vrjOwZycPnUD%fy00l-$R2#{XKFM%fZH{< zFnhzJ^P*j9UMIeBqZmzWd`nv8NJz`$gxhJ&h%XM4?6MHtA9l%kpHd6gcuImp(#*83 zYis2q9BlltV&3>spti=`4rQHjl+k6B4f0mTpor^DtT>LJXG6~Rx$k#J|8_NeO#uAk z;1PV;dp)6`w3I=q^YV{g=!sy}C*Ukh@S%^fJU)}W7=YfsD*te*%+8SJPz*P4(`}AG zs-_pp2cW#k(|0!->1&}U`OkI%i(TA?gQTnXHMmSH&I21{$Oa+XAcLU01|}fFi(-Bs z0akmIi2Y^0lpgM%x%@dt_pMM~7c?6G*7hF$795IJj|xDjw}Z=M^Bz>d8KI~{Iw#8f zRX6v(^P1ogw~txUYoH+B>I0A&ZD$=WMd%bHVQ{c58thACc4y4x-pE_e39W43tl6!v z$-6SjatVG@*gDY|Iqq&PacjpWRchTdne~;AescN0rO+7ViZoXh$tYLIF4JCVZcO1R z+h2%OpqW7|mmUMJEQ5~zEB1z<5l;!O-E6~eVNXo8RdG!dv$Pt#3&@kR;?Q2|^>>YM zaQA*Y_;4r#fd!`J=IbyTVJKexIaCV85&)4qYQ$I=83rd*Abwmu$nWucQfTF7gl60` zTPnt&cCO3+Vh0AfLWEd8o&UtWfd@bo^8`$m{uO)?&9)tw88;~iSzI6( zx|RXc^75)2Q1zuC>^U>^xq9Vb1K-ku9@!jVj{-Mom^BDloPf8Fi$_Jb9FDN{&&O}$ z7LLS;b-whbg+-5tlRsz=4~e6|q>vb+B8;GG(Mu@HT}?E6*=Iqem|Yz+R7|-^CpWNk ztxqPME)ijkxqmP5+SGG~Ui6~@|MHP@9TI4b2D#X<`iY1>&S1ab8IbGuhvv|wWEIk_ z^V!9{8d&&}2-Ph|tbw3WqB|hBp6F5}E?1mV7*_}g^O34DS zLlKt?Y)Br`#l_C*4T_@+l%F~MOxS}ds@o~-_ses>w{eNmYC|I#2%{8Q*j!{TIX?a3cdxjy5Z^Yra8l<@8kQ=PvXv|0T;cTR~Dpb99mijvsE7jRI)Qf zB}#}h>J!#Ga&5+`CC-7(Dhm2fe=~K){HK#nnWK1M>IC=$Cjw4cZ%ZgR6kSPE+fE}L zDjBL+6v?x6lv)WxShBen#7ns}emoq}sVgXXsjfXYd7^qCNL(R>IT`pw7n)a>tNP=! zzaR9|#%QTe_H$+gJ}Z8gYmaFAbr$RSCO0k?ahlZe zil_HVo#1y612LlCqg9GPb$n+nsjZ;Y@5Wq(w@-C4G(q(Dl}WYpN7C-di&8A*_pNV> z#LPq=;l7C|tY-B);i+nW-P} z?k9-CyWg}vZFXsuTJTn@;l|z0M}}7H!{D-zLv=j*)5}H9Q??n$$O|3j>6~d{xXv#SI?lRfD;x>5 zveS*oZrfv<7}|qYir8%-@JIeA$yMV&#t+u4OkX|OyyPPdzjk0aKL+4$a5(Mav|t7H zA>F31YHzHOKNpd#VekJ1se;YQF$R7@o&S9vW$u7Kib|}MK}~hm^BU|KEtEp3vtU!A z)j`yOgdUd}pZ40%8g79qGrF=KB zPJ}Kb-nvGBw=_bE=aXC3o-1p2^I0d+&-E+Kbd^mbRUVSL4=umey8I4x+1VUzSlQ+y zlNY~9S>HNvl})zkCaJ7v&;B?S(lQgUzgFFSt8V`)=8cSu<+fpB){}@-*pyBjYM?=6 z?`7al;@kK0#9=cPTnz~7^R8Mf{By8cPe@-3?%t`35-sqQs_-P+1E-oUTWh`8Mm^|G&N}w;?>p0u3erw*F8# zCnUQ23s?$9uM>2nRLQ@PR*Mayx1;R=>zQr8`MCq*gkK=ua7?DLEftjU{) zr&3~}LgFw%h8==znP8E^$b^_REh2Bog`}X)Vao_IjSnD7PUCNnp#OJr=hpv5VP((S z{@acsM2NYv3yWjI82`5@1!D#Y1B)4*G&41j+5ZLudPHGW7=y?bh$PS`xgU1m;w1p& zCCH7tZSLor|LcTksEF>;F4N&QD=IVioLZeicT-9UK0M9hH-EqVet_)l3{BSgQ9{Q{5oEvP&p8%(OIjTV|E zXh>C)8cVL1U9h3_a;w<*Zk13N`+M{pnpd}>5<9V*)X%~KwB&bMLN{-(lX(M<{z4M9 zjjPkr0&;Xwt$Ef}veV zu?#w*UiZ=e9Ai?zqoGyo+aeZaw75Tho+5pfUDwz>z*XE(Y&FcGQLCaA;$t;y>Jhir zGt;-kBsr+0z!-RiGMWEq_CUv>%hs~cEHD#hJdA(kga&grk3EdS7Q+eD~IH);z^Wl55F(>$?{9tD@bhaMz zn8{;m<`{o~eEjf#Mtbwehe3Myr~GLyYId(|1d3Ms_d&{~HAMr$kbq`8B^BI#lg&Cu z==9=Fn?TKiZ82%6Y4X=d$@W&&R3?^c5z;f3U8}3=YW6j2s@nE?8wpgT565mYYb{vB z-bI32JK5h#l(AT3Yt&Yz^Yf9xsA-~OgVN;m+zz32mBiho|sR*S?X(FP0z!Rip}Pwd&FTmba3F-9mtezHK|{w$!VBADt4U0$wNvK zJCN{Wd0Iwvt6eC@smQFG!*+7XQN(`nd**r)YK;Al(%k0gb!04yMgyf;+hN<3S{wVF zfD%U;9})9D6Yggw2^VShGP?NWVd<{if!>%q?nlQXVw`bws+r$;eB^bB@#k|kD5)o6 zMWCj}m|4_d(=^DBTII|D(|7FYZoCM(a%@x=sD5BXr$ z!RA_-meS+fKS+`b9Qsbo`lJNySGt(?dag(^nMmw2Q0-ZCgzKI>nnZXNxy+@foX)SE zb(80kXAB9%8yig(?oudvV*^4rmjP9v(Og+DH6lU!S(1&r;YIc3N4LiMbF>;*$35m| zi))J~#EaFx4EA=}K_amtFlR{YEo}dp$buHhu`TDqgAGnDQQ{i}9k}GGtk9Gs&q4F5 zqT4uu&>6_B9!4O#8(6>-5jG8x5>RZ@pHQ96W50ZFT7CphEHCCt4lFr@FJ{Sw5`9f9m1^`CCNY^&OeI9IvhM4Vk zg9aU|0+O%F>SY#bDf~xY$;0nAO;MFb?vptSeRZ0!cI49fD3V`VjpPr|X& zhz}${2y$x}DY$?EsKF4KWhzW0AMS5h(Qv-FEq*u{Ja59NJz+qm1l~E5Z3?WF9as^F zVzJ~3?Ln1Dkt4qmPQR^7VEUM|(0wq(K?;$HV$KjN3<@LRdA5*a5b2)5xaSX=1~rUL zkZ_X>p22t)$;}39epF6{QURMJUGpxYF@d&>WIgspC>TMj6^50KWyG%$PTq~O#|Nsf zz~DJxxmMBDEFegbMSlq~8z1n6kbs;e0qfFREB5*9t^qQq0QVlMFT6!gUn2cU# zk@U}B*tCe;)B01XifSl*YGM4!w&k-73#PNMizdc7w8FfM^`(Y7zgPh$$E27lQOXxz zeyw)%izcksMiI^0hC6gk#WuLuThcO3ZS~E}vJP1vZ4%_bvO*hf8!N?p@045yhX$8= z0{eF5Usqou*_L8bxBWC`p4YrDojlHS!TZ889~n~qSVJ(;$6bZk&Y0sYN;xt>DH;FX zg>Vx~0%@D_b}~cZkDl}tLa@&<`Bi5g??ifGD}Lhm{r)|+*^N1Th#On;EWBjOWS&W& z&%(X+U@$39v--Z4Wf_{cbt8#r+eO|wQJ|`*@9@mS&`?%+duK&rkL!tBrT&?V80wF{ zUM>?ojw9`n6ibi5Ws!)_RhX6o+QhmfU4ylFHzGeraS7)c410*!^0!}Vr&PS_ZSHRchyiou6>h6XqH*s0O7WSq8I#(GcH`7d*aS}xBz zWuD%*U3N(JK~KzxP8d*6smUu?upSQ7OuQB~dCOPrb2eq(#Cq85X=^>(^!n}aj|VTA zB`Dv1PjF)5Gosg^NBf_rPiOXUNW`7FyKN?#MYQap^J>&*GNxj=iIa%sRsFo!3~Z-! z#4!ajSu$vX(D=8lDuD@!!#-vQ!PriM=$+X*WTA|I!co1Yco)xQvP}HWF z9Tb(;Vqw=V6~PzT*Fbkjw0I_`X1bwTn8mK zM^oNIyZ(=_FOP=$|NouEAiI(!F;hu)MG<1gz9mDHU0Jh7maIdHqL^d}VY1ZN%bImQ zC6TgbUnBcY)-f~g%jfs~-h1vj_uPLvr_PMt@AsJJ>-l^EK66IcGhMRau@)souI_Om&26OLS8>eDQy!O7vfD{uMudq@tx?-oq=>tHy>c0`ywN z4bW{lfQr%=k9Y~P`9=-^U{Da@ff<+X!}t)P-m0ZNw(sKQ9Sssou3EN5Bms7u(C6NW z$BnM^W9?fgMi8a3jd$~nzU-EfbW=ULULW!Kyo=6NF-VFSME`4~ZC-^t*&-@C(P7iN z3SRNYlM(>buvPz5D85(Kxb(7R=4P~Ldz7vHeXFHBZGG3VTHa;O<1>PJLtnq5`vJ!6 zWkJ6Myz3NMEYqc>jS&GrPykmZ$>*B^DNU!V1Fyb4UkHKm0j?+_ z7EEmp;1fr+D8fPL$f|0*AJhjSXbG&-LD~mhyANWwq4!t=j2o>$=O77kr9uO{(9`QZ z0*bzdgza%w|GaKa7lVchpLjXD^vIwOo8caFbH8w0She;p=yc!cA3|XTR~5xotdWK{A#Gzx=+bCEv9*3mm|^ zbgsPgxa`!p_;p)iufosUM2)@fE6S^3s5aT%VZ9M7Y0js#vF8lFFNnS+dZjAvwAH)5 zw(d6>=|y&O$Mgj!LGYdX*yQGHTGy$YrdyR-vA-1MN;O;*?aG40_Lz=kOHIL?ym4+4 zu1|j2axuJR7_${F{cfKZW<+IjoztlpJJUTc;@g=xk~7n-eM$3Uelo+?VWSqFm{rym zgs0&Ra9irXaOB}`VARHU2>CaGz_LIVaPmr7rfrgwXg;wzfJg1&2)R1BA$lGRm-6ARq( zHmQ#Q{bO>2LvrrEh*^_SCU|v}L_kV6Vgunzd4k7(x4AgJ9y?Opa zNW=;7+?SlS4-MGL%$okpjua0n?bMjk@E0n#29XI_^|nj z>9_2<7CD;lx16efEx&i>J0m9J6Qwl^`*H(p`}CF27Bt+jN@AzehTLT3!@zOH8`k!H z%E;2+b+D@|OiK$(+UUaEgWB5UeHIt`(c#JK?epC;dmcO;`y21UW9_8b4lVD$$8~Bq z9TazmJQ+UAli&Z2=(PMq;Q1jW@YmcoAcu}e@8g^(y`;IENox1fZOmnBo|`=;S8tkp z7XK7@vnld3e zx}#KQ1%9fWBv;R!ZfEJOJ)TW)EaGjuUOIEL(SB+zme%~kV8FO|HL^G3Oiyy-JnM~a zlgT{St-lCm&X#&L{SN^(A1m%RkM7;+So?h51ek1e(R8iv#6*b{C>rG?+@*(I?4}aLgd{mgq|_j3y}kCX>xY0mPv z&F?kklQ&YxT#?uyonONZszu&QLZ`&?7Myzi7=Db?)%@`C${)2O!Nib$h=rO6- z<`-pe6`ih}+nq*cXIcF8ueOhYACgg`iiljhjAC-PhocA;*6dYWusJi2UBklpBjS zX1?iiDvdBS;V${*>SlCT>)BIb#%39}RcfD4I2LdsG_H-Q;eIY@Dp&LbDoX8#tK=;;?3w539_+CJ zQ<22z^nPn>15&(D?`|^ySn5;?=s7W#yWk`Q%oz&s8Ndn_K%U|GyZG*7MpJwU@_+`` zB=19i&<0CJ_eR?0lCG;Pi5h>}P`#KyKlU?U6cp_9LqaS<;kBK>z|N6Myi%E9YvgsG zT9}a`mT+38NN@dbp>Fh^pPK561CWiX#G&iyz;Z4XpxittH!mR={65N;m-9oY3BB8q zu^!qL-VgFsDZoD#fby+ez_M$Gi@^m(>1ADFLQHrqW5Nmm`b{Tu!b0avH}3bv6wu7X zz9!w%uF>a1P;NMQ3a#cxXT9~g zS122nsTCc<1%j^ccCqBan&l?L6(#xs>trsKYEmIkmQ>G8bHZ^*s zX@_9?{rg0Z_#m_NZT|-p2P2)J(J$cZ8JR;$tSZ*ct{hQSH^rj<=;tkbwJ*&MSkaVY zTOoy(K5gW0?*6ERW>L9~6k4(0KkpmAAF2Oi|Cd_-GsEo5quy7w%}=PXb&Rawy`50a z>&;m_cFuuTH`X{>tqM<3*C?;io2TXn01*L4dr)|5nw-keWScA=@LlQ^tp^-O2}ISs zSIfXSsu$4-{4#A9R1bLexxlqDl%jW149o(uu0nWwJbqzUvb`tt5SCE zS!;ID)b&lc{#?@M&}+fo-f+S>4;BTjsSU3QzIEB@-lpf6kJ-E<*Fqn21NP7_0G)#~ zrr73EU((Kf*&Q|l``R~umg22&SIM-2g5VqZCWRB=%XLy4AtW@ zcB;l=gh_EMUlDCn=~}JkqNC-iN2uIzw>p-^DZEu)j{fZTdyi@ZfBODJ-nAt(G9+vu zC1!G=d45FuW-hpe3FfUr?YtnxM;^?wi6_^u_imc1@V*HiwX!Yb_V?c@-RgASsI`9E zbTg(qi#2C*Exzi)tG%p~O%sp%tK#099YWIUclAtu4J=B$b+K zay>nVj^DEf@;KiBDdm}{95WGzy!Y>G6Z6&PoP16zCM`^h&KvRhCZeoAdbc+POC{$! zo3bijQ%_UdVPko1^!?lqZA0}unc=^fKd)JvfoJ=a~2sL z8{X!LbxYa!jE{ddrTQ0V!s2pIrM(V$qw|`VC2hB*Z|c)cTm4&mM#JRWc@Jv4+$8nq zYZc|6OXXa6=;{%0$$7$c`S0cJ6NcuOPUjjUgG6$!)1(*yX^YLhRhV}$ScL0HpQmL6 zQrLXJ28wnGW9`_;1(caSz)<=#Y^|;f#DYRV7HuHl(}|*PE@9Z^E1_Ply?`6RNXI|y zQ=6$&FAaHpLgH#RsWGt8NXuN(mqs_Hq%$>m9ifTdN2(@JA>F4Sd}x}v0(ivamdiVq z+vU3Mq??&@4WL@=6AW$~~QKkHW*iqzDc9A2!3~id}9FT+nAZRdr%!ghA zD^Lj5u*%a+U^wBO{E-SjIaChdAsjcs7&wtDGqUc6i9o5IJ>fW(B5sllJbf1hRLu%d z%0+@@1FjMhdXG6B7zc1LB4B(n$JiYaibk6;OHX~8(x)g~1??&0CNDir7@Vd1F^rU1 z3^xxLJ)oUy50fG{KnA+92px0XoFY92Ap0ytD9APBVC3;8vO2$ot<7TC!8RwYNHo-) z<1Rdo$BH1`0j5b{3NFqkD0Y+>MQ-IUUj=EjG(J$IFZsZefO%0LpvwU8i#-X8EDIkE z7h-UP`#7mS<^@LPL&d6(VNiOh4JXW43CN!X+}3N6n>q4RdvlG&zLVy9v6Aw+mJ&aS^LgIPG^`O?(eO|ybi49=HiYUhqm zIQ8C$oM1}+R_WT4{jbp#GSQjwRN@ii-Q{8RT`i0_mX0E zyA#jTbfWB+lb6Xc>an^@p?L+h18=wg-1ZI2?4zDHcz5|qh`|*}ztb;-j3c+ptKW0` zPjz&3HYDd&s{SqgF+tF?$!au6>&}UK?by%Cej~_Uy{+kaq!DAyH9OG!LSwF7wYyHe zUS@eZk8)r>Z#++3rM$MJsau~S;pXHIA+!vOYK2g}=OI`2?MTxpVDsey_CDWDP!wH2 zC}U(-gQt&SkQVHN6Rm~O6qwsLB(03JU&M%3$KTIT^v&l{Q|5HL(a@O_udhiUju#Pg zlCnipGt&CyotxrM3o!hHrpVW_A3{uq)oB!9eFudeLYe~K^2ck`s*)&Ik$a5nH2(Hu zz(Kz+6Pme^+sJ>$dF;3$>Uat)#846Y%eRh(Y&&$+)YiJ%(G` z>5hd#*BBq`U0n{2{jv%~8vTrOueGLLb)DT4Q(v-uHK5D6l>Atd(^Om~vHPE&R~w}z zuF-v5@&`)6E98Ooc>UlDKwrOqBM~>!OYProSy@6>kJ3u#!6OJMRsYnRC4deIdcWhF zHMsNou5E{Oz!J~f$gcY2Izfibrg?%7|J&@A zY_$*V$-J|dHoQ3`+6K3>XeeDUUK+1U-U(ChVe8nx5#M(CPqX0!a-_8R@7#BEj)Bv@ z?$$_Q?W?!N-4aO!_ z;(@HJQXPRJyMNbrm%7m)yTEGaFW<#w)-`V?JSlLoZq7Rlac;`1fAGW9vP8C{6!_;rUP^$vMl-lTEolJRm$m5&#q5|J+L zRu0C<=hdX)2Cs{w;oD)GaF@FPKZ31DSM@T1D9qp@(pUg_NKkfQr34Uc zd}`o6Oz=uqcxBBIC(#suCJocffPqjgf|&S>>L1|Q%-%KE!#|w?L5Uz-!fA`uhv1?7 z6bM}`sbZReQRYAHa*P`Ov{q|#H+79yf1=`|f6qoRx7c9h%##$2w237LhBH0{JKARq z`?x0~9czGd<&j+;@;JO-qV?2h>xr@ms?ETYBkc@Uu){MKQ93LHBvhUC5gs3*exo&5 z9$ans@{x(l9F+*Y0LYN{0c=!2r+QQ0e!tPnQuUoL6LnB%dm105m=@%nK=QC0KGiw3j+paXh$!_$g=~2RTl{+ELI%S&f}QoA3xks zCLkIX^w|Q1wOxXb85H4S;o=O=7YWQ6kn`JE$xhdZTLt>(>b~Te%Ds3omG`M;ri0dz zXKIjKr+`Fb69wEGdm#ZCECxBFTaI9?O0YhJEzwt5e zXe8sgGa!BmuVqE#sq|`h0O7pUSClN$re-ht-)0}3Z_4(dZ%d|MMU_IF*mQZ<61hOO z-FzTgt$Dj}6Z5IaQoo2}#f6%EH~Kw`Nqi0I-0kbbH&SfVB&`_@6wBRIA8JBlseZ2!NH1GZd54VJ%{ z0=_87k6ACladt87FQ}DSlzuwo+xctEGb_Nw#a(L6s|C zImhh&`vrx?OMF{p!}(jcA1z}`sfTf;gt@LS>tHyfc)O)wqB@s~b4MraOgM)`+lpyF z8vV1l+p~#*Ip4|Ju4sSdt5RU^X?pAp2r?UgVPh$Ae5`XQVG{ zR%)^iC7oDsFY3?h$AKjhe2FiVwLZ?T*F@=x#Wx8`@2p!~CaddnC%jJ+SVM9lF^yhVhm8nS2n+wW!VhUWAgc3yP_Zh-?(f8wT=iUF+)6>0a)IVHB z%KVzH-hyB?nXG>0T>iz<9qRLWMR=kiy{E3`LQJ`~@vmE|C%#`kFX40!D|b4(z20W@ ze)~iXf>kt^U)SYWL6kt|V9AGPV;fBj6APaamg!B~Sna=f5W@-o5MBqUBOFLYkcQcm zE(06D;Ml@BX$WZJWDWEI0qu%7t>S}Nu>zpTuC@xcXM99G=GnYG3{rgXc zbMpf8MYp20n|Ykp%wB#fVlP}BCWxL*P*ZvEHM0A%)x?IiH1&k2d2ZUc9rn~I#hC8D z>i71h$F@)nY$efuH#q|y2d6Kneu&omg^_!5%|5>H#Sd>Mef$@1%ex`W!D4#TvX+V8 zdN%x|@-0qZ4^ba~WWwA27ohk0DPUg_!T}bt69Bg>krh zOS%g}mavE=lnLuD9x=RuV*V;36CvyWi2(Kx+FZc#5~Rt&fjL;H1M|YazBqv0?&$yp zF&K>O^*X@ulhYBh64rO;G};G&2bx(-UmtVl<@*oYMj8ZMO@=*}H;40uRVo-Gj>MlI zssJb%frl^o5IFe1^^i>fneqdm>mOjb!OnV{AQg-i$m~0sFA&fWmGkyWU3cnrE)p1J zhq-uf$yk}dW{&>p19~(~7oxGsgrOhkfgNf*g`jsQ0c8L-1tvwlgIs_O@$_LhNG`BZ5!SIp@O~Idjf?pJ zE7|T!_ixvao_?Tg3QpFpo6W^D7SNyI&+`B>e-q?a&q&8As8wRwx<=p-Q5?@J_Ig^6ZbA^khMMvE^ zZaPI9lw0C|x^uQ%`hyY-<53zHI!g6`Z~r9yc*K<%fbR?A{+e-wMHAMgQ%ID!T0o!7 zkKb-)`1{4ohe~AgGQ*y(!6SYo(f`m;8RyHt;X--yK|V^x|Cm6voaDfxnS6Kp;mqW# zxm8R?q`uR(JGGNZt8!iQLo?#>?eUg*zKv-}O-dr!Ao6C#l52x||9tTU;ftw_tgQOK z+n4P}$NQ0bvR9cqeNfdig76X!k2-T<>S{xM1+?qH>djb$1g0VY-CuA&%55p%=Ng`X2F&iq}?^fu@(G&`-frshi*l| z!~!ROe>-`P&%A$XTEBlq)V8Lk6o03zZMF2QR{Ku$gnd}bOnsSM+S7MlyoK-5W6t%s zGxE#f7h{7E4D9E{RRy-w6=ULQ-REin50ySqLnrFzI0^{#9accZ#E8|x;s%v1qw@mt9p6)w--SOMhswyijk)aMCasC{FA5k0v z>4A7gmWE75m;@232Q>xdFp`MLqnDcL$qnCojmergTlGjsXj& zx2X8&q~nq+Y{uJI9hs|fUbRI!Li7qu)5oocFl=(5FuT{cg7_YQFep#+jYh(o;oh^r zkfZC4COwC|BS!y0Fcv{8;GoX;b z0F;}-t!%zf$De>d1g79J5Dvs%s{{Mi1NvqF;eH?5K`|t+PBTT6`~(;Q@93k;e7itg z?lT-N5r{QPzv3uD?f^Zc=!c)r_?;TYdG<=hSe`(F{3DR|%`=7pdx7fuaKN0WK4mVIHmCon_xgAnNb9Tgd7B8J z6!deV3_yZg4v73&V~fD#SpgnY|0TRmx*!4<1x~C-n2cPOM_})t_o8`Nh;!sf3rb-A z61k(jiNk&8$L`*xApwV+v}mdh8c&wW_+*^O?0XmL!+n*T^D9RDqi=;0O~ss^lQ^4={=Zeg9t#HXRHKiJUC`aq~mrd96|w3$`9L?tz^fMm2$(wlKxm$FBv@7pjB#ow9Nw#w4(Z456& zUs6yoezksL32DFKWmt&=YnXTAue72ncH~cZvCah<){X;G!|D>!c9>$AtDH4{dnU-c zLy?+!2pOWNw9IwR1nwJimoJ4P)oV$n{xMxnSJHfR#@5p+TX-j%KULhhjV^hpvTnPe z{kLWAV!vR=XUW$OwI84!H;j%8ag1$i!jc&duz(JH#us49{^cm8d%R%-P-utx66&Z6aqn^(^683A{yQ-ITsXEzXNykA{BHyPNgmgbP*RdJ;0CfzmWpf|6 zkS?W_vi-nxJ*lbk*jY2K`mM=%SwT`z5*k zEbI!hMVa_KN9~s#zxQb=7RzfV4=y3<%_6C>K2D-J{d()4^tD=rN9k9-re1KE7`t-A zi1JGTY2(y16yxB|pzjj%{Nuen(bXyA6QsdGVXYtd?!I1aN?GAO!y(QOVNqt4Z9!KT z{#2c*r2q2Rr`1M^X)#t#a5Fb;IdAGHLd$L&R7-H}0y>bzTg+*FkQr*L(D8MGxdL!; z$@v+6ye%Az-5Eo{Am~Jgrys+Kvi%Gl!8|>!h-U;hhj-o~$io=H(<2m|3&Y3vy`YWq zan%D~L!ik7%utK){n1unEG4)m1_|4QEjKNIx((cB*$0c@pE1B+Z$+FXlE-nK$XvHr z$U3x6WD0d{@*yxkLSQ&%F!LOWc%D$t3djMGj$wWN6o~NhTqZCxH`p@4$Ckj6Kroi_ zY>T*225^Y77_+>1M?+p7dD#Q&@&B5)rw97m2V7S)(}({;p>=StYC=) z6z2*7Kl}=jO@qniJoK^YW7SNMJTtloKq0|uK!HS?LcN9~R0=+3c1}gq^dbbs{;?^e zC-o2{!66k7D5$yN$P6F&H~_Zynqiwx7{K%Z8{^wvZsk+PZ>NrISm=Z0#aO6`3@*^A zZD6`fPbG5CVVasDS2wA>0Lr*s0h|Vp!-L>Ku!$8+t^!^(sGi7GgB3+Rf7T^kIHdX* z`SB3)YL}){8$Ccn(s0H{P3F8GAPvEw2m|pvVg>i}f*wV^5++upE~kN!>CJQ6T$f_) zG&J@umILsxmi?<&o6_cR^vspwinP*#lgH887EHGj_{N?h^-SvSY}3*GT!wY1v8=?= zX;6NilUd*_|0C7!_#$kFc3rD!TA{o25c2pCLYceuZ+olxZ+n}LOt8K{&C3C#9Bkx< zFlc5##wdXM{e1{Z=J>F0VVZ`NFG~Z|cmL^b~+`}>JVMfPvX>;ZFn zw*>7Iz5xoL+?$gYvn%!SchGHOguHF323qr<{TsMxWB089-oUk(=fnOnX)+?B&PCPx z3-yCxU|HjS`)O}R>Af78$%SQy=amVKIvRw$!LN>Ycw6qg+LcopQ_;>748ys2o~5-s z*{*KAoujw!R(OS0<@$7C{6zQG-Fo^Q*=xDW6b&8o^!ika_+BSfW5t8_SE-|mhCy|# zMOb|8xuwkV?aqKad^25+d2U=@zoeJd zBFoY*E;IA&Rl<{Dm$?_~_qoH~F9w9RZ*5EW2b~*K9IF{l3o=P97QN(Vp>SQpupsoN zY@3S8`_`2ka&LH8-3%2njRf~;nY+`se@skM^BTc{CPH<{E=(?|)?8?NcDesWkDt)2 z-~FEs8sEIyQT+H5jk}*?>Fph9LpZ^ZwFe{ZpJ6Z2mr#H>i^xiX2UQVF7^cG8!ncm{ z6^}FN&)3j(&+n|XYR(I^RuU&;vJ#Z^ zNyT(u%z;xJsTj7?#n2yfiHF>pK;~4Rv(lq;xD^KIXLMT?ekV80_4%$_+w=a}BGIcp z^tCe5_0ZG?gr{_)xM9O`@lX-a8We0FpM8|9eCk5dy8_9I1M;9Hl*_U{=k2D&!zn={ zeset@dj3#THGO5qS3LKy@Sh^Q4-)A2i7W#sH>>Z^^vY&%tw8M}d1gjB0_9P@6E&)2 zt=DwylFudquM4@lhqW(@6k!{N!tfI*+gLsz6>pS2GTi9ySNC&hUXr>&q-5aXddhEq zKk_=yo)%H%u{f(CG*kxB1UxT^o3V8EGNy^nzkv#_Yns*hsa( zcGe47+mkS$KuT=`$3j{nTexcM6F3hSlT{7Y-iIZH4tgI`KfVcHB>)9D>*VUu8TbJ- z-C`^$(k{RYoJmKlCHYh6y@}oI6uL4p@fCwHaA#^B!i&*^WZ|&@;EU8)298eu@(`e) z=RyF3RI@g^9U^O6xJ2mc>@Dtr>OL&Lci|Dq+gI48$CeD3==LMLRf&o zpMAhZg7T^ZLv7LN){6w^F^qM}R}pqUIF1)(JJ}_WcpNnWog=uF6TIxvHIf1> zrFfNKi4AL|8O}QGpK}#FjZOimVsAmT!XlZ^?UcZSfd=dOH4V9>{?IF$1YftdiYI|TW1QpuO(Rv-E%>ttxaqA z84mPuyxLY-a}Jgm9kyZbiJx(r|7DV$AYjrJWN*0@HTyi5`)yu`Eq#D&?G0ti%VVEN zGPIjGsggvRiA)ClhXs)>xxz~ywF_$n=ku+HHh7Z8M&Aj4&N>m`zEdmy5Mur>K76zd?fqf4=eF65`@i@iz(|3X2$>3Bu>?4oycqjn zXKVf;(W2I9DX9Wf2qpY=#ZOE5|$av*X}nGyS)MTVl;{3O0% z@n%-xmhw*KOUm5hvrxg#-=!@ZC%a1xtqyYfsmgurC&9xx8>@xY=rZcjxY*3Ea+R@) zHMVg#Y&UfEU|^r;d4J#3c4=v`((o@?+3g<(a+yh&T~7JF$W~A%yiZ}_X>G9PKV__t z%Q$sBLEWDd>TW%@CoA(;>qVs`SFV?A+gW9w*z321e_eaKZKyT;S~0coFc?Cal=8X5t zECwETfeaWy7EFlHU4SRhA%^gD5;g_!@{6WlITU(=v6+Q#{e+tHseaPW?MJDCj zJ&I-;uDNF-$-LUm$gb9E(`-K#CMYK-@4NrougJm{ zj0I(h<=iBh$X2hU+{(HW0|EUqyPS;)TZBUSQA~aCjqu8nv!`>zhgB5HgA1Cp&+)Lw zqP&3x>BpmkhPfY8+@=RZbxfbCAsJk#UrLAt&E`nG4jqfFDX4WTjt8w$YLfTj3y3<` z=3fyU!19Mj9B?ys@TV8y?9U)7LM-7MoKB#+;~8P%3XKKybJDkqp&;_YR*n8_4YV^c zHU@z?hLUpAgl!Vg&s)LPj8`?&@DX4GI+sN-HuQ3)NRw3_8^7>BD<5H@-k)ol)9)JS zFldPS)%(yvvU%B0*E1*ed1yVyl~$qCH^7PtK&_q*tbdQhKZsQDfnDirv*kj7{M=Zq z;6_L6c0{jsR7)`yE~hiB z0`t3xc#)YEk7Q$h*-wNYmaO=ldKP&_qOGfCoUPQ4g zJWQnwJ{VpDxG!tmCiDl`(@$A%lRH=$p?N6J(P05!Bpj(UJ1^8n-X0bQ_I=@}6}ud_ZshC0YW!e3A<>aRqKQR$A~(6s6FuF&-&@)?D+%{bUo)l&EDQ zPu~hEz7Gt2%?!)9X|Rt=kb4WL*PyCV|A&H?{BaXGqtS9Oyzl`~pO5x(5=me!r_<0U zuB8@fSk%?{)p52BNE25b1nu+Q4!YS!)_vP*{VJy@A8j}F0q?BhKhypQu(%nJfx>-Gw(@+9+>zfDs}g`MbyD;Gr@ck3 zqf<&Lab!Rs`5*B1a}vb136N!2C;G!x&ku##Sk>WC%&pfim9Ge_e@^EKFqf@XP$U6R zfXc?MQ5$pOwpvqBka<+lfN(qGWCAj+W0h7;;&!r~?bKIt3buWow$Mo}@F^Wwt6l+v zJ-TE^+BqaLdVJ$gwF0@J`v4s~_B)-0=kG`#8L{_%vf<&1mU7+nTE5Xj&`@Pe!4N9@ zmA#>$1TC08;DTqNSv0$@eJ|+)?iYY`?JaLpET5J})#q=I40sLosE|JH;dJV>>q=X< z=HBc#b_T4_kZ$vSv`084Ml|OkMC|={HyXX7y+?4DNw5HRK=g(WZ}fTLm$PYTbzQR2 zR{it#aMa!df0Y7wXe&!Sk*!kq_c46fr93`;z840VYa zkcgbWH5#6~SOdZMWLp;dfq+%@lfgz0%$n`QtBh3mrxu)n=)LT1Rdhy9gmdT!(O^`l-t4| zyF)PMR=K-#oL+$7GwWpua;nn+wWa|?p@HKWG+lULo1E81&|ai6vN@a@Qpo)=Y?Y|c zCBIn6r<(o%g*F9TJB#P;CW)EF0Q|c)&)x?jx$iXCnBHw%gqQokrR(*eYbdE;ybNp( zaI-irk{dF65IY18(T4z;bq1dRY}E}54_L*3O$!lr0h1R4iLJ;zKVByKe6CG|_pR*u z3*wnq+Rt-bbiHcDqB6^|TYk7bjimDd{JQBoXKJ^lihp5QKNuLF8>FpxA^B!lG3LTKZbutl+>Fb#$B6&NJU_22M2=mwStHMYp@n` z!wP-{L&xdRQ7rsPD>sP8ev5f;E&JHvQQtKsriV>ml)7~PVg*Y<5_t0+aOaXk4;(SA zumcbcfS3Or{_|*9xyO14X@HW)g&4qq$|GkB_IzBBXJ(#OMD{-o7#qVt=KlaQ65f^S?bB-kz4VeCnI?HIW9D#jE21}yKySdxt}@=(>sr~1V1gjiLh zq%cj3+XeJA2L#C!qR<8M_H6wi*RXPcpaJN}WFk+Xlc0&dhyV=r`7YQ}!mKA}G=XIb z&$=ofGce-AWcD&f?x=6#W7duz}qD!Vds=>)g|qx(QQ$Kl(dEPLr7gOX?oUN ztn~Ku$Ky#kREJa4OZ@uk0pYJ30c|T~iB9g8n&a?`C)DDnw6CZ9r@*u`9JxEOX@hIE z%s~Tl&i~yF_A#67kv7X+liv&&CX7kN_fc7MFRwgsJ1JDEpCfuB`xbqSzfT3<1buTg z*_`1|%5LKpD3666UWbrR1*G*ZC5bjw0N7y|T=1G6nq1X?2swx;1i7#D zxQ5+4cB;h^j@o1j%-kdKzlKS9S8nSYW^eVsDC#2LVD|4dT|a$7`~FAPf39~7K9jAI zY{}h=HaUd+6b8n1!_I*A6~Qnc#Ll{Z|DG%L?!K^ZR!)UA>y3n-lZvP>r}VDs znLCQN+z&6WBfU*!_+1LF6KwqoUmRVh>wm9P1-b4~JT(Ry+yDMk3a#V{i8gt3<*EYO zm_zMCzr+=QN~mzOYSP)Q)OU zsi94@IFGFxL^1DOS){!ovCxwKRPxS{Ef*{zvz66*PBmLTF4Is_v~c?n^y~+o|4+jN z(JU)JRIqjVh0Wj}moF}x6GaC(1L$89O6qgo6vwNAg2MybzVRXC99mH3&3)-GGqSoV z*}Eq#wIt18w)@n9d398_&p$2|g;mgK?DOmcdGxOuotME?pmG3rvJ++l|w~;Ts)Y~)U zYV0dN0?lXp*Uha`?cuR^SDbJ3oMcPwzT#tK`YVeAf9z{&R`Ex7^N|NtY@=8gDoG8Z zcl15Rm;(3A8`$xhF9Y22&7k~REyF`| z_hgtgbLQ{;*f$MGL~bcw^V(BrTzgCZL#unBf2Lbe;$BONhwuY(bJK5v7m=)xP+-uQ zP$U{(Dkr^F%T}npI3C~KG%NaTjnhlrzpa0U6Eix#CErAL;Xuj&9P91{7J5V_?C(_6ciLeMw3WCY=OUPmc7=5dPQ&RU3~pyljRF zJ7>xoBpoVE@lX1n3|J`tjP*J6z^3C3~y@q0X# zYxgnpbjN_}%koHX1S!@ua<2wsY7eN*7^`{U{1Lc{u?ELQ_$;**Tndrfklig6ldV2; z5+Ciflm*ZSJ}?cj*B8MT|Du3=vjC!<1dRJu09pbCOlLrXI3O}>V$l7!Ad5%NQoysC zCID>};nKw@o8B!Z6X|$I31U#Q;L^4T&siX=OyPoT9L1Bd1FKhz6R;amXz9m<%-m@| z=mmD%ZYKFJ`bR)o%+Z-j$2x2Rp7#rIHp|Um>hO-ozcYzg2MJYQ0+ev;BzSNuSL_ms z4lljogOCp7iVr3E;T`ETUl(KY{_Sb06M$*n9 zP?^;p2}b^HYW4b$7E929*PKu0x42C_?ax?oIfT4CP()X*k1Aia7Mova5%I-$G+NJZm1rCPBei<{ z=g8PtpvU{V^ZRp~?-ugNw+2%32pKH2$xl1QMSZR;W8-Z?{f3jPmGS8RVX*;Z^ z0*q$t#)EC`0@A?J0kZYLt0K($tG({}?ZnWqeOlJdZ!U{@xx|=v$JqF$gfAt?c%y_v z%!fvTfu50C{x^R9+%(T-X7r3|msVU)W%)Pq#M_nbT7UYGk-P4%CMOfk;{|zaB-`dy z;xQ;n8RY}%e7!~VyA|8q(Gg{Vq6q$ASXw@U41xX^ZPj-PmX8s*I zN~0`-8C@UYwMDS>I9^>5gAAnWy?jMcOJ8JRhA1`P!jH9)WI!;`j7lE8sa;s0Y)v@b z(kQ;S7eajOEB8b!axuT?Z~VH)KdtXI*$4{;GU`$(J#=UK7}xIZ$jv&!bGw6pTdsB0 z%@vm5n@;Nf>-Kl}HGH<2gof~vx!`LAM@g2;fc=R;Rx^D7%DYvBe+*;!_lRe?|0SXr z2n^UWYT!I#@GI=(oc(n{Xz)cLI3ERQ*bI;C5o5DsZk8j(5 zh9xT}f-T;=bE$d>?jyjbk72czQSa@_k1ay~f>^6aPHn;6=sK5{dDZrQH_S_po-a0( z)UdA>9)?B4;$L56S~W&Qnb}yRmo=1ro4k_0gi<=Uhx#_nP9}1%4%|zMI*wt2XF!MA z2p4xikF0R#9UBY+$aR%lN;#Si{XTSfYB-9Gqgj8d*V1ekRa-6?1#_J=5dQ#^5=W>P;1A3mV5N)O zikySOJyj#VO(SZ+3Q;=-m{jowcAaI3=K@3#{?!BGl^By26&s@^OmJHy&kl-tj|+;D z1j2PaxDWg#)K$o7AH+Y>OZ&lQz^zKQGMCPRmN|%pU^vwawe~?Qql~wMUTU6c_hDQq z@5ej^>SDDq;l;2LO49Z@?FDQ1t{|C4q|~r+KX49Cyi`II{-l#S0wiJ0pOnNN8{V$R zH5qD?Xbp><)D1&gZNGPq-)ffVYkO1h#Wt?r#oqbK0q0kkqdbs7~kvR}0>QP-`x0kUzy1idzFOVME1{p@QsaR@p7 z-&bI8Av~HBygp6iLqvvZ7M@5f;4*4cyx^xUhtu3S6+C~ zO^BasL1A=* zv5j;g#q%}0p0*#i>_12sH;25B&24t+5f+xOE-Wojq}HJ?jf@o=D6{>Et}rO>w+k3X zleR;QNfqc+wqf?%Fjb`J_ps{%*Y2%cuvCa6x)l0)W<>K;+&%lc>oyuIzVq5fij#sJlzq>F5ktfyET zczH#NfiL!%{DQm+wX=6mk$rCDy~>NX^YM8=%Wq*It68L|@+faOUT>cKdM>Ku%?FWO z`xm30-u^YIo3Bpzp(gd$P(UdL>UhFchZGU*0}iuztt|J)ppUmxyn1$dY>9iz;-Be5 zh$D1p7U+=00D0+{ja4gbwgws?hWLcHuZR$O$tC~5-$?j6Y~x- zp6HrXmj?@a#LGGlg~eydk+E-I=C^3C$XUp1cD@tCldkM{j+gDIfICtgKuCg1X_~z(~h(6~Ls=p!E!55N}{A zD|?@d3GD|DD?36%U4VW>8>Hm6yCNi@uoaa}ghc3?DV>nv3><{OgUET&vqIc_FZHG* zhsg!1r1BrGZ*zLm#&Rxue4Y_By?O|dHzX~DvE=&Hs#}XM#thQk!_+HvE}@sNC&lVN zc=OmvL&HiZmIvGWNGh_R_bM*smZ6u>b;-Y3L26RQ;`;wsW?(af;jd+abu?hzqLBNdlr9a9^5GNJGEvXI>I67ds z&i>h~V~h7F*s*^PFY1KJ!|P%SP0!H<{}3T0M9Ie_Uy^eE3Ctq7IpFQU9asJt1mJpY zUub~-3|j-V7L*Ku1L=oRU>5t37rllVGJ%a2eBL7h#`xWn_5ykE|3%Y#$5Y+^|Kkph zy^}qTnPg;VpA)iDhmb9@GRw@$N*Uphk))1sN>;Y)s}K=ID7z%dCi58Y-{X9~x8HTU zZnyg5x?RS3y`Im<<39P~Kb6ZP>&zJ-dj*_{3@2~Q$ljJwLt9wDkpfDF*hgmNCU%oX zVNengw8-2BXn1%#pgSrkX-t^_ojG+Z#ms^^Z-@s@e49Dv4+%ijeh7>0VUwwN%QDIq z!2SPoz|(u9TMji?R8(Cz@D71on6yyx!X&-ynPHkWbVC@6jN@ILEXYHe?kyo@TVq>a z6bA{j)B6q0l=u_7uSUAWj6d-qzF*z1VOGhDrCBAZ|Hd%FjY2yz=$2a4yC6!~mrvzr! z*ZH`lFg28tS}q5{+I`Z+Yp~;1B{DI_9wtNmBPc%Z2vMv3CDDXtG0a*Sdu{Y@Uu8l4 zuQb7+Y8A||>C#EM3k`N%d5uh1p7v!gdY~ zreYdm3F7@EPVfT_B~zSwB6%=Q`xb=T!S4)S=3T5asZVJ-uNj;Yo-}>N(lEn%7@PvG zJ`v$hW2|)Je`G@)b4i91JLzIllm<=K@taXMg`Zu?{44)ds#)z>X-AJqhIUcz$h`Ob z_Jf*Rj0z!H7OZ;5454KAyv}~KdYv$td1=V%E3+hR+-u5M3H2162Lpl@+NqWtyEKs6 zv}|rY#=Ijk&04HOe&@9@Uu}Dy)S!t&%@@}FV-O#MT z?Om*yX~7P@1WAd`dpBjD#{QS`qCQJ>Y-=CO*%42sGeKm5cnOuejij<&5Qs9*jevE* zAGAvonEdbX(nc6Sr-+2y0BM(XB?o;3_z!3RW<>?k<|6VI@TmqirgdEg;R$yz=5-#7 zlV|A!Llh#JVtmSzJF!}oe-5z}#pF`20>L?S8{^@2^HVHFoY>0)njx4L=_}DFYD(%= zaIKP6!za|1$#C>OChC#JgV`WL7MaFuJvh`ZHjh#`S_o#E@ac@%9;b9ueVzWjfj1T0 z!}86ONGr6j(vA842`utP!w6`)V6coLfb4+Ot3XNLQG-|UvC@=81pAp=#5LdrW2+ji zV#>EAsLRID36#uU)Bcp07tPVDe(12N!Dv3vYL%A5EZaSfWwxebp^+EurT3Qc1+?iI z#Dt&4Vv=o-3Frk(CP)^(Xl>I5+rsAmSrQ3HDh)oe_tY5pzy()H38hU`EJ7UKy@fdt z+njjfna&NF9V>@@u{jm}bAT7X7DxD`^K%(vsV6KjXwI4~Af{tn{;azHr{HLKW}3?I z$f0CkG+*Jc7R6#u$Xv;_M;E7$KE)c}WN5&v+*}s!tN2s3g3^8j5IMp*rrmFVbUJWU zZAJ>B`LfDrc2MWa#5aQj83-t<_=tGJNE1w-=i+6+_m<%8b2Cg z5WTs~JOMohk6N{z>7f$@qj+=NQuEZcpS75;)1O@YkN7u^lhWPM+TFd`*qinJ{*X@M z*BYa8j)_DZXa)81-pQH6yN5AY0a?)s7#-OhIb@>Hh@6$)Nq(If&oz~-?5KZ>{fS<* ze@Y=#vLT4=>{M$|z7Z=0H+k&}+$M07^f7=mv9$!=-xu&Ok~6s0gK&m=GYf1WaYxqN6`Bk0-41ZjXHx_gc(xxDAY$E0ho#BJv91HW2}U6 z@Vb8)eT%Xy8N7Dx>*o-h-|@U4#R8pyyFY`Ub}Xd4Z|=0YK$?zc<5^SO&9PM!eJp;a z@fMf1P~$8}qyHv>AS%}JNKZ7zjvRC64S+;RZQX#u>WQY`xa()FPCxyDtL z&W=5yKZ%NM;LrjoV@{|0Ev#2W7(fPHmVr4l$#j(2CghtIObi{yx3w`heF<%UmUeI> zH-OJ4t^Vokwguy5%>qzf@Pd59A-v+ZWgbIGG`|7k*hKU^I_w+Cg`kEL_=^IOISZw> zZ3Tr2D=eXKQm)}uBS(;9TM)N#k^J*TS`h;7*fA8DuzfeUZ#{@J>BoCkCW9{QWxecq zde9{IG0-YC;I9l*vr~H*QemB149HO}GkP3`;HG|w3Cp=2nBpQL`}jaw{eNVd=C&+{ zQ&=k=O=b)+?Bh1j-$U5cPg+fWQE}&tLkqVZo|Ovj7wNt$xN+~aJX2KV-JCCd@|FXm zf|u?XpUJ!xDWrvak^9|nyuEgANuK{w%8(+Ds80bQ>BSgp*GcWVPSE<#k8GOrVBtES z<_cyo)h66ce~P-8{v?W=g$=-6e#D9F2jTrf;qz1KWx8C#jesf1lozWqP3kr1Kk`Kf zxE-?G45OBz0nNd5#UjTn9r+COgC8eAJb2q1Pvpd1a7Q~M8@3TQqS@eOn16UycdMkuhBsW#sebZqXZyy>b!2optyQ8{bFofiPOu zh5`Q$4hA;#>|d1QD4M2GR+4;#x@8k>KldAbw_^w$-eEz7y&2RAgR6`=%ptb_A|;qd zN%l-x3q;66sAj*p3&;v5C9*Mz0e>ZGBIe7PX*5AFuVJYEP}AV-$3o}k#mZN*?5+>T z-%*M&`p8PxGcLPCO%c$6MY@)QVzg0@rguw?MuHf0ZsRg&AHbGAhVJ|nQwafxdp3~p z4X=?K8j5atYuk`&g^~FcgRWi?P%)sKB*#i@e*l%a(`b|*^Y@q#TTiM5bfbSp)jdfN z>iEf9(zi+=$t;nG5c^!K_t8u5C;w$qS#qq*)G$ae2fI2Mgd3cXS&Jf|ZL#uIggq=r z39_#JOX75pNPkPpS&v`+jp31KcpKiUFkvR# z@;;WWt8J$4)V23JY&NR;6{Cy~1|@1%di+H@`65etmddC;XtaCZD~ZL%=oF z9QH~v(xiMl-Id&Z{zGSmx_ZF@b8qFmablvWo9{iVe)@)PUgWCO1Mktr1ElkIB6A97PI>wf(k zRzAUueploy)oy{k@Nwt!t~_IxCQrW0WTXn=Or@4P&E~Q5@uOU^5szudp{Kk@RH+w? zdp<>3@0G}V)4YIWnRPmbV4Mr7@kzBQ9x(w`d@H?-i}G4iBg#W5h(O~GX+wYLNhh?M*9-2JdAlP>u3&&eu#+>JkA7z9Awb% zbXb$``YfTlL7}YFC}6rQjJe_?&2p0bIlPtC_FR_Bj$L=HAk7*^NeYGRi`~5U8l|-) zMw7Gkx?FFyddds5|T*aXUXo*|1X?{bi2vNk=ti7 zwo>onrC~sg{f%}5!4pXTAQj0mlsub;y~vr3tzo8)eSS!B{yJHv{M`a6tw928J&Hliy%su@U>YW$UBL(rnia0Cq8vt{4-x!rgme1!@2DoYCZ4M!%`mj9 znj;LtCju5XgtU6MHqe9}oM+&VgLg8Ujf+?d!eg>Nf`LIfJ8RCvnvy$e{?Gfuq8CvA z<^9;#{%)Yk4H>2q*gMQny03$q8ON9U(FC!I2)zCmY%c`+bVgW~Tm^!(vqz*|9m zsf2c?V)}JKJ2k~Sem8r=+v9KEDRdfE>Nudj{;Pob;5T+PZTVwXJ40L$vwjfIC7Z9L?_~p9WBMMJ zT-86@w+>n;U=r_*dB{8!qelVs_yWB3{ZJ_63Kn|as4*Z-6+TX&Bj&--L&*q0!NPB_ zeglt+SN%ef=AKKjj*02aX(F=r z3y~Z+?v5~Obp9I)1Q`1x=aCh@4lZOrqF1J(S0lkTh3ftJ6VCnxk`GCShSwiC{RzCE zP*+t=o)eF7rmOWJh8oS?_uFLpL&WOO`%^EL(htk~9o{XBG10KwNDs*jKN*w|e^4SR zpUC{GjqQnXO$<)QLIFc-EN&-v4tFakxUBzN8G&uSN^rD?Q%?xb^#fj7NH9;WksEN^>AX-q|U03DK* zO`HTJIDV0Ralz)XE4_%hXsOd;nb-Kn>0E-8{Fmw7L!T$^!!2~d*Fy~VBtOTBXg?&{~Ow; zC3VhBV;l@saRFiIh(gckhROA06+%ZiUBUYi#%xlk93(X~)uQ~~+2VxX;<)emBM=~B zn2PA7q>d-k%Twv5U~sW3x`TS+;j$prktBOMrsxsKn(v_Uf|@Q(X-F`$?BUHay67Ba zoY5upPnU5JYi*;sh}eU0I#taPG9UfD{4z1CiPj=A0>giCrv-3H(V*;eO7vU36pc> z)-6wZqR<)b`mM%yxD7QQ&eG;{x)bKGs;B+?8rpe?oo;A?NJmjvpegQvVvrtW+IIk- zZ}<%O4<&cYQZtgB(HE?L6QZCS9}8olIFcuyYQj;ZI!F#Sc2n^D1C@@Yhg4Aoy6gIx27l1H3mbBTeuGb z!cr`rOG+8frK)JnIg{g1qa(MHn%@bXRdyO1ORVq1_7QL81uLB( zlR5tb{MW{PD$8o6g@f-Whfw~g$G3ih=)}V5%b7ESaPc^G62I^zFhfOTDa8|W zXewgfFyL9=!=68$rxy1$hb~AK6?qsuy^h%dnA4o6IvJ)28NkG@q6XgoUn8XYiC-95 zq+clMr9UWPJOT0MrrD}TSABMAe7F~ z;f8wh@L+FFXp3|Svk?NZ9>D_cNi_sHb3BDzwA3>w^QjFngM9KT6m=J#?)?;AWn&Q{ z4YcYYObPmbz;?8b@_NG#nW{6evB_JN!Qbke(9WC-0JL!nNH8>_=yS>JdYN0}XykSF zuz)*KkL}|%XFySo^#pV!i(bDC78xA)vY-I!07B9SB}mUskPdW;Qd$-o2OPUf>Q8Jy zi8XY}V^EKIii=a#YdIyU#y{}qB?IsuKUEmZQ-Z$P>c5M!k$U zvc(5QI0+t1qgR=ipIh#uW_5<9?`7g#zlK>A%lJHVt-G`B*EdUrg;)MHQBZfXs)#Lz zXq0v#%6Gk*aWeTuPR$fox)?NLdon~R0@fFPuZB!t3GQRaexW8B@J2}@|LkEE{Go#i zu!$`)eIgD-Yv4M-s!?jyky8ov`y)@zqnQs4c;KTfAz6L*x}jb=N+6RtAlDWBUKPuE zej>(q;3qrl#0LX~2~6sH$arH%gp*cFktf(|m0!)xIVo#t1!FbWcTq!QUM@AiU)^^S zD3bbf_*l$)G)p&2FR+IF;f$Vtmb25jHq%QlANdMloaH{njyRWCJ+fy3G36%esa#*h z*@vU(<17lk)?UKhkO6b3UZFpx)1B=s<%#q@!)RN{wn`sa+-KA}Ql$4p?@)qEKZ^q1 zB#6VH4t-rUUZ9&Sy_Flunf6_^5VX3(v3F)f12C~7sx6lH89_d`SB z7fA})FpT~V^IpgRnzIEkau&W^I3hsYwuYxaWRZmi6{yw@MTW&pWVLqLr<=V}urHA= z_Dm|g$RoeZ^!sr7g`bF}e&Y?9``lz^ySP*YQcT|s;B6P=kFXFS zO(NTviV;o|eE`_4g3YrIaq0y`O^@C{v$|pF^R1}U(OwY-r^$aeQGm>bi!^<>(EI!f z83fn&i2{l`i3%Q!wl}0E1+Io|h8Pz2X>=H&k5rBjL>eCkNMjWJssC$Uq*2lzBcQ>D zu5;|c8QH!>#fKGG#8Y-yBLa4tafW=N*2(82jl3=jL1AP|$2v-S;3t|u!*Y^>v?&SJ zRo>b;YbHw0FnydLDrkXBSn!=~etlM&0$P(7Soh1=J&P4^_xp3sshGvs5l3Eg-^SDo z{f?9%(v4Y|SC(hK7-fvlD`O>cib;IjG4-qoZZ%L+!v^Sw zI9w;PGC5vh-ipy0`heVYdk3A0I@hjp8wW6R%*FmUv|mgtkPCy~e2F)Ta_zat4$7tsK}Du=4aV*e#OiC^$vTGTXc)$y`K{E=1$MkReQNov%h+X_&+FR6?xtsVYiHA7mCR*suY z@u@Gsx{?{Lv!A=>7t6S#eTk@JWLOWUK|(8Q_RvXAU!VN7mqTHB1$8Eb(=;Dtx9hoQ zSEnAV{+@nbS-@_HMgDA}uz`t^J~YCB-VUqOgyZuE_rk)!SWLJCuk4pN8s0Dlm|Sg+ zAVx)9LSE$9fD+kSY@h%Vf4i7Q9tJ3BQ}84oLBaE8Tclr^_lax^MYvMDilQSaTlaW8T`C9jF)Att0Us5rLLne%F&)*DNyFPg! z{EI!5cja1o&7-^2lF~Qs;&Ey?t28xw*0c=?@kbUy{;YumJLEa1h0>aoFh*6HO7f0XQO8?WMB5M6Wk?QmJSd;uko-Tp-vW=BG zX`0<6^^=@#GpPw%kOL4~;iHr6#Q*o}Uo#E~70(LGk@M89hyYtpvP{T|N&Q0(eWOKZ zlMPMB!kasRRGxjL2NTyizQsD*GC*i-O1Q!F@7+u^wwmR-Ns?j#2+_{S*x9^In zTmTRfJsXPH2V5FVJk)2FQ8c~_=zvsnpok~Y_aqp<(UA~*GCkM@8t~fA4C|QWH+2xX zCWQ76h?D^T#Rw#VO+pqk+BTGq0Tt29eiyFr4su9o?uTqjaN?@C%h+Ni@T1fH{#ld^ z)-19RL+1nPhbBbF3?`H9z4AiCoOx!RvAP6%EuLDSn2ly1r}RADx$VX*b4#~gJX^zW zN!b`larCw750@dnes<>#i==Yx}OPA@*{`8H`QosmupMJNESK9#O@z(FI8!Kgm9cgtW#a zyvQQ)ky^lt&jyu{|3?dN!=2T8HI(3Zv&}-(RbfG}2cA1Rfj1s4k{|kBTwnI2y!?yD z>g}pzvfHfhHe0AxLgBHd`BO9z%G#OBZHJ_@lljlsST33{DHa`T4gTBDJ?Z*rtCHEq z{q3*t#NT{TUA^yoF4}}Wah(!SaTaXr5l#zCn4Sa|sUNpwinTVavhwQMMsGj>QRLb@ zu&-ko6!ke-2rmd)wV7vZ0(73{4Ls{|A*AN9G?h6Ly#uMMnw8PJcp7UGhy~rea7Hw$ zK+awhfEr#T5K;(}N#91X8|hGopog;dQ;@uklOB&WT|yV_VUeg>g2T|%6a}7O|KKgT*d*#vq!zi1DNyHZW@IQMY z^=7HN?IUc=YP2Hr7{$;pR%uHav_%}|Qu^cU7r$&^oE15WdKQwZ&u{3yOJdQ0` zMm@;PJJ9PGZl<1zGpTrSz;x9HePo_>N9*d({lfn~9N^CP%%MA(Z&9Xyol%}B2|Fzn zPIuRtub8#!m>~fgE#9$Z{8>dgI#V?s|GsfR(tAcdM1PAILI?b#qiXDg8-FTJeT0U& zf>KmA*jA5S`9%=r+1uzs19EWz7dlaQk4cXX>pN)gBUiYGjGEbF>A!ZLmRiVFM9^Lsr#i-D#^!=||` ztTy+^0f+Py^KkKQ`2sZ;En^Fijwr7eMj=npy_{O3T9FOB*S*pzni`sU-un+1N_eU_ zUSs?FqFb^kX#J;R=jEnUSPqe9*O=Ma+$_mCWLzjSe@X>E!HwMD>|?VY>fBNdic>F9ze?&5YG zC4~n6BK!&GS}t&Y0sL?2L2-lx?*upz3NLH0fEaQQ$K9fVg&!LU@YtK+8CNsZX1gNB3_WTDMrMfPW3|T{POU~xu8XOk= zlRK78RI9EV+WeceS*z<&U69c6?16^hoNJrBvTq4d_I0^*W!5lvazanyi{Zbxr8-~2 zV#=wflBT%HM&%H!?+i1n+ZvRnBJ!Y)_>M+-H=-ch80%6S1|$pwSI#3#7>`47Dg$WS zon{=zq$kx8i!jv+e&G3iWFrW@p+=jY3~l=p9nQkh)>@(fuX#I=Fg?Ih55q$WLRDw7 zD!wiQ=&mK-*h86e9+c2Wkm7va-H_$`}vgb zudbu2xi$OZ6Ao3eR*&ut4hwl0=OV%08#|(Lns9y&qV3*G`z1np1%3HJAG=KREFE2) z>jKCR2-@Aq$qf2vmC#&vWUa&BtJ7ey30XEM^*e{_o#aEhk$V;^RhdcjqIfBKou69)SiSa%= zV@QQR72Btnb|4WcAQNt)rGk9=>2ecRp6m_~K`M~+33ikPAPC`@g{5p2{tyg>*-I3Y zYK-I5ZjENAJ`WQl^9E$&F+e3Jtj)YQ2xTFkN6?W^jbjDioR}A-_V7g)o8+|OxIdFR z8>y6Aj%Df?TLi7)z^Bd|T|(RDDLZUa-;akS9Ijp3iN*?2Qhyc&xNcbouJScqkrP^z zUOfA;$mf`{Tk!U#Up-~G(NnX3RjbtP{LpQP&)^qg|Lu|OM|+3JVl#>If+>CjMg^1; zNwlPGO%dGTiENRlVuN%&vKSU^CsM%-nBn31xrPE=kt!{;%yf5vpUST_dVUp(0GOi) z>EW|k$Wc*Ai`8-($FoZXZ*1Su^A8NiY zG4U766$*;KJriT-~igjDorh=_aYK?;B&4e?`E(~IOI5i=}9lg5dZo%C9 zJzaB!-FBa1PnL2l%s4R)21g>fRA~m+4n9)k@aeS&+}kk-C^X<*KSvYOWhx>m!9)Yv z*h1rAJD3t{QSZ;@>1Uxco-vr`H!K>t^6q+>)MlQ?a~X)WX5{K zTb)`s?alaF=7L55`-t}H#SfB@}q!6O^Z_3dT> zYU{!sZC#HVwxmphBY*d(ddA6^KIOD?w^@HA@|AG40WJl~KKOSa7vXhpn<-9UiRut` zf2}QY61_gqD{o)S1>z3NjV>y; zpH@8RK0v5Nn~}N|J<``{-C|gnk*>E_@yi=!9mDluP$|< zJGV`upi*jZM(r1l0`DTm7w-s(<{z8zszfsJg)*CY_DVcgIi})G5`-^FI zWCLeCc^PBKEi`p5oC8o&I601PX#5gmr2HEzB5~q>)-L`Xg^%oUFR-dyE^TaixBdZ{ z=nRqoZA!+V1lYh-;mlCOAx~0BL@684%>Iz?-s6H(YP4PaKavHR4oJf9pQ6-Yww5kI zpnXZfk)R<2uN(b)Q1eQhx4Rz=nn`HjXi3Yd024apWp1d}?m4w{2PWkYi1CA7(HYH5 z`d}Ai_Z|+A2Wtqchr!4=4{|v3MjGcf+f)F3B<|s86w`c&C`2lTl zFgF)BN(~N65Qn|us{!X|@HcR#dNE^AXHpA6>n7*k*A<<=Uz{>K%zPU3Qh{iSB0?xcK!5u0@ua&W3kF!k|$ zntCjt_d{HagYQ{fUd{wz)bgq|w0J?YM)rTw+P?zk68v{eS0sy>DYI+v?V|MKO;*m0 zkjP)@LLZVWDQe%BM9~d1)fqxTNyWJvud)0UFnJAo>`lveTy6PlKV`Yq!iUipn4BbnIve+Tu_+mki{*zQ(Q-kL5XThUYk zVr44kP(tn>4obI_Dm*Eo1|Woh3%wWVLOljLNwxoxjiQ60<`~RVcGJbk=>q7WqzI$J zq*;aHI64LZYy%N$1&qgP$UmQ=_wLciwNapYrh!4k@O{<4q7`^Ql7^tF*tpHQur53G zO2pOwsUZ|Hh;?oY5AcOH`Qz(p7LHB}dEBXI+sgMAKUr6-N^~3l;24ynu4Zvnsh=Mz zH{+OS=-aFCGQPGJ51Kza(^9#d(myk1F0HTZT@t@&i0u8?HiYpPY%aHZIEHc7^0n*D zjC)7H=YLFAbp-^T0DW(kw*b`9( zG52Z&U>MyLv`{U!SY$TfV~PF4=9<7b{XPU)&-qW$;QZrrbjD&yTok9CTLbFwc_Plsp0lG3q@cY<%B zy_8{k8Pz>&jR3hNw0ux+=7PzDtW^To!@YKp4cOv1*~sSs(#Hzafc|C&FWtWkp+b-r z#8*NN*yYdFFylUX=;iA{M?;GyA0^l5c)6b!cqmC-1{@+;rXe zeI1XK_9f9VVr%dDIPJf8z&cZdmp;Vu9zPMidrY54QZB|M$5KqgEiLDtb_;1;N6@g=ZJ1eSCR{NZzhrV&gW!RCuf=-2 z1C%pIh}0CI+o~R<2JMiQEg8 zWiBmiDag1wn4Y8P8Qv`0dRd7*3z>IT#&Y=j-Mo)>|8y@p#M)K7Tu%4BEzH(u@7#1Y z?77#mDW>L?xJGfD6Z3{qcdsE^9lrrUsG_Xs>5M&dEB&RMQ9Y)K^egu}aGm47_VHDE z{Xb!eiitV{cVKbUJB~j$kIngmLiC@GmJtP{&k>Z|FMCXLO1G#jHPbpruX*cJ2suUA zhWpLLIjG*67aGVO)v>X|+KpEGf5j3DU3W#KR*HTH1{jEdi-7`!4{(P>K#U*2QMD)y zT?r@NhIGHEzVmWi0Hhm!j62TlUh1tgZf6b@Zf$ zViXkKHqo>w{8-r!v*sFFr@U3UYJ=y05mHmGQZbGuto=r_G`Nzp#aHZv;Vxpw`;w#w zIi_M7QU*q1O$w>Fxq7}Ql7;|U2k?94LW?LMgM!_lQXrvcJ57)RU&6CCj9d-x<@rO7 z<}BMp16XbkJb(LZlnS1vMS`i1e4Sa6q9%HVG<-Rcl-$6MI2dE~TiZrJK!*4YsyO$M zT+~-Z}m>ky*<$=E8p*1!X<&877wwv1b7R z=;hqS2XgI@1XU&UzUYQsoQ|mu>0s5HTP9i~trfjD-D2^{BYEMG8d&|`84wV4|DtKy zqmYN+3C7qled%I0TIK``F#vzq&@<~$bp0t>7~H&}h!7VnY@2Y+FQLat`IWR$l+i-} z59NXAbHQpd?dz1tURcKH{nLYS{1uDL*Wbq&lYNq4FA7+76>N<)_ywhX1!hJ5c)>)J z3b?{yrIubHt+bS!l$DQ+>t2iV`NAq}Ai?toRK3Jrp(hdJbc}w}W(6VfXpg>OHi1Fz ztduWXrG}N>Gd0y>C7jPHcfd&q)Z030?C-mOw_j9vCZEZzqPn)KKXJFlHww&w}7-@2}aBU+BWA0~zw zxxY!uHX=TC=Py#YcI|vOYF$e2<8=Oqt)AQXeevtG;wn`)$wPt>J&0{(8Cct-|0q4_ zR!rw~))y@JmOosoO*n@(NPaId(pj*?ocHNrMcc`J4(f~VI5mekEBfM6#w4}HaQ8!< zv$`wSl$&yF3QA_;_zO;CFkzb1mN!Ft<~M`*G2WA_Go(DMAk|RfN6$y$>_u^$gR)cQ zCRa_xW;cUVl3p-T>C`>`E6OVo|0BEDUBAO~r#GT2BHaJpZ`E@g?S_PsW2yKv zKexfZm3ddn48ws@bWSkgnq1q@O1vMTYHxOm2H#N_Xn!ep*gTUxy>&F`8YRnzDTCf8 zdhIeRiD4mqvUq!;t-x)@Sv4 zr?9!k?!%oA!u+=JS!TJ}jWL6x*ZCT4+D6L;yd*Pord}tk5oa$V+sNSB?S-TW!#a%f z^Jb$^nI<{6E3w(=;gQ{~K|b2hH~KHLue04v8t%K9H6ChjD`}l;HD#9L%J%)D3Z8WM zANB%?N)ha9>cp(loW%daJ<*^{=LEt0Hue@RE};2`gYTorn^Dyqe|~;gDbcn%vDe0_eU=Gf{d7#T_|(*8qUGNZ%N_ko1}vk06Z@XIrRRT;yAhxe z?6dY>`0Bxu39p^B?I$D+3eu9TN28<;P?z9jNG+U}yhMAxQUqiHskd&Hnt<I$ z(+BiDh=Tj5FfqN+I~C}>FIwxnIN9cy$~N+U@Z5t5ixuVDM@~X&PnH-^1ML+hr)uIf z^B3v$$cgYJd9x6oVnUm+0_;$g*|2@uZ76UnYf}Acw*VNhuS=>mM-5$8BA-rF(H`zC zJn0xaK?@+2y2KPZ?2|k6R3w z{K6{`OBrNUO^}2PUgjnWzr93qVlUIT3aC>RERSiTrB?sA9`qX97t>))rX>X4g+%h% zzvypn=->`^jDC)PZjt zzcd;W>1{oH(@S2uy?({n*>|>Is=C8+Go(|1>C>@ssi4;h_Ia{|n!)1ob)xfVxR*%m zb5z+=j$=*srh=RW)*r`r4Lh>9nV+6q(gakk)BW7yj$ISG`=tF$hSDnYw=Ps zUghC4D42&7VXeExGvcy+H%#8f5EC2Ky1Ukv+f6jd8~YRpJdq|x z2gjd%{<^*1nibu8rtFi_;J|n1SMYqoRPK1s(Hrmy?5$-hejsS&Gpf#S2R?p)%gFiI z@W3Rp!Qt+W?uW`d)x7?f1MYeU5;dgjJOk5rst%rP?*5Y&bn$ZR6@F!YVxTyE!OW{w zE^|Wup+Qu@#-cGpM4?AfZQpbJ3z=_x!Qrc&R6QKixgDA>RJPrR_#F-Hg*?aJj96x! z`BQPmq$sH>eqJJY_)*Asvc1pupUF2La?Itb87~RopgrmNi;>i)+tm7DwS79_IfZm`42HL-792f(+Ef`}V-fsyA}&0hnhf;x7h z05(a|edq)`N{QATZzyov?Tp*(_Trz_6?~j#wNq>PV~jEM>&B8a!+*m__9`FGCxUUk zT^Hrl=O*)~iTSx-Z-(3|cg)y*+Hx_=m$3biBjYtkmy4Gs>rdfB4m;W@2MIIHNJLdb40 zu;@FFF(Fg^c=quRVW}zm=`WFQpoQwOa!DXV*!5zQV8ZA_Id@4(s}J_6n)-52k~zca zPlcSS7*|gTIm*q7dLla9Ca_#DUdNJ*Gquo_^Ql^*jqbH;&P|MO`S{pvZU2q&V$w8% zAi3?ELCAh+U}l6hzjlS`414T8%VXHPTvNh7Uwk3jq~@|{Y!^h7c0U?dev^e|N}ct{v(d+ZxPS6&+Jxjca+sl43yhg)L%o7CL0~DTO@97p-n)vD!_l?jc*ThMV^!Gn+aQdvQS^aFEI^SL0 zG9rBRbRz3z*XwOTW8Sb$pB2Roa|P{Ua?7ZCWw-UL6Vn%G^3QDfk1c6Z7jF-yeWkX( z`up}ry}M7k1ClkOO|quDs^0a-tzUY3k{YHmCX=mH^Z2^bO?|`SI>M!0#1v~>fPu^5 zeO``kDCtYCl@fGY6#STIToh<-q4sB3gGa4+{7GRUfg^#QiBan1w@6FdS{09G!=v2h zaGga%#g~Q4dRh%MR6})P0cQtzLbhmIk24cs{bDu5691%?O$n@ zygR9H3IuUX_1k$xE?>iXiVH^C$i$u5Mmp=C2Xh7oa7}mLmvjFwAx}VRa1x&0a*LD8 zKFF7ffi<4r4AZVz2-=O@890>_(CY83HGR@!lH2l2E1M`frWLO=TxMDSH1kH~eH(+{ z36&2D&wLoaDaFegA^4i~{pF62^9(JemVNX3Q0I~2Fw`PA$aCeTno;m`%SQq_;;imx zrY5Jem3C9_ALXWd*O3+SVcFrk$r|*hBOYB-Yav$nS>~&mR3+c0BgEequGIG$`e{@BoI?=Zd39 zs;@VHTd=;XYgm>M=eylq-6=q$RrFVID}33ZY&))ur@G9>P6=N(a%#lTQHgh`QU5gF_rQ$wR>A?(aumi!(*6daBH53W1?~>Z&R%~(P`B6E~g|fs}AA)3IC|!X2e^0r_CwASZ=H~~J)t%P{ z2U?Wf-P^9;GhwvKOw(UH$*lV7Jp1F{u&(d#sm({_Cc7_tr~gI?&BX4!!ZSMmJ%e7B zKCcmQ;`cn+;H!F;rj<%&^@UTlH*|7XgWbLIUXRb-$XReSwz)^6W-|68CFvT!oOLqO z!m->=bIP=GxLe8r-^gE>B%ie@q_)&^F(UOs79_SUFRZ-0u)3AfX#eDw+sf^C`>)D^ z!*(O^8Z%o9Ylocpw2z(Tky4(%kH(IbDw<_2x0%vk@svhJYr3qTYPgUmM@C(<7yNG1 zE%=??^$^wespkdM^PM9pH@I)rN4-Rp52vS!B217v%ys0J;(kd}PPw0(wp9A)=l@hV zo?-M#*70J|F=e!3uj9FrKK-MVDuSNDIzQo#SNvXsba#IK+)dZ6uGTKYo2O{X1V*<4 z52U@K`m_y49>jSl2H!6f=NXW-P3@Bp?vA!@%>CIuHZ@rt++F=WWojWf(n#>}H8Vvg zC92H7cjAnE-4kE`h~NAlSmcyEjwV6;oNY>Qd>J(DY zc=F@FPfh^}c54G8xZFtkt=9(vrV;pNouP^DYj3`IRu3<}UF1o!7f@)b>OZ?G6WYlT z{MPBAd+PC|)bv6A*7SiIW-H`d3T@Hr`budZMltlLtcH2Yl`oIEk(C2dPk#Acn47vQ zdnHL`eED0iWs60-@kGJ!TH07>;HqU+KD$#H&Lf9gMDm%HuInws`S1!3x0LFZvNy$! z;oiT}q-TB(QO}1DHwReaha*M29(xW%8pt&~9Lg-h2JUa%5*K!AY1PYbbHAoGvuJ*8 zX8-eV!!K*8i}bJf-A1JO2@7BAn)&b?mCrd69u>!`8a}h0u4&Ca8l9-k^i528#$zz^|w8PUvgj2Ba}Ivbu9~yp#2g5%n#De{DnDsINU?r-SRy3LY2?S z6V)IkQ z@-3C7p2jP#+D1H_LZN?brB$A-$P1G+s$+_{>f|WkH=b8y$75C5o2oLmc z6A3G(K8B4}7GA7F8$HI;Jb!1B>L(4CPO64D(!TPjnWS8n*{_}Z^uu}e?fv-gxs%E2 z5>IBIsgEu>ioD49wl}hDng3;WT6<6SpftgA7r64HH(rTVw!UK;7k;J6uGmc~)Q%Ck zj`DeChXG|CLYfI;#qw>C4u$X9aV+%c1+(`ozm#50T_iByU6hZBxrM35nEoSUp z6hBpa2T>}N8cFOlR1|%mzWKY?Re5r*^PF?v_xJOWqs)TeNn^OM{VA{dJvxl;XnI2t z!!}l3Q51kS(8Fk>E^vCQ4~N@xGGM%+mdXWG>^xr1pMw)6fBQ)OxNr)N;8e#y?XZ6- z#Cpv)E}2gl_A@R)@b2XmVri1-94Zw)j!nfs*;g9x)i$Qcgs_N|){Vua>cV3`Fi8F; zAv}F8FSVK2)+sIb8OPFGjh(v4n&^+Hx4HKs`?9pNq=eVStJRz((;=*q*sUdZ-s z-w$Mv++&3@u)ZWhm@oBtmNSO7d`w}?Bbh0N$-iDzdm|~-8`~!LI>^;z-sWh#-Tq_4 z!m4?u1`1>4*`90*z4LJHc40=o;;qNieMscIZ(D~G)^y1|!l4r0$Kkoi*yxu6*AaL` z1d3;tV%~KWJRDrf|IT^`(-JVbwil{?l?~C!HOGiAYlQyNZ2Uv$AHgE7LYDF4+ow@J z210tWI}PVmLWyDP-?12ma{OJ7mx~LN+J+)!tJWcdU$hd(OQ<;_4i5elmBhBz>W2;p z>k7$$e#W=x!ah>QOZihSQjYIqr6^Lt#UIhS`kp+ga9Q(Sb#EM?XPw=SmL@&qk_rkt z;H9TyX55>?tTo7C!9_CRG2mcb7C}$C&PjL#Pi%qq)C0QIO!cHn(xjJJ&u^xfJe=fuuOatb>T`}Ro zfeC#t&~_^(k<)sSt8ts z?q8@^kUS16uldl@sWnOT)qxn}3VZ-_t44qPRlZ0nP`Ck9f~%>&5}ae~1F=7b{-8U4 z-9QSi5DzohY$Nr3@d}>tQF{}qzjOlia(7GIAIb?3c3VaT68e*s4zD-05CWRvg0KIE zBKf}c{VUbCu_u**jeLOEsP0}UmDaO2{aNI}{1G*oB%xjOXQi)1ihx}0M0EG{B0&bh zYvtj6KjpBRN4k=xWZYTd3O@hfs-C?{fdJ6!){p2p$F-F-V6rdpcIkh=-T+p*&s6l! z?rG&E5>6w1?~pS)a|f<`)?y)23kV&f@bRsWmecw-?g+5xZ>Jt9qn=s=x5jG43+#0vwN2SKgh`5x2Qh~2$oL+vl*DVNr?9tT zt;RM5q*k#SMs>>}Z+ri#|~&rHaqFu(6!AM4ouRI#mEqQGQYKJ z@w+sl(9~S?YJaC>w#;jxCoQ0hlf#C9TU6mhW$2r@v+~t3r|KLXK2XGh(RiW(~R#2CkQW;fb_`LwC6M<5IT!XMA8bT+uP!$hilXw+sH#Iktx-y+L?sr@jK?%d+!;qCt2 zCMRXQ=d!dNK?|;{N0RQpr)$CVXF%dw3x{Voq*hEvX8ZXyqhn77uNz|9WQV7GuJ2uy zUY3=IzQT)P26RIu^ULeY6Ed1XgN5q}4evXhuY<<9e2^}tm4R7kcoFST~k??WlgWpE;!{UY}&B=MpR76>OIOm{~ zRAdbJEWWSi1{bG%o?`WMzP0&ew8-D2gV`S*d&o6tCawnriATLjC>>KouK9~lsn6!{Z z+eY+J=0EYudj$uuTI7i&$B*r)qpd5el|I4Ev%MWn)Om^>F^uuI0adc$BHf4DJciFG zs)x;6Hw_t^#|=5EnOAuVba3~+*9f~eO>aS&&qrBUZs%M=krjsdqWd{t^GzLiMj+U$#JwkN1O*Kp=@8JktWWZeB#c zr+*gKGY<%=tZVqd6=JA~w^eVp!>moddeh$udeW0$)G~-90heU$8`j{6b*y{q7t_g} zxnI)U&!HP~7ret6c4^C%6zRm($~uh~Mg4%Y5PI4P>8U7)Uq-&EOwjnMcRvTXMfa?% zAae#q(iKfh_><)p?0eAnWo7X-9gpK2tLGsCd21Zf(TDDOHbjpFMZNqwN{IGH8BZ>) z@<6dZJA%{&a-*rP%ytF6w8@c`;T;mB*0O;pDGQGtv3y+PM;b;n*qf}L)lSa{-$gW> zckt8IUM?S*pRMx>A6DTeo>Pyu;`eli;mk8Dw z8~Cj%F<(UAc|57+uW%cEo&5FaLdqnN{hAJc4}(ZTrEX8x7x7z|h-U}3EG;wViLqrE zx3sB=EPWj1y!2z;H6zLWkA)jtP;V#X=>lrr7f#RV?l9dYq5mPvSJloZIY@mT2RIFG#J(ICiq8f=fotTUnktHJ zSK}m{+p7&MXbhM^2NG1>ZOj_TGLGTqDAmq$S4&0sRqf@iLY!hLx+=-Ko)-q?XXr|! zif&VC`P%%uq|daKtt3lA%6I;H7AejLHc+2Y@KQEGlX-u3E6_s59_f&sE^4 z7O#vffE)W2w>m*IabmswhcyI|=R(iAnqoxx2;<3iO?e2NV z=68zVEU7Xar}4xKA9gm+!5cjO&M(k_n++bBn7T3p{;p5M{SozV^dFdC`>J zMm)dh_ab?`b&ew zjiR@~xHg`PvQx(dsTpN zgJD>l8#A@heYW);QVsb>86E*de1(%AXRB(PQ`_ejaU1+d`IiIB?K#8t|zG})(Ll_c3w11y<&rP3q4KT zF;_BFe7<-6Ej;-w)4an(d$_#gldhIYwsLm$UA_PQkd%-ge6ya?zh>I}Y&NRNfVsLt zOO+@4qncjmsyA9w^s1XPK)Wa>whvtK*Zw$Js>mXHKcC+kK2!9I`)P+uFm9;LgknkYqzAK(IV{A%*&!GnS?L*vKFJ?3^9(f%F6|`xHy`)EVp-7u3MbjJ0;iS&kMLW0#mko!*j49)90Q z?CtFx=;=rpnfs+T1zcR9=pILOqDhC!PFj?ryG|&7mFw4^?~);^Ug7Lt0kUKJAyYcj z%Z;agEbje+dc=%yD4sTjP--=7+goMcn%DY)fw)aHi~q zhp&eDW*0RLXhnLUQet~tmaaKtDIp0aW=xAA`mE zPWyn#rPo}K#SSfAymBEFUoIdX)Z^AbX6Ip9KC$Y#B)iT>oHcE6l7n9O#P zRr4z%-Y}+MB3oBuPUvS7bbmUY!rfb8zGQ;eSW`pQMpw0>?zV=7+JD{;=O#06dp!lp zUsV#a3Y_BBEp@&uf~M33Nydwoyn?5I1-aGPjw$#JZ&tK=mKFQy}UbL4$6f~61!SOSAc=VxsBmr~kh zs3PvWf#jx(fz3?1w0aMuwHZ3kIe6BApQ6QJ!63^#JF_x%9Ie?PYpLNaxF{>8mDSl6 z#rIwPVcay(%;BY^yH{efnVLzg0Y(ae(Jmcc~UFSmWn^F-ts4ry=7qN^E<3FY)^j&H9QBSxJD? z`o*&Or3^aESbRyiU``g=$S9_3)Q>2J6{wkhj1~(kSh-1DAI+5-03mH zGq~9WFE9$?K&@^Q5p0zd#cl~Q?lTdEfmG5tryza?WXYxEk%jyw_0r}>=4~j%&IN5^ z+0ocao!=3Z^0cb2V1TO#{@4r4mK!*P?L||SKW30`Wp%iQaCw14 znpArLu#A01hmC2`w+(%FX+BmXulu4IDi7o%%!8w1idL^h@loJDDHRq5Os=MEw$b&h zV%EE@o}_cvyAN;Onva$|?HkWWcKx`6^mL(~#y8R$k4jHH$eZF0)0#QZv;3K&fHA+8 z!P9^5|4Ap}r)%9J0Ga_eO?4h5G#>oPH* zF865%SQrd!2F5+>f8=PSrF@J_$d=#)W|Y}C(1&jj3SQ9p#ZU)*G&#RIbo0K4fCnTt zLz2J`0qF;b@@J^4~nWz z6mr@ZnShqRWayEBza(4IkXVG%TfIHFXY*q_$_g>bu{V&(dt=Dx0Gt84SCef167=)u zsJiS$0fTqIRLS18gcQD>pG&dp3No8IzHh6v|Nr6y@E-P{2s5n(c&uNeyK+U@?Un<= z%;J8V-eq+FtWbb48O3-o@!xe8gL2Nsu(EL~ru1D|+tc#&v`=9*gz0x;d2G@o=Wmld z){_oD+6Dk`Kn(kH;y>Ku7~?)b2kplKv&=qTHFp4ar!1M>3P6ow18(q7l>nU+;jLW} zQ$vY{2|iMQ&jBb+YYA5;qTk;-|11TJkp%o3p}KQ-8pAGiwN2a$gtE+TE4keARmlKi zWzM~GtY-jn6~+goD!xQZv5x^5D>m3$hR>5=`zp3T&*j^E!Ysi!woB7AKoFkLH_d*ip2& z1%x^~I`I=3nQq9eyUU@_MF0g9O0?$uw!8a1fo&%+wYbv@a4>{`D3T;#!1gXNBar{V zw506Yxy=mEerC^V3Z!Hs)fz;=vXGR3>MY!n_#LBuiqkP~ z=GX&{$F4ZpPF+mYM45vTei=F;)Y8E-((0Y4XdzebS=6&ZzCnMi)=&8}w~rX*yWQ0I zuEW6r)#59V(wgDu(|eEW)gR^b)(hgwA|}O;XjN;Jhx$lWfsWY_Cp{fUUj7Zj$i-}e zT&~vSjIHv&2-~attcTfn0j{NM>PI8tJ~Hm(@vGAVyLH7M&iWm%3QoOlOdv`@Y^N^& zuMwEy)bVPZqdS__Z2bwTS07**vWgxZ{r)3LFD~uMay4)CdZc;iNti6!`K1Twddjl~ zJerInd}oiM<0%SzWC4-hF>4BtNl12bu)i^@chCWQeLHdk#~l~F=(M7Y5yDq4R%-mi znBZKo=ADfBO#^4|C6BLHVDBb>yh!77nTO!(vohO~aF;Kt7zjSKkX6i{w`Pks4+*Kw z4^qj;b39FQ{MIdZ1afAp8pw(mQV)lmd1{(cWt*TOS}QH(VF>6%ips)Pz2Kroodnd!7b!Uh@t|>krrBRX0ndVoGfL zOThm#Q4rZH0mU1JngjtQaz+4`u^s3DY?lQE@=-f?u_cI-tV9$&!h@Vr6<^>B~1KmYR$uK`P>^aq75l1<~gEEi@NffpXn(Tnuf1o7bAS z70H+$8t4Un)27xkh$WMF{>6`GfGF%uo9)qlu+z>)j^_AV#TTI~(Cv8%V+5u@pMl~d z=4r^wr+)pML2H(xi7h_EMc>KPk*Cd<3*}Ybj#rSgMI6I!qO!Z?#M7Uzb!BK?tsi{5 z+WmI}!Ke3c{A|!EQc}N^gzAEGVWy^2J4Qy8wU3kIlZT&*MKmTwEaOe;O3AGk??3ay zeiXp$((SiDmyBv3Hf?2e7&p10hr4z|qZqSd9N56?+t=crr@dRp^^B@fe+k0JDjQ8y zfx~_T+vMe&-{HF&18M^T=GV%LaeoPp3OBZa62g`e2U{jx9J=>~d&Db5vuvN;Ts5E4K^?JbaZ!e#)6sHgtGLVp0iX;0*CK06+_{^mB5p@eRa!Ym5K>2A(s z0)t^$5#E0Z8UTyrBx6qZ`tp0mHH^hy0{M1IPke+DUPa}1*Ny?Nx7i}mC{gI@z+$p# z6#Q*u64t1O~VeHn7 z6QUzEgX^kBfp>_hu!qvbiRh44$eeBOiImT@knfHgnuma+dg;)(HoIpvp+*%Qnw|fI zKH5V{S60^{(u}dP;WA*nW@f+!)t>Au?zs6v*epFCSbTc&Z+ib&@OMdRHSsQ&WCP~l zS#Bxyz$9VZd~xQx#2P(F_He)8-7_;xXnOU2q%Y;&;gw4pJV$L6ISD*MMGP;W&8YY^ zvYLZ2UZnYb(8Ad#j3P1G*5>A6$LvB?UDPBbKQJW~&H^+5P&GA2S3?drAZ!|S{5l>Z(V5iT~)YbW=&8|WdVHx)vXK@(0&ksAj3sJS@&08;Wjyq;UIw>YDvr~2_QBe z(23`G$kGoKID7CU2q)+RH{U;U^LVqwHV8|w@%znz zH@r#*T%2GlDP4sJ`VXz2Ny~SZ$7HRcU8_fLX9xz5sPv7o1>Mqr`{~E_XUc8mBjEdZ zKR?3$yF;e8;*KXm{t}cN68k?MAp&y*d!*Vm#KVLPS=Alf_2yTs6rh z#5a5G2KXJ>u~fRLjhy3&e9o!{Cf9e)zjJMEGQan$LgX~u9I{I^vg3Rob!M)RGHlKG ztNF$H?thBks#C5|&Z|=zdV0z=Ld_LY=BJRDtzW=@UVmWo`X6jEzXYTaD26!4g;j;1bN}8cmTyt0j zZo80?xuH&$5i;sF<`j`c>h!j5v7<=g1icY#eojFd<%9yK+RFAJB zj~wbKa{_kDb%8+niTIh4C$1rirYyW$7Xy2%IllGXjU-q%5ui%NniK{EE+ZIjf*(+} zLQ=of@eS<@7I`-V%M}%=0s<4=8i%c zXZCPPc}^=|OXT|3#Nhw5UF**jv+(v;?Xu7D3gBkOt}?J>lbKsSE?lBnzoNEUMrTh{ zXj58}OxaGCC&)|Vn5+a_g{yn`tia=@+VR#-e?n95Ujlcltgc7?5qvj>K-S?E>R87k z1v0nVq7Q9vH%h|J886=X^2LeMdPhdgmu_pemo`(b@d?#$-*FWy(s^92cA|vxICOic zVf237AC~^54*iW=R~0od@!%J-Xl>&evEi!rx2y_>#$k(%vhs88VMcUQi9XOs=KY_3RZ%D0*yTEh{7y1WUxBnpV?4m(dGUnXv+p>?I$@}f0g8tL|vNf@0EM_ z{<1WTUslSrxiPTb{7YbO8U-h5f|!&o>z;H)}tpM-gh{(eS7Up z23%i+?=c=*-CC=cs(*`I1?)3n0=Ke+Hm713IMg{-KC!tK`qM zEP7cH-Oz=2NXDIe{qVjtyD!3=@%X`8yL@0o-3Ls*AEZtgaP3TFWBBw&!Htt&DfIz? z=2PUEp(yBr9S9i7q)7lN%aK`{|mTXFoYQ15_GyKRRioe_%V)*V%ZOeZvaJP=#xO>c@eq`9=>bi88(k}*44(s zwxM=5W|@9~&l|6$uJGkk7#K+n|)}xttYgA50%= zC=6|fE#Mq@kFuTM*81B*Ht_TiicGha@t?#zuk+u3`b6{kr)PoWZx?|GIcz?jg3{pf zivl;;rn(&n0~K?+!)mMYuZk<0hrG#3zkbUhf88tQICHUeG#T_b=rxiuQm@Zd!L_0h zO|OMoC3mPwuY|x}`c4(@^L46*=IrG&O6d%|jj30|i>pvDv$T($L z7BG{N|0&9Q9W)d1a?W@Ku|Wuu?GaEq{C(xFtcX|4;%+G5#WmV2rpJati! zbF^pG797EWtwkK(Zrb1|0xej#aB7$GCS=Gyd)ZRR34c2JDYSqpoZ zdxZxB6(BcUFn-FD@$wh8u2a?m>iw;MR4cMWR+r;My}|drV{#v%XX!QLRSw(L)bhsV zmx8N&fp?R6=)~>!#1keuv+#H|*#M1MgR10RI3uT))+sZs!%XMnVfWr+cEP8?!Hz*Z zE^+(79RBh6PL+hFy?A5?F4+nim#H=(0lpMYvB>r0Q}|+B&_+toEBf-=&$uh5lmj2^ z@x)#1`+20W=X&bWv|Sw|(qRb+rM2Zw3Y5@{WlB7M_sG)nlU#SNOBXO-n!;@#m`F)_d32$bT= z6=VP#vP^l2g=nk_wYSAXMnntAaj`MNglU8bnVYQz=eDep5(wVet^gMa>iZ z=$j2u@DQ2ZcQU`hlR-%-FC~5lJ!?|iz*GwfIaRaa3a&X{`OD{TNRl}74yiwW?0x>_ zh2654pDRfFUKH=~gs!TGs5@&);1?L9K1pR&2uc8hggn~ic$vY^^7~%F(;vsNVr@UC z(sY(}qcTmbwh$h$nN)B}a?{dfKC2dA-5y_cm20?H&oT`iM$qbHh;Bb<3b_#uxltRO zlPvH_?=e__2t1hk&%}6PNDQwa`YLYKUH^U2O3?|OmuOJ9AIPPbsoxg=3U^I!Q1nFG z0eWxL9A|5<3bkAr-l5|S$RGaQmajy-;g%wIY9$mu7nRX;B~mdPpm8Jd7@*$lzjgQW)ZV;O|k2(*)>K^*2mcTYO`g=R_H{4;hL}ox4tK(FaZi{ zcURcANh)f&<}t1{8)i}Z@Ykb3(qf>av((J4=ZtMwm1PBDqo&Xy%?epnM82jPs*eeJ z`m~aSq)}d%INa`?ZxG1K+siMo@6pNZgoac&G=AWhkjTDPs|}^YRrUs6tRnUQL*}Hw z7YnZV5_O@8=nWZ=GduoEumM~vi}e}!#2 z<22)TC>oH_*{F=5kHR?uIF3b#)74R>MeQu&3L)~j(%@4RcPelz?Kr+^0y04z$ zZFXd;YHAb>?YPO>?0A2xJM2Q&qc({OdNehcqc~Et5Y^y;`9RI*jCetCb^!?=_zhy> zi|q5P(=Y6b*2je8{7brnT_8*rzbBos0)se|Lh#+=5h&56$MS)W~@v*X7m z^8hLYS*;HN0wd&lb2Ce3;)XAN>6&?N&C~q&GG!3^QdrG$b!z6|Q2KBwAOf$t8pS8s z?RJ!|sJU8Mf64QgV7kXaXAZHDR6pg&t1t63Q><51Qd&-||2)uqk0NkKWJ;8FeCg$D z^Z2C*%J6sMT`%lNQPTlS4WRNWU~4s16;6U1rG1@cP7(acXM30^=JWcZZl&M=Qh@cw z4GVdi6v|TED>?~Kvfcvn$?6LyGyB$(7=F4ZbBMYv{$YL$ZzM_`@f?G)2LOP3Nz#kJ;cObLl zo(n9J8GQWv9gdBV1ELzw9qOQCzc-D(Aj(sVBCGZq+;{9fcnR;(yZy6etH9QTE}bDG z0|Sbr`LxV0#~f{PpR3*J$WwNSHix~v>59tQCRi-CyU?Dh7zb_0I1FM96W~O6ga(yE z9ADAYyshXIbZA!<-CX|}PY()TO#TT**ilYsV*PQk^?gG7bgdq?mr^>Y2pK!!^fw-` zP8ySO{_ZiZuivCwXaHuy=5PTy-e%;xP8CyeY`?zs09FJcL<%R?y&Q+mT6zemYN8Z~ zp(H!4Rz*<$qVe|=|49W8HqZr!YZY4YtYBj}eHwMKo&7Al7^!Om5qz*s^;|3EI497- zLWTlUVw&`LKilJ_4itW1$3x^Ar@;G{V7Wu7vAc&8FCH~P3T69aR1VZOwp7lgcC7yr z?D1;a-Dulfo(jdOZa&4BR-+?(qHr%4q859UuCTNuX9Efy#P;Ix8a?}^XVn^V5|JP3 z?$>-RA(V4?N)OZjFi?in>tw6A=EM+{{|k+RUlcDTOVK4E>=;Gb_!&}kjCovTJ@UR2 zchRlsBVTXL92`|^P6iHS(pTblAZY?;EO zPBh20Q$lgTz`)^c8BtA1^1ef!4NSUUIK$&0A*La832^qj-&Wn{Ly>+dw!p}T5wGCj zcA?dqd1~5EHYEQbmTH&I%j(2+aN@w>t_c%P&Bn(V>yreW-qte~^&c~CE@(8P6bNgr zA3<6>iy3osbfSqzLF%6OJ}Q!TkCiYpv;+lGJA_uP?+rv67WvF0*~62-JgumhXY--< zy_)6=-b4#-+eu@V1@wa}CB#0}t`-V3_DvH;)t=r5{jL<136?9lp_J88ycXJwB2b5{ zKo0lNw6gMr9z}1;9h&UY2l=C1!Ez^`wy1oyTfaHu!j>oHwuze*_`w4efg6Ui8WyTm z8jtIsjWBFLbsi@WN<$WX(2g!i5j^_SJm~es(Ft)OSDBL7QL?=U55wH#*Hxuj;+#wn z;;XW*q94aJl!JKbroQ(y4}a>}n@4?IXRF9C#~AEL;pI)-nipOJ3IeTAmJxSHI>(H- zhPVZxV!=IqVR@_HF2hG;v}f_G;M_^WNS&ENO+7q=1*UC&BNqLj5qO`3k*Y_1SzPH> z#pt^rinOmFY&=$@Lfa##ef4fPC7MPzn+akqyv zj&^a?!IfK|)=p!@(&f=tmSJQAM-W}4;K9*h+#{hCrtbb^MICWAZan(Z1YPjLP?hL? zI!rt$cE0MDu8H~gpI&zFKjcAnsfSxYk9nvAV=Jy|%|y-JSd(BcC36^@8`H?%P<>kH zl?$gErxd%&0|v>X;eQFv{h?P|`OcE|A=n=v-)zZ#r3(yD95B|3@Wo3+ZU1UyYW_=* zDxfsY4`&dWwh77M2T-@Z;)Haz074s3$N*O9mtlNd$^eK8R~jB+3TUYTeS#&)t@8+r zePt>Die>^dXz;W9Hd#`1oaSW>*Y^nL2i^*BwSu87p9=E8&tnu`pG>Z5gYwt?!xofrQGsLu@V?%%)N3Mdoc(cwz< z0R5clZJOjypraVZM`@9N>uQnwcN)Jd;1>ndbY$$lR<~C9sBeGI6%n`{{AcXpr&43; zlU)`2@;H9{&j-Rcl(<^sZlg)+kc617L7wx=H>D1OIVD$*3!%rNGi;7bf~scBTU>Xz zYV_9*5F7kw2%ayUvfO0la_oixy3`Oeu_ zA^2qpouMqb2HMl^QYlAuDZ&H3NiVWLlKq?mH$?sH#=r0M?TJB-s1D}6( zpXOHOe8tU`T{Tw_OeNMlFr1x2?qt{+WIzW-a(v|qQ*db0{F!76O8t8eK|Au@da z=6h=O-Fhdx9@pjm^dBA(AOupRs@Cco1Ols{pbPr(N8WpMA!e}7C#|C&P=iX{$+`i1O*Sj0TMCCF4P3jgZHtHrqEZ*X=;fdtfk0s?F+`Xcq*I$!7LvKw=1w;aFhvpx^=8*CX$AzzDCvjw!5J<%c8 zrfg7$jG?~-`4FH4Y-tje$qkTCr0BI|r{~vu-Fx~h7cMoG^#U_mic@Q)eL>F#KfXWV z!6^z@cQqgtap_GEd6f8huX_Wx%Kslr+}zlDvsfGbaFN>&QmJ7lt3!5-gjl7WKkDdw zDcKFadXM}_y2g`&Z~D&|!(mh+CyQbZ-VoeYg$5dQ6#$}NznLTM(^hwH(cpL5s#&p` zVry7FPq7okon&k~t?)z9Z(zcV-f~&HPJw4Xt`dcAk8JYvDV#Gk9>Y%RLdCNdPqloe zgw@#fW{#$&6T669>H`$tCo}Z>Q|z0`1_5n>nwU)G{m#PqEWb`dU2<>%m9Lu55gZVBu1G*$gk`NU)SSR_FS$4>)j(18gZ=AFgrzXYE2fQ zYH8qieH4bu>sE&B&>NLLLta0&*k=d{>pghYC)|fu*9-d^ISa3t)~GGanOkCie~??9 zJ#dN5q1NaEGGIjQ7|zB122Y;cr9D^&j7{A_SGTi^$+sDDAS@`lnfSYO0byZ^W?W5} z==tb@!Eo_|Y6{o3vw#G`smc%cX+!HR7rJp7Jtk{7)t7W*m z@^w`+tPx1%g!_3hIBB$cf(n-HIPpW4;_GP(9p_I&%rjuJ9|gT$GbJNWyc~in?@pVc zX{^tvJT%Qa3iL21i=RFpme=i6y4(779_CAYv%PQ{qCZxF!eEfb5Dx)v84Qn9hPDeY z=dF;^xd(nUwcMIrzZ?S0JVONsb*ASXWWxwOm@AXe9yF z+b1*K-nr*)$04Dsb{q>l14W7pN$FtrJ*iUECR*2~9aNXosNS&ZpKGBb_7SJ-&L5Zl zA98HeaTs)G`^910@8Hn{(J}lRhLEyegz&vC16b%;{c56#kz}JMMfMW9n$Epq-VDCr ztzJUs_-4EX6j`mZ)3Z?Ffop6%He{9aHyXNSEuT>D>Z;Jb!SV z;a=?4pQ4AjLtDHhxEJFM+q7d=6M{4#PJ8_EFkFML(G+*s11i5AF5 zcNExx&kM>Uj`i&vI0pee#c9`pN#Ug9V`guD(dXQOi1YM@nTCDEyv1t~x~w@_^RDM; zz5z`$D29S0_S?&YLtKLsyuD;%ph`gsN~(zfXV+&K=dJp^4;fKIdTk4TJ-D9P_s?;n z5HURiH1ZM;`pdh_J2G`KXWq(QyS2cVg^%<7Os+7>lVu$rJAcyqfCdIHklwV|e-w{CMdE78Ub(={MG zS##@_E}uJ9&(kdHfYUOaV&4gylXeXE6|`UPKUhfN<6-;UK#^hr>CkrgK1d`6f@CBKba}aQaz-tTGb;SECFwaqYWAdXP_*>ss~wKLwvZ|FM=> zFxaok6B4S%A<`B?^-o;u;k26apCr#cKO#?jsxUUxT^dX_62P*QRj#kDMI<}JFUL(@ zFiC^pXYeIv$K%8gpWhu#r(7}UscEXHn)j$8ij?8mw6YEL5C?M@=))@rRCRe$%Rf%K zIdeqs2zZ#w1tv2%BU(@{oN>5PpuIS|u@)Zs9HyC5-rDMzz7^nv|>a!6SG`)^3y;*7WqD2&*T@dlm`6V2Y|zg=RQH_tRJ~eOV`ZqACnN!+%KdPqCujeuN<1`K! z1G+9qB;#UEB%C7E>=KNofy%oFTG)vrV$1y;u{t_Kk3{z)iY0%d2N~LR;y&a0nppU< zqL4nF?h!BV6<=&N)yX_g{_~aPkRI2@(f(YvFAC8o0>eQ%Y#JCn+AR1R-iWJfq~)O> zcQJXtpBNmXA0k2~LWA5j=sJ&#d>>SBKuT59d_*1yHNet#_MY^{f2jz*q};Jspn$pM z;XsLKUd!4VPA1Ox`zabpq3@Vm{6HAc&>dv2Y8)`rxnR9t#RI<_tgHj?X4edP+EfTo zgrpJ;wmkbsN&*4@RHI#%#sDqk0Dn~p)<}cRo1N!rI-t`4KnY;c{BZ8xeg=s5%=Mm>Q2hIuj#w@(d-u8^TN5pa74Apr6;a7w03auR%3*K@9tz z6lGgJyWQ&}ILVz_yM;>tc@EjsRMD=Mh}S_w^jRg12P>Yq6!OOtd2!P4zVy0dLo}4# zo6fc5?Z42ISwS&i0bWm^lNe?CVrKoUQO8|JDkzwkJt&yokA5g__eh1PaADQJ3fG{K zxxlE=r0Xsa?+R({@rSsx zU}}$1Nl)i_;QKqc)U$Z)a}DD*c|aI|i>(l$KRM7EiczOv_>RGQMKn56o zuRy^6N!*=AZ~t}(q1fUTFn67b>xiX*!*fWexlw`Vlbkp~BtWX9{o;|Jzpn zs$>N?7Z55F$bx*`nrl{;jqi)N$yM=VQ*2t8ta`>5VdMO`_bTuY4Aw6t(?1-UW`=;{3nobK z7`u5?lPKv)o{92kYwGTZA`1JnXA- z{>CFHkN45qYa6oM(bZuy+Mr^%nPK+Hw29zbOF2hjpMwjfGK7ROfNnlu7kWti{?=-A z+;Jt~F1TH)d(8(J)>w!Xe9LbA%7sPG-FwQpH5qgJnB8ajQi~Fx00+!$jR1qGnRE8sgHG^kJg0(r)qlE)h5 zhqt(_aiXmi!l6bY3W$W{oWgoSrbPEY3?U7^OdZxC6_JZMm$C@{7dj)%P?q7J+@BKs z-AUsXGWR2Q5FM%!W!tN$i;4B?;n9R0mriP|5Df*GhC+%xO|xx9h5d)e*OK7&7`MsY z(zMsT2o?4dHLeF|A)!l&x3i+)YQQh;!zL+L~zCvpUn29qdfSY`bLN85+D3W0iQI{AccE;(-c-cAn1mefb)`J=vIN z%oVol?|&WoGA&tmW_1g3+4yNlW^lKsrd#HzD|;Gh8fAzAv&N=1V37{C#lJ>RYc zW9I1(uBbHq?@JgVje=p{N+FDL8e0?531#KX`5(fxrp!QTvw4mGW9huZ+3?=?Zw9s1 ztQD&^wQI*-Rk1gE~VTa7AWZ;e%3?Ukancg+|zI#63FwY`6*pYQLw@=x*yB01+g z=Xvh?e%+8yTeKsq#i^0#k%_z1dm=_!-0sD#kF#rE>l9PPN2phKa&fLM<>MU)Y9vBK9w+0N7GM_B=olc})N*Jsn0wusYNJ=pab4#bvPt zA}3gkroRdskI$9@@g(kOM2zZrLVu(UFF+)6LlGK>$E+&75z+6~C}2c|?BoZuyZrkD z7oFU;zeKg95zpc=1045PooTfMYth44*B}IVVhKPSa0=%DH&wP8ZWly!f*jl+^@@j( z*#*qQKu2cc51g(J1|lDWD@eRi%|IIOg9BLcZfF=a(BB`Jg>O&-^}7$~M0qgl{No3X zgVaf^C@zYOFfSm~1pb-19o ztpXkKs6mNgk;^G^zx=JHz{i@Mc$9-u$cnLV)8==4HK5je_+o?-@R(0 z@Nuw+0LQzDx z<81pd^wM1;7FwpOlyLViT&yb{;*}r82+S5;A9N1>5hvY;DOKl)!cU~2@w4or_55Vw4{ zfk}Z~AAVgypOt}?EEtdDN2RNmI5RAiTzidh+d@M(BZUQirUfj%S^ALMSX@z?sTJGz zx%)LQ`C#N!vfGXUpQ;?C;+$o(?mh;Y#y zF5ym?H=FaG{-S%Ox0L++D6Gu;h{lqAO$(PV0Dsv^K){+x(s3`5>#H+et|ha#zrDC2 ziQe*&(QCkDmm>K2%ZQypZC>Hg2@(-{LV(B0!qHVqLE_$3X4~%^-7A5pq970gz!b3W z_(2INnZjns;#@|<2=pa>?9C%LD}LD>3u?XTcji+Cn@Z-~eN`inf;t+$%zIBy3g>`} zj@)Pen(_HuQ)_{qnvU%;s#Ze zw|-C1BQfF?2UteW>&GL75{EtaUnWH2@?vSlPBO%261R*plJA=rNb|z)EWA%%k{x>gl_JSgI(=Ox z>N(EiF+(PCnpetPa6P~AE1`4h>bOL7gvd@JZ7xhnx4q$19?zhl05aPjsnvL)L1A+} z{4ZL6T@usZ9L}&24v=y3Z-?mvT(FQH3xHbwNQMl@@IHz&k;l2|h6zn1X2eJi(3<-g@U%gp=9k1|WZR;B>_W ze7k>0I%-CBLJiC#2f$o{{v3Telcn1X>N1=F=snd`F`!W1uOm%6U(EU5TI*nF*)(5kT%urVksZiWHbeTwH^qkVR4+Lyos7aSNmI8Zh&ILGeKQ|DtOHJSTdLCyd)P6%ICJFpKc|KE?mJ33uB^d&)!MtYlkjX&N=7x$O zHWJc85jskQ*gQu7iMhIpV|K|HNP-J1-J3228;9DP)5q_VM(D7{UT^D@OXzUIe_?nV>IwD<8cD4cPq?<*~y2k z7gnNl49k)2x%sauu7(3t*`eQ)u!RKd@5VAa_jTzmERY(`#a{MsDejy@*CB#$A!Jigt8q)Y6jU8` z_IN-6Tkr==7xajrz8HUyl2eS)cmnoV5RfdNj)e&kUWteYI9t`v02UX(l{FK7-3#bn zgn5sU?(HDp-OCW`@Zc3tpZfeUiwN~A4L|$G1~~agu{A;RH((Q(9{dksi+C0`4ZA_# zR#4XeLx@5=z_R?PP8jNMKp61*AMq8(QvsTQ1!1^5A@WjS#SyUbGUma~hcoeZA|zJX z2|6HJkr+O~!;e$>x~sDEQXJ0Gak(GNk*6o$?c#ES4vLPhfiaGQSD>do4a?MfWoc76 z^1E||pa)VfJJ=?E@Ne@S8Aa0IQ0)rQH6ojZg@{+$pf(R%^tAnTuPrf@JbEK3vaz$f zy=VX;zLdbDEnllQa%wPA@mn~+$?B$-mfjeKhb8C|z#o1)fWCddA7dNVneb>3D%p_^ z**ZrseQ*J`RcoV_VUfEkB2ePsPAvThzh2wLp87}ST)H8X!r6xko+3Rb)?IPO{vhya zeKLV$8L&Uie_RdIU8G`XV8~PmN72Yu2z6lpje}G7bjmeiZNb`PSB7cO$56>pfXF*X z@Ib&NJRk!L`N6cbQWQwpxxgv$l=HXaT9lG$o%Wa#>D^ziGkp&CnK>7p+>_3r$h7%y z>q^|FcKf$+d}_%OGm*}KqbdV8Nrcz4y-YGtoO`v_2pFqI50hCr9&N%OTOpcXopoxy zjZ}CmPQrfsa&_h7!iV^svX8{Xa=^Ay$8r+Iw37FA`&+q#{UVW9K-K7!oB1!On@8pT^e&BlJ8C<~db zalm0~lY$xGHt-#eNpl{5anG#JK~3>yVEM<#%vLWI*CjQrv!DfzS~Z;j%jnm zajCwFhRfI4kYsMy|B2D{WamtsaYI$}6K}^`W{19a!QJ%l{JB?)I}@1@Wj6E<46Dl0 z=|6)6`IZ-V%<_HIoL_ddzgKJ6PVj06roRE*0rU$%n&7l_gzn;| zG8@h5QM`Vu#e;8OLg?8-Je?>oTu0ubIZKq2!2%r~2Djg?3c|eR_$QB-!zp};lL3qV zYDx_K2747YjDvfZj#q@a5Ay+pm|HGdaIk9gM@PD%K} zEPVgyUp2DykxMuVN9WWVHW1+t=gM>g#g8Q3ayUvDLt{)Bqo)BAtRNaF9u8;}VOgw# z0>=lt1uzYJdLul08Y2LZ_MY`(M6~-kLS5bu0v9I2M_PsDf*7;qe_bxnpn?nh26e-& z0aK`+?7)%0)3RmxL>$D_oPm$hpM)3CE|MtJ=^xA8q3c!LVc%DjHz~;<&DReU>~hR- zdqg{@81vxR1DKu$RC|!m_b=-r<++|Wt8v}Kl8P4)4F0X~%r(4-g|F=9xdOvHDV&up zy>?uk`teh}8@NSGK{2yVm&_Ew$v9IpX0)#O()Yl z&XRa|g5Un_v7Gezvx{20EGEJS{5G5W$X&nK;x4~=eo7FSu?vD%I>i;q9(1vka7NOw zx~pW5n>P46eQsE5NwN}p@kymn5wsoKQ8jL}zVajGWtOtaV(FI5JD1$?b#x@rKRZy% zTkfHRrl>^pfhw9`xz?56Zpute!7x)m$mM~4czj-sr{h2ue}|o!@ZkQiln3dwfBW9U z$Sm#cTK(Bv9VO+#6PE|F^rFq*J}njs zbZQo@*pw7Uzt1&x4DctT4hR`P>gYt6pcA!cuTrcTNgB3gIgq^e@$c_>aBFagzNSYt z(GxUDC$VZL6PaEkbgC?w_f)$wbk0SpgRD)gG8YP(4T)OJ=^I*av%A`tP3(s74i$`z zT6CW56=o)@Y%|_BfA9M?yM1O#KYd18f~MJY9kLfn6ji!V7kzeA!cVVLDpqdToD@}D zXcWowro9#`Wnd(h=?3Q=sZy<7T-)t@BJO8Aoysm+w*d7R@7=+g9ZQ+%u0}>&7BCvC zd9p}4utd9a+B1?|mWZcmNEO1ghposTPbtdDU%U2K;L{4G0!+xR;a~x%t$xpXWrL4AJ-x0h-GD2 z5W4;7UkiQmT;1=VNC-0b8EoFn zuVbf}nws0;X?NkO+^nt2&Ss0mcp<|1t(U)ReQLP8EOx}JY>DeZL#Gs)F`)(BMbMlb zoNf7+U-d|8CifvqVPQh4v|?8@#2weYd0v-NPxZE+eSH6JKG8Umpvp0c){ff|k&OYf zh>Kr`I6D3~eB*JJr|XxcTjjEImS)^s_hHU}Fki?;liTHug45>}6JXnBTx{f6+?G!> z*6i#niR_MoH=mxyNZ^z!dp9KOC)^iF3o>R;vv)?m zc76E21!AEBf^e>QV+gB>!b(<{O{dNIc9Uv+<7dv4=dOyXrR<*IGf^bP6sP(ptf%B0 zT%h>Y{XLpO%I?&=#GK7sc=n`((3XWXbOR-m0ggw(bgP*jylYIR`f75?RhhX}1l(0n zP6Cz+JZvmazWwW^Y2*ukgf^W6C>!K_2(gzGY=tNC_IN-G64~&8#Z{hWD$;oX#WRx) z*Esx}P7+|jHlb=&nY`SwE9KI$rZO>Q{s)f5zYOb@H?GAtcV2ZRz%l!NYmYG$XgO-R z%}&vjw})(C-s7b}riXY1;zTX|F20YSH4_O;wi?V5KjJ`dn*cA81NtWvAHadf#-kDz zw#|w=lkeid(3f(j`e4JNX8oLRo9GRtbxO#kJzK-MiXji3jht=*x z-mFyKRdUJpsS9D#_|aU^bakFKrUj+_qv#c zSJ|QC5A|P;m*pHq%`U^?G2g#2@CWRf^}hAuFAn`fvR@wSLmZk}_O_%E*`d)yI-O9{ z%XKs=*<}D3YSu*HTUYPV;E*HQ+%j;2Wd;sG?IFyLlAFO@ zT{7Zx?h>*tdf%OdtUUg~0P8CG?BSkg_|>^Ejg6ITM)aEEE|>B9u_s?O`;Yw!-xj%) zST`+EL(FwLJJ-?=M2SCOUv*sBKhK4uc(DJ$Zm}egvK65J0_FFjz~;g5?!YFkitq%0 zAgAUihTA+i0H?Kp99CiWZNl6mLrm1gDOBRRf*LKXK&SXdRTufT0ZR{m<98JWQR3Js z6rlz1m1%&<7!mWN@2WIjY^ezr4}+{M};_6KnKBdFH^7Bp-z`~dt~k_BPNS+F`_ zE&XeWoWrp{V|&5MV$Yzy_(m(?`*(AAkCAws5_`XCI1 z;FSd#_BiM&$?+mUW{N`ccZ3l1=l3a_3BG=-(%|m-FEmfGib~#OiNfQuX7(uZ0yFw+ z@G(JR$^oqJ0d8AA7wv0o^IfE6!EO3IgPO1j58tLI;daG5;l-=^qaG#~Dw3@BN=Rlw7 zwNj#`qZ*9meuVxi17g%WT=%s4WRB zu?v#239#WBIG1Ted4@hFYqE*AtJj+FYdXpHjV~3Qn{g(-4_wf1>_QS{l{s}qk_~?a zi}ZBzHTmzKTSaz;&A-bWtaAy0?T{Kf7tbm@JtJn6ljilCLJl@b zToef2X`qKxwf;Os?^o(C->E3Xj)uX3jj~1i&WmT!zDw(*uu1;ua#w=ge;5PpVgFqG zAigBE*`wzFhf^-vw_g33WvaM|7PZ+`E!_^Xv|Z?IJDK3MHq3mSzd8)jvikMOvNkc_ z^z~xFG5=w#@wlbTt6D$QCTVr2#J}lDY)Lt?DyV%-Wq{Aq{@c$8YnGo;(!cxO4DKH@ z8*iH|7*2~ni2@y0r-J1zbLtj-1O_#uhhKR{Vnw{A&Y-~^v@DC4o zMIR_dS|6$`3)vk+o?08uK1F?|OpVqzgv+X1h#E}W4m?UYMyzNq^fAzSZ28rXcnAHu z)NWZrX-{6&R$tMpI!8!2tEmrhs3;`s=f%gh$~<>mO``3g%4>6ace;79gib1y5{Wf9 zZH+-r+n=S(8_YZJ5Gi^?cThGxE|3Y+i#5M!!_+lIss0LFm5mPWgQ)Dfx7Km@*+`K-adDE zc~HE%RBOz}_|akg-P|flE^<4#G|}QR#8eS0A{xGSkU}Pm? zX<%t!_3H}}RKv5jYAJcKvspu4KN|B>be#*eW8Ji2>hzPJqnmW?sJ5ct16?F#I#Y%5 ze&$AU$~~MIJAx*s&vuCYW~K%e=$eR%Ul330VM@zQWSfqvISz4qH=7zOpS^swo?cyM zJ1b{Ix!l7@bBAapT0-rfu!usRu15dzT`Go!bW#52P(c?M2)zo^!KS z#Mepbi92?SI5{!Av=Rj0jJ2BWn~k{${{?>Roe$+e89R6{L*7iz(5w&Gag@!NRZm;$ zq_~?0)91HR6BMU2X|)Zd6OxGb51uzGKQTX`U(H#^)kuEvtxM$6ILM@O=7U_~v{Z|V z>OkDgmm$%#k&EKZB&#GDjXC6%1^XsF$C$L$O9b!UUruv!Y-{Il`$Qf_d88vp* z%NlX6W6uU*nt(nkUFqIejW-F~J%%<5hpA^;Mh^>iie}9~Q2yBCDbJ>~8!M`!-xTJvK6kPq_wLqv(H>WDy&6A8eIU}5 zu6k?D@7l8oq8gPK2zFcDY`)I5!1G3CTeW`7xQW*)@w-wQS1Mtup4#5dn z-(H9Trj09!mucnS7Rt*&JMU{mQz;p|bbS_ADI?5Hg=aPmu+;Sf7`p3Y1tAd0^I5)g4KIU|y8d7)QlbjvVYoKB z!UfD;CJS;00sJO)IY;R(`8O=gjz31(`qTMAsDqA)L5T|VC(!{n9f?qy$n&8O-x?P_ z^@+Yv;|R1ge7G2xOaJ_BsF(G?^VYJ%GoyBPma%rV08FY8M-~zKX!Yoqh+<+bRX?L; zqgYe#YZ|kitvuIfxgI3_Mv2q0Z?%}1UeBU@j%Z>sugqCl$OS%owQXCH*(7dq<23%J z?;L~th?Kon81sr4O5!5mV{P}OvyMCd7D-W_q<5fd)F4Dtgk#UIOZ$!EIaOakupI3T z-1W4DRtq|+oBo-E{W!?FhuQX*GG&CN$Piw{hJtSCW~V9g)9`$FUb&-rA+Sr`yRwr@FG5p-Ax%#e;vqPUvZ`;U8v* zh1l9MdQezwb}#YceJYufPd|Ar9W@3PoI_KqY*~oeNHeg#a~X$@JxMz4^DPJC(LBV$ z5_)q)ug8y{3th;aX?Q>!M{b~8S@}M_8!auX1Wbq`@n+> zd-)pkydKt51xV7$bRC!hXpml$t4{b)IikmqLe^>&>uXOCM$9RBy2tk|6&4;}vP`za zO32bYf%w~y8X!0#dzAJ!tP(SzIs==ipzcdNg-sd{gu>4zx`~T;n0=f0@0H=(L%5JX zAeB3A!u~yAL1g&<7^Vpb(4Udm1Ns)Ed3P0d2IkcysM`Lq%<~$NGIErdg#U9}0H`UL zUt@byVmhrv(NEcX|K5Um?E^j~Mu;=bOHyH6zHKZ{@bzE8;iA<%B@S@F4Cs!ih4obb zfc0`w_Qb%p$r^;gP!MzE5D7X_HBp+1pvu;KT^LQAIfvWzt_2$(94)}Y@?iZQq;(ub zU%EFiLw+h0jK)ZiST|skN?`<&iJ=|$kpf`g$Do0rc?rjjgrIUTUzi_&!3!vD z!#hx1(pE82S{2)AWwPez(Ev^lMk7vLTJKb>F|JqNSiRh8?e+yn&8N@gGNyyx&G^4* zEzW)BL9ee%{rB-ip_v_!%{H7xq?!_jrRnIpoImYo?3Bk#orh(1@I;8*zh zJz%L-{>Q32#YI!u8lpGnVrb;6I`1iY77yH# z?MA%tvT{11bOeybGm_b3H;BCd$sME=8w2ezb* z0(W2g9#Mf~ZvC&_Dw5p>52DAVZ>pR?tYe^2AIGkI`tk3bb>p7>73N=t8tl?xfKYoD z^3d+vzZ7r~d#!#6+i^`4naxr+6w{MQ%`B{Cu)M&Zv}N13adiC4=N8^!r!pD225#L! zgj&-(JOrbeok`Cs%JU^l5Cm}=U3~kKQKvKp-6odgH^pa9vkb4Crsl3h)DuJkEvD0E zD6?&v-#q*BRA(WHXhp!!yxd8CMsVZ%^m4Frcj0!HIdUf5Ct(Da_|<1Vy*6J%p~KKE zTV@x(n#I*)re@dfthp|E%Oc-RoMn)Ps(x&sH%9`&9r^)+4<^5Yy!Zwulky$XQKEOo zJ)EJjr9~r@o%D*I?CBe5UgE#|CGGXM^Iz=Wcy<1OX3R87B_O0iZtEsfC#l8lZeKn{ zFDyO9{h_tkt8(80)tpOZ-$dCb$?Os3Je5nU*W~KQQLk`tyYUxttanTn_MS$R%*j%n zu+P8r`>XhVE=LrSn5Lf2FV1)JQFXn@DecvJzKeiv=>~(W2wBqM7sO}tw85QDx5^tY z0vPZ6_MB*LD`}#4_;t{9z7Cf5#5$4%0vS1RwAnfJk5}`8z3n$%yz-h2t=~P;WaeHK zD)VJDH{K=|Dy#f!C`jHvgDGn39OSnM(g3`$Go>ae9e%ixgDm|Q?3EI$=9bJrG;MC z^o#e!2wboG{6f_UPKS+NmO4birKC$J{3AWM^@Wo45z2gmr|Q<4UyGB+i5Ko|ZQttN zq~vrmEja!VEYJD9`yU2gqF=e1^jYXr=Lr`5V&B(de(XcqrrKN+MAO~4bO}xIBIiv_ zQX7Z2kGIb^52n^fjdd%?njwH96|UUu%bL!0Gsk*z(2f;zn?&XS=>n~q3-P* zHQNwRk*$o!Wrcv+dC-*ETZ<907G~amCw|$ZUoAMR=@g{V2EslE zitLFDReTA7jX4QZNdZ)X5%1& zR@rn-g~Ta!p}!gNI3aE!_Qam{#6Vn#zn+1W9?sCwWeDL?&rj&v-qkA&ZRA5W*?~KF zGZhuN-cU=fLX5<>P1H7=d*pqt$fmCvS9mHDF+&vE}ntOOv|L zWg~BEV4YitblZ(lJ$jv^&5T_@X^7!NBt(!@$Y*n9o3_L!Io)2mEf{XdHQtE-)y6`y z9@fv#*T=DkdtHPFu$99DIP+$W|S;<7e8f?7}X=R{~pSHfELL$?l%W=m@DLI1awHSUq zjJXNx%fJpQj_1Ei2bN9h_1#X;+!}vloXTALZ_xJWEIr(QB2Tag?uJkohPt6FD(IaT z99lt#$of?GA?OG_*dS8=Rzt%@?Dq!f97ri~hq1OsBcc)bSnPC60Oz~_ojk>J!R&y9 zCf_4M4!PYL5IsJ5gUh-FGeciLh6=!5ZQyn@$3v|(K{C}Jq%RiE>Aw-NjO8#Eu#kGg z$|7+Oe30f%P%mn81Sm{w(gZ@SioshRH3o%tI|4h&eV877JuDoB3%shG8<-(;cs1cI zkonz#(vZV%kQ*zs!UFOKS{?Iss>hT%`B#<0kV$$8R;amsph+K zsZ6q)+B?OAYTx_)W1h|LN1OR=vTR~li|77k=I4aJ- zU>Ns4zTJ55L(jt%#@7JK!Tv5CR4;PNT_C{m+kY5RRT?Z`?=)*(eJGvW6ZK@)23(Tk zBkdB9M=I9?QlEUOK>mR+n}u=0zR8s0z-Z)M2}rP+PnynT$7p6}wqe`3KCrqcG7@`;SXL1y@ zDQ!3GeQcbYMC55;1t~M~wb)Y-6SkvNexOu^J}@bpZrIM=cM*Mz+&$kz&6jp|_Nq89>p5u?}`yB2`8bn>|_fnXyb)Plh;Mw2?RSk2MbO%DnLy0W3 z7FR5l+>Gi#QEHf(DbJa3sMqlI6PeNVDncjZEf6R>wqGkrgR;w!S$$2DeLB>Ujo zaP{tJN{7eS9g}d;x-7EM5Al+K$zT^3+aGTu8Xgx#V(Qp^S7}g zMxLTikRLdtV}ZEH@|$F1r3qb*9)+b>XQV<}iw|U3!bz|QCo80zQlkx&OoE_R@S0}= z0iO4Ws)5KEQ%QF9R@7=}sxFhOkPBX-bA zaV7GCfk=*dm|27ti9H@_JY3)l8Ws%a_CX2+_e?9$QM+mNM|h4$cpf{zdeud`uvfps zsDQ$`@QADvvK#{L0-h&X7BMSl{Q?@0Erh?oTDQQLY`Twk+MlYl`T1MJ2iUfCxwiYZplO(_ zYm0OLA3|J1Dp<#?A+{W!FoeG^6lb!3v72PETWV;55}aLa#-bCHdTxR$KaERm+-ZMS zB|RJZ=$`_FjOz!!t9dee?>~&P)UL8QOBLW&KM>~En)bsu)|L??6|;#YR8=K+Uiz9? zo9rFX=J_QJKhznBa)NL{F0R_hk?H%H<&WMv+D6!no{3dXFL@#gR=htiEymI`=LOr| zn63hxXRr0BX;qLX{?=>=Rfgd!rOe$5C-N`_h9~>$xTq$l%)RqX0`#r-0&ncyZ4dKe2-x)ls<=?Z`7WY-~DxI0qHUw$%kowre;Z)^JTK^8khgW zcq84geD$dB1LNnP%Lg@Kt4SR@xAGfz8kY;|2F8K1=liXV+UkEHV09^@R&7x%1csZX z<_ty2!9s(RauZ;jlP8m~DRHu1v2(7EZOGN4$B135`d%tE)2zJE_W2;%9Y@(b^zX!h z{VGb5G__~+#r3jicfC>A3+q+pU(U8MUj$DqGop2pq(xBlT?}M_S?W?C$roShpIvog zqfp`Um-?IwDaW#hxU?z$J_>>&tpAtELex+fCL!p6XEz<7wLCpl*E~>uW~`n;^{gee zSKC*N{46@+Q|y7$+T@omH)dmlP(u%Tt)fb73#mspKe-E{eGS8PCCx!hI;j_0&~^1| zLI!$$49mBZYe$T^gvXLzj@152uk#`TKXzpnE4yM(7sA%&t6#BxE z7-gZnaUtO^Q0DdQQv9Z_<+50pj*W%i#mY5-PWOEex%(!{(Uq}DvX^`IUAs6C& zPsYb={q6g;_AA183(I#pogL6}arTAXLVaYlF-W>wr@wQ{qO`X|&6JHC1&a-J^xikd5kiHR4eTpASMO4QN9p<`|mc(=A zbkgkHg;})AEhV{~8mlljy5v+-ff21$IZA6se~0299$LFlDlJSsOD;R`oiSUeHB;5* zeqWum<0x)J?&yw#Vg5X>N#s%MmZM&K;ybe&06XWJy(ze2;8*)FcQU)FB0B55ob6_Y z=}{!vt~rTwA(SFJF=t|fqFF3R6I-)p+k@24yE!(xct}`)m=3)TNxRy^r$^(Hb}ppQ2>?{F76$h9@TM~m3!-U zbw-936Fnvd(zGg=P0V{RbVRZ+h8pNPZNYkFh97)UgpeNtXU;)r71qiyJGt_M^#*KJ z0k*8&R6_VjsFmLDvuedDKORj3lE*&a2;7BfB$n(^5Qq4Cyjw0)S2iTTfs5J&afo^& zZ5TRG>g?q8p4V{hC!fdiW;9Y;6_tODm)cM(lSH;S_{rjy$wbl7aCr;=74gzf12vg8 zi>Ya5p*&l{m4?K~Z%?9j(Cn06(Ag=9iQy_`W98-)5FYt>mu0~RfY}b$WU4Bm_T)#x zV~34|N+tGxB9*0^%w)@E@#KzuGBbt9AA*MQHDeI3aUohv=8M40I67mc`>j3)8#k6I z3o9#&ZAa~4U#)X9o4vgp!^HdmnQmfP>q=`VT7iL0R!(ms_ehnrV~JWfr8xC7D&vse z+g-MTeOXTbvTk7gH>{6SY{0wKX{@~-R+9DT4-MYWE)0FhR9vuRV8BYG5W~_7>YFu& zAcWeZ`e9b3CMI{ao-S;!rS!nYj9M_I!@qk=^yVl13$Je%tpefP48n-jBx6(ujswRZ zOHZ$L6eU>(mljbJXFkOztC>TEqPl7REBq4Pzz-G&hUke9|Jckok5|}O+XHfJh88=P zt7_A==$i=c#p;s^3K+VGe;GJaA$wcmx$x;VZXnyUwllafU)ZY3JA2Kk$%zgXGIR4^ zJoj|F)*Emf7*|X0S)0$qE4kK}rLDnAWj}n3&=jRgP~{!;?={J`!%#0tGek z{TV;ezcDG%m19@V-jDB+{=b4LL-rLLzs&TU@(qdbKnBN4N6=UVMo-Hi$mIg`ivvXX z1SvTJA(L>x@^3_XqBm$2l7addB3QiwjHtw`g$5YOg2!E${$4;~gm8caL{Jdmo#{fK zA4Bobuu=)++mdl>TW%{?b23$30FY{E-oKRq?y=h6#S}z2aCMHe&X4Ns%OTb+7#!ch zoHk1q_`<|SKPe+|H2Z=^F#}fjV5HaTv>kOY%UvXBGJ%KV7CYq6Ch+t312g<4sGA_) z1xbT2Vugv2gV(iJWVoL(ugSnCID^YahW!o=laJkowL$R_YPlQt6eF}AA*HQbFmHq* zqY-s(aIqx>?=d?`6n3(Gx0fEIJy6}_6zM!BSQSpuh3z?nhLLa)`XC9>3YF`lWlxY~ zjtiH=^ew=DZ{BnYwH@4p|Lel#9U@1O!q!V#2a`%qtkNiYdp z2(icb6AH#;rFeVLE7Bt7l&2lOe=2p|R3m4u?j@*Y7^IgmrQ|+Kw|F$L6v^u3zPjJ$ z=y`Rdx_tn@DU^lmNOI0R-zo5&S$mGV+*em&%D1er&V|CV*c{g=c51) z)6@-~8pY-?8wcO=XlHSqDCOlIvR5=IeV97%dzIY6aGW)pAeBcII6~t>t;e^d`a?5j z>79Fw(C(4tUg^(V;oN*_bDf`4oePRd{_{$k)BbkjsB=%t?_tu8qpa1G8}d@j)j2}K z62CAuA0IMp$}Tr*GpdNTE=$WzS`lV6b5-q@lK;+F5TKq3sH?0ET@e1BP^WrFtNWf} zJkn<93Uu(B?iKkko04_WIi4ZR-gdw(UgH+^1Kaw!E_ZCB%p%g}TcpBpBqLN}`wE=d z)Yl8VJawMyhD!CVr^K!h@-ZORe>V>^2fp7HlscGdVy&OU#Xhzc6AAqRT7fD8oM3fY zAb1KiLD+ebHjw2?GTdA9(lINtl_y(PPmelB&`+4Ke?#h4eQ7!-;W2ot)+1a59m=4{ zeY^^0{M0KEnyUNBXchOj@e}G+3pEM2he!#3gkjAL<*BJd+GG}fY+%-egQR$i+eTeY z)hP3@(zg?v3*qk`#zFt~)q6f{+9l6Oca_c-%%M<`FF%*o$@g<7ZccUzN#Q7+ZT_(5-P_5DRS@Wy)sr zLFj_H6wvoQm5A*R;bO_omlj{|>)D1)Wi)KkdkWaB00+9sIkhP^RtMR=V+xP#EQhF{ zUDW3JH;W_LgpZCp+P&;?vXzwrcn?E+BC#F&#aC2f6TT+lQ=^+b_S5cX4PfZD2bF@h z2|nffkD8xZ=z}fb)ZK$}UohJfKFmbC5pRzExMDG`H1P)CUw|ADZy9R-(FBS{>oqq9 zKGsMnbwBYBUSEtXOfO3cWFhFUOCYzQ*!vmz%eA!?bXLUY)1&OglSK$Z2@3^scvhGA z+AGZH*k7SHncDVL*cLmIT`0t%45NMSN9QTHZ32e2!UsXp>MUt!!T&i|>C{4X4I&YL z6Mk?J7rblgFtIFHZ=iTvk3%*rV6mj)2(I0G%5#1hl=nSc95V}b_ukgu&38PU>{B|; z(4{IWtsJzu%YFCa#yqknEuno{YCxszXJ-=9UZDP)-2u&7B|l;!2PaQ!>QNRN7FvZJ zb_D!wL^NoHXgWa(uxfd*8`;BKzGPsq{Q$HFkjw#RJ!?D4L+uoPxo*EMo~RyM!ZLW+IR-j>qiWQ|qbp{x81!0>VR#kmGcp16RpEwK}0 z7tO0$4s%XfZTkVf*9WWt0jiZW-+-%-_611DL|FnCKRA%1sQ-DF2{GukxS{3<9BWCe zld#6{%`HlZJ&_4g;_C&-4Tak^MsioNmQV0S%6+h&dgHb=Ynjc4T1Y$R9$tE?8UO1S zB4PS-ceH5qJQiP33BS9boQ*8D4jCBs0IzUONW&LP#c zqD_B_m$O+aW)!IUFp>|fcBi*mOU%U-#`?32McFMkBGkLwE2w{6Ry;VW{togW8jBuI zALymeojv9F{=_`ZL(PE7lsWHW?c;e#t$VKeUzO~-(~GP(^Pl%?o3L-pid@(PhLH_S z3{{9O0{>ujL8aYW0~+qbbJUbsY$PaSYfPAb%xT)Rf$>%KSR_I0;ThEI?db_=oP{xm zWXcA7AABej_{c|Rh)08iapGUDro_KA{Xsm6yTyO7ZoC*#10xEpv!@{Phl=~(ojI#V zOxdgTS7^BXA<^4YexIa6t#?hPZb9`ryRo9a{LvP3i)OTU)qQg>ab4v|f#Jliozzw( zzw5*CGRJj5g%m+GMiw|C%8Pl4>awb6&)-eYAOG{^FNo3c^6dRTlFmDx>i_-!c4i#u zAnV}Jv5rxZMCX_X4P>u!LiRY`h!T!<>_fK3vEB(sHpemE895FrGO{D1GD1ki=lAUU z`=kEgmR<+vdOok~dOYqAWJ6mHvWfrgt;FC*f?Qt5r%I?sVplDH*=i;y2IBTR1s$KU zzNeSU-B+BqW69cGHJ6G0;aJf)q~63#bDi?3hUgT@*q(25R5~NP{%0j{MO+X$`!PK{ z&&7kB>@FoEyMPpFuFiWYZ7kBex_D3<8eD~iq-m3$yL|5cjO-9w-%Pd_7B_E5$gS); z8P&bqzbN$9yrp@A`ynz}l{a6uX)zKHv%h<%w56Gg5>nXCG^)Fr_h_d1q4i`ovubQa zrtC4S%8UQ}P9poj`Jc{x2GL^K6kn0%*?khR)YFAX2nurBc*ti|8&T?NhpCa;Kjb?r zP$!!EMs~0}CTCyvi+5G8CWqX+ugek|Q9qKCp;w{h-C{qT^>uY`V@=(!nWbRYI5&H0Wl`;u&Vyc+nFtis`O3jWHQC--^UqNUFqwglL@k9pHy(An0D zrB(-0XX$l@GL$Yg$tNB#8?C*?V^aY;)}~BG4nCT4&>og1-z^$=c2(T3e!>5?Kib&` zTP{T%$09!lla~MKRX7_ccGay;YABcIB<}54Fqt@NHfqszUNIylb$0*AM$yJWI-P&d z+?Y+hdCWSK*hrz6=>jp*EjJdNAbA}vA?fHidp)XYn@UY;5G+{3C9yWf{0go>hyLVM z(-3ggjBv$@y%+;SQFBVJJhOXOqMYG>HbDxEyhk)?{=kNA#nk`$(%+miE)GYHgkO$5 zFIgQGSvnKx0Jgfoi^%mF1o_%aYh(fe&)}$EWXx9ZO+SMBdL{?kt#!1_L`XY<>#+w3 zSvUL->mWPN1eg+{V}*d*uv!Ur<{KG(=f1h2g$>7#%FA$NXz{@}Q1xe-hvh=9`f%Z^2-&F!S8n)kzXSV3k#uF{ z#b}_UA{qxDm)(_GHsht>xJmsF%tX3Ig-~B!s4+ZpMk2VV2(FINQ(H6^p3b_c^_jm8 zg*_tDd4h!t$GieKPICOjW^Eejl?)QWv>3xK(F9BcI{qxD4rxrw1N6U`0pO~feC&^7 zNUn>bekUQp!$eqsH~X}=X8gPzv!SzSSBwKLTOsP&(6-aQ3sI$Ja?0 z9@6B-Juz~wla9A<9Sc01|1$IMc$tWk*6izoit2_S&mGyW#<>k8)q%oAD)&a_eI!rHN0}n z{_}#jd#%i6(+0_9)w=B;e!#Czw!Cj=XwH(6ji20H4%t_%y~EVg8{+gbg!k<#&^h79 z0GZ9hI#=CNSFG?^Q`%s%!b3Y~jb2`m>z3fUJ_iR`QmdM=^CN`?t^~yrV4$gbczmOjuhO{KQQk+AiYTUKF*c%@=GR@fmwQbq$%)y~;wVMc?Un zo=!=)YvI^^-aF(@(FdDzmwTE@)r^(iM>!=g0vql{tcXYy!A*3ifxh_eAi$28R-En) z%j<7QvS@re=R19pU2@xsghec{pK^CFWk1r}a6D>UDk-}t=Ejhi{`8arCcO8sgVWc* zddT?9er(Gy`JXEX}+IL_6Dh0%N^#I}(1e)h3Z&j> zIO}XCJ!<9ewRrCD_<^M!hTQrqED?kuH(-7iC=E}B*-}OrvK=7oaBLKCX;p)BxbKs^ zi4wplt#1x;3jx^Xq=MZwu4{=aC|xZ(&ve`}w(xpK9jN9|7ceUVfCP=!L^U?5vbrnl z9Kg_k`M&KxOx&|mW-2k#LtbpnJyH7+puRf2=4XD!%v%-hkY{#G*1w%xAIHT{XFv72_q#WeM)rMvU7};%8pUV8=$SP3>)N zNg998z+aJ=uJKu=qsXfSjX0sPF(Xf>Up7yiJEn)rTs5l!*(=OBj&M*RDEW4+ z(~j>GSa=g7u{^O?OBSq^c;onMg?5(FD#0+K9}71)dD*k)BuwHi!ZnlUg8Q*EZ$ z%7p-i%FOjarLeyEFls!Btr-dWjITll7It&dK%$??fD3X%b%W<)k9~-d&b*Ht>iC}R zlm4_*z_$KFG~YGw&3ig!A|Iy6KW(B-IMSK;Jn*bh&T!)9FYlF#@`?e)LcWtUv3cV_ zX9usjA6A|w0{T*PDJktP%9YeNLk07ktkgO?YA+x5r`}+dP3BFP<&#qT@zgX-1q%W9 z)bDy^W9Ufb`&aHCN|>64MaZ+EZpRAs@62Vdmg+@bn4a2~`fo!s$uw%`GXW!|t1qSb z_zjx3V9HrDx$4p7z2XsW-$~{B4~p3aufJy8d)iJo_j&nuTU)t6VAIGT_Et>J##}7h zd!z+bT$uVnX*ktTx1oogyXGOd~Wq7JPa+SUodf% zH4yK9-5JTk`ZAcR6;jf2aEy>lpzErhBfQ;z@-(zb?C9`=s#}4su$qH+x)^ZJaxAnW zot+mCA*`{sN-=p3iCYK71Lj;$@qxx!^|p2W6`FGMbgqI4sEB^e?w*o`H{O;;F>On@ zyohhNLfrC9*HBu#th1L>;gzYyWcqe3hLK3fDetgc_{SpA{`ZuNs9w_G6N2zlf~g#@ zf4Ts}fC?So$mS0K1`U9r znt2CJ;;}3bOw>4_E?tYFW;Q!!lZ1SyzEA*LX!2KdgWB=tx`nFjL3huE4@pQ6*YT>b zch0<*-{S|Y8tY$F50i~}{whilGyhj_i)ww%zFZ}=Bx+N zeA!yMS&dZ^9c1v0e$0J`wu0!cRvQGicThb&iw;d*=6u?XeQXjr(wE$KG-(kSV%eBs zrK{Ep8xq<7A{(M##hs6<;K8v;Eu#dHu79x=?wj=g)7y!U0Tn(_+_?%X`T__JXyfe| zTi0n^FIGr&Zr(5Bp!P7WmkaZ2*hg1ygA1(f?KLxjxD3ovf*NPp&Bf>-e0H9@f59uD zb40`X0hB^bjg6lw=Ppsi?_IFosmrv=1n0rk^pFs_@Ajp;*rK7{~Ac&;-*X`7X^AM@J?TT^M4nb(6e7BITxonUw_z!1PYXNCY$E!ppg=fIbC;bS!bJ zPenJ+uA@4;VSvh26PU?6GBHff8VP(B?+7KIKK0G#11d^)BqR(BSdXh-@zXftxx=Vsl!ik#^> ziFYLX%qoDos)@^SF0)dsRM}6E{~q5_q16+ct7Nij{cZZ~zve9~gLl5Z&ihqx&5D(_ zX{pY)s;|zsL!$7;*-}pX(Pg}@Rp8MQRp2|xp|LU;CGN)Qxgz48`QuErsS@bYRFc?G z-EWv3_FBhCK)>N4(a7v@2zFHufwsX#bnYyg3^#6u`G+n>$Im|nUxZbPal;Atv;PhH zW%=ryB20VJlIxuv(W=nY0K%s)W3H@JyCvZn;J5+6S*@Y1Pe&{*d0zl&gQ{M#2EbhI zO#Pw`+glJq8K%^yW>_8|Z;}$Jjx?Snomj5m7;x*8mU>i-X!!8;_d8Ql#NG>wH76~~ zef{2|Zo~$mb|5$O^zuY2?uP>tpFFN6!HYS_X)<`ShdYG{{-|30@Ua4pugivKQ7804 zO@Eq%$=gqJx0Y%NJ#dZeUXQu2WkcgXod{F!nYmbOx8PxoPE9^@z(>;Y90)u#{9SH7i4oI$dU^w5U z$?ElBn5}V{R6P+lr5C@;@+q}Pb-8KvM2wk756EkUNap9+f0O$ZY6AoySxVZPY#uwC zYmsHp_!|wyQtChbaWl3@!Ym&?3n$14+Ww%nv*7MQ&5tz$sE;?7&al@mE54lYUnCgH zh?X=GLh^EcOeM4WnD=|6Hi!MUyNz~CEUr3N8RCMNTAfJ0?J|+XK@Q~S7iSK-29+>m zm);58$nMhXN#J==#1ea}AtgDt;mah7JJloM8|ROO4~V|3sC%s^(#Pe{3HA-h;I$;S zG;hBqVQG=4w#nS4AMu=lZ{NtQI8_$RzPt4;n8}y)u|J}YLulVf;yx?3JS)%&V<1)* zoRi@VkMW8CY)`Zt;dDmk9t;1E|tQOr4aFf;A1`IQA^M1F=mGWp>2 z91x%&(|eCFg7@!NVWR6-sNXBN{P$o=&Gkna2pVpA#ai$_P)XHO{sUQJk z`8B_(A(-{1laEYGJNeD{(o?7Sgl}3|7qhRO9KP63KIyds<+Yq; ziO$I8koC9k7X)swiA!^E3>67xqVQ-O>HZ={dU7sFPA{7^OztN?dx)QSU3PT-Z)3Ae zO`SSPmF$vyX5XtAIAvpK0O+!Yrhxpr-IXDe1Bp7#`6hQ20npFyD}cyan5xFy=*7@N zN~r-LS{5llM>HX(oidYNn9pa8S+gWY^SQNfG6aH)<+1B2Z)L!K`U7UVzuf+V8N+Ez3KyW3oE92!Oc|O_r>aR8%Z~8Rd-frEvuGIU;Vs!t)FyO z>-4L0nf(5t?Pi~J2|jYaJIB!Bm#|CNui1p3q?)UID#;K3-f-Ed^1!1b#H#;%XQ=_J z^wW;*Ax0unzTw<_MRcs0O8O9h+WoE1cFb-dOUmMg7jX2=W-%nOfh%rEicTFn-AFmK ztIS~4AZ=(C!!u7|?3lOe_|B>3iTSUF@Q4J6h75lqajU*2tu`j#FP#xH`#q_Szc$#{ zqNDvkhO^6!KSKX){ijI(`812Z{sZ<`c4V%4sDByg4P$+~Uw??==L$1jMeqoVq1k!u zTMvepSdEaMiklXjR*~fO*VNXa;$>ty!F5IMJR`L*M4|DYuM57W)y5Kql8`~o4uz5e zAy=%>Mw8CwdU!7sE69{~`w1-YAOH;~*3LL9z7J(>p)6I(D1IE}@U7$aQ;Tcsn+&;~ zROcukk~_YkEegJ=-mmhQul?Cc=bUz)eRm!2lJa(B1+XvF-hQGP z$sM*d3-Giw@8l}=9`PBewAfoO^HZL0cCd3OW)awC^urGO#18I8mx!oiHOYO24Ra}c ziouM_tdJl=?a|W0C4NH-q10}VmLGmPS-NB^Efe)wj~9acGq=9E<_u9Zj3s`er>gnXVv?cC@AeMwb~iBM_PIwW zMc!L^*mC#S+tNZ=O(VPOMAYmev9k~&f-;Q&3y*j-hZmcc$$~;_&FuUf9@F#Av<$+B zogF_Q*}X#5bMW*ykE1!be5?3r(*5HOL|xVQzLUQEGirX1A_xjYrfvo!#J=p`HGQ2y zhkTx{!^(25Qh8}N=H4k&0w=@ZO1!r{`3S_L{@G_=?p(Zo(>jlsYejdmqMMqIZ>4XT zDfGX18f(-N>BTDPvJCl^$PzNYroi^@&Cr$rTVEp`fhRV0oOKEDUud4y7l?~yaYX_I zdDCpRSxQ1rv~Q=pjA-mkTMu4X^^%M4-UE_kriop=M`@0*QM0htwNK5GV;;{lF2u_38hM3o~N&;AL!U;{{lQ<~o-StvYoDg|uP@iK$5_YK$V#}8yo zW!L469im7|C_WNW+!a`b7D2Q;j(N`xECLxEOQTM-ml&S>89h~j5Cl-VYyp-RS&97G zqvm1#m{Uh)8lL>f0Waoo68nMKB}#-VD><7Prn6DbcvOCRY}P|$cKL7FcLll#VRSSN z!2>9oB)8nu%&*!>3W8D>#J-^yDOBHm9PcQJ7d=Ju_7H-mQb z-jP7e4=JEO4oChj=XsM?N7zQ+^o5O2-_*kX_$+bj&YPenvY0|?$;AZo!!Y&P;dIy^ z!JLWqxq|U5qlOC-?1$}iYfa4{!4EWn#P@j}9_5@CDm)Y;3e%KZUR`<>9{ZALsHq;x zkzM8Jn7!fZT5EJO&^M*01oj{KyX;zTXjwo&dv58I-=nu3YJ;tj z&i+~-PSGO!I)pIhAi1O22bNR%(=2he5P?A4;vHV2k$P!?LKJ^PSn`G1z|CH7MmxUj z6WQ)5JpWJUkYQ03YFqPO@whZmhCk~9@1?nSiUb5r+)SEoB)&M?M-e8Z-Ke_vV100V zV3SPiY1mzcK%9dAj4$A=%ToRROK1>t8^2uTCG^ERC|83|Y`^ni=oLlo1jOv1lfFZ9 zxE&B(75SM-r8rh^F3i*@=?576Q|x?8AsKsb%FcDvQ2CZe4wm?|mfBg#TEQw-?>_i2 zd1${D1<}k1(tV$O;D#2Bs~c1c3D`X?Qi~=R-ZJy3J2AInc;PhicAHx(`=hNh5ebY^5D)JhTja3faShmwI z6uq7h@uGf;gt2^W#qFwQuSb96w_nMMNL~(KN#F z)&V^=>j?>vU0WEhhcAwQd&OxVE%xl~L^Hx{a3AT$8TO zMo*DJLs<1-baTD~J=zyMk8OtRWQTWHo5_FXHN||eH$2Zr`DoWZ;nh;p$E=|<9Rj+- z?ar2b)5l5p_5U%X(cyf@OI+Uf0xG$@9Tw0WA-*fyuz8P&kdXpuN#kYW1KGL%F)%GQ z!xuL$8ez_9VW#+LmKQp)es`kPm#+syMlTkt=Qvk}l4{f<%43|saM$AzvK&l!C%_*^ zFz1G10fd;s7Mjrd*9iJKx-%IJy_MSjF3Fa_2?Er4g;dNFr+kJ8uWnuz&L~uw*mo8; zE~f7pJa<=J^pi~zkqfwa45|D8m}PqGKNp?wgJ0%+#T^0GuIPkq>od4h zt-TCOsE{^{KxZve1}r5}Ail1sI9_)vDf88#Oe#&qmc%8+ z4ePtYwhiVhM6n_iAdPo?X9%D$9r&TZD*@8LhqSXth@!SrYVcC0tlRR2zNl+%7Ix@_ zb&~&7RL>)XNbVfUY4Na}@kE$0pP4s))0KG}E{x9j90ge?ok{{=3Sbe@!*c&X7JJ}STpqNWHfTvGLf}y@wg6`~nPo~_huTb6kUu2pde8_*}_LD#_ zTJo`Ch3%A)%y6QhhgD)i2Egg@^Qv)3qp=sEfBzDcUT(C9maO~{wtz}69}{F#Sz_MU zTNf?w<)fAlb<>V{Z-%TSg&Ym8w|)y74rRLhI_MoSvXQ0R|58P76o@`pUIuw9`uwK> zIY04(pf-(3kp_Z&B%fSi1zy&U8_!4a+Ry3PRYvDH;-Ssk`tW!SLj2&Hg{`BrJhAXz zx*f=387{V#UjAct9XPWVqhnq%=)MKIvu@wq26@XwW&+7&8|EDZ^ESgs?E@r-w-sBn z8ru@8Oxhuv+k9qu(8SXDoh6gv*E3lUrL>ph+2#66)qWSXgr_v0`VstYDlL2Dc7aju zZs~17vz;hV{>O*Dkptw;?6-uq}pA z9QIacE&-)B2~BB93^;#Ky*Cm@E~jw2EdBlh>E^b%ua@P%tm|NkK5+QDOXAFZhcTdS zPoKA{40Ol51#&5cAQR@gmSzgG-yA*ATGzvVIE%}(?)>bVTKf`X$tWV<>Pp%i%a3D^ zbJ#$UPK^Ey0{fQ(DK0U+F-N_XolUCf`=jB!Qlh_T+smGVsZ_|NVw0a)x+DTcL+|;(mSx^@H#jTyrJL2s4Y`khB#3(Qz)#bt zV%33=b|pliY*2r3@mGYtQh^8%O_Gy&97s{ayvhw|2nk895JRQvz2?pg}=U+-* zmX(By(8WS32^cS>Leb_u(zlC`^GZLeWSLnyXu1a|y;c5dN0>Ge4b}^E)1FHZ^c~Qp zsok`BGZeC@G(FwrDaF9#Q<9r8$J1KEsmCRePXx`_84S8P{#>r9)Qc-(<0+Wx*gKSScyW zOafQ zx9E4rCYHmO`Z~PRMQ2L8#3jp;9rMs&3oRTm3LzfU1HW8)H)#3#>156wtR2zFJMn=j z^%I!igZ`M$LgKrn^du#FUYAv}CIhkb9`LM7T&$tfz!zpZ+sL|c=B2_ecdq%6N2k!h z1E|OWfLgaR>+L3@oz<-)CA0tBDLKC@_`|Z#iU-){7&#aN0+o7qVU41x{)Y(oUIxP> z`REXABQxxp7uy~c!T9-aR>wRDH#>#r_Co=`2}$j9)CS1Z38yilvrMHk7!2~vG-gpD zn@8nb$MXN#GLXFQWKl5!aj2A6pN36#ENTzSr6*foiz}QRE1r@ zk$fU7Ij{18QSd{$MHlHyFB{*r`+uV`P?KiNS?vTCo=Kn}1W*7R>)}<57~8dB6g${M z?2ytuw4Z_U3Hn$G`%dYya=&^gN zp$3nbCgj1&>@T~UCcW<`JiUfwP9SFb*M`$p4u!#ouA3sNEL^s7Tu(=HqE3(dTe<62 zja`@a9WSTZ$fdkp5HV`Y;jFtZvHK!8XYo?29>yUrY1qlzM$4|{LnE(MiHm}7HzX2Y zctu^W7vpk7@5vy6*`H5OJlV-&jm6|J%ghq6#XmL81w2mz-MHNbpo8NjC`?AcAP zEWh$+{%7rrO5eiSpU?NAQ~7FC56fl$-u`8UjxEn{tGkPqEuwM4S~6M5Uu8V))7Abj zGNYIIp&9ECE}1i!d6k8#{tEC_mw@b9!bYBh1xI?)@JhD%Qn^Tu&QQ6a$8p9%ag$N- zp9#lOXeR6OZ(9Asa;UCHYzjd?oJPF;#6;t#`HW+8&dTBCYUo% zd_uOw#zx#R+5Ke|MjcS{nUajfDikx}+>xuk8{eD)akNs!d*;wSxfLvO{Hpaui}m8z zV(zX$JD3zyHo(onm^dKdAH zgEUpCO{y|nlR2w$HJd14}I#&O3+;oI9Qj>TF{e%c2MF&byn zk}cda*U0?c{K$_Qp9xC(ZpiBsc}?d-L~8ATa2a!1^br;Po!W^X=fX>g&djiYi1vXz zQ;oQgAKg6j{iy@3|`Ond16S#8zIU{lKT*_qL> ze`k>X0pAv*0%6gWk>fg(@78>(8?R{m*a9M2LgZ?k`+6z-wy}EZ@Q$^xWn7~C#ia6Q7G zpDpbmY4nVd+3^cPiJEcKJ!MD)@YfqjM{}ejwgMLsS5mpENB+}08@W@?#Vsoy*xlKF z%2&_)>?7BIesT{BYk(S6Fs`Y#GSuFtJQtn(E(I^07jRx&l#f;1fxg}yG)Cp5-C6QPTcHFpGV;`%W-%=p#LL~$XJ^)UTiqMp zlEAGMH!{w7k=!u#n27Op-|9SDtet}EyK9fK-B9`?#;RI|M=TNU{X7%+Fnm<*j;Y54 zr#UAAm*FJqyX<|Ju4FY~UiQT3{aLx2kA0)a&176}m_p)%`f$1>m&Up!Q@Xs2v+h5T z=|Yu1XX6lmv>lz8*4IB@Yv;2_zf>-GKXiMvN)Ogfi*;4sw_>>G|A6SiPpGk$p3G!z zJd)l(l`2o6z5gzHd1OX|S)>QIbGDRY{`z`AGJ@OHrry$f^0!ZNw6{<8EnoT?l}c8{ zy5Z58QlA5J6bbgi&sgx77!K76?rXt}(aivKnishL=BaoHt?pD>RJUC%Uld6UFPe z_lfdgLo50f0EwR+7o%FhD!|~hJ|nD)O}|bmN)l`#9Q+ z$@Z%Q0o*Qs_?hN;JsJJ?Nfxrd+Svs?mIty0EZ+Artt?ZRL&Cs+02Uow*)Z`tjfF3;)aiN3b`?oV|Ju$Bp2-Q*> zf@jlGz-;PABZDR%kCo6)6-`ejDBoTpGzih(Qj~drqu-x&`-}{(>h3ZGm>8@UQwn}J z)H``NT`Zdv`(BH^cD|}&(DmZyW4*S~U)lduKl`Xx;_`CHx9^M6CdI+x7x)O`lSf!y z{9USw;HPhvlMU&!bTS8vk3x2$Cf^NVTl{~Y#VfcV$4gLY>$vjY`K+{)og%F2Kf2(Q zflF*yXMM=QnkjrEJgU^6KsmMWZuQFBec8$$PMs~fW4CnuYSVN+OBcv`M9k*13~!-f zJ4f_bU}P~4f_Z@b&enHBzPpAylm~n3yB3vZ-Qhc}RfbnfHO*{=e9;#J{|uv5`UWV9a8*} z5F6(6y&1<&*CWL4KlU(vm|p*i0E1F~6)DNI&y9aRY|H+5!)KAP zCf7q!ASBB{SI<5VjuxxRh1y|4*|!GT50ub^d*zdK&09Ge2WPG*$yDEVQ!vfgT$oRS zHPM)1M?6m-e!w^mM=kRU&WMJ^AVS?P()7Yhnw(KTzLO-^#(Xmyl${L5Cw$RQV zOTy9${&p+8`1f4f`MOudKq za!{~vNISbgt!8YoRN9-s8tO54b0?;j;GCbL?PX;-?>BL4ie7F)`qG!on3w5?&`g~*N ztF~?e=JvM&NDkBBy|(aPmghGE1ftZ=mi3sXzhMdDdQkxRl=?m~H)s#Rb6R&2igoeP z&Qstvk0MTsP5jjOfif}?*m26kB=%M#U!re$3N%_L`YI~;D$Tv9Mdig$vQ39>^B=b; zKxpV&!p`bx+iN}fqwMt5mnm)vvHJGI;!7;Vwqp2WpRhPEaZwnxXltlL!BsbE`=*Zl ziYS*ZO+n?u?bxN2%5mB63t6EhWx?mPsIaS-TbI6Dh@7xXH@!pfBp;P5fK(f;unZZO zM_{V~=}&0ItM$$5LnlyF(Jsf5@hX0HCP|*Q9(nxwpKG8!@f(p5=B;dJ38_7#_qgha zJC{O!tp72)QL-C%Gx>?Pskw~iVHsFmk2gzBc|3k1>dPa;+vFAa$LN>5UdwQ+SD~?9 zV@dhBsM+L1+)?-kA2#=GN1$3kS6hk%)4*ne?f4G=-&oK7fnAc%CzA8T=jeJYSmOS% z2U(PAF&YodVH7hK3|As!AWYkpVHGvozjI3iIBit9+QNQ&0R*!9Q@p@+`rPK z6vCsWc69eQ1MAls6`A43in4l5S@c!hkK@5I>u~ji1Q%1G2do+IhH8?EvP?A}$8y_- z5T&^PimlD=hjaV=A}V!Mu+7tBv_8oG2xHzv<$&=Jo46%V$~PWJMZ@kqjV9Of1Kz5) z8T3znCs~n;m5DpQ0l^Ff(}E+9)i9Lz*Qi1L3A?1fWqj-P}|6G zoW--aMbZS(hra9ocNES3;lu4seSHM-6MCpY{*gslOI3~=ZovkR3QZD|{MK4{-`u=O zfO0zm&nu_?e|TYqbL$kU>GK=Cr>BgAAU=IPP6Ov&H>7YOHn`ealzQ_e3o$I_GdQ2V zuGaDLew%^w6%tD|*=0cfBSSVhOWt%DzHeSofqgP6Hb`->8gIRG19ur)CMsm8zInEH zRy6xR86UldYwSOQZC}DOzP5g!HnBKow%7dPL#3B>W;50lYW7S^Z3-N2^p8 z@{k1|*^4F4kEy%bvI#n}c$3r1|>4 znNsVRg$EpHw3g7T(=! z`{baJCFpTo@>xA~^`vZR2pW6&CvG;Wv~+0&TqQAogv~LVN0#^npv2{&)!k4*Nm=yQ zOE~PyUMJiCZYarc5C}Qk35wwQD|p|XF#T4!kwX8Hxw!VYv1>eB9r4^2{7M=8%;?DvLB}d6FhP>Zk2> znZihJJHP9_vR|uP+8vE3_blJmT}e!K*VSiP{4z$#ahq4qkoVfE#DW3q7SFrUo ztfb_W$`6S*UR*L-bQ@nKrLyf#s9^W0`@2^L9WqTG+?0>VrmFf66MxuuJB}w#H=L*M zZ|#z>?_o0zS4{?5e??lbe|h5FA1GFR9R$@rc`N1Ebt7Q|RVKtu%o)T)J#~21Cjc2T z8@9H`IX#BQD}A573Wekli7Sy`1UNO>ru~xE9FWjfCSz{4&w~-VPNm$c8~3E78qyPP zryfrjPcJIvtgSU>uzYPhE5{uE*DlHg4g}T{zcN9h^AS`}(-v1>ichOmRyC~g} z(^V3{OvQbBO4cSoHV}C{ST|Juggq8}EG~>b%z5?xoBZIkq_XP;PXldK=tho_G%Tf#+ov&a_bCb(j8#Uq9~ z5=AUAPiD7BcBhoOqS8zU_F4!SmwQ~wv!3?%1U65R6f<5t$ruQk;ZlG9`|V~og=NI3@ueuGneRxVof+yC zhCe;%?;+?p9bW4!3@4|=E+uL8k`t;Ncn%Jo-1Kp`dvD!p%rZiXod3M|-5@;L6a1n# zgtu&ew-(UH_zV3!jrp%xee>VGcD7tovj!Ve0av&k;aW*wCGLw?>-doEAtk*$JPsFZ zTnmFx^E%k2B^#1P&(bJlWfz#!v&BTEq&NP_`Aj+58PpF1qx!*UjQtNgTZ^>+G3;Bx zd@>NOFYhhGEht8A6f>jx=2=voJy~Xwa#Rg`zTD;Tmj&S*Y_{;6Gk&Lp!G;EVy3$}b z)y_ofilKzOIK_n)DgM%dxY3|fZ|0eCVrmAzGo159BBnwwSahz*1-Ns@m-WxB)1wO$ zKve=I3H=IdRct{9NtDxQgu;vwqWR{ISvF7JYRok4$E)sq!%n`TR;E zam+zUEa+$BU`37q@~G1wjkey48MG%bOJT4sQHc=&0hjV}=?^tJ6CYDM0Wpby;2p6My0gJ;|tJ)BkDII&eWCm$)6v1^0mL9jFbA zVfq@v+%9W==+}ie^fj^kdDH{7Y;0z{r+jRZgRh^NIA^l*X-0p-11V?kGPysw#@6W1 z*?pe@|Iusdo0SFJ+~oRz8YCNK@YB*&q2F>fkp0z+P3A3ONI0vyA7-h_WmzP`A6s=j z%Y6jh(BMZrN(f&|Qd531Zso4LwD>;;K}Rb6HMMS8CoxH?CBesc`bqezuj%Ya>p#Uk zPYiBqCK@6sl4)KAe;R5sc++Ddkgo-nD7Q$?7OfSeB*lf5XeNq%2>&YHaw% zab+Dp_~8MO7F^^=J(G1#ILz!4O(+m_Ca^}~5Tbqh<}U@^C07s~y;%W0mCaY6)?jvB z6C%f)XO&2(8YG1wYjt;9drPCKY7~vyUngTfKJHv?^6qIfrJgyhopmO>9M12i>!MtM z5i(ByMIsu>HknNn)cZ@84 z0v3z*rIACgP-mNnFfd=ZgZ!KP4yhBYnI4ToWIViMpGh>d-9+k+K-Tp5G`gz8R z#9rGM=BBp6$)wh*^*&Fnh2(8Z*9`x!nKzMXdRh3oudD)jZMMAzT(57>!40J}eNzrP zcsj}MO0-_-UeS>3w^H4qKQ`@qGP2xdJklKP_JL;Sr_s|`f5j^2@m``$fdoPb^FM|s zi6IGz{%Zzgz6M<>C?V+bzVB)A^uY9dyBOnMqE5Hpb`Tw%DfA zYp-Ev%%i7%j8du+m!W$d>vp_%ASxNM>pi`#m;Tep2>wbmrJ4g>*ml__mmae2hOqoGXsM63r*s zqF=DuoL^(D&|mU7>6WUY>Y|OR1D&!slkqL-LPd#Ey4HQ6&QkZqf^6#-`TfNH`nHk= zWMe?@ywstYO0r-tgWdvK{OA!PbA9^K->u7o>diH4o)^llZHOpcGHY}10O(vrF7OwL z;+H1}Mroh{I?ik!9tFws^^VaPpXC+(thi1bLqfi-Md~Js+J%->z<^Zv##07Gdp}J) zrVTB2zFxf$wD47V?lpXI^CFV!v2nqJW%?Zc#Jz+~IcDphd!#floO@PHFNO1?x^7G! znlS_V0zqW;A)gyV43G~{$5HlCkbhX`1Qv^{x(-DD5ptOnEWRM2R2v5c!lJnS1Ig>0mP>NacPKrbz1RL|} zrSed)|F%)U;Bi#Wgz`gmF9-;DUtAUwzn$lLjpgC2as6%ex?4J5PhoYWfEt6M_D}Ei z(#&GhWhvqxgLd7VqSR_@4FPEv_KLu|)$ROKXR3#P>*P&M=Xm6GC{ZRvu2>Cb80?M~jUvPYW2vajSy@rb0)=lP``2|sJT@&IAoOjZ3_Up{m-?tFz-KJJH; zcWFDI64XxTsP5Tl{Dbp^@i(w7?mejJ)r12^1?T+8v~X z4L>Tg2BYvwH6RVIbE@$uYw^oMUrLlW?F>QvtIPoLFXb%4&iPsR>z zeyYa~Q9P;ESD|cYJ#PeehbE$aiW5tAoZN}zfs5uZ`nV;woKuyqL%bSPX?-A1sBI0> zKeb-T&l|^rzlk@c?vS2%jFViRD3!~mX_PB=nk0MOof>N@D{2UGclNfM1M%zeZyd*K zRLl9f!?HNoF7n&|JuB;&CeSj~OwnYZTp`!8eZ8c0U5DK9!iz&fuXcT|651{5yO4JI z9#vGO4>y}nwUCais3qOo;N+S99+I1GHEk=Nw!ytx@3~(TH{lT1GTZl|v9N(vdIxlB zwLWrSYX)rV!O%3XsF!p%&tQfhxC6Py8aMC4JLaV_xx4pjp=)c$gMSfc|97mm7c0~Y z@}D$zy+`{E<&n*JN|@MbZH~0M4e_-g{%BZt!53w)$Y0r-%x1~j{;i)A?Jz|NCI{gf zYkcGut^^WIb33Mu!z&#{m3&5ST*@yMiQAc-=zQg!|7ryXkxIwPUd@CaA7hZ;SE_Bi zPiLkZek};|mR~x5Hvx(bbnl(#4{`U=n)NX}7QWDI;prr7RjdFnDvy2j-6i`=&V?_+ zycZO`S{5y!4!*Lo3bp(7B)hm20>%`HO=W=Z@2oWKH-`$MdZpt^A2kPV!(61)=u+l< zGrix?W#U$=Ti|e zzUn1@E;=qhpnc)vSM0@%KVC7l{=U0$N&KV1h*sYv!_jkH?t&qWbE_-jJmatZ?KSo^ zzsc5N`tAon{E>{bPOKX;DG{@l>C7#We(e8` zrLzue`u*QF7NC@LcegOQySr;Bode0q5KvKSbcY~48tE9INJ+B+0|o=7M+%M*#Lu(u z?|A;%zdN>LyYKh?y07az*)mf>0A*=uDQ4gC-Bdg_E7sfNLkjc+bh2jle7>-y>cXTQ z7f@Jv?t4bb&sti- zXb;6$JaCoJ^`ZBQT0K#RE%wMZC0l-@m0P_(#HO=qTkF( zm^->v#J|K{6!6os@;WW1kGVVs795{?OkCm%q!|sF<2;mS4u?6;Q0Xu`hV;wlwg0#8 zR}#%Qt{mWZeh*4sBmIzI^qV!7FJTWJ+fPp8nJ$Dw%%*~PbTj_6uzEbDz0a%uzVI;n z!&L~^*KOfOwMveYGJOxgWe!Tbzk}VlR+lk3< zT*rsMc~%_3!nwD)d2BdZZ)|u4Pg@#Qw__n{EO^fbJzg)=$ZSBBuGN+N+8RCLo9qrr z`1z60aJbQ>CT(=Wz-Nof(((3PODiytw(81!0e2T|w%CDoI;H|_#6cPz79yUBHpYuMl zIlaW^v$%}RM~QZKlvcn2pncA|X=%mdCyW8zpdB8XN!`J)Q7*jkDiQNAtWb=LIgVXH z<94hgez}bfHRD;w&Y!OJ=Q+Uf&hSGW4)s-c4=g|uDEUahsVBOXhcqH025mzVpPeq+ z8lLhl{8r&I}7@rhvE1{ zp{QTFpzh1`JR!19C~8`;T$G{ii8u3~+ODp_>(;e+4}5jLw1M->80hTILoX~H z^{|}pq2xVJFV^Erj*j*(>-dhlj>=L;`U7tE-nY%TQWuf$_eSmo`u#7dr{v5-c!uwTk#X(e+PJgAAWe;ich19owyUtXwxI#p?UG#nIzKEnOp69Xthcs)t>vuecTu6 zIu`QR8ET)^o^GtD;pep;gn$=#S~IWjg9|fFAket{=Rj+@g4t>MXZQ*#wzz5O;AOXW znb5m`nf_`jsY1avqO3M0jmYP)8qqvl(01VeCa#9$+DZPL!yg`fce4@GP_?&U7IL28 zjDe7ARvLt#GbyA!OrySi+!EN4$7)b-jQpE)pKkP4l7r z@yGEq@Nb0R{6fd^G^D*zm|2O!Xqtt|qD}Vq*v(8|h;65Wf~dtl^tpm&sc)mxVqIM? z{hGAJQ%%Y%bnw%b*AhT(6R(Qw1Dk&9i%;dE9t(x}Lk?15CMgjTD`=4)QAd)2^f7LA zg+^go&iobN+J0*6u?K=lQ}5t1o@v5?5M1-hE3t~SD_CA)Kx8(K^!mrqGF&*JV1G|0 z;b2dQFEv*(*P@*$?Z^|?XaS1a-*A*x)!4_#!*F){2gbay=7|ehI-6VJWX#k>FJ_iE zMdL(fW8q@?ty$C)EZ$Q*O6AX`U6(>ZqBO-C*5lx0 z@<%ST&dS+}=}YB15wZ5VpXewJ;Q@AP+Q@Ke&7{RF?4cDVw_ z(jB0F1Xg?DY>S9}Y!#u^Au*KfzueQNcXYBWBi9yqU>VEjN8Neis4-^SpkTwwUeO+9 z4GJCee`%@P!F2%s3Mqnqv6ym1V6drgI&QVRHyi2~>zer}yF2+=Dn-{fA8v1Gta-@W zLn9r@ga)Bxa!`K6x=GppVXPPZCciF1P$J-9eu4ckBKsT{ep|NgXgpDZGM{w)}5h za^hg+c|t6GfMP06oep^@}(fbeExq3gr{y|=zlJw!PA-O1C_|QaHg@x2i zjgMsMJd;9&_F|jUpc%QW?5i(CfrbGV>kfXqj(I(0x_5{$1)FfcgcqcC%zdBU zbX8&Ud=KOuQrEk-_mJVx>WH01CK#dr%c>H_w1c-jQPAcHT_xv82}5IZ5$Zt^z_1CG zE>8f@!`axjwo@;!1M6Z^$3}}qV?eV)fHHNNKwp=h5swRL)}?u}oi6 zb~(@lfCq|z0iL5ZVDHV+YXL;dh zu~_NdrUbq;+d3v$|ChOXTdH+hBbQuV@#0mXywPu(6qI@OrOC`fwB_V-S#Phqs?=5v z{+0VQ`jjDQ3&o%lwe7E-TSS_X<^MQMeQ0#r{X9dge8VlJ1`?%&P8))wK07X4l@4 zvJyEp$7dmbOv$R)^6_KVX7DIg|v%`-JrLZcJ%)eZQyqXPoTM=zm9+B~v@_)av&Kb==jkgafaPWevHJ z?}@hsMM)#BhrIh>)W~YhD{Vz(X{B}f(E^%Ca;2#HD9NxQ6y*64`9QM*%a4?HUv8)Qx@&|v zU0ctymm5AN1W5Evf~z2G*e978d!o)Y?~04)eIvLFbpk{6C-*%j?zSU1QT?<1dxRsD z=?vX$at!bvM|YFMR}u;MT5SX8WKrXzJCgFc3#dMFAH&X`ZL`3vOCw9XX1bWD2zU*2 z*FuNCpBizC2&jPwp{9jl!tL68?`vur%ax1upeY&jENn*px7MS@yWt612Nv8B*^qfe zb*rya&?GEW3upfQvOUFT^c3?F-l>vogU)TX1BLkoWUhG!#7VE3%sm3KHBCv4Enl2AWp&3-e{MRJFV+ zd5Ja)jj68hZ~%Ei4BJU{zJ@&z2CzglBt07%<0fG|Gw1!I;k4@(bF*ax3 z#kA&*ZPT1u({I=tPTzEmptPoNPE)$J+Lbpp zm=!SFzcf~5>q5rWkN!tcqMhc+^JBTAIYjwnXoyWU>H9{s)^V3in`4@OYMYHpUdA>O z9zocc_+i5*^`G&E&UQ&3h8xr)=KHVokgXG7ScX%&K)iiMQ}IT34B%`somN4cWnYpA z)e3V$1*AylSz`^F4fYdjUA$Z%ah&PQtkX~^Tz13?mdKP1sF4SEdL!IzKNXYZ;w`05 zmg`16CI#X?*>|WK`Z_J(ZrpTCD=t&sYaJ)3u-GTIc*W=ld3q|;aq*WM+b;t7o6s5# zq7=qE*5(hU%t_xc{QqT3zYAhBY=m>4(zWV^Axhf)jEH2C5wx_=;3vh$N&Gko>NeFu z4=#_c{Pzm8wS_TOcAAF!J+;Jtp4fUlIGtK)6Hh9Qu_AJyrDW*S9Os|Io!eOr8*NRl8=@)TaA3}0Dov;iRGbyi!dZ=_IBmX$uCogZqd zsxhHcngS#ju4*UKXZj6eHpb-;VPEZv=HAv_hP*u?|HoZzZUPOdbtRcNm5)VZH`7B(8r-u(Iw0oE8LrbhHL#1%I<3jy6appva z!FUz=X0_il?Q*9Ki?`XHTpC7BkgG6}ksbx0_5PN(3J_))F#cYR!ut7#25Vg6^@GT7NmU?pd0n>8bke`3h-EOL@T%*i($o2`#@e`q- z;DBLvbkE6(BV!d4|FC^>w8nT9^ja2B2QxB{fQCiJ7~DPZG3JJ)T==Oy?3EH6EO)6* zl|cgny}ApQKp$PBPDxT*VcND<>eVKNnN2dU2n&hOhKyUWFSowbT42OJ?DIdz^*y95 z?7W~!=5sN(764?Z3NLGo9IutX2HN+@W4O!Po9eL=bG_lk?P1Ymt+18!7IGFxHc_mH zOx;1&1cS_nfbgTUp5Sr23Ru1n@h1^L!rwEt3u)_*CkQ;TzjKp+B*Op7qRG}!zqKK2 z{g!r7#^+qrdr$6XfKml2nS?^NNr{C#Hn0gi_F2z7}FUg~0X zFQcjB{S@)At~ZCiVvKSk*0+QG*waqv*Y(931OL&hV4o~wTok-N}fhU z`*}`h`fgWRIF9~(V46TmwSD|$srk1^k+o}x1mA+5xbeG8)m1(6YO=Bd`%v#aJm=YZ&SXj9Kw2z$hE5&u*iPX;v+ zo7BV=+(R?zu=A^8E7sZRHYf6r1wylFKPP`SX8C&8J;^?3)(vpRSGVgD^g|q9-Vu}5 zFkkl&nh{G}r7Ms=d4T#~tciVygJ@_|EkG;3f7_BcJ(hR+n(F`3s<-$$8|wp#^^0_I zFZ?n1(-T4}8&*P5+6T<(FDj;eA5pdy<=pcwWqr|3NUGYV>cIWZakV z%1r#%cQU+M)G?tnusHYuYs_ zvsebmcgffX)4mU0{tpr&dxtZv92lrFK-QF1u@o* zYXSLKVFMeF3WoOA+JnP^S%<1emg~as;5KVRYZ+8Tl21g5{$tF)JiF>|sr4xJ?)UkB z1!SH=qqdoe4f8tI8=T)e?w0ltFAJsjQ;;J$UxlP#vYCLP6$%(jr212gfDRHL?4gz9 z|HFYWQdaU7tjg%pwtVy8g=(p^)B@Cjt0`~35a~H*prI((esj)4#Jeghhb2w0i!4;Kf-qibToeBnKzCd;h2LzRnHmu z_!->sHo3T9eG?3tS`(6)Zx}X}mp?%Bxn)cJN5GkX@Tn3cFEV%JCQ4;A<+OZUeqbzs zwr^A%RywR8PZ0>4t!iW}s}HPuSJyt{DLYv5tb6+N!Lar!yFq^SIo#3rDx?vb%TB!gg&?LV~ew-@~KTALoscMLxCua1zjWk>~~$`7i${cN>+ z=j)X@&8^vHM5|L9nj|u96!ljDitz5I(9PRl`~l24T1KPD@%+TZ`aQP9UW2;*dPffA z8Ku6~zkpt%*Gzh>S6hd&bkUb5V5iOSJU?53m6I^w!-LTb>=W|LNj-}^T{8VYJEcDq z1N>QDQ%uLR*bhBgV%PvPv>&H6{#G^W7o45v*F)N(`dYkOdY>q$$IN|OlemCFzeN5V zEYO-cIiu8DnboiF6>|s{vZzhPS5ni^Ed};C-SG-FBAtF(KbSskXp0p#DO>@_wks>; z|4mMHM*h*K=6kr_-t!bh#Dr@zCz4edmku$;wL|u*D;v-){tl&EX)%^svu?5#q%@~O zzm7X+-LXxXCb`ijXp%~yx_eNE(9l?8C#x;!1hZ~(caUF$%t?1qqt(n=udv*z=g@YY zRVeVm;Yh&8(sK->shM@Wf&X+D!%u3@A>`(CY-8dMJd8h5XO?Ekx%fsMm3V+(gD#Af zX+3^L2bSe*!k+SlzijF5q=@5%eu1RypoHx%lq1U+x%Tt6cN+RR=QUZ-;hnnGl_lz4 z?RKLaLu~bHDXUG0fGYC|*^n*`Y7;;~otZG-X ziYTU(5!74W&-^dz>_37xjoL#4s^?l+hzyjou68vp=bOh$cm;wQRP#_zi9ZVHGK z2Y`VMP7|@>0}{43w{Aec0997kW~aSi2?_!qj1=FAiLQ5*Lnbr!0k#!OWYOm-TVsLXBh3PV$2#(sqrSvUV7U0_R2K|-WHAajjclNoT0#PbR zbT0MtKA9y_!n-k8D868NX52{f#io<}N4pQjJ;0lm5t6Xo-;g_g;8x_A4SY-{wEC4|gbR8RLa#d?Y#tG<#=idHC z*`52+1J5VujqL@KzhLF^R}g(&x>C;JYi?aGSTB96a=iKqIz zNdT%1*oU_tb+WL}9YY6l6}ILtaJ$+sM~uzPhsoBy&Bn2(ISbRaE2|nT{73L@Pd$vu zOYaTa$GPD2Kb9nb@6&#{a$$0Gm!~W?u*%Z?N1qp>(^W5Z{v+U(R2QdQY4VFq@l(BO zHj{mx^X1QA{RKCwXd6K$g=5;LeK)4}QUgG;)yG=hGmvai^--qaV9h!$Y<%dyMfE*W=frZsCe3Lo@`q=5m z=FSy=o`{y1w{gjG6|QHoXbt(o`QL!~L$Q zbSFvYke&+c&mMPty!h@XQ&-{!xH_~}qI2eIN4#{OhTt3 zbM4zW3%VhE!Y2F@(Dw5<4869=yVoq3uU+c4@;6Uvj*k7OKW6&oRqoQnWJC#vRuJV= zN(UtuF~#1M;IPOv6Z7L6sr|n%sYjC|zU;dJK}eQblq0Lj-=7V|kA^D3#M%X=-xY!t zmbr^Oq>{HC^RL_BaxWZ<#26|=nzc{4?O&`jh`D6MN`yW&vLz)+jd3Eawd(0s8x(Lfh>pC`!ik%`N$NdFG7q@ zlZc4jzTm#D56>B$h3K~9Wg6=Amd>WOBh#@p%a14TL6-kbp{i!1b7$>}-RH99r?ulS^SL;(F67Xq6vblkp$m7#heqez-y`T21t@_7f8T&{Tk zhD56JD*hR2$tSoVq4U@FfMHwAd0r()Fj~%g9M2LV8uFtb)cJTSw2)F(ie;_>;b($P zy>YR6i~If5x`OJ)bSWQ8Q=d@{wz!1%Y>-=! zukzq7IqtjpXwwqf(x?z=Jn5j|+WF=(PuCE?{=Sh>YM44&EoyFVG(vlr+r@vD>6&ib z;7?Jl42?}(9Ht=C)_So#=@;9gC=0Bd{soj>Z;AwY%~(mRTbsV}q!P}L58wOQ6I|a| zhdFo`<|IrBjP!%fHI#L#@ZB;14nlNiEE$F|Uy%FMS z{DqK`ZQzThSYAOQngz?!mHVYMIwQ0s7p1uvC2wh7RTG+QL7d{F)cF*el`=c9M8`LH z_gKI9GV_c%kX)fiL#8owQNMzVf7#L}-;LBUGHw~PaWts2>gaLW4~FnhJg6k&E$c{^ z;!CVkW+EcSzq5q@PWA?!zkb(`Z=y>}`yOEYJ5%bd%jTG7&Gh&bi#9CY5E(9+R!K!^ z3w}qSsK?#fpo*?`C*k~F?v+zBNM|nYR}lkE2YnE)Dxs)H-GWaB3_@IA&k&e~0B*|< zT*1XT672yeH-T7w1MhxsQKz|!;QbW(if?lH0^^%~9~nLYUR(ndWmsetR*g>EC0iyV z^yfSWuw?$o4yO7BfMIp0bH+RM7mfVs?+aQ66R+TMEnz3&{?80fk%l0apI^00+jAR3 z2g`8UgxQ6ePk^dVXBj3m0K@YDfFj@&8~{7DM21`aZaO}lAgMfM_?WVeB(@R= z&HVXdI$Ocw6##~$8eLi*jHJH(HY~mot4a$Gn92NgeNbNVNt|;x_y;~ueZGAKw$Yf>?mr&7$aqoP5aYO@P9=mEw&vVx>-h3>gYN*Q(1YDRLH4#!X%@7P;`XlBlf@wmgSL!e}UUT@t z@ooyT%iTS9DjnNZa4*!DLgI074O+Tz>!K5&f2H{Rl2(PR!qZ=N7(v$L;-z8<_TxjEx7_Fu-~DU1;3kKZ1`k zXGZ2w@@wcT>KbZmYHik138%jmoB{OFaz7e0x6dB~MLqz%( zj|t}*MXnyJ1mKwdv;$S9s)%>eX8{jid3emyZle~>`{||3yQ=?5sz=Ry)R1BJg*=%_fuyh@&0BTUyI;pB*gs(P4HQX+eRffo- z@Z@oxQ2`#jKrb9zO7xK7n8Tfc>Ijb=vmz*!f6CfqWhhXstMG_rKiAxdj=hH}FydYa zo_e~`L7>7z68_v*U}LCUd&=#aLyU)%=d$$SK;38HW$9Cimuj7N&O7(C;Cj#A;7v=9 z{cdX*uc-+7oxaoH0{|o(rSggQPX0c6@O1fYl+`^tzW}wKsBN7m+AZ-5AednN36WnHSJPhn?-FCpqh4K-e*S$ zxv73={z|Mi67x@?9y}*{3&fKmMzJZbNG7L*y1L5z0L;@9in{Tv3QL~Aupjo|$I%xv z6VgbQ%*VP}H76q>4wCeY#F0?Q!FC~|vO9AfQ@j}d)k3{J{$0!GG;$A(ZRKo@ZI3`n z&S0v^BefA`tH)ZJx#lhZMBf!X`NUH@-5WWFJ7#pD33K7@5`b%fZs}PC&~wN2iYTX3 z<6g=Gh}#k)f5A6NWQg2*5cFrrMX$4xg~jVlh-iLb7|AloQ$rr#$iuGQ!5 zVlM1sa#A3Ii({4*Z}-#eYdaLHLDZFpJPft>TlK2aKi#{RZld^UZfWb6r9B!9tbiQh z#Iv1lZfhYIjzC>l=n)g#X-iZjyJMb|5)PHn&HhZ^Q@jE%&T)K|ZOIs)hd3P5gE*8_ zVlQIt>wdhGl%G&Q#}W?~(Fcc%Fn&I@?CS;DdH2dMJUPjiMrGOJqB%9jqC89(KEHuG znI3e?0m9&IVGWJ?`Ku98Vo_qgW{1sx$vQ~+Yg6=Ygd8Tjtrf4~Eo*yY-q*kUZ9!WV zxq!~-uBj+qoO+c4_fk?LtEFl-lI{`d5xKaC*r|_fj9-t0C=o$p`9!~-v8zNzV0z>(uSU48$H*PnoP7g_dU2tucd#kGwN z%_W%af-)0g90?xhH$51Df|?2u*5U%l)Za4b_UTy2bUWQ?kS)t$TTY)s(d5^5I%s2a zc4#O~*0d9{kK2e6{(UE0W_65qVkS3A`W!lE={u|8@S(i!*?FO4Dx>`;IyY~&-N01g zsva8_K}EEO7;M(EMwO2UC2I4A*~DhT)ZT%zW&COTFvF?W8kcC#mGlgjrM{1P=GJib z<{3&X{bKJq&RR)f3?_svtdsY})O&cleMtPcwo-!fXIv%P8fr8$nrcGWrKT)Rbg^Gs zlU>J*{QB3@_{GKt7pg2AGk#ie6p8PAa2dcV`38JmT{gz-V3;>{B>uH=?NuyCTN(dH zFu_WV$ID2np0_r3*$RdF_u}K@QzqrNc6a&PZNF+lH>$4Ng$j^R>c zo8}4)fb2j+QE7K=7fp^I*EfnQH^tqxmaF>$Rr{yge=4_-uDHb;U)SY%y=7*J&rm>@ zjXBqK>p*%*D|Gva?Rja~s*cX_jsS0H1xqF^;MWc*GsOuWtAaVHwi{wM^Y(h1xCwd}1NG4#)e z{a~t%(4Eed7w@+IqoYQ&Wyfmf~S?s4DV%!*gA%u@!9TE^?vR2bP$W zRQD;+V!Hps=GPC<{u4g>D{D~SaL;MGk&+xp4-?oqcNdHG>n!@UHX1uctjJlDXN_GvAN@$3L> z2dIYpI8KAncIMAlV;fAWE`9%*GWi-S*7dH|KSf0cB7YBCBF1S_3B`VTOc{Tn#S*7=kJ(1k%T2^Cm2p4zrF4Q$49%CUDZ%Igz88VJ_!dR=znsXCyUzBWHpctKvL zFwA?Miz&rp9+ti7P$_&3!1pcZi2wy`!aRkw!Y)SGxuTMe32PBwZMR3njX0_YzMoVB(I0p?q(f zQ9udu6vRU2qRo{5&{Gn4+t$c!K`-W7oCTjMi0=f^rtBQY2u>VCF;;{rT5)E3)gVHX ze|KNLBp|qkKUQH~1~=PMN>DmPmZ&iCc`jY`L2u*cUFwHm9*7RIGQ$s!X+^J5XIEX~ zvS3AzF8+$Xl(UT@2UV*WSMu4i40x5O<5%FX2Kt_V!UNf_%7$!SOQQdl`E0A?OTUTZ z3hMnNuR`{Zg8k9Fjci{J*4Q-z{$-yu9Fm44A%R29+W^!ur_!L;b69{z}K3aB*g}40<7^4RY0|G4eyvIJu zrN(YCMHdRzVoMI}cWSX~2HzEZR#^tMDZFR3y&zwL;%mO^FCSz--*AJ6LOLXEAs(?MI%zt(8}I&f+V zFPWy{V;XzSR@)GWmCZy4a7n#aT<1_+4KxaY_xgHZe(Iq-H7QtbFg4*RRVQYfOHxbBj0S%v&8 zVH0Eb8SvNEu4y4ZVi(+bT2jdYRhjwmT0dDoKJr2=&@iYLAmxC^RL6#9QeuUi2x73h z5vpY4d2+gS&W-1}i@m)d?^t8fhoQ7IKN*dtPB>goq4XgxemCGNG1QJ?_tHoIit~`g z!n(U)G8r=(DJBJZ5`W`2@=xU)W>MGFUn(dJ1uH`^wk3}8OY@u!%JM^wj6Iq%#qWQl zGlz`MlTaY1HVlfd+NxJ=J?D2A1;&tJ>dZg54e7+!W`qM5Y4&HwKT!Kf;W<$RD@8lp4eMgqMF@{dYwv*^1DDDLrxp9d`#wxPbv&JSDl3hQce(rWd% z1qTI%d;RSBSbX~#SC9Vyg;|qc{9DU1!S%AP~q)bO+ zdDN}&>$Z;2*-G`sTz&>vd186SYS1cF5pdN7u7ac1msi0sos1~ayni~qr>Qyfg;`a* zU)xjoq%6j}lScXE?!voG393@e`r^pzD!khAE1 zVS{OH<3x?i>h{yNHyUp=P1JCU4pux>)m5BdD}$+$^^2gJ+uA3o!j`D#;`_?pnMogC zG$)t6P5NF({G7t=mc9fX2s5@dQ!t|t_|A)^8VP}9;{kuV9Q5v=h;RzOSHx@`YW?wz z);yprnJzm|T3FTJ7jUH^u=repz%|I`9v^&>hRT2W?gU4w(uJ~OI=xC4r2V(>G&}dV zCoM-0T!2PDt>6K0nM*DF%l$JB+27$sX)O;dvp}Lp7hI?cmX!!A@~sL<<&KxPlrrGl zf`r}96O~bI=1-uuEcr{r*0=8T#AA7aF|PN22yAtYT$tfYUD-+BsKx+5v>Ahr<$H}F z=1B>f*ZK97<7V#W$&7u*;Vi5njc6|~0$j9<#L1G>9w$XGZ{y~)kQ zY!3&oH{US0-z!A!372dKXviHT8K&x8KDv3v5_G-Um`FkrkLgGkDNkBYKX6O#bXi)f5EN|3?s6`!voq z(qIa+4b_lX$!~Kj=(kcgkW~fO;-?)S?jNBSy+sG`9#0zoT7hkzr>po#y(-?D$()n$ zJ%j`F34a`BR94D+|ADd7Q$mCU>&_|@kEPZ#d-}obPpBr!vGOJc()aNU>_G1%6<*N( zqGo0Gj&z0M=HHXT4bo|}$oKa}>grsCJ@-oktcd#XjADruHGDf9jqm+U{x^Ivie)@yMTqqE+IMF0TLGF@4i_FW@bVj~$%A^r+a~pt2||)X z3WrB~7wNJMdVm$RqV)T3w(&s7Fao{%JddW{{8=9+z}u)XmF9*ycyTCHRtPV-X1+*g zm%ev`FSv`J`4W7I!&8%2)C&^0()>hXS&aW@K@yOUl0fPtAj&mOv@3Z7_rXNN#rRYG z2-YN1Y9PD&z6;_Py=z`7TUHb{vn8a0dreDA%iVDeN-qwrv2fwPGSks4!b~SU=A`SA z6+TmEdsVs1m7x3bBy47~wod5?obU%Rb$MA}Y-sH)4-otARF(g}wRFEdN_$^+q3Y)i zZA!Mvd8L?ce4l`rZZM}W)vh|&XzcDB1E&SZ;B>;%50D*VLSHEMVlQiHNT#?q8=|APUrM`;mSX+0-Ji{AbwgI;2ZvV!YA#}&_x<+~) zD5dQDR!~67bz>yXTm2(vgDsQ&E5-gZ`w1)GrYjtEh8TwNMtOcHo7{_* zCa5(Im9-NjGmIz}^8xBFL`l^4 za%Cp&OHDG&^85%C;rQ|OQjr-D5YQP0KV}va>^u3b(JHJKoHSO3@D&?4B+|J7ws*d1 z%zXD+CRn+_{JRoJ0-vz_;`gFaroj(eDXpuy=cuxw-Y= zvu8cu+&H={;VO!#+QmcE7a#JB_9+KbeNE$sXJ4g`q{=m9S||ZOv`kZZ?xH3=!66AN zAtpFzWe3y>XVYvoXh7p2gGtV~C-vb?_b!;$&KMC`nR}52z4Tm|A$ls7sOJ8F^EH=o zza?XbX(VCl-;GL->bSS#DOl_a7y9rYCnqP4{q=lce=YS3`f8y20vXedqHeJWjyxdR z)Ryeq%wI6RByd^1J!}|M6>SdLs1k6ms)mqJu%x_YONG5ujm@B=!1}WW9F4NMKnvuV zd#DG*0&X!2HJdUVm(5vhX?0Nh(CR`#=OQfxB7Nbz)BBU7quC>uVB8DLK^;_S3)qox z@x=jGlBX1tW3ng2c1g1#kq!9XAzLZRUDMucQeHxp+1HM71~xAt5#mq#|I|ESn zDN|EQwD;Sj?HD(O&ONjoDz7(k4E;S%&8Gav$nnTIe^czYDTV&aVvf)<7{suqS{Wb} z{78D0xGeDvH=N}2;cHNU*k5|#14qj#oTW)`v^AOG5=OPg`rO8w2?+yu`f!K4rrHFQ z)34n{UUw=M8wdKDT!65SqbP{-^NCm>f2F`zDQlWt#l5PkC|H*Swc9V?UIKiQi6%Y= z`{bZl0;miMMOrP)m;@UO%2R%cgf{^IfIj%Jmd@N2TLBJwu%}a4RBP6jW12Z;Z$~y9 zJV5$yo;#*+awXcTkxe0_zvSUe@utfG3+Ox9 zqipwIJ&4!4KUUekXd>xuwZE@ZrMJ$=no9!u|WIO0<@%YLW7$97*E~BM054WyG-!>Gp z+AP}cuY8l^WjV`zsU&YVa@!Jh9D5pdz!gZ|Mw1s*{m-lyQ-$+SACx9clxNI8@ct2= zMYQ#Qe|gYhRioDv6iYw}RtWAWMfYLOL8IhZ6++E?Q223QwaB-rT@#a8DBz{1B~wm` z1(s&DsCqG=@S+GGnNvxEL733QE6XnR?{*2n;P7E!@fG}R#NWX!ldnYyc}QfcFx|i; z=|GtKNppTYfnopJS&|bxh~5K-U%%)CNosSkRKxs|Z=ek{H_rJkxz+R>gf;XpBR>qD zd4@+1Tu3OI9OSRd*v#KJfZXP#Z%k_39v|!o@(?pF+a;d8mH@w25d`2@;DXwn8sZgZ-cK!P)^?sRqVKT8+V*oVRa*nLm^53 zn+qf3n$!FIf=@)C;(>|@)`>Xt8(>I9Q1+e;NurS4v40)l?`)p7%f#F zGFj~so&_IZxCpdc3ajgvJ5;Il9<507_3b4t{Ej_*JN>q(_7k0mGQ*FF@_FLI;j$%_ z!iy{?DHnu|)sSvQC7lmPd73BR>|iklgXw4Z(TOVXx8WRwYx9s!i%ATq^BsMu(yU*Q z@|vJ`42_1S#_3cbwI2|t07J=j;UTU^Ml;TN{?^(JTlnqe^3{4FLff)>)}X_2&PV=$ zttRw6m7Ee)kJIRKpyx<%!6+EQ_eW<|XaDz(N8>rAx3ZK2K+lIkR?|_6v1+LCD9AsW zWXaL}+@ZUJRR9+Y3v1{8WJuy8@b&Wwf%}{14eGrc{Z}_;t6oJu)6C_yxG0e-9Zhpf z)>Y~kFpIQhgljU3%eCksQ9F|`DC(kWp3za+V;2O zO}zgj5UrY!W$<({$c<>qta`!4IT>gk4sP~%uCQpi$8MkV43WFU8Ip8=37&`NH~v2W zgF$@0v*GGM*4SCP)deAAY!2<<{!MIMp*W~lmQd=zL7xNPp#B|jz;Yl zvCvHkURMa_9w@cw#?ia!P&;mp;eCx{p_)g_hX+|<-w5Av5b~AH+_ehz8(p5r1c;Be zIAQTwX4NFZ;T^(RfNj8c?{u+MQK)%HU>L}IicUE3cfm@HOSP1wGqy3h$i#QOo&Nw8 zZL&Dzo+_dV%FqFFc|2I~bqq;0n=;L_lz5bQV;TTqIHQgsD~{Wk%XPlo5HSy#j4ika z;lI6D3c?~W8>MWlUfw7eiGtC$j}rDEStMW~w=wg7S_pi)Fv>zQTaFGsjq9FG#WZp> zq*n3)Z@F}0zR=~Yutw;LJ^rt!6#`-zBDXeMcmDNaIkJe5+&GQbb)bY~yhO8F`EMcR z_NWEYh{+whJM%M+^sw~4Zf|0h z0>&=Yxb-R#$WJKS$|xh)wYPl;4UOKnb1O9%T5^USC!xbrN>MDkgGN>;$ zZ-DH%n4KLfR;EZ?AtOK2o?`vT_G5!vCpF5D^e%}yXQ=45Eh$7=4@T+z8Kj;vsHM^X z<%@;Z+WXnLpNP81ot*7Vo|&OOQ<}3yqynQvbWNbNR+DCT3b@QM2W%g63?l9Dc2zdp z)aN>L>z5C&TK@p0`bpEJrF6{VQ(I(FMApX$V~wKQ_iuhK?)~eO%+FTDL~@3XIQf5B zVwMIp5)5c081r~ZS{9=#%fen2LgYVptq`#v-a#<%R+9+*R1-&y-rs@+lQvTAC>k4F z3)V##NB!gtZz>4{f3XJhQ?%_au4%}t>-0<-W|#zosOlY<3l_nj7iZqwcr7K`Yj;gm z8h2NVL1=9cNvm2SPtw6i?ByeMwk#sd&)2&b@52?lx$N_i6)H$0VhJtf@gN7@K*By0 z4cX0=1bat5QMDDZe)5oi7N9N5`%oFKK-T5_T?JCE4p;|lUM>Oj^{#f*tG#s9WFnXJ zrFWx%eG8SXo26@j+BLq#D;(&AWKGM=NVRz>?94wxVEa_t#EiPY|zLu?IE%_G@I60wOW`!>B{jP!*g1y$*LG}3PKr6oScQoaB;)EO?;}b zke(?dA{&T-u^vB1v1*b=AVqN(46Obv5d|uS87&_p=}ZB_3fR&B$DLEvTDjU_>`<1i62;V2p-Kgl!vc&71A`AZX@}e7&J3 z%i-#D5>w~p63Le~^b2!DL*a6@{Z~P=&>B#*9+}blLE#y^j;0!ojn=VPOju)s;f@?| zb+O5l&9mtrUfW+amQ5^lW1~(;7fjz)uoH+X3Yfz3FaENXFG#73H-);*rW0@}U z5}2wY-dOdPFV}~1RI(j0g!a?hbY+{~^e$SC`W13|OH*2Ui0ddT3XZlSxN_vhy@{uL z(brQ?H+iFUg!Png`B02C;5nE}Az{`oy_L3a4fL-@uUs@tx<;NFs&OeLgj`4mi39K5 z>~&RhaymAQDysy!qYTe#om*i?O)B`^1Y==bzGLbnx3q(S)~YrMq#+*HXR^IIZ!V*e zWxm380snu$?2aruDjPuG2CeV8$m${0Kzf>3x1GU-FNP) zwW?U?Agm&%jA=>BF+=;8ElmXE=r)nX85xzpBX&{dUMqM!>H|~~(vgQL6|6S?36gOW zNw65lXPc-vzp*S;3^G)01jvMhF&AOp`}_TiR3oUqY}u|WVs5g2{{Uj=lW|QjpD>Nb z-63xFu8c-9FcC@@5py`kU$F!+jFlH<@_7p@UBBY$1cgp}5)G!%`GoD|R-A=LnuJ5v zwZwP69e6CUP%<^5U!)hz#$0`hRIfE=);};LULv>C=~b2kRT`kfn+NJZj=hTElVF>ga75=oBIJFW42Rfx**F3|~g)BvW6?D;@AyqmYH z0FxYLn(s*VkOEc}mu2xFhG9EMV=T|h+$bv4LzqaifN-?8lloK%h?{0s@{S@zJ?+O7 z3p8PLW3#%_x&DkB;;d_Ql_*qm4c2C45SEXJXBc@uX6HZJx#HZK`t1tz<8T&l0dIe$ zbGDnMbsB$L^_M50*7&)8l}HzOvY;(<%0EgZY}h%zs<5RSMVPsZgCZ4VE64D)0+8mn z!iz@3m(a+BcB>0(``&~=w#&Z-LNXtkfjdZ&7ll|0meKzJc>poy{iqDTxdbu}T*Z|J z+eGVDkmf2ILEv2^4Qzm)1m$_gl@}iWhTT z%!wZI44}sJ2dnpx8?Gym7kyM2K$fD7cZmiOBrGmP5d^=(AU$si0^|_YRY5@x)~aaf z;%?l8!ry8RKTLG3qp0o*2xZbo%E$UR{+HhCH&!k;OKZlQ({};Xc`ZBfhL$ zRR=|*WVYVd^{uGsDf2FZ^d;g%Ek}>gh**rQL1S@d?3QF2eQJkmqeS_NDHy&FxpT2s zAHMGr$7WCn6W;o$3%+U&W?|V$Ab2Ek`*BBF`4E(yq4o-bEP+Uv2I9)y zWLywalSwgtf<32vrIbH=u6ERSu96ussQoDvovU~N{1*#bH+t6s?zhlAY69<86o`G| zKyN;7UgZF}hnJPO{{T`5N@pvr`bkbo#TjGuxR+XmmfQJ|NgO9oR*3s;S6ZUhZK-KO zo*4jh8{u;HR=7NNwrI*Y?YLpc#dEh_A#3V#Vn&I7RKMR(y(a7@F5eW^A zmD{a7v)DC6hEd7qHe|%&-xgbDRUCx$6n7Mn#vvWVa(X)5VdoSzL0cHx9iT&SiEex! zbG{2JY}IPunmT*tBidx#BHc={PC%xR>GFt?T==l}b>Ok0o)_5p(dOsw!>MgqVvNpY zKqHi7?DkvOrzb;AHIhemTgKKdABxl$XC2mv=9jAMH=t=G&0upBoC~|OfvLroWQ4O9iDOmw1j1JgWIRZFkT%RVkt6%(JMa5e)JP?5q9bjkyhw0wrC?GV!yuN-gr5-|*E$8L6CItRL|m_LbFHw1 zYP|GuPaULVY;DETE{VjgJt+}-~G1&)b^X4#OPxlsm_48zNK?r)9{f(S%xk}z!1Ia=gf-w{Qc(5(J$ z;kMIm4~Mm9ozKWog{fiLK^Tk=!rlXl)}x#B*9?}=ZK6IVWLbz@?sw##RwDTS0g=HMp4q_`=zQyZVMvSTmuOcDbHjm(f$L88`kDJL$ zt7cz{font7Y^yws$Yc}E8IJp~{1=~AxsAb7yi#5nkEpKY_Ad?~lA(k|ZZDhKS{P(` zY3~U$c6zv=SmT18poC+$5xVaV9b48^Rk`Y|xQIsQCbx6$;ewHKXwgS-jldj4c&ib{ zQV~hn7Ruh@0Je!Ka51hL1_Pwj45yuz=c94~%PG1K> z9MtejRe5G64cWI29n7FeBIY(-aeWM|F2|c{TRiCR}kejh^2n~Fh@Z4Mm=zr@GomR+>?v8 z(7h%>QD|uxe3ZYYk9d6?SyoJTly%Tn#xlVm%@Jn4GR2i4XlA?JK_JN22_S9PWJ$|!Ps$dSMOlu>?i44}ooePl~0q7dfh z%7IIY2yU|E7P;;r>f`F5(CLkM(3%?HI63l{Vf-Fw#U%XgaB@nZ7AC5=f5 zW)dFBF*m{SLFkmQ-s} zx=PZJd41Fj9Y`8N%ArkNRCd%Ay`>^C`p6_4es@x#CA_{b5(zeA+=)qQ1`*7F+!;^> zBbepNJz|O{X-Ln#m%Rg9V4%VTl0b?wBO#1B$hlE!a%nH<2mb(jAmHBy;_HRAT`Q&Z z)#MYF)0RS*hsDF-%bl&8y?g^{{_=ox??7DFa@^ExBV$ zAjK?Y0mpEkV~Z0%AA$&J==_QjiYW-9VYQ;``c`9ua?NOm&Bhk&`y=Y^!IrQHu?%2Y za4p0;x1b>@0JD|ZTz%&6L0&jxo^7ZRM_iC1l*FzO#9T|Vf)dejL?khPCn6qUddyjnAz~b*X+%yeTpxcGt#-QG(V1$;NBSFBW6~Z{T29<4 zh6`LV7cOTf$A@z&n(Z5=ExhbCN27<EU67j0lKKTwGC>Lk%0#$7~jm5bu7n zd~sQdvRK+blvybA_Q$j6e)X(F9YftV)NL*Jxo{S47<*P$&9zbK38spaOh`u@t!ZM# zk6!f}mR_BFZdS8ZVA3~vMMX&yk2cZ&00qLfy&mg$-3Eap(3&)921zTTjBsa@kJ!Cc z)w|1W3M^>~k1CE5{8+w$>m~L?Q6FuMMJMzLLm@2hHv^# zDi`2yA=he3(h#htC~?X}JHWlTtg(xIOQnLagakyOa@{DF;=}M#V%co~_kNQe&!Jly zx{7*;Dei*d7_*5M{oa+xNk&pjH=ny|IFpZu7F$->)aA7+jEF_D*~5D}RI+O5-k^rr z2yyBj{`9d_k`e61vfp!M@h*&0s2SMbHH znB^6$HQOSNF)O<+W!Y8~gv^Mpv_~rsg|Xx9PzdSR20|ei@5h(5?N$_|VT7{!uEW22 z3bBl`meiplAQv2N!*lgupiDAtW4wffpDO~f9FVce*~{S`S5PCUj!m3`1Tnq4oVTkQ z(b0W!?8_~=y(^wA$zH2L+(IHmECX%U?=M1|RaLWFHjQ|ryhuoSpT7k*tF3INSRb%d zD5N>R1QG21aUd=K0C@tGZEjvwX-95i?Fs_is?d&3UstIFWI4P>fVR(A->p&#L-mkD zy##wdw~8cM-?&gMzgNPn8#m_c@}LU@3PR#P>Y%YlT~ngwDQRjYr#}>B`1Ly6lZ&p< z{U%Elp`>Z{gZ}_Hr`-Pl5&g=tPA=O<>FPZ$B2;xlH+T-`A8RU0WHKOar>)9@OuXHc z8SJ3Imof&qxlm;TB3S+%6bBow`KSUUNxxMTUweWKpvGJfWfBla+Cd@=d&mvKiW$Cg zBo+t(MFGS)kt`s`-bD|4>YzFQ0BQquyx+MJ1hVp=E^f*O?A(Cff4u_opvoy3c90=S z^H4)4WNzl_Qaoo)YetsScMVlx5M8<$eB5|@8BR`>t5zi(QRU|9VO-r2-6t_~b*oBD zftb0JDGt#2tyU%*_Ib+GN)o_4R-lsC+4F4uRSGc3{Kb@dzj`F4Pyxz0m59WoKFy=w zZt_6ePG407e7wBgssa*lyR+Pa#3bLj1?XvJlx`8Ud&y=^#kSG3Ek4lgv_P$YYUOJ? z)~3^zQq#sfre&0E?qsQZG;!neeP!9_Y$^LbvJJ%-Dh`^2yx6O%Y}rSX-BiWM`#vNV z2LwXIWt5Oz(E2W~PU%W|3MdMurgE}4gNwiHZ%WbB$?{&J(Jm2dA4obEKvzkaX=HIH z!QXcCkRARErw@F$J^Dk;dQ8*?=;v4>(Zi-F^w3KH)CBZ+;KJ_g%=}v&*zR}S?4o03 z)^~?nss8{cO(&=IZY@2h^wkEa=vkSH8T5m-<}bjlcNS)TtVx~wuvHcH%4Yjc(7C2Q zOqDa}I*lc&8qcG3(kf=gNNAmgR`d%o6Fd4H+25-a!`#gM@w3Twa9nklMYb3_Rm9HE z)t!_&Pe-SGy8_OYv@D)I3K75m0FIg2cDGkO9;^K>vp2}kqmJg%5r2}ZN%F$0{$#ul zqn?el?@GGM9){2~%{4{4NoJMpiU4Q9%*%cay}RA<+|HsScWYWJ8_U>3R9D1zB(5oM<%e^k96Ng8qGd~)6~sRRU0vhgWVj! z{0s}MUkCK=c6MiHWiuN(*3oF*9fw38C;emTZl0q^Q_D}HG!-#8&7~`y+B{jYb{1}D zX5Rc6y4`F>>9yj#o%MIge?W$duBg#HE9&-@o{kfqT5++h5Emle5}WR3@T=L8t2^_n zt@#>i9*2`nN361G`YOFH6tcW}8Wwk&nVhz7B#!(yV$96k4WAyRwNACCY<6*7B6L%! z`V&OyohL)mT?UrYF%y_*xak;9LUX~zi)#Eacj45cVmTL#?7sw%bgtbS2sv{D_H8Os|p&8 z6HYS6OfYR8q?}FI8SZOe5W|DV2~SHLL9CkTqBVC&NGx7MA%Vyk@M6Tr z2lis#mAL!Um%17rl6oQ1ogFnTMAO5hG-XTS4Q)O)yWx%w-A?Vjx4S!ateDwRZP9dj z(SDQZ2eR++EqRZOT-DPmHBQpC}ulhNal0!_v+}ztGP3b>ORHa zZshngGc%K8*S*_wI;6z8%~912DX#ihbbgD4q?ZehLwiCo@e}no+Oe}cJpj54(UHsK zQ)||Vk4j^2l0CTH;ofZc{4rUvm(=r)kTnNOY7UhOJtr9X(RYTTC&oEhxVXQgb}akb zA7Y7(l@q&{5pGqDdIqa>T-w#BnqN=R={##RZO@fUAOy_qw# z?Bd2XjCa~cqV~|;8_{b$UXs~QT4FFzY&VlTz7Kug7INk8Zne8|-8=Kyok!@CNo$1! znn^0+~U+yzkb$?3!aq`d3(KNd) zg_|sbSYvbD&4&iywqs~yPV(in7L0v0ru2S|+U!QIqB?!0w^?y87grkXl+IoNYxED(l(ST z9S2Mz5wjGvb#H`li|}`BI{KT7{2gE-DYL`kKY?RsNi za$@dpIg5Q&meY&!$cJIzpDPhNneFCKO=?(du2q zp4NMt2g`>C;sdJ~W&kTKxJiH;BK#l0@8 zx{qphM|r=NH*%dQbW^4JHJX^}=Zd#R)nl-&r^eEJF}2zFJ{$Vk+k@_WIo`9U)z+7d zPL3FPtrh2b7PNg4={+S)OBn!7Q7FVNWoWaLvopK(HvTH&H=U6)v~Km!_yEzmGFGM2 zT_9*}7o;%2sY3}IU(<1mx5byHG-5i-&EHIOh;scRbW5c=GnR&`S*f&^h^s4Mtft1& zd@*Kr>UVAJgS$I*shv5cxAiJDBK6zWrKwtjU#_}nXtY%|^WfxC8DShl<1Xg=S6b=T zTxU|z)#*jh4vVImI$GU+(G>bfGQA_P<90kZ$j|pzTt2rv=iKtWKdX{xU23b*k<<>7 zni`KMBBaH{jkj)WF~=R=)e{`{c8T6MdTbvj=^@c^Ppw+Xqcv-6*(02V%h*_uwmyb; zS2g#`j9c9fXQUpD>9s&Kbd>sjhfPz}IkZPhy@Z1dab|L6ZSB^k)!)|XTW{)1sGSnm z>zx$ZPFd-+E`*7k3rJPHqC~~M*4>UB?(Ep^#}tb0nYP@W9Nh&qeGHT8-m_@!WRjR& z<)(p{B=$B0Tm86Vw;yz;FMK@9Md)hXGo-1sWK{B&kdk4DX~nS3-1zXruO1jE+0&!c zCFm@ z^IF5igt4_k-DgIcr9rKlcA6a}rYW>sLnLDH%FlgMkzun2?|d-F9oV+#Rao9rY1!+2 zFzN=cYYw-SO@6sjXd0g<0D4Jj*xtrx!THB?`xi?@O!afD%tuE(@@J-om!v&698-Bq z$3XGzu)&N*P+=zaw)HgX+w^MU=v)b&r&%?hM(WAcVM!#)pec?g7#9 zkeM;~alM`2(Q3WDTeCl@rXQ33n{8&QgGhNMj-jFkd9#x4eedZfizy$&W{OS3YpJ<^>0@bdjDqN_Akl9G<9C#I;S zk;ZtWY#ujm3!g_$uS0{NohM(RwSP(I>aeJ7CkxFXO&-QN5oTw^j~B(azf*AFuNn0t zCd!|nS`9L9Pop*OL{@1mF?vXZNuAq{_BVVRzSX$>Y|rX>p0aA?ZmQ{OogJhiD5`0S z!Uud=+1nO&eztaYcJ`>4+mhmUYYI4wL?jWlxIbFPx*b8(8jW_+)6!DbQc?s_Jo8Ie zCAP-cGrs10ce{S|u^YB$7kN$4W{1*sG1BPWebE(~NLlQq02jIYnc7Ep_%gg>-sP10 zo^7o90=ran?M{l)Ftl}WJ|x)U1kTv833aowiH*4~Cw^~P={%jf4AfWMi#%@q-=QVa z-dII^($7Xa`VQB(VrLf#EqCtNw-m3IN%KR(e3bl*V;L?m&vy&At~mG|a&}!6YD_&O zX^FICx=^%S`!bRK=Vn@QjokfijH%EXQmaMPg_SgO94;-x zF6YD1xkY1X*|R&w?!QoaE&l8@9-7ki8d>ySjM0E@^7%g2{H{d9m~g?FzOyTe@68i! zxilJ&s5)m`w5(b`Ma0uhh0|0>_QeplSwB~?v3FTo%udkTS|&G_q11E_qGy??Ute@M z>2}D}m<~61e@Tu%3{~Uxqc5rFdiAI}UsCGFMQK=tr6yvEXx|v+7VQiE$KK1G<7({b zOT=4vSkRpnzMkm2O6#YWlqEwe#reO@=YlQ zjmcFY!sC_3P0ML#TUR%v>xV^>=uK1AZDfN=1!Q_=oC)b#3pRMh(lfE#_i@96cdqlL zYeUc9Rwi`zL#v$>)ayq_dPiAlYKls#O2DI!M+H5_Gn2&3?00VcFAN`trErR6S+qM_ zQY(0@x*a3X6dJv&^>uo0Tl8*^($G?!Pv(%eNeRSUm@#t~#qh&(Kcf{>rL=D{=Ni*# z+O_2H{V}8bwi36TS312mtIzb7i>ulY?8v)WS4!FCwwq5?3BXpIWe=)Ly=>uaJJDY^ zXNoZ(`@Y3MxBE~qlY#~r5J)mNXizQ9Y6`O!Ul5`d?(m?Dvs>Ztp!BU-(nDRMVZgJ1 z*iGSfUq-ghimPEuCf8;o*pqsvM#@PxLPy%Sat|xhno#tXl#raVF<2|Zt8DJ)WH95( zU2DqdnmqXrnX@q8o^80;HmE^EIBMq=7+ zB{{9-63v+ynn4bJQ{}}4awz2+h)A*EY5*~`R~X$PH{h%TB%4i;j?Uq7yt^!*5Xj;r zC(Jkv<-_2}B#^DlIfzGf%EfUb0={u8OO=Ovi>ML9Pvu)n%3DaT#!RkQbu7iXEo{s? zL_y86-I>3sbYQeCAS*;Ugt+@10__^$O{QLnPUVM6-6S;-Q9&Y?4cg>_>51l~|4$JUs8kyiCdk zTB)LzK_ZxG%!<(tvV3?Vmn4oe%wBKABfEbNq)HlmV!AUCu!`o)-FuKp$Tr3!cw>w9 z2hf5!Bsc_f4f60ltWZbHBX!Z3kJiJz0|MD&HEXe|nhbc93w zCh0z&zlyw^@pl>@U9@JFv}2oNKlC$Xe}nLKO>c&7U%?QVWbBd#jF2~LnFD*s3s4)m zkThkN-puF$L6jJ|&;)}h1Og0pQ7odE?4Zg7-P!mcVetKk4_lYrM2=!WZ_AYwUeDe^ zlo);_i5&j`JBlfk7$W6Be;JS{txjfT#pzm)7efQMp8Ns|-?RxVgM41UpCC4Y`%15jQQ@cZi^bNsPN+>Y#2x=CqIl z;=AC063z4=k`apbvi70TROj&WiP`@E6?W>)K8qbOVg2Sk z9QS^3i~N;RPnH#5^Ci6bFKX-*{{SaFbkY&&s!dw0(v>n&9-6B*0H%yU1YOD9u)*X! z9~RzBw!IN~@k7rWGs0oYW#MMzVv-kd)HePe?bYCnzJFB{TRCO5Wb)Q6Q zE}WnerK_mX)p5*6jA4nB2|Ken1G{75b+Vl}n3?3c@`bFEQ9ez*8S2K3C#R&+G~qp7 z&vwrRZOKlMCS5IA-*m|?~A*rb$g9mg7*!{VcbI401gl6 zb0_$#O!at~v$H$C_gvQYU12iTuajLZb#uJ6dNQC!Ig5EaG`luzebZ+7t9sR)Eby4) z`UPU%tMY%=QPur+8VTK+i%N%+8y72|5Xa+){Pj`Q&U!UEYoqCDdQd%9fJ@HS2t-A{ z2ubc@^xzMR`yFQ7_E)QSNAil(@z1O@8ofsB6j~mfLcx8^WX-$aEDiB>mY-2r^|u{9 z%6bD;bw^jJ3F4s`9OMz)#^4~r@886q+W4)vD2Qcx%)EbAG|fh@Y03>FN@X0>^9i$y z@oaaq`W>-n_NZIazEe6b8a;KQtB6=mu92QxJ47Voi~KEbg1dD^dM>Yr%XKDr;n!_iV>}4-l`{)tgOlw?tF27io2J=B%c}WIRLmVF%N%yb-boAX zAA9hA4Z*%Ep01?UcB`h2oLaltt$ALC$5(ZGNoz)xheznDIV$U9 z(Uh2V0`ugG_5yt>}uEY+eew`%S&9?7H_;9cCQ+ z*q)It*QJda`J3eNtJIQd8f_|6wV(l6M<&uUZ#>MxU3fNMg6VkMP9e&ZzNE^p$(Ko< zjnyrDuZ{7Nnh={oL4<&hP%fcgs(b{X~iTv5}bJ5g)oM^P$(^a!aSw|+)7xR)cFq3#$+XG*;j-Jkh6F+`!e0k=e}bylnr&`PS4%pXey z)1y*vd{t7@Km_}&jGP&;>TTHjUDVp#<+ZOT6Qg5cnxF=4p+zI&+wm8D`_$ETeN)ml zqtMpsj;!b+)@>cDv{Z1hY^!7u+mi^h9`bB(#GU;lyUcQk-RFttGqal14NK6Phpm*F zSUN<|GDRDZ$xbyfi^wF;h~u>OKf#tnL{9svW@a|o%4-I;&}w&1^?G|pY;=x}3ZRwV zn1qH_mKJFo37-dcb1uFtre|wz=@BzsrO|6gM%pK(T`gCp^*dOo=d7rAmZL^h6|xCC zZ+7iBvD*($3wc|eWf3^?v^jASu+yGxXJ+}|Gc6{_uK{{W-7 z=ZjtSe`@gxhb?B&dS^&z*<*N)3XmhV_hx1mCw;(Jdl_x~tf!eDL)u8R7eJcZS4k_3 zu+KY$f>^k_#T#PJ-q_-l@|W{GC8c+g83PNia$;w}+4`Rq$<^;)DUCT%`JYv(q>;u6 zqdJ+I>=@0M7;*Z=^scwIJ2_L<<$g}{yd5UfG-Tnorqzhif2) zTgU_-7xt8nUfdU3a)^XeoXoseL2CteuIXA@+IKkWDTrkWLGTeQd3W_c2V8S>!Ry~C z`Y5S&pG9dHViuCRlL>ckcLLn+@Fs7AF1PCANZqsPA5B$g?~}%=K}{pa<*fvBVZP|t z2%LVFZ=r1YV61qh<2tJ>+B;8Zs)|WkGYZIv3mxq2Ou5HbN$B*il=*oUzfwpMUh>dK zjt_<}e2w@sE|#686pi8KTdfii^UTn3DiNg&hm|k$BTKQ-nQOYMSRkmqV3%YYtvxkYe?98 zB4x4COL?K;mY9t}2RV-5TwaBpSJxSJKU(xPd@;C7PcX?KgW}lmFn?&`-xU#kr*dh$ zZ1r!HHm}o$vFPn&qrj+i!~$&~w&y$HQdc8P?A#?8xVB(rSG{YM;s9ShUSHAzN27#_|JTOeA3wGe1@gMD6WK zW%D~f>^EMMG z`1Rt8Lh zy9MI6o%A%kkD+>8jr4Cpy%~fP6+6XA2m|qL)Z>FbJa{i$-f38vc_~P~rJ`Fdg7u)g;D3J%xxy%Mw2! z)810+dEHbpMOiQxiPz4sk{oVQwTTAuxOuw2YJjp1)I^8itXid;YaRT=Ib2i?)~)HI z(RxBKy6C0K;$6?d2c<)#7zRD9(cPBv7r=f#mCq*PZ!U@~vXIAiSN8X&MkygE$hz9AS$6^5h+NnY^yAql&XLRG3|3Rb>Q7;lJPCF1y!UXQ63hR zxNi2TV$l%XL)j7DCB0aOW18zkhTYz-2%L;Cgb|4pf+Nj$wG@P^nv|@!X%TZ6@D_E? zCgRumV0l!)@$CQyFpqaq#XyQW{rA#L3M+T;NZ<&^^L{<5SE zpRodvx%PQ@AW{`+1UY@x0T3rT1XeL`_8?Lmz9buM6Rnz4Ls~FY6p#<|GiMKnTP?{r zyG;wyJq2M|SU;QP@fP_0vvByXnK9TyR1%1o5Xc3AY@2Ejo<8`Hy^5j zHzJ2+63wWfTo41n06rv1b0UUh0Qis=w`(#2+^83Shk6Cx19hk)5#|2?Nl5TH3Cz7- zwGPPcVE1~E5)+W-D}4fhry#q;Ut$RAB=xg;t18Sw{`BDXlcM98wV+7XY?*sv%V&poc1MsvR&9LjqKgU8dAv(g=m2GBiw?lBO%re zk&I<;F%I!;RUxC((*bD$j0WM00K3BdYpp8s-pzR9{cExpsl^7`guP@PCXXz>swk)F6pHpjS^}O3zbvI7*H>~;`w2;9T zlZ~R%F-H`auv;VA#O=ErLHJ|TrebR@u`y_SFH3rWeLvCY&34p-hQ4>E8hXthQiw|# zGrO}r&dqaN?CkE?vkSI3tF&d#9IH5TmcOCigY=f5YY=OeySy3)MQD*Jf;r~`Ba+u) ze6H-w*y7EOF6_+AvbEcsw$|P@hm>n(xBmcl{V++Vgh(N)(lKmAxU^#80gtB9Y<((b zcb(S}wRU#DE!aG(q*^$7NQw%L=caR6a{u z;h?pLQgx%Ejbg109~PXtN(z}Bn0BNLE-df5=5UOKy4{_);f}|+yi86|$n+G#c%y!V&o$N!s#&hR@r9iv!(; z3`2wA#aCEz@>_pX%IUsH{U=8qOqH4zpGMPD#!?*sNI|#0MMZQZI14+z4H*$X4&|Fm zuX$HZ@*>tsJrUBx^p$fA1*CLzl+^BTgA}ZBn-8_vOAkw6mFlf%-l`oZe4lmKRcbWu zlAA@ex*C+^ne>2EM`1+exUF)#9qqdee-)Dsk*ixoN3Gdtr*H2T)>p@O=K$aT0N-@$ zeNR2V%xeBeI?qX=!&o#9o|I{HHnGOg!!(6!G>pVAi|}S4JQ?4tTfHF{k6bs}Q{>yO zx<5+EO-Vr>lBBx`>f)X;5+0{^B4=&fTMuR`ahB%}&s#>5q7H|PQ#`IJong|awW}CQ z7Kxq4=YK_@BG~cX>t~c~nDJY5e7}hQBLf`(2PyYb6 zfBkh{q)#JkDbCj8Wqvw`g&=>#J&XV z{{TxW+Ectc`p9&argR^rG=8|%43)J-Wep^Npz?^zz^&%LOhpj~qc_oWRT9Fg6FRSiIF z-Mm}g@3S95Z6@&F^s8A#seK%1-9x0Sj;gtdrLHi1SYGEhXY{!{VBByW{8=ZLCdWD5 z;={86%lDM6BvZ=-@y#5s9PyJF81WKk#hpm{qeaQ1H0S2NlV)%hrqL3N;@n0-efWDk z==@oA`rN-o^6r_^v+2z(S)?jo8S17fjJ+iI;LDS%+w`3P^y|^)hm%H65BEu;17|%X zro!gV%*6iy8%5dpacoujp&nUtx|`5OpM5(GPOwu)qO?shwA0Bn;P(i=E-h=m7~#e6 zW@V9C^|oyur#;iJNK{(Yu7@o=>{L{-H8c()kfmg z>6f9cSE$vABa=wzz!+wwG69jDfq;h>d<3x(cE=1^)=j4L-%YVtrS{Zv-5hi)r1e)? zs5OUMMhy$2sOkbnDw%>wCYKi3h}!Sk!;f<1O*x6)&ezn7MAp32K2uEZ(uBYJBtL_! z*7GYv$nuTCULy5Z2Y0)4JESNz@1tEY(d~6mQCCV&EeXi`i+dY0ce@zk?Zw!)aCPa^ zn6+k-@@hoZ(Rgx&@^aV4ttcBs#8I>1bc@9=- zc9?oDcf-+wy-0}Ch=(mb=T>G~?~}Vbba~P~Er;?p-Twf(nNE+E%GUGM;QYO-MR^{F zzSTn0{FF36zAWBYPk`=s{!uFW6|QqC{U&Aq#pRknLK$*)V$ z(Cghy6)q9aRY>tuN_(#>goqo`?AZJlYV~rzM!QY)6R$P8$yc>)x`l%Vyen?&c-=H*1vzX+ce+ zqMj@N08SM#uoHE@@?!fjQ{BqD$U~`eA4EMV#(GHJUnQ04>RKmq5CR+>+jjghXZR#W zGEC(Tzog!TG_JC1B>Kgw+YKv2q>FEibAvd$z9qb!nc3eL-2HfAxoxX6JHsOTM$+?b zcj(VeY7HbBOH9+nO(j{lM-+0go4Ye(jkvd4b*Y-nb#$b}^m`qCkB_HLkMv9E`kHpu zZ4n;IdTCDAELoVHyRo!MpNAH8et2^7%g-YDJnOAwzz?EAlV*5~lT}3G&xQrD+W>uLY|iQA_2~Pc=9@o3vzcu{mJ)V}scEZtG;MbJ>=jTe>*<4%d1L z=6G~Gkxs{OPft@DGe3!n?aOhqGOMcT?x)E$8&$MUm#YfxXr}X%$PaM~SnOE4ce{_a z+*aN2ww7MGZ3@0I}@|xzpE9KS)Prpq8^v1 zIy+5tchTmt9=l33nkq;hDryRehC*_2CUzEQc5AU_w;uPwmB%RNiP~qA=D6w_35o;E zB`f^a!>w?wo$+*9xuqk~I?JM~CfyA+bQ2MJtZe1>GN|gA==JWMx+K;Ob=JylJ*&`; zlBKAph;fQw8(p!%^E+bB&d$!tuSvA;3Ddk*HkEIaMFmEU=?70!&cX*BA;%x8c^!F0c=&Yre|bVsu9+01}q0lDcbUdtS;^E zFpJ~E7IuF1*Ub)IS#x@;&=#>&>3B;{Qpck7R3yhyB+|xMgKu_gN%*&0?qxAa^^<68 zdUw|vJ$Ba&Xr^f>C?VJcqFH1tUEG_|i{Rb%;0B@9A5mKSGewwx=!tFo ztf!gedbb%xrYLTcY$a754R0=HT;r>x^m>=de6iQMNZ3T2v}|vKlQu22mvX!HMLIls zIfkITB3WI%Eya{%yk9|TEeyKd&>dES&@zB&Xr?W^8%6?=o=dQI?jgakea~(k>!fq8 z(C0j@ytw^d=z~k>O6YX9v;xnUGkFA)U|yW z>UB1UnW{8=2GK(>_JAU_pX^(!6O3%>!|FwEHlJHV(FTic5%Or)+IG2v%jG?paSUUF z5&CgcALYq!^J?*5;??AR1ae?r@&ysiZ;1tZiznMcL(9QS)28Ig7K%a=?4@kmReF{% ztf#cOODPKLlg(DM=BSBBK?Ll&soJTHIHdR&#o}z1ruJ@6qjBJ=xEoet72;(be zATCo@7)9ykAs$lvR0#_mq$WK@y=9d4Y8(8H6A{`GM#Y=8iqxbkT6)W6l(vNtZtAuA z*F0O2LZ=Hzpz~x|THG+jUMR^KQ^m9qIK;0jNUr5fOp-@K9VvE*NUm#(AA(|Jj;a`f zVVnm!U?pxGJ}N9#Fw>Zjj?(M}_ixSZT@;R%IX2Qc4aEF^tI)Ekv9`r_T*f(aiezGr zLGvUf9Ayz@woGs)e?rv_jB?4cE?CCvM}Z)YJs(FAZDNknw(I+4@m%q4Ry2|o(Ue($ zviB`wxe1iSHrggxghvazpU}!wu^_yo=i}j-t?c?+;He;nJ)rim8-$5i21dHl%tBkA zf58QEjf2e`cN3Fin|3M$g(PFz*??uYf6#(5lBOtbJ8c5y--!pM1TfbRETqL-d^y+8RoqVqeokygn_(m1O6O zvZ2yc_4NB%d84R_`%#lRq^=B|uMY$aC76EH3?=<&B)R-Z0nfbwZRi`bb;uWXKC%F^ ze;w!#bpv|H7VC=C1*jU-3(AROvVuejc4ScfXF-nA4EncxS7@gGMt}&Qlu$JG%=x zJH8mZz8;rN_hdvzM-#eGhRqnMtaf@-5UBIARMZuYaY88$54Z{E5@ zwy_xQ=BB_oh*pk*kEK0v(e#5yORf5Ll9XE3h8-m^12=W7SS?2J?sJuTLZeC4%T-xX zEmYDzCp6~fWd4_Z?yIJ9k<{?6le;tE7~pF)=3+7sZL62WMF9?WWhgWz#w>sH?SyO4iZ1 z;pFudvdJC|>bYR2cHST-6rN$DLA9Z1k=D%udJW*Nqsa*d>B#|A7NvEuxD-DsvX?dunN ztV>`zUcd8K=FiR*Uz>5e$oA#2#~g9995Kg#1*|TOt*p^9xzN{CQA+$yo>GjymUV*W zkk(x@rJ&i@X^Q&Td^Hs(ApH*OMz>%MnY;N^_k&JpZ z=$l1qXv`(0D__bhSPL6Q>z%!qS}oqd>gSYfi03=JOL?eSe?2~ioMnclNNR_8`7ygn z-pn`sDs5~XE2n$0rS;cXbnF`{-7Q>n@4sa|Ny>j~yEnmbwzIu-sMALq2Poz)CDvZo zTpd@mR+_HRvpm{9x~E6V?SsipDMn7-(RNo8G0~F|JyKWe9+lG*M=gGltgenU^c12@Y z@{cDbEL=^W9GqFydPCM(X?&mipwf*^h8r&}lH5I)V3yRky;ak%xuh8kBxwYk zWX9$ueeC`C_pVEBYPHK)G=&pV)@j`*Q%X&1!!=}v7;J10(X6+m9x1uzTnV_eur=ikSIywrLws@hOq8Zx< zYzdj!iLiHV{qDNfw~mfCww-#ywJkdt5K1H^ZtvQm69^ehB^}wgkmB3A-D+5jno$dkM3}aM&(utVcT=s} zYN{rssMDH2;TFTm(`9B{|e zf^F(%{3X&(JGo#N>yn|9(^HM zRb3$OzM#%R`d!^)RkTKysfu!%l1Un4?>aXmStYJu9) zrJk_J3%#(pZMS81YT~BEqM5Lap?pEX?I3q;>v3jH)9aS9#c+nQX+e(5HVs=Pj@?g% z+*5g0(e7%bt!k1PCNhxZYsjR0UER3vOp}W3Cbj8p2In0Pmae1*c3}!SlaA(o4TC!= z%~&GSntHCfK$A&URMttsq@H4x+v4u(teUCQjC(R2p3F;#@%W`n8XLq&ExQZ_htQR4 zX+^C1Z$neZOG~9|>FDmY;)0~(0rs;#3B0ptSEJLqQ&p;tqKimY(@9Z|GSkRW$n5Wn zv%5Yoy|GUr=Tg#8oj|b&2}{8Ox)R2L` z=64}y!T2{G=2f|}u;i0BJMp`jV_RJrtom<4z|l}?YWiAd97Z~NqXx&=&w}0M8!A<4 zI;|s6GFMhjS1H|uv&iOR-PpUVSt8Q13nJ>n~QZa z-OY&^S#bL;e`>@oX>Bj0G~>cGxKD5tcG>HugI#Yh$Ffr%vfgX+p0`)@c~p+aai{G8gu< zy4~fQLsUC6Ap*3Esf%^EENbl9UrE-{wIx+;RaG1qc|9!k1tc-$IKDnuGFnzCY)m~nSzXLonQ7k%EBRWZL) zZIyhMGmb#ZzcUDzE3Czt4GmvkL4{oU3NJ2L&wCk;4`kwg4{p55XcQEsf(H#Wt4Gl(f@Dqx79^H58?cv|%|6 zbH6SGEcidgX4BET$5mMBqZ@;=*`2-{)nuGkbVUVzntKx%r8t10kh^bpoX#8xUMUC*DK9JCTV{;25;`Lyu#iVp8`?%Cn%)X+ zS87?v=}dg1E?b2v>1C}Cj6?U8I9Y0Gn(V`s^5Ct`%^sT3;9262Gx%3}+2yrdtkJv+ zwO(r!N0#JBA4{Lw)fUD;40BFbHq6=aj_K^$Y+e}W5;j>vAh>y)ai0y%k6(84XY z_6iFZdBp-5iphkBnOKmD@*fMR7BoC>Rap#0%0$a7y1jaqO@tyAcF8$Bey1e3+NoivcC`#AMn67feuW}0m7z8$kQGD5V`*^Dh2*+o)yS@u74E)4dd;`073q*4lYLrB!xw*I?h8k0+s+h+y z$X%`jyQxERSRvUCY{uLPTM^Vo5{X5$A;*J?1=+l#`aVI*CCY+JqslzJtiFU0=7^>u z%q5gxkHJ8r9C7Ub0Fu;f;)^M@yYb`K)}>2DAO$Yc;n`cdUuvYI+D2kVBv!s#xDMn} zG99fzm`N3b#7J>$J)P(zniq?Zh=50y?c4b8M57%a6cFsG$Z7Vad-eV+F>XmPYEk_q z*5SU~U276-V>vdYHkXh47GfdtrrQW?O6SBx`mtumie%hOQ#od+v`NSGcP(NX;+7~! zVU){*T=*AzEVF7@>KdLhArjrhJt>n`E!xZ^IZU&Y_?c=|>M9xu3uq)kZu7gZxtWnd zLmJjh; zTPGJ`p!!gfAsDo@B_Q=w!??b1{^fh87j2^Ti%02WA)~5-psmKiEZBP%rL-9`plgsY zmHALf{91tKKw5#jT*xqk7WTU+8srOd45C@Ngi%Z&&i>LRgi{uh1JytlL=A6?vV#aQ zcl97&<1zp`kT=ahc7GHKfDWV)$;g5dC%H)Z?m{z@#c3#ZHqG+pKy5ZzEwp~bZbcYg zSvyh}Qx6nlc}JjX<&M*~oJ*^(;<(!G-P&qxR|#hQHqZwx?o z7jIm$b-{8vIH~3mC~lV9n$g@X?M3Xdv^$2_#?j2d#qsJuw``{VQ6xlV+K`?1_XxM` zL1Jl}XU%B%x(hoY>_QA-qwIwW$4sj^jbi__mTeO$i+@hjqAj`)kQR)NTx}}R!vRQkQLra zGh3U@lRDg?elm>>eHni$(X}y)b&PK9_9pACo9z=Hmc~HYpzd1&^k0U zCXd*2N_pl#5kKs1r7ty`L6K5YZ7lbYFvx+1XY8U(Gd5HP(=rCydr&pqlm*#&P&LnX zVa$NqSOPAAH&nA(rmZq|< zbndR_-qB))j^QIX%YO#DzpZuC({j|*Y=l^0j1Mt&`&XsrFpPH*5c6Sz1}OuSiz#LF zVu40Wt|E@!&Tm42S4eFJIL0ePwwGZ9#sd?)9<= zZ3~39d51H1Z$Tu)(%LrW-HV9#AZdsUM&Y%?3=st^B97tndAX2PA2dZS%!d9p@b;q8 zNqOl3F2$}zZwz0CES}lyCMgW$w1=0ktABC@5qN|`;?2VC{7@{Ew-FX$FI2ZJ#hD@6 zPd>)j?HhL-h2PbJ$3s!b+i8Hj+^$V8fHM1+g7U8iogTQRNnfTdr|?eGHj16L~?(L>A_@;rOOTDC;C~jG_V&CmXNu_qv-ENHF=F zrF6FMKT51xj-F{{7{*xbm%rGtYXjzn;mdhk{?|koW)&HXMoC2h9FHz*c=7mkIt7kx zt-xI2_gQXC#T?PWwAz$+A9(h?9~C&&(Y@83bkf?BRV7A}Jh?>h+HB#6# z^#dg-5E%0Iy0BhbRqm~`SDHqYaJ!o-Is%!ZghJ$9T3V_%o=fev?h03H3t9oRl{u)^ zRsofxcf73@EOHt4a<*k|O10D>Ja=ry<+Zbws^;n_WQekkRo=F6wN=Xy=2XOGBXbHM zyREpnZQgq*^N>j$FKCpj6q~NMvW;9UGKwt^XpI9AK2j3wpoT(wg#?|o z0%|!9FFFNjF*XYjTdxlGP5*phoXRjQky!3svfLRJ9KjgW)bITO(6XHOR_a zv)h{zZ))^BrP-82XceUSwpV>PC`~Fx6*)+oMW`T*V*wD3$$rukOYe69%1yLQiRB@aoE|GJ4FuAB$i{g>+NjV zKL=$ZxWZ>pR$C+yOO!Y;zwP3rO$=w43Oh#SKq3LC5IDy_DRmcm0-_hHhQcC@3n>hE za9LoxJ3V2x)^hCkCL*7c)s1wXOCaoz3`S4p{fiWmva86pa0y&wEr+eWQ);mu$SyIu z;mG`O+=wYt#&Q+Iv?eYE!32e}+X&mVAj~8CRfuFOhCm_`BH`4<=yd`}@$Fk^jkeqP zAg)w7gtmnl_xPD+Ey*;P!6o+=T()%*)+3KSyIV?9<+ru$K)XX4timEBIeW|d5J+1w zv`AtbI0=3##d@i{s%tJCqn7Kq63l>9;j*z>sxURXn-xgf#y4lbE zX{b2F^5z?u2YdWiJY925r6^*e@-ZLNoD6dTaK-zQ)hlH?f2ouxvJHdpD@k^C=DRWl zA?;htf)cnhAdj{0A_cE<1tD`lwzaClkk}}McIEysR1}4~C?mJE_8>NIZeqC-Q5QhH zo>U8K+N?%HdH`_=1i*+%i*fLAe}WFHL-dKHXf2Af{xE^KIc|`CcVER`PI$Y`3$2i1xdHrKgB_F%gBfl>*JVImXSyho{;x6y zZqfwpBALtYATB^!8bPD|NxNblyfN4Wy+wo(X?%V}_mF=5@_s7y6Sn_&pTUNYY5aTUm1 zWFsP$PScSS`Nvg}vSF%_vH*;IRY$fU2+M2NES{dN$%s%H z`9?`(A}gG{NV1KQNJaWXyN`?Fh%}VrvDkF+Hr{*IYZt-<9GOE?a-d8hif-BbYq#O`1$Kezk3KHd3H`FA9 zbxx@bggMY!9O#7K!=RW+0s9bhwbc76$%Jy+TfL9Ha#dAr`l#qOe$)&x_E0v@G617< z&Geu)KCWK04YTI`RcJ8B>Y#0lJ;)>&b0Dz{cA%Ouu(J4fppZq?AlCheB((!tfrMK! z1`%s*`>2s_R1IngE&C7`Fm}D7f-;f)-&9ddDH$IM3j$x%gDQkXIdZ8Qx{WPQ0Te(* zRXFw`;6Bpe%bm3;M{4Qb>M~SRRu7$%Vg>xwKJTQsy5VhG-RP|;LdP2b+Ys!>)m)uT zZH1W-F7W&n2DQ&E!|6neZTG!o#77}n+RUdVVuneK$C}YolJ-Mu4cylCu4^$yA~N%2APEH)ZczW>qB87zl`3L|I?j?3OB!b9>&Z#(^!DFy%acln};KW$giGE*V?7 z1e;)rLKC-eu{GVu0wDb$Wygq*Y0xfvvk3_ETqX3f1>G+xY{;`?asooUN-WWn3lo*N zv3)2kLQO0pL-8W-Rw&6c(v+TTq#JG`9qs+AhD%Kh!B8>mB(#e)ylv}UYJqThVG&2? z_HH+N76`~>A`t^W((Qz$D`{=^+WwU`vZ|UnB-x1`$V~XK@Gna( zVPqK!F|yJiE`AJ5i%A~SFqbKCw|&1tAsJyy9Aj}1nR5>I-^bX2rjRM~%a#qoU3=e# z7$8v-8H9vx5zUO7pASPK#lTxah=hoW%m=k6AHfi@PEWJ8>xg*U=|F85N-*Y>#@6_C z??DMowJXNbz^uC0$I`PVVv=a~rD<}I?^R})NyKEkHeJKkuqejSY{X+BAG6|tYa{Vn zYvsgv?^|Y6!%r0)F@Slo@OYp1rY$TqpgDxDEp)h!k$ab0k~1VL`)?Fi*S2)(2s&AV}M_#lp|@`QtDb=hsk&vKKC%f2yB6A_R1cYDepx9B; z?P+f95n3Xl*0prn$qQ2Gy&qH~v8|^T834OX{2gVg_G(wa>a={`RYwe^n-RHrZ06ii z$aNI9U1TS`Levy|uAZD?sE5i8q_v1iu_kU0 z?Le^ksf2qcCC)N&SytI=b;WdfdA$px3L@h%7+brKvCv8705V7!L_~Ku`ag2alZf$K zZv4*UxoU>Y#ALX$KMQxZ4uY(aoI@Cur4#W!7P^5Yt&|JHYcQ)3mGre1TeFL1_z>^( z?@$}cnMwbdnDqmq_LU=b;S@q6xU1xl7F zi><3Hr=+Rr{GvLbx}s1f7HhW)_xn52%Bo2#f?9b52H@p)9s=EN z>5+&jqY8Y*ZN00p-N9=S$x#s$et2Ud&C9r(y#$cM83{-uv_5Q0w24i$u%;cJM#9^; z5(OgK#~EzPE^g&u5^G9Oy5H8rxdTTVQ;niG8Rl-k;gB}O%1e2Oyjze{s1}rMKR1UG z>%nudhi4eoMnl8 z8NndWXzu1NzhcoIl+o{AQV_#&?Cpq%zLn0^U2N6OLlhb|LMU#iVPd>{FN$JT%}ziS z&D0S$XPE?KE!sg0gPP&WC?goz18m&Bast~#kqF3aAH`UYXZ27iM*OHFDE|Q7L>AY$ zZ9t1`^DHw|m&2Yrla&57j_>!hpB> zkQX3tdx8ug!*LWC?I6vhfl(&)zUnAjnE+f6WdaX3Dgx}kwE%!Xh#;7dNBYWE^O(pB z%?Fvohkv&RUq2VnHqq&JVmzKJdff$&H_U!>(3ptoJnf=Iu>tJIjsuTY?zc*dQOC07 z%043OqR__}Ny^OCEWRPPyd4|#J0pN{M(vmlm%r^*^D-WZ+b*qiM ztuMO04=O>81&HHx7NL&PyOjp&hr+CGsY@>v#na88~*@u$3P;2K@9mDyJta78Dk>xxqYn`i;LY^9#x`2TtCgCsrs_0RdjQqbI}D8( zTrBR)`=8kCtm@YY<@^>21YHAL;mm=Df+WO0H34tlLFy-|njCrw4PhET_~Gg{Z&S5C zU8{~3<8Kc_uTppB^8%5F)>5QoPIVy0l1ad;w+#R11n<}aP$BbsJlt+wE2noX=-h1rEaf3=?X}mrsp9IAjuTMKq5occH$nlL12e!S%k9iw7Gq(f*OgoMRATtCK7S|thUx=L}MTg z^On<&;g1&_csIdgQb&l?31uO-k69p&YL6$Z8+l$cD@WOa%QmKyXOzspwQCX0B)d5P zZo2EEao|ndixlKrK@8Vg#NTzpj)=1 zY*K8jH6-+lSu$i*jZrm|UcfH+f^|>sZuq*(@c1 zjhpRzd7b*!)K{8ADF!HtEvV;k9owI;1&dlJ+FF4FxJvEM)J%v;8Ge(sZxZo31(G+E zO4%*DDBZyYS%$A{Bt#<=Sw+Nea(=gUo;KG7i3rDLL^i?&$RnkZrJ6z6+h!P#iPqJYO&I2oZu7n` z3#@9qa$j&5kqC1Tk6JAZlSma*@El}O9%$tr{^vnprkBejux%3KcI&rrWtn)>>=$Cu zMkmd7YkGy-iq#r9FD_Cd=5mvB;pjvfIU}g$E?F&aYb~f z+5Z3xw<8pDQM|HVGZn4MBiVLSiCYRI2HE9ZowxJY{aR`@MqI;wCAaS*!L$B7m%xn-*9r*9ixSbNKx(yuVMe#OSsT~*|d z`qa9s>{w($%`mGd;s_=IU-FtSp4`$U;MC+iy2AfYL{lY#f_~*hdz@y@=YX`8*QVUvALi z8yeEV@a}eg?)8|lYB8L0l%1?t3$oqVu7aIKML1$qbR1)@^9VF^$q?-H);R)-^QL{!lQDwuqOUj7M>P<+!CZ(D}T@vj)Q(d%Kpl zri5)6#N^DwZTvd>m9Pw#+#)1I#k_rpD%2F^StUQ{a@`r*yN97bv2z_Ll(Gp~8xcvu z=T;+_o>CAWGjQ`498fQlutq^~Nwpot#mCs_A^hLvLmUP~Ffl$i7I_QWx#HZD4J;I+ zY+hy|E1Y~=yVpi7S_C^$62GXu9Y`w3F&)rtE=40cz_~6J2S~$Q& zh_=K(7|aM{2jJpZx7dhHwDus9;XvOy(Lmm)pbI(! z_8>R&57j_^)C+awfxnNX22dgfEIE)Cpvnwg+CZiCkQT5YKNJBA+JSe6tLq@ACUq+> z>_O*t%Pm1maETUNZRKA*^a~_+73Wk!BgF1+v$--ChA_7!(g|>K+>1vfhY?$F?Rz6` z=-CjOo<^2Cu9jWdaJdCNW02$uIP%wEMt!eKauLn6pNwikLgDOiT8dV#Ry zjz95K``_tH0y=$>6_Jmmq|D@@M!G{1@`*Nw{TyS9t8zv#$+i$7%thwmjB#;p@^@4( z5ZiDCyI)uNziN@Atc)$HFdIdR#&YdH3|CDzEBPAu;q3D-OU|(zcjZB9I9n~J$=lQ*)LSE0{gVy>5tJTQ0t42drLs>STl2h1EwPu1QvHLB9 zyWx)^hQmWp{bbs8Z@w z(bZLJeNA+6)7td()I*ET?~W|*hU_@{kaq5hCGv^olxLg{S@SyPBp z)k#qAabdZ)nX^0fV%RK7p%H)@TPwXx}JmXD2g@7LZxuJVcq> zm@#Z{-s?8n+e>%eyTe!04x~q@di|s{Wh`$M30plNySw2THs;0mz7KHX{uP#urL~>m z({vBf?uXWP)7oQMDc*evqUo+7+8k`>yq)nEXUZb`vF$S2#7{Y8rel;e-5PXi{V8ij zXhVjI(A4hp&TQ^m2;JV;#mV=+4D8PDz+K-SyokzMX~rFNwY>`Hx`NT|qO`t~5PKg< z1f^@giJNFRx6Sq|@TbJnbf3{h4z6f=9cIoCST&{`ICa0XgE>c5Z)xb)^ew3x6I=9dx6h?$e5Oho zaFUw|WDT3R%J0fek0|lSf>t+Wr)`VSB)Yyj;X@XYps1?S(og)3R*{+*a2I==c)Q}y z-rN;OQrqn7dQH>)A5v?smxD^`wOw|W5*C)KI-?OXuyA%3k(sw))zr3jWJK)qzKps& zpQJ4^aFs`rXzD=P)zx?hshb_xz7NNPGrv{}VmDOI&bjM4AEl{!56zlZrXhPDNwlSd z`pnn1@0;*j$sFA8N_`rJqg7E=P*pv4gVF)CrJeA1ZOrz&w&&dJ?EA6q+_Gb0CwB}Y zu}a9iqR zPWE|EMqM7u(hi!E4Zo4->Ok7n)jM(zQ#L!Xd>@Yt9s00b;x}B*&amscAEl~#56zld zrZIaTNwkH7`pnn1E%Sa0d@S)aeI#^s2S@r#Mpjcv`P)~ku$lrg!OU9+a3UNyv$h1- zV$bMVF|iZ6_f1-hqBV9c1*SE6o#4>=N}m=Tp&K#tGvZF~yh*oX*>$#$a;q~urOxzI zsspaN?L(udjLwK%=BdLG#xZPNo!fr*z;}3-L~kv$?G5ga(b}h{eozr=){oJzCW8rO zrj{|9OB~~f+@ALowVHEx@j(pbe^qL$*bBsN@(pcE-egI22UAgYn+|P+XifU+4v~5 z>CAXzo26q`C&fIFbXU=xF165U9bnV-rK7cHM&q}bIprp1cM;t9V9wo6?~5~Uea$*W zyjJL)OU-8*^>ms#r=h)I(h=yP(Ry1%oaE6(q~@9Mx%V@^CQR7Bc;VlI=^fP0$e#8i zecpf4R-x8(bFGJ=v$MCMalB0}v#l)`uJ1_GnwQb}& zYh^Z()*Uxf3r{3;rt!raV(q&E9oVzC7k9%Q%e2;-e67x0V%OB?UQpz<%Cn;y{alu> zR_S!6i_;=v(bH6ulw{cEcXxB#&5voH7jH`EZti2l)zZD>Pm80?w#Iy;cX1c)TwRN_ zek4~HdIlnSM($L^$qv!N+rIAg3r$N-by7+E*nr&s0J(LgGjg`34WNqz(Xhv8j~Dna zRci9&Yg!>A_GJ~ULmeEuLN6#G0V_%_Exm3m$uxP2NXFkN9K~sOENWpRmNK`Ws^k>( zeBMzcmPcrZFx`c(*0Q#3s<9-G5XL2#47mChun@V8gXYTSc7GEfYn;e$%bP9T=!JOb zzzZQLET*cmVZ1K5h=7Nfma!RO zEk(Ix7aX?le@-YAZvv9(E*+;R_cL%oB$f$Zmv(Eo??6Xb(!;e8v`o8Ooo-CT6)PUk z#02g5$q@O^H+8>a2+C%QW@0;txOyLQ%$Asj zF&{WK*f$Yz+_ebGqh*)`WE0I`@xz8J%Q6iZw4y{~na1Br(AyaX>k8uDEq7%F87Tas zK3wKDy`_iXvliso4hN8jhFrbNqYDgyD3Ji=h^@=$P$SuZ&2Z&2#IGJDgYfnsB-+x( zCNb@e9G!Joli%ORX+d(6l-y{^p%N038{IKRNR4K6qaq-T8X*lL-5}ior1afI=H6@h3 z`u)0cF5Z*iZ|X{pm!cPSNAgA5xVu*J@Yp6y@-O2iB(dlKZjmkzP=&-7_QD%H<%>lX zctW~Ly;#g!e68L&4!X5Q?vHE!hu1V~)Xc94{3jnB_;c{mgU9V=!6{iC{X0e33dHO! zi#=HWP8*r~ING^JWYQH2WV`PR#TUCzbRIT2?==<~)($G0zl`5ORDau1 zFDa{NMaQxcb)^P~AoUm)uF~?b6356xTACCQcdFBt z(Xfxo7!`kss<^s*k*DsCiRCrNoY4I_^H}2eFI<$2+u$SRnP;-ehwCLH6`Rj>7Pup| z-m}VF>steW!t1**^*M<$M_Fc8k_1NbjE0v@e$|#gz-LJZA-%<(Cj-2(6T2dsi;>Lh z**3@q;R5!Juv3#iGA*B*o2Up`yT#MtF?%LCwAli&_Qq)}l}a>C$~IgQ``J}G*2|Hg>ejEt-mPF#pD>eL*cYiY&D+#3_jODvFhO6om7jS3jgrD0q;@mJjX|j2T z-`u*Fq*I6=N44X2P763F5~Yz;G)!_CL}iTXWN#C+(@!p#qUHvQ3lsAQYt3F&TQwEL z`4NBkX1Yw9m4|>|METe(pa;Bvt@I*we@-jtsq+wTH>W|M=HqdyD!eJG%&ZyMAM;!Q z%y62RbVPjnrbrL%BN(TJRpOwgrN@f_`o2{3&aNjGH9=Ze>j_nHa7G4d+_M|Xcy_K zX0C8;sv47_R*yLP8ZLKO#85cq6!P0RQQ`#aL@$X5lfjkf(INxw-A$(ckZ#7Igsqoj zgIEc$JiTG0I60g@=tZJnin|kSo97)TX0NLff|8HCI`|Lo0S%AvanJQ^ow0LItQv(f zSk%nZ_wX$?2FGuIL<>~}()A5bs!Gj4IkS}ytQnibLE_@?s2w_{!i^EU{{)lpFw??8kwmRANl&TVp4n5nwiu~hY4BHk1t#jTb6xYvAg`|qsnbTpjQ@)Vy1ZCi zknD)3p7NEsh)jwa(z$lL?6;gW1+1BNwqvZ0`!)BY5sQ{#8ecv~6TaG! zXP9jwd^1ggGJH_Is1W~$iR5LZeA^cBRgCi(`@BNZLUxoT|a4g_^|ehDvsxI$gB4E z`9hJV>T0UY;bd}1Uqyv7G4^Mii~+Gh#9-0Z=H$g&&DQjZFh{!tKDWp{logvKM{)tQ zIIfzd?;9-VtJlL~xK9D74*Yb?=Y2T!dMpg2#&^KGxr>Hn{|a+vR7KUN+xj{2BxXx^ zKNSOU8w%Q(s%v(PT#MiB==VqH*n=VQl82|Z;q7^@I-=1G_eZ`faRKFnno6~CVIor} zTl*b(le3TT_KBL)(k|Huck7Qz*2*xrikdKs9OJ?$G4iCJ3&UZ(9$N}tl88-)@}YmK zHNwS?u6Z~qz};mX4QHY8mn9SZ53f5i)bBp!KfIyj`P~s8+mZy_W9UD;YvVfwwOx}! zr^>rWj%`f>H>I=7{5-J}C--4btlFLYzcAYT2>(JIZgrE*I$Cd=b~2P3tmvlnq2T+R z+XJ?kCW)*WMKT&0sQLZ;16BOJP8P2c zb@mjZ`;DHohX6Z)NJl-xMf<{*MJAg7>O=lOKoHH`zw%3?g{O}a=t;u8?@F3qsJTCr z;ecK3>F!=u>pFbe?5TQZ`h{;-!`9!J7$D9ryKEk4UON6`DA~4PGU!OgJtE0K(dKTv z=V`sk>_|}V<3oMsOzA;oT$hj1zp<>s47-{UM#`CS8Lsz!V{>3%7%> z59FGSSXq8oX5XGpGW>_9i(3R7k^1FTrIbXrEce-m$}AkzLqz@$LKdVw{pcOxEUDFG zE#q1&lk}J4YoHx^`{ZL&XQ6*^xlgdaa=)&R$Y+CY?Q?PUaSK-=>ht9J9lqS!zcb{) z?+xoUPAp0mr8_9K3XYbyi0_>5Qi3%;63Y@xs4TAOS=qElf3HiYH~p0ML5a;Hhc&m2 zg!$(G@V4)#4Q@ZruijQ5Q?8*!WEK~o!or0XV=6D3|L}BvwY&WL(DRS&Daz=#-)o`D zN4tj!|DNe;l4h2KPB}~L9}C=b#!0$^$6D7R-^aWjDP0uxkq7X5WRoL zP3|mYpz(zI)%`!ORgGog4(FRSrBcfeXF96qi)^^IuGy(n7JV4VIFw9ISXdIFf*a@6 zKbrMziyNo%WFM~n^!Z-#5%gzKi*<@VI<=C&$AK-gaNFH!Q8o#+vh4wW^b-0jAuf?vl;V4!9Pn%^V%fF;eraA-|J@?OX zW7Zh%^}4PMZ)=Vtl0va{bf_nHJ;%YdS@O&vGC%fla)0BJfXk!}08NT((P{dM5~$X* zC6gg`qOvF?PtU)eg)kY4kE&KLrfsw9(3^emgbPxrLa_(G>S8YbNkNSdxZB>3^p35> znqX3HbJcE-QYAa*sT0^OWPb8U z%hd}2RoX3Y%8JAkyhdjZczm%R#W_fg;#*S9K~C10U6pW5ZY@R)EHWj!v@Qd=@B80x zgWieqlV=d2I1X%gzoo7ls(lY!7NnCar?7pwG4YM;Y=UY2@T{x_0#DF`- zTl2PU6EIxti-e}BMW7Z)m`Kea=QsKl^)9(fg^pf{$B6DUW-(zK;Huxj=)0O^&qwIy z*INVrK_shS|q71$<=M}Y{1Yv|quN3G~KXp49FVCKM% zuAhO~1|5lQF%MH@t^o;FXHUJeW`2nE`r_K#TvZn%4%ikL5Z1q?fBwpetFa{>+bVfc zt5T(CvVB?r%d9aok!E&;a)C0Uo<8g^EKS@cN)T#33~sYsyeDD3kpz$v4dU1^<^ccRIFHitE@bee`Y+&uEE}mxX14#ea%>VDxnb-aK@Y$#u)$E>5u8dmt`&GJu z{=d#nzd(;5r!8b=oe#Q<%&R_gS=oVoiCKHTX*@W4k%}LOY~{|{vHi6%@Zdb0~I2@$ZqF2}ekawLecAB$q+x@8XLurBuI7io-W#ltXIudd)WwHDdK zU?nDcGnJYx#CP5-=2D@&G<~Xk1txtQ!Mv6=^AjW?ANSAWxhZ^sib%&er0?wcwQME4 z&fDVk0xXt#-eF898N z!8{3@E&6*`mY>%UkEb4Cou zkTst*0S!Kx!a8=2{+Cv>CmOX zUjNahZwAUf%uCd$e;1KRm_+FJ+K$rCkZ~!TOUsJ_rI4K{bf1D7?Q94$zD~(=NMzx) zb#jGC)wZlCXvT`A7J^-Bwsl)Fd$_DjhLv%jg>Vrb5d$YS`Yk|9_scGg`c7=f?4Y#4 zu@`x;1Q@7hibt8PRhPgVV7qVEtHk9sY%;B?2)lma*q77Sn$r|RTu4uZl z$5c|jQ=CmQQsrKz4WW%GEaDsub_B&%_xh*TU1u8e?4@j;Eb1ybesODD{#+Wgg{&OX zCiEoJ;UNzBU~wU!sP5_Zv4;t&bH{NWOh?@QgkKmke%D6MzBU189B=%b;#SJC&|%rH z&l88pg)9zoy&>&;|0U8e;;E`v`c7w#hJfgYr$>9f0)ojf9Sv9W0_l;fJ)g(PwHpBZ zVVPcw(z9TOQmr068^)Eb$-W>)U2_aGOyUVSVBr3QtS~{WPPBjay6pY#8yAg?Hz)aC z&lJDKQ2i))y!)DYN-hEi)r(2XlA;`U8Vh|e_QBnM2|GJrtOI>vUR5$>0orNLQb$*m z7iF09M9hE7`o1!b{m5I+%Jwe**-Euf>ZE1(|h!$8&$>T?ysu?<&Q-v+$-;wTJ>51!Y0e@3Fu1GuJgQ8af(m2P&&e z#6LgRzS!Jq51H~oI27IS8WryTswtLSv(L)XOJpbQ`$XX2w_d+&W{Jtp8?%~Ngc+U3 z8Z>=SHJEVREqR<#T#;c*FK8N_IkZsM_imw!s=0yLO|Vh>rbp@LN^4K`^(EiL50>kv zu-<2lzsVp_xI37^ZG66?S!i0Y`DbTyT_aUwyK0oKPcc$1IikXcCpo^LG7j;ZO|UP@ z%u0ED+4cT?k~Dq%GRqxsmo2gU$r$?-Dyw4!Nd747i%lS`Qqm?mwIP^cWas*yPmk7z%(Q?(Z`;@;6Wb#rVle# z*cv_~O3T~tO15U7xCQ1<78-&L3`R#`vE<@{!irjL+1@R5292j)(HWjyfU{Vt0;h)= zK5-&)kyCh+)BR(y7{*_k%WnSzhBjQ&EAKDFW3N|Yo0v65je-PT{qcFtlHl@tet%56Ge)t@Fx zc##MR)LxL}w9pG3i@a;tAZDxD9DcgGV;KTl4# z7-DOFr&b*bA7Hpp2Rn2@&FCuq`rn0SS|t}4lv3VDZnc6Jh7(4NrNp zZaY;1QVv7}RnAI05^{6@xcE*Hfo1P2NP!S!v`Hpjiko?9y^}L$+ z;ivAxObd3r&1;r(|6>~n)P%lFV!E5KY^|ENcI~%^?#Y;_8;E!uGrxA*F65|*CKLr@sBDI zobX@8GY7olsgr9oZhKrTteb6zO&_!U7_A2u_fiY$q>U|H#4}bVj!OT8>osNuLeV=< z!m>VIHX_tQx#-W<<#AM=bj!mJQ{xs}8`Wk)Ql-8wh1xNVHI;vaMDC`XDET=LcJnDf z3H0>-Zih<`NbLPXUNP(@PDeB-EoIhzZB$+^1!ZM(&`|vD+tcW_GL!n#t%?5OV0EjPxC!0l zD4nD>F4y+KeqahG8QIXBc#bvD^f=A6UC%z7*dLdUgtT&b^vwU^pJn*4^F#~{gTO7; z$46wFOorQZVYjQYbH6O+kBsb$D5md?bT~3;B3je*zYkDe;YRds{TVH;aH>(pY97!M zJc#|+e7EV3{YeabUqGdPdn4wLkP_#x*sHPOoO;z*vMqp!}j(GmNbO)oE|DSERs0*@DN)fU#W2>#oo@ch>Q~*Q=)hai zMOkGuu`U2XoD%nmfQ{VC9{js~in-O+9RQ#9B9B-qgkT(NdRT92`v?}#^_El|Pem;{ z*oqJeiwrw%&CC1TqxZe?82VxXMF``70BPEq0!MexBDf{JjmX;|daP-YW?fK__?xF$ ztbmn11f$;=74ES*_ZR*X_Pl}0wR8U1jwS^|ml=pWz;?_xVBKr8tgRx~nX7m2Dyp(F zV)>#;4`89kS5?lE*67V-y*PK7`r8+oD2`-FTp~XPYs1>Je*~uuIpE9K>LA4N_!x1v z+#C&bZC!#F0n?}97=lsrQ46?Gb*6JnG!@_e!a>-6pBKCgh#hiFEuIy4oM`J>Q1bRHRAq@0F2oUoWLYj4(iz9DN@x|9v9> z7at||NUg&=0^_p9d;@#~LdA?njT(`xhxJwU>aiqZqh`@))du$?Bb&0d1i_HL)j9vB zCw5K`C2PPRK!4e)UgNf!dDZ!e1@?oZ)yKsGLAHBbd&&G`?bm+4W4q&4AE2u-4T&%93-9=&sRs?yvG-dzT14BIT-D#wg`Dh@%dw9d??3#K@~#-$p9) z^*r;bL-#SchQ7jQSpvA|s{tsG8$DFF7Bo+aAe$_Gi)Qx5C5)Q=>&Z*dDRTeUm5<>U z;Z6*8ZXr;K>NZ7r zy{Z1Qlr$7qsOM=R82GV0ifU_or1F&!M<45)r+~3+JX>ys$K(m4_x}BWuFSUPl!IXP z_aHVi{-ICl^%!FU5&!Ea(`}@+Feh){xl$OBpKno{~ zg0=t(K___%3&5QoO4*H?xOUJV_D!~C+aHsen~;52OIr24cmGa=eFOmlM|b)!> zQi`7XQ>mOfpexrAlEC_u0O$E9^XLc`AlK8iW}bj9Xs^_5Rv+Y}U}Nk-;G z>JK>UVer{R1|EF>tC_LvI_l&GYK#a-pu8K&OW^o9sB9u{H&3&H;bXLmv!@{tC?2QY zk;l?3q$v0V`uoQ`tnC4%_M53@1an`*&dMkt5lzYL9|bmC$;(Xfe{csG_JaOh+I zMI1x`PJb$N`LZXhRt@f;ZV;8pBO*EF@x8SJw-6a6r76&LAbP+PBMIMwBPs%#yN$Qm zq}me=gxH;E`bGoN7*IU&Utq&ZDM1H%eHhAX}^7RNto#sb9W4;?jF>F1yW;k>9^b|5f-AAwB5~^K z**_rgnB&QLo<6(T6N0&xnIn0cwo?v^OLHmJ0LkP3C#~*nCruWBqyl}E(iYn8iEm~$ zf5)~?1T8C+ob;-&{F2K5fW8fQQI)ky1_qkHt8wWrw?GXh?7mXSU@FUO zBCbPap{I>*g_Bvre?22MSG!w0)Ae}69e7nf1W$7nm#N1G3myKWE!wb2CVxswXADpSYyc!>W*)%h)#g$Afw^CNqk_K9u&$opNdi3MT zboT9>31^{#;@=AiYz?B1Rr)qBI)Ty!-dTgrk^*%Tm*{Rw%>mcIm2pT6*V zkojt~3PQbG1~}oEouL{oP&~H3HsLO0BV~?6ZP{qhs7kUUX{;F(MElFs9P$ZC3$z;C z|A$j$Sy~>XE&984tEYPRRXvg8!Ij;EXnL_cOhNra$d^D8$Zkh;FjGrAVzk=Z#cpcm z(SLa1u+8KD@U(O#zkYiebZTbuM|w_Ur)(d-xtK|({B=qd{Z@l>=u9*-60j*%}4N!TtXtkD7xCaQR7!PT72z4Jcr;4)utQM*VA}w3%IcHE6P;CNXAViMvw2r_?fP44?8d{q4M8+KjlG5#(oT2QZOZ)b%O`F;rH{1TGWcT2w&&6%JUPs4IVv5!wrd z2@`(n_(x?bBVgwPK5J0r5s&Nb#a~aF+P++WuQ7+nq|lL#I$*m3kV}3%_2f`s@WvZJ$4a=Fy_AB>I+1LrSh-l)uqqM^)TAo5y{HBydF9<6vBpa^ClXkJ_0M@qJHCKjG_H&&wy zSKZ&psvVThs~K?y3iWdGSgc!o4l{i&8r|oZT9@Q;cp>CiDpWJhdB@kkdGU865?B0@ zs0o!#JpDjMo!^l(38L4Bj2gFr0X^0|?tgw{;OcDeBjCyTF;e14*TQbg0>53;WKS5S z!|x}iq|l`wovq|8M|x>41H|aRrG>Sss&2tj@@4veb+HloAS(Pje2 z^|JO{^CIHyIDdEhGa-FUa^&Zs4UXi!e-ZUdcW|pVtoR(!w70s?WhVVJ!Edq$nLajs zEIoQ4e59N`aHYOkt0MVV>u1)Fxx(9fi0@q14ZsxTQ11{L7{`7-h@#JT;WcRky=R27 zU+BMx*0)q>RZgox4wYym8{MnW%SbgSCxd4xC>IhoOjJE#zgN&}{cJ<9Y^X#+6^T}z0xB}yp zOvK^H<^RU=!eSnoIoe)}FV)NH&Xqi66^<1mxCS14)V`5jjy|nxNRgsWW|s+kMhX`^ z-xLFI3RbZR7r7a#%M_7F_(u!tAYHe8nro)*A4@gc*j|HIRyFb+2u*dkh3ryJ{xz_C z_S!KaH_|K&uE(woH<2)|thJ`L(Dw0+q|}@z#ne+Ir`gE&P@flg0;z=!bs0~Q!(p2q z|KV{T^H=N{CdGfu4xaP(Y>tN&Kd~Cc0P+orkjS?;4;g5pVol^EKWmM8Vj;EFZ z+Og*GH{eRjUku1b~{tzXF2D$d#o~3%)H;Q^RgXX8l<&uchB&&ihWQI7P%&8e7fK zSEjU)3bJ{LTDZN~v5ou`j7d{vM0kJeCXp~sSebY-bMm{pE zM0Wl)npmtb?TP6_Ca&Z+#*6MD!E>zH$*OiIlK@ z4CprzVo$-XAv3eJ%Q1#^MTu03Lb($?;S8m1E|fe|aP_s;S7q-PX2N~+Hsgxe>RM8X zg5_oMI6>4d6L+q=1Xww&6ls*MFO7dgUYz4*SRN|D%~S5t^6>Jw>>dOK%~F$(1dU3_ zCMO7A>>+xTBI*WQ!#Uj9N>^|lBcN$j{FD~k#!a5{*H4I&Rgcw3HCVBlo-durIE%@v z#+s~0aQ1v-{vqu=8?s3J2z2aIb(IhP^TlfDoZ*Q?*Ee#r3eN%-x&3ZxK)ZA{YMf4} zj^{<#M5yS#7#YL!F@NNz*kBrdD1gkuH!A8lN}qI?VG-cR@``Yeg;n0I^rSMvjeubh zcg{>9CP_K91QBOM?)k~L;52fNEl6Wdu*l3=9wKXlD!78U3<=|<) zaaWGEm_=tSNxyg0E5+nWlT6~XvA|zVj6i6Ho*AU`ThM%AKyBR2Mso@!_H%GSO}+jm z(2}z<8l)ETSYMMbhIRQ3l0c-}vVFowcI10`Y18(hj@A3e^m_`H1&mK>$kBO{2V&qA z!Iw=BBuo`oj93io692XEdaeDr5Eiejb}iBC>IuN6ZJSpcg^3_m`)Gwn+=Z5lR9i$U zs-W&>4T1lbT^`)M4gcnJ0kwj?UZP|h#9dsWx@6s$IMyJ;iiBT?< zffklMaO1-G4s5z2+~~H?9Pm(h;qCBD@)KZmR>c zdd{g0)-1^s{#eHre7dn2=iIjHk+D5LLw?3og(O;UdK8nVLM?7%{YzSnx<;)<>gAyU za^~6eFTb1?EddYwyBH#$#%%&qs0?-sy!WQWSWs(oTK51s=HS?IlS#SQ>cUk~R$IOm zha6)J_>!<#O&+eq0!UIgz=gy(f7Jj2%K5$TpCGQ0#NJQ21B#{IG7CJ^>G zpCe&hfxG$$4E;5-s6t!fy*2#Ko8J^y#`Cs4^fxUIF7VtaQSVKfhH5L`k=O;fyM`Ib zY+F-MJ-x`;=jYYgvo6_v=f=d~ zH+sW-Rv+r8oY zV3D1*F5lw!*5oqJac46{eW^g|Q@MppmXIq0|3X?i+xd6-g1suNT_tbnWjy4`Lx3 ze3PV2Sp8b=kfW-2F=(*GUNTb#0W3<`i(NrD%-=PRG=P~+2fFYbH5el&aD6hpvHSAa za;FWN5hlt^e{2k8$n-W{%1Phze#vm;l7#rB`LWN?bIE@)J=)3!w2=E`g>kI|Rd>g_#{EKUz6fsCe$q z1){B?tZ2)nG&gf&TxW>;78qxj8p)oV-H&w@@)E?=rM^gQ&F8}o4X=;Q@Vkc?3X%5z zCX?5voL#){MU?&d=cK+?ajK9Mw&X9p5h;)>G*pkVPs{xy)O6faF^3W;%(RX#1~SR4 zsbKEEDn2}Qb9)ry5+Tjm>#0(NVY*0X$hi!#x?kBOnb<0B7sN$Kzr_C`h(LlyO*OH!G z6Hq0NQDrfzZyoGJh_Am%urNGxXrMW{Kb0gdwOpn8YM6-gx17n@!_}Nm3hFY5!@p)?oLEtL7ZLW-)QnI?8ac>J&k;ke&u z18FrkhqvB%DnChLQPJh3viOw!Ccnq;A^kHHKzHEnl|p~-!A?)qccYN<+Nv!5xF`od zf_a9B)nHEzc(r~Ybe6H#ZS0*?x=85*%{aX=-ke4vcQ2RFD9<2M=MPF0K7W%`Sc^<+ z6S`K*X^3)4lKGWU+cw7!O6UJPnRc_uKoamj6b$)xk%171R2sJ}+svd*T?`Yt?n{5_ZJ*N~K5PiQPn-08@xp~Su8{Yd zzO!Yji_W%prcD^eOmnU0Tiz^`Q4MZ6)~zzK%M4qiL#c`TQ+DU6LYn3{7W8{U#20Hm z8-G+zIr49BZ(r9db%~l$-cNLL7YJ@of>*%`@60PkO*ki87GwHqqg1-uq9la*_F~Qu zT!a}YCA!@p8njmoq?U1BjcD>@5e;V&)E(7oymV7uCx5iR1ueozGy&|qRnH2zozxfv zu*-KEV{ZvZoGXXyrAY!mhCH! zMB7+x-Y%ZqqW8LKA#N>}_a0?)t*Qgao!{Yf=8bu~kGRQBf8;BWOxWe>)_KR;b z>}_=USOKJ*AFj1lx5X1uO4H88y>}Og(kDI%h{T30zwcD`Xv62|n!SL%^L1BXjH?6S z(pvXYyqLUc?I6{2%VPEW2 zV|}j;0HCaB0+D(-P;ExeHTqmpEI}L^9CVe(6JH&tGj5%Ec&kgO!)QpmmUVoUP-hQz z9D$fE?jkq=afkRL4m*sxO0FrjOF)VUl@6zG9*6Q+fB>@HGzMGKaV$@36&MlY8X&PR zUk?*D^Hb(c3DchN&C{y~$EokP65<{0UcX79fHNj8J9$M@Q?LgS18nbjY@266>~%yl zOq|SK*mYb6!mtFp4FYlS49w~lrA7>}L|A$gbT#)U){3sAmQ+5GDEZ@Id)4zJ(N&CO04%0IS% zq?Fx6ZB{!;cE!oL5KdY&+g-((>&@&NCL#4C;j%yOh*i@)#d3GKgCDY=`5 zJg6q5Cmb8wEub5L0EHM6-s6E+pBZt`2BHKD*W^3@1$Mm0Q*!8x=1+)*$Gtxgc=Ln+ zJ+Dd&d%o1XZS(6YZ`twAE|~yO!Oll=aDHpl!eCTzRyZu7Kjg>|8!0;@_$gZ=`E_|zGu%ptes=Omm+bY&NG!4KroPZ!R0VY;T?uSuVucwLWt zXwWHrR+^|}^(NPn?Q=1*s(oe{ppwFVzeDOKN^+j|AlP^p3iD0qCuKS zdJqh9!;0_u8zfI0$P_?QYO)R=@a`iO``G53Ksl38`o%F98;iFj3eW9+(n|By#3cxe zum3S+dA62OldR#jWR~skMO=fC!gY&ZbSuwqcjKZFVMg>?9FaeMEXqq&v0dNgc#V7QB)+qZ3ou%y<<1YL;7lb7Pq0hWVuHM_s8ZVl>kXQARnS%% z$~i2|78$WUq0dlBjpj_4xd1?4eww_QUYss;DGhEqb$VEVd9`VE&wBD2Mfum##pUinMZ2L< zBn@-3C)OX5b}173S$e{)(A%4#DvzJ;w)Y(@jHE^4x?%z~yGb&(#T?ANCf^NW5O!Cu z?UgAomrf#K36@P&RG=pip5iL96n<4lurzxWp^GR^IP*TG>{yK@zcvY)>Cqp_L?y!b zzL*^1o`iq4-Rce^IU{O7OJK>CsW90b6AD6)B-;o}_5^)`+)u~`Qd}4F29r=(_E<*h zdnb#mDTlXV-&qx4G)o4w-2L~TW3Xby82S_V+ssDISJkm^1nVZ;n4Pr!J%lzbbNRR! zyWcnwdH%h~MDg(@63h1^osM{@I)hf{Qy)?92(xtG8b9>tw=$oDn}}YSeg3ugq^X-@ zVFhgBD>jYazeg?M_L0adaH`P@i%U)9@z9h3(TBCQg2nIWc4f|pZENj6~1%v^d2(z38~Xcw&5V1XO5ITJUTFlsi*nyvxj4v-mT=6 z^-@BAMp!MPcKZ%M%{JHMmKYh4?Z8E3CQm_Dd~wcS>6!r@owGpM-;Ka4o%)_7pOXIt z9$gj8@?bP^a__-W$JG*=CBir{@hUck)S2J1Lh@S?pRHHZw_vRuoF+HK6+bLZ3jHqV zfopjZ{7G#;5+Z&s_)rX@<+eI@3|!J4q*se0vTFfZM+*&Qq`inNTS%nr4OqVwvR~Sx zi*d@gE#|-s zOPPR)FIAAOx68Dd{lwhr!b{7N^+292PcfvwZT<~DAyr0E*^hl?xG2n9G$nmUnz|Zz ztjt-;&KYU5=#UJ9#4Jgi|Em8&g6(%kM9JnYf)xezAGinMX6TGUcNu)gVI>rs&7WjjwUT?I+@y7#Df21uS<@v}l6U|JMOoJV;Ta zNo}Y-FqdWg)xfhZAn-UP##Do2z$5e$=i@AN*rHhw4Ch|&CH#IfTMmKYA$S?lCmjJ_ zQWPRTmXGiwh*L8Ha0Srh%?4_o7K=R-b!E30vA77*{0AHE;&-^?5v8GS&k>J#aS7x5 zrt%?*lp~tx)Hdi`3r6xBTo2PzpV_d}N0^uo%y697|90MP#}WmJ(~!mdxxGPtc)rng zGu0%79O7S3sRn~P-5O)l-$zUh8&^~t;+!5MjXE$v?9EG z*oY`iI!OGgif8KeYtPHOUaiQrpVPO^>mqr~B>7|aa*~x;B9rN^9s>vbxUm}*D&~!Wo{8rQ%Fd7@MI&M z@s8Z}w;@uO_BdLbOHq>e;shtrM8~KWegQF|NwyQJK02p{6yyn$X*dYhLmC(W57u$l zI7-zCz0OS3fE}o^P^qex<-w>|-bk2r&uj)UmXcaA|0#Ot(N$DH`(=P|XO>ixIL54y??C*QZTl9yWYNc@ zc;;~cPh*rwRR-P90=1?$k|m8W&I^M_^rdRfoiI1i`4ilmujkR$Lk2vlMp<&;LyTYpfX zxF=(pi~tj4=B9^T866hzr^0WbbN$IL;>*1bM7Cd2vF;>A+gIQN7t=<~;Y6qvodkN# zI1O#F6r`ZCO4fHK>GsQNn@OlwG=BW|X*q72PLB~<+|vN>mmrb!eJX)djB1Rch$QFH*AdnLBVCoN7+ptCiDs4rEv3BEvBf@q;|0V;w+=Z{l zw1031LVXMHxErL*Hdh(tzOo9-v11^+&=9ac#3{5;Ju-*pSur+q4|$paS{q1U?P_|} zr>U@b`-Gqqpcp`WgXZE5IRvF8ge2A90)lvj=KN9+HL3N{&|`$Mc=#5(sW-f%{-r6w zqIns4Fz4K&d?EWX&dQ9_>;mC6O8)!^Ic{>OQYIm3ixYyl#eP2zGbh%vul#tH80URI zS_)&TW3xmxQYe0tDdSw|TB*Q`lBfs;ouX3`2Yre|R2o2cF#{@v=kF?_?1G<|2E~?r zB-zb%vI3okGo?eQkGn|LSp_{Qe_|$HjLROK2@L(9A5Lq3k>AP%q*H@`oeIwPm_0ao~FM~ z$GO8q!_C3NBsozK5wr1#LYLRp=KI3>LrvgT==QEKa{PyiK2%?U$LVRVJwUgjnwE#q z?*}BH>xpreGm;;8UxR0W6QE0*fo5Bl?=OmHInDKZrKnji~NC z@S|?6ipQeVTUxrcrJnaq1Gh`1dlX$=fZ|ccY8jolOr0hFba#zT^ zoVQ$p$)4~lJx@z%K4G8^>o6K_R%2{bHbK&`xkH&3TZXk3HwX_&2k8B5u6o?ADi-}8S8p8_ zRk!{R(~`=Jr1TJiG%6`b&rr%BIRhx2LrSZ3*MKmTK?(wc)G(wdFvI{NNOwykN=fLu zpL5>xz0Udl#dXcvYjf|l*Ise2Pw-E@Vp`_=PE%W*<)A*ivx-@|*Axht3Um>_aX`!3 zs71%EZG~9kEho>}$1QM(mxoz|!LhlBaV9S?q#o@u4_Vp-^oi4JH4G2^!$Udx-#bDy4b^}F`pkOx!^w6~>u#?8ONyZv*ZpFHp<`AO~R zquTr!hSQlGr!<$iB1j|5zY0eM3h~JBI5C9sHhfL;;1{DLkgk7`hwbr!n^G%+sl;xk z<~eeWFK*oG;PvBxH}N$|eg^5e6({dh$r8|Sl+pG^`O2d{~s zXH_5Ezot$oxTOFoODTkaG3)G{c*}ku$JoKEspUMY42byM>H!i5+DML)q@c5tBgi;K z1VHjRwB3jf5}9!kh!SL*`8fYg42MjYE=~P%orbAOxw6V&B4SL;eOZM6dcz`*tO|=? zV?O?_rmc{G09S#;S{OK~7h50SRQoeOMmoYmw$z=#*cj6I@gB%UWVPL;j>w7iI`I=L zcNd6}DQAblqNBU##d#280%8&=hHK!}0|-65CbI*n=Hrbc>*31sb=;Qdmzj=12WisI zQ>JqDlZ{>9*%6Id2tmn9k{!Jux- zh~f##`)+r~ar05?9|?;b%WNNBF!=N6iV=*5X+XXFA~tRy-}^O=I$gEeOe-&j?n^ro z@JF>{cl~Z4ki`k2dUdHsACz(22`+cnIB}HTX*&BXqS2Ly<0U^$uMQU0yt@H66!__n z2gbOYo(yHPNz!=9kt73MEj_`xh;<(Dp^NL2**u!}lTk3*5pKH8<}qvOmb*>O1am|g zQo<5QWofC58v2|eP1MVZGw$n+%@&UNjE)RqhtIAS#>IV483E%d`&kuTo@~B<>f+vo zTDNlDnR>MGHSW2CoB2Yw|9HR+z|^FjA$*=t$aXjkJpn1!r)4^##ttSuMdw3 z(Hh7X8`Ecp=CC6Qk{%RE`xI6-(R=Vvc-J`QY-)NmtBF;%j{msVP+%W(D^XACCG)__ zhQ4L3Nwz(vR*%}BvMV-}`IfZvSxAv++yg%E!|O`^d00nrA|ZusIn`dUz8VE;VfccJ zPz<8=uwkUfy4bERa07F+cGKoBu0n~&7R{KNo0%kiHV!HcoTm1(nh}0R)X6Onu0^X; ztW5!j_{V#l(_C9!-W{LRy0@4Vnk(w4PoEX(1-=M;3mhNqqom9b}gyN`aY-C%Ud~f8e zyTnf;o5pR*MyRczzfCpLAvQ#`#%uw{v#QOo5+dc90+e&|zzHxmvb{%+^NRrJ(mbP; z8uin?>JTju!-oKeQ{GYmKad7zi&9BklL~=s)aOo}wt}{f_VHjU&fKMlMpJi>-+IaL#G2_&Jy;*ilALT3qxW~*WgV%M__9+Rry($xrnMXel?kH{@JaqyTg`ZB zjaT)}D#uc>?VKKHGR5qheT`tRPMlYxP9E`DQ-w)pgggktHHGk>pvCdv{0=e7Ej$Gs zYHfLt7>?b!n9!_(Z@MPHYnO#%t1Y3ETeTh%39+y{CrnyieyQf?7H%9i(OC8%ol~Y~ zhUO*Tpe&CDF9NW@if;O?j+UY9TwY_AHkLFHPD7<%Mpx&k3IcF!#w3;wg87`!6Wliu zjmm<>JUXUKYrRvp*XShg?i`tx+4W`ZT4vxLaz(|v5bqK8frXq=>OOA_Y*+N-zKbs) zCMjk#%06q$A7GyT-L-kFy7cDTx|1C3TYX*)>IyN-KhBJ?54K&Y!(tTrQ>;ymC7}GT z?CLmT38NA0F$N_?d@#?YIX6ML12LF=?YnsP^9ro<8cMq(OPioaROt}ku1g;unvT$W z24jOt7=sZT0&IUt-ji$J>WbtMfq?0qZ_F6#c#avfX|?V&ei9mkU zsQ)BQDBCkxtmOIeY>7k4>r)I|Q)pVsfxARq=H@*@UK0#{0e9p!roSi-XS9dP&;sKq zbrs_u6G?N87_vX<|F+W5-L&3)uBD}AYT-E5^?0ze>7yWF0yB+oX#?b&IUpPmP|`F0 z&q4DMvtdoY(X19zswJT^Mky@d6to+y=;ryT`s+;_CN+jQGyS+#{H+&#N>Ce*vT4f_&*1K&x%viu0MrC*$*2lx6Qk^#XJ;ob7{!f~^*94EhZPW-$b~D5wS(^y zSTgLzYiK}s3Ekr+2|lvZdc~xi0}7AJFn5K{>liv_8KHa%X;Ntnjh;-jM(nfv*^hBM zTdFl_qs%3}L67CW9YaPyB-;8KUM$EfDcn)&?HDNIq^4=SR2_!Ft(`JQj=4;CSU5o@ zi7kM+|2DuU+x-)lS|!UZ zf2-CthKq%%dREXy+A7Ffvg85q-FZP8>mGNERSNex$EPv9&O=MXlxsPz$c==RzqF}u z^=QPB9C#qzWXfErbnKHN^!$x1?Up?n%s1qsjRSPNU=JX&dz^C3G`IMD)AznCyM@S$ z;{aG^%t5c|OHc5R7Qd2&qS986=6fk-(t+N~MAr%qN4~qqtD!~Am3O|z$CJ*y6`pHK z9BxA87(YE+g{T`jG_PM0-AoX~nlTFaPKo%dW#lY=mMH2lT|s#_W6i?|v>Ra8W~~pC zfx^A~V=M6?EcxpEOi>`@nf6W6W%&cGqHj; zpIbnDbDgijNYpCY(V(l&h#+35klcftIxZ|PwGiM_`q-_;?vxEM z+BE}s3eM0_dT)Xugx@Pg-tknt!X5oyHDRW<#&X$eGr`9sy{OMsXf5egt|aucZ4IIk zl4N^teC5ppqO@@}4L@2u{dJwfwfIZw8ZJ>?0c}CPc99?WtGMh^$Vi{U7*e_Li7dWy z@<6w$kJiOj*nFwaFP+_sskiGJy-{)}TQA(phijS3#ZhF!M7ooc5ro|KHxr$j&`qfM zR=apy{L|A!n%?j<=n;#(tn7=fu3mR{eFUwNgc>{4IX#RKU_}(Y6w&&XcOv;BrnGt! z$yUTxe57|^ok`XOP>t*Pg+qp&b>EJy4@9t+9oHdNoMk-|Xks`h8Bwp-0vt%|TG2Xg z)cH1_N%Q7aJH*1V195j-8}n^ATc^-+C{>9k9C2u~-13XUl+3ae?&0Ug;tplqpP{#z zk`zKPQYOk2rC+$`L-)0z*&z`|R3UYW%+Mb1Kz$Kv#=pdR%moZ{}ti z?-Oj5>x1tl2{krxh?07~I3YNg*}x5-9+BIt7)r)K_+P!?a?i_7kajDUh5$;`+@(zK z?I%2a65@t^qg0jl>%S1MkofzHE60s_d;i6V1k$;4zc z>>--Sp04d8#$M?$#P#H2%I1;Ih_Gw9>7S!&z47t40hguLoh)Q$S+seI0!gp0rRhhW zHnaha6vz=0AU?sHqU)6hbo(xtjPAT z?X(7-nJJkxiFV?`T9bOq#S(V$9IxN{i<-LzZn>ANzgX>5 z!la3yUnpq_mLtFX4}x^mqe1+785UL^$tS4LnpWxGwMAMLVJ++}JB zHt%tSuMI?6D>9c~8DOZIsyzt+h&O`4$t+8E!>m4hS9*)h*s08IUc!)pq=}Yv(M0!c z6FAH7awarX_HhDL!$r}-Qy5mU?8>=}|tl&-(fn6RrH*^1f;Z^Z`5@ME_b_ zDXkHod;fuSPiaWPAk75-9%d_sAYk*%!?SWt=LU`ttKqDQ)$~oFV@7>imwqf?u zjK?}2I)sMOZ%n^_u?(EY1BxMm_D5C58FydG_hi(u8fBVvZ_A>6U-o{gy$Tpl=6!8+ zwb=Ytp)I)egV?Bu)fVG^@0VZ0O{H;GhN&!a%ff!AZM<$1Vgxm%&DXr_At&n*lt z`1RBNPlEC%>v_Dj5@5Pv@N`qtR*i9*-}#7oZ?>_8sn{2PWGG&C)tIuEWp*BqprMkb z?>0?EY$nLv{p_K3n*Pc6xJpQM{4a?Sua)!KIq{R=(KF5P*l}XS;ZtvSPYLTn=FPpW zC6r$AE%RLvUJlzfcH*+n@IZ#Tmpq%~&4`42dAS(kc^iT0IK$~o$*ANdl+y|BZ&SxF zW~p)Jw7CyyY_IpgBVKM9HQ==$qJX#dJQ;bv|%^)b;p{-9t}{gNBLup6T`5!4~6OU zvZ0wXU3ekeDu|u5uGXhY_nB(*4NqZklztNopB4R&ms-&@{rK9!<4yBX8JaFFVW?NT zRJ;T0A!I;v9lq9ka3RkNOqh92oB^tkN##jT3-rXq_5Na7(v&4JhTI2~vA$*a*EmFJ zse)@la0En#LmMnsb5fOL&d$~g>$R)SW8tY`6o@7&!2sDsReJAPnWWcmV=jAXq^6yA z9atnd714L|nT{QJw*Vt;A8l}u{Hcf2!86kr5&Z(GeKi?{(s!Z7-mNSJf8T7@NlZkXgC; z6*x@GEoUi9YA|v?5PcPUyQJJiP?>`w0Hmvhno7(uam};f^npEMbniuR%rs)|jJFn= zvbgv41Dt82199#fNk0`ImHY{H+g7Et=+>Xui~N>|^u+x!E}gTGk>gpXg% zd&dS4+!%kWvTL)XF;_j@aR9`ubUeCJ=HB{@^X2NuM&?OhcjD#;aDu3UE_hPO5YftR zA+>KpeUh!IBS%2kkNF6gJx#YvTvcM`-dtPSmkx!usJh)O=N8yE z8mPoK39tSD1odjvRV6xU1!QvB4f$C+jujBTb3=_r`v^3vQ75--M__@My6Aa=ti)5V zw|i1qB=}gOqo}^Ed4ETA%&ZfaINrXed@MLcLvI~e)#7TY^)C$@tuZo|G|&@$>nL23 zsldx278`ud?lLaHdsNGW{w8Y1h0`4RwN7j%g|bpS1HDrO0f`^)+0Kn)tW58{b$iGS z`1B~eE#GU~s?mn67SXu2mQ_t(Wr_DUUbfGbnW7K#Pi}hEc(9G==%Z8P-I2*jy*8bw z@jz0KouZ`vt&82g*YA1~h>6UMQLPgWiz@_^S6eCI^kqh_0;Dg9W!Y1=M^o-ju~AeP zFTV%*#|gC$JW71**W@Ud>!uLzl8|R(iem1+P4e9dq;;MFyZWjcIjTlXpbXS6AF@#} zB97~gJwr<-sV}b$K~*3v4BlAYce_6$ZGtJS(^F0wg0k=21}kJ2OTf<p^dL~iSi_xCxy7En~}E}SbVG3qhr+qu+q zT3+kwLRI+6j+Y~A&9iVV z5P8{k8i4`XIzJZr2>sT}crPYeQ%w!b{$aogFVfOK>fT^DO%~UMp}3~Ei4P|5mo$w} z%O6oOz8f40LVT}?+x;Qu@@0f3mO@mfrW{JB-+B6eallIAk&rfEkfxw5y~f>=NEe*9 zX_l6tm=G8t&4@1GZeaUeeb_vH1J+wyFMtQN$hmwKdDL1&o%xMT9LjE1lSh`6KUFvgph zV#Jj%|B*za<;oU-QywI~0Pr3}p2I9SU`@Ee+_b7zh(7OJlrFr7W& zo#>F()DmX-q9ImgzSeX0^@e&<#|T@u+WKHi;t}B1S6rs*Y)_VY7#UK-qIBxguH|Bfu(RMbRWogs>Un-%zGeBl)Lg9W&J+1Wm zQSeumd99@_O*&r(&bbYi@yoqR4mrumFkECNqY;O%!@_67s3IRUv>sN698f7o4|mU1 zO;9jQ_aC7>?)<}T0>0O0Y0PCo>yqUsndDLG;eF0@_7fdHY7M+1}q+9+YK`6k}N}VPubo|87fGz*S>hFZ%^=)f>#=LH?&<)Enfg2!VgiS$ey&Nqa ze7IX7M*6Hmn#D90u!;q#cE|ybzmspnJ=lJi966=No8n-rb^u{;Dxipv2*)31@^I=<;-AkK76CJ}l(CWKq%J?xjGs(zK9KO_F5rT&??YN9 z9%P8lfyf;E`kaym4p(l-M85d zVT3-6>D~%NwO08{2n#g*CV!yAyZ^q??L=sy@gDa(P^X|<}AJN zG#~Zu6|zWl6pz0hqBuv+plRpL&Sd9@NADeD`?8DY8ioW*77v0g>)2n6 zf}vb#=s6EITWcXT&WJ@LMu+w|*5yRmfzrPuV2!k-z{TE(-`~I>Zg-R$es5b9Dod2% z1B)rde&EJ6-DaAwmPP~L&eW#)NQQTQDQEIS`Y1tkBaNq4?wcYa-*j@9+BBYFfjQ?U z)7OD3?AL_bMNV5X?O&O6IZXBhNDNQ50SLFe!X-xzXm+C)5ld~8qQ(anf9Et1Hlv{9 z@dXLJ+t~>mJ2p7EmvRpza?;0c*dz2Fi170^OdPLiQbX_9!VkKjjfNsjVeq8tZZno& zkXf-r5fI@{1evDf)IkV4McR~SE*MPT+A>VZG33Pb(Y+~m{?NQZt*p8j(oP!EBJWpA zy}4DY_`XosgX1kbMN8xDLX>fr7{B00z$w)Ft-6#!eTE&WsPEk#52dsxMN0N$FYn)0 zIE; z(L^YNhAu=K5f_15-f=tWS8TovJ`gK|{u&(3E8 ztsLpz+By_}`;6tT>E=xc^%Y*`rWRQJ)1UVa(sTv6ep`zMq;N|6Wg1}klcPR>SGu0b zi$5tVb%A++_&ryGXG}6{WlCMmfgLpmaFDO9yv;>N{i-^tI_Tp8*T92t-9jBlUSUnu zKsL;QKM;}u?~Fhf=en4=-*uJmhywVl;yt!TIU6y0qgC8%f9$_d?h+Di}` z*`&~{Mak-GY`A+r?bD%EM*l7tu(S-(GpsVngHIu|V*^itb1ak9kuVB?`9LF&@5E~B z5nK&kH6;$FJ<)$|exkV1<)GbdZG2lV&|069vo|8E7CLchN)`!yW?4wxJxa} z^u%nQO+*vCs@rC-jNqbgb#v(SI8*Wiqm|QaoxpM`Ory5Jw`?+u`HR-ZQUapHNW+3l z4e&YC%1N#8vA5+%Zwa7nIk71!HFlp}bI;-<__8(qokTo2LMgk){YsuWq-N-KG%CBn zQ(gSZuT#e-)YAbrkW>4rB?;7jNi5Wf7NgX?aN7kijfn2X?w;hf^`K}Vm#Zy@z2vpq z5=(7HrV(dt#iX<(v1e%UsoGzD`Qj~kIi#*(Gia_4LFV^kRjDsl85(H-H?k*d+T-QL z4>VKW^C!2!qB_LLuvCyAYlcigO&)53LsM#kZN)ydZ!)T$-+*WRa>|nWz_lAaA7Ts@ zRG#>)qG!GjT1PJWFr90poC-9*aJ*W0C|36J%cwC-04cqN5K4Np#I7fIt9s%-AQ8IF z!y3TE)a@1(78P|ZEDLmOo6pojPGqJqs@})9OxI#-%2rV&MgBWgtH>XRCGLp#wKQehVz(~Efb0pl`Rj4iK5=@C*aKqYEy>jWEiuLqg5+5-4vkfm7 z`TizfUtsE6>g{XF7cZh{<@*_`wWSt16D=dScm&QL3YM1&!@T)0>;94n0HiGPNw+4% z$gXFxS(@wVjId^dlA6pDqWnxMCC0$uAqRZ`5>?_C*>(Pkv`J;#_?M;a? z=S$&lbQgU-ab#*-^L~X!vxF!VxV|MOC#WYd8SXTdGD#kG0p*`9(IcmaYx4@Cn#_ArOUx1S)?%f+1FDwC`)8&mvgFT-ywIJj z5-M-i#{}3OX4`}J8UwC%Z-wAal3kdiU3{-1%>@@mw>i26VR(yyLSf+}mi`!QJ)a^y-GS z#>B}u4WXw9X>L1+Dvf_^Rwi2K<3bQcgu-(VOGX`E0`JVwV8YehHz|shE9?5FjmLP2 z>_+?aH<)0hsN(5s_KlY!35kYkOoE;wcI~lWF(}K6;XV-%c*!X^JY@(uW>_4_rRZkMnTWNtlA}fV@REBo_IyG7RU$` z>)&sL!-#e#S~}HpIV_LIRIO~u7Mdf4rHm*v>SfpnEn1(cKBB|{+WXCv{exN$&q!~- zj_LYiu8NYw(e-Yhk3qCf+^jy=s?Bnzvs%6(7LD@8e-pVt7`afkGP?GU| zm|jwZG2Z>hU|vG`m~1UU%#O*MXyGY}oNOMcGOcrHj8PNr)udbcVV%Wn9;$znsk81S zC&zfFKTnhTaI$wl4NM9>>OLzgI6u@hZvV=xAi2j0hc1SEdOVGbbEVaT6*g$#evs`3 zS4ChsZ63n!6yd6WblLZ?9c+2p0%L|oodQLKn-_<9tMyo=dFs{PX^qbpFqVAlVMbA} zfgu7a2VR%zsIIOqnDguYGGH#BoK)Nx^}3OI9pA!q9WkR9qnDWWNr%Gc`fmm17B`xo zEPGrq4*y3W;xiy0&+oE?cS4=o<+a2J-%#&&VRZ`0qGzYz*B;h}@Oxji5s{lo^%+2- zXM$AGVM$SJc3v%VBROmd76O0#Ws(pELtQ$r+qn9S`dQZ5J^BZh^~|YTr;r(ubz^OS z%!!|Bf9^WRbNC#AJzc4oCJxJ$5$SgJVKiA^y3xurVMkfsQ&n4Ch9RdA?`<_V8lgjT zY;RS-fj!`z7}tNw*eARmSFQ9+RD2Qj%#9T)yvC6-cl-lUK%aEyVAdkIKZnuWF~K4( zLNAVXg1a(!e5^rMM|T7=ZRIOhmU_mu)!fKE9Ol_f0hpYzcwi_vYA3J(*wDJ65b4ZUCtBEj zle_gEj1QgqTb14+Y^{6G?8V-pf!P(Q3^OKs@}b>5Z5I6%w$~HC?zZY(J!I@#ufhm- zRY@vpbmg$*+P)M~RZ^YvI%AoloYoRXlOhcAK(jRt=?d2z?S#I8YZF z2yi9h6N8^iGyrRDVSCy#T?yM4{2Pyq`q{-f$5Tb`*SOvInW8$Pl_laBz|BQe#+}m? z6_MuJkWS8<-S@sl05-_BXjNaXmY%OOg<93_$K4HF z@9J%ch(vovY{y18>djN1*xRv*SC+%y3+nwQP2$?{B=30Y?>v>b2xs#pUOs$XRtu*E zrTo&%!6D_TK+2ie3Qo8iE6Pr+sYN)V<7OQoBloga0ER=9?cTD`2B#N-8h-R z_@js})L1^5wL>|hVa}0za6l^#>O5;*MJJYvc?-pf&6o=a@3VIAeLHz4q$5;BV|TNX z3)e-k@wDlTuyr`Rl3xFasi;@OV^G?VQ)C6gZ7ce^KLeA{tm}xe0rh)0dFp*o!M;hp zRne1ScC)|-3?P$D40G3;hfTwMZO%=?;>ps4uY74@G2(186rm00YD#k~tlS5!X}3cAm06H+do&A{=QsmwwEf)GAzu=nb_#N%EfGdT%Z&s|mIvTEl**fB$|5Zjkkt(Qz8@P?Ua zgYqR;94>QEjniM-h%~d3yoX0aQXCr@Bf_8inIA8C7tk-l+Ez{H5oMQTdumn9>w;Bo znXH)SLK}X@I$z8D<;k*doDs>5YSqHbtAF0xQf*d$T^^-bEZqNL++z)ca?f^IVcTWv zmbR%!5_ZiJWFD0kc&AT?6FJ2t9GJ^@9X78>W)rPY8&+&lF1Dq7ygZ6iuUF>$l^^uK zfxrmI1mVmAR0FHS)KlhXDcdO`vfe7}6rN2BGoO74O=23{#N}5B-}`~uF}14sDL=rq z9^js~8sHpb5oHAZOTrHCcGMK23~@i*d#JEV$&nNQ%$8N3Li8^lU59iVFi#kGldO9$ z;vzDTC>*<>u=s*MC$h-_X`hzilg0@~dLv8^2$yt4U<3O?IY(~C`hY}y4TYTmR9jv8 zcle(qkCnLyIx>A*0e-JPqiVX^Y`c)b(G8rHfOMv6T4tpMo7~4gRb1O*xw&r&l?xul zrP&-lV=3!0vXq|tZrM8j&2Mn7iCiPRgIBAb^(J9=+uk7Q&W;Sz+amr?ubc3dUA-UO z73vVOEoUt6IWx}T5E|gL5buAye_RQC>kSuQscUsV^pD^gC8Ept}TeeK~|i@02I^eF{25q*%9-#u^Kc zE+uFhO|)#Y@#nFnk@b$Z)TpbIE1*cq>p~*(JBQscEP-j+Zi;J5#R~ z)2sKGEG6bO^^r3~x-jnS-dx|omr%l!i0;>1+#6GrH6s-G80x)gUL=y$#eNMhkN%|l z=TZEgr=FL;_L%h>M-1D*UR}myi}|0m9JcIY*TP%~7!srRoN}T`#`d)X$B?!1*d%P zvucK?)<32oy=EU2JQgo||L$3vvAU9~FRP?sepLLBG~_^p;j;3hppD*j0eb15XGC)P zfS*7Abg6q-60%yx9G-v%lnccs3mivM8khM%{jne`%RJq9&fTe>te%~_NE>Wm%=vR1OKC}3moUF$Y zDfWe}>g<~jmAV~g9pP9{=DA*h6xLU@(+VCTcu}mc53U+fT4IxzD^o`%bYRyRQgu|6 zS=DC2kv%J$c68sGuC06tDVm&72v-1IfwKl2i9Kcft^Y`!SL+Tvav?c?H9-b4z^#cnHVIS2oa@~JV=DP6bUVt3GOBW z7(Iry>?ZS830yR;HAAo7(*Kn=z%r&IEvGGf{|s+ zH{TKilmD_OOmjP`7OG#T)?%mEe(3!SWD7Iro1zb(acB%oB``Ygl!8gu+;tKwm?%Y{ zVgh7x9WMu(n98J{z1D z<}c?E>1|c`!82JqP%eLQ*`eazL&p9bJB}L`2%Pg2&xwP!F(!FV>pYDR^u3<_L#vqW z+~IqC%!C9MfK@l?P#F27jQ*m|3ONV4rM*1Ha<=r0#F>@mgayRKr>XGXQ_Nel68m=}-dngBZs1EnJP!lbB zgP^fBj7a}gS(xmu+_dsQqHtzr^oxPoJ(VjFRJX!t(&q3qz$36V0URPGeK(ywzR! zX>{iwann)UWu{qm^IP%DB1wFWk3TGa5U~BAVLbdOuAevax8>>nQ*5G%k79rVm63!R z4lCjK;>f&|*XW)`fVXG=K>rPN{2o}W2sL@M4D6@jL^}fAMAKQ2*cgX%F zxtesHhRUsq!((u6SB@ z3o|$T{!)Z}D>O4mdw@a{dy^eHJdaC$u7(1}sloofP^GETHI*ZYcx~t!#8?QtZW`|Q zwvE)A*RB0Msc%TzYIrPNo4r~Pan-_J!huY_e@OfBUB8iE%_g=U*5hk?PbFKi^!cBb z6UpLak!Vi9OqSHsg$zSYCIkjf16ngF99)%bE$0t-sgzpoQ^@FWx?WH3vg|=ongq{Ah3n>G>aic!>s2`8-=yv2e~PVW)1F z#sHMYHwIlTZ1+w?w1j^KKSPf0d^326D+P0CTf_OpySA{VrXBLu%hbi-23b~*g3squ z(lQ40a=l83#1hUg%9^;i&GjHxTJofZMf2WOd08%VMPe19>=SXS-|+!5X3rAb_r9oH zI$er$@&`^vT3?jJSj|DUqyf`~#=VIV{Pw6%A;H%$G(QvLCj#?nb z-wIH>a8_AP6_rdt*dv`y{Z`;I8_+K-{T+H{62_T|rVPJBT79a617&DrL&!KBh5MSK zVp#;ZUw-wE$^V8}L5z(WnsyytiSm<*PuV1YarMjOerU-HxsfmY$e2Z!=X8Tk^2y7N z%BCmx4L1IyyumZOZjFnx4Vf=YaGzAT;5TMWT)VUMK9+9;7g1$A!Txlnk7RWe0)L*X zadLltZMHpk!|izDy5*r{h4W^s!MfaK>Wu5AzhiXGSk-H%?S!5K!#`V!5Fek5{r7Sz zZ0#At%K(-75Vd(_yPYHDGIf9CLX4{JP=iMTGn%%LvXv{lut1PKj67OMS^(rsOitNR z&KuD+oqDc%c7I8xo&S;q|En&0yWNY5A6Ldx;$Gu7pX>f5`I&ovJ}+49Y`@!c^3SDY zN9Xo^O@V=-5}e><;O)`jz4J$&u=`f0gXcU8C8yAnhr@K&S-+!nnsR5Ky-Vd(YJ4}3 ze$jG}cYMEH??=SAM;y&mzwVY^i;CF(BWTn4>3s}|(B_o5nx0=Di&y@V)DQnp z85mQ0sH(4jW@f~dnDeGEH5C7UZ3hHH)870d&a3lRL-A6iEcYYmSSR*B?cQ#3%7${> zh)!4^nNA;CSi2M2_Mf85v&Ye?doK$v|B@V36??8+0Joj~ce~HF{L{1sm!nTL0dv9b zvzKkve@STm^PKJrH9*~{lFGJg7`9C-*fV)MIJ9NgppEx3U`1{xbnFF{o<%S(Z+(4L zvHXd$7B^4AzdMP~PUwrQC8zV!jhLBGCD#XB^N*nC-~RP7r`qlQ)vC@L@iW)HoV|?n z3o_u@|G!%T)g({!hN;+I_>CqhwHBtH{LfoF8ycod;dza_d39gpKT-bsZSbF$Y=lqE z{HiJj4i+!}pL*dy=g{DI+ECnZ&+GmFTkqXQB>jEGtp{u?u^Gb$XaC(T%>QgE@;tl0 zVgQ@#{H?{kkNdACjbf>Ns$#p00N&Kw_gljM)ye;PK5>VQutuQCLQz`(`*b!(i3Q(9 z-|B2BWrd8wSN^w?p7nh_KN!hH15a@9p9cGP??>w39zDAArqaZ01A8sM{Jq0F^m2L8 zyQoh;oaTkZBlkVTF7<{=dX6z~nGM8IZe9BvUDNY_Ni6kS7NQnC3s45iiux!eea%o- zVjW$)w(MNi-HP+`-{4mCPC3=cklVDz?5xEciBx@|X)ttg09N2$IEa+J+2ts zd3$eQu#*{6;pSGcDUM8mB)MG7r8OyehP?K{F(aEUbHe^4#nON9I;wiGGS)J^krAO> z;d87-c1Gww0}jxo7QCOw@$rRV#Xe@xT7!rQwqce&hml=|7&)p-}+Ju0k;?9%ilXm1{_$r zADQqbA_FFysCbaL&uKbW;{Bfsb2w#J4bFzgnL{s`=scY>u+>v@18pBbQ9vHpl?tSG zw=z7+@NQE)MWiz?8Yp7upAnX|a%Wr4Vd0Hb`#5ts_UGGZ zp1@X^xCV3$^arhNCaOstl!e&*4i$BM5|g3Y`=Jq)Ryf$SAKFP#qG!?g(~ESiQ8j=E zacq0AYL$5P%ToPs55eR+F98V_jp>FN?`Ni~EU;(g7}Xt&ql?@-z9JC{`}AQ5H{@P` zoX;l|Sui}KsDDys7f_8~#Oq>=2YAwM43R+#>-5k>KG zRPv~g^WBIWvX!Hu!5lA7@_U>$pMtG;Zc0$n;Rumoo^0}5tZ|XKIx@UI=y^rrP+j4@>hbIBBoCiO zJ#ROXU5BwS@`T~o%3S9h z(C|G;p{;!&ywv~Dg=J(w>oUQ$f^WDc%ECWSjkD$)T!O*Mh)6VAZ$r!19V)dA+f}|S z+u-HMw2DCK^}f`dqO8K0-Fd>Br@z54NwFw1YQp@z7j)*Rk`nJZkD-*Es$Txdn%~1o zur5nYJ>Mti2U^)t5Dwd40)ebW^a0I$oB>ha9y~6TaieHlo~h9)&h-=&p_=XNzv&b) z5Rs|r-(i|YvaJ6{jNR2+cJeq1%9YRG8k?fr+wraMDdBldnnPXJ+-YTnd&=ak@()A} zzevd|1pML~-`+giPCi}l9qz{U9tf&yu-VxnfRCMSR^FdnU3Y)jF&-3>V z3kM%S{j`>46&$!lZ?OhsYEurZ;G87n+nEaz?C>5Mb;7@{oPJiV)1Q%Hi@n#BeWiXc z{9U&2(pr6UH%Lt&n$i6`Wb)WNnvvFy=zoklT#k_8!oo>=UY-Hg=oIetnsLzbdA0!F zl)~ilS`@WcTAXEIB9L+AD~*nE5f^PJ$+^7cS|JA2bN8`Cs>w9XOpR7Bt@7o4Va)?^ zSKuvcN*aja7&?EgTy22jNF$Ky=EY7!3V3;QM^U6T{mvJKX;rJyj}|c5Nx+3`=axLx zXVp6%?FxYFfmHoj2uA!#qNIdbKVW@Q2>Ldv>maz|OvpM>`e(CHF>c_X`ib1VN=|E( zFhLMA@%b*z-jh26qss~&r^^krkrw;Vy`a5Hd*=^$ttaar;!jG86NVJbFH;{E%KFH` zxERXR$xL`YA*Hj|=hoD2x|qAY=u+KTSL14W?m!2nTV%6kOz!{;>45Qi)u8hl6fw+ID&nXmz-I2tDkC&*o|GNxqhP_{po!Mu zdKH@`8T{+6JRMpz;R+5SIHUXb$SXBt<;sy$n&0hhzWw z4?=(3RVsL8L800_|0yj%b3bG~{3o8(gMa;O*SGv94!G(|hvY`*RxP>Be@g9A2Bc5^ z6}A)*c5vX^-_`$w|F0la-64OHfJ!|t373pOOvgNG_ka3+MZWz@A~bk5BDvUB_uC&> z+O_vx2Gsr~5t!H;`t@uEekTKGWc4&sQhcE;)T8dVs|!s@id6sL^xn1==^xUEZgB~Abe>4Es%gBqX($m&lkjsoFi^FvWNXCVbYrg}tM61}pz`MJo~1 z$0u5m%PnL5@cNQTq9A@%+DE8`%8D_aJ=Ts5a8n^~UMBRnuv(Ngze`b~fHl4Ls(TOc z=ZX3H{6WFJ#h3;-s8Ng5*HZSvP^`8IDee;xbOe==eAG0UvXW} z%jD;}`9c(;C<$$<^+lIe!=W<2LS;ztSdgtmskUo}wZu4olawj1lCkMsjI~nMuF(}( zZxz~M>yO__u)9NU_hw3ZBK z$L9eLFCk7epzTtjl%$*Y-|y-EVYvUVI16P{;Mrwtv|C8I-)gwE8kPeVvj=UjJvrjY zgL$OQBj7t}G{)QPWN%~Xk8#XDf1Ys4#HgMVB3J>5h!b}$Xeh6mpvXA=~S1m8Ql2GJs4P4jNI5p80XcK%KH}-IL z0lw@xRNPW0PojReDRS1oSb0Gcl^}zTAK1v?g`0H;c(t_C8dNhL-lL{Xnc{ZF>wTz%|bIO%iJY7B@sMl zADI=i-WxNi+IlEsX}=OFY+%y{Kvw}id50$fK3rtq&5OccwJ9}p#@3m2e27(NO~+Jl zjkYwYKWsVml(pZWY%6$jAVWnG7y8QSbGMt@7<$)H{4Qa+flAf)7Ld(3rnRL_YoeCX z$2+HintGUUH{c{A5zxU&u*~E!pDstkLrVBOl9Yfm=+uoXqZwv$bID7TWvI9nf5&q^ z5)bcWFbnMb} za8Y;#1*i4WwJ^3(DPh!cOY=Rq&j}g{A6?2F1>s?0n{Ylu@8;AE*w_b&qat|?2M}Ld z<>=&Da+z$}htYgMWhVC&7$;~Iv#BP4r0ql1Pm&L4k(@$KVpiNocIB7}96#4zhiFx^ zGT&K(g`l$)Gdj58Z4Y$a$Ha%G#o6S8&LHuisJzqYz(X~tdE|{*JtA4r+wRHli|P?$ z7Fd^L!f%m?jVG-QtAF_opxlmGZCBAK@N>tRR#ggf`B&rXi(*U$C03A1j3(y$;y}9 z|6FzqF#1UwA z^VEvSAJa2*QnZ|adsLi`g706SHi9lb#xW**9Q;AU(tT!rkMa-5P`I>boa!Qdu!3Ftg)h|hz%2tc!ijn7((U|SS&G$+D?V3LidS3Np-xKsamGQ;# z%OR-U9Y;23;CsNNKf2vUuTXiO(P+Ny%GD>Yb`Gl0AK7SC-7MC2olqtH^bbRW&Sc@e zZc5!3?0Cvi?qa+z+bcd%U4<+LJvGW!$Pvoro`Pcpt*d@2AD26ATQ=EOU;jU#Z+d(R zjM+aj>$)a7^KH4m5Ahi!zj&cLGCndefmQcR;PX1CJMulbH7gYjcZp%}{EXm~rM$UQ zcztd0WWfY$PoW|GJhhp1!cMZl$@AG%f>619^;zvaYfizA) zA=+i5Ca=E?YF5rq3xlPW?G7ZU^Z#}SEj_;7c+~H|`BnN4qpIj1hDep!!^``^kbbG7 z+Q@Q-1CDE}ze}5r*C%7)PoH3Xl4c~r!TkUI5cGM*@ILQ?oZ-Pl_&}*Y^lEx*`C2FZaTzAwk$2#K)}1&-zk+*lTNGiU0BYQ;KP191F~~{B~?zt3h%=f zlxSpeB7qQ{Ge=_|AnDkxhK9fXWKq?m84|`}VR5`)5PfoHmf8 zdpWm1^hJ0moag&hk5Wc~gIOnl=-k#U$sTOIlxFBxvd-G#xxQ$B>slTm^2r_LQLp=f z#dpON4cP!=x@?cf@Zp-AxOw8fjyRkid3xnRpsfRiCC2U-eH=Z}$DW4vHj*$)8DoZi zj{KiZ@(WCDY=AW}p2INWp^Ao*^u#3nDe`k<=(GGMj@c$YKhcbtX7(63XW}<;lzP32P?t|v-u$d;nyTfiCA9nX z+(iFBE}NgY5b7f3yepKA(6IMuwE6og@`a-yYkcIr7Epertz`V|che;WsuUTbFyWuW z$&6(oSJBcY0cMTFTrS(U&eDVG4vePTqQNQBI9J`0%my^B9%Lo|FjR20XMSk0Fq+V< z@`M!ob5{BkAfv1HKs>k>Y{=|7eRa~Z*F-Cp1|1XtZ$rB`WyCL( z;;b&sCVa-=t)G<8_}K_quC}CO8S{j~?@T$2#0i`Yj_qx)<`zrf%G#7Swa)$T@H?6( zQ=^Czbch~yBGMR%w>G(Iz0P_}#G4#yZzB!WgC&(;O4Q9|}lOHTjur#|Bw$(ph`8a z=eHY!%3f-EO`P%;=c{uoCeSyN>pIW3N3Y7eGgk5BdcLAUnOIr471*a2^su zDfiK%PbHOE9!qroRJJhbOq#V0iF<+_g9_s1U{L%(R(Mt)uG4t*%lrIH?oEmGc+xY7 zE&50!ny@c2j!pz?ymH$4rkL0cM;}<7+7s+UfTXBT+W_vr8zX4KhM+!h!d_M!jF-jo zM3mRZ=liFiw%DXCy7T)x?62pNl|u_O!U6yD|vs^!yAe)%D0{Yl479&RGC zHRkILi~}h8v7bZnHU2pHR}s=ztpJt-<|7|YS+V%m(&mI;mLCTBht?0ckfp={F>^=od;<5e&ryePlV?_QniRy<>I8Rst3mSus)`XX2w;m zxh*h(CHF`_7TQ_iHroW0HbDBO2KZL6DRiutG6IM*J32^i4a7L-A$#EAl0;h*;IQxU zSO@`beh+@laJt25(WhvTSwpd{VP-t#U+kpUl-~yrOsZ4~I4o=KAW7+ZUng9x9b>Z# z8?kE4yQH_b-n%jX4r2zyODCInTXM>eg-+&1E1_?a@SYozXNfxV)O?Tnj7Qj0-t-HJ8%;iI~#D7BPvNHs(IJUdx7H3RhX80r%dHQqMZG zDCAqOwz2g*ZPE?5D4C>X;2`V!>4gEX-a9aMtQ~hdz%@=W_;UKydXu8oyon`%d&tiF zD!ANBA$eXqywzOKFNUiG)1b9DCJpgR?NIu&8Y+h0Fl;KxMjh;K;pk@&p1+(}Yx+;4Zhl`Hs`K*KfIH=bY!3a63?f83 zwcf^uezs1+2!R3D8+7PoIaob!JeX1(ogSh-cejj3(Ig7L!M+V-rwrP}&qQgFmf1H) zv$*M|RD({@(!w`lme>>$`*<0pUm{V8?^FE0Z|iUpy*<1APU!cHz#UBjkeGoslFeW*Wt&^lU66Ti29tKkeICRr5`( z;rdGC=(SCTq1(g$8IV1&cuEn<>_L8E#W85iQn24uGE%CmWT4irju zYvmgGOnD{rnB=FV>qe`{dw!@&|{ciq| z=&^e#B*pRC?xxT0%pk@gtZRb{VY*1ddo0qQQN|VK)%J(0x6xsylx`+XF=J&=4!IgC zvKes?W2y0JSi3!E90rISXKj`Ac!@ZUm&#wnf&A(F$&uCqXL5D|OF{Z$!L7)5M zv;-&r3le4FXx3j=0A-zw(>#H1IE+wO?(%?-$Q_o4w3ETCf)MooL|pU^INcQr^a7$aq< zlp?-=&uh-G7$Hx2&-~M6id7~?lki)TqRZ5X?9cs&xtFqZdBai9qR(xwwS;KnX59iUQf6NpRrB)Pqrf)>RJs;XU^i~J>nGxu{^d`yBAb(J52NgSkH~MA)CT{ zgy3G>mK6JquMnDgrw(#Lp8=w9>y)6Z3Ho6R0DElW2Mbt>xQ z56L|dpEBF%Z)i9g`PmbML(X@;Y^-W)@HP5{*Hsd?g5glSH^n9WHQVS_e z7G_gEhE+vgFyrAgIT4CQ31a5-uow=CdQk?c+P|I(tEeRJDtpUozgM2}Whp^1a%fbM8l z8rq&QJw*zmc;23gm98EhU{c4wGm+-j4R2MB5H63C69{vWG8Z|Or?Db!H)j>L@r?}# zFjyyT#JK{BMy5}E7CtdzV)Bprj?UOYZx-wnN*l7KM25k~*BvkVj{cKVi(JuAyVDg# zb^PG9>vc#`GVvW}A|}~ku)8d3!vDnL^Y*`*vOGq$Bu>e+P|Bh>N&S}n{4CluRP-&< zhCxhWY$lYysv|0l?|E!58h)m)xUI4>?B`w{(|WEa(4re{%0I$l+UeY5@-ikO#u80G z_f3o>Lm+@0m|;nsvHS@9A}XQ+$B4rq9`uRI99J%`YAt@W5z4KoWZ*~YmP9sa)1!Ji z;?epQ;*e@bg>*kGrtvlF4#6CWO*?x_8b%ov>+9ao>d`F2#@u~JE>NQO)BwMT`R_fE zBHjSE$oTsf_r&O~WLut((9YN^#v1MK9*SC6l4a3 zL9J+d12A{U%09o&y#AePD5Sua!t&ypv)SRzn^1P^w8*6T^TL?AI8`c0U|v{?seI&- zQL#2u%pLGRHz|d^-u$E1L|co7>S>&O9oyJ4Vq9{gaZS-9FFZtaA!pUDqE8M~yhz|l z?2itnpkT}j-Y+90V1LTh_E3e}T;$kS!)11!j2-R)aF5zDuYc36r(~!k$!4BupkH(s zIgf@^IV60)EIH7#!oP{-r{W@@(#D<$#Rzyc{)tqYOH1TR%g)u-lWd<;oGT%{rW!Dw z5V7=d3=iK-0zW!XaVgT3JD`yb59v=-H0xs7ceb~scSHSqs-U^HH0b;)NbZ~>*!`NL z)x%@1hJnRC*4`$m8EVcD^BW?Jt7m9Hhsmr3)FmNnc#uoN0ojw6Hz#Jo~p&^=*BB7Owi9*q{-*v ziNmX#EeDz3eA<5B;qRXb6uh|L*Zmeu-h0-Z|FjXw$B@c=`09b z6Ok|a1u;*cna9fsFL{?{DrF}i#{tx3lX~^aOSzQw9|B^bM!%S0A`NiD)oYLDNJS#UP>%TZH zUfta-j0gS(yN;%}L7H%hh}rWr{_V28`+qH;1{oFtc+b>>5C35ZeEg^;F4L@emzbCh3$)U*e{$=hdsyTE7BF~_*5C7C=;PE!`$rU3A^u6XKKk)>I zB!%0+wYby>jZJK6#&2S%91qSQeD)i^=`*)NnvUPQ#!*HaL1m%tW+Xw+c0qV4gKStW zJayeaFr`X3hg(EVk4Bm<7<1NgOnxlSB0}?liIs3Z6pt>ziS@wr$aFaa2YhMEM++y- zKbcFP<*usLFSZ|Dy!!HDIc?&zn2$q!!;S;{RyS8hs*UCT-v)C7KCw zP84OEth%10eRyQU>JEr4A$#4#HEQ{GPaRTQsag#>GCgCgvd|b>CXtiU>T#q0Irb*Qihp(rbpE(Jm^_X+&uBT zM|$xC<+00wxrzC;e{H1-3*b(KN0qkl$VIwc)cwI4*M%P)2{Nf9wi+$QKbtRb@ufsi z%J3sGoEoU=ow5!apb>h_(d`N#_X%$Qwb?FKLYgbq z7qUH&6$`j+y{Wel@g77SS!+qnIEs&Jf@-_x5;6iq>IB6k`!&ID;sHRAxWa@k6I^G4 z<-3;b<}t?R-H%0ACyNB!X$e1ZMGZ(n?S)Uh{{??W{eE9Ig75R60xmeSa4>$QZ`GmaXP0tl--;K%zqiSb6z-@^6dv;Etp;VT`kok z)b(e@YRg_GYS{Z9QE5BF_B`Xc($0?8;wvT($IVD~xwU6O=qr$}5k8Y6r>r|Oc&UF$ zs#htZJvw=OrXoA_O$4{^RhV<|rV66*0#c7$Dz$@Czt;CW&V^k}DQN4aUpcyeYRPx4=+@pV{(j0oe{HDgxzu{8kSTf0R3;HJkwI^c~ zQnHKjzo+cLz6GrpZuR*LPId^0-Ylp~P<{h1M_2Ku3W@l~SlsX2v2EN5bO%Dt`?r-f z)Gnqq^o0gco|M_yFwrzIp%j%ca-a2eyyFR64)BAua124*b~{AT-6AY6cFrUtzm--ihWQ9@o!b zx_vrKA}dK3R~a+|D=O`70G>}zV)?|aTsQ82Sgs*zmm=hSD;TK0qw#~7LMw|L&8gb( ziLyA$P?i)hez;YfX)LYJyLWD0VWn^h!h_>@So5C4gB$_`VW3>qPp4)s`apitJA@}8 zQjb(GE`r_icdLS{FI&-0A4PmF1=eN?U7T3)?pvx4w}utd$)kmH>PoxAmv*|X ziK=_OETsvxM$Z&ye(G<|6SlC$FFv_)=CT%%qM*=i!040 zE9j~l0_3=W5-G&CZr;aUZ*)qEbNc$k{6XNFeN=sfh|H8M^P1y37q1CJLrvM#>RS7H ztGdY}z|~|IJYx=OklZuf8Juc(v6|eNlR-yj!X3ya!_7XMtxVHK*@P>^eQNG_de4@T z?sX~XNZPKPD=+_$+6S-sbGy*9he#DlXo8;nafB8m*3L)Ayu1~w5i9v99OE0s%4Qd| zDE_ViNvn}ahL)96BnGOf1#dfm9Sq#&>V_ZOT9$)V+#!M+YTfSSaUBwgjOcKnOLCvX zBZmHe7zcKH57hA;xeseQghWfwtLe2Rrq%vhDOMzGf3yIenGwY{AIn~ z!QKIJZr(&f(!LBm^O=Xw!=u{D*_i!ZNNDQq^8pr>&{Vn7>NlJYSqzgppOt)tiN6`I zVa-OZdy1&|J@aPn9X1J8y*wMx*qg{+qT75knFEE(zorgdj=yL->W=3seVj)H{^ zLjFGT{uGM#5LL9gV|Grj^^bOBinf9=&JUVNBX8yWrjAmlAlCjTd%P6GZgiysS5nWb z9YE*l6)k)s4^5W}l`b_5C5OHE+>$gVafmt)vrzno@7mSl^y+C5EM0#-44+%jAXzll z9-uwC!}4*z#noa)@DkeLZ};DGweSuaXmfKUW}@R(<|3sVRPLo}B*2aZOo5Tj5xuiK zQ&(|ALn>5Tc&O>hznvNk$(d&sdV<(OJiGQ?k+<4?6?wx!Zf_67s1ZL|YIDZQ*kHFE z{xdsDTC_xiK)04|OQWa^bG)O7dlUcropRdegh*4Ne367V0?gbbJ(KckNAEi)Jub)o z1l(~(&HZkLKqPq1Y{k%?UgGnPEga`i_7&y))x)<$#{;*h;3*dSs6fB`9q%25{etY; zO0g~p{IXh(7fo-fs?|z{R&57-d6A|B36);8jVjA1p{T;}spF=>gVoMi4O@v*l4cwM zL8n`>Mx`Oe_j7Z@LxNg^nzR}xVSMD2xZT}uW=A9Tx&~cBb5Xrrz|)?GWJHK1i>i*J zaLg18;l0J+&=v+0vrvJ}&5e*LXz8>etA157Q-%dwdOOv3UiZ6CoQhGCmkYKsw}6q% zwk&?vzz4hih|!FSGBtP$ADwqXp~Gt2JU(v)wSNpgR@ni^T7il^fpkbL|3)M7Jq50l z;AO4ye=maTiH1V_##$;c+*YzGTPr1MFK#^}uDbmBw}Fw<=YP7zuHct*b>^u(nho^E z(RD|B(8@vs&drL7S@qKWf>0Lr(H2V+Y+=-wzaJCCI~s+@eVzYdY@)UTraDfjAXhHk z?LM`r>y9bOht5E~y}bm>1R*fnYwvT}#T5;c?A%`ediy%{dU1JXW?SzsM^eR{7qmmz zDW%n=RVxA1zt~NU|4Lrj4Y`j+rn&z3oM(?U>(vrs~IBv}kEf-Mgh5No}`PtWI<~jPi?dsd4OW zViehuA^`zfjsoJh?eI&+N~E$SW`GF;q+2PI;**b_rLUk{J~>Sm8CL~QE2!If{>jK2 zBYn9Ymb8Yr#m!@5sRQrzCo84I~Vxh;wBbySy*;wK)?%*3lBF%v>ndw((tK5n;2l5cd^9%}0^ejTIF3vYR$ zyX?4yVsTq3a9_oQt6h|SAXtoRr})xaa|UE1KKp#GkR97PL{_6%7E{EORRZXUjJU@t zjG17oxwy=hhb#?0#o%EXpG2vZzFJ?xb2g5Gj8P0N4|sam#+O&Y-@*o7sJ|Z_BK<&_ zOwwC7h&n#tcjko!r$4IaWU8Ne%=&*Wf(pe2r(KF0?p{VTD$T-2=kwoUo6~2SKUPkIcA7h@q$GFHy%*lA?gX)Mg&evGv zVS8O#m;l^9^)}3y_A*OoypU@YTPn@zmf1IG0_VJT0#z#RR`0|w_x*ZqlWd}?-e&iUx=(MXVv_gZ6zV^UsPhj*6h^Jj0tP*clxuk7>>rvpxolzDugY6!OmA{6)GI`uf z-PGGDVy~tkoH^!iA-}Nym|P9Z(TS-9?osRdR+QC7m1M9uGk;K<;z3PKL@N5`-wJ`M ztNbS#J?3O;LEYu85e^@~Y>5h56MEXu`tamovB<^CE_t;J>q$j}gaxAoWPd7Mersmg zeaM4Z$bxx1PxHCsMdY|xD=eb(Af5@~@L08n5?7_^rUS;oTJ(TCE5_fkmNF@$3z9C? zOT;GB4NLZ+5~gWh&{^&IK_hi6d1vA$K16+2Ar9Aj3opeNa;X{Q4G-{r;b?zRJd?5T z?%tjyhc)kqSn;m?S~W#Oxw?F^gSJZhtNK}FZXGrGmp?8Xa4{Z#-}XO~A10foc#XG+ z=N(o{4uC!Jo;kg>=rrarS^QVV_Ty9zpgacJmx@mUXgFK~MWo#4f0p#xR8Yb+V(1hQ zpq~cS2z$W*m5JK4%9cVkMFkG+Vc%Gg?%PG)=-3Y@!@0f56YOh{o9bPBGdOag>}i;s z{r*p0Q%KaTmTulzx6jvD@lsn$(eY!b1AU9b`((K~|L$@qX39njK8GClyTYb86H;ps zHylJTbNjuN;*MRc9<*C)CfF4_4kfPwABn2=PuurWNk|8Mps-2Mbr>_Yhpxsp&gV06 zlcyI|!&+gI#JUEu+DiY^J=aD>?_l8@AznU!Y7k;UxMeo;`{10MAZ|L=FUq8ij!+v; z!BFE!&OTA}7Y}S-4u*^-?z&ibHbg*pRjWZGh9!9}4u1vocAg~$!$MaiM5^rkjPlz( z#A%dAmX_8$S}qxb3LN`eiMmTJ1cP%L5)y$hJ+uj27)ydnf$Pg5z|Ke3mZdhRE}s;A zIkbXZXS?#z0Dkh5EipxfX-)b^syO3hK8I;#cX`vnHz<<_{oM`FRj8W8tgWY$nkLXIK+p5I zb3UEEaaV$+(vihU1)oOwl}w9IN0@kVnqgffA~?~jP=|mB!EFjhK2>JGp!@G%&ul(* z(oVK-SJs*7>Miq%RT?Y3(8n@JtxrwKNg&RUy~1hfE~$XgnbbS(o||~R#Mwb`8_fC> za4=vV*Xz{h%I_Ufm=y_p!stoM0VeHjCu|QZeOk)TUJh{9I;AmaeGa;8 znRqqR)n5jkBPEJUPq9ZDzX9c$(87&)t!#o${_Dw?y-tXxYWDkb5Dy&KvGYf`CY1uY zv4zR@x4Kn1qpQc?@Qx2r0qIPVpLfqqy;dvQB+Ta_oRu&0?lq$Fu(DB4$wQ| zcOjbHlK_-M*|IWH)pom3ScV#t@R>a^%TT94gVcA;Jbry~H*fDVSobRB4n_-S{Rvej zN-hjSt0ag$PqPFeK@F!sf}cCCXmG-qAFkKQUc#|K+w@zQ1UZ-|&Z}JpJeAhU0;*~i ztPQ2Ea;SP;!m+Ws3CRB1l3#Z`I6QULceM^{L+NKc&>u^2C4>n8lj#7(kLtI?{qj~; zb9+?9DfL6WE5*sjL-$s9{)p@3V@)5)tJtl47cL*(vtSwdp94a~o#0XiI#v;Eq; zEIk~*eq;^Xo7s-mEPKe~*WqLv3_4)$!N;2g9({+DXW9NDSDva&BhSJP)KOt^d~W=q zJ_fqgT*Vx-Yl&9q7RU_F2Jbw?=F88A{;`W$JmKsN2qCy=aY%)D`r!Hahjn^d%}Hv? zk2DC@iJF}ISyFy<$%_xho#j|-`CmKiMp)HyTsx|8gMelWy~EDG)x3=%JdgRZJk$8& z`tJM@*>S7=*j(r>6<+}C55D*PzlC|vcl&`L7Hvsj2urW=UP`}iRqL{aSB>vRNvcvT zsa_(Bid$57%i*w9R9+rv{dGIJ6E^{{@T}3%JR|i-YkR4LIs*TtNlb)DdGty^Q&KrY zN7xpfD+0YgKd5j(eVoUCp;?n?Q4S0uDS>)m$^frhWLd&+T3Wt#_u(zB|K%sx*$R_V zJM&B}RjdRoIVx^f#iTHa=>W=*N`r@UQ@<9!^KT@$MBuzXDV2=8oUKsj_vh5PbniBD zv?3P;ro2yzJ+@0)dx9NY`P!P!MR|?2AhU~hX1e^cTf6qcIfhm!y@^&|Ya|hOibM$i zuH|FDJAqZXMugx*u>?n{r*oIR-Arp2FiPNy0Ix3Ilq-NJdIOM3aLP9DCuoHTRJ)67 zv3p5kAo#u2p#)-%aHuSSkqI=9y-)XO$#ohfdYv3gIgRb+1VP0R$}lAHYVH*0Dz^iX zazE<&#;Pm8fBs<#d-(tBd{bY;8y0>Me;$?F9vHOvV{@rBQc{~M76 zSITHVUkgdu*}`gozzt${iw?kBbAuK2buV=)uroL)%@y5}v!j=Op#HoL7XK=<(a-Y_ zBaNW*qIwqnjxQ*vuS}J8s3>SGgL!_{#SGx1G8d0pYG8Il559&vv!7>xHB;M_kPNc> zw&}V04%?**Oztz1@^160W}l)z@X55m&z(Ba`xSWD5D|3~*p z_*Lu$3hhxba`}f5Yl}KBvls}lJ3D&33`xB`v3XQ(L=|rT!Eq33f8z1N=pP387}mqs z>$4tJHqp8yd8Pa>V*!vF6u)Ayy$R`js-&&5?>71i+YhR(=g z%3l-w>fuS}PT?+H2uFizI(aV|K6X}Wzu}w{;rO43=o-q8Rm-~5f(vcTru?_T?B(MD zYGr_lH6J^=-CW#H-l3v(!wm{7-?dk)wsAZN%Q4`xyKzu?Q&*JzF~>c=}>A1 zIIkC(uV^O`q4QRoG>QUis2F*4=+-b@l7V#eERZ2LpGzKbG3yiv&68+!Ud8&pt^?XK zph;^i4SX+xd_$h1hI_@BXp1U;W7u}qdH(TRAUkRFO^}|kyc10~Iui|nW-dBgPl2U-c9zj${*MDe}I-23!WkpcCKbW$YEumfyq6H^e5{7%a9f&2cafMe7x=MZ5^@DW2&j|F{!P~vAaeD8F{ zt-{(w#P1AC1i1P7j^8yJ<+u4hez}p@u`*_ob1C9j4_y<_jypJBo@&v$KTj*kEU*wJnNS;`H%Xi=K+@2|SZ z(GmbgmcNvK+`eF$1AJ}6+hGAZZ$;A5HLV{dTy{@aPupMiPMhs}O_W)ES8tX*ZB#PT2Fj}s9f^VDA~OF z52$(jhnFRGV6|Zv!UVzGa*bp$zf`$h^$!RTN>t~vR9#81L-N}e)AJ$hgYh*in#rys zqPu`fV=>hmv0XFc-HD=J&Do!&;40Zl6-V;u86Ew6h>UpCyNMPi%Lz9r+I4P60z!`- z_egf6--K9LslW7%swY)rSLLi^4HyJ@SG?ELZ+P*THM66@IX>t-IQ0wfmGs8{R$^YDVythT3r@lU}u-}gH@EOu#JV}?e+VtQ(I$; z0LZc1JVV;^ilK$4v(M`EU@&FwpT&VO#AO&`7n)J4M-c}N-S8F;bE2!l%(fg@7wpV( zH&WeRf&n|K1TKhgjE`qIL?=F>vF+9(wEZnA*ZXL^9wvCe`}unUcX3j}kC=PanC<yxaIbMo zN=gOPqFpD(U;=Gu0KeS*2nQe>et&tZ``wAn2ag$s9Nvl*7c#qRGBGX$aRcb+wa?l! zYKx@OGnx(eU&%OJeh~2TELRK&qgjv(lqG(MI@{t zY}Y%;7~$|hd21rq(**>1d_?9aNzODmizElVsplUb*0}2tPZyGdCH;?l2_2?xHvHXJjeZ3J(5|4P|12_`Y++ER1P)FQ7S6glSWa|KMFnGwFENMV*Pbdc%c0qpxFZbJ2e|U zmmObA@(utRo|KoDA2X{6={~+{1UvlcQHT0k;CW>ug|iDB#d_<|HO`LjN}++?%4@mK7YWtmnO@NIH50lMLE@{Z2(b>ni63*0hD zQ<1PSeVfa|`r~$h>eO!KT9*<5k z?MFSjZgdgN)dcx3Tj>%pAWcZcIlp12-rqd3coa}zEFN2z{jbu zM!81e?d19krFz<%y(Af@_`-Oj_2N>>#qeN|gD#MZ$eP8;;b#WH7 zN=86vJe7n50QZhgFz>BANQ53iI2L|E|Nd05s)qYPP9F36svU26;n0US`+|mwIj%@< zCX5~=b&WaK`qWj+t?>PV_hIt|TAPMnz55Ttexd!Z*omqJvNf@B;VuLPz1^ZKtTl)I zu57ui9HBjsnt1f@8yR=-xRJc@cAv(xY83M-U?UQGUG}Bx^up~TwVlSW0CGOt>Igzx zGG}%q>+1huhz4o*tK~CG4Tvab|HBa1y;i(OLwBrpZY%ve@m{jz$T^v!P)miOkNp4u zjofML&XidQ5agr0-`BDmbpZjx#>5o_wDibzQoqbDaomR1g(!uP7@j(lvrFnB~i{z zFW4gL13YqpJL8{PR9|#MrG~m$4CV{T?$NgH?#AO)3(ls$E@`J}(R=0|cT#;ng;kMA z|KD(fEI6Nj95m}jf|a`;XJf)6U^+T*YyZNrrGM~_QxOPjZ5v;6IxmdWTuhi^uf_-_smN7eM`K;OW#E0weW_+V|yup6A+iA!yoNN0#Xp zQ4yDCy{zqoAxfUr%i{OB41}gWmnZED3(i5po0nJC4u&m_@5xce_qQ(XN4H(UYbKxJ z5(1u|OCpu*d%2CZcv! zuk9cHqAmM{a<(_ZIwEOD+?XW}F2t@MsE%GHpf5|eS7SdrJ{ncA-(_YB4=aZ1 zV~*e`k_p(k#{QbR#@$Gu{5{aY8^1&!fqw4w`e`ax9afnk@7^K&j%d`-&wA#}hPY$& z$q_aAXp^`+guc?sr0!=!KO4$smR?a+q2hH_g4lT_?Nj3j`|Prz-hq*a+H+c|XVpsu z8LmC_9u5X<;C_i(!G7K)@xF|PUXh0H^9UsKEMLZIXLLdceokV_r66l*1Cb#CGD3xk zI$3D&SHOwgP;Zlk#bc3)K_PQn+>vk3(bZq?hZEjXn2FD6a4wouU?%$aE*epMvoDlZJR)UJhHo^izSq64BHJ3d~Sc*n@XNN zJDY#dUt6%&C$x4D2|LR3O`wsBU3LVCmP9m&O{e&3VEp=77E8{lY{K zYJj+By{0d$lkrn;`#N_J=1kBQ+~(vL(~20XSh(eWQhYonW6n6c*y9@ zg}n?`Agn2k2&&za(Q-V38alE_I^_A$=;Yl=M^^ zLVpYJmILw-%&$>2z`Nj`cQ9Txq$5bMO~MF~lBjMU{{{>9Xai3=&uppvo#k`{rBr~p z>l)fjdSMZM_(%|-*uw1DD$rJ-`+g&&!490z)9<)*W#@3u zL{~vu6U+W)aX5D5w}tn7;BD>U230AQl6Q$P4l2`qOnxY0(uK2O!v#}ThUO*TRS^f8 zHlawg)$PGu%N1e2f_+er+rGROGom-rlF=;71DOte+oCk!DgO%03>#8qGz8kbJ>>4j zUqn0CCUsMOTX1=!e0qn_ad=Etm9%Z$WJ~QuF6_^ka63mH({TBKRP{f+KVC6{S)rv* zxK`>{KC8%a;6OIX*_hC2X@H;ll;k>ewXO_{Eo_MLgo1%Ya296X(W&^Unp%qK4wC}= z3i%2qI_GuM&)Rvi(=675glj~UTI3hymAo-JNwwaqhD?sTOpE;QZEWkQj6p%uxX8B+ zN@vdgcC2Z1MxcX-Xm~6arg}657L2S}^G#5m6`Kz85)NU=71#HXR|?X)hwEIu8JR;z zsz&vo6!>#ZBS!70VTESDvbCO&_;G%(k*^7M91%uQ-ZY~!?ZMo0T})PXnwwWxu;F{| zmBCO-`MpgVRnCkDbevno_$ASbJVZ-xU4A*TbyufioZnIY8IQRI!ONLSZT)7t^tSBu zQs=uqPHtO76?nWN&$%!;;{Rgnz2BPZx^Hj1Zxxg#BE5-7@6x;U4odF`NS7udfk;v5 zy>~)~NCyeMsWb&C354FHCUin*f#AvWeV_B5^TXMHz`m}%_qz6)YtAt~W2&t=o)BX^ zQF*IuOQ+eetcb#M+WdPJZT3u1!c@HLQ=F7bBxKb;Xqb8x$-rOh?+-hmXe(LGING7i zR@Z1Z(^D-z``U;V26C(^C-W{s%s0DG_!92e35!a)&{iMbde`sfUvrLa z`>rSlYf^%fJ1xJ=T4^GzTFPK4=!ex@!K}sZ8&STo_>BZjif(Y0`8!vjb;yQm6c&P+ zLaSB?l2-r(4N}VBRu$z=^kE|KS1Ka?BQZl1vD zv^tT+$;zJl+c+s5O$l~mJ&PgdPoKo7CEzk7edJ|-2F)5|2cgw~AUkC2W_I!Ju2Ndj z&-#YShb(ORrVUm|3oAJdQ&Ww>%@bHOeLPqs%AF-YcaGuWMfD|bcD-fTb!R)cWCu@i z(+O5X^gKoNkRvEE!);pR^i7A=%dx=Jl24IkDRXu&eeVE$hqk>bqwg;r&>&l{txN05 zY}*=mfqfaoc6(saE7x6@R=1rnemEmvRIMsAqXuK_(kJ{~>3G}&q{p~atU-b^RAeKJ zSLn;+cLZ%6Hort9+q`8@UEP8@-kbO19ms`m=d(|E;rC;1I~m~F{?pi69K>8XGjWpm zC#7uwe$@fmvRj2Uh)>1j56u1;S9rH^Q?GFZGn@Sm6+6->cdenhP~>MNji0>!fU#1( zi#tU;F)dn4a}#A~mU|oID|pb;=JXvb4*pLoh}F6FFOe`s2Bn3Tgp_W7)k2k;wE|5s zHiTSG)zCor;{zLt&GSD=!co#|zZWx&W_ntal3L)kR~glp~h2u>b*SQ}1Xofa!Xz*?vb@$DGYIzKEapT20zXE!7SqlKp4x>vi*t63Am=W*MF_R^dJw1^)n)ME?%&bpH~d+Gp?JHhSP^Xj1wg0>A) zG`Pk!=Xfy*Wpc4zdAs8TztA$yUZ}psk$CA!Zv*9(7WNJP5q7ICua-(406^Vez-m_J^C}^h8`- z-?!vK9K~IDYb0thc2_L!i4Ura*hACBS0L~w3*cyV_bdJl_?cINv56)*!&DQl%Pg5q zL%R7`+W@AwJHx&X=Eg)~r&Q~vadr)s&uWX^b2cZBREdn4EskOvNh2GV1_nVDGy4bf ziiL~s&`P{!6>bn4belT5j!Nf=13`Qxi_6)drIlGweVl%OkNwSX&-`k9xyiJg;=AsH**fq&!u>2hGO4eT;5Ws@dG!Qq>kd>+7bDCcc9}pTCOS~o|W-tHT0-G)B z7unvVfi$BzIM^N@2i<_ z*7@2NEx*d^aiI*eTEu+&g8Bg&XL%$Gw=DbhtvT^Iwbo8}pQkg`8$9Yve_Om6S9nDD zCXSxwYCY^otQTDQ^{z{eNAo>W36>`>m=TT5Md-UZYT5@&1f_RZ*G4#NhyqWybEv;? zfvh&V!M@j6*54Ex3Pbb2Dneu=?or*n^RLX<)8MH@-9^{fg4 ziZB&u?#d9uGGx#DsgjB>ydDdUMx;P05&JME18D&8BC@UqptT(U7 zf^!4z=Nr4byLYP2R)+~UO!#bydz!7~&&Fk# z1?<>c)xwFr>U>oLowYTdsmfO$H7w^Tag5Wpn_Dip>+LE<3l#8m9VF~S03^K5GgC%S zp0LWX=EN#RLbm@_i+j74eK~8^(ALnnOji~-9%Yg{YmaU0I&1IDaxN?+gk)cA(fs3+ zY1f!f|7X)g)gAoi-uSYe&Xw)X=I(%m6O>MpaJFB+?E5j2MC!Sx-($dm@v@W}iB|i` z*$r@ZdUF)tmv3xP*QYTB70xo~@UYhcf3NDHGgJPuP*E(NffdK%B$KGYu^g#GmgO=; z1qEZVxHdVb_;s{o4x~74U}J%Z>!(bn3?aoBEi_h@G=u;6FX;2aD?+dcV(X z)HF3+F|JqAVLz_iy&Pr~cv)*a?tgSB(nojL<`gwJ)5_~FHiXi*?trL5VwTh81a4|@ zAK-YgX%s;nf4~f8dKF*8@P1Xe1R=6#6}Wc$wZTD2L@|3JAW?F&ug9 z^&o1oU5e({!dTXE6x!u6)zD!Dl0*YiU8SWn_w$5{XOu1JjDWdz+m{VVCI7MEQ!q@X zz+Xl+mGW-$V?A|3{-e%4>#BMGns;aR>F|H|GM$qql9Hu@nJ9NS?4z-xn2`SssJs2T z3Jgn-4$Jhp1)-I8d6dTa=$$4rbI6uv3qk>Wb3i1brtZtVSm_ zwemR1d#IW0aN;{jd~>)tA-blCNiVu4;t|=3Qhpe*P9C)enos+ScqCWu=ZA4tIV&>k zDK4~6|1*yxTqwonoBCBuI&$KgTmLr5A{>s>n0>gKYX4KUEQIFE_5z3X*(OJQ1LB0# ztKXeuj6XJTusn)Aw8Rzo{TRUZf?zKAfo3wnX~C)X2qIrEZ=^n_$rCGARnL14vs2TE z5xvJPUpvHT$`8lq91p_R$M^s2vt=ISfWb&w7Z(>~&U|j)d36M9PYKwj8l{S{+m(c& za(G8Aon+hr3btw-!l@>@rY85KMa7z#R8GZ|>i*{*$LG-CrcOtsAh2{s3QcK&El-&y zYkuuc&MkmN5)H;`_%TRZ9mIRP^s~$X$y zC?_^M$YM?L+gmoWV%!wQE^K5`H4NFZx(Ojpx~W#$5=FG(s}S}(FP>gsm)GaPl9iRx zyGr$CYRc{@w#-f%xk1><$Ejr8{?Q`YPLtvaelSGKRxmLgzF`oqXdWW4JE14rT+SD8 zZ2>?E;B-i8+{7!>@~R)k7${TIJ$Nu!I2+88TL5zSOmU5=@_^j0y{TfYjw1Sqor$PG zm$a@|8EaPV>G))8+q38AJ_zN|eg8(RHiNy;j zH*etqj>=MgglB0u4I$;rzf(cP-_dioMLq2i*-|MFM_$1e)x4HupWWFw((7H#Rj+Q0 zu3%5SfNmjOz!BB22ZLPRv;XXVSFib8^Hxkd^tG|Gsof%ei}bFbSJ_#L&{#sf8U1^T zw`9+@Eu)3sKTxonwFk3*Z9^Uidk*BgtV-Pds94=3?$;6bAW9MLd}tE!ndkZZU!v|$ zIu5K1eRm}_jATwY`R@w;{^UJ&`BdQx9MD=fEDY*|eyprKLXJ52t`&OuVW#Y=K; zWoS-kF590gyO7-Hc@MSK*@h<8?@G5u{5B(l7aJnkOk!g2A&+M>wv+>ONGrvSebE7F z0cA@kz<|+ym_KN1Xi_BD4PoR~_il<&={2@;yiCoID153}-YHnmtV{GklQU?Tm~L(N z%nQ7jficK*2cIVS6u?$T>?;p|(_<3%(`Lq$D$d;gU_zc7lF~>Ib2M7BH@*=t&|6$? z0=ewja9!l=9x(!9x0qLsFvOp|9IxbVD#ay}VyeX5yD z=(6#wXco7Hv)o`Fl{JIs6Y+`^;c$y=Z&7FJ(^#TBeuW-p*-=}7^S(pF=xcKTkBdAe;s)mvA)ji3m`xWjRJP|Q- zk-5iC@9#T&uy*ZdHnno$cI6w;^FDydd2ShQ9;2ys_HI)VNSvzn2vS_V(lyO;DBWG} z>D4OLWA>EX&iVPpxRtMMa=nVh5L70zsq>;ns>}yoaP#$gjSYe^HFYU_VIkgz5^&Ehan%om%vdl&> zaZnAKmwkK-P4YT|9DK0&_Gx}K$;F$Z)5=9wX66~V*9N}IX8?iS$QsZGOc}aM7gx%7 zoQsluB9rV&rH*l?bqTh;5EH9fF?Eai!2R=4zrE~JbYGclP${`gIoA4@DiyUPe1+i| z==?#q^!1)NPLB}+3jQS2fVPnMYv7aU`q!}}Y ze0ZRC#ewB47B4rXNH3lrHl~&CHoB7JqQ{jV5^ObIrOX#A&c}h%_ktx}QF!`3-rG1h z7qSD{a~u|>6BVhia!{nn>P_QW$j$nurZbPP4LJ;FK7d^vn!R;;lG zGZmoQ6eam80e zoAenb+k)}FAZFXHg|ww4d`dxNi>Y(K)%SqM=y+E(dxnVqsBa`w!k<3|suB_9ta8PWBBaENaHyfe3) zOc?5U`dS5RWJS8Ta0KoUEFRoNeYl#$jSrgPv#pRbE*T7NV|oX0*zF1Yit-~E@c0&b zsKpb*M_At_wly|649DT6?#;8Le)E&@%?qfn)vOLWP%^`_@!KbCNGA%m)QQh$3B*LiauVntDDD(IrNRM{8>QoYMFh*!Jd-& zB4yJ&vxIn!_vE^a5k#@$FHuq7zIV$xJ=k+v>uf^f+a&tniJTyZ%02)6+@+lSJ~Eqp zxW6CG=?B&etRZZt=`!D^tY$o`sA9_f8f-WV!)8Mhl>G}OsV&quU<%=w?}%cvUksKK%*qr82p?duLel6-=*L|nd~&2K#LMe1 zk&o0e_H#3{%PDgud&8Cd-bXisl#{7bZi!@>y>Cx0#>_BP`Z*9ykh7x-i`l&-P8 zb*B+L{}pvvscTI}C%F}T!x0o3*3|xgO)^Iy zJbTuj^?hiM9j>&T^1!OWzeJ^Er3VK;j^Z0iP^+$Ck>@VSl%g%IEB_s2o}L#`W9s>E zssEj1`sY1^>h9L5b7jIYGn3T0uz-{fk}S$@p*8(@AFn->AF~qi@L;=bVBPti<${aC zRGS5^qTkTmI(pIEz@^W6wNrei1LsqMSm>+6J~>OBGRlCXKPE=31zYCRdHuFtUL+HB z2)3LLV?VeZhn8A(+JwE`)pwa$09>qa$>N(?t5!q(ne>#L=5O@7>BDQ$8}2J<+YsdZ znXZj^Qhd#Wr###8BFvJ-n}^Sr3EIbonR6wUiUoO!Y^pN3fdQX0gQfM*_UvC9;==uV zs|F`~_=&eANF1IVV=;AW%J5p(+KA?LLSna5&>Pxd1p$hK1LvDr`^2dY1&Ke``96^@ z&7wy`r%L4K*Y*`tlfB6fyRJ;mguf$r7~^rPU)KWf#B2@>UVRJ-Y*%~Hd)K-cd-A_T3fcfp<~-L;sKt}UCx|I`>O426alJ8q>b~!>MRV;Q z9>$SaMC%Ns6uZDh_#d9+EFRdH1$=nynA$xPbQ9J!)+sSb(>c-5$(0tvnYa68yC6bJ zl|EgDy3hE{#HH{m@Q9^s9uKLjtMTdoAg#Fs(j<)c7EI8-?>h;__Bv&;Hdhp3;78ScWQl z5GOgfK^-Mej;D{J$5{rmsRbSgQY>y<+Uk1AX5}X0{jIID7bh+h@XaM52E@_GS|6IE zuvQM7wB5%5JE$QxyL2b&0b{x*Tc)lggK}=+4Cv_n_r~)J;aQyXFzPrYwFVk=;-MkR z+OgX3Lup59c;Ai{x8y8HHPXFprI-sCWGzJVTkwC&L9dj#JQj20bP{o#n3?dv*(Dse ztzEN4!>1FW1R6Ldx9!yTK;LT5FE6`6|1VLr@aERT%a{nACGhCQ3%uMW@9?Ys*Uo06 zK2HzZn0<#qhz?|Xojx-ZCzz#IKOij%IwnM>>O_^cVqh8uVL>jsqK*NqZV@jp6Z@iD z+}wa^!#f+Tm?h?!X5Ya_DNR|WDv#NTnEb)7R4o6b3zl+v7R9Ez-_3)wGrb!Hojto7 zvGFw9vo=`kPU`rdGf*6%?-k^|asE^iKEWKy!30SW&hn>98s{EOX4!l1!m|lY9xz)@ zoPAFKLJMdbGHfq+k$&BZ;@A)PPb?k1hT7{T6&t1ZL)HB(XH>bv%>(wNgd`ajXR{_z zk>L?FwxP5702O0(Q~KqMXt97J%N_GnaY>i`B5SZ*Rui-6u$l##{E~grS&M5y#g2ws zv_SIrQ88+;nJnMbPJ$0ryUtMnp<^>gC4Q1(^Zc!JP{j?k~!yZ)e=`G@$~^6DnC}c15eTtbDZ_!8Bfe`a&?S~ zbb(|-R*_o-sB|Dpm;Ge`(~H*aJ8XtV_w!t!XI-4$7f)1=SfeB=!%}yC&KRUTtt?mY znbqf|cSCu8i(xEa&Jm_!=cc_=Kq#(*OHRafPdmh%0or36Qz6L|AA}IlOdOPMP|VT>IML zrR0zvLx=uq719h;`)&v3Jcenw_=7#Lls0>sgZN&t?jqyK{#BI03Ha{YTu=RCq2yqj5aa92 z8$$!wALt(saKM!bcC`ZMIHN#H+w8t<$7jncLCzIExeb_jl#nDEE*?mg-paH}7Yy?L zo@H%x>Yli$FRShd{9r%oso^OZef0#Zs#|Yr8jv@+pdp5MJgb8lM`X%xZ?MaCb&yh% z;?x1i74Z#_AVchQs{&&#Oy69;C|y_?zPrg?4ydm{hZnZSK^n5)GABUVl}mLK?)}Gy z*4v1!UGGcJ@!Pgv_@?@j7c6Nv9O4HylNB&cLkqzr{%ZZp&DGqv+PAW zx;V0U%Mh!Zalq_w*QN%bnw11(T3?YyyFy=RnOG!(VJphlx(8nd~i71lzBv3J(w8 zv}kSP#ac4*?I9hFpjMxi37#>!rszM(WY(Q^sLRoH=oSIn9D$SlJp|DKvH;%U3 zg+;o+CMutOsTSnr)ix4jHz{!7$a3LI_|zD3&|l?R*Kf!$TL6|Gk8EW7RWrp6+L^iG zp~cOHo$e6|grj)co(5PSFQN82IW3#GmR8!*ek*SytWAI_INs7UcpkM);fy!;Fn6by zol!IND8S5D)8w5xhp0PQfpdjk;|AmXpNIy=ucJfhsT@nz79=Dpg?BweUxH5&1PU}> zW(rL%T9@~$GC))PyL_H9fg~@hA{O(RXBl$vzI`qya1*qvaY9qU3)7UkQ^mNY{KY=Q zU)w#AgU1-2)ahB9PPU;o)5P?Sx_&u( zZJbK%oU5DjKU~DXZ;i`I%%X3BMNjk;>uxG!V{Oe5wBcwrjUlk633fXcN`i&R$^3Xh zKK^@iF*k;U#P)K#KfG+Xe?c;D!h8rRVme$F*Y3^@rpheltIK_tr|AkLmKW)m(>~q^ zS9-62j6q#HZG9@;1-oB~0>lt@4KKku;cBS$Vnn~*xQ{kRgo=UQ(%rY8l|f;TKxKm! zYtt>9>uemX39vq`zeGIx27+vw;xH>FZDX|6ZVB=HcV;ex#NhXW0(#5NrJgV7I=4D* z5NIk|n~~o#)P8yam{%<}iIcLx+KQSqiG{bw{CJ!t&yw@;;`nTc*|688?w=|UG@bv@quonajHvr9#-bZ zS?-LlT{0m9i)1W~>*FQJ!|6<0UgO|oSj9coFW~?u$viJ^(^}@=e{xS zi8#I!U20w2&pSxpx#CK>FQcaAemLQ?-ce;&n6bVvwq9GW$Kj3)jp3ge$YZL_49$x254X>m?v8 zKPKe%<}XoeJ!?i-Ep$0~!!@;GwU70`Tz=&#_wj_YE;E=jMH-^BsRA3CSPxCAPirlW zd-*x=Ev<-1>H>o9vFl(_9dUDTctBV=<55ObrTMO@WGbVUc!Y2zANt!uj+?L#4?}!5 z@qI3rP)={AW95aL_C0{0&*--1;9HEnEiw6({N1o#A%< z_;9)6OK7n{9QH`hmfz#B9>w=y?|ES>T~*do&_fIQ`OPeqwPzgh>-afIq5YqV)i(`A zS2swuYcaMfqzXAyw+K%iLK`-#e{0o2yo00c3*%qC^~1>#)acLu5($K_J!i8D)t$Jq zcJsltcHN{GpR8tT-c-sG-fWAk?#;Fun|W|OVQtCv8rq!+Uln{&e2O|Egds3C|0S|A z`b(7ggv~D0TD&rj{7KiIM?qkMS^=4NkS4k`g>kyWuoG4f5M}m z961p-^LJ8!i$b1+yhq262?p$sMVawUtKa|CcX)7TvB3V08aurWI~Dyo@Wh9%iGX-# z`R0_<{+OLPb(m+)IXhd**<0{eRV{qy?hnxij~4stf?C8^s+To(I!C>Py0RhDw9n+* zoU$|j)sVa%TzEMkV0|q(Z^m@it@X+KEz>7DyV=;Ml-0EsNm6QDR3l%sy~_NYUsi|# zL(^0pQ)QO@Lbv#Z4_?vDE?FOrzcr@N!`AFcyuyt9MW*GtVG#k|!2 zJdlY9=9?6HwDs~ycHK|Gi3MTDZ#K86w8*lqA5y{7#O#k!ZS1ICc1;NLTs&;T7O4~5 zn$(p-@!|rE0)RoTCbtn^x3y?P;~r%V!H&rC#|$jF`S)G9zqbn^X9!#;YmKb!T^PZ> zg3i`5&X84%H^tK2a2CTWwi-xJ)}4YKg^mUN3fdoA}K4*m(# zS1+F$F`X?4{8(c07klwXOiXUHR!z-|(hJpw`G{?T+tq)sX+*k>xlU%R!Hp4~_jpaZ zpDx`=&?6u0%!!@P_kS~57f@$0Pdix$4PeddwNc;%>{VfQTXRFmO9Oz8{}ySwd64I5 zt-W)IWnd5!B~>)?W}3D(n@y|$!0WgJgDzA;WIaK@uC3WD0+h7w3BFC0Cs^gEU@0cU z@d|0gcIU2y%NzR6R^3M&@&{CIC)r#>s5Q5I>Ii!kgj~6-C0yO(Jiel$8Z+bdK+X5b z*M$wgR4wo8*xO9=>3mGaluoCAx4d}slERfaxA}A)p~mhsM)sJ)7w$J}cvQmRs7sZ? z9N2c8zX%a6m5pfHrZi$6KljY-wauq(Ae~Glhc&IAjR%7L8cX0us z;ro$rlLJHT50YdSj++K!Kh}d~2?jPV1LJ{d!<9T($*3E+K<1N! z8Z1=rfPFExLnc*jlbMa>msqExB>1jUhJOVgxqap5-gq@szw2O7J?xH%bQtN!jS;^k!4Gx7cB?DWU3p0;h? z-%mg}y}Nm861ES6O9*+sf-H3zI8sg2RahsZ;nrYt|p7G8+rV24oi`Kc(A<31F~; z__ga*=J@^G%7ZooCEgy-EA>~C{ZMS^CpaKa7E~1jAZPftB}#GEMa|`?>%>&7gC@oc z%yi`d$e&F5oUDS<=hZA1=gD;_1#D8vi#GS36FXAVf>u3g+Piw`yXxZgs4cS95$2;) z<%cO}!dkmW>253!O2s48^(}QvupyD+8gukc?1l8rYlm}66&)r1=}Q^Sq#bHHS0_5JaiQ^vnGrC54T|q*L;*1t8pmU&U|E9bqDz1w zx#ETSR_4TFpG1)TB@&}lsjbLS{n&>Id~J3?M~{jpyIHzJIR_+8-;?Kf_?E(MpkEV5ddPjI~Yu< zY3n)dwtLwMJC#1>X11JPq+1c1n7*uw&3QYZTZQJ{8bla$yHx?qW>t4vN; zGWy>|;XW&0U4aAdu=R1bHVV%H_EjPt#hN96+o*Cf-m<9-XF1~}>BjKb@b>0o$6*Tc zaIqJ2uzs#4VanMt$2v5d4XhRB?zTqGUBSsaqVqa%Jt5vdCfQg_%sYVE_Nrd6jccle zJqN6V3@nJ=Nh$P|N&t*;bYuRRch{r2Ayy#_9y zx33`A0~N*04f6FtXnFjr)4~++n;HGk@+4VwDI?G5qvCS%0`ma5BT!g;FX_2$CTiC8 zTo7s;RXet`06S6|;W$@aKe2@loWN<2kg{dw5@O9|c6YnPJr91Yg2a=l34>!fvpbLe z_|xub*)ywm&epVcQAZyvGot(?Vd}17WCT~A9(XYH7Fcqx~QJ)g%{Ct}py3bN5#!gXNQI9Z({_Njl!-B?qg{^_*d zLhGu@Ef)2)=-ok8wLyR`>wz1%)uWt7y*7MGm)X7DhB-ER5hY7 za4D7hZ8~hb&7(DG^6Uv9k6+y_%P%S~hWxXc%QwCHXP{8IlLNW4n*EjUe?G{?AU8Zc z?ahsA7YNL}FAE%Q=;MeJ+mcXjg7k=rra>!tXWTS^xV%T|ipB}dUhG&quj-BZnZF-KNZ?!?Zx)P)u#ru4E6B?lp8Ht``8RCt)D*hn7^s< ziSRQS6q?imNz+O?^AkskOv!t@>|S7uyPo~$Lw ze(7V+vBmqK_IPF{W|98*hEbq!88fAWhrM}JzJ483U?sQP-l$trZ*LF#S^MGi?8csz z$AFq+&xNecypzYE!Btvd$kEDSAIm~voG(jV0|sJKQ*~5(Fma%AO32TV*Gu2d(-vWT*v$Wlva|2R+f_*?a@nWj?!8*bsz93Tjbzdd3Y^fgk4}{(cnnuLr<}4Qd zB@)@>ZYWIpnxmrn;BIT;bD@3ZsB=lKwSy?>hPIj~JuZ2v-G;oeXgORVqmN~5g9Ug@ zc*M}Uv^=UX5C%+1d+O=Q&nuKox3<5oH;41J|JYUx$qdo%;ljr5SuJKC#TKpL$$*66 zqZNUIDaP87N#BE)daw*UyeN0%ra zJ0c1BOLP@2Ae8_beaG&<;ejXJkxi6CaAnMdn8EX!jSY2axZ+%RIAb0p=~*s{b;v2P zRytqZQW9PfR$fXbz$CXm_x7t!n=%7s9Zm;0Tt& zeb^$d1CQzpB_|McgW};k-Jj`V%CRzD}5t6lrwuF_k4c3^|=R^qQgz%T=6=u17bnq*C{78Uhxs6J0qX##;vR^nnxo^O< z*)9HiHmHbpO8)#p?L(1L{6>H@-tNNe8MjwQ*sl+U+MTDBoeD_rL{FH6*|!O`cKrv5 zCnJK)^rECE{dB9tACBxt@ND}@l&yiiQ}7MmZjH(l1ukxWY|$0v%y}|H9l_SwnMYv5 z?i?1H`dWEzQP$yH)qlObqgm>{Mdwbb`SOIp2^mY}ko@7z-nk8TiEZYOy`i43(>dsZ zBQ}zl)$_y4yycF;UG#W?mqii4>t<_PPAcPTw#cIEtA>?6#p+iPYR{g((Bbr_qaFS% z_#ED%?tEcm)-v-a)3sID<~+&H`HKoiVB)R+$`cxohh=W6Pn?2&4K$7XY?c@gUzDu~*(fSYjnWhevxIQG>f-^=pSQ-iCh+Ey4mytXRks#*Wu4Q zp0+JkJi%EqWE|}_-fysdG@)wFdGzPSCaoFPqoUbVuFlmK%;h33&m8>5(0j_vfm<1G zc_l5GWl!EdO7I)Bb&DlQ>7{$`G<)*;Al}Hh_qUqvub=Im=$M+#<^(Z~_wO^|^e5ln z4|Y6f3@lE1(fY@4RX85eK>N^7_I-{w%%Xm5VURDMotLBfOWLywNc&QYZt5^g*`wsV z-~`11n!`C0vO77W%p@u1n3x|9rP4nunA^^dR^xVXs49ay)a3Ei)>Q45#c9;?GH=O~ z6lxMPyAZe#;gYw~+rh2g%oj$}VHuJzYzSPk0}!NLhJCxxQui2^Nkb#5W%}|wUQR=w zgVf2%k8XYU*`mf+-oW^g97Fe48Di|)e+Isz06wWG2o>O>9{;aLfK9T* z#B8A>-DP}LZ}}i7YD%ZstK!t`6I#_uoLH-Gc_kTfYUF93^{bpsYv9@QQ!O=&T)ag6 zpr2S0Z5MSby|1?nli!ht~BM7iMq;= zFxNBClcSle$(&-%(K;$Q|P?(@9Zq-1!fQHT(uhD%C~bDmL3vO7n9ENRBj zP3>hL&4`bfjq{B7dg}-cnEFb^v+dWl!9@9)oK6sjN&G!q8Z|FL30+Ca70Q{p-n-)i zbG?+|y?iU~@U{vcCQEb(XK-JqF`CY75AZZA3h5zx;#;R+TgDeut$rD+rSbMR9@ym+ z-$o3ybv2t}l9^S>gy6b|p@)UAzeFQ!HpMeu&Xw@#PK}53*bfv5F&haVNq)u7{a)D# zB4uXDkJ^6islO8hsNgV=jGin?TPNo%?o^wt3#h6IVW|RBztp~3Db+ZAdqMVb1x{Zs zAJ{C(Qn9L8JDN-lo8jNf4R%MYYMF+J00z z5ad@qHBIE}#SD=dL=wV`)}8$}wGX^kV{_x<^BMcW@Ym@UO|8PehEVaS`bpGC>6Eyg zsU-of>4=XLQdsXZGn}dngTOCNj7h_p((M8sLduvU5GKk`5>1>V>LMaA(p^F8Yl7c<#kUy!tjF;0R{NQ9U~Ajp?<-{Uw@g(6G{d4Y&*Dvt=;zF90tTuZI2p)u_2e%>VVE9!t(Rb)cn^v)Z< zoL+&0>mvVSfPYSGVg(jyxW$RKtBiZ9z*ap`;h6Mo%CHo&J3RC5t*`6(eb&f)`Bkp6 z5s9KL{`v(pJjA;Uy&EIm!s3z_A}5(v&G4{g$FFrpZr|;)i#)$+X@Bm8>=4BBT?uW? zP03lhNhjrucRUXYW|P+k-M#r*T^U#oZd4L$e^CC$<@C+~TddEYj}YnnLA>wjKWFbR z>H@&g27NsGPFJev5c2Y~qVdtA$JH1gz&Wg&jr%>KMN#y{s&HC8nRR4Q+aEP=W*|GM~;b{x>Y~a z|JQUYqmxt<@#G0HXT1=H2(mp#B}wt2DOdz#^mDRYZMbJWZ>RPw4_^-sv#i;OVmuJF zRZJUvPVClruY$cv_(Mg6z^^+MrM_%dzvLz-cO=D zj7ou~iF%U<(o;FC7#N~8vle855FA0d3pLEJYr83dwI8lF86{byBA0 zEc&kW4Yw2SKV9S~w7x7F>y6{O^2KHndM_;hmh8E~X2O$c<2BHoph6zY%SP#xe1cnm zWvmC@+;4W;-GZ0BX$-jDqAYe3r)?T6L5T};zM4^2F6CKyx=2F*K!$VS*t(0hwv_-vRS>LENJhR?Kgikpn5xZGNMrD}i)wOUmr@1uUO$36v>|^W zbsl?IdHX6UQ^Lv29meT~Qt*IQ+#zwDn&uS$@neqS`Qv-zV+&lMBam^|pcms&mywcC zZ|3uv5QPfyOuJ-6cm>Q76_8MS?VsrR^v%I#SNnMy#*8%=Vv)S9fX z8j+BX2CDvCv>=enKoOZOzJ~sgM>b?ekYQ3X4VA)!)!IddxXu1DJJCA(pe#LcN3bGc zZa`jnl{f@HHQ|+HeK-Tqosw+E(h*7^)*AOaWp!>Vg<8KEwRWGqcMaSmUY~1LGHz~` zlapNvfb__7Fa<>uTOd zaq(Na^?7o|;KJBv1Ra6XGr{JUw^PlgUyirjyYli!K zDD@N@_Q`+9KuVUVX|KV>!-o%vh06aoX*ztjFrJVqs~1AETN#HOu>`Q@!>xp}Wcj4A^~oTfk^~D5(h}+AIrZEo z0ej#DfUac^Qvz76&*SrWXf;M&T_)1bjC&aI`5jv#R3J^duiO{73slA+?-$jU%34Ow#j5Iha_vF4r%+d{*PvuP4EDBVt<&wMD$kpwbzLdkNfxQ6*jTegX+r z&1jf<;IS@;94w7#IbpDmS;S>|g${i0$^?*#@hE(cBkB>@83UF77Ge& z-Zwd3I)?jPS;LlvQVFsX9iHb5oN!#nT~jjQZZc@Woc)x;zt;~^0%@CWzDU$q-WtmO zTQX9|Rjvi^G9~xyK|;4pBw_upJMK^sRM{Ht1}Jhg|(`s5>Cbvtfjs(B(R}W z`1`Ds%!DS`cG8>ov}xNLYY_9lXBtqq72PY z68UBoG~vVNlptP_Fk}6PU(^2_U*Ej@zc_pEK(@d3ZycqiC{eR!BGiaotM*~dk%8MT>BLO+&E zvpT}xF!dodZW_$f(OONK`(PC;8?dk-)XfX%bGDTJ0Zc^4xN48;AKVjNjSFv( z2?LszzUzgBYEDi|kWEH6<`7o86Fz!G2C$OSTBDp>Xpmn^l7s}Q>u##b`SR#-3n-L> z;lCe(H*~zZ9xY7nKh6mlZQ@hbVn|P#UZBvE0;MTML_L|GNBjz`f za&o%Et1C8cHUk5$Ru;w-lwn+LQna&^rqYI;$19Ii7R@8+Rq^Gr(GRR~Zf}G1HM{$= zq{ShOOyqfr-}98{uYOa0K0;||!9Y7J|C)W~T5NiCeF-+pa&>H=kT?BMZFylS!&?dU zT9|SC*Nvm$UoQE=J~kS)>0P`hHm*?VXI@g@SSy-7An(*Yx4*6^{5cp>xN+fuB@TGI z%Z1n(pVPP{?%jC)ZfUb?0?jY|Y-a~c&R$7=1j2vrmG5R8+k1BR3#-;LTl1n)v$^%B zepOH?oi8NU4T`-ezBRFaz~Z>k6q08lK-Ecj+cq>sOl{Y3*J{jtZIT{2oBas`E3_342&hdq+!jn8Yt9caJ8SL#B}O{>)G_kQNXQIK+ZbW`hMXlDE8 z3<3k`8SNErU67ftmmi?(j<<=nH0{r(0+KF{)t9;e|SP~N&mBDePLl64xFFMtzIQavI?gZuUJyx zqR1K2vH^$t*CcQxhDi0pBbs629`% zWeixJlwTUTRR|RI**!(MRHL*SrBQ+4Tgb!5Nt%cQw3; zE`>{bN(z!ynLl0=L&7#VRqaP*?1+*N05_Ah07s?}JU4;fq!*;h{h{l{@s2&K!j*D= zLIH@A-(c+f7?)C2=XZ#boR7_BpC*6I&wXHfc}@Szg1?NlP6m3(eW`LQSmwE_*Dvg7 zrTIy-cBB7j=Eqx&74df@t<@_AeXqbN(hCAS6Y%5TP(zACU*qnCJTwyASyO72xuj{m z6lsUzUoh4v)%=njO!{R(Kty2|V!tm>e^)%`N71`Nx3JU4gBLpk4fPVzR~K7VCSD-C znxm2Lvj>iZ#>O^}wHl?@6dR8ER=qEZ%DT3p>Kb+hYOmtLEMm^=>d_r~O${%q_dmAb zsiSx&Ix6Tk+8Z4CdpJ|?pq^c+BJMdCLc@3fOkq8 zTS{mju7-PrlsA6Q4xH^gQJM04J#4qx89wR)9Kx$lU4Qcpk9p)$lS`Q zdR_!OW;)dZ;Jw**o*!YR-EnKq)8)IXzZw-kvv!@=80Z~D;U4a^7h zNU)3Ku*S?D|Co8@nBu^qFI&Z0CA@RU2uvz0Vo|-Hr|2!rTBSlIAr^FySeF8iXtvgK zb+kl1;Y_7i;aYLkV~AHXF@9i8ujY+>HaTAl4c^ zW6I~Ice(d{af^xJoH9}7`9AmAY$5i%R^9m6O5hQpfVf(PyzQ}J;wodmaF`fKwt$HZ z&))vyF#lsagRvcbfjR*u-_zlX5SCT7-h)U8AF%IHOLxDDRT)Kh<(tCOUjULkn@tiu zucdLk`y101)f*wPKqy%10CsLBtv;*+9AHxmXj_%*dSi~jNKY}CK*lEFx>CDL7iBpu zS+0kS1q1rL8UwGaM`M~mCAdTe73vOkCFO6}7;cH&#N>7IJmv}O#_AV^xlf|GOV;>Yc+Ca3MA$&VAtH^BXmcr(d=749&&0EZ7_X z4x)A5(oi8y-4+9m*vM&h7ziWAxr#sKGs07K(WYI5c_ob9C^WgB=K9_)*@-CJ;TiQr zeTsiEX2aDof0z!(6(8LZvbWfWqGTJ&QQnFYv#+l&HqzF}C$P>HcL!O-HpP@;2A&&- z@a;2v(KbuK`-}t@CBrhq%>kjJ}9%^1&eMNFYE^2WV;r;2+H*o^2o3o)sRAvuM>BARp_{SSwBB3hQQ z#lN`oXYZ9t-Q5tPbqA+~Om1^Oj?b{3tmyN8+`keDxy(L^&zI7;BZf20S=qb|s?LYR*N=^wNk_C9C{6Pk03g>85IJV03+i9m~^U z3-VZ1U(V1->c`vzcndx!pBk+!E)UWjq7Ovtv5E9sR4hj78OFmCA59U6x-UEEhyy&- z!ExoQtD2U@8wHe_dxDS3Lxk&HWL%64*{?B4ZGw|DNZ82jJsWEqK*OT3@@PF>J z1a8-BUvsWK!(GXri!VN+v}hC^^+=L*iE(~Xl%S_R{Wyraf3mw%xt-~m=+&1lG%5w> z1(uYCd8KbrilJB~L%*5551s`muGBYg%gDcl=QRFkqEV$uz%E(W5)f9V3njD655qGb z-d~r^4K6M5>gYLgJ&0#%OJl3scq?~cXe_iI|eK76V-ad^{4ej(`^(-Xa}_J z`7_X38jk2O3foP2Zd=6q(4+j>?1&k@LFe>$W5#%snM#3x{Nc3Bs}|Y zIuq!bjt74ac$lS!JlfI#-ii*xGoyg@QT$K8urgABfw)N}ZN=O}Rax-eAWVFRmAp*d z5oj17+5>z;ernYkOrq%89}uqag3C`ui!Kf=2*1A7++FKEUt85X#5QsIhBS+%qX1MJ zxtTReV2i)z{zmgf)#B2&^8MOg4PO1C4GUY?>eh6ip!JkxxP)EpO~B`XA7Jz3lEt_H z+%!Kl9a9HhM64dz4rGOt8=}4Xkjix-mxl~pnjbB;>mSwltj&%#uf*Jyj7r4>_sr%j za`O0Y{Tx-8u6$bQVS5EVG&V)niL>>!1sMtcU}-1!Y3$fzsobJ`fp^hIDVUyl-C5h7(KwBf$G z=l5cnL}KFpz@SJ0zs3#8$lNQaI2va(ht6#YDHe-u2oV zEo`P@`nfv#`L?TY(T}lTM=)rNZBjlR_awy|M;b~m%lr{@GUmje6{cca$$h-47K$wePkMD&<7bmp3FB8<9r46#j1Pi(%HLt`7{lahXu1M0y*T8$iFWqcH?mA zQKj=PQ%8=S5_5r#vO!<=y#& z6vAY>I&$qy61NjD?%-LfEpoU9WJ_5D<70r&hu zpXAH5Z5i&Xx@=LylH&H8C|Kx@9j0-(w!)VGX~SKhDJ#EAS>*R63ef{Ap%=`pSjJ4J zC7CW)p1KKP?z!nP3rS5QZSN@_q!BhF>RLkcR~|6prckyzNKA?lqVJo)%7P)Uoe)rT zz+oVYj^@xpU1)YL49yo#r%g-nfZQ#wQ%IRxt+|`#BHeCN!UPt+R2Vaak&8<6fb_5> zyIubj*MPCC{-UKzmpBMhG@O%ryI4oR3}#2?Kd<-{SZ);0ksQn~5SA~7xSEq6`(z4V zSK(jdZZ)k#`tx;r2@zlj*kPrs&z;s?C6rQy3Ep}t#2f)#uR0ajns$Q#s{KTDG| zIG8$lPTjkzG$_SBAyAf+Oe|jqums89oeu7V#;SHo#=(a|1^K2Y($ypblzj%gu8+zi9FU0YT=QK)ZCS4$H9QYt zJ^HLHq_IJ3c87sNh9yff#ofn2*&f0deFA*#h2?p~S}W~aO7u;6M%Bk@}*)RRDlNvPapJf#lI~L zRi?c#R&GEm*E#gQQuq1QeQT4JZ>cv{syk7-nsg{8oEd&i%t4)h#LP-6Oo1W4xrpBp zY@>6PQQba6tGz#3a`O3zik2*BIHWsN5ob)@V#Lw?t2p8v6K+ITd~$}{zktX0?ppD| zEIPBgME6N9Yedzx8)KI@`ugJ@(gRHllJ8ZvZ4U~=A$IoZeSSVsv9+@s5p8WCR_)lK zZFN*>#7bNwjkHKPW}w7Lr$haQGx>BZ0gufXbN5xQz^h(yWsC4AINC)oOMB)TO{Uuf z)5~{Ha&lFwuUqiuglqGBbnsrnesm^t`ZcAvB#cd%qMI_dI=!@@VaU@G{$2 z_%h;!LF@e6P3_jO zGJ>dRDW_J`Xs+>JZ=b;sx)nXG{h@MCo;q~l_>MltgS zDssoQBA%H2IEiS=4cdOf<>Yk`CWUzN%aBBS2{*jzhPWItpSIw7#Y8;+Lw(V?JQZFs znM7UwTsyz*A=C}!K55~gni>zF(3SP5o3*5YxM!rhMf46ILV5@h&Rn*9+4?{sBOOSp zI+ahW>jc~^QVWi=DB!ppmg=0Wnsr0Qu0GiVh4v8q$l2O;c1rm^HwAV3)VvE&vyru+ z6+coxS20rKWi^L6tbf(>iMX%#HMzvEV$m?HV`>pf@P=ODs*~NEi@O`EwcKoFmX4X} z{%<1g*fzOk-s7WZOqo-yDjOAP3fQMha+m^Y+x< z@*@HU*yJ3_XILs?j`_6hIM6b72&-eX2PSPJwhCM37Im?rKZm)tsoW2nAf#an94bw- zyDIwG4s2Os5bimRSSuVFv-;IViXmTZQwnr3A@DdOmrr-7&y#pjz)i4CtXG;UkocRv zB68C|zS=JS!$~SrRzq}+q7^_d3GUX>B<;;UokZSCd-oMLVyP~$W;m2?0zi&X;rL8X z>ATg@nzh>TG=&R_Sir4==$<&i17rPnHQ-(}Yw#$AK`TAZ8BAX3e%yOH>iAa<+aX4i z@9U{~qP2ijcD&s6l&uXAV>Mu$!|Fk3^<(+K6M>${$SNM(-ek%Or-is9Po}HOyASFr zecsktjE4|EsbLYw!L#;gE^yq&bqPv4uBCv>7V^k)r;YQ{JRDx%#%OqDZbHfQ@|@}J z>UtW}`?#w*JlX1MrE@!Sv*ViNnmR65^Jg=VQuxlT;8_PXw<(L5bzykt7;x4VO&4VR z!o<;5oV6jinbOC%1EamC4RY|GSU5x8p@&@YzR@3rpE}MTpyCZNkdZnd-#cvta&>X_ zWQ0dY1wjYqUTMdXy8~C|Hwg@BxG^hx~v#HfN2P+)9)uX-T2JtrXW-Cbhbf6M{mWLn{jF)A-ZeIap$zoCF; zHKz;)QR`u^%XH?!3prdv%mqs9sL3@RsFQt;witOtCi8~7lvXh2X{U=cF&B>qPrpK+knvbA>O3{pHEYnfXJ&@J#3dh-;%K}Aw6bePu~}JM z#GqYxv4p5^#2{TvsY>FGH-Mv0dfU)s(kGW$X#Z8Xout1;QkvhHFq(N1r&X zxdH}ObVGk=Hub18y3=B^Qgfdl@k9u}=x9}bxL&}au@-DZ;XqGi#1$7!>cD+Ah<5SS zSuiH-ev)qaeoQS}n2rv>Hn=gTd0=YiRQA4KcBx5(N+I@r*88lggmmPt>dtqIYXVY* z*vr6jbl$HayIBUJI-%Y%p{nL(O0PWGhD7#C6XM(vqRzE}G$OHl;+rH8XfTEJRb%Bj zjlMM1VJbJcnxvOTs+PELqf6nl69B3xiL32nbPrFttRXM<6)g-5K>As#e4=#?ZsG&; z?er3c(2TBVFf7N!|Bad$ccGJuT)#FvUC^ZOk$#?Lc0r@z;M2!s8$UjIKc&+$pzU$$ z@|KyN6BN_^@Z~G1I6%{ILZmOj%m>z3JhYDD(^gfwD_?H)VpI}?HtoHYFVj&JX};pg zv}=-*%P%!FN&(O`J+0@}HVXW ze^@9hkC10I=e8Zs%AmiAkhi1>OpsKZYYdc??;fS>o~&J9z5ZWrKePLOUmhK~&7=Pn z3VJ&pBC&t}1>vS8{pvnAS6{=KLeW%MYO%F``O?fdg3IBC9dJg^Tq?-ph2fItODxIE z2?d1}layiy0l5s59qXjZ{ibbx0+X-3`U1x4#rozec(K%kE=UDH-NwdPtZD$&za7wF zAQ<1&GfUQOH$fh)4dx5mn&X%HFoE1-9|(hJ89qy<9)E0=^O6*hrmhA?&H}6Ewii8) z)fdAZG4j#@z|uIsK^(VE3923Zy^1XRze<;n!IQCyAn-H)UHeCaOzGA)L_I z_AeJsuRY}p2T3QB95ZEBAd^)~vopAEe#5SX+AKk)cVZs8O9moN6->gPspuE&t9Vi? z`h^x5%7ya4(oowQYxEZGF;L~+EiuNIx-%-(#BotVsEmhz8$rIWeD-MQK31pmTYED) z!q~f|Setaev{5C9U#)9DdYU&r=3MFmnzS-`Sa%@0`|Htber$=xxc-T&V<{RfB6mBf z>8+Kbv-% zYpA#B(zFOb=edn`o;i5!)gkzRMX2DQQXaNxL)dBEORR&-46?58 zHvH~InK>|J(2*?*k2&Fziu0jyf&yTiQ?Kkl65@~dygoj?OCl!1Cp^eU-g7+8fV(K> z@3*n!p`|iRVkp;`|9%V_<6EBE=63)kn|F>UMr94-Dgw;0ZDKe3A5rz)8f!1SWw}^5 z*)1EGQyKcp)N}yvqwQRQ$V1nX;lt}g0tN7q2vMZWy$&KHN(^(I!jVo^L*d)quxJ-o>}&AvR$^+qOBg#nRIID*!wP47ZQX zMgm!kuMXZrQB^y3wI}#MhPqj`HMiesOXq?4Z>Rt-Ju8c=-M@#$KXj**thx$qhScyb zRsywywc(^6ve)Z+)&sZD3gILES}Uwq5JOZ#iurDgrub6ltFj)TEQyr>4nbo|t!jAq zevpb1YgCD&a1d{tDhNSb|8!x?0S)o)z9RJ{QpK%(WMy5&RQF>{acFnNj8p>krnrY- z1kbRlO~p#Ns_IxG;vuMkG2EUNMba_eDbxNf=_+in!}B(f)GU0*?SUn>M$2i+`mI4Bt>K{RmC63^^tMg~!edXQ zIByUTd6oF;iDHI&FQ$i_G?`Gz-(}U^pEe1~NB2ml%2?4Mw3cNEUt{*LL}ys66PLy3 zX#Y~YEWKA~Bybg2ABVhyWr+9BS4ijenVG=!Szt?B)8(Pe;m`8T`W-&SPA2%+!|KhG z%(2KSA0q7^^W8qhZ47=4 zcZcoC`GaD?Qk^`sTOGQKbua1fKfM27for)9~x*E(acx{Uk9WuXwR>5?hg^0yO56Je$ z(c^A#TrTjSK&lU^ltMqZ-bV>NCaiH8Z2EgQGlMwUyHQG6@(eqC3zD1Dj488Le1#^9N`eJ-NY z2X{$Du9L_daAjyTS#^iEK@|7N_%mcNF%pcp{D%H=(qLD0udfXUpl!!qwkv$+hAWt6 zV}CIKbI`YqU54IKceyeYOOg0gnylq4EMo}yW!OAQN5e34p{YU4tBxXAU{viMsd%c- zqe+>)04pIYwzDQe-n_IASL@L<%pV)062Gn;s_ovm(A3oIguqmn*oJrD!W>+woA4uq zB)2K5SfY?c+v6w-aUG-2XJ6{eDVYwtoW?^86EQb0zUtYdn>?o+1KXD(nA#^=QShlJFT7h7@)ZbhqenA= z_Fl8^N^Uhy?*i)h&z}5jNZ3^$N%*-+AQ1S#d0}$Y5)_c$*h+C(`S#$+tCQ)ai;T-d z1)bkSxz4+1?H8#(SEg(>&Ts#EEA^D~d5hBITf*$O|I9Z2*JwTGFd<85d+|Lp={J%5 z*ZGszzlloU$~WoFJ_;wuvHJPSZe7=z*v0qYl!Q}{KQ>pIG|06s+^KAPS@QSJZ!Qn- z|Go34-$bMT8g?ac$s`=p?5mHY|0eo+=iue3%6}QBCXD|#(f$;CLaFDb(aW{Wkjo!0 zj~=e2JBO70c)Rgz>f1}be;s-Ke;oP$J5+GW|8gh^!lD1$xaqUWZ_kejT5(irruomk z=d-M6)}Ots`j@)@|A#J9bo-%r_OIbTMN4}tAM%$%P0#<5JnH1#hQaxP!OJc8f` zTx%pK^EZ)$=V#&J6SD=Sk)PO)m+4(+G`ng9JM8>-8~-7&zS6=Ub|6eu{M-481}d%{ zwkQ#dL}T>mH_`pC1HXwDXpaAAOH4oF+Km=bN=`|{WsV8 z#}0???4`z*X+!JZshP011n$bhqFl^4ZgiZ@SB5m6&(=5V%OxPV%?4Zv>~vkzl{ES{ z!*kdblWv~R^S0}1sTx{Y;jq)=zxdDXxYhI>)wQxXDLfc0jK)lo8+8SGt_~-sdNBg# z1LUFK-iX}P5*smPs7l{|_L}Qga0>U$pvMgMp*-HTLE%qf7d=Ta&Z04Lg^<@Bgq$Qc zBK&djieOa91s?@CHQ+I~{|slD4_R@_=iqPBZsCm=We{OaeY>nIH1ZvD=cnv&k3BAD zl=DIrx#rHb1^m?(y6f+l5veHh{ph1u-1Y{elYL2%P$&iYE6+qi`RYk9!}~tK1lUZQ zXYR_n2ECR8R~(Daj^}l9$8wBpoKG5#9fdfyNb%M|*&c*gwP{Kr!E@njWgs9ZJq?Ot;g?l`$*HqZm9ld+(UuQ{(1(xGwx%W*c)8;%mKnm&h z9o_Wq)wKNNF*_cuF{9vHfkl}MkZjy35_U_>j`gJ`%ph#YE_cQ0%2CJ{SC>0S@*0?^ zpT_9PsHl#5eq146oCy5O=xU2;2eRMj;{MGnfr zE!*~V?75fnxHMm$JXj$pQRGKAK2j6@5~iAcrp>nvQHa6M|; zILae$_RQcTuK!ImsoW;~toYWn<^mx|OOaF9s|eQAiKK;BtcpP2c<|3kdHO%NE(*lW z6n3P&)3lw`ac>BY?Wk`Y!vmTbU7>TzGs|GBX4TN6*qV`7zDbs{%^cvHY6hOtW)Xm7 zS3RC7U47U%YK$;<6I+#}U>;CMapyoQc zm4X$3g716?Kw+r>v!X~Z)A?-ZtChkw%%bxP=w?-Ki+__I++a}^>9n#eRM>(ky7M}E z1%g`Kd;m-)RD9jeJklezC|RAJwGRWj5_o@the&cAK{Xj@pT-#$cMID)VkSm$MyuBZ zt2Sq6GFFG%Ig?Xg`?sz5La2H80FMR&ShN}l8CILpo24M;*q&|zeg&uIb+^*@2&ux! zKCdLkMLCloW?uI42!85n#G|0c7C<>SLG8C=pDxL3)Og3TV;1Yuzc$cjI3`{@3=GiL z+Jhz{s){Dyc;;@^dyqLUzZwDl1^247d})RXjmDjocrCZr0c~PHQ0;L;3B+-WaDY@XYv2nb+Dc{TYL*BEuV%S6wp32RL;Sxz-f)MyU(gX}z09-I5$ zyxXNdO2%xdE*n?w*3?t=4L9hoMI}l)6slE2`;l{Uq`!KIEyWnhr7q3zxwSY1X%C^Y zrT055FioqIefk#da#IZ+|6wd8R@(CV5i^CRs%%B$JR=pRzj#_dk*PWN(1UP3-r0^gjrFhTBfpCExLPU%5hg0*I8O+N5_1=(*M4v6fOV6@PURQ z`HY?Gj8#jdZfPH@C~;k?`yAOByDP&o>Vq4Ju%oc&P?LX6Ilh6nDAU63f~R95HbKC+ z8jXN9*w+Zv`J;_w79%j7nwiIBxgb8c=G)Q7; zXzviGQoxT*#uvYdRKL<~3uUecg}Q_40!}tGZmG(^wM3UDFW}*#$T2y}JMX$m9H92o zv`Dr#!$hBHyeq@;w0XC-2Va40AbX#<<-(0Il|6)`h?dU?kU!TlKQ>ip^`g7lSHl^< zMz;4c7(d-WlA0W3FMb&XI7mvTJLXD6Q8jpSBUHlB`^B#~t4dop|3{2ECEk!a@qyR#uK$^9Zo2^T*d`a!QFG zZ`*nwds=5>2oQ%)1mO3&!-ZfeQ?q?JrHvCl$Qhg7^IP(w?jU>9ObN*> z=`!E%VI_9IYMw>osz{N%XNAZH5x&L0U6`1oz~VaONyLn{$$c%9^keJSEgTY+?KpYK zcX;=N1FWsKF^2a<_1N<@{Io`+eAZl=?+^-YE(490x7>?jOGuI&R#j|tFr^HRNoQ8Q zoptVDEQuKP7~|1!rD9+m2V zNKl@wch+00T4HSvm~0!L#4mLAfMZvjxIsgeN`5|uDCToWNg|2#9}h}HS0S%`u45VE zxSb9Np7v-uoQ7ZQq7e6pN}cNj}m3SBEeQ%n!jpL{E7 z3PKydP-D;MW=49J7By*(LB3?8+|(buap;>tmeM;Grf77rJWSGllDw{zbzEVi`Sa`j z2Y!cgL8|~UUOL-_<{x+{!$v9pN+}?WQ$V=5E2{2Ge!E?M*@kmL_EK>&kyn+?8XY4c zjhA!RMROdU@oN@zT(GM%i9P>mqsEF%ES_XM0cKz>N)`3mFFjhxJ$ofvvd`_~-`9q> zX)vag#wo4G9ydNqk2;@yLHi5^UH{yv8~mw&|3I&xl=s?_8~*I;@&~2W%^$BMcCo2w@TXvxal3y`=i0oQoSv@pIX%`r z_5}U+)Yd7Q-I5qk|Wu*Kg*^nc0B^;5I%>)W{e z^M!(AA80|D1jDDb=xvW3K}9XXc@=3tr@20tJ?#@I4_4>bd{|P-`=p({+Ix5L?d?Cb z`6&FQTFW2mN^K|L;i|;FF4)k>sT1x0O{BI9-M8U9@IO_1@#p@0TKdki`rm6KG}()L z)y~BHm3aO#$6w;{zZ<(dc`yIgFLd6j*EADNp;^z89%_C zivQG9^^dXs(s&xnQHq{1ZLG6PWO(OZ0I0)jzKdaSM*2^CVi*5(rC$;jeyKxlpLL97 z5s*O%rfg3~ejBE!^O&5?4;-~39tP*>|k7rOP=n&U$CKWWv&zB^MuKR-T5yCsQhI**>yC?-tcN- zc^rZ7A$Hw;{oh7)gfoVdy5jDtzKipE(gN$BJ%9Lb{#^91JlG~vg>G1)s@LKkp%381 z+whMCy#H}{EXUhnpU~EH6AG`}(@aY-t$#ZXP3j-^>s9)ksazl+F>Lahr_Nmy)<3WN zZ?2=_{2UCJxND$oHNBS%ds+AI&QY%Q{t(_p04OY#KE~nO*Z=Y8zt-+%moC7yT|P48 z`XM&WsPvCdzWr-sio=#90pE5V6N-+fb-BWvx_t!18p7u^avc7L-=t`jOOA5wDJGUV zi+-9|mJU<^E_)MRK?>%ae@o_ggeH zus-3kTeqpqamzkRTRQLHC)j-R|N3oFNDsUj(sk?lruZ>f?^h;ZG?8^J*ojaa`M$orBSM%`)>m5-t=cL~4_LD4~{s zjh<@lR~gXaEFic)azEu4-^sPEW-lCi=Wtv<^^O;z7okC`-b|pJ5UVRLHlLE5)LpSH z_}HT?TuqW1@80T9>hSg$6dLQxDIy*omUJfj9HzqYRmuuKr=6c9d*G=g<)!0)gLuolzYyuwPuHw7sns;YlE ztinQb#D&l{j}nb+5L^g_(4R7jU@;okG5@(rp%iN; z_^e;6qi}UZX`G;KZ7eraHjP1{!w2`u&;k_{3bP4c!p1dCzvlUHEk{yFa||KQVZ?q} z!LD28N$hg^<)@#c)GI2V4<3dIbpenfZh)%cs8QRKHF7)Kz{6Jh5<49~!>w>MpmX>~ z&5vJ*m>BQDAmaA#z3_AC(OI{AKWozD^4=*xgxfF951F^zR7A=xWL`2pPCVE15vb!(}r zh7pRKP_q)z7n@F1&hT7n4h>X(zBAHKGu+@|Qs&rq2q9efqwB?woCO9X<52Cx}!{p!N1 zb{|7d0`r`fe3I{%!_<6la@s7@xlQz{lB@_eGv`$TrBl`T(%M}US7ywQKtt^&4kiu? zV~O3QLf-={pttEp%qZN$Wnt|%k572YO-p#=7EuUd_IJU}?>%)#d5f6HZE4xUq-D|p z>cpH9sX7}^YHw$E}LvWyk&oRd|H>Y|^%C16DRxORtk z+9Fm=@81)xH6jOC3&vMywBL|tES`QGBMwSgqoE1A&0q{AQ5Phz zd#t87XaODQR_mV&JdaYH<(f_Xu#7l8Rmt+PXD%-;j|&g*>4b>PD4$y>)Si*tEf&B< zD!Oqe_nm<+Bi{2lYg(3E*U=mzX_VMJg_PLOJ=nYNOaTR2&U(CIMiukMX6kq}3Ens+ zF{2zXZW+^OY8nKlRLc%`W-qOF{Xt38}+s6!@|AjJGb*E!>Vq&iRR;^#vsg5ch<3 zz}pcr5OC2gi88poCc?+6PUIfIL9&b2!hr=!ZeUaZg8I@;qXFLt`NRz0dzvs1uT^lg zpY8kA%8`=q@3pSNCgJzi^$OS*9{QDGda+e4ISa0McwC%%`&0w7QSxG~VSPb7+g9@0))6RxoO`m)fg!Q3 zmQYjNN=odlPMrbGl76Sjk7qIJ5^7T$NE?}g<2jRSHCR-ryuX<-nI0)jdAoMFUe$>S z4hfH0m_$kkTl;iwbPOBcd9X#KJE?Kv*@^ zMDB_dB`W2RxK_+>`F|d41&O1Q;Vx9~`H4_IA+1@T>fiI~f=q~O_()6T^Pcr}ZO!e@ zhILlbq~g`|Zw~-gHy6vg!iPnJ#XN7~ zR*0Q8Ni4wdcc70o4ztY;Zqp{gVk8&r`8KRx*35A@zrz!TeB!jZIRerKw-6Yl=oI4` zB2FWr(+K*@--Jo*d`uKBw4m{h?Ovq_wk0 z+v2A$YLYVQ8uA!RRjKW}u~U6w`r5|{HB)i+nyj(HH|}9|_&35z>F#>-OM#a#Li1Nu zL=S98Rn>*!!1Bdmzlqk(tUyw$oSsln$DK>P+w0^X?mdbXCy~)#6v~@ZsOXV4y3MWQ zG~hjr;oI@zI1f%zb^~xF8TC7M3TKLjES=s>yt$u2#*KS zqxEiyAvO^TZ&)ll1dXd}uS}6oS*NS>|0arf*v*p~3qNais-YGnKrkYvsU{F>^!l2J zTd$Ib4_=L#Jzk#uUJ$Ixco)7RD+DLoBk7%sK;GA*a(of!CPlR4>V4Wc%3b9e|{bQ1zA&$>&#MAyq} zT1`W5p6Eb<2Jz<$Q-2~Imqi+Fdp2R47x_dyyY`v=cWh#IyD4OV2!1kPW+{B+4~0>VmQp3t7p zMKQBhjfW?V<<(`CJKk@8p%ym?r8~B9a$xmnozHt4rmxAd#jIo7g4Ab*JbjZZ8jM?W zU_g@6*aP}-18L`aItYsOtj_V1Dn`eZMr2GK@p2}V?(s!2YZf6OFBR|UZ2l-Dy)BQd zFH2;xT%`2MfrfHQ4}ttbCw-LR>rKC*P9iDzg^9KurUc?^z2GsNMggw%z%5>U2R585 zPABr)|0Xgv79tcqw-o1()w+BCROixgf_f-b2iG2PJijls>73Ev@$&lC{`C+L;?thh zrpq*;&aQU}z(VD9o8+R$B~6>hzk>`po%6xG9M)_?Ev7C0nLI7~#wZfa3I!KV2Fcr9 z`z|N7J5ySMk=eMF2iKM5X5Q~sFmGKf;(?j35+$pM@tt87=k<7uGv0gGYP(Ab+sHK{ z^VE3f7Q|SHbXQ3junuX<@x}bT)^F%Z^o_`xdU8%1-*V@@8wQN%fR({uz#P!i_EeD{ z$~&rUT-`^G95!O&aBa*H6E|nOVGG#yKVz(>YWqJNor^!y|Ns6Y$~kkK95P1Er^+Gp zb{HE|%-I~u9CDh&+-{z(eN1U%H{gmC{H_UCk2JTlRU>S4EU}V}EXx5yw+iS=uFi+0 zOd97IMBZBbsSs2Os;tWkFo9eWj1+RFQv$v+{Uj|I5wR`ER}QBH-=Elv1CHE&$ZI>* ziMORaxl9_@i`0mAvWI!WFUx7=@Fn;Cq-?V4a~-X&Xc5PmdKXJuvd;|oo4rV1aI|}5 z;~+wn`z}1z^C?un#=$S6ny9qr-S*>L*~jd5Vm(SKhaggDE%CT36ly4@ovFOhhGG8r zeY5F&TH0;7wq1#Lu4VV6{spzc2VBb|GNLU#X8Y7a*0oTb-3YC zua_mS&WRac063v<_lEWIu|8oIHPdKQCk4x?*7eQ?z6k5tc4BqP@CTtb^v0oKlXr81 zKfX;m0912v5vJz{TwKJla()0jQ+`~&aHgehE&DL~K>r2mZ=K4htejk2az;$(SBvVJ z#;hvCtZ9uZ4Vg@_xyd=sKV*ICr!G?7uNNE)X<2A`x`De9cYVj$Ly}K zRPy{gbwp5Qc?UqM<=FR{`ZqVhD$Jh22-w1{fL#Io`=9&d*zI zL{?oe-TvM?FWvVnNG0@p8E1bQ^<8L?`D}^`;RrLtv#%O6LOwe{fr14K*vJIN`LwI& z&9lnovX->9F9d&$Dw^wdU9`l(2H)GcIa|v64}e7Od7R&+N8GTe&4ObyQ+j)5YBHTB z+LX8=wU)nL+FNRn7n+c|Wgf72`|NMAt5;T?d}_EfBxECKL(dkoK8_F)kdUkhLXynUzn9LOU*!_QRS@us7^HJrvJmZUna^^+##e}rw z`3&zbv`DHIUx*Gjc4yQV{ZBF41p%@NM~r$lkqEojX!XZ4T%AO|AD-<}6(0KGZoB0J zY3OEzR87e`IVgy0wNVy}SuTRMbuU<{s655#NIxF@#Q5Tpr|pt%t?w`r;%i1Lf@b}D zX^neF3$m);1L*JP7rK9=-SNIlH0-E7F4VK9V7vC|OP{8DqpP9$BA+|(_eBXYW)?Td-{ZR*4RuYC^y zzw4euru|L5tdk3s_N!VXB`*m{05ftFeh~ClOco!qf9+Vb)BQ6Fyh=D-)bGUZ{p#$b z5XhMXJLM-3dKlFtGU{8_tV7QllTS@wfgl-#>6hB>d;6qXP%k)Jcp4&C{f zF%Z|OubsyY6ji^thGc&e9f5J{_u27yx7cclDxCLobUp?UTin&;?K9)P(M;owhf&wJ50pmAt2O0IksHFDm`y5JQ$#^|*q*OTjEZ6I_HIV8TgM`+o`jxm z%^#Z_rEh2k=_w%Z$vTXhMdwhR3wPXdf*Q@u#oqa0QJqcIpI$aS)>ikOp891pBM5UY z`gZu+X*H8D0!OUdiw@f9FQ=r^S=T?Sw5(H^DVEF4_D4jNZ`$<>7YGFaM_Y<^hn$+k zr=is5qGI;x{a^Z2cLP3Bhk5$~BSxC8t>aR89(Oe&$(|`GnzH16&e|zDL|5-oWj=b0 zm3Xt?q$)_=mdy}tdGfe*X36ceRh%QzE#jimIK23|i4{W4{(g2~VFD{GR*2TN1c&GA zi}oLX8u+1T4Yj*?lfN=xQi`khzu9fb6n@^GU@QG}!6PwC2@GJ4wCX7HU1i`vQu&nt zJ`yk^(nDbaH}0&Ft(+mQ2iQ3g%SazOG1cH?ikOs$5#ey2j*B_J4r{EP?rs>)4ai&1lYBP;BO(vkXIS z0t7|0N?;1!^7oeku3XmcvwI&M!=j>0TPi<0j~(qg_aTE?We;4IN(LS$z-lnc>;Vja zi2E`1T9!bPwUol7&~2$|u2MBCJAf!vA^6ejrA$dnXUwiJUC!-S8oAj5do*0Kc-l$$n91qVUBU z?~C`SRN}`Uy)f~|Cc(X4&1*cKPYwxUPbM^!&VOL*ZF>l7^{@yioPn_oe{5&ZENEpBsNxrSF#*%gw;#xLB1dOA-T(!r)}?>kE7EA6yMG0>%2Ae&2#%UuTv1r%uN#@{Zjp(2rYw@qU`e=u3XTyoOM){oim4+_qvi|C;kNl zTCyPxFV(dpGCvVFsrXEvmz&Pi{8dRaVL2vtLua6@^aEDNemG*JC~c-^S|h}`A;RCR z3`sOQtwt;PqW?#zCTHF(a!6tc!Qj5sI4(k5T6`HczhDp(w7m9p z;00IP5GV&GcdfPS__3h37|v)Vq`Q=*MMu!Mfy=?4Lk~qP^~q_!Lc1~;J@bjoO26~b z$uLW8OEUo%?XMAHL!4fVm~Uc~+qhtk4&Ps{yDRFOh+xs{wurUgT0p;^MY`D%ecKn+ zZg<0v#jjEvElYu>r2Q`aL2j{wcwbJ7vq~?0)VwY7j4wo_Mli!;$v-di@m@v??zvpa zRUb{m*8#`R(F~R|6TyG@)58pdc_RGIkx8ZW+`MIL6sm7^aEh z@)oaSTFMt^;B-Nq81Cvkzo_T=NsxD$_X?wm4OXAkDB_TwIaXkum;6seSoZTqsIAn$ zyVf6-7GsboUqW?o^ZEycx0|$J5xN-eIk~$Rw>N@RPe4mUeB~9E%U3i#^AC|)7 ziaM`yb40>8OJ&4mYa=*j9Jz=d%{1ow+0FKbzKy+5bS;8q92xalAUxRR*8jy)k(@lmy+X84I6RLT&v;2tR0?L#}wmkw~Xh$2nGB>!AStC4zRztcFi zX8@+H+|b)>RxRG&|Euu}S#t87*8X(|#fjEJ*_=M6WV+;jhf*@LG#@cY!hGZAMXjO3 zE0WW%13SZMkHm7I_ouM#$+8V49DXbbTAx`2@^=eXY!@WB z41+lf!^QWIabl{ZEH@4q)^hK4{Gubd&oH*FAXQ=Zt8~k6_kN4J^kcwVhjMBP`1P!( zbqKRL&(~yit*4oC?d59$@PlLSKvG)R8xCQ# zg4*k?PUQUgd{>AiqH9Fbwqa^pWs!Z@)%xf0wa6%jYXe-mAZMdTZiM~YkLDxddD$we|ikjNdYLqI@9QdphT?vsvppv#&Ggc#Tj0{=;yq2REA*uq!Ki zJNMZ!4>mNMc&@iT$1LtT=f~VUu+!K-g4T7S1@Zy;J1+kyFnvVJI(q%36v3{eYi2VidCy{qD&4(Xy~R7$*r;XU=ZM zyt#0g$&loeNz=>P?^L9A{T_;QL|&N)Ys^qzNSrp!2mY>0_IMb26ncd4{x!xHwhZCz z&hgugM8Y0oR0Ubhf%A_zS0U%W_N5K((IvUTT%;a*;6Sg%(5}t(lK6?BX-9kh12lJ^ z;bMHuIrVQ9)9ocX9cJak0F`q^DD`3W?*ri-1)J+DV#Ef<49DVqk_9yW2Ox2^)F*Xur5MCDA2y+2Ya#Q5165WM4W*z)YVB1&KDg_s zC-gov+90sHqG``%(AcW=Yrd?w_*mz5qbmQ%Q6J z{L9aZEHmN*$au#f_@_Zc>&&BrM#t--&kLxaiA_!O)l7{Uvs^R%W8H81jMAxpM3d>! znGvZ9J#N33LoC%RNX2N)@5E@~RIkmbqEMjqC8@4hcq#Kirb!T(xELn=Bfbt?Cq~ri z9O`By8O(VFvR7F0;jb@eeC4kmog*ke3)NXD&Y=}oNDp`>mg0sI?v=HU~)@C z`8~vXuYf;U1}asmy^Dhx2PIh)>xY1Rh}F+7{KssPXfg05l1FokERD(!xL=e z+A|cT>$#31xp6!-2*nwFMuSGEDhr|V^n#vrDsdaVg&eYyDzkvmsqhWwa{yUywVFSAGY@)J zLf(&HIF&C@ZjMx%xR>wrEr;U$*ga!3m+i!3CVfw>U*I~D_2rE`cTy*kF}Zj@i>@~R ze4|(E=-=9zJrrHxup$rjd17OzE`IC|P4X%5UEG=JZO7zjDD|&(uD#m)fifbLC2w%p zBo1@QcNpFCg=-Q(#QtmV;nywd$y5klE%B?bG*;v`y z2ba)^md0>3F;bWyc9$e96kJnEaGzQZhP)AZXzl!K?4);lAdyLh-X)%};(*BdMxl5^E_IdWQlW!HN(f1{X27RR?VU^Ytfj1a-2 zDL8fne}8sg2J=?XKGUz2XfC%T->v>Z1*N*HPXb)rmV2KZFIKN$6v}R&;i(*1@Xmvw zicp+R3t0)>X^P$^R^GgAA3m;adHEnS`{CHji$hIf>E^$n`Bv@Ow?$vK8WuPIRC{xy z3RQBcu`T_!>bKtZbWSp0dSsmwp=R(7jgsC?J~5m&U|)DMY7w3t#9C@9UryP_mO=D@ zzhk20c+J5D?3O;QTB?|Ditf&?=8`53Vs8R2DlE$F{1&_1F2)8m$Z(^7xK@5dL_-LD z?FhoCylCe=nf#GqUlopF(^!&Z^Y^HzCY9zZj<*qkTsb+e8}jpi+?H=Y7-rA}MpH=Y zMS3z{QL}3Vs|Sz-qs~}_$|r?fcM$`3sQQYu*WiB?qSV6kHRb#x9BqOgD* z966T*1ws_Ge)jX;%{(CGUX4!zl+VbiA=mYLz;(j zmAR_8zJbyBU%9u@R&`6(pf4>Z=W-XW{~XehkJ zWAw^VGPpgbnA=kPmUEVx$=@x`tq3d!Wl5~7#hu=0<8aw-P|=epekYRVOfI+j#bqtO zf%4dOK`va53`zUc1&haTF7;@GylpR2F}{UL%l)*|R@jl;8>|{w!DkAE{;CPCRWtT0 zU>6U_uacGZ_UrjU$~QcfZJju4#1mZ$YcM0jeSQ1|joOP*gMZWyo3nyib_0EKS9_)2 zRZZAxb7e^I_f0ZXZ`s%?TiOZ!*7&(f6r8&*ZA{5eFvS+x^!(%YpVOVF=|Yu!TC!O` z4nZ!Nvqn~zmo~wp_;WyvCqt3rrhq>U?i~)ID02<1|Ko+H?ll#**o2_S6<4ElaSNV)N6K!;HE{WVRcIMY7=|+?e@n+IIuoCM-z)vuZhL$=3 zmO>9cWi3_2d98f4E=jsNe02af100EL2_F(r(fQsfk_Wwzw_*`~IrRGS7ncmD3zG=j z7Fmfi>OXTrS;>KX-$n;>CkH1I^`)hKVQ}P!zc$6%3QotFX6CmddfSsW=_Eo`O$n>` z7;^W%VGg;S;~!$}cpXLg*UqbUr_$oGudfC7FiSkO2Sw6J2jMay1~;=?oUhZKm5@)( zh;#G#8o2$|KdQGMDKKpnmILt*u9@R`+9Yp#!^9);*2c7SB)>1!F#wi}_)1!|Kr9Kh=*e?RwFNp(V6%QWhT@q(MRBvkTD^xnH zaI^%oN=}-*73MplmSe3Z9G+UJp3L=}*WcYRp(&Krft1TA*guF{-rxNbg(SdhGLAf6 zs`u*T)&7x{kjwe7?mupJk~X6xzR)D^blP~vD8&(aR@>jK-65BZY_=h-WOdCXopJPrw)E>#VP7&HWvA|SQ7Y{72Ahhq-NwWW1M)m7 z#5PRcH{v2s23UQp=QooU$OeylNXP%y=i4G?`;|T%K7H=|1vOk%HMMnNiP3*k)4}Tp zBF#WSHE^W0j}h;?55y^Pbx;7dAF~sgE$FBCw>*C(bGcTPvhgt2=IEKK?Yix@8!r%n zAYjAU(a)Gq?=*2A(W<@kdr1c8S&&TPEe*rM#|skIflPle*hAeE}90<-TfHJ)V%>=NAPt3-#0Uh`x2j4-o-mAE3n3Me$s-X8Wj6+^Zt?Z zb;MhTVu5+yl%g1<>(xvbcjcK`sdZ^1yGP1wT6A3&uF0h)SQ7N8Mrjl+%ol#&u%A3| zp@3@72`LmNLenF?znDCq%H(vqmHk-pT4U{ym>UkGOMQjCE!}40!Y$Y#x9wO0e5bRX zwKKn%I==ak+bTjEsrxNaSk~>CTqYILLPvRyQhu=zy%`v2hF0#lLr!3@Q9}URtowMc ztGYS@E}dc;7PRv+Y=HN?wd-esZBeqSxM)XxZnxPq6m;&3Nw4v6rGx% zz(o>PCCOi;yYJrbWBFt}a^Y~|MyFO2B02$-S*2>;c$EOt4>=I9r(>0{7Sd1R#B_5A z%;>@h?npV&KWm%;S>tDu)Grr^V@Kr!_dA<5P5GnJt#yu5niN=iv?IcP1n3#qaZd7F zU@x%%sz~r=1v?n%-NJrTkh7mPl5rPC3T0# z%nOr82+K@Q&W9TAiRsR3gt)jD#sR>Hf6v4Rko+-6tkatl%p3WnVOxoFg88$GZjpF0 zDz<8O&b8Hj!Q$cSL#U?8nYHno2{_J0gX|Re7ZdkY&5{SXmL1a@Cev?!mDUCoG`nf1mv!>;32#UURjmm@i2sH#1{s?vG<#4I@I7^ile~ zHT(JW+9DVS%>B_aoi#lMZ7d4*^-=slbk+HTYS8I}YNN8Ni_C|Cqbl;O3wAdpOD2mq zsFb^&6~4$?O}s78$I1a_nFHG7rD>s~@cS1;iHkiV1V-8yP!rl{NQf#*sPmkd^y?+cSRF~iQivPz^2sQ5UN@0SfXE7r$SbgkVkyyo`orFcF)R&em06Kt!}&EXdCKY9*#BtIiw z7Ng3!V3^k)Z(*F3ECU0h71RvyfN<%rFO#2IOG>c!(z#&fw?D%YMk4>4YJ*)F5V;>@ zw5O*P?v@*I`i2iUZ`~-`aY@b3^U9$rQByK8B zdbOzU;B6pphA0}hai5RFAy=xPAyenH@gj+5hvHK^PV+qs7p<1m71I>snR3hMm|{g# zR(qpm@&*3|*5Ux?|I^h}*fR<}aYii>IkLwN_$g^FqKz;Jz+Vo~tHR|kZU6%1DHTwY zn(WG)XtE>W%%Rxt>hC^0UGa0Fck}7J!4fikKFAzdamt&v$>q+h{)myC|H8EtMAA-4 z$-Y#Uu={Ura&MMlimej5Xk+}Yu~YX&QP(f8c>d5n1Iv0km1%A~ z88t+0z`9YyeaSop`5K8YzVEo!+Ufi6!zxuu)y)-50o($i{&Gug-$1$fySZ}P6B5gP zRz345-`t>j<&nz?K5VE$O%@m8?acUj|MI%}(G(37N`ukyV*vX2z6CjcEQr@nX`}P7 zydX|)j`NbW)?)rrb8yVJugIFpoW3VY`}o!6Cpd%E^f9J;?SBU09c(*pIEvE9pYjhq zdljPOE7#7#Blt=49IoZODy8xz-rQ$zkIk>lk&)TFz6UtrZv5TzJHxk^FmW!{6CdBo_m#3IY7el zKtHc>%5T3c@me7)?gOZ2e^-eH+x&8?hFm1S-uXelp~*e?{8eQ9J4-gXT-j9*{ijM} zK`<1~FfQcd`*iy`pwBx|s>{vden)<7?IA_PclFlC$R6Y-7N+sReShx)Zr%MVv!-Uo z#_wXOvYMh83w_aqcfuI0nJO{u3+9){$9uG9G3KI>0nsV}J^fhE_nZaSA0bXmFA33| zN5Wchb61WKuWxFld}_u1>i56>p)yMC^128Wk(m6GcM9u}MX4fZRp2M#F{NB1XNP2X zbSCawzVhBDM2Gqi{>@Q0C^iGYIw8!fP-l#GoO4{h~MuS6-CYw9Z zxW_negGjgHUY46_;>H;lIJz@brk|lLIOpgv;3Ody=uvvECg_pV4bj6^F?7XxTfcO$ z8Z$%w^z?5f`Edg`M&xSwz)eFJH%b+7Ro~h?zft3lV?9PFdvvr_P!}pBr5_p<;6f57 zcBSaNIvv1t3qMvP?*vxjq2^CY>{*Tt86FdNYx_Q<<55?Sv)vpsf=&*ZwSl5bLrZ_I zsZ5dWcJEZrafX)}Ku)@%s-{NxEsWLjQd_zCdo|%vmAlnxU7H^zLYbzmJ(KSmnjQ!H zZ=J_($xE0tvr87GxApYSzakqNFBgQSb{q=Hx+VZBI)lX@zP?@(^yvR8Mc0s7 zl7>nfMb-llV8jm#GogxCd9s%h+ma;-x2m1TEf*mJl0j*ORx-&uMV$cpQX)&6u{%-=52Nnx3f4Pj1wR6;4jN%Y6Q>!4Ey&XOr{!f7`n5nZz$ccYS-qmrrM6#%7T*L~ zt5z^TiY>G1!LHME<9q~lBr1wrKY>0bM>V0$-bwid{HlEg@ABkGm14VLqWvqYtET{^ zG6uC}J>|IK4Y6M@9&c%fTBJl?=lB=ScX#3FUYS@6_%g`E#eSr9B>TY=R!}OQSH$<2 zP{h12(Gq>{f;IW+@WO%w(jt64LdNhnu?{(p%@O^`RR0rCP+K$yXsPv5gt+MbIGdqX z9myhicIUf?0b|E`+!-TfGdU%nDn`(iPCu zp`bI8x`ljkJqMwzScPH&EWJ#pD?9jP$_(s_Sky(y$XxV2HOtZI26}sD=b})?^8I}Cw>qldzB=93b8LOjYxZf-6Q}xf@DahM^{4C@=H!J4kNtnXO(MLLdeO$dXFjUpmG9M^*Z0kb z;3v}KzunVQd?P-U4GiF$LQR%$7O@(W`2 zd>itAMvpvcA{-`>0`9#Q)BhWOqizpj@-xDS4azO|v+&%+UE6{Cyz zhEwNuv5q-4j-dK|mWnBtx*)JV-_vA<5N-bY$HgcrmxrR1S9;&ds_- zgx`|e=vg>>c0dIWPBBOOhxGf6Uz^Je-d4Ftti$OKmvhk<__~OOr3vAOI-i5DI>q{= zP_ZP{2ho#4W5zaVw==y!_c9;I$w3SfQva&jaXc9tUK#y% z9N{baF{=tW*oLm@jJdDB=f4*M2z)B`Zq(2)ZTVj(5_H2%3ACTIk?+cJb>y72dP2yW zJVi1E_olGUt*d9L?7K^e&(*qdjz;z+-Gk7jmMNyIFVkTmATN(MCniRX5|n%OX`YyJ2SoJpj&?h{Hdwqh6;J@c5ZA(PU5iGU8 zN4SM7x&s5(@}KTkcJPLxWaPixKY9um5~gaWEh^`IKp8&YvOF(w$<-bJyiYJ@MV#KZ z5R$czA-&g9cx^xXfQ*KR0@(!C{BnNjhxqJcI{9957Bzru1zv?3QUAd34c#hkD610w z^7)T@3XLvx;%j_w#lGSgx^@1w`e{1s>NIrCVHnbxA!GXyB(b}(<&MLsLlo3I9}Ox* z0)ORTld02voj{{$tPKX9TEC;7|bfF#-6_OGrgb#3cQK!Pmh?yD2sZprHTd~jT zyWM^c!Q7k&V$3(}>&H!Ypt$IZ`F^2O$1k`*Swf2dQ$^IcnPG|UaZH7Lt$sZ$>3Yrg z8I9Ad{SgV2UwXr} zsMEt}90vtHysjAR!#dzbn%H+tK!TXw*0|_mlNR7^Aho$m-Me?8+cm96zppHGZJqiO z_1SmsrbP}@3tkjMAnf&WkaylW3Zm83o}zxi+gXi9b>5ZnNJDnGc|C(t^pg*7c7-k6 z5vF4?K65Tm#my^-goEoQTrb=l?X}kNQguAkhFlWqPQ#ouEj71WG$P3{Y|=R)2VqCK zG~3p~)$)(v`Xh zQSj^wl@>wB!3O96C= z5Ql?3?J+RGC&aqr=GFMLCtXC}M*W8zch4=hXV^;cMWQ>vw6NBCOO-L7kdL2-cRm&1 z``DZcLfSG6vGEPW9FY&z+45V-@b@y}MFJfvr|3*Ve& zC113jwE#^i)N4H<`YIO~9Z3e&qr2d$=cN8?g4dCi6)Nkbi=i5mpN}5<;hw&>C1Lnn zv^w+z#6I-MFFKXLwiJQ26ET~6$8t0FAK@TRtv$&wz`(b|MpjFM6KP`~Uq!GiUo0~= zw!%@Mw(T{wKmnU|Y>Rk;j$^w6;>{S`+?Q1HRxx7lz8b^snG>97z|rwI=f32V`stuM zM9L9x*!P3t@aW2ny*j#J2cc%QKsHaHC(eW%;8)rv^ z336bffCJ;CwH%82R@Gt-&Sh-j)Lz(@{v6=TbK8V~r8e^fF6>l1ySyS2)r1)0UytAs zW2x*nouqQzj|f^n5$t>P2XC(h=WsI5>gnhSI{ep*YZZwx$Uadbog-tlvi(jYAM}>Y za?XdFprx=73$~L{-uK$~)>uW1RFArxzA=%rY!eH1yuB8TmE_dJx1JInn)6>8a~6{tG}9&|CmM#X9yTKCx1_w8JIBMHUKsEE zT_nz_id08AxjdGpN+7)znpzsF>udh+)Y(j5_7i7U)>^;eFZl5HrL73X?L$_h;TrfY z(q53d?vqlU>W%x;o$~y{U*DCnSAMa#yp2f2Q(m9E?6 zxWvC?!6u`KAPCsbZJEr#28~NYJK2^GWszjN8AQgzkk8qNnDB_Nw-2wfmX6*pl)*wB zS|O69(%X*mMGA6QSVs#neEUKT`@H2rzRs?0wD70-nM+5vC}Z`wM}1{U#4Y=t&kP*O zH+|9+!Bv)Pr$x`gSm$s{pFAFN&xB0qnRKo}4Xp z5ATS`spzgHz-20b>s6pLkKY4ACbt_k+fO5fay+G<{+a)$#9e=@EaaO1kifqkXO!|p zC9+C_gUscJX(ykJ5Y}^esyr4CjCR*v$b1+yFP~Meq$u0zFQ9 zLVm3R0zIas!1`sVH?F6?is2xQ>ggf1NQl^BIo+H`<6ykxu8>sqvL{SFOHU_H!zw{x z<$)4Y2~$vQ93TQ&?NGft?H}3O&yjM&LGV%4Ekpb>4#8m!ZNj9BY;CZ^#Jx_4#iab( zFLs(DrAn|~-92ZO>3Qvfj_+V}$?yKKvKKxph<_R;FNb~kL&I4Au#p1xF@^5942}fz z0uk?Q8vP-KYk6VoC`Ump4*%2F4iLFce;_mUca6`L>p(VF2*Ws3wICvtaF*-4|D9n) zoQ02HkW))O%XqLDQ*09-O}OuQRr9$?~LFM=U-nT zx2y{YaS?Jjx=sUsG_s7XVrM~WZ~YT%n^+ZHe3x!Y4T5!eeS6>hg-eUci*v$c_l%lcu9-F_ioaDn(=rVxAas+GO= zMre)BR6&wLv`cRquNwW=+@S^`h-nX^>mk**IySBws@gY{YSU$%@uJUSL>tX7mpdY; z7U=3v*L7ILi8D~LRb(*{PzY)HgD|Iymn;%`0Nl;hnh*Jcrfn0P2k znlxw3ZQcgrR>85(gpo%- zV^EDY5TCXEUy$c-I?x5ZjBd^WRZG^5rkF+H6CEbKwqb3wzwgne1E^jN+HnKi2GFSf zpB3F8Eke5PqIxyfsjf&)x@*)K(@(B=6;jc!vY_7u9Dj=t=k1>Q<5yMyz=Yc9Y}3is#>VmBMh@}V({l;QfH_BIEbya z+u4fhGZvE}@j98of9iSqOLmIZkp ztwPE~8iuHkd$2%GrH&=nZiCYDsg)B)&sTN|TKrZYtrH--AgR|MS9@6Q^r@_w%+(LZ zuoN9L%vfweh1)$P${Va>Ts?hTz61Jm?+&_91;p)>X*mrTI+wKQL?@FZx&7N9U4<<^ zRaEfI5OB$;+4*NnRQq+pyyb6gESz|q9@5h=cH^_tb0IopB>Sw)x*}XyJReQ!yll?O ziN8w&{@pnLb-dlem2=R<{BXgR9&nvf5$;g1rm5e1(yNW8nrQx@%vw|SBYt>{&JjORHIX7 z*|2t}e~4Ruh@iI3kv*SjemZ;a^rorqbUiGj$Mhez3*W<;YeNzg9mIHO&KvK3Gxe(Y z-w|fux1q_SL9TLeU;E*q<}tKXd7Y3qYdUIS8Cbvh(@&wNn<(x{EGsxlA4fUa8uXNk# zeGfW?->Pu$Q#!vgw_wM)^~X;0cc-i&jO}+F@UGJNosK#lSAMErVaZ;#Okxvr=g2~V zlY>Y#@T-$~TjBEm$H<`psElrOoC|bB{K``G12ry6?&+2FBRfFGE0+OnGmp2>-Y@QW z3^KPDEig%zjP%%llYQv~`a{im<6ZZl&MWr-y;a25PUe#18tPf3=T?+ZHLsl%k(FaN z5h=d+xLUmJMoGi8&`qfBh|EA3`*CZ1d!#2ixnsJA27S7RT|0lClr_V?B=lcw?zgQ# zuWbMFh6-uPQ;1&@o>I_PXN%kljhu2U(+ECYU;_F>%srg8{rRTaLJ@Ck$XV$LBj2Tj z$7;;#8Wn6ki>?FUCc2-cY`dmWNZ!(T_8=6UE3d6iwp(aHphw_GB5}>FFRpn*>G zn`DL}AIrN@fG!FyQ$GdGjqyKZ)z^5+^o zmtpeCW&2r<2ul$mdH<%Eqiv}gd*;HpTe~lxjv559p3M1b$=C~qb#49y|mudsl$tS^B`_; zya)AY#q&ulw-|YJF9sTS%ER@a_u>dMV zi3b#PRqMix*is zJom;zG$T$NGb^87>esSB>nlqCAzSj_sj)lHdcKNrrFw!K!x3ZZTDuxKsZG04*Z$|I zZ%Dl{fG*_59Qb@e4(8khadzXA4`kD<9Sp!ic@yv=-0sg4W4>0gHC1p{l|e;e?!0(! z4DGR+lPyd7x8LOfx8vmi!MRp-?Kve?DBk_V7B{Cl!SC$?5E%qThP;a9yO$_hZnWT`<&gy>D=J6d)s}=$&$r7N zDi41Z@K`Bt>8xYOHlxT`Hlyi8ap3qZAmxSEu8j z?y;wjgU3?Gl9`6?i5tO*;HQ+BhuuYchpR8UPY12@7A@L%*{XR!(k1V4sUybyfEnwG zuR=B695ppO#=BY09SIf#xFBxH$?+o0ZgR(f6vk>@2x4z4m1bk(X~EJ<&;93wkhPZQ zFRNB4zFlSoGIf*6eN^R*HKI|&KP9V0gSyr?t;;9?jh7*HES z7FoY_Hn~(cIM(wwf-4AotF~`VQp#Pg23=}DJpx8-s8<3!BQPJH*5r)YeokRkI$a_C zR8+LS9O>)?;D^Y`{an-7xZf_J+@@UgsV#j1co2Sgt4Fr&u;rDW;6`WSS60C=)Yfhq zdP{Wt&$BN!nKrKf!ZTr*%L%_*Y(tI(C(I;u_T6-S6(Y40VSl8xS%u;25zrf8^SJv2 z^j+SU9F#3qMS`Vwc)B+Gykeek*6;KfJu)LCHSuD0fU^K~ygNNXjGuNxeRO(E3GwSY zKuhtxOmIKmHl&6xss?ymrTVVty9L+B@Z7zr2=Bv+T`3r~ub+Mso$JRghZj!(B|N;d5{08!FH{{5 zd4NsRPy+dPwR@fAfZzmU7NgxWM&5Maxs@i4tEzw(4{v}@#2lRtax<(i)OO6veWbxa zwF{nVziI_gGF-r5DNqVS_f08z&h4VGGi=}n*n`+&7=JU~wT{Hl7JX}qem!5HhTQs3 zDFs4dy0pJYX}4Yg&aur}v1|f@sXu;u>Ub%)75-F<-tX2`m?c`+v1|dbyBiJ~*A&QV z1wziV*9G}o1YG_T{tq)=y5^Bv<|i44Rt?=&lZ<)SAmUqP_x!p<2H!1(p*I6QRXTOK z>L6LDjF-TD(c;)eY@H&@BLBQ8GqX|Y?v3S@d1UJ7r&B2%Zn)3l7i>k&GwWrD2D*s< z$I)3hH2HX4oR*d$DY-F_7%d&rX)s_kD5GnXv?3reMhzGvRZ?(-bYlP`MhHlbP=SGx zB4PV|pWpjGJaO;2=X}n=vAnvg^RIc$1rO61;vKfPxDVMrTb~iO87F&)>_EPN0 z`DJf=qZjr9P7 z%)DtkUX|C*13V1)7=MhDqjp(ir(XVpaMXHEcq0MkV4m5=KJDC?r`r&>a&LuO&zgKq z!v3RYpWSqCq=U$TtLq*#H#uCaQm8$Ta=F2bEyovgykNW?;M}T#rQL*FFw;ZAMG!Q< zLFRNZVU;&stPph#?t*puuGbYaNcJK#nAVT!Sc(9ATy*g5^j#G_)yFHORBGOJ*$Cl>e+_2>9xA5ks;bVWNKD+MQXWYGenO?BRDsfH0yhvHw8Wk~n%29B_ zU9F{jBs;c??tME6&EzRZj_mj8%3u{PI25)@4LEgJlEtG5}^(m+DZ>#~OBe{W1Bh?Yq?2aFxJ=jenK4Nyiiz@Si>WkIIp{ z{UC=(SLmcGe}=tJ=5;094>jbXP;49Qn#ZSQKSzw(SgQH&X$1+m8dsZW_)YkM3Z{p( zwsd#h1ne(0bxt*BYcXOr=tFuJxKjVtv^qah=JlJA&nq^&Mn+xg`LNl>wOxx~jW8~X z3@1K$O?(!w<8Pby6t4+?kA7jdJFi_0TP>XH-_!`(xt_EoJTP71Pj-k=Qk(#nqYvFI!JJ~TjM zzWU6sO|*AkJ^As%Mu#zfQkfAeMoCV{7iOv)?xdRSJiu56pGOEuIdge|g+p{J&*H3x zn-@$xjf5K1B0labDc-a(p)v3RXkm%6$Xko6k#3dxcTOMZ!#n=+yM~aRU&$z<%)zzF znSJ8zVNRY{6Fm^W#V5|qOj`7mXs&Arzb4Rbk&4n~LHsXbCL0Pb7yDLF-e@WmAg8zXq@}b2>w`g;4-FkA z9V0jAJfT+~J`J4M9jKAwvzRrmkP;l3o!A4~TMj23<8loaLEqtGF~44YlU#jVSo-=q z1dc2GMlq%aYL^%FhSE}xrpBOjW1mo5Saz4P?B;c!OVXIKASuc^#X z>z@;tNmCH)a@=N76=c*=$Vkl?T7}=wU|8uCL3$$nW5nxf$yn@L)MulRFw{B0CHa}6 zq8CizLPp=a)SVBTZM8|_w^gCOq+oYU@a7pS4TW|faX(*mUZ*+Q3qo7>m86@9n+dvn#bY96ZcBdVLPK&qGitBEx zoVy3IIT$uk>Pg#(G?M-z9kXwu*g1#CGKUG)^sY}`-M1yzUx}IR zJUA=`Ffo3fSlNDy-QlvoPg6SDVEH~B;KHE7I?W93EJHYJ0sXzKaz1C-RpO#!2M6w+ zlAd^bA6Wgu)jxOi4$S)U(^cc8C=t_+D|x=|_aO4Bimu&sc8d)PD?FA)NElGU){Lla z`a>}lJs1o66uEl=n@}ZpUsVh$&z@-lp9DMAR2Gj}45H1L=lXg$QVlYuoh7CrGOp+- zkI#|7SL?(&YjGU*u!&dAPEuyn6#O2?iC%N@7P{xwJqDciVLg_*EDixq zE2>@Wt`{fzCIJ1aMnD3rDB~0m`};}w_FuxM?#;RC|fn%c~SF+GCVYCoSjImr3s-1$um$J;^1OAt$i0VfX^WOae-9Bg8VNLI$~D zF0LI4;>cP$m5?yL8iJX@AVGqY^aJ@<#ADO@x32}wQmYDW`opT{RZMk^jf|INe?~ce zu?J97T-T2+RrEkEoCUL>$k06td~5&pMh7J~BQcP}#^S?08JDGidjrDY|EPK-ctoy5 zHD#J3M2Wk`L4fLa6@B3ep6YMfC*HC|m|EDYIvNGxT30r&1uaWW!6r? zQ73;fdlb+63gecng}e=0Uq%IO?YiX_r$h?9i_)H)@X#D;Ntj4I&(`p)CFg*)&w4)( ztK<%Q1=d8JMTKzV>;0V+nVmFhLE{lGQ5SIQsnnl-r{--F{eSDLN`%UC4eZP##k&7E zL{-ktyFnpFN{l;^pHPyFB+aa9WBifu2Ln}N1Bf3?J*5>9E98Z#?)=0_^U?l+z>5H8 z+v7;68WT`#k`aa|@~X|#!t7%vCR!()Qd{|@8I-{9qI|N2b1Zh=avP!Scv7Fv*35oi9q0Ay2h#3?c@fCJmX!tcUuf z$rPsl#@a~dz)I#o?P(8dNF<&C_UY*FV=B~R(rX20sp;RG9&J~>>DoCya`bQNRB`7Y z66*0nQMonjuQkY=}~!*D1mhgXXR z1Z4xxMN@+$!>nJ>&Egqo7s_Na`Uw#Qu+L73;WDrN0qK>4xax%*o0;&efq zuVR{Fgk00ltE(WrW>P{=BSo+C$E!Wq|4z;s54KsLZ#mYCFhmoJ7yhkp`JFe4H5a>M z<_xRWVn~}`F-c2Kzg@ViICsB4+;&V3t5i}rjUCJNEe~Ess|A!wiw@q6 zpbjq&T)Lb>lhd2n)Q^>|qvknzz#;gzn&H!gKkX1%?=l^y%Nl{+=@5LU^2>G|A>W&A z^BCcjqqvxbs(-&^%sqc*xGXGw=(_il+<&LVR9CT?_oKx#^;L7aAa=oF!(nV7L#5_V zMn#qXV}g{B>(hnlV79ebUBV_Omgfn}$YO$37~;d^p%dAex&}I+vKilDdyI z)9${o?D(Y5mvO0gEnbq*pE<$IX{8+Y?$$M$v$k_7ps1p5+mKn zvm)dxMR@w}`X1If2D9JiXvNdfzZ50vd!i&bRQiI-z(jQwzcC)H-#w#=tTnY`GICZb zism@F<~4m@v)+Did|j?tzkvpFB}V7osZDNFL=GSp`?+PG_uYe!bCqtdhRV=|s1TQZ z|AK`csu$rW9m<3WDrVxF}c@@2$C6|>Q3p`V}bzcYpzN@kx%<0D5p;!}OFOoC~2 zCCB=9O$_@?{{!`2*v#0KbU{bJZ-OueR=2Lmf^=#M3k5l35io=mHg@tR<<*j-=Yk>!eS%jcb4Zf059!{K{EX2h;Je^uH{>@3Wx!TkdIrDuo@T1~7iioxf2hnsgv z%-Tf$9F}fbj&Z?0bJb3qJ*tD2E8+gnElwVNAwk7tWKiM!*QSX2z?N&WgO0z_?;Bev zyYl7o*ctNR%|!|xjLu1pT>P+7outFev$V&x{*|N|bA#+d;bs7;k@sN_R!xa2q<7P( zTbNj=raf0+IVyBTb*O#P7N$$=7l~(dRb<#SRzqRY;A8u^8!+~p-7-=YbQBz=>$9=Lc|M{5=^N7qS z|GyA1a!gj~y>-J>%G1?{$+$mre1)oZkH{VA)z^e)&^hlh%&jJ);)AaB#k~V{9htRE z7BtGdHaT1dP0OV0JvhctaFVun$+)`WisV?$uJ)wZu-(G+c=FS`*TqhIi5^bH?SZf0 zA&g_R;_r&XiSNY^#i1eQOx!vfq0Nt&`yllKmep7)R9D6i*I)QrZcyC~=}aV85|TS& zBRiE79tWCj7G!PBQ44yDM{m7hW4HK>gK~Etbf16hc%G-$ zCAlh-^-eP9K%X(^n`@e)>%(nzK#wP9aCzP{f@%n;ioJPN0NnOsG%^b=wac(-XtoTo z+SNis25IjI<$(m)dIp4UV_Nz4YVmaja{{9Zyk6dbCqRAJVirUr`!`AxS^0sC9ZNNtt)Z1HtAxyaF74x82`~C2d<*dGwi@MgmG^4?PVYGFtE_b^7 z*bCu)^ekp5psxR=CT?4tj7!X*PCYiorJeqT(+E}Y9oZ$X zqRq@2-_kn_Zx-FG?#uCc!Q)O?u?^eSwf{J{c9*;O8h2K^&1kf9QGD1UxJF9VE8d#( z!KInbhStpM@fNDX#vxCew+E2JC8uQr}G^H%(gd$vF>OocZ@0` z|7UK*5(Js`A(MYz(~S{r37z(q9K$v}s>q|EjJomYmw}#;e$OsY#~-nruzol|5I2DR zS+U{XzJ4=HmaS4;u#;?fO~l`xlo69>_@E^_Ad{Z>3y(K7g~KJWWm;FzcLg#c)z2RQ z6}|<3TG^x!E!1ER9*Ms8cZqElh``D!D@9SFuUGeDrWu1r3^Zq2*H@9kJvijf_kuDr@-P%ml=vvUr z$n$sNi-g}6XerNT3w=mW(^irvw5qDMhHRS%q67TCA>0)&ycIGVGmR2@OaYgRQ#~z$ z(q0L5R$`Kq>2r`7SFfMVDe{4OL{($*@O=9zmzxCfkIwYt2va!4D&6(z+SG6R%BBtn2!KfLz%T6>XT%RX zX(-SbBkxLn%^JqMiTNh%o*X|PoDg`Ab5hITysM&Msy*yrd#{7T`4($l;6Fbw78D1U z0JryG6>=8zUN7Z(stJ3t zibWB0#+1qfu3xlR`(BN!nUadn25sK?U0~PHQGZ8k^8QFs{rd=k*cVFcc-;!OhP%A> zZoj7DKMJkf@mU9^v%qe?xI33ndZ z24yRlDZephtt!a4&}6|ya4o>cE?$iVucmn)V(cgjLv{@Ui=U zg2*#}xN2cF$Mh(T?F08yg^fF)Fnc}M1LLGM06%Pcd#gpZJeNBBP|?QSwp!Dvvh(vK zG#(fQDg%#H?46UWv!AxV#(}(EV7qv9EXN;StGxrCccM`Z!+zc0>_0ZEEuuhJPyjI) zHs1ZbhNnx;y7wSx$7xt)2_R;sX`#$wmP_r3$6hdaB#X+L*+ zN};Z(Ns_8Allw5N?Y02qHI=PK#Gy4{FPUMpX6t@DbFi{I&$soHh(G{SoUkG0_djNk znI{q?&+8RHH|QQp;n=5h;%B0?8%~E3Gm@C3%qckvnLeLBw!Uay)q#21tw9_!E*h;3 zmMulo*@o9@4~@j~z3zJ&h8mOijZ4ghSIxqB0(w(8Uh*ZdjVj;@wYr>SZR@s~-zs6v zT)LT4xAXk1YWc50+V#3{o{i}hIRO@KA?VATS1!&)v8HE`lU$_sKVH-s)zqIVPrGkx z>zhddFEd~M`0d=tQ45z?L}E5M*OO$S%I3T!&(uPri|L30fuwnZ?);x7p#q~FgWFDi zOfN=GI60v#Liq)2)hoqR5Na@Ymm=@Neb5jKH516o6Eto~;dC(`FLHTw$Ct6fuAOM2pU!ck;;-`-oq0BA?3X{g1aFG+nPR}=k}R&2<| z5d$@W_Spn62)e4hX(I`paarkSPPsMg73beNo<;598!FUAM+X>5wfgT?vadvv7$#10 zB|zbVJ)wHeKJs%3oUfH=)_QvSbb)HsJ-xFN>V8KYbJ@)NaT}8m}fzMYzvVMr6 z=GU$^9&)SP?Oc98&tr|yOzHSlD(Jpq#<6!v?6ZbU%Rt$F}Y+`4%xf^@X?;rCblBq zFK>>$Z$J`EATUS&4Iv#1UtDPZuk(Dss6aPxv!++e8Cu#cYdtf`%`v88q?q_owUGLe zVdH6f^(%1pY_FU(_~_W-u{jj(Brdu$E)vy37qM#CZe*$$+#TD8cP!v|-_BJ9VjEdA zio+L+m4NX4%<^hh+Ojav?DhMNmbc+9MlQtt8{EM3Su2V@icjLe~Rgd13_aUY*DFxgljlSf6#|b8Q#7Gd9U&+z`Nb zyi84fn$T&;Hoq%|hd4BsoMZSeo zBC#z%+5M~4s0+>*tDsJ$teWoSLtq$bxV}VGsV!pcUY)=w)tv?A;l#90(DSO`Gffg< zB(nMKxC6vRj5X zZqQ+ij9sG-FLVIF0bhJH3FC0;pXn2lY{R;8l_*vu`=<|UkbTGiJ!+5mJ$Z6;5tO3rW}$Z64ys0wMv=7u>o%iGqso!vtx+JwFLT!TFAsz_I*L#3lh z9v$hAS6{R3bLBs*ku=@C!wOVJt|fZ%VgimR6aMry`I801j#_Tq1-Fv(^xN9|Pxy|+ z3AeTzxuB*~q@_r^%`%)vZ5W{&D#fU*u-5ZZ9DVk{dR(xEFZV~P4fz>57c!A1nOOp0$~QnSmR|!S8z`#n8PAxrlj`4A)6oelFi?OmN?T zE8M*eBS`}C>q6!sd9j;)5ZD$9Tw!S_t z;5z)WVr7$IP=%C0AT4E*v!qMvpo*dQ4e^Xdg8oRo&;6XV`EbMGj8j*W6jza zoV!r~5P(~Y-umcH}tXob)P=z%~bv>K@6EVELkU<@54TmU)0srzJmQaE)71y|2!`2Y4z-gU+am3n4H5Ky9Gys% z`<}c7qe(0HpQHS#VQZvZSmeWH*k9GH185%K9{M)CGellBz(E_Y5ujST%j(f_D0eq$ z%{i~}z9Lbm#fxFMbiu~Uc4qAT+=z2Prh3s=rxd5L>AR9;rqjt$D(lbpTn_dT=si|H zv!jn{VdwSZH2g11y-?F9-Ie=ivfQ6iJ{Ea_NXzM$D+)E6275hl6)Wt{jWW?JT}}>- zMnrB{m}T2(n#3-MLiBC7QNVe$_fdcNFyO>SF@!sMz4BG+{<=r>Hqa>*oFReM)O1z9 zM>V=xe7hy90X^z=F8Jw}at|vwU!#X&sTz&{u zgy;=AwlFGV>hBM2F9ob0iqf@~tEDM1fc{nJZL~-VzG@Aqb`rHo{(FbafWqnJ4hEQ^P1m{d)GsMu$o(Y^mUlk(??P ze^T5=?R*tb*J=vgF5<~ zXPRYpP6XZrv%!7MH$9`j0Gl5?H)oM(%|qXXzgf_vF4Vy61k`l^ z6*5U#tO9+Dos&vhHTw1SC}MkI?&9;g4Pwb^N_H5;gL;WPS=j4jE6|=)#1>(nEU6cI z0ZW^NW}@gbm~lQxAE~~zyau&rB!7>@BcW2AcIjbG?eSfgBfa_WbEBfU+?kG+FE8ocO25S#8r>A8w;HT-?X>9O zJk`No)k&g=dBmHx_MSEhMitTqc}Ij$@*@Z>Eb26nURtB zUAei*6!fWiaG)J}gr7l)=CADZ&A$$!&})1Xt*#Hpt}15!`8=ZLJegQE2nU1P)9F0H zaBS*(%CMEcS)b+Zt0YB|BTnj?_dZ;FNALq3zy8yBH(OT7o4XNI2@r~2wPXAqedm!U zHBUg$)O=#l>!Mua15xYY!!AW&xRYVwGm;cVqmP?i`iL;Lc=XQvlXXp}$)9GN)Jsdg~tSwPR!>JhvyNEw(PV z>?daSYh}u$V3j|;)YVUi@r-PgccecYDvK9E!oaOw{L>Fnmc@f}QFmS?y*86=aX;@J z{hRJP-QjX_qxwm(x=Ql@%oX7mR%!&`6(>$6fL^zSMldr~<*1_CP0U#s8wJ8|FmU@x z{$A4QTh|L{;Py2ogAb!)XFYu4Pvt#C1AskHcBgm0uXn~=2tI6J4`Ph8ufGE)od>-b zr)2-F;8{u|^l4K-_wwH6fUgt`YNf0W&@Eh{3Lg*J58SndNO&3sy%CF&x3BOhugI&c z+{9~n$k8qU+?bWy{+da>R&{&^`*#D?RF4e`wwDc+Ees5tEipTx8$^9BXA zeC0V7uIW*`!WG;mfXe*YB=@evgAGdL!atMBnskkB97E(O6XaDShKJ75HrHCbs%jF# zfh<`>VN@7tLA7<(U3S(|XwV^W0>GWV!q&uW^GAA#7dLzw>RItBb(W|tzKF`2E$C-K zzitWOG!(Tp?LasFM`igjvstj~veacK71sRgHmt_DXM#d>;f@F^+iyEOlmABdHd;4S zO2^4GnU|&>dr`@e=C`4B?nOwlg~S8FsGQLrlsOSOgTrk04d7L7wlF6O2fp-qG?#JH z+B~QNmr%;P6;;8}HMef1{hG^`FmbfWS^(inE#Si{`XrGat1L zWgNXBCgnzRxbWdT2B-vz|P z@!Nb4DpSoWWg4#W=(gOy5MqPF>4o^ps@2%73maVhLunO+^hOkNU0^7$zA!1IK_-J` zm4NQNA&_~zAI4-{07~5y*W2AFo$WhXX0re7+xNq)z z1zQcNU7&-jN_}TpzgGf4<0jvxgowKy*M>(UCbP!oOgOV@ep!9Y3^o;uibO2LGA6#0PpNDk!he~aqP z-Lcc=RQ--YhpLR#xRz!nR@(50+{h=3h|ZSh*<;~5GF`kWzwiZyR&ZlK5vhXLT+-PV z&JyI+`$36Xv5vXMHBBCMHPiw@*RF}A(H8)_m@W8@Y1i@ef$KBmg3K4z0Eupo-m*&_ zgQgL9X$SW|TUCB<{){t#MbEQY?6*x-bISI?cp5$v#fMcn0l=4%ZoXwC#MCcgy-gVU zj_CS;KClGeD*el0m)+*m=IGqOW!Jz`pHew@<89R-@}9BhB}t0Dcu!j-RL5?`n4MOyY4tm$?J)T#()!=~_#uRY|>>xnO4rX@Y~Vb|Dh*Larl z0VPvKaUx=GdV&StXj=|v68s+LsqAU*u*%J9UG*i2^$$>(4dJ(KJ3o;A zutozm+QN+=1U(*O-x0FQKcVJ`WE)}2JZw76#n9%eRl44B+2sh zQ=fbd%|*Z1Mj~or^ZZd5gP>k=-;W#Vw6TLpx2pau4skIfs04?6zn8z1$WxS8Fg`V( zCr?C@a~cXtyz6|WrIpb=CSl?EYChcC3okp*t*6PAPh*!oSX)SIavv=xkDb{vh>V4b zxiN3#01f@6n(ykwN7;i0o9X+ThI}|9yY7$0=Y>|%;p ztG9hAZb(FU8s0a!$-cD`b*!&21S;rEcb+%IOd5s3iBjIM0mHX|wve1!DTNN_qAl)J zN7k4#2X&{vF|y-v7kYQ%<;Wx#<9BLe{0}n=W=S-S@@Y>rX=X$l9Bzn^+n}4w_v&O~ zyaHGH@Gn?rCb*IeC2n^@Z=2+kE=lePR|$Vj3&8JCar0Mw7~p;S&38LYrXJHlX33_1$=6xWwNPblvEZLSS^Z6R94i8P-F7^x|kkE9qC@USzj~j>p9`Yk#T=fgDNG)OqX- z-EEyxhg@S3#%v#bg}I%nqP|>yiFT>cuN_YCF$ zs0&LqC;E=YsqZ+3^G7B(g2@fEdzABZn#_3E`X22go*XV#vD3IiJLq9_U#>XhAV-aW zF}xn-eHixXGaT7z-_v8-XxI|9z9|=MAPG?QyJAG?o|P81Cw5&XxcU}U@CcS`!!A7H^V`o$X=WlwD+IO*ki_l>IT)@o|n`F+C))qK+*|@`ig-$d&5Qi*HQ=%!4Hj) zhQ3tYYXd6tQR96=5 z>7>b?fxSzhd_)^6>WPV8tS%A4KU!Cn>fE!{EAq@AoD^-?9R&&`l@P`yYBfAFH?c-^ z4yi}~Q5iJYF8$MUFv&A3`{TP6SK7Y_C7Yv!!{_~|k&IQRuU6b~Of zl+iva`nYn7>A(!x9oP6PcCjZ%`crX)Vhm`-dQeoXP2kzJQK1PT9%*P$ z(FfeKw3eWXun9FLf z%I~N~1zpNMs&28(9T&99dK#v@(*=lOE&OaMh{2F_TBOp5Yr#|c>O7qS4GWRkRe{1N z8(D**_s!VDKc9}kU1@I(pIgE+tHdh=jp$46_*6K9-e)4;A;Y7F{QH` z#e5BhIl1X;(A)Njj|!pHE`00e2{40yzyp`t;LP%l{GU_aSgOK-mF z=CWS+Mu)xa3N+ru-PVfn!XbG;=u0lfqW-YEs@?R9h=l{8|9VT{R(EGn*rc{4xqTcu zJJBiD`HAr`RQP=;k*mIH`)S+s1iv8{baSIEo-*Cox`5EKwPWI=q|u<$+V>iFj03HK zdi0O&UZtNMYIMMCM(r0AsiWT64M3c6>`+Z1Fn#g3At}|g)xP$l3s52NRlg`SGf^7R z)eAjVlzVOQc{m@SWo8e~9`x{rO)&0P_@D66RE1fKQk}BBXo2Z&qeEm>T|3?XmTS)OPR^M_rR`20f)8O?))yan4?^tT3)T0VKB$; zbHnl+$np6}8N@m^Qgj2?mH|GnrIn{R_2qohP|BL#K)SQq6()MUaSP+%h@qYUHVY-V zd8^W@>tuj*=~aJ+A<=K^5ic;`46avjtlg;I2@_VAkTCmGKICm&G@(GQski1mHN^cq z{Nw24^z(XffvwE~7m@Fcy~$GiFzQzA=juMc(dhO5t)!+Q zOPe%odZH7Ydnq*ZICu|%d|q3k-YI&KJ}Gz0f4|ntZzXK4zJ5lwZ!<}MO!e=!!|%G5 zZaI)1>iVSv{basfJz`dWox)?1xx3MnZM+7QLg))keGHH zKg@=wu!Q`gH0G2fWe#wXZamgJcItQf^&?tpCuG}AF7o$A!R*PLx$uN!Jg#SAa4Z@7 zbGBJI5+03jy>m_E8f#ZPwij!k`r|d=kfVIZy3`Qdg|MUTynjW_$@)UZQdH@0LyfeD z{tEn~Xz-YZiyYfNb|r%**Q{jMo8CDw!0r@^o$)9x4gkYGSF*hWre;L11O8Am zTd+1#Tp=r^yStvKL7j4R+V*HRHw4i8p|zRJ|54R;f-3 z$kE83TA7cN^<4I7evR?^J(6G7a{@x`yrbK+>VHFYfrf~Aa zWWsr$8PDzkMQ>=zH#{19ORyB&j5(O_&$y}|M%mvAtDa{K6x*~Ch_a&CQOo?@_*c!z zR#o(>Mbvf2FdJv_ns(2Jmuk1&Utj;V(=oT5p*PwT>C&?*1Izj{?#Xx3^v zvL<^_4Lhr9Ypw?c?)rDMcX0B}Gaei(zETpVL-imQ#{oznGoKz*MAE(WpKLZ?Q>J}w z$*b0<9<_O3z}nZ{-F&W@BM_7{tk|;N!TGvQi|=(*Y^N-nRtmpS7}rq1Y3Rn&K^9Ae zxlti0uN700>$;_X2f!W%O96e)%apZuZ;@O9*JVJq95?MOWTPXp1-`>NO9SfiG)KTC zALd2{y!Vc7W?GH93L#k2w2>0qA1_XBwpHY0A)lI2lJ%e@u^u2b^AKV57-c13{#VBr z#$*D@0?1%;0HI21!zrs^RV!4nt0O7pIi%3niV=U}-XDe9x04VmHZjns49wYpq7m6; zzND{HsWfgxptrqltJ_mCZ>DqNfs8|DodNu{0{%cJ>#eu!SS!*B8}9rjk7R1uUXyb@ zGG#q)6oXK8$~Ni!j5&I*vNqX)9tqg1t`)ZD!I|{|1zER<;4AZ9g5`$coQqNm9M&U_ zkwu}Q2ThUpUuL;!i%Zp@(OzBu+d|)C>F+<*X?YhcdGdB1(HRI9)p{|C`?hm--ZW{$ z=Ysvr$unKoti3p=seRERXjs!mE)CL6M; z{vDZ+r}lXIQ1xj;8GScOkJyf`7W>QdE}WUscTfDAYvXk_mV#x_y&rNBZGkPUZ*f#+ zeMUS-ysmuNt>&s4t)!pE05vzl5N;v%O9Kj9=J@p0lH1f&>>Zr7T%4`y6~8)5O`v0Q zp6L#lSv9zS6*`H&k%y;;e5F8nZ_YqRgK}p9k~l!ah9o;7W*y2 z>W%)xNgILHa)DF9ao=Uk8YIA-`(AtU%oD1O5AL77A5=;YVhrn8>znVmt~hkuos`O)p_iTG85t@9X1{WU3@8w@AYkS2ei#P%NLQ|inZk7zTd&-=m zI=lcimd$hO4%~edmLwKXX!QbKx09j3X0qIu(K?nwa=7RMW#9W~k3!f1ollwurN zx29DK5fih{T615TTAW`=bjxxn(%cFf_&k`a0C|(g(9>_mv;Q9zl4hG(dl0aSH=qF` z%;iPBLEV?q4C_%J(JE8;waP@){~!|oG-o|p#U>MaPvn_J2X*B<9beN4#&-vV+pO!G zxIO%j%3Sioxo1G8#{XNu{`VU(Z?YMT#HJ>Db*0jvNS~=cAC8Tqaxdw|I>Ub@&XXHbj85qVG2piN6(wmuFG6k*j zyYB3Kt(>!Gv=F!Ap~!fHDDuwqG~IvQfnQR(BjAZoBSsA1^<3iv+C=3jax;JDsjr+~ z_L2FwO+R(25iVNV_JgB5+q}qhaR+cUB}bLS=#$tmQ*nw=#g18;oEwE;&VGGM zH~_Q$DcHH(AMFF_^M>kVpW|8hwHjLb7CD!>pKFWM z;Zv}8Ji6pnZ)&aKn5rO*$AUws6FV?xtu{VKWtrzfA37*fBYf`wL!(i)O}^;Y@fE9U zfN*kv$gdT6!zS}F!_h>`keqAQ2;-_ce7)j`Vj8(vV&RrbsS*gNxg&RAl&#b9454864S+p8G0z}XU-D<{X#0diP|oK=nVZUrqIu?}U4`Abj3Xqt7;qAmDdSMQ)!N=C zYSJ&AI5;3?kbPKo%ueiwa$o=i!^B#l$!#03>9oZQv)IsgjhCNsJh4HM`b2 z^=(s2FcVwFram;EDt7i67c&rrLF(CGaux+Xgc)rcNdw0B^bA2fJ|6+Qk@+1f2%Mt( zt|olUz%W?pWT2{0Z6C6{RxZ90mPgfZl0XLHOZ{VQ-bZ>UVVCvKEO&7|u`@I<8i=HX z;H6^f2*8retYy}E@oJv!>4q({_6k<`b2(kyT??vaIa{g`Z#y)=ia~0+%@!Vbz2`y| zJrLD+aCiO%&0?RfC;bK&vr&adN73sXBm+zqxN~yIg`9`#@n)PCBs_H4$kUgYKA9@* z2xC%vD4Dl@j7$J(7O1=F4KT)~a`1Dk{E2@8PrPJjoMeihSaZ|CIkV>C*tUc)ysvlO z&r&1i-D60~OR|jVpk#hz80B&c6=b(4?AJE1sswTNwI-p0V>sx-y{10PG4f@op?hZ( zM#&JpwO538>hrK)bypYvqw;f;qETDj)Z=KzdxEenr(VX;?0bA>EDEo^q8iH@5tBH( zNk{a1T-8&-m2TudAh?9#%Y3UcjlwmYb{Ad!Y@J5}s@rRH zO(>UnYy9&;G1?HZ(8!>(Ua(tsxp)o7r1s`gr0WweXHONQT?;KKj0P>+5IJ)1!+bG! zV5&aZ#qjW=_w!DZ;y72Bv-n2%)cTuHtAjj?%*6>@&f_1hf+w=tsi9-nCWYnZ$awSX zC{7o9^P{7VzcN>oJwx(*z@W?RPiX(Iqw@}D^L_iUDr%P4n*^;r(pp7p#7vFYyA`AM ztgVU~5t~S?s##kJv31x4B{gHTW@{IvyTAAOzJL3};Yd8seP7q-bDrjd{1zY@&k}zZ znZu68R*#I!#J3`Tol$fPiY679X;1eOS3*ibL|Su1M~7{#oGOpN0J!jX+Gg{xxg~qZ zh?rmXd|-8+6)$@4Vdh!ZqX5N^Y2xFy9YZqG%A8KMCxpky3=NpOD5kufM@K&A382Nq z2FR)bq&0{XKfE7mBJR`IT;hTkXt~RENW?8+B_->x$GP%GDP*hJaMI;u`j}0Q!g+MD z8_1U4HE-V<@ZD*n1OQS{?VjLt|F3^J@a$)|JY)Hg%18pr+5d1r#?4n^@2wjfH_T|o zdHu6f5VDIDH));&5}aOS{nXmcX{clwxUO~!64X}vq&C{U^1M@1TN@&)8%`O19GWlP zqA=W=3!bBD*7>-aeU+ucud`La)avp;w?~x^;V7 zQq7!`u^k#d0_+D#pK2uIAyO?ng4Uzajd<@?eZ3JKMCcMzXy3re0-NMhg8kXJa z+@tJmH;Xjm(3esu+BZnxhXldMm;4pXkCr6wje zQB3aaAyRXn3u2yvs}qi@5lETC(O~O!YVvEPnV{uS(2m5lps48Qk6pYj!&%%XjsJ5n z+0kvS?oLvdcx6+hJv34dx-4n&PWy!goHIM~%h>%O{_5WA7lJGJU6N7l_JpnoN5x&N zb+(nDmGF=m=GM8|FTPhCg&v%}qDh}=1|}E7@pc47CjERmSP)L?(_cde4?FIxvptGL zv~uP^XK4R)=?Z8RzFna-2Gc1l+L6?6_41~Fa2xi=@5p78Q_H&^FTw+1UCMii07_SO z`E}j^2|Bm3NF)mrO&ZqH7qyg6S{)AgW3lw8qeuZ`qy=RimH&>O6$pE~krF_ZeI$st zbDwJ$VRukPf8-4!=8%-r_?p!ke%w?Zmp(nnUWaFi)+giC%&3>&rL z5!!=D*H+(g;^Rk*w+NIKIv#4^E}J8oz--Sgg;`nRnVJQYD&~^Js?)VfcBfDYIhC2`wb9WfFL+U^0SJBV8rQ~rq5i5WR~S>_#;F9-DPTV#7BKwlY9 zGM^+9F`|Xf9RQ$HQ3`ghW8O!#bV4$x9U>!(aLJ}f^TN+OO&Iy*g5!N4hQ~+m=$;9M zu;zCcuZ*$>*+_n_k)T|ANu+G+e0Blc$uz8bJ{?YwgqVm8^A5!x>vHwzF^7wpu@&g) z9UgYqi|jE*mtY>=1u7oRM6KnCxbHcXC#;m8cYcpCWDC{_GcYsNUU#Eji2cSW66B$| zGIi}%Gw%$q?2B)unhJTjX2I%pymuM*_4e&#SKR=fZ}i&t<9Ct5rV zYX?wDtzKL{K<(0;>($E6oRyt?wovZ54?c^e)yK3kxB9_F$O^%zwG)3aO|rWX!=>5P z8@?aySbR$0mu1)ZnstlY0?)qx`=%)&!w%ZT$)8nx&;!61+Qw_m{#A^+n?HWlGS6#v zYP{~W8oSekSa>ys*Vng%Syp!$yeW=7L7qP_U5UDVA<&*ZXZ~T#^~OwO8<&(ESH^*D zb!`Z!L#tNsxb^Z*tC-dUOz@?@EG;MRxTFYp>GLY%;*$obiDZwm{wOt!bQn{D>b$}w zcUjwH<0EHy!<k#RB z%>XsIk*immm!_Z!iH%8QtDN>{%jIAw zeSDYOd2x0>O7;<1526M=qNm+|c^(FciTo+!UD?!-Qi+jCGq%Ny)xV&! zOW(^fjg)w3%2d-NqSkyAOmumliVHOL-r9*h@%|vf#C#SlwtGrHc|XJF!-tde=eSE5 zbKZm}h4!k&xCJ)`{VKUEB`YALU^y&8g}dx_w63!(r%&w<+X!Z0)1K$dahKQ9Tez~* zWs}C$AQsum+F9H^CtG_IOG?6|0gxij-O0Gl{HwH`K9Ur0yvPwmleWK;l`b*1zMV^~ z{z{ZIJ1(m}-rz<1{~O^5N0ZjSY8j%f*G_~ByjE55Su+4q@5A*gm{`ed7rwTT@Ni-C zo4tisS(eFD-+HJCe?Jausz%~}-I-6=?RrWw<9n(s{yn$ly83`>@Ay?lKeAN68=J$X zsGAp^L@P6n$LzXe1(Wtagv|M- zcyq4WfINaP!)2#$WTzW_lBy=4*UR0Q6sQ-&-YYAc3lEDN`U@fjkyyiIfiuptbky4I*-CHd#f^}ZnKozz*^)DCPP*aPwqrp`2-FJNTwKu@dK}J+j5TP{3 z;Cm(i8L3^TI{E2Mwghbm79J=_RIUb)CdGcL7OA>7$at0C4rsj}$2NJ?8d~!#bAsle zCuPh}Lz;|p4Z&nR8%8zs?56QLTBhwt4(+nULMU?tge$x$XLWMv$>v!R7t&*_)*P+r ztwfjn=CEU~Z!ZmpJsZh->J@hO^Nl{<^;Ku_H7Y+(uM|Yf0gHX|JYG8Ikcff4X+VD& zdD-i2ug&8%_H^V5=b8KT!fB7yjS*(azhcWJ+t(YNS~dw8i3zhHj|r#JYEPfXiBJsY zGu1PuZiBQq{O3nTO@^V;t}=^kY+1)n+^v0XM89Tb*F6}xn(YjVb`HrQGHXx#bZ|#` z01@ECq1Xn=dfyt8ThABIQYd8?E)=cOs=%sVhfr4Xc;Lz&oCEJNA|Y~hbMW)~Fs`KF1p7^h?rKjpof=zBM>49ZnM zHrGz7PEYwCg~2WoM(fXgOm-AiTG>0$TO!MPlyZ+TsN}8w32*!AU_O#8Us|EnmAu*+ zxY>$2sMD-uxx&*lu@%PL?^i#uWHBhb`*m^1G;;DVKMyUGV|^AV}=ba@S8 zf$&oUxBOAA6PU!8U+A%Vk?O|G57L1_+wZ!hn~Ht;WL_d!Cz;}DQGe5HUnvO4AUM`N zM`nfSm1=iuY0I-OlX!%#orXdu)2+U2WXcF@D`dbrTK(K)HvcYF!$tpDnVMN$;~vqE zlLv(=3;aDWrJRS&CeEhruuZHle(D&nuT9TeWpOaE2`Em>1Lm$WmiHYL+5x&?=&{42 zJ81N)oBUgoYR#Xp_yz<|1bQ9v);T}jX1P^c8;1BFg}roT=mot*K>~OvGVvAe=)sqnbYA&mWwrg!7@}T{?R#-ca0?u9ArTEbYIxcmICQROO!v z5G^W9w{Uc3JT+HUVp9B)(uQLt?NY)S4jSZV`3#mIGBP=^%;|lnGX?AM53f5X>&+ue z@ggAZrf>ACIp~sX0#(kmHtZ4hxak0w6C3))=m&8^71qgB{ursUjhmo_#mslLmze3; zA#UdF@KqCrN7K+i_sD0Xo}^$-${Ph4ooNitLDnK_$G$2JTXK@`20Qo@hac;SUuH7=UPz z?dpyClNmESf1oCV(Bf-g~rsCN!RC#9v*HiNulFqIXg1<^8E{mLG2{*9#Fe=RM9`5{roJN2PSXeno zFu!2L{fc_-Vc?iqwj)8i)m|(S9&H!i^!)Kr!VKW4t?%i-8WAXJ7rxV#;~_{3eI}AL z#*UsE<7x{x7mgKY57HdoufNu6Aos0I1E~pe*Bnd@2`}HOEBTt?x_$f%{E{2&)WE9Ip)M{O5;gLeA75)qrYR6 zQvDmm6XEofw&hddMEq`hzfxIo&;a6EiSV>&x%YR4OlSW$cDCww7UzE90o{*rvqbaDcdS~bTt{6=_H3Na7m&?V~~{%($cn!?T$vLm=n<@P@c z{nRVH1^Dl1>h8DMVMWD_qk%J4hBz#nEcJfRnfHg4sP+qiB zFYNG;E4?!BHopQg@H1_Y&W*8dJ;#QZ?}(=Cr-}mu}iW_ z!Ui$CUOL_d50(l}J&g|fW2UGo_z=QFt6!W%l;nHF`9L}UA7>NC<0J+vZEMuI5*1|9 z^<#es!NP%We5*S1lrQmGkkqg)>sjM~b;imEVLT{FcSKop%SW+ZcWgXMJVe>NozvTP zTI;UGzF0x0Xt8=FmLx>Kz+UHgJXKuBm;3sIn-ZrhWyiL8fH;zW`N{T`$fcuRHIG0o z;i+AJ>5d;c)Z$CYE5SKV!L(s1JLVolf1u1JZB~eJyP>9q-15FLQlGt-7g#6tH){=_psvGMz~@okI_-u7v!qh=)0z zhX;u=s$6RXR*e73fvh1;$^7eOe&yrYQ9NIYT%+T}jLRUdXzp5nL2uHP{W7O*r(!e3 zj;9R^@nMDdzqCl@jP52OEA2`3<=|h2_KYe{WXQ4BjrSt}MDIp-;uFg&9N(Gco<>o3 zw>=dimvM!#oMo{i{B|{;@|ejz!pTL&Ev)>WkudhRv{&oZUA)MqGCq&$ccXXg?(TWk z#OV|8`B&vz1pN-mUAl5^kgS_g{qLkNK1FcsS9iA3!P9gWN?G^p5aE{F{S{ODO~a$2 ziOz!WXKEEYPaRO6TZd=$hW*Dt=+#V_x#33z^+JB-)S|ca8=FgE^9xJV_w%sl?8%0F zZN>fCmo~i5(D3HT2a!&p^6m{q!vgM(1e`-Vie^EuJlyHq#jU{C&n0vZGV3v@QDnG7 zAdcL#JT4kK`_p6-{7%ZOO;i%QK;5JagIyAqH z_${y7cpVIEH0Iy2)c88v@%#gngIV*j+jdoz|16a_r)MWc$ip78k>YdrgLJkBO?|ae z6|$~NN*`EF)K%A{>oFKvzeP)h8?5WxnR=MelPf3*>+?!b~R&{y;9(wW7`}+tLxHO{Jvz@5JacIv8k_bI`sE zqCIN%iTEpd3i$Wv%e&rGb_yB2QsaFw4VtlvR8I;IUHfxqQTn;UR7)=BE1n7nSiI#1 z!KtB0JsHr#z+?_DyEX~By>|{nLrZ%~fO#%)P2cl)T;ErZAxIMVst_-0F9CK<04Y*IC}5Am}Fh)#<@R zxK}sFL?uU7*kP(~J014?rGi6-`Jr%WcN{XNS(iMRFbbQ?1&D-)M~9sRtkv|G*S6d= zH7F9l8=8MEwWMfSs;^+;l=E&mAiMtU84$4l^Zo$3z-h?uoe1;aDqf0rDXfs7O_Nz% z`*N%~JGKIUc3Z!|m`X8MgJlvasyFBp`uaM4vR**QiBOY18H~00W!_;`4;F50Pk<+- ze&_OGB3dH3cQRGPvOI5!O;RrpHf3|nox+ra6c_cLM07?GtrYQ~bV&&!a0cEUQovma zm9))NYN`R@#8JB^T;Grl(^8|mG*HGe?iF&d`3(W#NAhVFYuJNdE&nC^>C_2qSF(y+ zeEd&B>-8N?oQ@AINJy)4f--);TjkRquTale+ zD}g1#LsyQ%fu(gK8(jzzAoD%w1_TnQ;k_?I)iUL}g})YB^o+$vTm|3Do{IARLaTvg z5|f0nYE>uS?f{4MWl_|#%hoJ{M^l|WDs;Yn~g7p1KaG?)WYV%QEnnkH7Vd(>h?mvzGiABFVyttW@Rzp+WE z9Fwfob1I$uD77{e)!9%lvwM{hnCnTk(E{hpd69Z99y!LBB7rN*b{=z`{DcGtE&i!A z=0{Z>=jnR#X;eBr2rL37^$?o;Y(O|Vx+%VqzId#$uf*VRiA8?nwue@ z-WvG~3?Y1##XHvb%IYB4+YBlG;U4+4%A$t#Tr#ns*GPV&S%s~X;3PTUCD=oh-#Jcs zbAQ;r-Y(Oy?}g$l`OxV=x@Wl|MRyo3Uw9uzb6@r@*0ICF1!3~|8V2?+Naqt!FA{Kf*;oQ*Jyky;}!Cf7700Joghic!b5>QZge|HrIUj&kXClkSJHo zSjS&CwdPnpQWO48e4d|+gC`pc53?k;sFeQ$<7?mhovV)1e~nsM28{%5Z;FOHD!mEY zfp{9h(ZPHze8^68tD{Gx0Zh*vle{cwau0A$ge`i=GgXAO{1N)^qqdK-+azno`ZB(H zLn5T!V5??TI8W5|+4&7ZX8!c@V^&i3KR8&&SMW|)C@kBH`8)h*vhUXr_)gx2i-@wVJ6UU(`w1G)DfR>p{naQ6!1XF&aIoAS~MStDwGqE2)o@i*P<2uU` z+jnUFyix~yq<=2Se9x$&wgi>_TSEt^SX{NSdEHYO;xUyRaG+0x^A+jRpDr~!;nW9`$QZhUX!ar6Q?2GQSF>*d2QpPw^xmfljvV zZ=Z1_ES~XZu*~J~N77aI|51cqHE`@eQ}>+xuH{`_ z0F3usT4e9_c2k6(25e#as%ObFR9^VK>IlN)zdaiEQJEE3{l?^RgK{Wevmn)a(r%PF z(__oibp4yH#D0gMtENI2KW(^Xo2|Nn<0tT%j>yqLDjNh zV932kb<}opd>u}&Da+W5MJ+cqUgN(u0{oK1lC5_7)jsn^J}=EQOiKP^PzJvaA~45J zp8R+7pj2YqGt7mK*^^6GB(pp{tWq#+;_^Erh$G=jkpoI7sn&|el43OXzyXD0N7Q*U zcEsiv-XLnrhNUu}*bkd$0_=FEB@a9F6n9cDB6s8NtPCqlUpIQSkB$ZLX1E=6STP~W zI_||(Gm)TG6WvS){Q;shSQRA}L~Ezn)E0rK=3sRq)ktmMY-Q+{V@ zWT5@m=uAevAK|w=xXW)n-3GGje6yBL^*H%idQ(+ki#vbESN|$4mz;W$T!@rG zgkze%@cY30)`(_NHscs8YWIZ_|4ApCrncvBgekX0=ErFkwujExPy0buzUi(Q{}oiK zQ}-VSY%OEF9rvm=S@{;T54mmn1>~MIP;-&Vz;~?_KV=^qY8f=()y77YpZ5-Do>aTX zOxQGvoW+B)jmoOq4I&r=)?ZFFxX^Zwh_$gE2Oqo7PU8J2E07Q=K87&YjHzU~%Zix~ zAG$0-z9TGol;8Vh@dV?>Jh)ksZ%lV_QeWUVv3l#VFJ70o3|zr1iT;q)@H>_S%-+8G zGb8i2tbULpeP1`Op$C~K+UTG2hssG|(^|6Hhglr6OpN(Co+K#`i8>-ksn}vzOFT~2Kz~2 z!Zt7b6Op&31B){-(9;oaH&IBjiTvQ+%6(nB?V(ZzTHwIer`Q8R z?Zuyw($ve&vS1On$fTK3={FQRtaPqaQO`n}$#H69C1#cTH56iLYWO6^knJ#<5oV*g zWzn2;(CCHziIJkS_bt`R61ZH`TP$)l&B_U1%K{poSor>L`#)g={JocO#9$NIJM{AdV=Lz#)e%;3dvVfQ zexppIn%4F3$pr4b$)BpvP`K#-*nX1Zw~~fsy}13tHr^!UD}i!`O~3(4{QVO%$vyh? z6OOCjf3vSl*8eoNGzaP9&lA=CY&=10k=1Wd=np!=;Tr&ZG0sI35NQ&({462 z9tyzuu4T}4d&`c~x4ZZI#mn^-CM!72sCR7Oo!ogp3;njGH7|cYdsEZk1;s5>)$uSp zd1Byk06J+q7vrVl$){01T=-A2zL?hQ50)nZHx1h5UpfxAeu=gH+Wy4lb%9gfl6 zGtQgBr44)$sRdL%c{%pN!(QQ)-t{8liy%K4!Pal#0DxzaHx1dYshs`W>~^@WiH>ka zRwgjcsaZl<2#9fLs6HUlwsc?rABCP2!S`ZsU;26wD`l6BO>;*X4>O^V3ilwe%yYQ8 z`>InRB@Vsr#;^pt4r7>%e;rJvxv6R(jW)UzKoos=v4s!ZfA?2rLwUUymj2oI>7iMy4GIUn@x2d#qJ?6WZRVUdx{J zHqihd{=>{UGeAQ)zcNTkU`&L>>h~D49Kmp1Fxg$vDW6!7*qtxTr7TmC0OZJlYN!0V zGS|qwl9Sn(Y2Zrm@Ri(mKx;JCA8~=Wu?lhK@YE5_l11z|o`nwIR@nI;1q@p)w$4A$ zsJPBw`K$Js?FO#EjJlvrIQOu-SDf3Iaxy-qy!j%fj`F8|VsM#X`3i2`AzP%#wu+S% z44xd4x@J{&LDmxgM6zKwvAI3iz4esbw@8X=s6Be4I4r?J^quv`-V#_@OyP>j-+#Hx zGNNs{6K3TaoG47o9tl;#977yKrpCqaHF8NbY&cwJ;CB$y; zK%@L8ofdFc)W=~oty^V>7N{UGsvtr(qEoa~KjL4}I+gQ$L?u}1DsY5?1Nbc7glwf? zOsR~w_}IMP(&O=OgUYU6od65rT<(uk`3tF`tPFf` z`gM{p-qzK{qgRstpQ%tWC=VC+AH!54S^RkSop(Ca&$Y|UhBdfIN1>C7iE)&D0fikO zIrytFMpv)CR{2Z&6VO66uTKEh%?1V^@dUkO&7CX6P0jnjlT2SaEH4lYo43Bx@a0HC zwv({XCbrqiL#?awagvaf`FsZqmeT5iPU_kv8&nBn@7Dm1oA70pg0xKsyE>UuT|bK?DGgX@i;H+u)F zsQ3R$vNOm%`pqJ(O6ZN)1n6($xoat4EmxzbD&BP$Cr8p_s z_n(<-sjmh=rXSokQ|y1yf}p!b_(4z6s^0&Co)Uk(d^J?RYzEx|@Eq$S>P z*%4z9|CggF%Gn;R97_uZ{~Ef7lx}+nTKU@$49ZYpj7~{-ho4o92Ql9CtFlhJkaNb? zw4CpMSn+*%b9vRAQ6z+E=Lhtg`koBa^R-sK5aCL0qUjDFgF)6Ug`nZZI~_z!wVZUD z(;!VJF8ILGPV|El_)5mwOWUDf_V^CIuxEbLj(kgL(xIU2%O@T}yZ;jDVZXg3uk-gN zjdgt&wpZDtLnEY;KM%+;Z1lTZxH3s=U4QGkd=zt{>@0!KyML1%c~|{~(VR#g?*meP zEA9D@2jm1*$?LYTp^(H3@~=RmNYp*Pp;JQfB@^GCYeS>OA;>6di#o>28M(!dP! z$amRe>l}DXZ=t=)z~_2uS)_b3-mq#uSTolyWRsvO+ISO-)d8_8@D;7^U?mr^*}3%Q zEQuYC>6GfP^LgYrzKqv-q<42DEdNTI=}`dd{j;LW2V7ozLOMYHHF(5z8tSNVUp%?l zJN17QO5-3pzaih~=tcEDhRZ2^I{{tBMD{biKsRyXn^#d^iox^bl(XRYp%jIQtp&Mo z>gf)r;&ObjRNIw6A>@}`I|WF3#ZIpZE|_-IT|8&li)rO=EpMs8Pi=UjKH;68ovUNm zc&ra}_bAF*kv~sq#N~*FyR)+?r=X5BZpI$d{XRb80mpQ6hiwrOT>}F@D&RWHF}e1+w29Q0E|z)q_Y=cSk16PP^|Bdh$fr7e=LreQ`#v zuVt(2rNxAGT1rVQK%Od8Sloji9SLETDkx@=yJkM|a=c!|YwIj9@6pqR)%`{*oAGHn zs>=n`^-rhao2^DY25xtP6mm(FJ|+4E3c%j{mH8-#W=>r88cx|Ov|c*7Cppp;PoH)3 zq&*5luJ(PUqx18X;)<8Si{j)9LEWDVG#S+b-TM24H?0a#4h}}pPgOnZm9C>TK)BIB zEs_|R{9*b!)z%j$ZW`rUuyCGS1As|Nhb0;`$Km^Hxm^-EpezCzt;Ye{le$lYfbWMW zJ_jV<)fOt|U2Ny+k!hYQ)ePPQFd|kw9XgC=Of6S5h8&eIgbAWS6H3|JYbaKlacS2_ zvYQhLB{}bR%sEsYnI;8v7oOQGvJTsUlQden(tV zUds9z3h3l8>U$P$LY!h#tS1q3cI+7ZN(t2I%RAm;PZ!|{g>!e}J67{SVq(g-he{j3 zHaFwjxgh}zkyQ>46}Q)}2}<$tqN8(45u~57qnGb6CkDy4p8EYYNt4EWriLl~d`lP} z>iR3rH9={6Bt2m6u&1SOgjl9C;z< zaK1H;uC15{) zF!Ie-y2LDUz02q3XNf*6C&E{MNsxUiH}cj-Wga;7WYsP0<|^DtwJE#J&5fgZt}J5*?Mp;Gw4d$L<*e zl~`3XzPqzed!F^oYj{#rW@b8)hB5v}&{OZlYaQ6fy6!R2vYu6Z1!?$$$-`HO3b$$r zdOC)?d{ux>1T=*(kzWz2*Vzbdv=tC@uTVu9k&wX4!oaMgzd`T#eejpzcu-9iIE2{; zA0H-r6$?*~)_`?ymL!HKaFh)7aF@#nueijam-VI4pL0)bb2)2!uF6!a?tDXk85lGL zicwO9_~wWjK-B`XaqN+}9TM4BeX7Nr*Tw$4JZ5SYs50_csj?LOu0FEML7kOJCZO=Y z7G)Hab4NqBVY-)){QYvDSCpNC09ok6?1BYZ*66mnZ|jqcDU@ zM!K7W8F9UhO)Pl!6t1{!=cEAT+wifG{s?DZ(p{o zzyAZnAhQu!7O9B9nJykqq>yIrypP_oo^ z%C)iKlXhHaFl>5S64&#dTr2Q`Yrl@+fD@_d^z=kC%wJ1zM%6+LiI84?eZAbh_kFY_ zwegv=*L-r51R8e*7_hDwEkzLiM4v;2|F6sASm+P1E;h8gN%ceE<XmBh0Fs>QZ^HuA%t6z0H`O0|jJWTNy5+n6x zyVr}`Nba+%wBN_o?qve+J>6m5HcS;xr9)e0;D;12#X)NMm5u)yMA|ZgLhEgcO7EcU zs_ELe{8uaf9z3tVQC@Qv6|Iyc))gT8hhtu;)iw8Fmi!PjC-?$aEm`$}F*iHTKm@zT z|3t0TJ^@PtXA1XhY=OfeQ}WLjSu%ZJcM_=WdF_zJKGKWS{m&Qge6}VNaa!D(zG54CAyI;8*3d8aq`#4NVSuG6sZ2&1=k29GWo#2vk+@dl!4`8W|qAe(wq+crL?MU zps~4EN7nlKx~_e_Z#^zMwGaF@TJz;Fs9XRD3J+)g%nODYxB z{hYH^M{lk|Qz@0lHK0b|z{f`IcD3bP57M)4t7{rwa*u;3Eqjm^-zAx>N);2--5RaZ zoN3!IDDolWw^pXqivq0GOq(T~1Ez$+P%mda8C`9+A|-ySRG`gxsn&E6{t5U%oGa6- zD-(BeSGJJty(-P9@rN!NnZFH6!n-PYp9@*KFd>NT+?0CU$Nc=A&7qIm+!fV+YG#jy z{#hS!;wKkn@IJm62;yk}r1ZP%WH@B>+I?(Qb#A>@@D$tie=mm@3T2JKaj8_{bnd|i zH?4Q?snC$87j1u7Z%@LaoytMM_fBl*HPVKi6kT?>IE74@7WO$?Zy_ zO~S-om5Z`|!AV%iBj3&njtL&IW**oZojIpQ>u8^=nKQ}GE>c^UcV?EuL=o46Wi}lZ zv=~JMzB5AEa-lz%+6-8g(jdWyhg|_`J~v zGcucexA(2l$?CDH05$tFGrQHMhg$)yA$9If61Opzae6Sv&e1~Yg-slNR1m03^V%l7 z!rVB$LX7OK+8c?N^3^>O@OaoWLC<*A6Q4ZgnX@&fmujK#0C$_TYdb*x* zmoc^%ccq>u?cE@!L#UM4<8%%W0usJpisi9<-A2dv*xC2Nks~e;DO1AYSA9zn##0Nx zN@0+a>#tO1A6X^tnhB+Sb>S+4bf`tIQ9U!^(o^%2QxEc2E4;!#A0-Rl$=o-W9d~W} z);y1I@HpcsiWnMz$B*nj)!zTMFy8!TUEdrhYpHoz_Mk8BZHxg!uhBEwI>rZ)oZA;G zrW(?BwLp>Qd{uI^;j;M+qeJ@}`jom6J3pGUl4%WYarMQQOHozJIwORPDD=jTcSVk( zSZs53s%zRKiJ$h_7g29KyW12RjI@Q?PJ|!sYgXt0oHotj7nnABYJQFNZ6^N*r>HoU z*l%`~8Dsd6aA1=YewOL+%goRe{zNnN?EIcNow(=w^F*Y2k_fVUU$&y+`2@alxIG9E z-i{ePKbEd9NH$pYI|W`;Sk6>d>b&8p^=A(hB8fI!<=kf#jF7Wm6$zeSuTM2MDl0gV zHP?!tCRpd3L^sB#Q1Zd+t_Gh&nD+lt&!x%#6Jpm&+0XtT1z)z}Iv*@LoASP0(v{F* zGCNb~7e3G31cU8BsT8@;TD1%-;5edpyDgs(k5%5!i6Go=`7Z{hWvQ~O&?)m8zmZ2u z_6F)ZAV;v@bd`;`iG77|?u_*G`Vi;sCy#KLxLA*Y*3nmj7f8c5c{}Rs_;}IK`$6ju zD*Ppfa>iL!5!YjDG^)x_=>#FF0`(mb!^Pzbr_Mnvl83L93g5MSx)lm>;#vZJ`2}A4(iY%nIR;CYZ^n8+i z2f-@&v7l)DKLCPyWIHOE*Bda<<}m`!cF%GjB*6fb-t zO8rwPov`Otnrnj|sUr0U;uB+o>1fnDL9yGK-A(P0*)s2OieoJgY#5ibCD@*}m)R!6lUMrD`=7mE zvQC|ZHW*xVXX}~Y6EAc5?r+wj^0cSv>QnI@cIrv>zA-M(^|Pb`*bbyqt`RjZKg!R) zoK|RW?x=h61SJBwXqID5VsDjo<6bQj8m*>LKKo$?;NwQYbexu;ab@`|pP@8uT{7g? z7#@>#oInHaES}1;i4=Cp_M0|zTEcIOTCZFOXcztUzlk;UN|tziJEghG z|s!_Gu48XzVj=aAm2 z+#?!^37XWd31lpX*$_)MKSW0wr|z7uBv}N_8XwXlai@;X_SX3@m>8QuIl8GFn9(x) zgJPA`GF6&R&3v6bL|V^piBt#_fbQFxe^%{VY~|^(Y%!&pvGA4P!)yK_+sXhzr{CA< zr|j6hy@#HQ(wHvQUOu9anG#r{XuG%hiruZ-#Mp}a`LNJaLZ^(`dyu`kQ{2hD>ly~U z%Q7OeqwAU^i}p6Z`zZ8^t%^dFHL@fL;oGb}q^;EQR50J#7#8g3bwu3ZBoC-Hh1-5f zuhXVW-he=-o+6}&--F>#ta#XUx4#?q%AUUSZuA1Hpt;f%t9{cQm+m=>S3gk@j?~DB z91mxpIN1ci8OF>C=}GL>pO27%-vZxR!Ee+Pfr_vnBlTtMypm+Sy{)+T-caJpk|EyN zk9}P?^rW&etp*5ti1FK=q}KqB!9~@jYb-Gf6yPD=o@YMtxY|g^*Lpc&#p=D7fLO)S zZS{D#K7ex zMwxOrk4b;v!Ij^e7kJSAvx9Q!N85_z|nQ6YHMV9J40-y+$8?@j8{|Q|e$tDZr zPs>2RiWgIH9B-&!ijS1i9Z0zIpxy}QtvIcmM3#O}1fUp&Te+C#EI;Psg* zDflOXuK1;mfk+_8N%$fyP)k7l9#K^2j`r;8;uEybu5scAxT)gV&oQ`E+&RNN`|2CX zcVap+%5-}+-ua6>s9`wI2e?yAt1`##6AOOuN^ePt#}TACrwF9Nq@xDOCI`Kc!Bszd zX{1yz9z=@;TBF@kJGy;DoeYh@A%!&)g|+acQ~RpG5%vomak8*$fuXyFN0x!7MNRV= z*$$Q9tFc z`5Y|SR=T1T4sXK)?97QILywu}$)A2e`lZIpHTN!(|KvB9x=oHz*IpRdOh-WL@(KN! z0yUv}LZ_VvUJ{W-@a9B6>bNCDTJia{6sX0Ra5iR#_rJ*u4~L}j=mw%ZIEU8y3{w=V@Be!H)-UVbiQL<+>F_H90Hzo0^~5|xl5S0q z<5C*aO3SzUVO2!}hbF7VkSaX?NMOPWt$N#+b@EoJ-Dtcq85kSh$AX0_eSs zI`DiA*W7_yaN{?8QdMr5NeLVvtQah%IA7RtSXG~)qf!}%UcM<1UF-gx2O-XFf3vXH zeQY{dH@q0NY}Mu-!WqEKF~8S@wx#$-TY-6D(`4rJ8c)$;ev7QRv&^YW=m~-Am$%2{ z6+YTYk1?qy7@s8Figa=tbuhDnjt3Pw?(8|eD4m;|-U0vXMU3_R)GwS^WnpC+_Uk~o zj}9dm1xHui+Ht4s%hP}@a=Q2v9unR@d3GtB{ko+ry`^&?{tc1>uGq1wCH$j__!|M} zd$Ori6AjuT`V3_BjW~CS2eI4kxMaQ~HsYQoX6|bzjyaWPP-~{72MOxD@gX{^GAhGV zsv53H8|kj)@Mmjd)!_$lcFgbF$27_6e<4?NwHtmwPqQQQ?^yEPdAKlD@qut& zp!-x{*){$*NZ}#V%}apvIlR9a-`s}Vj8Eb3&;9F0uZtz|uX&2D1^hA)WjzY(Nxe#^ zG2ql(p|$Eg-4W^Ls_!7y_L}p)(<|>Y@4f%ejJ0`!Rw>m2Cq6mSMXu-HQTem%w{aHf zzp7z$m0jt+b$-nz@DgUAQa&7-*f?c&pGUdgK-V^Pr8Melw%#t5@&!=O9UA#AKJ=;^pknk?R(zU7$yX2~UMxbg!g>fIq#U0xNcYS;8}e^} z(hASz>yWQgQpOr?bZnl;HUhUTfAxy9E#t^dbKmGNCWu6cjn_@`ux{#N05} z{O}D&y|!6F1~5MY%(9|x-y_#uJ{gGeC{<{Ok;lN9oReHp9m1K5XykJ6cj3eav94s> eqvO!Rn{1J;6sep(*n%del0}CwUy$klmj4fGKZ{8K literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/refresh-code.jpg b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/refresh-code.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8af7a04c2465d741f0d00ee68389b4bff9393957 GIT binary patch literal 128150 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≷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%0A7F}I3PPa3_45o@M}z~RXuPr}@-uEziT@xL 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/splash.png b/script.plexmod/resources/skins/Main/media/script.plex/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a2a53ac5f5bca42c13de3624a4c304311e9bee GIT binary patch literal 9464 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 R2a<@0^t6mL8`T|O{STLR)H(nF literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/square-rounded-shadow.png b/script.plexmod/resources/skins/Main/media/script.plex/square-rounded-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..e22480fdece3ae6c6548e3d029ececfb3557aea3 GIT binary patch literal 3941 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/stars/0.png b/script.plexmod/resources/skins/Main/media/script.plex/stars/0.png new file mode 100644 index 0000000000000000000000000000000000000000..fd047749a82a6602debc15f3dde6b9beb6d3872f GIT binary patch literal 679 zcmV;Y0$BZtP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00Iw5L_t(&-tE{wXjDNE$MN4B z2`X9`#J^~xrHvL53lS@um`1P>F(7vS!9uhU!BT63+FDrHNgz!S3&BTm!CY*$Sqysh;bU95dv(x~bi;ccPU zO<~-YG*V+C;g#S4e}Kgrx4!Ul_kauh8|P|BBD@kj;I&(Ls)j_u%iRNZ17F?3zk#7m zOd`AtyiS_WgOZL(T9))((x9ZXn^@rCW#A0}S0o*Eg<|e%N;;K(pOiEw>87N6z_29T z)l7Gjv|wiA>r`(;(&g~-_XO+$CfInK2F`cz+$6B0&DIuP0iHQvRMLbqrzO2lThFSQ z-AWbuJXP1Kq!W_PxH%Uky)iR7`1XZYiU$kQm)4-t~8l&(^@qlf> z12^d%u-C;0fVVFG2-w+2*Bo9+9&jm5oC6NDnjK&e_?BY#D?C<(myy@l;Fu#xGiEjq zJeBm!%vL0|{vX+I7s~{bwGq&n>i+?mvJT*Vwei z;R=!nuLKWxyyk5C%Eex;i9M_!k?>0JfY~(Z7jR>p_!zK|p7~ipBH`uk0VjcF;B&ie zCY_l-q{WB(NFuxvJm5O;qKg+92cGniNO&c9z@8pnW_YP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00JaQL_t(&-tE^vXcR#d$MN4g z5>&KE5dTCJL`xejA{HW6HkwAT5m693|6n0nh+wI;L2WH8>?DvTh=pJ)hS(@5S{MQn z!9p-x+^@|9hvm5J?QLdv;SDUi?Ci~FAH03{Mk+V}12!wsaIapkGr-!1Buy#ZaIZ#h zki@tl>2$(C+-rje`~`j`EPd`Z-2=|>f1FGZgnMo9fEUria|r@*ujw8z27HMY{sW9} zU=U-#C->_0iZq`SlJN6C0S|6Os-}T9NeCy?VS6;DV$BQKDFMWRi}C>o}2a z1Cx@7jx3x_(z2ON_sHIkr1J&5j-**hi;}Lnm);Yw4Va<2F$-+zQ`(Ap$ADAr)#F(N zOi7vWz%3wi zuVxR}87-8B^EY52cMo811wq8#?;c*)y#{!|gIr~J9?d<=&E2aY5ck^P0pG)qegao} z%wGbQ!!tiB2*kand%zK31^Cdf%!EDj+pzfL5J9-t1`oIbJRRUgrh$h;1ma#BJYai? im)Qka$w1s|p!W})8x57wu);wA0000e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00JXPL_t(&-tE^vXcR#d$MN4g z5>&J>h<{NKEp4=jScq8JXd1yrL_zHQgN0}zf~D35wM}7RCxJ9UECgFI#705U!Vr)X zECj>F{aR$i@w{Aa?>0NT};a*y=kt6p3Nnboy$wlcE9f;OO-Y)Qbj3Y21#AK)DK4gf4PBd%y_rx{pyi1MKQ!VU*Hq z0T;Vmd)~c&Z&(N1&he7&0viWdHK+Do09&K>A>g@t%L8Y6cuBVk+*YOX=71f47IVNb z@L{ccjTN>zE5)9Iw^b>;Su>jl9!Pp9%67iFX}%7a8-w4Ip#x z|D@ZZL|OR#49vFu2e7+e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00JRNL_t(&-tE^vNL67N$MN5D zQ7mdmq(4SM)aasv(Gb$qqAo#8M1i#RhlbEW1jm|_YHet63&BOiL2#ACmV%;&L=c09 zAh~wF4ZY&a<#Iju-sAB-ocDplIo$W$_j8`Z`#$G=rIY~}a7;Nx^p4i6G|_jTq*3J; z(K|w~nSt>{(r}K6M6U=Q@E7=%W9f@t=pHb_e%#0*iRcx<17^LB7jj4>dZBy3Dd4Nu z@gJc35R)i__c?Sg&Em6H(j|ADNa~a{bch4I4BizU98jC0+Igig`yO>8iW- z2hun&C<*UK+}R{;o7qgA(OZ#pCwi(#nwPX8=~0NDfRn%+*~L6?yg_M;-v77;+ziz- z4;Ym+*JjzeCF#AHk>cA|Hg8SRvMc4gX7?n>&HbUio^=mu6>m_=*A`4$#N zW%8=PSc7}-1?>S{z+@9IZ5lYy#;Un&-V$)yYwrLS3*!N|Q@pf^47XKf@iu^Sdy7Y) z6ZjIES2>pcZNdB!I23`m0a zfHPi4i93G>)@yzPxR5~-W%7R4@v4RJfaf(c=bhK~wx(?=gG8cN1P}P({`3=gSf~9y zuI${>;Gh3)|Zzz*=SQJHaj<`viZU>iw9uLvIS0C>~HgUkRg+DIgNMeu;079Qp- fU@ayRy#T#`aS}nLd3CgV00000NkvXXu0mjf0~$Kd literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/stars/4.png b/script.plexmod/resources/skins/Main/media/script.plex/stars/4.png new file mode 100644 index 0000000000000000000000000000000000000000..b90e683bbef0ab0ac336f948df036a93bbc99c48 GIT binary patch literal 686 zcmV;f0#W^mP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00I_CL_t(&-tE{uXcR#h#_?y4 z1Qjh3M5AIrw6wB_Sc#QQOp(GSh(buGh(*vs1WRo-_)%Jx?JJ_H!r<+PST#FZ?WDGa6{7BV4%3*$Ru6#*Wp0A z4@^iRI5K~Bl6IYQ3vEVkL(+_Sm3s|I%aXPv-HGu8908U{SIfYm4pWY$m2aE!11p<5oP8C=fnOC0I1ZF!tdoz~@ z8~`5X2=N#=+{3EbymGyFz_Flx2v{xb0oNl!JV>~$GOrwO3pf#cN``?i-MmJZZBDlu zPrR)%FTJyn*oU0h@ub4a@^sZVxyfbd>q?cVMIC z9>D1YA~6EhBj`XnWJr_9#IR^XlLMKm3n=0=L_=-vW01Gdl@_m^bJi zZ~@o@K6RRA{GR!P?|h<%5a!jv1LlBNIbLJ|c-lh{^XlLMM+>~nSnOZ7=GDXd2jXj+ Uido|yr~m)}07*qoM6N<$f(OJZ)Bpeg literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/stars/5.png b/script.plexmod/resources/skins/Main/media/script.plex/stars/5.png new file mode 100644 index 0000000000000000000000000000000000000000..ab646cf5cea02915ed4c50279c06fb40483c231a GIT binary patch literal 568 zcmV-80>}M{P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00E#$L_t(&-tE{iNW(xB#_=yj zQPII7D2jr(Iyux)+_i&)iwG`mf};*1IO^WP)xp74aB+7PMQ6dmNh-MMVE!%#9;LKN zo2EH=4?;q(dA~e(T<#(z3?KrAl~b74U$2xR_oAe#@(c6&=%s0leMxIM7Ghoq9`FNv z<~a44S9A|p=Py=sD8jrDJmAVpe49fd<`vxo#(@_v@fT3;VG-sPz)Q0DoR&22u474q zl2&@y;N}&;8vwQ?EqIL*c}Fa1*b}LkUXH8LDCH%O8D+GFBA_b1NR*yd<14XSQwcXiU$ke zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{03ZNKL_t(|+U$K>mMlqb9B|Iv z|B|#cH+|fUaG1g19wSjAhwS+vXS%B@Gb8;080?Y%>wo<(#6SP}=Rebb5P^)yhyc+3 zB_bn$@t1*&h=>dXp5FlflZgELI)VDK^mp<8Mn3;?c*)<-yl-CK>+c^t|2Oe_ANqUz zPUepo_3a?!4bwA2L?p_m#(rm)zdpP^=(T|;pRj&^`#IqDVdT4g-tS%r=)aErY*D`1 zxV+5Y_gg;w@9)s>C*Eg;=dI`OrvUnzlfK(wEt~K6S)=bW%>CcxYdC*bpidwCuJ&_> zd{KMlrP*U`k^TMY_kr|x^;>%HPt(gi|L6A)&-=GLue!9Khg829^L*d$H*agft(W~b z{`_+a|MQ>uaw>ZLI;jp$h4h!m&r{zA3@K*hrOJFUg7V>^!$?r z{5?i8+lEi@#TLWipOLYipL{;-^K0@qR=FG__yTbUL?ZY1P_GZ{E1`Z~)JrY(aQyI{ zKkxnb3yXdc{EXg@iT48jcJ&2cn$HDTJ^>;k%Z0dppE-YLD&%`Ttc<_KKt5;s+Di+u zzni*VW$nmSIuu4xuh-x6c^AR&`^dLI`+bOZq4*EL-}T?`zpu?*_&}DwynDbGR(c;M z_<}~ca`zYW_n#!}rDk8^cgaDj0Q{bHqTHqV&n5NGf2Kn!<*b*=&6cRi2PzgKf2Yd( zYd|1(h0cfR-qiK~#jt@vl^m!$>X+lL=l}##`X;Pa$+m-|9AvzC7yl&c!4>C)N8+o^Sw1A11Jy>5XBd--MPE%xljzw3WLqxh$j`sY7f$m+p~Z;(xe z4K^wi`F1K=Maz<}2Nv>vs6xuS_aMdZy?`M?n2m+nUFBPWdbr~SS=uAf!%Y9e()VC5 zTd9cw3o+5bj{Upsz$X|s!=Hi%V)?%bzcBRXN3bN4Vb`YDXu} z1|w|rK)BCZ1ReO#!Tw&%zdw|DJIME1!P^<*g`uBL3iuUDDIG_~2xr%SkCdtNrU0ZM{fnSv9@a9Zi!b_quSku+lH9D}pG)e0`ptwCeEfIN zU+<^7X`T&I4v_W0KbiXwMa0Ud+lgWBfCFw*H{%|b)!%t4I>-zLZd+o$T(}F$-)H*G zuC!r4Ng-bhp_5A*ESs==~1vLP&jK1pE4Tm#mIJ>|Gmi_w z!*Wtc&})?LIl-4-eRq8=_&E@$i-#;79%wxc6E4s$N?VHFO7WfrLz(+~`TL)LE~)=< zSJSgNvd?Z1q>z6wASPU+Y|I$-y>=wFb##Yi5beuLh3<7u`h(03jPlPV z^*`-$%H$adJ}}G7|Dw&c{{HWmB?Yef+U;@d(n^P9D$}~eb6_^8YYT+G zJlGu_$P68wKOA(vRk}}%7fLy}+F<6!4D1!Ye@^I!Hg&c51bq>FSAJ!^jJcp$3cZ&V zfm{)BzdWEP=X(xjTMZyi1j1srr@#L)KRcva3z+rRX0V0MSSUf}vgM-NixSkiqpTAs z(Qm@sN^$w39D)k$PKvwdT|jumA?#j!F1=bbV5|*5oqhasN&Qc{m^LI-7wiRofI>o2 zM3-H`)whxbetd+$*Ec*ivc`q>ket;>H4Ix9LA;zEU|*Q^i} z1Np7;d@10E8G~bGJrywBePAl{r=o=qy$0ze8q8XuRTNeuH$!K(8U4Lff~b4mU8nlk-`R|+HRq1{%B@9FGG8mO#_)omMAj=mHut!78MeDVU_goP{uspdKh$#=T!#jIygo-*fZ}esfgca0+x!6w5Ud+gHXy-+ASU7!^wQa0(KS7nIjH*oebN+)ykRPiP~PuQ z-E>0ML+#6p4}1V|uf*c_d%NXZA)PVGyi8ewiRCVgg_~(-P?{YyES}x>ZytQ|I({VbTBI%OsNydlwaQ*(2Lr%6I?L zL1gWk9x*Q;lrPC&x;1zCy+svX{w2}RQ7(^q$x|tYbK$kW>&`@aKWD;T%KdxK;WB@| z$G#8$LW`inr~?b<&fG!fwVMNe`y;%;$gqb4mT%Urc*ve9?Ba8I^%O zD*Uy@siiwh#+IRf4~GH1h4z&px7y&AhSR#a&#j?AX~Ti9FixY$dMHe_TJ?MRyZP6C zPPN03%VkB?)Le)cDfpHV^)`ouroW1dQ%EgP5V>R~K?hDUjG56HfT*4$ey{;O^inP? zLSZ4DalIo?-)~ZWvwmlNJWbkM<`=LOvsP7&6Y;&T`B zGC(a|)(THt@CTmIq_aB(vBReGfd!`?gLmz%yugX?q)F)6FT0O<$z~< zGN(;bNd8vLLTx|=AgF>n4HT+l#@J+tQjxupJ$=1rAiT8EDSh^#PoTs#kl{cKY7r|TQZu1kzr}|99Q>7DJ6@Ev$D~Y<^9A2ArGA|@t*~03 zlbOQ)ebZ`U=@n5gY$FPW-#vPPIyBT>0qw)f@^I-B?vRqf~^AaAOimw%>Ebdn0AfP-IzZpV=7P_l_o0-h2|lM zZcHhgb6n(dL7}^i)BmM`I1jffBzJ}*_+oSJ5&JMqKLfZOrPlKL<9pUN}Z&d(<{RHX-3MY`WFfWk8ef4dJYUbk(@ zv2v$_g}MRdSB-Xa+W;5xdI{q+p?+|AJWZLpTL~NP;F1oq6cwGca4RY_;6Y{kWiT%t zE>4aHts1Yc3l;0bX5C5i%!QJ6Ij0WS9F}YjugvI(^|Q^o&N>;tUWiC6f~!Dx>bC-6 zSa9!WCcR!^Xr_h&G&(juyeztRqj8`pSt4FH6~2&i&LlNl<&_lt2vS+*ko=bJMPr3n ziF6S}T(t#Pm<#ZqOX@$nYof!Qhn$~sd5V|adw^#43M*|NlYoZjm5pmWuZAS6 zZx|(a&QLF7$+J2^)Bjvj|7jPL9wGNRMfu9|M?PqWA1~aj;8E5psSHYQiJW5P1Da)} zznBKV0q66FHss!1>-Sl+hplA~Is6vtXG#OG^D-HAqB>jX>#YyQE_-gL2SRNMRy%ms zw*cKT9eP}HB;o8S8OAMcGQMTH)+hAoDGHvw+z!g#%b#k5xM1)X^f z7ZY;GNs4Wm{xVRXfxgRkHg2pZB;t(>>ArYuHq5fPyg~65)&~9>5X;|KkkJC-I~0m} zF1XkBB5S92es)XfZEpAb|Ne7H{r~HoS`nRBcr^jwhuwJW%>9d*vul4zs5 zkVkDC^9+BAk?V>sLjZZP)y^hZ>ji;IG0ipbqJ_^e2<;-Qt_gK$4)2ZEE|;Fy)RC&9 zjwU}pNBr?Kx;J`7A-31@D7sDvee#nBm!EA-wZlNyVmZY2Gz{uE!}y~6iH_>XU$OIo)9#Y2KQ0qTW=-|aArTFIz{=m@EM!P0`K6L(whabTkqkQ z`abefEu*s;IqKbAVtny`F{f#U4$(D0VSZ-57{4X9;<;?zi{f`d6?gcjiU+YiPhwRO zPGej8@FM19#gbpE+YYKy%37i4TPCqq@tol!O_lzl#I!#J) zwQXv1A5;(mx2De+J)3zl`miDpbSa;RHCfRRpvhRCqvfAV>OZnyaw)AqTSW7MsOG8b zw^-T7&SlU*?0ix?oFmj$^&IPGyqbHqQwO1vWfL<0df#it(b&~l=JYP33o^G&&h!Gi zv_sMPb6B@Zfc%j)kC2IKwrm)jF?w%&w*`b_hkV5LJ;+USnF3Av)5VDfn*L3p<`E3 zG7&l=Ofu`@ik4TJ5SRk54D`@_4j2#I)UiXXU#RKT-CK=)D;r>n zX`pi)ix{8REHA;O`{9g!Df=&K{#>+ZLF6)emK^_lE*1ouY9__4HsTjdV8~93&oYAA z?aST0yN6o*+%8e%gDm;WKgbV(!pMJfS znCADXPAKnK_U|Cb0z-9rb**hfpwSds`(;uHBTcRuM)oU%Kw9@$j7D^DmN?6=s`eh? z3}1U?&Id^;Wze3K$tk)ngbk@$2aDhHS*&mSo^KTeN)PTCD-GIaMWvocLG&+M{jv&h(0v{bN@ZrG~Mm4fXOD)WgK+Cg70ahRH*(fiR32y9%Z zI~R>u{iK_3ROLFdoyWkItqjsazQYt}SgAf>| zOmOEJc_EcxTY8e?xfCPSJPE5*_D#2D)3A>&Hm<&89ocs-@dsY$(M zB9$5Eq~qu*z>hOV8X7!;g|?WiUtG8Oc(ptFKVZIJCX<|kL{wjB&kzGG{(b4YjTo_F z!OkJ|GH=D06g2Kt{<);?SJPlIbl6PA%6Bp%sgBwm`s!8VS4)@bfc*;klwFm*?^5zb zpBINN6&`7f@`V49En(poy2nZzXayq>C z8YHTGcQiQNg+0Ebg)~Mp0^Qa^h!bDAUJ8`~+TIgP67rjld#cdcK_d!nI}Jn{Vkk?) zmY?7jC-HTGw5p8bwT^1@K*@Msx7lCWT0hjp#*a8e0rkDyb`MJpnoyi*?`X5DPj^#G zd3M=y3PBsq)F_twXC^hwnRI)kIWT7!f(JU4>WV`3X8RPFOYf$|iRNWj8Fb};*Vus8 zv73(VBGI7=zP9hxC3(4S#&LU%vOTc7Gw-%kP>54EQzGStQ%;9aVRkMvq&$VY-sIiN&r9jlxNa$IvCGM;T{i~}V<;vOgRlHBpEG;7Ib{e61BtM|`X=f%2l3eK z7YqOW2^mU)?|AOk4P#T^FETDQT>F>*TvD=(H(cc&6a|AgVGs8we$q*cVgt zj+S>QrehkH9-BbyViHc)eVQz*m3RIw17v|-k~^JSZAlb!4|VMBkm>kaY@0n72?q$| zsr*}X2;P{7S36Y>ls51C(2Ym2vEsR&UKFcbo5o@XhblYN0RRQ+8s5tQP~-Ahm=xjz zFnPVK5WD=tAzq7=QbxSR-r5%=w%)C}kW>@f$U4*UpP3YZtIw%W2oP`qo?qPU1wLjb zs~76GV)bGs%w2d=*P7W=9G_30kt2}<2I@xhbKI9uBNkmm_m%bNP=o)`m(;EZ(k=>u zB^rJrgHEK00YGYN^bJzLN-t6*)3?z$-l%k^0J>CovJJvptxv0Kv_-b5dc z0UemhBfyM0u&Y6GYHxLsII`L5{Hg{aqFhTs2C|RD=;%BS59zfiC^*VFlV8Z$DTL{pL>1=$~gYeSyF?Ib}s*q zhWol`w8jqIhqe~tNer$D?tnC3?w3SPuyJMxE#uuxi@*46fA3J$l>e5JHp_mhZm#lF zvmy`~U>r2FQ53WgZ>Py#ZJe=r zb27xm{x%wy1L*tpSLpuvpL8>6w#=ig$cwlVO>h=b*?s%Klcy||+13}KRS*6WWt)FA z@rGi-E`aUtXGG!}yR8?K(<>n>HZPup<6K7LJjx{@%rDhVp#%@nra(6R(W%05y}qyP7{NAP%_cXwYRqUnsrg*! zD9sDO*O_;Bi10N}^4XOvLt(2Y-Sc^5mRcg#FoS1g_P=u{Mdv3>MV&obz*XPb{i{e1 z)$sl*NMwS<4D;}CHkw{0TZL7}JS$Cw2kq_-5%c1`M^W0v0X)T1>;^~B+-owP#Q=}M zK#1=~=&lI81?YyjQ1^!4Kt1IWK4YL;E640OzUUs)O^{psw%19;_Yc%-XIaBld!E0O zmrj4u=u|dX7q-5(Sv>V6RtVn1od5Mbfi@QgH%2_?7PyeAyN70$$!f$62IU1kkOQPkGjo#l zSY$;Uhy2_%c6WHPDWW&M$|Zf@ueECcP^jHiy(IQhxChq24b1A~mh|cpgOcJlfh&iW zX6LWNJ@KB<$Ri$Fp1${ZJINFyf^5|N2j%#0%0%)we+12Y`AXI`z!7VA_ZMq3q^7J6KqjxT{9_MYbRJWd{N#&)!O z>T{po0kcCiGc0W?kU5mX7=X&bm;1f6q6TvK;>__Uckfa;wRn5|kXjkf$5SzBkfdh1 z!$ju$E#zv?^6JHx3@0Izl7~HH{OFZQaU93 zV6DT^6zmZO=g{qpC*hon@gXVNQA}keSvs|TgY{DRprz9J3wl0G6ljm4;;+SlyAXD@ zS)Xr`)tabI5=asPM)b28$952JhqnTjDIUJovArgyX;P-mqmvm*s zMX*i;p*m|sFKAtVbfb@>&wXlQZvACq0A^6<4`WA`=KEYPGL$k#z&HZHZKNW(Q5otG zv-agms0kuJfKC6NmlXO?ScmgCRr;xinvWc>izl6Mc8N>%hlNP_IAY$N(M>X)#gAIK zjOnT5w7#e!?G=5#pXshmHT2Rlpsj~$%KKWO(cdU`DYwuoNLS+uk`49fhQ6gBgO$n! z(&-F9nJ9_ldYxU($Lw2WS12%7Xb(B2rnowYm7GTh#a5rsxU$2q^WY`o-ziUuE12Xe=VC?Um?cZ1BX;*9 zaFnvomO?5Rq@v!t4YIic{Bp1XcEUpXa?sYmneq%4!pJpoU-<2l_0CnDENFI+BG!Fr zt$E1V(v&#agxlPronU+!<~2c=gBrrag}RLCAViQp3{d^tPHWwsX!-4O z0#Ob4z=O=}gAZ+vP`RLz31-T@@fSjlkY7|sb$+*TBtq!tRyLkq9?ylCxQlL4NDz>0 zFnX_oz@Q`$BJQczZ=`xX#`!Y<03ZNKL_t(`L2r|0l+QJzG0a66;-QH z&1)FTrFYn!=>B7=xm0a>^Y@s|eaRhmpyc1R6~L_1MIrY081Ckx&h7~-oV63WUCk6) z>4yAuZ6g|q;BN=d&gnYqz+ei98pYCPDEzzi@~CXeV~8Nlqu8t?lSwb{p2hO!uanDt znK8aZ4wVvSj~8LLmY97R%i7qf07|Y>pS>c2I6R{*tW6edCmML#N=2eUhC?$sr1li?8B@;IRwAJRk?iT2dMR6z4iog4R8G5e)Ji zD5HxM-^=7VFbo6htCdSCzMj*N6UG=*qP{=eN&ONm6yAVTvf>4oH-)|t(~4vE(pi)2 z!*)Pl=37k`@WO~G5M*au>L4HYozmwZZO-$K;J5YDwFqKI_-5!EJx#SzyR#1eub#z~ zZ5fhbrnX9G%tU;McCQy;g@_4RiHNm8S!MMjUuP*Qc1L*YE~31#F7P@hYocc~W8EgM zrSxpf)cSVpBK(j_iaMq`Plsmv7zl6a^}v|fZyPOaM?AmX`AEgibg7ACIYOV@UMo566#ATy-L?70a1(Rr?8bDqwX zL%X38$--=JT+cZAj$en37LWRNJ{yiT-T#3)j?Bi@XCJ_{nkixM*p5j>#Y^Nu{S5f8 z&`D{<_+}|(51ShYgt`XUJ|)d9=h-kC#0L+j*uN*{u0h-u>%~Pr(!kL(Vb-qHYO^%V zYrW#tihZ9I;Twd~LvOok%O^@X=Se5f6T|3KJRrbRu=w2~9UU%Ch)^s-5MlWpN>brrP7C zYcdy&-i6h}eYqIT_1)xGU=9Dlj=XMlR_KV_Al#VMyYVaAQJ3OF1539 z`Vic{MP@KbghCwvqg+gI@MTN*mFTPcLm?NHX&z3OSDa-M93Rk z{x7lBLXn--=yl|0BpAr>?p8+j?tT>%jU1T`V(e3>xJbHUE*%(!Q$F*7rB z3+y-Q+3Ng-4FkHBREO1TO7LCY;R-Q$!UbgW^~+chD}R|ZnHMcp3}gU4KVtm=JsrbvRYKI!RP*A322>ieSzVe))8?J*yxJtGHN zH64H}B7{cV`PUO3(A_}V{A|%&zCv3^;s_O8DRVfZsmpGXnx|5g{5tu$Wts1Ep+5M+ zx$1(X8#e_FbnnZ2_B5_fxIGYJ9{cOigJ>uhmyfX8QG)SF$h|oMiel+Y{Q3WJE9t}0 zPUsxk<}B}-siuOw3iW8Rt6nhkrHB^brLeNkKsg9-aW(-Uz6@5+cUo$nRJOz+v&mI+ zt&4<@xzOjdl&*cij+#B$lUS;P6PiSWBrUjg)9+i^F$gvJmxBLd!?dXi~-UNNeVv9n;dG84~8Gz@#5XySE6P`7sTQUHL@aGJbJx+Ydx3|N8Qm+f4~Q7 z#B5e;i^7?hva{R#T&$BN3JWvO90gBss2Vts<4DS7_C=!uweS#0LNDCQd}0S)?Xt@PwF{E5ca=NHyhB*Mn0!w(bYXK5~-C4v~FuQvNU z{gQE`XwL$l?SM(Q?b%zfBOeU`JA2VKIaO+OH9~^fUvG3jGoZ!RZK-n`T6G19~};Tzdru1 zzPXOnuK4#3R_QP@NMm;;K%q}7A7X)?2SnVjh6Urrr0X*qc_H5O5x!f)<>8Dh&oYaQ z&Zw=0-Ptu@7cPJPgYTw_?d(Mk#H=CL6;bHZl(Y_m$-X008i*tC6Ygi61LM^B*(ix% zcU`kG0#4L;MqE>JT~ZHVV%hy`aG^U?pK2umGede=3lb%Op7?t}j&xoJIh|`lr+9Y9 z&6(!;16fna(b<1J+_7YP+1clfZMMl4L`^TjeDn}ju*qkA!xozA!*o%f6kkbn=<6D~ z_>lKe7_Lb|Zw<_|b0wHm<`YOhMWlz@V&LEVw1a}Z^RgoqFuI$>f!a;N{c3LfcqV2& zUU^zvDeCcAuDa0)a>408MKXXh@BMcB?-DP@M_t zMja_|`F~I+MG3c5!JG*K(2f6gGi*V^(c(QUj*>f%p<#UiS2Aezvum~|RK29H4ljDx zEHkSb6R+y_HfSyL1Ds1%nZZ?P4knJeT$@JVdYdssq3V*IuUrPH7s<0$3|wlV9Em|- zBiezc>|(B=4$Gcxri);aL;Tv}S`#gPGLeOLT-DwPLoq|^TxXS2<^Md7>JI{9Fy<@b zmVKPH+sJbagQ6z&e=oBKO)9}ntj?dU?sc*Ksrx#ErYUg=`co9+UAGch!_Rg*o!la! zxFCd?cRzVMi=L%=;vFG3Ph=Mo6n|F_$>$9I?8}U-#^f?zIuAoP+a0TecYvG(t3ITj zKmS)(Q=2QT4;e#j3r~k?gVIn$nguVf6?HLtz3P8Tx5B*rDmO@o z2u;tjvAja5*r368Qny&UfDabeX`m==2wkTZH`jD21XebvO%sltf7)td)m!}c-ydA% z;O!sDuqZFHvyje>*x-o{yVsqzzJcxg!Rd1@box$Bg6X2*VY*D4Qlbwf#9;P!SrnExTSJ*bprYSK#->|M}OhB|Uv%FzSo=wTbcs zbB*X7jS)FEF(XFgA*$x;#oqz%mduuS7G}(ALob3rrN^5Cb5YBDfGOJ|-wC!Uhg)ODmgsJoyStt^Dqs-4b&m-?Q;he@f-08^}=E)G2>tnJ$V z`6Xu_gj{3`!s=jBgAt7+E%q_7LTI<#{du!?1&Kkb~$sl3h1uwpkEVRGs%b1-s8a`F(gX zdDEyZSGJ_^16EH7Fpm1CGoUwuFpl&ZjgsQHcVM3;TDR2>Sh=*gyS*L01-+=VvkGt0 z8CTM%^K{@i#|3Xa#+|}$)lLU{XJuAzyd({Nr>;B0YJX_HA7SC=WTPh03Pjg<#~yp+ z59K-&D^3e9HN9UDf9_pVSu{{s;Ydf=n?mPA;FdNfT~XWom&($4mSvwc9Vyc~L`+=# zzbaK%XIroxfX;}HqGj>FvxEcq`4|lJf}8T(rQ603XqMgE4_Ese-ZU@k(>MT-KVgX* z3H_V|+gx-y^r|7abE$->NQtZRQa9&gW`QUlG#7Q)?a=xLV-TrAErdvuRfh5@4(B=K z5cQ@?(*vRz?zY^n=x+QNE{&8q20wq8XpVB3FV3v1PS@8P!$eup=bZ`^9@5tGi$RRQc_(VYxjIf;apka zAQEjl4HykTkiE?7rX-QQCBd$o>KY-Hr19(H!EuR&$n9ReHv`&x|JzwHef+OZ zB@M%GK4_uE!8^YZf`{>b^qa6B_?dD{nF3;cltoMq_bkOguimxLQ}*eF1i>V%!D*v) z&fgPz2@+o0QYg1od(@0PwvjszgJ9T$J*cqI$x{g(xaq73Cg$#;`>>=*ueh;*wex$< zgiM{!m33Q2Cnv0F-x1x&IMFX}&`jz<#!k>G=W%J5tS%jKf;J)EeP}I6Smx0T>6PIZ zI{Z+rd)xyA8k@o&>Ll&yHbo(oKQ}c)1{9_(WU8`c)7pSWuUEb2*0`=$A;k=1A%EU2L_xuUHGl@F781z{cl5|#t z%~ifTk!z6X5k?R8yh#)27`N2)at8hBiIB<9^hQ`pW(=hPre3IF5m?1O?U{{nW

    * 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 K=T`3$mi=Ec5D>%w literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/movie.png b/script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/movie.png new file mode 100644 index 0000000000000000000000000000000000000000..e847163b8c4cde650ea6c6891c0d334e4bb5f8b7 GIT binary patch literal 13306 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 Eg1MC)mjD0& literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/movie16x9.png b/script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/movie16x9.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2c92942de28bcc5b07416cd41cf0ad261d9f7e GIT binary patch literal 17652 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 npw$Pw)T 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 JQzHcp`5!_vYB&G@ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/photo.png b/script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/photo.png new file mode 100644 index 0000000000000000000000000000000000000000..ecaff1e927fb657a30995f1fa932208ceddde4bd GIT binary patch literal 16984 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 U=lNd!TL1t607*qoM6N<$g30+WhX4Qo literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/show.png b/script.plexmod/resources/skins/Main/media/script.plex/thumb_fallbacks/show.png new file mode 100644 index 0000000000000000000000000000000000000000..b4eecad88ef726bfa675e9a3e98e9153d809993e GIT binary patch literal 12438 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/admin-back.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/admin-back.png new file mode 100644 index 0000000000000000000000000000000000000000..2335b53bc9144fceaeef0a7af2689b820ec23659 GIT binary patch literal 719 zcmV;=0xe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00K8jL_t(&-sPIVQW{|t#ee7P zGNdGJQrcOVl94VBJcFsM@;3Ma`XJirP->CRGPF{Xv5F_felWP=vWyJuUVjZcJFvTl zbNBmm?-g6XHj?JYhd>WF0uF$$Ko|Iwzy1VFfeG*c+yi4tzsuL!JGOhaFZ_NkZ1?sp zMz(+2o_YJs^0l=qG4s!XcgJA)-gVK2!n(j+es6Zk1o$p#TK5NO1DB40$32K5-}5m) zLoN5#3X_EG5pdIhaq7nQsLrUV8g5+yKWG-$z)6+BR26;=6-9ogtE#X}Yr?OIq88$+ z!cuQIcHEG6st$cgx0S-Ot=&BOwTUmlblJUB4#7N6wT-)SNT!lwgFVet@1E!8E0kBE znAc^`w3{T!WyelwKc}l4n*p7c3;QeSGeELU-UD?4IM&H~LsA}1&WOXAq#_i(>1LwM3H5U#w1aca-#8&DC$$uxKF@1ps;b=ZA(7B45aIFks635%y!^p&eF+W z0o+<>h@UXcCx$H+HJpoj;nSHx9G(CG002ovPDHLkV1hE# BN5KF9 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/admin-icon.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/admin-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f98f6513626063e2dd86d20cc1b5f09ef76bbedd GIT binary patch literal 954 zcmV;r14aCaP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00SaPL_t(&-tE}SiyT!H$MMfx z9IdE~M)3g}GtnrCB!Ups_=rM9F$>+eml$^;poqE=gDVwGR5T#C5E1<&e3atGWDFS4 zMdAxWe2n1WK%(YmCf2yQ14Yr((`l=_ai}l!rn;-n`Q3BwxxZ>!T3T9KT3T9KS~@c} zj3BWH+p!Bb;tL$e^78xtwXj%(tMDEkNS7Ay2A z6PV5N^7KGjF&5zwe1MPfS}ej1J>Gf^ZchujEf(SY9^>VBC&ha!7GX={6^lif#4{;D zxEZHn5uVHPvRvl&+pxF@TX8*(Efa4wp1?!t(#Et;A8Wc|t1HPZ?$7nOV3`C1?ymf9 z4esh8-UK$(;%yj2D;~#3mFadCM|!W&{T|T2V=A@D=CqQ}r=+S}UTZ^@cDy$hVZ0`4 zwqGScFHhFSYhqEynavoJWNd_$rP3>PWsH*To`iPQsS5 zZR6OU1n$8VweSB)Z8$e{uNaH)RN51rDt|hiUER83KIPD9foJe=mX`-d;qIsK#}ePI z>f!n0UApGmPE&JO!j7c`nq~oqF*_<@v-q;&4w_;PQ$2Xl!3ax%4_3y0Q~Z)9;z-}1 zkKosag&oCDqZT&PWq|a{begKedxP%48GM328xmFGaB?@J{m&y7VNDl@(bwUh<>kqd z3X4UUz?;d%H^tj{`M*@HiB=5B=uS2$Y+Vyctw>g^uqIk@0iUO_-xObKX=!O`X=!O` cX&Dgz0tKVpYTP;VrvLx|07*qoM6N<$f`y2`;s5{u literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/avatar-background.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/avatar-background.png new file mode 100644 index 0000000000000000000000000000000000000000..03926d8f23e898d832e6ea8d87ef329210c6163d GIT binary patch literal 3476 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 YuE054T{#{p{8<9roV^G&jv;CP2ZG~DegFUf literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/avatar-diffuse.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/avatar-diffuse.png new file mode 100644 index 0000000000000000000000000000000000000000..b375889ef74cf7c505c9ebbb74d654d18187ae70 GIT binary patch literal 3224 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 Q{V)KYu0Of7{zyIdU;kIMq5uE@ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/backspace.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/backspace.png new file mode 100644 index 0000000000000000000000000000000000000000..c5324296fa81e6d97f9fa2635efc3e1681428a59 GIT binary patch literal 966 zcmeAS@N?(olHy`uVBq!ia0vp^-a!1GgAGXTI;<%Kq}Y|gW!U_%O?XxI14-? ziy0XBj({-ZRBb+KpdfpRr>`sf0~Qt$K`xF!M{%H#WQl7;iF1B#Zfaf$gL6@8Vo7R> zLV0FMhJw4NZ$Nk>A5amqo~MgrNX4zU*X%Rql*%0ccz*Khn<_W9xUN3=KuJU?!VyS0 ziBH_&vZT4$Tej=cR;7g{T}!*0`INRa2b2cduy$IBxJ(FB(&}CNNM2(~+}hSBm*VuF zRaMIP1$1ii*`B<5y}G9EgUyFWzirNMpD|lbdvX0$2BwG&2?v{4xfyl9j8+CQFvE#~ z8_ZB_US*1pnI*!b(4+Q*-K_kVv=qYdQvoVgPG z`&CqZ^4vc^x9_QX#?zTw zPN|&S=bnGwA@GanwPpVwDbD}DWsdm0SfAB*TdO|IyZz}1^WU#r-(+4_EkC2JzV69e z{aKp-cbG-!7FA?L$N%Fs|5`MQ@4Vj9doTXH{dMr<+MUJTtYMMUem*%<)HgrtSbbL+FU zk@fvk(aUH3{5Sn|_POKkt1DL>?|$*8b?TLUdAT)f8W){-vhJbJJE?Q&_Bzi`xcA1y z{3^b)Z}*LJCjutkeY`i?%{;t&UgFmr&Dxab30ddwPPG+2{PXpz$`{RUVzXrLuQ5%I z)+~CkacyPg`ENX7yHnPd%@n^M-BP+()B4vL*_&opSZ7;rpTzGU-@G;M@#3p{e!l7J z;VC;9_x}sf6GGRj?%D>O^bWoqtT~Ch*U#=>ndG(Jsvq~x-rQg9J?Y6@{n@pxp=W&i zr(QfZ2be-wAjyLhl3IiyiANQZmb@WpV;VH6fKnGw8HA*g#=ri*WcR#VD$#K+WCk#M OF?hQAxvX|gW!U_%O?XxI14-? ziy0XBj({-ZRBb+KpdfpRr>`sf0~Qt$9_GG>Q`ZB9BuiW)N}Tg^b5rw57@Uhz6H8K4 z6v{J8G8EiBeFMT9`NSC*n1wuD978H@y}hTWzoYSYr)%@kPulL<8;rFY(`~9(H-27dy zs$$;1F0PGYV`Hmx`@brTWkbTjCRT1SrU(dwQ3uRuWe@{1oEW&l48;bZ8lZ^40gz&y z2o8uY9V%--nBNzwH$8a$_2AW4_x-uIG)VJnl`Rkz7Z=}`&d$lvnd+tLSyWJvu*q)K z{{8k>vrJo^6wAxYEiEk@zxs=IAH9;bwWO>}&9kh${PUkbJg?vP_V=gf=j+GD#(GZb z?(UY6ldId!yKn7G^Zfk$^RHfIiHVC}zV+*Qb!AP>nOnDRZT};^&9rz{-Jc&5=gph9 zKPEmt{`}jwx@(*kPB?k;oa*IUy}ef|EG{3bRwf1av;UzV_U z&z>hQUTC5`}_MI&bn1zTvj%1=FFKu z5ANB!SJg8rDr(c-y?@{FzYLi5Jg`{5W~ilEsUaqoboY*v;Owbm`JN z_wTEFy1Ba>TU&F#UaY6Dzj?!k32uugszgRcdPYY}uj${lbEoIhpp&m(XIE8M8=IQ4 zzTSN9{Q2OuVUtxpfBt-*YjtWu!h`fL)qcQuhs6E{7D%e#1gDLILXb403Q0oVkc2c1 knnJ*-i&`50ssCkUjhrwouG7B=n1vWTUHx3vIVCg!0Li$B;{X5v literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/item-background-bottom.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/item-background-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..f39ea934a3a1b70ac03d6d8b2f4eaface8b47c2e GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!y*b!`)^mS!_z``VE#THmm{TwJHS>hT|;+&tGo0?a`;9QiN zSdyBeP@Y+mq2TW68xY>eCl0ia*VDx@q~g}wYleb{9e7+WUfp_7*g#RhOs#;$M|tnZ z9br=K4qErmRL{Mo`)|dr-OL*r5}6z}FtBh7=r9~)63_v&fdq&RBv`nKlq6aqUMp~$ z((u2jbQWX80n14;Wej2kJt~*^4lq4ivC8&j8ux=^+g9CrU0(WK`=s?r7nc6VXmW?*4pOZeH|4iw=m z@Q5sCVBk9f!i-b3`J{n@>?NMQuIvw3n8ZvB%iTVw0fi(>Tq8=H^K)}k^GX<;i&7Iy zQd1PlGfOfQ+&z5*!W;R-85o!?JY5_^DsH{K;aKS8DB^Ol?xq`mbq))oA%l?+GY5mD z0@t;(&#DtvSh+jt=k1+&a@kw|N%vKDtK4U-*k3*A^O=~*Dcd6cs#@M+i@5Ut%$&5{ zYxKS`h?URSwq2zy<`vEf=gQu&X%Q~loCIGNp>W2UT literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/item-background.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/item-background.png new file mode 100644 index 0000000000000000000000000000000000000000..82f2aa60596ed94f3198a04798ee4a3e4af5d666 GIT binary patch literal 1022 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4mO}jWo=(6kYY>nc6VXmW?*4pOZeH|4iw=m z@Q5sCVBk9f!i-b3`J{n@>?NMQuIvw3m_(FyQyu+85eUCdVd4T&!vI}&a8=cCYu$^E~J2$M~cEyoz_|TF;>BHTx#j++vfs z5)=CUR(=?NHAD0774QD}6>VfS`1N_iuHWka)--&~y?Qs7{Q-xXFhdioLPSFXBZnA} z0I`7rU^a&sm`#i%(F*ZeF=`6-pdUuz!ZD4L;UJTMj>8597H%K`Vgm^Z(E_+h+q~b}FYa1AC fChPn@s+IqzSf}{y>W-PfY{}s1>gTe~DWM4f;;;)k literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/plex.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/plex.png new file mode 100644 index 0000000000000000000000000000000000000000..2fbd92adff07dca33b6b5297f372c44fe9443850 GIT binary patch literal 5374 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/protected-back.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/protected-back.png new file mode 100644 index 0000000000000000000000000000000000000000..a318164bd4bbbe11f559ee2affac9afdb3816509 GIT binary patch literal 719 zcmV;=0xe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00K8jL_t(&-sPIVQW{|t#ee7P zGNdGJQrcOVl94VBJcFsM@;3Ma`XJirP->CRGPF{Xv5F_felWP=vWyJuUVjZcJFvTl zbNBmm?-g6XHj?JYhd>WF0uF$$Ko|Iwzy1VFfeG*c+yi4tzsuL!JGOhaFZ_NkZ1?sp zMz(+2o_YJs^0l=qG4s!XcgJA)-gVK2!n(j+es6Zk1o$p#TK5NO1DB40$32K5-}5m) zLoN5#3X_EG5pdIhaq7nQsLrUV8g5+yKWG-$z)6+BR26;=6-9ogtE#X}Yr?OIq88$+ z!cuQIcHEG6st$cgx0S-Ot=&BOwTUmlblJUB4#7N6wT-)SNT!lwgFVet@1E!8E0kBE znAc^`w3{T!WyelwKc}l4n*p7c3;QeSGeELU-UD?4IM&H~LsA}1&WOXAq#_i(>1LwM3H5U#w1aca-#8&DC$$uxKF@1ps;b=ZA(7B45aIFks635%y!^p&eF+W z0o+<>h@UXcCx$H+HJpoj;nSHx9G(CG002ovPDHLkV1n{Q BN2dS) literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/user_select/protected-icon.png b/script.plexmod/resources/skins/Main/media/script.plex/user_select/protected-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d6188176d3d96d295a6549a695a5a4eed8c082c6 GIT binary patch literal 688 zcmV;h0#E&kP)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00J0EL_t(&-tF1FYZOrw#^EP1 zCh;3df&oPkMI#6nL9tO3v=|Eo3q@}sR*EPFOlc=rXdzfwiQV`g=oEsY)+vNQK+#S? zQ2aoYXv|tT3q#n1d`vdG>;1trvwP2-mwV28?wuhLi9{liNF)-eOl&tdpCJiwhaNyo|()?QMaOSp+W^N6_?=W!!s zVQ0e#3t32T6+H{goa4A0vd~qAu#N?a>c$ytp7PTxyv);Vx_LL@0G1cToyNobS~_9a zmK#N}R$t>Hp5f07E3^jJ^3|@6Ux$Ms3y;zytt_RmeypEzZwxQeB%PRHTm@f479Qt@ zv$`O7d+w&=OIc%`HDdhC?R++TukqjRGTgc>S8TWz)QG}FVgIABdF6A+!ftHEUJRkw zRG;H6e$OJ*E)3_^Uu6Wh@d;1TB>h!SyC25Mf-@G`k9~7=)*^$rj~_UJr}Y%pTjPO> zS)5JEBRis=~rwNx6&l7ig_Ed(2MI> z*32vR1@EWadxwc;PsIToE%d*h{Fu|#?85pm6tYk~h@QgPR@qW*EX=b($#2GDA6o=g z;z-ECo4n>)Mp$3Ishupm0%!?guqvL%qOiqD#Zl~7Wb6Lu--nAxBoc{4B9Ta>RQ>{t WOJqz^qWp^h0000148Tn*JgfQ_x$`ZwSG|n1tumJhXxJ~ z0Y*k8+Ot1>P)O!kT@$>0+dY+^yY}38|K0Ob*1E6OxwSXLcU8Y!{cMiyu@@@mywcCz zG>=-fo8PmpGERQc{HZE;|ISOv?%%x)=<%QKwbN5Jp8RXz$F}nH?aR-zr$4bgIeBi_ dduWK&GjLS3zWB1dQ4APk44$rjF6*2UngEAQ%k}^O literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/white-square-1px.png b/script.plexmod/resources/skins/Main/media/script.plex/white-square-1px.png new file mode 100644 index 0000000000000000000000000000000000000000..d81bd9903be5c90adff57c7f9a763a52d489cd95 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryoCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#0Xw^phM2RDWgbvSvcxr_#5q4VH#M(>!MP|ku_QG`p**uBL&4qCHz2%`PaLR- l$J50zgyVYhkN^Me8Cd@@{kwA}@;OkP!PC{xWt~$(698CrB-{W1 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/white-square-6px.png b/script.plexmod/resources/skins/Main/media/script.plex/white-square-6px.png new file mode 100644 index 0000000000000000000000000000000000000000..5a1083bec31b5302f7501aa3753aacd003efc0a9 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_|R1SIpFdh=fSp}PUNcp9OFB?Uvcxr_#5q4VH#M(>!MP|ku_QG`p**uBL&4qCHz2%`PaLR7 u)YHW=gyVYhpa1{unY9v<4lrC1VPXip%gm{=E@diE0fVQjpUXO@geCxW(#ggMiCL!-caKFg({gI(3Iuc~X&AV~HnU z=Zpil9{d%0_VU}ZKOv#jlXOo`O6k+fmlF7{;y&rBimij6gzc_gW7fsoCw>@Td72V> z^)&lE?j>g~yiVclXkZW&P+($macJP6HJd|#5op&h=_k2uaSHy%UzjYf4u_bxCyDx`7I;J! zGcfQS0b$0e+I-SLLG}_)Usv`A?2>{OTwc6x=<11Hv2m#DR)@JY5_^Brf+}*eKdyz;h(vDDws{x9@C`n);CrCL#e0|F*8P zWVo_!*{&L|t;OBT-Y>hgGpv5oN^XlE+h%LAItDWAzVMd8O;P4+^{V#y(W<-dPbivf Q1T>ey)78&qol`;+0N@%);{X5v literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/white-square-rounded-top-padded.png b/script.plexmod/resources/skins/Main/media/script.plex/white-square-rounded-top-padded.png new file mode 100644 index 0000000000000000000000000000000000000000..d886c3b15385a49bf64c58270e62c9d196c68fbd GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^DL|ag!3HG1l|BCjq}Y|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8pdfpRr>`sfBSt1BM#Zq>EXhD2$r9Iy66gHf+|;}h2Ir#G#FEq$ zh4Rdj3F!Z?A65Jrp3)`mi{5lMCB|zMDrT8?a5T5cWCC zAgPp>FEznKR?+&>_wu^+*7KiC_qeowWt{!4-*ZyDihPO;&fngxI&<}_Puxp(+fO>< z=_Z|fX;R9nRqNGHh#vc<5n3uGw_j7@wt3n2ox7?%KV|mU?$Nw@_rBbRyIaD_x66LJ zoWP{O#N^`8z`-HF$f!gg_6vQ5)skhGtyFg2PBg#UuCiIS>~f6frMuTv7TcQTu3UBb zbKv|*I%YTd9w$zyvVHsR^W#S|o+K>aUhZuae)VbP2j(l57VowRf9(MVG=rzBpUXO@ GgeCyKeVb+g literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/white-square-rounded-with-shadow.png b/script.plexmod/resources/skins/Main/media/script.plex/white-square-rounded-with-shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..4bab599d31e50d0644470348e7bc5f3251131f61 GIT binary patch literal 3060 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/white-square.png b/script.plexmod/resources/skins/Main/media/script.plex/white-square.png new file mode 100644 index 0000000000000000000000000000000000000000..52065d4eca006a3d8ab730947a57b43d5aad0b6e GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih`sfT^JBuiW)N}Tg^b5rw57@Uhz6H8K46v{J8G8EiBeFMT9`NV;W vL_J*`LnNjq|M~ylo;mM8i+di6H#5W1$IODy*p;^f6) + + 1080i + 1080i + 1.0 + + + 0 + + + Main + Plex + + \ No newline at end of file diff --git a/script.plexmod/screensaver.py b/script.plexmod/screensaver.py new file mode 100644 index 000000000..8e15051bc --- /dev/null +++ b/script.plexmod/screensaver.py @@ -0,0 +1,24 @@ +import xbmc + +from lib import plex, util + +from lib.windows import slidehshow + +class ScreensaverMonitor(xbmc.Monitor): + def __init__( self, *args, **kwargs ): + self.action = kwargs['action'] + + def onScreensaverDeactivated(self): + self.action() + +def main(): + util.DEBUG_LOG("[SS] Starting") + if plex.init(): + with util.Cron(1): + ss = slidehshow.Slideshow.create() + ss.monitor = ScreensaverMonitor(action = ss.close) + ss.modal() + del ss + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/script.plexmod/service.py b/script.plexmod/service.py new file mode 100644 index 000000000..1698e9783 --- /dev/null +++ b/script.plexmod/service.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import +from kodi_six import xbmc +from kodi_six import xbmcgui +from kodi_six import xbmcaddon + + +def main(): + if xbmc.getInfoLabel('Window(10000).Property(script.plex.service.started)'): + # Prevent add-on updates from starting a new version of the addon + return + + xbmcgui.Window(10000).setProperty('script.plex.service.started', '1') + + if xbmcaddon.Addon().getSetting('kiosk.mode') == 'true': + xbmc.log('script.plex: Starting from service (Kiosk Mode)', xbmc.LOGINFO) + xbmc.executebuiltin('RunScript(script.plexmod)') + + +if __name__ == '__main__': + main() diff --git a/script.radioparadise/CHANGELOG.md b/script.radioparadise/CHANGELOG.md deleted file mode 100644 index d336bef27..000000000 --- a/script.radioparadise/CHANGELOG.md +++ /dev/null @@ -1,29 +0,0 @@ -## v2.0.0 - -- Updates for Kodi v20 -- Improve metadata handling - -## v1.0.5 - -- Rename World/Etc mix to Global - -## v1.0.4 - -- Update logos -- Improve metadata error handling - -## v1.0.3 - -- Add mix selection by script parameter - -## v1.0.2 - -- Handle missing stream metadata - -## v1.0.1 - -- Restart playback automatically - -## v1.0.0 - -- Initial release diff --git a/script.radioparadise/COPYING b/script.radioparadise/COPYING deleted file mode 100644 index f288702d2..000000000 --- a/script.radioparadise/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/script.radioparadise/LICENSE.txt b/script.radioparadise/LICENSE.txt deleted file mode 100644 index 9d7514d02..000000000 --- a/script.radioparadise/LICENSE.txt +++ /dev/null @@ -1,16 +0,0 @@ -Radio Paradise logos and photos: Copyright Radio Paradise - -All other files ("This program"): Copyright Alexander Dietrich - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . diff --git a/script.radioparadise/README.md b/script.radioparadise/README.md deleted file mode 100644 index 1a3c8b352..000000000 --- a/script.radioparadise/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# Radio Paradise addon for Kodi - -Plays [Radio Paradise][] music mixes, accompanied by the HD slideshow. - -[radio paradise]: https://radioparadise.com/ - -## Features - -- Radio Paradise music mixes in AAC or FLAC -- HD slideshow (optional) -- Auto Play (optional) - -## Requirements - -- Kodi [release][] v20 or later - -[release]: https://kodi.wiki/view/Releases - -## Mix Selection by Script Parameter - -In addition to the Auto Play feature, the addon script can be called with a -parameter to start a particular RP mix: - -```python -RunScript('script.radioparadise', 1) -``` - -Mix parameter: - -| Value | Mix | -| --- | --- | -| 0 | RP Main Mix | -| 1 | RP Mellow Mix | -| 2 | RP Rock Mix | -| 3 | RP Global Mix | - -This can be used to add shortcuts for RP mixes in [favourites.xml][]. - -[favourites.xml]: https://kodi.wiki/view/Favourites.xml diff --git a/script.radioparadise/addon.xml b/script.radioparadise/addon.xml deleted file mode 100644 index e32e7f783..000000000 --- a/script.radioparadise/addon.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - audio - - - -

    Radio Paradise addon for Kodi - An eclectic DJ-mixed blend of rock, indie, electronica, world music, and more. Listener supported & always 100% commercial free. - https://radioparadise.com/ - https://github.com/alxndr42/script.radioparadise - GPL-3.0-or-later - all - - resources/icon.png - resources/fanart.jpg - resources/clearlogo.png - - - diff --git a/script.radioparadise/resources/clearlogo.png b/script.radioparadise/resources/clearlogo.png deleted file mode 100644 index c8bb659364b6825ce4e1b93308ac77d71d8c4643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45608 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 diff --git a/script.radioparadise/resources/language/resource.language.en_gb/strings.po b/script.radioparadise/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index ca9085e18..000000000 --- a/script.radioparadise/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,46 +0,0 @@ -msgid "" -msgstr "" - -msgctxt "#30101" -msgid "Audio Format" -msgstr "" - -msgctxt "#30102" -msgid "Auto Play" -msgstr "" - -msgctxt "#30103" -msgid "Visuals" -msgstr "" - -msgctxt "#30104" -msgid "Slide Duration (seconds)" -msgstr "" - -msgctxt "#30201" -msgid "AAC" -msgstr "" - -msgctxt "#30202" -msgid "FLAC" -msgstr "" - -msgctxt "#30203" -msgid "RP Main Mix" -msgstr "" - -msgctxt "#30204" -msgid "RP Mellow Mix" -msgstr "" - -msgctxt "#30205" -msgid "RP Rock Mix" -msgstr "" - -msgctxt "#30206" -msgid "RP Global Mix" -msgstr "" - -msgctxt "#30207" -msgid "RP Slideshow" -msgstr "" diff --git a/script.radioparadise/resources/lib/__init__.py b/script.radioparadise/resources/lib/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/script.radioparadise/resources/lib/radioparadise.py b/script.radioparadise/resources/lib/radioparadise.py deleted file mode 100644 index ce5f31df7..000000000 --- a/script.radioparadise/resources/lib/radioparadise.py +++ /dev/null @@ -1,142 +0,0 @@ -from collections import OrderedDict -import re -import time - -import requests - - -NOWPLAYING_URL = 'https://api.radioparadise.com/api/nowplaying_list?chan={}' -COVER_URL = 'https://img.radioparadise.com/{}' -SLIDESHOW_URL = 'https://img.radioparadise.com/slideshow/720/{}.jpg' - -BREAK_COVER_URL = 'https://img.radioparadise.com/covers/l/101.jpg' -BREAK_SONG = ('Commercial-free', 'Listener-supported') - -KEY_FILTER_RE = re.compile(r'[^\w\']+') - -# Number of songs to cache -MAX_SONGS = 30 -# Number of seconds to wait for API responses -UPDATE_TIMEOUT = 3 -# Number of seconds to wait before retrying API updates -UPDATE_WAIT = 5 - -STREAMS = [ - { - 'channel': 0, - 'title': 'RP Main Mix', - 'url_aac': 'http://stream.radioparadise.com/aac-128', - 'url_flac': 'http://stream.radioparadise.com/flacm', - }, - { - 'channel': 1, - 'title': 'RP Mellow Mix', - 'url_aac': 'http://stream.radioparadise.com/mellow-128', - 'url_flac': 'http://stream.radioparadise.com/mellow-flacm', - }, - { - 'channel': 2, - 'title': 'RP Rock Mix', - 'url_aac': 'http://stream.radioparadise.com/rock-128', - 'url_flac': 'http://stream.radioparadise.com/rock-flacm', - }, - { - 'channel': 3, - 'title': 'RP Global Mix', - 'url_aac': 'http://stream.radioparadise.com/global-128', - 'url_flac': 'http://stream.radioparadise.com/global-flacm', - }, -] -STREAM_INFO = {s['url_aac']: s for s in STREAMS} -STREAM_INFO.update({s['url_flac']: s for s in STREAMS}) - - -class NowPlaying(): - """Provides song information from the "nowplaying" API.""" - - def __init__(self): - """Constructor""" - self.songs = OrderedDict() - self.set_channel(None) - - def get_song_data(self, song_key): - """Return a dict for the build_key()-created key, or None. - - The "cover" value will be an absolute URL. - """ - return self.songs.get(song_key) - - def get_next_song(self, song_key): - """Return a dict for song_key's successor, or None. - - The "cover" value will be an absolute URL. - """ - next_key = self.songs.get(song_key, {}).get('next_key') - return self.songs.get(next_key) - - def set_channel(self, channel): - """Set the RP channel number, or None.""" - if channel is not None: - self.url = NOWPLAYING_URL.format(channel) - else: - self.url = None - self.current = None - self.next_update = 0 - self.songs.clear() - - def update(self): - """Update song information from the API, if necessary. - - Calls the API only if the "refresh" timer has expired. - - Raises an exception on error responses or timeouts. - """ - if self.url is None: - return - if time.time() < self.next_update: - return - - try: - res = requests.get(self.url, timeout=UPDATE_TIMEOUT) - res.raise_for_status() - except Exception: - self.next_update = time.time() + UPDATE_WAIT - raise - - next_key = None - data = res.json() - song_items = sorted(list(data['song'].items()), key=lambda s: int(s[0])) - for index, song in song_items: - if song['artist'] is None: - song['artist'] = 'Unknown Artist' - if song['title'] is None: - song['title'] = 'Unknown Title' - song['cover'] = COVER_URL.format(song['cover']) - slides = song.get('slideshow', '').split(',') - slides = [SLIDESHOW_URL.format(s) for s in slides if s] - song['slide_urls'] = slides - song['next_key'] = next_key - key = build_key((song['artist'], song['title'])) - self.songs[key] = song - next_key = key - if index == '0': - self.current = song - if (break_key := build_key(BREAK_SONG)) not in self.songs: - self.songs[break_key] = { - 'artist': BREAK_SONG[0], - 'title': BREAK_SONG[1], - 'cover': BREAK_COVER_URL, - 'duration': '30000', - } - self.next_update = time.time() + data['refresh'] - while len(self.songs) > MAX_SONGS: - self.songs.popitem(last=False) - - -def build_key(strings): - """Return a normalized tuple of words in the strings.""" - result = [] - for s in strings: - words = KEY_FILTER_RE.sub(' ', s).casefold().split() - result.extend(words) - return tuple(sorted(result)) diff --git a/script.radioparadise/resources/lib/script.py b/script.radioparadise/resources/lib/script.py deleted file mode 100644 index a7206833f..000000000 --- a/script.radioparadise/resources/lib/script.py +++ /dev/null @@ -1,58 +0,0 @@ -import sys - -import xbmc -import xbmcaddon -import xbmcgui - -from .radioparadise import STREAMS - - -class Window(xbmcgui.WindowXML): - def onInit(self): - xbmc.executebuiltin('Container.SetViewMode(100)') - listitems = [] - for s in STREAMS: - item = xbmcgui.ListItem(s['title']) - item.setProperty('channel', str(s['channel'])) - listitems.append(item) - self.clearList() - self.addItems(listitems) - xbmc.sleep(100) - self.setFocusId(self.getCurrentContainerId()) - - def onClick(self, controlId): - if controlId == 100: - item = self.getListItem(self.getCurrentListPosition()) - channel = int(item.getProperty('channel')) - play_channel(channel) - self.close() - - -def play_channel(channel_number): - """Play the channel, unless it's already playing.""" - stream = STREAMS[channel_number] - addon = xbmcaddon.Addon() - audio_format = addon.getSetting('audio_format') - if audio_format == 'flac': - url = stream['url_flac'] - else: - url = stream['url_aac'] - player = xbmc.Player() - if not player.isPlayingAudio() or player.getPlayingFile() != url: - player.stop() - player.play(url) - - -def run_script(): - addon = xbmcaddon.Addon() - if len(sys.argv) == 2: - auto_play = int(sys.argv[1]) - else: - auto_play = addon.getSettingInt('auto_play') - if auto_play == -1: - addon_path = addon.getAddonInfo('path') - window = Window('script-radioparadise.xml', addon_path) - window.doModal() - del window - else: - play_channel(auto_play) diff --git a/script.radioparadise/resources/lib/service.py b/script.radioparadise/resources/lib/service.py deleted file mode 100644 index c96612c39..000000000 --- a/script.radioparadise/resources/lib/service.py +++ /dev/null @@ -1,285 +0,0 @@ -import time -import traceback - -import requests -import xbmc -import xbmcaddon -import xbmcgui - -from .radioparadise import STREAM_INFO, NowPlaying, build_key - - -DEVELOPMENT = False - -EXPIRATION_DELAY = 10 - -RESTART_DELAY = 1.0 -RESTART_TIMEOUT = 1.0 - - -class Song(): - """Current song information.""" - - def __init__(self, key, data, fanart, start_time): - self.key = key - self.data = data - self.fanart = fanart - self.cover = data['cover'] - self.start_time = start_time - self.duration = int(data['duration']) / 1000 - - def __str__(self): - artist = self.data.get('artist', 'Unknown Artist') - title = self.data.get('title', 'Unknown Title') - return f'{artist} - {title}' - - def expired(self): - """Return True if this Song should be considered overdue.""" - if self.start_time: - expiration = self.start_time + self.duration + EXPIRATION_DELAY - return time.time() > expiration - else: - return False - - -class Player(xbmc.Player): - """Adds xbmc.Player callbacks and integrates with the RP API.""" - - def __init__(self): - """Constructor""" - super().__init__() - self.song = None - self.stream_url = None - self.restart_time = 0 - self.tracked_key = None - self.tracked_time = 0 - self.now_playing = NowPlaying() - self.slideshow = Slideshow() - - def get_song_key(self): - """Return a key for the current song, or None.""" - result = None - if self.isPlayingAudio(): - try: - info = self.getMusicInfoTag() - artist_title = (info.getArtist(), info.getTitle()) - if artist_title != ('', ''): - result = build_key(artist_title) - except Exception: - pass - return result - - def reset(self): - """Reset internal state when not playing RP.""" - self.song = None - self.stream_url = None - self.restart_time = 0 - self.tracked_key = None - self.tracked_time = 0 - self.now_playing.set_channel(None) - self.slideshow.set_slides(None) - - def restart(self): - """Restart playback, if necessary.""" - if not self.restart_time or time.time() < self.restart_time: - return - try: - res = requests.head(self.stream_url, timeout=RESTART_TIMEOUT) - do_restart = res.status_code == 200 - except Exception: - do_restart = False - if do_restart: - self.restart_time = 0 - self.play(self.stream_url) - else: - self.restart_time = time.time() + RESTART_DELAY - - def update(self): - """Perform updates.""" - if self.restart_time: - self.restart() - elif self.stream_url: - self.now_playing.update() - self.update_slideshow() - self.update_song() - - def update_player(self): - """Update the Kodi player with song metadata.""" - song = self.song - if song and self.isPlayingAudio(): - item = self.getPlayingItem() - tag = item.getMusicInfoTag() - tag.setArtist(song.data['artist']) - tag.setTitle(song.data['title']) - tag.setGenres([]) - tag.setAlbum(song.data.get('album', '')) - rating = float(song.data.get('rating', 0)) - tag.setRating(rating) - tag.setUserRating(int(round(rating))) - tag.setYear(int(song.data.get('year', 0))) - item.setArt({'thumb': song.cover}) - item.setArt({'fanart': song.fanart}) - self.updateInfoTag(item) - - def clear_player(self): - """Clear most of the Kodi player's song information.""" - if self.isPlayingAudio(): - info = self.getMusicInfoTag() - item = self.getPlayingItem() - tag = item.getMusicInfoTag() - tag.setArtist(info.getArtist()) - tag.setTitle(info.getTitle()) - tag.setGenres([]) - tag.setAlbum('') - tag.setRating(0) - tag.setUserRating(0) - tag.setYear(0) - item.setArt({'thumb': None}) - item.setArt({'fanart': None}) - self.updateInfoTag(item) - - def update_slideshow(self): - """Update the slideshow, if necessary.""" - song = self.song - next_slide = self.slideshow.next_slide() - if song and next_slide: - song.fanart = next_slide - self.update_player() - - def update_song(self): - """Update song metadata, if necessary.""" - player_key = self.get_song_key() - song = self.song - if player_key is None: - return - if song and not (song.key != player_key or song.expired()): - return - - # Keep track of the local song start time - if self.tracked_key != player_key: - if self.tracked_key is not None: - self.tracked_time = time.time() - self.tracked_key = player_key - - start_time = None - song_data = None - # Try to match API metadata on song changes - if song and song.key != player_key and not song.expired(): - start_time = self.tracked_time - song_data = self.now_playing.get_song_data(player_key) - # Show "next" song if the song change was missed - elif song and song.expired(): - start_time = song.start_time + song.duration - song_data = self.now_playing.get_next_song(player_key) - # Without API metadata, show the stream metadata - if song_data is None and song.start_time: - song.start_time = 0 - self.slideshow.set_slides(None) - self.clear_player() - # Show "current" song after starting playback - elif song is None: - song_data = self.now_playing.current - # API metadata may not be available yet - if song_data is None: - return - - addon = xbmcaddon.Addon() - slideshow = addon.getSetting('slideshow') - if slideshow == 'rp': - slides = song_data.get('slide_urls') - delay = addon.getSettingInt('slide_duration') - self.slideshow.set_slides(slides, delay) - fanart = self.slideshow.next_slide() - else: - self.slideshow.set_slides(None) - fanart = None - song_key = build_key((song_data['artist'], song_data['title'])) - self.song = Song(song_key, song_data, fanart, start_time) - log(f'Song: {self.song}') - self.update_player() - - def onAVStarted(self): - if self.isPlaying() and self.getPlayingFile() in STREAM_INFO: - url = self.getPlayingFile() - info = STREAM_INFO[url] - # Kodi switches to fullscreen for FLAC, but not AAC - if url == info['url_aac']: - xbmc.executebuiltin('Action(FullScreen)') - else: - self.reset() - - def onPlayBackEnded(self): - if self.stream_url: - self.restart_time = time.time() - else: - self.reset() - - def onPlayBackError(self): - self.reset() - - def onPlayBackStarted(self): - if self.isPlaying() and self.getPlayingFile() in STREAM_INFO: - url = self.getPlayingFile() - self.stream_url = url - self.restart_time = 0 - info = STREAM_INFO[url] - self.now_playing.set_channel(info['channel']) - else: - self.reset() - - def onPlayBackStopped(self): - self.reset() - - -class Slideshow(): - """Provides timed slide URLs.""" - - def __init__(self): - self.set_slides(None) - - def set_slides(self, slides, delay=10): - """Set slides and delay, or None.""" - if slides: - self.slides = slides - self.delay = delay - self.index = 0 - self.time = 0 - else: - self.slides = None - - def next_slide(self): - """Return the next slide URL, or None.""" - result = None - now = time.time() - if self.slides and self.time + self.delay < now: - result = self.slides[self.index] - self.index = (self.index + 1) % len(self.slides) - self.time = now - return result - - -def log(message, level=None): - """Write to the Kodi log.""" - if level is not None: - xbmc.log(f'rp_service: {message}', level) - elif DEVELOPMENT: - xbmc.log(f'rp_service: {message}', xbmc.LOGINFO) - else: - xbmc.log(f'rp_service: {message}', xbmc.LOGDEBUG) - - -def run_service(): - log('Service started.') - player = Player() - monitor = xbmc.Monitor() - while not monitor.abortRequested(): - if monitor.waitForAbort(0.1): - break - try: - player.update() - except Exception as e: - if DEVELOPMENT: - log(traceback.format_exc(), xbmc.LOGERROR) - else: - log(repr(e), xbmc.LOGERROR) - log('Service exiting.') diff --git a/script.radioparadise/resources/settings.xml b/script.radioparadise/resources/settings.xml deleted file mode 100644 index 8fc14729f..000000000 --- a/script.radioparadise/resources/settings.xml +++ /dev/null @@ -1,60 +0,0 @@ - - -

    - - - - 0 - aac - - - - - - - - - - 0 - -1 - - - - - - - - - - - - - - - 0 - rp - - - - - - - - - - 0 - 10 - - 10 - 1 - 60 - - - - disabled - - - - -
    - diff --git a/script.radioparadise/resources/skins/Default/720p/script-radioparadise.xml b/script.radioparadise/resources/skins/Default/720p/script-radioparadise.xml deleted file mode 100644 index 0da40d58a..000000000 --- a/script.radioparadise/resources/skins/Default/720p/script-radioparadise.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 100 - - - 50% - 50% - 180 - 180 - keep - 10 - logo.png - - - 50% - 50% - 180 - 120 - list - - - 10 - - ffffffff - - - - - 0 - menu-focus.png - - - 10 - - ff000000 - - - - - diff --git a/script.radioparadise/resources/skins/Default/media/logo.png b/script.radioparadise/resources/skins/Default/media/logo.png deleted file mode 100644 index 507cb1b52d915d8d2f1e4c11b8525595f8493579..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13388 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 - - - - - - - - - Control Hyperion Ambilight - Hyperion Ambilight Steuerung - Enable and disable components (like capture) of Hyperion automatically based on playing/screensaver state of Kodi[CR]-Supports auto detection of Hyperion Servers[CR]-Token authentication - Aktiviere und deaktiviere automatisch Hyperion Komponenten basierend auf dem aktuellen Kodi Status[CR]-Unterstützt Hyperion Server suche[CR]-Token Autorisierung - all - MIT - https://hyperion-project.org/forum - https://hyperion-project.org/forum - https://github.com/hyperion-project/hyperion.control - - 20.0.1 - - Removed redundant debug setting - - 20.0.0 - - Kodi 20 (Nexus) support - - Multi instance handling - - New language: Hungarian - - 19.0.2 - - New languages: Español, Français, Polski - - 19.0.1 - - Kodi 19 support - - minor cleanups and corrections - - 1.0.1 - - Fixed a crash with 3d mode @b-jesch - - 1.0.0 - - Added support for server search - - Added support token authentication - - Fixed issue where kodi api does not properly announce video playing states - - - resources/icon.png - resources/fanart.png - resources/screenshot-01.png - - - diff --git a/script.service.hyperion-control/resources/__init__.py b/script.service.hyperion-control/resources/__init__.py deleted file mode 100644 index b80578ea0..000000000 --- a/script.service.hyperion-control/resources/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Hyperion control addon resources.""" diff --git a/script.service.hyperion-control/resources/fanart.png b/script.service.hyperion-control/resources/fanart.png deleted file mode 100644 index 3944f05142be3ba7fa294e3909e66ec919bea33c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70622 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 E0Jhw<#sB~S diff --git a/script.service.hyperion-control/resources/icon.png b/script.service.hyperion-control/resources/icon.png deleted file mode 100644 index c68c40a30c55901360efcc32da55d359ad927824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153145 zcmeFZWl&_zvM!9f+u$@kI5h6=?(XjH?hb=946cLwV1v64?lQQ$I|G;Z-TUmbPki^! ziTLin-5njhR#oPcnNMX^)LOl=qZH*OkP+|^z`($er6fg_!N4Fs4k5tcU_QQXJ?Eam zz?iDMRW)6ejXVI3&JN~Qwq^iVFGn+gnWvRG7?|fuQI?f6VM|@ny9u@jd|JewA?pdz z?ez;!4w;Oy8ejd3wpziksW}wP0}EK3E@QcMRhTA)bG+zz>7R3#NF3qlYExFDVI%X;&s>7< z9taOoOzT)l2R70M$db>Qx*5K+kNBRL$nq%{cNWE2&x-@N2?6*exdI_Ld~9s*JDG1; zRhJ6&cYm^9T$-F;y=9(F5>6(&-XB{L_u>r-b6@%mF0x)0J+2-WbK_5V;`|Bx{`g(o zTKE-zV$le1^>;gNqrE4(*a2$&JdZ0@+j!Jz7Oj7Wd3P)D#zYu$=z4UBKnKp=38PSs zUG_Excr39p4V@V8Wa4_r-Ww}`;+m898BV$`jb%P(&!z9$&E}}QTFKO|qI6}iRk<8s zdfFiA#t1%Myt}-g!LF;&gl@h}YED<UvDg^QKL31w`=W(tP>*9*d^>p0V$;5|@<1NES!g+t#;8fgxFe?m zFrCeMB6g0;;2KXS={BHA6vr7~hR`mfKYwBBb&=zJUan8m0W=7fD^vbnRI_4#PCTD~G&b?RV4RXS0KP`Rx%zC5Qu}bHqYteg(>)Y6ysuM22WWpe0TQVsOO_2XJL0a7NH( z@l=ygT(NgUGI~;C@|$k>%EE$=6vi(Ib7#iSth7+3{`SK@uXE=|T5M(AX=R05d1*pk z)j|F-Z4Qm%&LHY4<&nz@Y-ya5%v1e>C|eX&6qw2CM9Ey(%0D*+6B8pInc`j0oywcd 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 diff --git a/script.service.hyperion-control/resources/language/resource.language.de_de/strings.po b/script.service.hyperion-control/resources/language/resource.language.de_de/strings.po deleted file mode 100644 index d9e30ed2a..000000000 --- a/script.service.hyperion-control/resources/language/resource.language.de_de/strings.po +++ /dev/null @@ -1,194 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: POEditor.com\n" -"Project-Id-Version: Hyperion Control\n" -"Language: de\n" - -#: -msgctxt "#32000" -msgid "General" -msgstr "Allgemein" - -#: -msgctxt "#32001" -msgid "Hyperion IP" -msgstr "Hyperion IP" - -#: -msgctxt "#32002" -msgid "Hyperion Webserver Port" -msgstr "Hyperion Webserver Port" - -#: -msgctxt "#32003" -msgid "Switch automatically between 2D/3D" -msgstr "Automatisch auf 2D/3D umstellen" - -#: -msgctxt "#32004" -msgid "Enable Hyperion on startup" -msgstr "Aktiviere Hyperion beim Starten" - -#: -msgctxt "#32005" -msgid "Disable Hyperion on shutdown" -msgstr "Deaktiviere Hyperion beim Beenden" - -#: -msgctxt "#32007" -msgid "Show changelog after update" -msgstr "Zeige Änderungen nach Update" - -#: -msgctxt "#32008" -msgid "Authorization Token" -msgstr "Autorisierungs-Token" - -#: -msgctxt "#32025" -msgid "Component" -msgstr "Komponente" - -#: -msgctxt "#32026" -msgid "Enable the chosen component in these situations else disable it." -msgstr "Aktiviere die Komponente in folgenden Situationen, sonst wird sie deaktiviert." - -#: -msgctxt "#32027" -msgid "Hyperion component" -msgstr "Hyperion Komponente" - -#: -msgctxt "#32028" -msgid "Enable during video playback" -msgstr "Aktiviere bei Videos" - -#: -msgctxt "#32029" -msgid "Enable during music playback" -msgstr "Aktiviere bei Musik" - -#: -msgctxt "#32030" -msgid "Enable during player pause" -msgstr "Aktiviere bei pausiertem Player" - -#: -msgctxt "#32031" -msgid "Enable in Kodi menu" -msgstr "Aktiviere im Kodi Menü" - -#: -msgctxt "#32032" -msgid "Enable during active screensaver" -msgstr "Aktiviere bei Bildschirmschoner" - -#: -msgctxt "#32041" -msgid "USB Capture" -msgstr "USB Aufnahme" - -#: -msgctxt "#32042" -msgid "LED Hardware" -msgstr "LED Hardware" - -#: -msgctxt "#32043" -msgid "Smoothing" -msgstr "Glättung" - -#: -msgctxt "#32045" -msgid "Forwarder" -msgstr "Weiterleitung" - -#: -msgctxt "#32101" -msgid "Would you like to search for a Hyperion Server and adjust settings?" -msgstr "Hyperion Server suchen und Einstellungen anpassen?" - -#: -msgctxt "#32102" -msgid "Select a Hyperion Server, we found more than one" -msgstr "Wähle einen Hyperion Server, es wurden mehrere gefunden" - -#: -msgctxt "#32104" -msgid "We are sorry, no Hyperion Server has been found. You need to configure IP address and port by hand" -msgstr "Leider wurde kein Hyperion Server gefunden, du musst IP-Adresse und Port selbst eintragen" - -#: -msgctxt "#32105" -msgid "The Authorization Token isn't valid" -msgstr "Das Autorisierungs-Token ist nicht gültig" - -#: -msgctxt "#32150" -msgid "Execute" -msgstr "Ausführen" - -#: -msgctxt "#32151" -msgid "Execute a specific task you might need again.[CR]Select a task from the tasklist and press OK to close the settings dialog." -msgstr "Führe eine spezifische Aufgabe nochmals aus.[CR]Wähle dazu aus der Liste eine Aufgabe und drücke den OK Button." - -#: -msgctxt "#32152" -msgid "The addon will handle your request immediately.[CR]Be aware that the addon should be already enabled" -msgstr "Die Einstellungen schließen sich.[CR]Das Addon wird sofort mit der Ausführung beginnen, sofern es aktiviert ist" - -#: -msgctxt "#32153" -msgid "Tasklist" -msgstr "Aufgabenliste" - -#: -msgctxt "#32154" -msgid "No Task" -msgstr "keine Aufgabe" - -#: -msgctxt "#32155" -msgid "Search: Hyperion Server" -msgstr "Suchen: Hyperion Server" - -#: -msgctxt "#32044" -msgid "Blackbar detector" -msgstr "Schwarze Balken Erkennung" - -#: -msgctxt "#32040" -msgid "Screen Capture" -msgstr "Bildschirm Aufnahme" - -#: -msgctxt "#32100" -msgid "Welcome to Hyperion Control!" -msgstr "Willkommen zu Hyperion Control!" - -#: -msgctxt "#32103" -msgid "We found the following Hyperion Server for usage:" -msgstr "Es wurde folgender Hyperion Server gefunden:" - -#: -msgctxt "#32046" -msgid "Boblight Server" -msgstr "Boblight Server" - -#: -msgctxt "#32047" -msgid "Hyperion" -msgstr "Hyperion" - -#: -msgctxt "#32048" -msgid "Audio Capture" -msgstr "Audio Aufnahme" - diff --git a/script.service.hyperion-control/resources/language/resource.language.en_gb/strings.po b/script.service.hyperion-control/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index 8ce63453e..000000000 --- a/script.service.hyperion-control/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,194 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: POEditor.com\n" -"Project-Id-Version: Hyperion Control\n" -"Language: en\n" - -#: -msgctxt "#32000" -msgid "General" -msgstr "General" - -#: -msgctxt "#32001" -msgid "Hyperion IP" -msgstr "Hyperion IP" - -#: -msgctxt "#32002" -msgid "Hyperion Webserver Port" -msgstr "Hyperion Webserver Port" - -#: -msgctxt "#32003" -msgid "Switch automatically between 2D/3D" -msgstr "Switch automatically between 2D/3D" - -#: -msgctxt "#32004" -msgid "Enable Hyperion on startup" -msgstr "Enable Hyperion on startup" - -#: -msgctxt "#32005" -msgid "Disable Hyperion on shutdown" -msgstr "Disable Hyperion on shutdown" - -#: -msgctxt "#32007" -msgid "Show changelog after update" -msgstr "Show changelog after update" - -#: -msgctxt "#32008" -msgid "Authorization Token" -msgstr "Authorization Token" - -#: -msgctxt "#32025" -msgid "Component" -msgstr "Component" - -#: -msgctxt "#32026" -msgid "Enable the chosen component in these situations else disable it." -msgstr "Enable the chosen component in these situations else disable it." - -#: -msgctxt "#32027" -msgid "Hyperion component" -msgstr "Hyperion component" - -#: -msgctxt "#32028" -msgid "Enable during video playback" -msgstr "Enable during video playback" - -#: -msgctxt "#32029" -msgid "Enable during music playback" -msgstr "Enable during music playback" - -#: -msgctxt "#32030" -msgid "Enable during player pause" -msgstr "Enable during player pause" - -#: -msgctxt "#32031" -msgid "Enable in Kodi menu" -msgstr "Enable in Kodi menu" - -#: -msgctxt "#32032" -msgid "Enable during active screensaver" -msgstr "Enable during active screensaver" - -#: -msgctxt "#32041" -msgid "USB Capture" -msgstr "USB Capture" - -#: -msgctxt "#32042" -msgid "LED Hardware" -msgstr "LED Hardware" - -#: -msgctxt "#32043" -msgid "Smoothing" -msgstr "Smoothing" - -#: -msgctxt "#32045" -msgid "Forwarder" -msgstr "Forwarder" - -#: -msgctxt "#32101" -msgid "Would you like to search for a Hyperion Server and adjust settings?" -msgstr "Would you like to search for a Hyperion Server and adjust settings?" - -#: -msgctxt "#32102" -msgid "Select a Hyperion Server, we found more than one" -msgstr "Select a Hyperion Server, we found more than one" - -#: -msgctxt "#32104" -msgid "We are sorry, no Hyperion Server has been found. You need to configure IP address and port by hand" -msgstr "We are sorry, no Hyperion Server has been found. You need to configure IP address and port by hand" - -#: -msgctxt "#32105" -msgid "The Authorization Token isn't valid" -msgstr "The Authorization Token isn't valid" - -#: -msgctxt "#32150" -msgid "Execute" -msgstr "Execute" - -#: -msgctxt "#32151" -msgid "Execute a specific task you might need again.[CR]Select a task from the tasklist and press OK to close the settings dialog." -msgstr "Execute a specific task you might need again.[CR]Select a task from the tasklist and press OK to close the settings dialog." - -#: -msgctxt "#32152" -msgid "The addon will handle your request immediately.[CR]Be aware that the addon should be already enabled" -msgstr "The addon will handle your request immediately.[CR]Be aware that the addon should be already enabled" - -#: -msgctxt "#32153" -msgid "Tasklist" -msgstr "Tasklist" - -#: -msgctxt "#32154" -msgid "No Task" -msgstr "No Task" - -#: -msgctxt "#32155" -msgid "Search: Hyperion Server" -msgstr "Search: Hyperion Server" - -#: -msgctxt "#32044" -msgid "Blackbar detector" -msgstr "Blackbar detector" - -#: -msgctxt "#32040" -msgid "Screen Capture" -msgstr "Screen Capture" - -#: -msgctxt "#32100" -msgid "Welcome to Hyperion Control!" -msgstr "Welcome to Hyperion Control!" - -#: -msgctxt "#32103" -msgid "We found the following Hyperion Server for usage:" -msgstr "We found the following Hyperion Server for usage:" - -#: -msgctxt "#32046" -msgid "Boblight Server" -msgstr "Boblight Server" - -#: -msgctxt "#32047" -msgid "Hyperion" -msgstr "Hyperion" - -#: -msgctxt "#32048" -msgid "Audio Capture" -msgstr "Audio Capture" - diff --git a/script.service.hyperion-control/resources/language/resource.language.es_es/strings.po b/script.service.hyperion-control/resources/language/resource.language.es_es/strings.po deleted file mode 100644 index fcc547953..000000000 --- a/script.service.hyperion-control/resources/language/resource.language.es_es/strings.po +++ /dev/null @@ -1,194 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: POEditor.com\n" -"Project-Id-Version: Hyperion Control\n" -"Language: es\n" - -#: -msgctxt "#32000" -msgid "General" -msgstr "General" - -#: -msgctxt "#32001" -msgid "Hyperion IP" -msgstr "IP de Hyperion" - -#: -msgctxt "#32002" -msgid "Hyperion Webserver Port" -msgstr "Puerto del servidor web de Hyperion" - -#: -msgctxt "#32003" -msgid "Switch automatically between 2D/3D" -msgstr "Cambio automático entre 2D/3D" - -#: -msgctxt "#32004" -msgid "Enable Hyperion on startup" -msgstr "Habilitar Hyperion al inicio" - -#: -msgctxt "#32005" -msgid "Disable Hyperion on shutdown" -msgstr "Deshabilitar Hyperion al apagar" - -#: -msgctxt "#32007" -msgid "Show changelog after update" -msgstr "Mostrar el registro de cambios tras la actualización" - -#: -msgctxt "#32008" -msgid "Authorization Token" -msgstr "Token de autorización" - -#: -msgctxt "#32025" -msgid "Component" -msgstr "Componente" - -#: -msgctxt "#32026" -msgid "Enable the chosen component in these situations else disable it." -msgstr "Habilitar el componente elegido en estas situaciones o deshabilitarlo." - -#: -msgctxt "#32027" -msgid "Hyperion component" -msgstr "Componente Hyperion" - -#: -msgctxt "#32028" -msgid "Enable during video playback" -msgstr "Activar durante la reproducción de vídeo" - -#: -msgctxt "#32029" -msgid "Enable during music playback" -msgstr "Activar durante la reproducción de música" - -#: -msgctxt "#32030" -msgid "Enable during player pause" -msgstr "Habilitar durante la pausa del reproductor" - -#: -msgctxt "#32031" -msgid "Enable in Kodi menu" -msgstr "Habilitar en el menú de Kodi" - -#: -msgctxt "#32032" -msgid "Enable during active screensaver" -msgstr "Habilitar durante el salvapantallas activo" - -#: -msgctxt "#32041" -msgid "USB Capture" -msgstr "Captura USB" - -#: -msgctxt "#32042" -msgid "LED Hardware" -msgstr "Hardware LED" - -#: -msgctxt "#32043" -msgid "Smoothing" -msgstr "Suavizado" - -#: -msgctxt "#32045" -msgid "Forwarder" -msgstr "Transmisor" - -#: -msgctxt "#32101" -msgid "Would you like to search for a Hyperion Server and adjust settings?" -msgstr "¿Desea buscar un Servidor Hyperion y ajustar la configuración?" - -#: -msgctxt "#32102" -msgid "Select a Hyperion Server, we found more than one" -msgstr "Seleccione un servidor Hyperion, encontramos más de uno" - -#: -msgctxt "#32104" -msgid "We are sorry, no Hyperion Server has been found. You need to configure IP address and port by hand" -msgstr "Lo sentimos, no se ha encontrado ningún Hyperion Server. Debe configurar la dirección IP y el puerto a mano" - -#: -msgctxt "#32105" -msgid "The Authorization Token isn't valid" -msgstr "Lo sentimos, no se ha encontrado ningún Servidor Hyperion. Es necesario configurar la dirección IP y el puerto a mano" - -#: -msgctxt "#32150" -msgid "Execute" -msgstr "Ejecutar" - -#: -msgctxt "#32151" -msgid "Execute a specific task you might need again.[CR]Select a task from the tasklist and press OK to close the settings dialog." -msgstr "Ejecutar una tarea específica que se pueda necesitar de nuevo.[CR]Seleccionar una tarea de la lista de tareas y pulsar OK para cerrar el diálogo de configuración." - -#: -msgctxt "#32152" -msgid "The addon will handle your request immediately.[CR]Be aware that the addon should be already enabled" -msgstr "El complemento se encargará de la solicitud inmediatamente.[CR]Ten en cuenta que el complemento debe estar ya activado" - -#: -msgctxt "#32153" -msgid "Tasklist" -msgstr "Lista de tareas" - -#: -msgctxt "#32154" -msgid "No Task" -msgstr "Sin Tareas" - -#: -msgctxt "#32155" -msgid "Search: Hyperion Server" -msgstr "Buscar: Servidor Hyperion" - -#: -msgctxt "#32044" -msgid "Blackbar detector" -msgstr "Detección de bordes negros" - -#: -msgctxt "#32040" -msgid "Screen Capture" -msgstr "Captura de Plataforma" - -#: -msgctxt "#32100" -msgid "Welcome to Hyperion Control!" -msgstr "Bienvenidol Control de Hyperion!" - -#: -msgctxt "#32103" -msgid "We found the following Hyperion Server for usage:" -msgstr "Encontramos los siguientes servidores Hyperion para su uso:" - -#: -msgctxt "#32046" -msgid "Boblight Server" -msgstr "Servidor Boblight" - -#: -msgctxt "#32047" -msgid "Hyperion" -msgstr "Hyperion" - -#: -msgctxt "#32048" -msgid "Audio Capture" -msgstr "Captura del Audio" - diff --git a/script.service.hyperion-control/resources/language/resource.language.fr_fr/strings.po b/script.service.hyperion-control/resources/language/resource.language.fr_fr/strings.po deleted file mode 100644 index 72f022042..000000000 --- a/script.service.hyperion-control/resources/language/resource.language.fr_fr/strings.po +++ /dev/null @@ -1,196 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: POEditor.com\n" -"Project-Id-Version: Hyperion Control\n" -"Language: fr\n" - -#: -msgctxt "#32000" -msgid "General" -msgstr "Général" - -#: -msgctxt "#32001" -msgid "Hyperion IP" -msgstr "Adresse IP Hyperion" - -#: -msgctxt "#32002" -msgid "Hyperion Webserver Port" -msgstr "Port Webserver Hyperion" - -#: -msgctxt "#32003" -msgid "Switch automatically between 2D/3D" -msgstr "Basculer automatiquement entre 2D/3D" - -#: -msgctxt "#32004" -msgid "Enable Hyperion on startup" -msgstr "Activer Hyperion au démarrage" - -#: -msgctxt "#32005" -msgid "Disable Hyperion on shutdown" -msgstr "Désactiver Hyperion à l'extinction" - -#: -msgctxt "#32007" -msgid "Show changelog after update" -msgstr "Afficher le changelog après la mise à jour" - -#: -msgctxt "#32008" -msgid "Authorization Token" -msgstr "Token d'autorisation" - -#: -msgctxt "#32025" -msgid "Component" -msgstr "Composant" - -#: -msgctxt "#32026" -msgid "Enable the chosen component in these situations else disable it." -msgstr "Activer le composant pour ces situations sinon le désactiver." - -#: -msgctxt "#32027" -msgid "Hyperion component" -msgstr "Composant Hyperion" - -#: -msgctxt "#32028" -msgid "Enable during video playback" -msgstr "Activer durant la lecture vidéo" - -#: -msgctxt "#32029" -msgid "Enable during music playback" -msgstr "Activer durant la lecture audio" - -#: -msgctxt "#32030" -msgid "Enable during player pause" -msgstr "Activer pendant la pause du lecteur" - -#: -msgctxt "#32031" -msgid "Enable in Kodi menu" -msgstr "Activer dans le menu de Kodi" - -#: -msgctxt "#32032" -msgid "Enable during active screensaver" -msgstr "Activer quand l'économiseur d'écran est actif" - -#: -msgctxt "#32041" -msgid "USB Capture" -msgstr "Capture USB" - -#: -msgctxt "#32042" -msgid "LED Hardware" -msgstr "LEDs" - -#: -msgctxt "#32043" -msgid "Smoothing" -msgstr "Lissage" - -#: -msgctxt "#32045" -msgid "Forwarder" -msgstr "Forwarder" - -#: -msgctxt "#32101" -msgid "Would you like to search for a Hyperion Server and adjust settings?" -msgstr "Voulez vous chercher un serveur Hyperion et mettre à jour les paramètres ?" - -#: -msgctxt "#32102" -msgid "Select a Hyperion Server, we found more than one" -msgstr "Plusieurs serveurs Hyperion ont été trouvés, veuillez en sélectionner un" - -#: -msgctxt "#32104" -msgid "We are sorry, no Hyperion Server has been found. You need to configure IP address and port by hand" -msgstr "Désolé, aucun serveur Hyperion trouvé. Configurez l'adresse IP et le port manuellement." - -#: -msgctxt "#32105" -msgid "The Authorization Token isn't valid" -msgstr "Le token d'autorisation n'est pas valide" - -#: -msgctxt "#32150" -msgid "Execute" -msgstr "Exécuter" - -#: -msgctxt "#32151" -msgid "Execute a specific task you might need again.[CR]Select a task from the tasklist and press OK to close the settings dialog." -msgstr "Exécuter une tâche spécifique dont vous pourriez avoir besoin à nouveau.\n" -"Choisir une tâche dans la liste et appuyer sur OK pour fermer la boite de dialogue." - -#: -msgctxt "#32152" -msgid "The addon will handle your request immediately.[CR]Be aware that the addon should be already enabled" -msgstr "L'addon va exécuter votre requête immédiatement.\n" -"Attention : l'addon doit déjà être actif" - -#: -msgctxt "#32153" -msgid "Tasklist" -msgstr "Liste de tâches" - -#: -msgctxt "#32154" -msgid "No Task" -msgstr "Pas de tâche" - -#: -msgctxt "#32155" -msgid "Search: Hyperion Server" -msgstr "Recherche : serveur Hyperion" - -#: -msgctxt "#32044" -msgid "Blackbar detector" -msgstr "Détecteur de bandes noires" - -#: -msgctxt "#32040" -msgid "Screen Capture" -msgstr "Capture interne" - -#: -msgctxt "#32100" -msgid "Welcome to Hyperion Control!" -msgstr "Bienvenue dans l'addon Hyperion!" - -#: -msgctxt "#32103" -msgid "We found the following Hyperion Server for usage:" -msgstr "Le serveur Hyperion suivant a été trouvé pour utilisation:" - -#: -msgctxt "#32046" -msgid "Boblight Server" -msgstr "Serveur Boblight" - -#: -msgctxt "#32047" -msgid "Hyperion" -msgstr "Hyperion" - -#: -msgctxt "#32048" -msgid "Audio Capture" -msgstr "Capture Audio" - diff --git a/script.service.hyperion-control/resources/language/resource.language.hu_hu/strings.po b/script.service.hyperion-control/resources/language/resource.language.hu_hu/strings.po deleted file mode 100644 index 49e70f80d..000000000 --- a/script.service.hyperion-control/resources/language/resource.language.hu_hu/strings.po +++ /dev/null @@ -1,194 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: POEditor.com\n" -"Project-Id-Version: Hyperion Control\n" -"Language: hu\n" - -#: -msgctxt "#32000" -msgid "General" -msgstr "Általános" - -#: -msgctxt "#32001" -msgid "Hyperion IP" -msgstr "Hyperion IP" - -#: -msgctxt "#32002" -msgid "Hyperion Webserver Port" -msgstr "Hyperion Webserver Port" - -#: -msgctxt "#32003" -msgid "Switch automatically between 2D/3D" -msgstr "Automatikus átkapcsolás 2D/3D" - -#: -msgctxt "#32004" -msgid "Enable Hyperion on startup" -msgstr "Hyperion automatikus indítás" - -#: -msgctxt "#32005" -msgid "Disable Hyperion on shutdown" -msgstr "Hyperion kikapcsolása leállításkor" - -#: -msgctxt "#32007" -msgid "Show changelog after update" -msgstr "Változásnapló megjelenítése frissítés után" - -#: -msgctxt "#32008" -msgid "Authorization Token" -msgstr "Hozzáférési Token" - -#: -msgctxt "#32025" -msgid "Component" -msgstr "Komponens" - -#: -msgctxt "#32026" -msgid "Enable the chosen component in these situations else disable it." -msgstr "Engedélyezze a kiválasztott összetevőt, ellenkező esetben tiltsa le." - -#: -msgctxt "#32027" -msgid "Hyperion component" -msgstr "Hyperion komponens" - -#: -msgctxt "#32028" -msgid "Enable during video playback" -msgstr "Engedélyezés videólejátszás közben" - -#: -msgctxt "#32029" -msgid "Enable during music playback" -msgstr "Engedélyezés zenelejátszás közben" - -#: -msgctxt "#32030" -msgid "Enable during player pause" -msgstr "Engedélyezés lejátszási szünetben" - -#: -msgctxt "#32031" -msgid "Enable in Kodi menu" -msgstr "Engedélyezés a Kodi menüben" - -#: -msgctxt "#32032" -msgid "Enable during active screensaver" -msgstr "Engedélyezés aktív képernyővédő alatt" - -#: -msgctxt "#32041" -msgid "USB Capture" -msgstr "USB Capture" - -#: -msgctxt "#32042" -msgid "LED Hardware" -msgstr "LED Hardver" - -#: -msgctxt "#32043" -msgid "Smoothing" -msgstr "Símítás" - -#: -msgctxt "#32045" -msgid "Forwarder" -msgstr "Továbbító" - -#: -msgctxt "#32101" -msgid "Would you like to search for a Hyperion Server and adjust settings?" -msgstr "Szeretne keresni egy Hyperion szervert és módosítani a beállításokat?" - -#: -msgctxt "#32102" -msgid "Select a Hyperion Server, we found more than one" -msgstr "Válasszon egy Hyperion kiszolgálót, többet is találtunk" - -#: -msgctxt "#32104" -msgid "We are sorry, no Hyperion Server has been found. You need to configure IP address and port by hand" -msgstr "Sajnáljuk, nem található Hyperion Server. Az IP-címet és a portot kézzel kell konfigurálnia!" - -#: -msgctxt "#32105" -msgid "The Authorization Token isn't valid" -msgstr "Az engedélyezési token nem érvényes" - -#: -msgctxt "#32150" -msgid "Execute" -msgstr "Végrehajtás" - -#: -msgctxt "#32151" -msgid "Execute a specific task you might need again.[CR]Select a task from the tasklist and press OK to close the settings dialog." -msgstr "Hajtsa végre újra az adott feladatot, amelyre szüksége lehet.[CR]Válasszon ki egy feladatot a feladatlistából, és nyomja meg az OK gombot a beállítások párbeszédpanel bezárásához." - -#: -msgctxt "#32152" -msgid "The addon will handle your request immediately.[CR]Be aware that the addon should be already enabled" -msgstr "A bővítmény azonnal kezeli a kérést.[CR]Ne feledje, hogy a kiegészítőnek már engedélyezve kell lennie" - -#: -msgctxt "#32153" -msgid "Tasklist" -msgstr "Feladat lista" - -#: -msgctxt "#32154" -msgid "No Task" -msgstr "Nincs feladat" - -#: -msgctxt "#32155" -msgid "Search: Hyperion Server" -msgstr "Keresés: Hyperion Server" - -#: -msgctxt "#32044" -msgid "Blackbar detector" -msgstr "Feketesáv detector" - -#: -msgctxt "#32040" -msgid "Screen Capture" -msgstr "Screen Capture" - -#: -msgctxt "#32100" -msgid "Welcome to Hyperion Control!" -msgstr "Üdvözli a Hyperion Control!" - -#: -msgctxt "#32103" -msgid "We found the following Hyperion Server for usage:" -msgstr "A következő Hyperion szervert találtuk használatra:" - -#: -msgctxt "#32046" -msgid "Boblight Server" -msgstr "Boblight Server" - -#: -msgctxt "#32047" -msgid "Hyperion" -msgstr "Hyperion" - -#: -msgctxt "#32048" -msgid "Audio Capture" -msgstr "Hangrögzítés" - diff --git a/script.service.hyperion-control/resources/language/resource.language.pl_pl/strings.po b/script.service.hyperion-control/resources/language/resource.language.pl_pl/strings.po deleted file mode 100644 index bba29cecb..000000000 --- a/script.service.hyperion-control/resources/language/resource.language.pl_pl/strings.po +++ /dev/null @@ -1,194 +0,0 @@ -msgid "" -msgstr "" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: POEditor.com\n" -"Project-Id-Version: Hyperion Control\n" -"Language: pl\n" - -#: -msgctxt "#32000" -msgid "General" -msgstr "Ogólne" - -#: -msgctxt "#32001" -msgid "Hyperion IP" -msgstr "Hyperion IP" - -#: -msgctxt "#32002" -msgid "Hyperion Webserver Port" -msgstr "Port Hyperion Webserver" - -#: -msgctxt "#32003" -msgid "Switch automatically between 2D/3D" -msgstr "Zmieniaj automatycznie 2D/3D" - -#: -msgctxt "#32004" -msgid "Enable Hyperion on startup" -msgstr "Uruchom Hyperion wraz ze startem systemu" - -#: -msgctxt "#32005" -msgid "Disable Hyperion on shutdown" -msgstr "Wyłącz Hyperion przy zamknięciu systemu" - -#: -msgctxt "#32007" -msgid "Show changelog after update" -msgstr "Pokaż dziennik zmian po aktualizacji" - -#: -msgctxt "#32008" -msgid "Authorization Token" -msgstr "Token autoryzacyjny" - -#: -msgctxt "#32025" -msgid "Component" -msgstr "Komponent" - -#: -msgctxt "#32026" -msgid "Enable the chosen component in these situations else disable it." -msgstr "Włącz wybrany komponent w wybranych sytuacjach - w przeciwnym wypadku wyłącz komponent." - -#: -msgctxt "#32027" -msgid "Hyperion component" -msgstr "Komponent Hyperion" - -#: -msgctxt "#32028" -msgid "Enable during video playback" -msgstr "Włącz podczas odtwarzania wideo" - -#: -msgctxt "#32029" -msgid "Enable during music playback" -msgstr "Włącz podczas odtwarzania muzyki" - -#: -msgctxt "#32030" -msgid "Enable during player pause" -msgstr "Włącz podczas zapauzowania odtwarzacza" - -#: -msgctxt "#32031" -msgid "Enable in Kodi menu" -msgstr "Włącz w menu Kodi" - -#: -msgctxt "#32032" -msgid "Enable during active screensaver" -msgstr "Włącz podczas aktywnego wygaszacza ekranu" - -#: -msgctxt "#32041" -msgid "USB Capture" -msgstr "Przechwytywanie USB" - -#: -msgctxt "#32042" -msgid "LED Hardware" -msgstr "Sprzęt LED" - -#: -msgctxt "#32043" -msgid "Smoothing" -msgstr "Wygładzanie" - -#: -msgctxt "#32045" -msgid "Forwarder" -msgstr "Przekierowywacz" - -#: -msgctxt "#32101" -msgid "Would you like to search for a Hyperion Server and adjust settings?" -msgstr "Czy chcesz wyszukać serwer Hyperion i dostosować ustawienia?" - -#: -msgctxt "#32102" -msgid "Select a Hyperion Server, we found more than one" -msgstr "Wybierz serwer Hyperion, znaleziono więcej niż jeden" - -#: -msgctxt "#32104" -msgid "We are sorry, no Hyperion Server has been found. You need to configure IP address and port by hand" -msgstr "Niestety, nie znaleziono serwera Hyperion. Skonfiguruj adres IP oraz port manualnie" - -#: -msgctxt "#32105" -msgid "The Authorization Token isn't valid" -msgstr "Nieprawidłowy token autoryzacyjny" - -#: -msgctxt "#32150" -msgid "Execute" -msgstr "Wykonaj" - -#: -msgctxt "#32151" -msgid "Execute a specific task you might need again.[CR]Select a task from the tasklist and press OK to close the settings dialog." -msgstr "Wykonaj zadanie ponownie. Wybierz zadanie z listy zadań i wciśnij OK aby zamknąć okno ustawień." - -#: -msgctxt "#32152" -msgid "The addon will handle your request immediately.[CR]Be aware that the addon should be already enabled" -msgstr "Twoje zadanie zostanie wykonane natychmiastowo. Miej na uwadze, że addon powinien być wcześniej włączony" - -#: -msgctxt "#32153" -msgid "Tasklist" -msgstr "Lista zadań" - -#: -msgctxt "#32154" -msgid "No Task" -msgstr "Brak zadania" - -#: -msgctxt "#32155" -msgid "Search: Hyperion Server" -msgstr "Wyszukaj: Serwer Hyperion" - -#: -msgctxt "#32044" -msgid "Blackbar detector" -msgstr "Detekcja czarnych ramek" - -#: -msgctxt "#32040" -msgid "Screen Capture" -msgstr "Przechwytywanie platformy" - -#: -msgctxt "#32100" -msgid "Welcome to Hyperion Control!" -msgstr "Witaj w Hyperion Control!" - -#: -msgctxt "#32103" -msgid "We found the following Hyperion Server for usage:" -msgstr "Znaleziono następujący serwer Hyperion:" - -#: -msgctxt "#32046" -msgid "Boblight Server" -msgstr "Server Boblight" - -#: -msgctxt "#32047" -msgid "Hyperion" -msgstr "Hyperion" - -#: -msgctxt "#32048" -msgid "Audio Capture" -msgstr "Przechwytywanie Dźwięku" - diff --git a/script.service.hyperion-control/resources/lib/__init__.py b/script.service.hyperion-control/resources/lib/__init__.py deleted file mode 100644 index ba7fe2645..000000000 --- a/script.service.hyperion-control/resources/lib/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Hyperion control addon library.""" diff --git a/script.service.hyperion-control/resources/lib/api_client.py b/script.service.hyperion-control/resources/lib/api_client.py deleted file mode 100644 index d211c42fa..000000000 --- a/script.service.hyperion-control/resources/lib/api_client.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Hyperion JSON RPC/HTTP(S) API client.""" -from __future__ import annotations - -import contextlib -import random -import string -from json import JSONDecodeError -from typing import Any - -import requests -from requests.exceptions import ConnectTimeout - -from resources.lib.interfaces import GuiHandler -from resources.lib.interfaces import Logger -from resources.lib.interfaces import SettingsManager - - -class ApiClient: - """Manages the request to the hyperion server.""" - - def __init__( - self, logger: Logger, gui: GuiHandler, settings: SettingsManager - ) -> None: - self._settings = settings - self._logger = logger - self._gui = gui - self._session = requests.Session() - - @property - def headers(self) -> dict[str, str]: - """Request headers.""" - headers = {"Content-type": "application/json"} - if self._settings.auth_token: - headers["Authorization"] = f"token {self._settings.auth_token}" - return headers - - def _send( - self, body: dict[str, Any], timeout: float = 0.5 - ) -> dict[str, Any] | None: - url = self._settings.base_url - logger = self._logger - logger.log(f"Send to: {url} payload: {body}") - with contextlib.suppress(ConnectTimeout, JSONDecodeError): - response = self._session.post( - url, json=body, headers=self.headers, timeout=timeout - ) - json_content = response.json() - if json_content.get("success"): - return json_content.get("info") - if json_content["error"] == "No Authorization": - self._gui.notify_text("Error: No Authorization, API Token required") - logger.error(json_content["error"]) - return None - - def needs_auth(self) -> bool: - """Whether the hyperion server needs API authentication.""" - if res := self._send({"command": "authorize", "subcommand": "tokenRequired"}): - return res["required"] - return False - - def get_token(self) -> str: - """Requests the authentication token.""" - pool = string.ascii_uppercase + string.ascii_lowercase + string.digits - control_code = "".join(random.choice(pool) for _ in range(16)) - message = { - "command": "authorize", - "subcommand": "requestToken", - "comment": "Kodi Hyperion Control", - "id": control_code, - } - return res["token"] if (res := self._send(message, timeout=180)) else "" - - def send_component_state(self, component: str, state: bool) -> None: - """Sends the component state.""" - body = { - "command": "componentstate", - "componentstate": {"component": component, "state": state}, - } - if component == "FORWARDER": - self.switch_to_instance(0) - self._send(body) - else: - self.send_to_all_instances(body) - - def send_video_mode(self, mode: str) -> None: - """Sends the current video mode.""" - self._send({"command": "videoMode", "videoMode": mode}) - - def get_server_info(self) -> dict[str, Any] | None: - """Gets the server info.""" - return self._send({"command": "serverinfo"}) - - def get_instances(self) -> list[dict[str, Any]]: - """Gets the server info.""" - server_info = self.get_server_info() - return server_info["instance"] if server_info else [] - - def switch_to_instance(self, instance_num: int) -> None: - """Switches to the specified instance.""" - self._send( - {"command": "instance", "subcommand": "switchTo", "instance": instance_num} - ) - - def send_to_all_instances(self, body: dict[str, Any]) -> None: - """Sends a command to all instances.""" - for instance in self.get_instances(): - self.switch_to_instance(instance["instance"]) - self._send(body) diff --git a/script.service.hyperion-control/resources/lib/gui.py b/script.service.hyperion-control/resources/lib/gui.py deleted file mode 100644 index 8bb6410ea..000000000 --- a/script.service.hyperion-control/resources/lib/gui.py +++ /dev/null @@ -1,80 +0,0 @@ -"""Kodi GUI handler.""" -from __future__ import annotations - -import xbmcaddon -import xbmcgui - -from resources.lib import ssdp -from resources.lib.interfaces import SettingsManager - - -class GuiHandler: - """Kodi GUI handler.""" - - def __init__( - self, addon: xbmcaddon.Addon, settings_manager: SettingsManager - ) -> None: - self._addon = addon - self._settings = settings_manager - self._dialog = xbmcgui.Dialog() # TODO: DI with embedded getlocalizedstring - self._addon_name = addon.getAddonInfo("name") - self._addon_icon = addon.getAddonInfo("icon") - - def _get_localized_string(self, label_id: int) -> str: - """Returns the localized string of a label ID.""" - return self._addon.getLocalizedString(label_id) - - def notify_label(self, label_id: int) -> None: - """Displays a notification with the localized message.""" - message = self._get_localized_string(label_id) - self.notify_text(message, time=1000, icon=self._addon_icon) - - def notify_text( - self, message: str, time: int = 3000, icon: str = xbmcgui.NOTIFICATION_INFO - ) -> None: - """Displays a notification.""" - self._dialog.notification(self._addon_name, message, icon, time) - - def do_ssdp_discovery(self) -> None: - """Perform the SSDP discovery and lets the user choose the service.""" - servers = ssdp.discover() - - if not servers: - self._dialog.ok("Hyperion Control", self._get_localized_string(32104)) - return - # if there is more than one entry the user should select one - if len(servers) > 1: - selection_idx = self._dialog.select( - self._get_localized_string(32102), build_select_list(servers) - ) - selected_server = servers[selection_idx] if selection_idx > -1 else None - else: - selected_server = servers[0] - self._dialog.ok( - "Hyperion Control", - f'{self._get_localized_string(32103)}[CR]{selected_server["ip"]}:{selected_server["port"]}', - ) - - if selected_server: - self._settings.address = selected_server["ip"] - self._settings.port = selected_server["port"] - - def do_initial_wizard(self) -> None: - """Displays the initial wizard.""" - if self._dialog.yesno( - "Hyperion Control", - f"{self._get_localized_string(32100)}[CR]{self._get_localized_string(32101)}", - ): - self.do_ssdp_discovery() - self._addon.openSettings() - - def do_changelog_display(self) -> None: - """Displays the changelog.""" - if self._settings.current_version != self._addon.getAddonInfo("version"): - self._dialog.textviewer( - "Hyperion Control - Changelog", self._addon.getAddonInfo("changelog") - ) - - -def build_select_list(data: list[dict[str, str | int | None]]) -> list[str]: - return [f"{item['ip']}:{item['port']}" for item in data] diff --git a/script.service.hyperion-control/resources/lib/hyperion.py b/script.service.hyperion-control/resources/lib/hyperion.py deleted file mode 100644 index cba18bd80..000000000 --- a/script.service.hyperion-control/resources/lib/hyperion.py +++ /dev/null @@ -1,109 +0,0 @@ -"""Hyperion Controller.""" -from __future__ import annotations - -from collections.abc import Callable - -from resources.lib.interfaces import ApiClient -from resources.lib.interfaces import GuiHandler -from resources.lib.interfaces import Logger -from resources.lib.interfaces import SettingsManager - - -class Hyperion: - """Main instance class.""" - - def __init__( - self, - settings_manager: SettingsManager, - logger: Logger, - gui_handler: GuiHandler, - api_client: ApiClient, - get_video_mode_function: Callable[[], str], - addon_version: str, - ) -> None: - self._prev_video_mode = "2D" - - self._addon_version = addon_version - self._client = api_client - self._settings = settings_manager - self._logger = logger - self._gui = gui_handler - self._video_mode_fn = get_video_mode_function - - self._kodi_state: str = "menu" - self._prev_comp_state: bool | None = None - self._initialize() - - def _initialize(self) -> None: - # check for changelog display, but not on first run - settings = self._settings - if settings.should_display_changelog: - self._gui.do_changelog_display() - - # check for setup wizard - if settings.first_run: - # be sure to fill in the current version - settings.set_addon_version(self._addon_version) - self._gui.do_initial_wizard() - - if settings.enable_hyperion: - self._client.send_component_state("ALL", True) - settings.set_first_run_done() - - def notify(self, command: str) -> None: - """Process the commands sent by the observables.""" - self._logger.log(f"received command: {command}") - if command == "updateSettings": - self.update_settings() - else: - self._kodi_state = command - self._update_state() - - def update_settings(self) -> None: - """Update the settings.""" - settings = self._settings - settings.read_settings() - - auth_token = settings.auth_token - if auth_token and len(auth_token) != 36: - self._gui.notify_label(32105) - - # Checkout Tasklist for pending tasks - if settings.tasks == 1: - settings.set_tasks(0) - self._gui.do_ssdp_discovery() - - def _update_state(self) -> None: - comp_state = self._get_comp_state() - if self._prev_comp_state != comp_state: - self._client.send_component_state(self._settings.target_comp, comp_state) - self._prev_comp_state = comp_state - - # update stereoscopic mode always, better apis for detection available? - # Bug: race condition, return of jsonapi has wrong gui state - # after onPlayBackStopped after a 3D movie - if self._settings.video_mode_enabled: - new_mode = self._video_mode_fn() - if self._prev_video_mode != new_mode: - self._client.send_video_mode(new_mode) - self._prev_video_mode = new_mode - - def _get_comp_state(self) -> bool: - """Get the desired state of the target component based on kodi state.""" - settings = self._settings - state = self._kodi_state - if state == "screensaver": - return settings.screensaver_enabled - if state == "pause": - return settings.pause_enabled - if state == "playAudio": - return settings.audio_enabled - if state == "playVideo": - return settings.video_enabled - return settings.menu_enabled - - def stop(self) -> None: - """Stops the hyperion control.""" - if self._settings.disable_hyperion: - self._client.send_component_state("ALL", False) - self._logger.log("Hyperion-control stopped") diff --git a/script.service.hyperion-control/resources/lib/interfaces.py b/script.service.hyperion-control/resources/lib/interfaces.py deleted file mode 100644 index 32e9d4343..000000000 --- a/script.service.hyperion-control/resources/lib/interfaces.py +++ /dev/null @@ -1,98 +0,0 @@ -"""Observer interface.""" -from typing import Protocol - - -class Observer(Protocol): - """Observer interface.""" - - def notify(self, command: str) -> None: - """Process the received command.""" - pass - - -class Logger(Protocol): - """Logger interface.""" - - def log(self, message: str, level: int = 0) -> None: - """Logs a message.""" - - def debug(self, message: str) -> None: - """Writes a debug message to the log.""" - - def info(self, message: str) -> None: - """Writes an info message to the log.""" - - def error(self, message: str) -> None: - """Writes an error message to the log.""" - - -class SettingsManager(Protocol): - """Settings manager interface.""" - - auth_token: str - current_version: str - address: str - port: int - video_mode_enabled: bool - enable_hyperion: bool - disable_hyperion: bool - target_comp: str - screensaver_enabled: bool - video_enabled: bool - audio_enabled: bool - pause_enabled: bool - menu_enabled: bool - show_changelog_on_update: bool - tasks: int - first_run: bool - - @property - def should_display_changelog(self) -> bool: - """Whether the changelog should be displayed.""" - pass - - @property - def base_url(self) -> str: - """Hyperion server JSON RPC base url.""" - pass - - def set_tasks(self, value: int) -> None: - """Sets the tasks to run.""" - - def set_addon_version(self, value: str) -> None: - """Sets the current addon version for changelog checks.""" - - def set_first_run_done(self) -> None: - """Sets the first run settings to false.""" - - def read_settings(self) -> None: - """Read all settings.""" - - -class GuiHandler(Protocol): - """GUI handler interface.""" - - def notify_label(self, label_id: int) -> None: - """Displays a notification with the localized message.""" - - def notify_text(self, message: str, time: int = 3000, icon: str = "info") -> None: - """Displays a notification.""" - - def do_ssdp_discovery(self) -> None: - """Perform the SSDP discovery and lets the user choose the service.""" - - def do_initial_wizard(self) -> None: - """Displays the initial wizard.""" - - def do_changelog_display(self) -> None: - """Displays the changelog.""" - - -class ApiClient(Protocol): - """API client interface.""" - - def send_component_state(self, component: str, state: bool) -> None: - """Sends the component state.""" - - def send_video_mode(self, mode: str) -> None: - """Sends the current video mode.""" diff --git a/script.service.hyperion-control/resources/lib/logger.py b/script.service.hyperion-control/resources/lib/logger.py deleted file mode 100644 index 98dd88688..000000000 --- a/script.service.hyperion-control/resources/lib/logger.py +++ /dev/null @@ -1,25 +0,0 @@ -"""Logging facility.""" -import xbmc - - -class Logger: - """Logging facility for Kodi add-ons.""" - - def __init__(self, addon_name: str) -> None: - self._addon_name = addon_name - - 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 debug(self, message: str) -> None: - """Writes a debug message to the log.""" - self.log(message) - - def info(self, message: str) -> None: - """Writes an info message to the log.""" - self.log(message, level=xbmc.LOGINFO) - - def error(self, message: str) -> None: - """Writes an error message to the log.""" - self.log(message, level=xbmc.LOGERROR) diff --git a/script.service.hyperion-control/resources/lib/monitor.py b/script.service.hyperion-control/resources/lib/monitor.py deleted file mode 100644 index 1c26ccbbf..000000000 --- a/script.service.hyperion-control/resources/lib/monitor.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Observable monitor.""" -from __future__ import annotations - -import xbmc - -from resources.lib.interfaces import Observer - - -class XBMCMonitor(xbmc.Monitor): - """xbmc monitor class.""" - - def __init__(self) -> None: - super().__init__() - self._observers: list[Observer] = [] - - def register_observer(self, observer: Observer) -> None: - """Register an observer to the events.""" - self._observers.append(observer) - - def notify_observers(self, command: str) -> None: - """Sends the command to the observers.""" - for observer in self._observers: - observer.notify(command) - - def onSettingsChanged(self) -> None: - """Settings changed event.""" - self.notify_observers("updateSettings") - - def onScreensaverActivated(self) -> None: - """Screensaver activated event.""" - self.notify_observers("screensaver") - - def onScreensaverDeactivated(self) -> None: - """Screensaver deactivated event.""" - self.notify_observers("menu") diff --git a/script.service.hyperion-control/resources/lib/player.py b/script.service.hyperion-control/resources/lib/player.py deleted file mode 100644 index e99993736..000000000 --- a/script.service.hyperion-control/resources/lib/player.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Observable player.""" -from __future__ import annotations - -import xbmc - -from resources.lib.interfaces import Observer - - -class Player(xbmc.Player): - """xbmc player class.""" - - def __init__(self) -> None: - super().__init__() - self._observers: list[Observer] = [] - - def register_observer(self, observer: Observer) -> None: - """Register an observer to the events.""" - self._observers.append(observer) - - def notify_observers(self, command: str) -> None: - """Sends the command to the observers.""" - for observer in self._observers: - observer.notify(command) - - def onPlayBackPaused(self) -> None: - """Playback paused event.""" - self.notify_observers("pause") - - def onPlayBackResumed(self) -> None: - """Playback resumed event.""" - self._play_handler() - - def onAVStarted(self) -> None: - """Audio or Video started event.""" - self._play_handler() - - def onPlayBackStopped(self) -> None: - """Playback stopped event.""" - self.notify_observers("menu") - - def onPlayBackEnded(self) -> None: - """Playback end event.""" - self.notify_observers("menu") - - def _play_handler(self) -> None: - command = "playAudio" if self.isPlayingAudio() else "playVideo" - self.notify_observers(command) diff --git a/script.service.hyperion-control/resources/lib/settings_manager.py b/script.service.hyperion-control/resources/lib/settings_manager.py deleted file mode 100644 index 66b288d49..000000000 --- a/script.service.hyperion-control/resources/lib/settings_manager.py +++ /dev/null @@ -1,175 +0,0 @@ -"""Settings manager.""" -from __future__ import annotations - -from typing import TYPE_CHECKING -from typing import Any - -from resources.lib.interfaces import Logger - -if TYPE_CHECKING: - import xbmcaddon - - -INT_TO_COMP_STRING = { - 0: "GRABBER", - 1: "V4L", - 2: "AUDIO", - 3: "LEDDEVICE", - 4: "SMOOTHING", - 5: "BLACKBORDER", - 6: "FORWARDER", - 7: "BOBLIGHTSERVER", - 8: "ALL", -} - - -class SettingsManager: - """Class which contains all addon settings.""" - - def __init__( - self, settings: xbmcaddon.Settings, logger: Logger, addon: xbmcaddon.Addon - ) -> None: - self._logger = logger - self.rev = 0 - self._settings = settings - self._addon = addon - self.current_version: str = "" - self._address: str = "localhost" - self._port: int = 8090 - self._base_url = "http://localhost:8090/json-rpc" - self.video_mode_enabled: bool - self.enable_hyperion: bool - self.disable_hyperion: bool - self.auth_token: str - self.target_comp: str - self.screensaver_enabled: bool - self.video_enabled: bool - self.audio_enabled: bool - self.pause_enabled: bool - self.menu_enabled: bool - self.show_changelog_on_update: bool - self.tasks: int - self.first_run: bool - self.read_settings() - - @property - def address(self) -> str: - """Hyperion server address.""" - return self._address - - @address.setter - def address(self, value: str) -> None: - """Hyperion server address.""" - self._address = value - self._update_url() - self._set_string("ip", value) - - @property - def port(self) -> int: - """Hyperion server port.""" - return self._port - - @port.setter - def port(self, value: int) -> None: - """Hyperion server port.""" - self._port = value - self._update_url() - self._set_int("port", value) - - def _update_url(self) -> None: - self._base_url = f"http://{self._address}:{self._port}/json-rpc" - - @property - def base_url(self) -> str: - """Hyperion server JSON RPC base url.""" - return self._base_url - - @property - def should_display_changelog(self) -> bool: - """Whether the changelog should be displayed.""" - return self.show_changelog_on_update and not self.first_run - - def _set_string(self, name: str, value: str) -> None: - self._addon.setSettingString(name, value) - outcome = value == self._settings.getString(name) - self._log_set_outcome(name, value, outcome) - - def _set_int(self, name: str, value: int) -> None: - self._addon.setSettingInt(name, value) - outcome = value == self._settings.getInt(name) - self._log_set_outcome(name, value, outcome) - - def _set_bool(self, name: str, value: bool) -> None: - self._addon.setSettingBool(name, value) - outcome = value == self._settings.getBool(name) - self._log_set_outcome(name, value, outcome) - - def _log_set_outcome(self, name: str, value: Any, outcome: bool) -> None: - if not outcome: - self._logger.error(f"Error setting {name} to {value} (outcome={outcome})") - else: - self._logger.log(f"Set {name} to {value}") - - def set_tasks(self, value: int) -> None: - """Sets the tasks to run.""" - self._set_int("tasks", value) - self.tasks = value - - def set_addon_version(self, value: str) -> None: - """Sets the current addon version for changelog checks.""" - self._set_string("currAddonVersion", value) - self.current_version = value - - def set_first_run_done(self) -> None: - """Sets the first run settings to false.""" - self._set_bool("firstRun", False) - self.first_run = False - - def read_settings(self) -> None: - """Read all settings.""" - settings = self._settings - get_bool = settings.getBool - get_string = settings.getString - get_int = settings.getInt - self._address = get_string("ip") - self._port = get_int("port") - self._update_url() - self.auth_token = get_string("authToken") - self.video_mode_enabled = get_bool("videoModeEnabled") - self.enable_hyperion = get_bool("enableHyperion") - self.disable_hyperion = get_bool("disableHyperion") - self.show_changelog_on_update = get_bool("showChangelogOnUpdate") - self.first_run = get_bool("firstRun") - self.current_version = get_string("currAddonVersion") - - self.target_comp = INT_TO_COMP_STRING.get( - get_int("targetComponent"), "NOT_FOUND" - ) - self.video_enabled = get_bool("videoEnabled") - self.audio_enabled = get_bool("audioEnabled") - self.pause_enabled = get_bool("pauseEnabled") - self.menu_enabled = get_bool("menuEnabled") - self.screensaver_enabled = get_bool("screensaverEnabled") - self.tasks = get_int("tasks") - self.rev += 1 - - self._log_settings() - - def _log_settings(self) -> None: - log = self._logger.log - log("Settings updated!") - log(f"Hyperion ip: {self.address}") - log(f"Hyperion port: {self.port}") - log(f"Enable H on start: {self.enable_hyperion}") - log(f"Disable H on stop: {self.disable_hyperion}") - log(f"VideoMode enabled: {self.video_mode_enabled}") - log(f"Hyperion target comp: {self.target_comp}") - log(f"Screensaver enabled: {self.screensaver_enabled}") - log(f"Video enabled: {self.video_enabled}") - log(f"Audio enabled: {self.audio_enabled}") - log(f"Pause enabled: {self.pause_enabled}") - log(f"Menu enabled: {self.menu_enabled}") - log(f"ChangelogOnUpdate: {self.show_changelog_on_update}") - log(f"tasks: {self.tasks}") - log(f"first run: {self.first_run}") - log(f"current version: {self.current_version}") diff --git a/script.service.hyperion-control/resources/lib/ssdp.py b/script.service.hyperion-control/resources/lib/ssdp.py deleted file mode 100644 index 6340ddbe7..000000000 --- a/script.service.hyperion-control/resources/lib/ssdp.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -Hyperion UPnP / SSDP service discovery. - -Copyright 2014 Dan Krause -Copyright 2023 Andrea Ghensi - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -All credits to Dan Krause at Github: https://gist.github.com/dankrause/6000248 -""" -from __future__ import annotations - -import http.client -import socket -from io import BytesIO -from typing import Any - - -class _FakeSocket(BytesIO): - """Fake socket to make ssdp response compatible with HTTPResponse.""" - - def makefile(self, *_args: Any, **_kw: Any) -> BytesIO: - """Duck-types the call to make the socket available.""" - return self - - -def _parse_location(location: str | None) -> tuple[str, int]: - if location is None: - return "", 0 - start = location.find("//") + 2 - end = location.rfind("/") - hostname, port = location[start:end].split(":") - return hostname, int(port) - - -class SSDPResponse: - """ - Response from SSDP discovery. - - Typical Hyperion response: - - CACHE-CONTROL: max-age = 1800 - DATE: Sun, 23 Jul 2023 19:58:01 G7T19444 - EXT: - LOCATION: http://192.168.2.180:8090/description.xml - SERVER: LibreELEC (official): 11.0.1/11.0 UPnP/1.0 Hyperion/2.0.16-beta.1+PR1617 - ST: urn:hyperion-project.org:device:basic:1 - USN: uuid:04928741-2192-5c24-93e6-638c9a184443 - HYPERION-FBS-PORT: 19400 - HYPERION-JSS-PORT: 19444 - HYPERION-NAME: My Hyperion Config - """ - - def __init__(self, response: bytes) -> None: - r = http.client.HTTPResponse(_FakeSocket(response)) # type: ignore - r.begin() - hostname, port = _parse_location(r.getheader("location")) - self.hostname = hostname - self.port = port - self.usn = r.getheader("usn") - self.st = r.getheader("st") - cache = r.getheader("cache-control") - self.cache = cache.split("=")[1] if cache else "" - - -def discover(timeout: int = 3, retries: int = 1, mx: int = 2) -> list[dict[str, Any]]: - service = "urn:hyperion-project.org:device:basic:1" - group = ("239.255.255.250", 1900) - lines = [ - "M-SEARCH * HTTP/1.1", - f"HOST: {group[0]}:{group[1]}", - 'MAN: "ssdp:discover"', - f"ST: {service}", - f"MX: {mx}", - "", - "", - ] - message = "\r\n".join(lines).encode("utf-8") - socket.setdefaulttimeout(timeout) - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) - sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - responses = [] - for _ in range(retries): - sock.sendto(message, group) - while True: - try: - res_data = SSDPResponse(sock.recv(1024)) - if res_data.st != service: - continue - responses.append( - { - "ip": res_data.hostname, - "port": res_data.port, - "usn": res_data.usn, - } - ) - except socket.timeout: - break - sock.close() - return responses diff --git a/script.service.hyperion-control/resources/lib/utils.py b/script.service.hyperion-control/resources/lib/utils.py deleted file mode 100644 index 936047003..000000000 --- a/script.service.hyperion-control/resources/lib/utils.py +++ /dev/null @@ -1,25 +0,0 @@ -"""Stereoscopic mode detection.""" -import json - -import xbmc - -from resources.lib.interfaces import Logger - - -def get_stereoscopic_mode(logger: Logger) -> str: - """Returns the currently active stereoscopic mode.""" - msg = { - "jsonrpc": "2.0", - "method": "GUI.GetProperties", - "params": {"properties": ["stereoscopicmode"]}, - "id": 669, - } - try: - response = json.loads(xbmc.executeJSONRPC(json.dumps(msg))) - mode = response["result"]["stereoscopicmode"]["mode"] - except Exception: - logger.error("Error executing JSONRPC call") - return "2D" - if mode == "split_vertical": - return "3DSBS" - return "3DTAB" if mode == "split_horizontal" else "2D" diff --git a/script.service.hyperion-control/resources/screenshot-01.png b/script.service.hyperion-control/resources/screenshot-01.png deleted file mode 100644 index ed4e2c262a54d1ca26c88c2e146ec51648678455..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226746 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

    EIekBF>Wd)=WnrVo*l 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 Hu0mjfFPA_a diff --git a/script.service.hyperion-control/resources/settings.xml b/script.service.hyperion-control/resources/settings.xml deleted file mode 100644 index a9323f216..000000000 --- a/script.service.hyperion-control/resources/settings.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/script.service.hyperion-control/service.py b/script.service.hyperion-control/service.py deleted file mode 100644 index b6c4afaf0..000000000 --- a/script.service.hyperion-control/service.py +++ /dev/null @@ -1,45 +0,0 @@ -"""Hyperion control addon entrypoint.""" -import xbmcaddon -from resources.lib.api_client import ApiClient -from resources.lib.gui import GuiHandler -from resources.lib.hyperion import Hyperion -from resources.lib.logger import Logger -from resources.lib.monitor import XBMCMonitor -from resources.lib.player import Player -from resources.lib.settings_manager import SettingsManager -from resources.lib.utils import get_stereoscopic_mode - -ADDON_NAME = "script.service.hyperion-control" - - -def main() -> None: - addon = xbmcaddon.Addon(ADDON_NAME) - logger = Logger(addon.getAddonInfo("name")) - settings_manager = SettingsManager(addon.getSettings(), logger, addon) - gui_handler = GuiHandler(addon, settings_manager) - api_client = ApiClient(logger, gui_handler, settings_manager) - - def get_video_mode_fn() -> str: - return get_stereoscopic_mode(logger) - - hyperion = Hyperion( - settings_manager, - logger, - gui_handler, - api_client, - get_video_mode_fn, - addon.getAddonInfo("version"), - ) - player = Player() - player.register_observer(hyperion) - monitor = XBMCMonitor() - monitor.register_observer(hyperion) - - while not monitor.abortRequested(): - if monitor.waitForAbort(10): - hyperion.stop() - break - - -if __name__ == "__main__": - main() diff --git a/script.service.hyperion/addon.xml b/script.service.hyperion/addon.xml deleted file mode 100644 index 553fcc18f..000000000 --- a/script.service.hyperion/addon.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - -

    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'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 - - 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/script.service.hyperion/resources/__init__.py b/script.service.hyperion/resources/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/script.service.hyperion/resources/fanart.png b/script.service.hyperion/resources/fanart.png deleted file mode 100644 index 3944f05142be3ba7fa294e3909e66ec919bea33c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70622 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 E0Jhw<#sB~S diff --git a/script.service.hyperion/resources/icon.png b/script.service.hyperion/resources/icon.png deleted file mode 100644 index c68c40a30c55901360efcc32da55d359ad927824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153145 zcmeFZWl&_zvM!9f+u$@kI5h6=?(XjH?hb=946cLwV1v64?lQQ$I|G;Z-TUmbPki^! ziTLin-5njhR#oPcnNMX^)LOl=qZH*OkP+|^z`($er6fg_!N4Fs4k5tcU_QQXJ?Eam zz?iDMRW)6ejXVI3&JN~Qwq^iVFGn+gnWvRG7?|fuQI?f6VM|@ny9u@jd|JewA?pdz z?ez;!4w;Oy8ejd3wpziksW}wP0}EK3E@QcMRhTA)bG+zz>7R3#NF3qlYExFDVI%X;&s>7< z9taOoOzT)l2R70M$db>Qx*5K+kNBRL$nq%{cNWE2&x-@N2?6*exdI_Ld~9s*JDG1; zRhJ6&cYm^9T$-F;y=9(F5>6(&-XB{L_u>r-b6@%mF0x)0J+2-WbK_5V;`|Bx{`g(o zTKE-zV$le1^>;gNqrE4(*a2$&JdZ0@+j!Jz7Oj7Wd3P)D#zYu$=z4UBKnKp=38PSs zUG_Excr39p4V@V8Wa4_r-Ww}`;+m898BV$`jb%P(&!z9$&E}}QTFKO|qI6}iRk<8s zdfFiA#t1%Myt}-g!LF;&gl@h}YED<UvDg^QKL31w`=W(tP>*9*d^>p0V$;5|@<1NES!g+t#;8fgxFe?m zFrCeMB6g0;;2KXS={BHA6vr7~hR`mfKYwBBb&=zJUan8m0W=7fD^vbnRI_4#PCTD~G&b?RV4RXS0KP`Rx%zC5Qu}bHqYteg(>)Y6ysuM22WWpe0TQVsOO_2XJL0a7NH( z@l=ygT(NgUGI~;C@|$k>%EE$=6vi(Ib7#iSth7+3{`SK@uXE=|T5M(AX=R05d1*pk z)j|F-Z4Qm%&LHY4<&nz@Y-ya5%v1e>C|eX&6qw2CM9Ey(%0D*+6B8pInc`j0oywcd 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 diff --git a/script.service.hyperion/resources/language/resource.language.de_de/strings.po b/script.service.hyperion/resources/language/resource.language.de_de/strings.po deleted file mode 100644 index 82d02c042..000000000 --- a/script.service.hyperion/resources/language/resource.language.de_de/strings.po +++ /dev/null @@ -1,63 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Hyperion Ambilight -# Addon id: script.service.hyperion -# Addon Provider: hyperion-project - -msgid "" -msgstr "" -"Project-Id-Version: Kodi Addons\n" -"Report-Msgid-Bugs-To: hyperion-project.org\n" -"Last-Translator: hyperion-project\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de-DE\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#32001" -msgid "General" -msgstr "Allgemein" - -msgctxt "#32002" -msgid "Enable addon (Grabbing)" -msgstr "Aktiviere das Addon (Grabbing)" - -msgctxt "#32003" -msgid "Hyperion hostname or IP-address" -msgstr "Hyperion Hostname oder IP-Adresse" - -msgctxt "#32004" -msgid "Hyperion host PROTO-port" -msgstr "Hyperion Host PROTO-Port" - -msgctxt "#32005" -msgid "Hyperion priority channel" -msgstr "Hyperion Priorität" - -msgctxt "#32006" -msgid "Reconnect timeout (s)" -msgstr "Zeitlimit für erneute Verbindung (s)" - -msgctxt "#32007" -msgid "Enable when on screensaver" -msgstr "Aktiviere bei Bildschirmschoner" - -msgctxt "#32008" -msgid "Grabber picture width (pixel)" -msgstr "Bildbreite (pixel)" - -msgctxt "#32010" -msgid "Frame rate (fps)" -msgstr "Bildfrequenz (fps)" - -msgctxt "#32100" -msgid "Error: Unable to connect to Hyperion. Wrong hostname or IP-address?" -msgstr "Fehler: Kann keine Verbindung zu Hyperion aufbauen. Falscher Hostname oder IP-Adresse?" - -msgctxt "#32101" -msgid "Error: Unable to send image to Hyperion. Wrong PROTO-port?" -msgstr "Fehler: Kann kein Bild an Hyperion senden. Falscher PROTO-Port?" - -msgctxt "#32102" -msgid "ATTENTION: Higher the values below may lead to performance issues" -msgstr "ACHTUNG: Ein Erhöhen der folgenden Werte kann zu hoher CPU-Last führen" diff --git a/script.service.hyperion/resources/language/resource.language.en_gb/strings.po b/script.service.hyperion/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index f52092c6f..000000000 --- a/script.service.hyperion/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,63 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Hyperion Ambilight -# Addon id: script.service.hyperion -# Addon Provider: hyperion-project - -msgid "" -msgstr "" -"Project-Id-Version: Kodi Addons\n" -"Report-Msgid-Bugs-To: hyperion-project.org\n" -"Last-Translator: hyperion-project\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#32001" -msgid "General" -msgstr "General" - -msgctxt "#32002" -msgid "Enable addon (Grabbing)" -msgstr "Enable addon (Grabbing)" - -msgctxt "#32003" -msgid "Hyperion hostname or IP-address" -msgstr "Hyperion hostname or IP-address" - -msgctxt "#32004" -msgid "Hyperion host PROTO-port" -msgstr "Hyperion host PROTO-port" - -msgctxt "#32005" -msgid "Hyperion priority channel" -msgstr "Hyperion priority channel" - -msgctxt "#32006" -msgid "Reconnect timeout (s)" -msgstr "Reconnect timeout (s)" - -msgctxt "#32007" -msgid "Enable when on screensaver" -msgstr "Enable when on screensaver" - -msgctxt "#32008" -msgid "Grabber picture width (pixel)" -msgstr "Grabber picture width (pixel)" - -msgctxt "#32010" -msgid "Frame rate (fps)" -msgstr "Frame rate (fps)" - -msgctxt "#32100" -msgid "Error: Unable to connect to Hyperion. Wrong hostname or IP-address?" -msgstr "" - -msgctxt "#32101" -msgid "Error: Unable to send image to Hyperion. Wrong PROTO-port?" -msgstr "" - -msgctxt "#32102" -msgid "ATTENTION: Higher the values below may lead to performance issues" -msgstr "" diff --git a/script.service.hyperion/resources/language/resource.language.he_il/strings.po b/script.service.hyperion/resources/language/resource.language.he_il/strings.po deleted file mode 100644 index 9d66c7df7..000000000 --- a/script.service.hyperion/resources/language/resource.language.he_il/strings.po +++ /dev/null @@ -1,66 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Hyperion Ambilight -# Addon id: script.service.hyperion -# Addon Provider: hyperion-project -msgid "" -msgstr "" -"Project-Id-Version: Kodi Addons\n" -"Report-Msgid-Bugs-To: hyperion-project.org\n" -"POT-Creation-Date: 2014-10-26 17:05+0000\n" -"PO-Revision-Date: 2017-10-09 10:05+0300\n" -"Last-Translator: A. Dambledore\n" -"Language-Team: Eng2Heb\n" -"Language: he_IL\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - - -msgctxt "#32001" -msgid "General" -msgstr "כללי" - -msgctxt "#32002" -msgid "Enable addon (Grabbing)" -msgstr "אפשר הרחבה (Grabbing - תפיסה)" - -msgctxt "#32003" -msgid "Hyperion hostname or IP-address" -msgstr "היפריון כתובת ה-IP של המארח" - -msgctxt "#32004" -msgid "Hyperion host PROTO-port" -msgstr "היפריון פורט PROTO של המארח" - -msgctxt "#32005" -msgid "Hyperion priority channel" -msgstr "ערוץ עדיפות היפריון" - -msgctxt "#32006" -msgid "Reconnect timeout (s)" -msgstr "זמן קצוב לחיבור מחדש (ש)" - -msgctxt "#32007" -msgid "Enable when on screensaver" -msgstr "אפשר במצב שומר מסך" - -msgctxt "#32008" -msgid "Grabber picture width (pixel)" -msgstr "תופש התמונות רוחב (פיקסלים)" - -msgctxt "#32010" -msgid "Frame rate (fps)" -msgstr "קצב הפריימים (fps)" - -msgctxt "#32100" -msgid "Error: Unable to connect to Hyperion. Wrong hostname or IP-address?" -msgstr "שגיאה: אין אפשרות להתחבר אל היפריון. כתובת ה-IP שגויה?" - -msgctxt "#32101" -msgid "Error: Unable to send image to Hyperion. Wrong PROTO-port?" -msgstr "שגיאה: אין אפשרות להתחבר אל היפריון. פורט PROTO שגוי?" - -msgctxt "#32102" -msgid "ATTENTION: Higher the values below may lead to performance issues" -msgstr "שימו לב: הערכים הגבוהים שלהלן עלולים להוביל לבעיות ביצועים" diff --git a/script.service.hyperion/resources/language/resource.language.it_it/strings.po b/script.service.hyperion/resources/language/resource.language.it_it/strings.po deleted file mode 100644 index b893343ed..000000000 --- a/script.service.hyperion/resources/language/resource.language.it_it/strings.po +++ /dev/null @@ -1,63 +0,0 @@ -# Kodi Media Center language file -# Addon Name: Hyperion Ambilight -# Addon id: script.service.hyperion -# Addon Provider: hyperion-project - -msgid "" -msgstr "" -"Project-Id-Version: Kodi Addons\n" -"Report-Msgid-Bugs-To: hyperion-project.org\n" -"Last-Translator: hyperion-project\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: it-IT\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -msgctxt "#32001" -msgid "General" -msgstr "Generale" - -msgctxt "#32002" -msgid "Enable addon (Grabbing)" -msgstr "Abilita l'Addon (Acquisizione)" - -msgctxt "#32003" -msgid "Hyperion hostname or IP-address" -msgstr "Nome host o indirizzo IP di Hyperion" - -msgctxt "#32004" -msgid "Hyperion host PROTO-port" -msgstr "Porta PROTO di Hyperion" - -msgctxt "#32005" -msgid "Hyperion priority channel" -msgstr "Canale prioritario di Hyperion" - -msgctxt "#32006" -msgid "Reconnect timeout (s)" -msgstr "Timeout riconnessione (s)" - -msgctxt "#32007" -msgid "Enable when on screensaver" -msgstr "Abilita con lo screen saver" - -msgctxt "#32008" -msgid "Grabber picture width (pixel)" -msgstr "Larghezza immagine acquisita (pixel)" - -msgctxt "#32010" -msgid "Frame rate (fps)" -msgstr "Frame rate (fps)" - -msgctxt "#32100" -msgid "Error: Unable to connect to Hyperion. Wrong hostname or IP-address?" -msgstr "Errore: Impossible connettersi a Hyperion. Nome host o indirizzo IP sbagliato?" - -msgctxt "#32101" -msgid "Error: Unable to send image to Hyperion. Wrong PROTO-port?" -msgstr "Errore: Impossibile inviare l'immagine a Hyperion. porta PROTO sbagliata?" - -msgctxt "#32102" -msgid "ATTENTION: Higher the values below may lead to performance issues" -msgstr "ATTENZIONE: Alzare i valori seguenti può portare a problemi di performance" diff --git a/script.service.hyperion/resources/lib/__init__.py b/script.service.hyperion/resources/lib/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/script.service.hyperion/resources/lib/gui.py b/script.service.hyperion/resources/lib/gui.py deleted file mode 100644 index 4ed312594..000000000 --- a/script.service.hyperion/resources/lib/gui.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Kodi GUI handler.""" -from __future__ import annotations - -import xbmcaddon -import xbmcgui -from resources.lib.settings import SettingsManager - - -class GuiHandler: - """Kodi GUI handler.""" - - def __init__( - self, addon: xbmcaddon.Addon, settings_manager: SettingsManager - ) -> None: - self._addon = addon - self._settings = settings_manager - self._dialog = xbmcgui.Dialog() # TODO: DI with embedded getlocalizedstring - self._addon_name = addon.getAddonInfo("name") - self._addon_icon = addon.getAddonInfo("icon") - - def _get_localized_string(self, label_id: int) -> str: - """Returns the localized string of a label ID.""" - return self._addon.getLocalizedString(label_id) - - def notify_label(self, label_id: int) -> None: - """Displays a notification with the localized message.""" - message = self._get_localized_string(label_id) - self.notify_text(message, time=1000, icon=self._addon_icon) - - def notify_text( - self, message: str, time: int = 3000, icon: str = xbmcgui.NOTIFICATION_INFO - ) -> None: - """Displays a notification.""" - self._dialog.notification(self._addon_name, message, icon, time) diff --git a/script.service.hyperion/resources/lib/hyperion/__init__.py b/script.service.hyperion/resources/lib/hyperion/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/script.service.hyperion/resources/lib/hyperion/hyperion.py b/script.service.hyperion/resources/lib/hyperion/hyperion.py deleted file mode 100644 index 159791457..000000000 --- a/script.service.hyperion/resources/lib/hyperion/hyperion.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -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 ClearRequest -from .message_pb2 import ColorRequest -from .message_pb2 import HyperionReply -from .message_pb2 import HyperionRequest -from .message_pb2 import ImageRequest - - -class Hyperion: - """ - Hyperion connection class. - - A Hyperion object will connect to the Hyperion server and provide - easy to use functions to send requests - - 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. - - Args: - server: server address of Hyperion - port: port number of Hyperion - """ - # create a new socket - self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self._socket.settimeout(2) - - # Connect socket to the provided server - self._socket.connect((server, port)) - - def __del__(self) -> None: - """Destructor.""" - # close the socket - self._socket.close() - - def send_color(self, color: int, priority: int, duration: int = -1) -> None: - """ - Send a static color to Hyperion. - - Args: - color: integer value with the color as 0x00RRGGBB - priority: the priority channel to use - duration: duration the leds should be set - """ - request = HyperionRequest() - request.command = HyperionRequest.COLOR - color_request = request.Extensions[ColorRequest.colorRequest] - color_request.rgbColor = color - color_request.priority = priority - color_request.duration = duration - self._send_message(request) - - def send_image( - self, width: int, height: int, data: bytes, priority: int, duration: int = -1 - ) -> None: - """ - Send an image to Hyperion. - - Args: - width: width of the image - height: height of the image - data: image data (byte string containing 0xRRGGBB pixel values) - priority: the priority channel to use - duration: duration the leds should be set - """ - request = HyperionRequest() - request.command = HyperionRequest.IMAGE - image_request = request.Extensions[ImageRequest.imageRequest] - image_request.imagewidth = width - image_request.imageheight = height - image_request.imagedata = bytes(data) - image_request.priority = priority - image_request.duration = duration - self._send_message(request) - - def clear(self, priority: int) -> None: - """Clear the given priority channel. - - Args: - priority: the priority channel to clear - """ - request = HyperionRequest() - request.command = HyperionRequest.CLEAR - 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: Any) -> None: - """ - Send the given proto message to Hyperion. - - A RuntimeError will be raised if the reply contains an error - - Args: - message : proto request to send - """ - binary_request = message.SerializeToString() - binary_size = struct.pack(">I", len(binary_request)) - self._socket.sendall(binary_size) - self._socket.sendall(binary_request) - - # receive a reply from Hyperion - size = struct.unpack(">I", self._socket.recv(4))[0] - reply = HyperionReply() - reply.ParseFromString(self._socket.recv(size)) - - # check the reply - if not reply.success: - raise RuntimeError(f"Hyperion server error: {reply.error}") diff --git a/script.service.hyperion/resources/lib/hyperion/message.proto b/script.service.hyperion/resources/lib/hyperion/message.proto deleted file mode 100644 index 94a2c92c9..000000000 --- a/script.service.hyperion/resources/lib/hyperion/message.proto +++ /dev/null @@ -1,82 +0,0 @@ -syntax = "proto2"; - -package proto; - -message HyperionRequest { - enum Command { - COLOR = 1; - IMAGE = 2; - CLEAR = 3; - CLEARALL = 4; - } - - // command specification - required Command command = 1; - - // extensions to define all specific requests - extensions 10 to 100; -} - -message ColorRequest { - extend HyperionRequest { - optional ColorRequest colorRequest = 10; - } - - // priority to use when setting the color - required int32 priority = 1; - - // integer value containing the rgb color (0x00RRGGBB) - required int32 RgbColor = 2; - - // duration of the request (negative results in infinite) - optional int32 duration = 3; -} - -message ImageRequest { - extend HyperionRequest { - optional ImageRequest imageRequest = 11; - } - - // priority to use when setting the image - required int32 priority = 1; - - // width of the image - required int32 imagewidth = 2; - - // height of the image - required int32 imageheight = 3; - - // image data - required bytes imagedata = 4; - - // duration of the request (negative results in infinite) - optional int32 duration = 5; -} - -message ClearRequest { - extend HyperionRequest { - optional ClearRequest clearRequest = 12; - } - - // priority which need to be cleared - required int32 priority = 1; -} - -message HyperionReply { - enum Type { - REPLY = 1; - VIDEO = 2; - } - - // Identifies which field is filled in. - required Type type = 1; - - // flag indication success or failure - optional bool success = 2; - - // string indicating the reason for failure (if applicable) - optional string error = 3; - - // Proto Messages for video mode - optional int32 video = 4; -} diff --git a/script.service.hyperion/resources/lib/hyperion/message_pb2.py b/script.service.hyperion/resources/lib/hyperion/message_pb2.py deleted file mode 100644 index 707b36c73..000000000 --- a/script.service.hyperion/resources/lib/hyperion/message_pb2.py +++ /dev/null @@ -1,617 +0,0 @@ -# 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/logger.py b/script.service.hyperion/resources/lib/logger.py deleted file mode 100644 index 98dd88688..000000000 --- a/script.service.hyperion/resources/lib/logger.py +++ /dev/null @@ -1,25 +0,0 @@ -"""Logging facility.""" -import xbmc - - -class Logger: - """Logging facility for Kodi add-ons.""" - - def __init__(self, addon_name: str) -> None: - self._addon_name = addon_name - - 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 debug(self, message: str) -> None: - """Writes a debug message to the log.""" - self.log(message) - - def info(self, message: str) -> None: - """Writes an info message to the log.""" - self.log(message, level=xbmc.LOGINFO) - - def error(self, message: str) -> None: - """Writes an error message to the log.""" - self.log(message, level=xbmc.LOGERROR) diff --git a/script.service.hyperion/resources/lib/monitor.py b/script.service.hyperion/resources/lib/monitor.py deleted file mode 100644 index fe733b94a..000000000 --- a/script.service.hyperion/resources/lib/monitor.py +++ /dev/null @@ -1,159 +0,0 @@ -""" -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 typing import Callable - -import xbmc -from PIL import Image - -from resources.lib.gui import GuiHandler -from resources.lib.hyperion.hyperion import Hyperion -from resources.lib.logger import Logger -from resources.lib.settings import SettingsManager - -State = Callable[[], "State"] - - -class HyperionMonitor(xbmc.Monitor): - """Class to capture changes in settings and screensaver state.""" - - def __init__( - self, - settings: SettingsManager, - player: xbmc.Player, - output_handler: GuiHandler, - logger: Logger, - ) -> None: - super().__init__() - self.settings = settings - self.output_handler = output_handler - self._logger = logger - self._screensaver = xbmc.getCondVisibility("System.ScreenSaverActive") - self._player = player - self.show_error_message = True - self._hyperion: Hyperion - self._capture: xbmc.RenderCapture - - def onSettingsChanged(self) -> None: - self.settings.read_settings() - if self.grabbing: - self.connect() - - def onScreensaverDeactivated(self) -> None: - self._screensaver = False - - def onScreensaverActivated(self) -> None: - self._screensaver = True - - # TODO: onDPMSActivated/Deactivated when entering/exiting energy saving - - @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() - and (self.settings.enable_screensaver or not self._screensaver) - ) - - def notify_error(self, label_id: int) -> None: - if self.show_error_message: - self.output_handler.notify_label(label_id) - self.show_error_message = False - - def main_loop(self) -> None: - state = self.disconnected_state - while not self.abortRequested(): - state = state() - - def disconnected_state(self) -> State: - if not self.grabbing: - xbmc.sleep(500) - return self.disconnected_state - try: - self.connect() - return self.connected_state - except Exception: - self.notify_error(32100) - return self.error_state - - def error_state(self) -> State: - rev = self.settings.rev - for _ in range(self.settings.timeout): - if rev != self.settings.rev: - break - if self.waitForAbort(1): - return self.error_state - return self.disconnected_state - - def connect(self) -> None: - settings = self.settings - self._logger.info( - f"Establishing connection to hyperion at {settings.address}:{settings.port}" - ) - self._hyperion = Hyperion(settings.address, settings.port) - self._capture = xbmc.RenderCapture() - - 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) - capture_size = width, height - expected_capture_size = width * height * 4 # size * 4 bytes - RGBA - return capture_size, expected_capture_size - - def connected_state(self) -> State: - if not self.grabbing: - del self._hyperion - return self.disconnected_state - - capture_size, expected_capture_size = self.get_capture_size() - self._capture.capture(*capture_size) - cap_image = self._capture.getImage(self.settings.sleep_time) - if cap_image is None or len(cap_image) < expected_capture_size: - self._logger.debug( - f"Captured image is none or < expected. " - f"captured: {len(cap_image) if cap_image is not None else 'None'}, " - f"expected: {expected_capture_size}" - ) - xbmc.sleep(250) - return self.connected_state - - # v17+ use BGRA format, converting to RGB - image = Image.frombytes("RGB", capture_size, bytes(cap_image), "raw", "BGRX") - - try: - # send image to hyperion - self._hyperion.send_image( - image.width, - image.height, - image.tobytes(), - self.settings.priority, - self.settings.sleep_time, - ) - except Exception: - # unable to send image. notify and go to the error state - self.output_handler.notify_label(32101) - return self.error_state - - return self.connected_state diff --git a/script.service.hyperion/resources/lib/settings.py b/script.service.hyperion/resources/lib/settings.py deleted file mode 100644 index 3c777404c..000000000 --- a/script.service.hyperion/resources/lib/settings.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -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 - -from typing import TYPE_CHECKING - -from resources.lib.logger import Logger - -if TYPE_CHECKING: - import xbmcaddon - - -class SettingsManager: - """Class which contains all addon settings.""" - - def __init__(self, settings: xbmcaddon.Settings, logger: Logger) -> None: - self._logger = logger - self.rev = 0 - self._settings = settings - self.address = "localhost" - self.port = 19445 - self.enable: bool - self.enable_screensaver: bool - self.priority: int - self.timeout: int - self.capture_width: int - self.framerate: int - self.sleep_time: int - - self.read_settings() - - def read_settings(self) -> None: - """Read all settings.""" - settings = self._settings - self.enable = settings.getBool("hyperion_enable") - self.enable_screensaver = settings.getBool("screensaver_enable") - self.priority = settings.getInt("hyperion_priority") - self.timeout = settings.getInt("reconnect_timeout") - self.capture_width = settings.getInt("capture_width") - self.framerate = settings.getInt("framerate") - self.sleep_time = int(1.0 / self.framerate * 1000) - self.address = settings.getString("hyperion_ip") - self.port = settings.getInt("hyperion_port") - self.rev += 1 - self._log_settings() - - def _log_settings(self) -> None: - log = self._logger.debug - log("Settings updated!") - log(f"Hyperion ip: {self.address}") - log(f"Hyperion port: {self.port}") - log(f"enabled: {self.enable}") - log(f"enabled on screensaver: {self.enable_screensaver}") - log(f"priority: {self.priority}") - log(f"timeout: {self.timeout}") - log(f"capture width: {self.capture_width}") - log(f"framerate: {self.framerate}") diff --git a/script.service.hyperion/resources/screenshot-01.png b/script.service.hyperion/resources/screenshot-01.png deleted file mode 100644 index 5b3fccb4fb67c68cfcafd8509d219a240de106dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110923 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

    LA#K;4{XIo}P)&`)ZPT^?BE(`le|9~I^$ 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�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

    Access Wikipedia via Kodi - Access Wikipedia via Kodi - GPL-3.0-or-later - - icon.png - fanart.jpg - - - diff --git a/script.wikipedia/fanart.jpg b/script.wikipedia/fanart.jpg deleted file mode 100644 index 50a2236061ac37ea84bb8abf5ae29e874e944fe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50926 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 D{Pa7U diff --git a/script.wikipedia/icon.png b/script.wikipedia/icon.png deleted file mode 100644 index cde56dd756c9b9a7b117911fbad3b3dcd4c63b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139573 zcmd?QRZv}Bur<1IclQl!2*EWtY~0=5U4y$j!QI^*LU4D7;I0Yo1eeQqPTlAGa_fKj zA6Bg?tEP0%>K;92uSi9C2^2&^L;wJQA|)xR3;;lW79j!fu%E9xkA-IdfLg>$RntY; z$Q|hD}i}bbm&$u>Q^0VT(ph!8DxIEo?OoC+`in7 z)II*&H0ZwU{vf}p8C<@5f+NbSGrD@a89{q(l}PXL+itG&k32sW7QA?M?JMRzRew1Y zyLo$j@*6e4J2|{fTg!UuTzJwdGcX|Yk$HM{@YB1i8TEhfd3hpQT`AFPRf@VUj_30) z#TKNKd}b=?Tkg;M3L`LLvE`n)FC+QShRSx7Dehqe)?aXW5$mAGZ}^RxcGq3$>3uyf zsGp+$Q21COOSh-z{r;ukReR}DXddsoG^*)nxwXP5$^@UVArKxUNK;z+1pPjq()KbV3_aI3JbHHz4>6lU z>Nb=~OYn{c;gAdjn{jOY^#U07wnB$OM4^39DnbZ5hb+nK<6<6>85fMlzhed|N^exN z{!OOsvr>BaYeC;RGmI&?4ci1SD#bxiaBPK62SM~?(v~1nRGcXDwOP}uBuz)3os3cX#s#(hhHJzCM9-1pvzvJJMH(78NYAxU6aUa}p`uEZdiwxH_ z+oqWY$-EQ|E!S0R`+pp68&<(&9ro*X5B&06#lOeOvc1lJ&d;l7I1!ddXP7I)=Z z@i_w8XxT?x-=eM6T2n)7d!WH_x*_L0bJIoM>wx#05E;zf1w<)|)wb_2P(?f>nmbPDQ?=;8YG0P`i)~N-8n3BoRC=`v zas2830BIzzxiM1tw*8?8IWd5ifodMz^)fQaSajnM_)@@wKYg#U3u0ZSRXy=?ghlT8 zNqf4wf=J9dTrGpD>W$G`EUg?mhIA_TvHfQSmza~kp)=dwBSi=u8Gfyse@ktb9`imJ zBmHNsXx_oXX*ZMs;#SxhzgXZ);99eI!!q++FTH5X9^x=R3dLb?EFp`!zH-Dhw=vTb zwhFG{n-Xd$`xz*D^lOCPJ2^>0#f50*-Bhw8btQ^t|8L^FG5WNqeXH2+<#6p|&J4NQ zw7xgaNwS`%pPb$IqDRAthQJ&@3RfQKk`qel^s?4w$1;9i!BhJfi(e{Eya9V_znfwt zqUh;}O&1_VcbKdNHwoPMc^eUe%QOQ5Yc3QlL8fL50Wxd)HWZF&7DT|I>7$tGzhY>U zD`t5}lIb@Zg^!OD8V`pKdV@wNO5Lm1YY%&PP0E(ZhO>JFPOQd`g< z!1D;JQ!rU$ELRuF)2<0?K%2YeTWf@1Bt!MFn?+f&7UFECbWg|f;&0nQ*Qsb&W*nYq zaCFb!E}f?0(=w{!m+zy7ybi9?eFru54I4zn`ejN*crf1&d7k7IO3Sts(o6n`4c|&e zB1FZ$HAj# z`=i|V7K{iakCgosG)q$Bnpg~rRKDYhK2#d3C=-j*lN&e`RT=bO*UY}mCp6E)HCjjK z&n&{OO3$wB7%?y;E`{OHoIa~~v!37wQ9OrQM?3|n#y)2>dDeJtrDBbF_J(b~YSKG` zr$<(j`eJC03(RcO8=XW>eM?0KFUwK+ya5@5^l0z(+F#wbjqtt)n#37^cOb8 zKCV4ziyKCnE}#wd7vS>&i|*`Pv_uF(|MHcKPxy@os+c{WHxD5Q17a9dTu0ACjSGa~ z=p6jG5r4!tS>T+3`fw=o_ld0`{vp`~2u0e3vm7kXqS!pqqVIkgZT6s z9XelE=xS+_6z`6OlndSv-2hf*6+qA8ED2x4dmnD#e^+K4Sznu~rd09+n_6@P(%xV= zX1d3hI?9GM1727dGlu2%_;gcD^>uA2nRK~qQGN!sLrTZO2R2H;8JWY&XV@L~C)tD4 zD}CT|p(h9pc@i`wwQo$>?`fLq@Q_6nAmH#&{useDfD~CY&uAhTN&R-o>P7HYwu|u} zq!e`v0SBEq-!kn8B-Sb*d`Vm75juNJ1%0CAh5Hgjzi$M)6$8qH*QELvQd2_o$M-)) zLS@$RW+ySTCa<0-4okaCYgq4WUUl-u-T=

    7D6mT;Pa`T%(3WmImN0XHPw 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%0Da#wUjvcxn;!k_+fvj!VvKm7Fk{K|czqG9dC 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 Oekd!b%U8cJ3;91^!Hcf| diff --git a/script.wikipedia/resources/language/resource.language.en_gb/strings.po b/script.wikipedia/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index 72b2596c3..000000000 --- a/script.wikipedia/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,27 +0,0 @@ -# XBMC Media Center language file -# Addon Name: Skin Variables -# Addon id: script.skinvariables -# Addon Provider: jurialmunkey -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: 2014-10-26 17:05+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#: /resources/lib/api.py -msgctxt "#32001" -msgid "Text from Wikipedia under CC BY-SA 3.0 license." -msgstr "" - -#: /resources/lib/api.py -msgctxt "#32000" -msgid "Unable to parse information in this section" -msgstr "" diff --git a/script.wikipedia/resources/lib/api.py b/script.wikipedia/resources/lib/api.py deleted file mode 100644 index 5ccde0cd6..000000000 --- a/script.wikipedia/resources/lib/api.py +++ /dev/null @@ -1,378 +0,0 @@ -import re -import xbmc -import xbmcgui -from bs4 import BeautifulSoup, Comment -from jurialmunkey.thread import ParallelThread -from jurialmunkey.dialog import BusyDialog -from jurialmunkey.reqapi import RequestAPI -from jurialmunkey.plugin import KodiPlugin - - -KODIPLUGIN = KodiPlugin('script.wikipedia') -get_localized = KODIPLUGIN.get_localized - -ADDONDATA = 'special://profile/addon_data/script.wikipedia/' -get_infolabel = xbmc.getInfoLabel - - -WIKI_SCRL_ID = 61 -WIKI_NAME_ID = 9901 -WIKI_LIST_ID = 9902 -WIKI_TEXT_ID = 9903 -WIKI_ATTR_ID = 9904 -WIKI_CCIM_ID = 9905 -WIKI_ATTRIBUTION = f'{get_localized(32001)}\n{{}}' -WIKI_CCBYSA_IMG = 'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e5/CC_BY-SA_icon.svg/320px-CC_BY-SA_icon.svg.png' -WIKI_UNABLE_TO_PARSE_TEXT = f'*** {get_localized(32000)} ***' - -ACTION_CLOSEWINDOW = (9, 10, 92, 216, 247, 257, 275, 61467, 61448,) -ACTION_MOVEMENT = (1, 2, 3, 4, ) -ACTION_SELECT = (7, ) - -WIKI_LANGUAGE = {'it': 'it', 'de': 'de', 'en': 'en', 'fr': 'fr', 'es': 'es'} -DEFAULT_WIKI_LANGUAGE = 'en' - -WIKI_TAG_LINK = '[COLOR=BF55DDFF]{}[/COLOR]' -WIKI_TAG_BOLD = '[B]{}[/B]' -WIKI_TAG_EMPH = '[LIGHT][I]{} [/I][/LIGHT]' -WIKI_TAG_SUPS = '[LIGHT]{}[/LIGHT]' - - -AFFIXES = { - 'tv': { - 'regex': r'\(TV series\)$', - 'affix': 'television series' - }, - 'movie': { - 'regex': r'\(Film\)$', - 'affix': 'film' - }, - 'person': { - 'regex': r'\(.*\)$', - 'affix': 'born' - }, -} - - -class WikimediaAPI(RequestAPI): - def __init__(self): - super(WikimediaAPI, self).__init__( - req_api_name='Wikimedia', - req_api_url='https://commons.m.wikimedia.org/w/api.php') - - def get_titles(self, query): - params = { - 'action': 'query', 'list': 'search', 'format': 'json', - 'srsearch': f'File: {query}'} - data = self.get_request_lc(**params) - if not data: - return - return [i['title'] for i in data['query']['search'] if i.get('title')] - - def get_images(self, titles): - params = { - 'action': 'query', 'format': 'json', 'prop': 'imageinfo', 'titles': '|'.join(titles), - 'iiprop': 'timestamp|user|userid|comment|canonicaltitle|url|size|dimensions|sha1|mime|thumbmime|mediatype|bitdepth'} - return self.get_request_lc(**params) - - def get_backdrop(self, query): - data = self.get_images(self.get_titles(query)) - for k, v in data['query']['pages'].items(): - for i in v.get('imageinfo', []): - if i.get('width', 0) < 1280: - continue - if i.get('width', 0) < i.get('height', 0): - continue - if i.get('mime') != "image/jpeg": - continue - if i.get('url'): - return i.get('url') - - -class WikipediaAPI(RequestAPI): - def __init__(self, language=None): - lang = WIKI_LANGUAGE.get(language) or DEFAULT_WIKI_LANGUAGE - - self._wiki_tag_link = get_infolabel('Skin.String(Wikipedia.Format.Link)') or WIKI_TAG_LINK - self._wiki_tag_bold = get_infolabel('Skin.String(Wikipedia.Format.Bold)') or WIKI_TAG_BOLD - self._wiki_tag_emph = get_infolabel('Skin.String(Wikipedia.Format.Emphasis)') or WIKI_TAG_EMPH - self._wiki_tag_sups = get_infolabel('Skin.String(Wikipedia.Format.Superscript)') or WIKI_TAG_SUPS - - super(WikipediaAPI, self).__init__( - req_api_name='Wikipedia' if lang == DEFAULT_WIKI_LANGUAGE else f'Wikipedia_{lang}', - req_api_url=f'https://{lang}.wikipedia.org/w/api.php') - - def get_search(self, query, affix=None): - params = { - 'action': 'query', 'format': 'json', 'list': 'search', 'utf8': 1, - 'srsearch': f'{query} {affix}' if affix else query} - return self.get_request_lc(**params) - - def get_match(self, query, tmdb_type=None, match=''): - affixes = AFFIXES.get(tmdb_type, {}) - affix = affixes.get('affix') - _data = self.get_search(query, affix) - items = [i['title'] for i in _data['query']['search']] - x = xbmcgui.Dialog().select('Wikipedia', items) - if x == -1: - return - return items[x] - - def get_extract(self, title): - params = { - 'action': 'query', 'format': 'json', 'titles': title, 'prop': 'extracts', - 'exintro': True, 'explaintext': True} - return self.get_request_lc(**params) - - def get_sections(self, title): - params = { - 'action': 'parse', 'page': title, 'format': 'json', 'prop': 'sections', - 'disabletoc': True, 'redirects': ''} - try: - return self.get_request_lc(**params)['parse']['sections'] - except (KeyError, AttributeError, TypeError): - return [] - - def get_fullurl(self, title): - params = {'action': 'query', 'format': 'json', 'titles': title, 'prop': 'info', 'inprop': 'url'} - try: - data = self.get_request_lc(**params)['query']['pages'] - data = data[next(iter(data))]['fullurl'] - except (KeyError, AttributeError, TypeError): - return '' - return data - - def get_section(self, title, section_index): - params = { - 'action': 'parse', 'page': title, 'format': 'json', 'prop': 'text', - 'disabletoc': True, 'section': section_index, 'redirects': '', - 'disablelimitreport': True, - 'disableeditsection': True, - 'mobileformat': True} - return self.get_request_lc(**params) - - def get_all_sections(self, title): - sections = self.get_sections(title) - sections = [{'line': 'Overview', 'index': '0', 'number': '0'}] + sections - return sections - - def parse_links(self, data): - raw_html = data['parse']['text']['*'] - soup = BeautifulSoup(raw_html, 'html.parser') - links = [ - i['title'] for i in soup.find_all('a') - if i.get('title') - and i.get('href', '').startswith('/wiki/') - and not i['title'].startswith('Help:') - and not i['title'].startswith('Special:') - and not i['title'].startswith('Wikipedia:') - and not i['title'].startswith('Template:') - and not i['title'].startswith('Category:') - and not i.get('href', '').startswith('/wiki/File:')] - return links - - def parse_image(self, data): - raw_html = data['parse']['text']['*'] - soup = BeautifulSoup(raw_html, 'html.parser') - links = [i for i in soup.find_all('img') if i.get('src')] - return links - - def parse_text(self, data): - raw_html = data['parse']['text']['*'] - soup = BeautifulSoup(raw_html, 'html.parser') - text = [] - - def _parse_table(p): - for c in p.children: - if isinstance(c, Comment): - continue - if c.name in ['style']: - continue - if c.name and any(x in ['mw-references-wrap', 'references-text', 'mw-editsection'] for x in c.get('class', [])): - continue - if c.name in ['div', 'br']: - text.append(' ') - elif c.name in ['p', 'table', 'tr', 'li']: - text.append('\n\n') - if c.name == 'img' and c.get('title'): - text.append(f'{c["title"]}') - continue - if c.string: - if c.string.startswith('^'): - continue - t = c.string.replace('\n', ' ') - if c.name in ['th', 'td']: - t = f'{t} ' - if c.name and 'mw-headline' in c.get('class', ''): - t = self._wiki_tag_bold.format(t) - elif c.name in ['th', 'h2', 'b', 'h3', 'h1', 'h4']: - t = self._wiki_tag_bold.format(t) - elif c.name in ['i', 'em']: - t = self._wiki_tag_emph.format(t) - elif c.name in ['sup']: - t = self._wiki_tag_sups.format(t) - elif c.name in ['u', 'a']: - t = self._wiki_tag_link.format(t) - elif c.name in ['li']: - t = '* {}'.format(t) - text.append(f'{t}') - continue - if c.children: - _parse_table(c) - continue - - _parse_table(soup) - - text = ''.join(text) - text = re.sub(r'\[[0-9]*\]', '', text) - text = re.sub(r' +', ' ', text) - text = re.sub(r'( *\n){3,}', '\n\n', text) - text = re.sub(r'^(\n)+', '', text) - text = re.sub(r'^ +', '', text) - text = re.sub(r'\n +', '\n', text) - return text - - -class WikipediaGUI(xbmcgui.WindowXMLDialog): - def __init__(self, *args, **kwargs): - self._index = [] - self._query = kwargs.get('query') - self._tmdb_type = kwargs.get('tmdb_type') - self._wiki = WikipediaAPI(language=kwargs.get('language')) - self._wikimedia = WikimediaAPI() - self._backdrop = '' - self._title = '' - self._overview_img = '' - self._history = [] - with BusyDialog(): - self.do_setup() - - def do_setup(self, title=None): - self._title = title or self._wiki.get_match(self._query, self._tmdb_type) - if not self._title: - return - self._name = title or self._title - self._overview = self._wiki.parse_text(self._wiki.get_section(self._title, '0')) - self._sections = self._wiki.get_all_sections(self._title) - self._fullurl = self._wiki.get_fullurl(self._title) - - def do_init(self): - xbmcgui.Window(10000).clearProperty('Wikipedia.Backdrop') - self.clearProperty('Backdrop') - self._gui_name.setLabel(f'{self._title}') - self._gui_text.setText(f'{self._overview}') - self._gui_attr.setText(WIKI_ATTRIBUTION.format(self._fullurl)) - self._gui_ccim.setImage(WIKI_CCBYSA_IMG) - self.clearProperty('Image') - self.set_sections() - self.setFocusId(WIKI_LIST_ID) - self.set_section(0) - self._overview_img = self.get_image(0) - self._backdrop = self._wikimedia.get_backdrop(self._name) or '' - if self._backdrop: - xbmcgui.Window(10000).setProperty('Wikipedia.Backdrop', self._backdrop) - self.setProperty('Backdrop', self._backdrop) - - def onInit(self): - self._gui_name = self.getControl(WIKI_NAME_ID) - self._gui_list = self.getControl(WIKI_LIST_ID) - self._gui_text = self.getControl(WIKI_TEXT_ID) - self._gui_attr = self.getControl(WIKI_ATTR_ID) - self._gui_ccim = self.getControl(WIKI_CCIM_ID) - if not self._title: - self.close() - self.do_init() - - def onAction(self, action): - _action_id = action.getId() - if _action_id in ACTION_CLOSEWINDOW: - return self.do_close() - if _action_id in ACTION_MOVEMENT: - return self.do_scroll() - if _action_id in ACTION_SELECT: - return self.do_click() - - def do_close(self): - if self.getFocusId() == WIKI_SCRL_ID: - return self.setFocusId(WIKI_LIST_ID) - if not self._history: # No history so close - return self.close() - with BusyDialog(): # History so go back instead - self.do_setup(self._history.pop()) - self.do_init() - - def do_scroll(self): - if self.getFocusId() != WIKI_LIST_ID: - return - self.set_section(self._gui_list.getSelectedPosition()) - - def do_click(self): - if self.getFocusId() not in [WIKI_SCRL_ID, WIKI_LIST_ID]: - return - x = self._gui_list.getSelectedPosition() - links = self._wiki.parse_links(self._wiki.get_section(self._title, f'{x}')) - if not links: - return - links = list(dict.fromkeys(links)) - x = xbmcgui.Dialog().select('Links', links) - if x == -1: - return - self._history.append(self._title) - with BusyDialog(): - self.do_setup(links[x]) - self.do_init() - - def get_image(self, x): - try: - imgs = self._wiki.parse_image(self._wiki.get_section(self._title, f'{x}')) - except (TypeError, AttributeError, KeyError, IndexError): - return - if not imgs: - return - for img in imgs: - if int(img.get('width', 100)) < 32: - continue - if int(img.get('height', 100)) < 32: - continue - return img - - def set_image(self, img=None): - img = img or self._overview_img - self.setProperty('Image', f'https:{img.get("src")}') - self.setProperty('ImageText', f'{img.get("title") or img.get("alt")}') - - def set_section(self, x): - try: - text = self._index[x] - except (TypeError, AttributeError, KeyError, IndexError): - return - self._gui_text.setText(f'{text}') - self.set_image(self.get_image(x)) - - def set_sections(self): - self._index = [] - self._exit = False - itms = [] - for section in self._sections: - if self._exit: - break - name = section.get('line') - indx = section.get('index') - name = re.sub(r'<.*>', '', name) - numb = section.get('number') - name = f"{' ' if '.' in numb else ''}{numb} {name}" - if not name or not indx: - continue - itms.append((name, indx,)) - self._gui_list.reset() - self._gui_list.addItems([xbmcgui.ListItem(i) for i, j in itms]) - - def _threaditem(i): - indx = i[1] - text = self._wiki.parse_text(self._wiki.get_section(self._title, indx)) - text = text or WIKI_UNABLE_TO_PARSE_TEXT - return text - - with ParallelThread(itms, _threaditem) as pt: - item_queue = pt.queue - self._index = [i for i in item_queue] diff --git a/script.wikipedia/resources/lib/script.py b/script.wikipedia/resources/lib/script.py deleted file mode 100644 index a63abc1a1..000000000 --- a/script.wikipedia/resources/lib/script.py +++ /dev/null @@ -1,39 +0,0 @@ -from jurialmunkey.plugin import KodiPlugin -from jurialmunkey.parser import reconfigure_legacy_params -from lib.api import WikipediaGUI - - -KODIPLUGIN = KodiPlugin('script.wikipedia') -ADDONPATH = KODIPLUGIN._addon_path - - -def do_wikipedia_gui(wikipedia, tmdb_type=None, xml_file=None, language=None, **kwargs): - ui = WikipediaGUI( - xml_file or 'script-wikipedia.xml', ADDONPATH, 'default', '1080i', - query=wikipedia, tmdb_type=tmdb_type, language=language) - ui.doModal() - del ui - - -class Script(): - def __init__(self, *args): - self.params = {} - for arg in args: - if '=' in arg: - key, value = arg.split('=', 1) - self.params[key] = value.strip('\'').strip('"') if value else None - else: - self.params[arg] = True - self.params = reconfigure_legacy_params(**self.params) - - routing_table = { - 'wikipedia': - lambda **kwargs: do_wikipedia_gui(**kwargs)} - - def router(self): - if not self.params: - return - routes_available = set(self.routing_table.keys()) - params_given = set(self.params.keys()) - route_taken = set.intersection(routes_available, params_given).pop() - return self.routing_table[route_taken](**self.params) diff --git a/script.wikipedia/resources/script.py b/script.wikipedia/resources/script.py deleted file mode 100644 index 188526369..000000000 --- a/script.wikipedia/resources/script.py +++ /dev/null @@ -1,8 +0,0 @@ -# -*- coding: utf-8 -*- -# Module: default -# Author: jurialmunkey -# License: GPL v.3 https://www.gnu.org/copyleft/gpl.html -if __name__ == '__main__': - import sys - from lib.script import Script - Script(*sys.argv[1:]).router() diff --git a/script.wikipedia/resources/skins/default/1080i/script-wikipedia.xml b/script.wikipedia/resources/skins/default/1080i/script-wikipedia.xml deleted file mode 100644 index 87a37b7b9..000000000 --- a/script.wikipedia/resources/skins/default/1080i/script-wikipedia.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - 9902 - - - 50% - 50% - 1000 - 1840 - - - - - - - - - 100 - - - - 0 - 80 - 520 - 2 - buttons/dialogbutton-nofo.png - - - 20 - 100 - 480 - 20 - 9902 - 9902 - 9001 - 61 - 200 - - - - - - - - - 500 - 80 - 345 - 2 - buttons/dialogbutton-nofo.png - - - 550 - 110 - 395 - 32 - black - font14 - Mono26 - 61 - - - 340 - 100 - 12 - 20 - 9902 - 9001 - vertical - - - - - 20 - 20 - 175 - 175 - keep - - - - - 20 - 80 - 300 - 61 - dialogbuttons_itemgap - 3 - - - - - - - - - - 20 - 180 - 285 - 180 - !String.IsEmpty(Window.Property(Image)) - - keep - $INFO[Window.Property(Image)] - 160 - - - center - center - 110 - 0 - font12 - bottom - grey - - - - - - - - - 20 - 80 - font12 - center - grey - - - - diff --git a/service.languagepreferencemanager/LICENSE.txt b/service.languagepreferencemanager/LICENSE.txt deleted file mode 100644 index f90922eea..000000000 --- a/service.languagepreferencemanager/LICENSE.txt +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/service.languagepreferencemanager/README.md b/service.languagepreferencemanager/README.md deleted file mode 100644 index 5a14d4c8d..000000000 --- a/service.languagepreferencemanager/README.md +++ /dev/null @@ -1,30 +0,0 @@ -service.LanguagePreferenceManager -================================= - -A manager for audio and subtitle preferences -============================================ - -This addon provides an easy way to set your preferred audio streams and subtitle languages in Kodi. - -You can select which audio tracks and subtitles to automatically activate based on your priorities, and define simple conditional rules like "if audio is xxx then activate subtitles yyy" via drop/down lists. -More advanced custom rules can be defined as well (see changelog for more on the syntax. Note that custom rules always take precedence over others). - -Special language codes None(non) for subtitles and Any(any) for audio can be used in Conditional Subtitles Rules, normal or custom. -For example "fre:non>any:fre>any:eng" will disable subtitles if audio is French (except if a french forced subtitles track exists) and activate french subtitles for any other audio language. If these are not available it will try the same finding english subtitles. - -Rules are re-evaluated and applied whenever you switch audio while watching (from v0.1.5). - -It's now also possible to force ignore "Signs and Songs" subtitles in preferences evaluations, based on name, and/or any other subtitle tracks based on predefined keywords. - -For example, most dual audio Anime provides english and japanese audio and two english subtitles. Dialogue subtitles with all the dialogue to go with the japanese audio and Song/Sign subtitles which only translate song lyrics and signs you see on screen to be used with the english audio stream. Previously the addon just picked the first subtitles with the correct language which weren't always the correct ones. - -Special Thanks -============== - -- @ace20022 and @scott967 for initial development - -- @cyberden for making this addon ready for Kodi Matrix - -- @fpatrick for fixing an issue with language mapping - -- @KnappeGEIL for ideas how to ignore 'Signs and Songs' subtitles diff --git a/service.languagepreferencemanager/addon.xml b/service.languagepreferencemanager/addon.xml deleted file mode 100644 index 75a98295e..000000000 --- a/service.languagepreferencemanager/addon.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - executable - - -

    Language Preference Manager - Sets the audio and subtitle track according to your language preferences - For bugs, requests or general questions visit the Language Preference Manager thread on the Kodi forum. - all - 0.1.3 : Updated with changes required for Kodi 19 / Python 3 + Fixed Languages labels/tables, ConditionnalSubs to None, Custom settings -0.1.4BETA : Conditional Subtitles rules are re-assessed on-the-fly when toggling audio tracks -0.1.5 : Some minor optimisation -0.1.6 : Fix Custom CondSubs not working. Switch to ignore 'Signs' tracks. Add special 'Any' audio language code. Fix some typos -0.1.7BETA : New Keywords Blacklist to ignore chosen subtitles tracks based on name content. -1.0.0 : Mandatory clean-up to propose as candidate version for Kodi.tv addons repository. -1.0.1 : Initial version for main Kodi.tv addons repository -1.0.2 : Fix 10sec latency on subs display and possible few lines lost - at video start or when switching audio. - Forced sub tracks : check also subtitle field "isforced" in case field "name" is empty or misspelled. - - - - resources/icon.png - resources/fanart.jpg - - - diff --git a/service.languagepreferencemanager/changelog.txt b/service.languagepreferencemanager/changelog.txt deleted file mode 100644 index 3f16f6ec5..000000000 --- a/service.languagepreferencemanager/changelog.txt +++ /dev/null @@ -1,97 +0,0 @@ ---- Version 1.0.2 - -- Fix 10sec latency on subs display and possible few lines lost - at video start or when switching audio. -- Forced sub tracks : check also subtitle field "isforced" in case field "name" is empty or misspelled. - ---- Version 1.0.1 - -- Initial version for main Kodi.tv addons repository - ---- Version 1.0.0 - -- Mandatory clean-up to propose as candidate version for Kodi.tv addons repository. - ---- Version 0.1.7BETA - -- New Keywords Blacklist to ignore chosen subtitles tracks based on name content. - ---- Version 0.1.6 - -- Fix custom conditional preferences rules not working. (note : if ...>lan:non>... is used then forced tag is assumed on. See v0.1.3) -- Add a switch to completely ignore 'Signs and Songs' types of subtitle tracks. Default is off. -- Add special 'Any' audio language code to allow easy / simplified Conditional Subtitles rules like 'pol:non>any:pol'. -- Plus some small typo fixed. - ---- Version 0.1.5 - -- Fix preferences rules numbering in log messages. -- Skip extra genre/tag JSON video query when no custom prefs used at all. - ---- Version 0.1.4BETA - -- Conditional subtitle logic improvement. Rules are re-evaluated and applied on-the-fly if audio track is changed during the playback. - ---- Version 0.1.3 - -- Conditional subtitle logic adjustement : if "Lang1:None and forced tag set" then disable subtitles - but only if no Lang1 forced subtitle is found. Otherwise we activate this one. - ---- Version 0.1.2 - -- Adding an icon.png -- Fixing settings.xml CustomAudio, Sub and CondSub : allowempty=true to avoid multiple errors in the kodi log when not used. - ---- Version 0.1.0 - -- Fixing conditional subtitles like "French:None" not working. Not detected and then subtitles were not disabled. - (if sub_code is none) is the test to return -1 in default.py... But column 3 of None in langcodes.py is "non" as a string. - So I just changed the test in line 268 accordingly, and all is fine now. - ---- Version 0.0.7 + Matrix + Python3 + Languages fixed + more Languages fixed - -- Fix compatibility with matrix and Python3 -- Fix languages codes in string.po not aligned with KODI language codes (ex. French etc...) - ---- Version 0.0.6 - -- Fix compatibility with jarvis and krypton - ---- Version 0.0.5 - -- Added support for multiple 3 digit codes per language (thanks to waven!) - ---- Version 0.0.4 - -- Added a language called "None". If set as a conditinal subtitle language - subtitles get disabled if the audio language matches. - -- Added support for per genre/tag custom preferences. Syntax is - tag/genre1,tag/genre2...#(custom pref; see below)|tag/genre3,tag/genre4...#(custom pref; see below) - If no genre/tag# part is provided the pref gets evaluated for any genre/tag - ---- Version 0.0.3 - -- Custom preferences. Syntax is lang1>lang2>lang3>... for audio and sub - and lang1:lang2>lang3:lang4>... for cond. subs -- Wanilton's Portuguese (Brazil) translation, thanks! -- schumi2004's Dutch translation, thanks! - -[fixes] -subtitle preferences -use file name tracks regardless of other settings, if enabled - ---- Version 0.0.2 - -- A switch to enable subtitles if a preference matched. -- A switch to disable subtitles if no subtitle preference matched. -- The possibility to set the audio and/or subtitle track from the filename. - For example: matrix.audiostream_1.subtitle_2.avi - -[fixes] -conditional preferences -typos - ---- Version 0.0.1 - -First version of Language Preference Manager. - diff --git a/service.languagepreferencemanager/default.py b/service.languagepreferencemanager/default.py deleted file mode 100644 index 42fd32c06..000000000 --- a/service.languagepreferencemanager/default.py +++ /dev/null @@ -1,57 +0,0 @@ -import os, sys, re -import xbmc, xbmcaddon, xbmcvfs - -import json as simplejson - -__addon__ = xbmcaddon.Addon() -__addonversion__ = __addon__.getAddonInfo('version') -__addonid__ = __addon__.getAddonInfo('id') -__addonname__ = __addon__.getAddonInfo('name') -__addonPath__ = __addon__.getAddonInfo('path') -__addonResourcePath__ = xbmcvfs.translatePath(os.path.join(__addonPath__, 'resources', 'lib')) -__addonIconFile__ = xbmcvfs.translatePath(os.path.join(__addonPath__, 'icon.png')) -sys.path.append(__addonResourcePath__) - -from langcodes import * -from prefsettings import settings -from prefutils import LangPref_Monitor -from prefutils import LangPrefMan_Player - -settings = settings() - -LOG_NONE = 0 -LOG_ERROR = 1 -LOG_INFO = 2 -LOG_DEBUG = 3 - -def log(level, msg): - if level <= settings.logLevel: - if level == LOG_ERROR: - l = xbmc.LOGERROR - elif level == LOG_INFO: - l = xbmc.LOGINFO - elif level == LOG_DEBUG: - l = xbmc.LOGDEBUG - xbmc.log("[Language Preference Manager]: " + str(msg), l) - -class Main: - def __init__( self ): - self._init_vars() - if (not settings.service_enabled): - log(LOG_INFO, "Service not enabled") - - settings.readSettings() - self._daemon() - - def _init_vars( self ): - self.Monitor = LangPref_Monitor() - self.Player = LangPrefMan_Player() - - def _daemon( self ): - while (not self.Monitor.abortRequested()): - self.Monitor.waitForAbort(1) - -if ( __name__ == "__main__" ): - log(LOG_INFO, 'service {0} version {1} started'.format(__addonname__, __addonversion__)) - main = Main() - log(LOG_INFO, 'service {0} version {1} stopped'.format(__addonname__, __addonversion__)) diff --git a/service.languagepreferencemanager/resources/fanart.jpg b/service.languagepreferencemanager/resources/fanart.jpg deleted file mode 100644 index e7883991d1b6e22dcae3238e29419452af88988b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261523 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

    2_vF0E(-w#k2} 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 p^MOpUyHJrW1RwH;ciNZ@5& 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 :" -msgstr "" - -msgctxt "#30119" -msgid "Use custom pref, e.g. eng>ger>fin :" -msgstr "" - -msgctxt "#30120" -msgid "Forced" -msgstr "" - -msgctxt "#30121" -msgid "Use custom pref, e.g. jpn:eng>eng:ger :" -msgstr "" - -msgctxt "#30122" -msgid "General" -msgstr "" - -msgctxt "#30123" -msgid "Ignore all Signs and Songs subtitles tracks" -msgstr "" - -msgctxt "#30125" -msgid "Enable Keyword Blacklist" -msgstr " - -msgctxt "#30126" -msgid "Enter a comma-separated list of keywords to blacklist in subtitle names" -msgstr " - -msgctxt "#30127" -msgid "Keyword List:" -msgstr " - -msgctxt "#30201" -msgid "Albanian" -msgstr "" - -msgctxt "#30202" -msgid "Arabic" -msgstr "" - -msgctxt "#30203" -msgid "Belarusian" -msgstr "" - -msgctxt "#30204" -msgid "Bosnian (Latin)" -msgstr "" - -msgctxt "#30205" -msgid "Bulgarian" -msgstr "" - -msgctxt "#30206" -msgid "Catalan" -msgstr "" - -msgctxt "#30207" -msgid "Chinese" -msgstr "" - -msgctxt "#30208" -msgid "Croatian" -msgstr "" - -msgctxt "#30209" -msgid "Czech" -msgstr "" - -msgctxt "#30210" -msgid "Danish" -msgstr "" - -msgctxt "#30211" -msgid "Dutch" -msgstr "" - -msgctxt "#30212" -msgid "English" -msgstr "" - -msgctxt "#30213" -msgid "Estonian" -msgstr "" - -msgctxt "#30214" -msgid "Farsi" -msgstr "" - -msgctxt "#30215" -msgid "Finnish" -msgstr "" - -msgctxt "#30216" -msgid "French" -msgstr "" - -msgctxt "#30217" -msgid "German" -msgstr "" - -msgctxt "#30218" -msgid "Greek" -msgstr "" - -msgctxt "#30219" -msgid "Hebrew" -msgstr "" - -msgctxt "#30220" -msgid "Hindi" -msgstr "" - -msgctxt "#30221" -msgid "Hungarian" -msgstr "" - -msgctxt "#30222" -msgid "Icelandic" -msgstr "" - -msgctxt "#30223" -msgid "Indonesian" -msgstr "" - -msgctxt "#30224" -msgid "Italian" -msgstr "" - -msgctxt "#30225" -msgid "Japanese" -msgstr "" - -msgctxt "#30226" -msgid "Korean" -msgstr "" - -msgctxt "#30227" -msgid "Latvian" -msgstr "" - -msgctxt "#30228" -msgid "Lithuanian" -msgstr "" - -msgctxt "#30229" -msgid "Macedonian" -msgstr "" - -msgctxt "#30230" -msgid "Norwegian" -msgstr "" - -msgctxt "#30231" -msgid "Persian" -msgstr "" - -msgctxt "#30232" -msgid "Polish" -msgstr "" - -msgctxt "#30233" -msgid "Portuguese" -msgstr "" - -msgctxt "#30234" -msgid "Portuguese (Brazil)" -msgstr "" - -msgctxt "#30235" -msgid "Romanian" -msgstr "" - -msgctxt "#30236" -msgid "Russian" -msgstr "" - -msgctxt "#30237" -msgid "Serbian" -msgstr "" - -msgctxt "#30238" -msgid "Slovak" -msgstr "" - -msgctxt "#30239" -msgid "Slovenian" -msgstr "" - -msgctxt "#30240" -msgid "Spanish" -msgstr "" - -msgctxt "#30241" -msgid "Swedish" -msgstr "" - -msgctxt "#30242" -msgid "Thai" -msgstr "" - -msgctxt "#30243" -msgid "Turkish" -msgstr "" - -msgctxt "#30244" -msgid "Ukrainian" -msgstr "" - -msgctxt "#30245" -msgid "Vietnamese" -msgstr "" - -msgctxt "#30200" -msgid "None" -msgstr "" - -msgctxt "#30300" -msgid "Any" -msgstr "" diff --git a/service.languagepreferencemanager/resources/lib/langcodes.py b/service.languagepreferencemanager/resources/lib/langcodes.py deleted file mode 100644 index 6f4e392aa..000000000 --- a/service.languagepreferencemanager/resources/lib/langcodes.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- - -# This script is based on the one of script.xbmc.subtitles -# Thanks to their original authors amet, mr_blobby - - - -LANGUAGES = ( - - # Full Language name[0] podnapisi[1] ISO 639-1[2] ISO 639-1 Code[3] Script Setting Language[4] localized name id number[5] - - ("Albanian" , "29", "sq", "alb", "0", 30201 ), - ("Arabic" , "12", "ar", "ara", "1", 30202 ), - ("Belarusian" , "0" , "hy", "arm", "2", 30203 ), - ("Bosnian" , "10", "bs", "bos", "3", 30204 ), - ("Bulgarian" , "33", "bg", "bul", "4", 30205 ), - ("Catalan" , "53", "ca", "cat", "5", 30206 ), - ("Chinese" , "17", "zh", "chi", "6", 30207 ), - ("Croatian" , "38", "hr", "hrv", "7", 30208 ), - ("Czech" , "7", "cs", "cze", "8", 30209 ), - ("Danish" , "24", "da", "dan", "9", 30210 ), - ("Dutch" , "23", "nl", "dut", "10", 30211 ), - ("English" , "2", "en", "eng", "11", 30212 ), - ("Estonian" , "20", "et", "est", "12", 30213 ), - ("Farsi" , "52", "fa", "per", "13", 30214 ), - ("Finnish" , "31", "fi", "fin", "14", 30215 ), - ("French" , "8", "fr", "fre", "15", 30216 ), - ("German" , "5", "de", "ger,deu", "16", 30217 ), - ("Greek" , "16", "el", "ell", "17", 30218 ), - ("Hebrew" , "22", "he", "heb", "18", 30219 ), - ("Hindi" , "42", "hi", "hin", "19", 30220 ), - ("Hungarian" , "15", "hu", "hun", "20", 30221 ), - ("Icelandic" , "6", "is", "ice", "21", 30222 ), - ("Indonesian" , "0", "id", "ind", "22", 30223 ), - ("Italian" , "9", "it", "ita", "23", 30224 ), - ("Japanese" , "11", "ja", "jpn", "24", 30225 ), - ("Korean" , "4", "ko", "kor", "25", 30226 ), - ("Latvian" , "21", "lv", "lav", "26", 30227 ), - ("Lithuanian" , "0", "lt", "lit", "27", 30228 ), - ("Macedonian" , "35", "mk", "mac", "28", 30229 ), - ("Norwegian" , "3", "no", "nor", "29", 30230 ), - ("Persian" , "52", "fa", "per", "30", 30231 ), - ("Polish" , "26", "pl", "pol", "31", 30232 ), - ("Portuguese" , "32", "pt", "por", "32", 30233 ), - ("Portuguese (Brazil)" , "48", "pb", "pt-br", "33", 30234 ), - ("Romanian" , "13", "ro", "rum", "34", 30235 ), - ("Russian" , "27", "ru", "rus", "35", 30236 ), - ("Serbian" , "36", "sr", "scc", "36", 30237 ), - ("Slovak" , "37", "sk", "slo", "37", 30238 ), - ("Slovenian" , "1", "sl", "slv", "38", 30239 ), - ("Spanish" , "28", "es", "spa", "39", 30240 ), - ("Swedish" , "25", "sv", "swe", "40", 30241 ), - ("Thai" , "0", "th", "tha", "41", 30242 ), - ("Turkish" , "30", "tr", "tur", "42", 30243 ), - ("Ukrainian" , "46", "uk", "ukr", "43", 30244 ), - ("Vietnamese" , "51", "vi", "vie", "44", 30245 ), - ("None" , "-1", "", "non", "45", 30200 ), - ("Any" , "-2", "", "any", "46", 30300 ) ) - -def languageTranslate(lang, lang_from, lang_to): - for x in LANGUAGES: - codes = x[lang_from].split(r',') - for code in codes: - if lang == code : - return x[lang_to] diff --git a/service.languagepreferencemanager/resources/lib/prefparser.py b/service.languagepreferencemanager/resources/lib/prefparser.py deleted file mode 100644 index 4fa3b01a1..000000000 --- a/service.languagepreferencemanager/resources/lib/prefparser.py +++ /dev/null @@ -1,100 +0,0 @@ -import re -import xbmc, xbmcaddon -from langcodes import * - -LOG_NONE = 0 -LOG_ERROR = 1 -LOG_INFO = 2 -LOG_DEBUG = 3 - -class PrefParser: - - def log(self, level, msg): - if level <= self.logLevel: - if level == LOG_ERROR: - l = xbmc.LOGERROR - elif level == LOG_INFO: - l = xbmc.LOGINFO - elif level == LOG_DEBUG: - l = xbmc.LOGDEBUG - xbmc.log("[Language Preference Manager]: " + str(msg), l) - - def __init__( self ): - addon = xbmcaddon.Addon() - self.logLevel = addon.getSetting('log_level') - if self.logLevel and len(self.logLevel) > 0: - self.logLevel = int(self.logLevel) - else: - self.logLevel = LOG_INFO - self.custom_prefs_delim = r'>' - self.custom_genre_prefs_delim = r'|' - self.custom_g_t_pref_delim = r'#' - self.custom_g_t_delim = r',' - self.custom_condSub_delim = r':' - - def parsePrefString(self, pref_string): - preferences = [] - if not pref_string: - return preferences - - if (pref_string.find(self.custom_genre_prefs_delim) > 0): - c_prefs = pref_string.split(self.custom_genre_prefs_delim) - else: - c_prefs = [pref_string] - - for s_pref in c_prefs: - pref = self.parseSinglePref(s_pref) - if (pref): - preferences.append(pref) - - if (len(preferences) == 1 - and isinstance(preferences[0], list)): - preferences = preferences[0] - - return preferences - - def parseSinglePref(self, s_pref): - if (s_pref.find(self.custom_g_t_pref_delim) > 0): - g_pref = s_pref.split(self.custom_g_t_pref_delim) - if len(g_pref ) != 2: - self.log(LOG_INFO, 'Parse error: {0}'.format(g_pref)) - return [] - else: - return (set(map(lambda x:x.lower(), g_pref[0].split(self.custom_g_t_delim))), - self.parsePref(g_pref[1])) - else: - return (set(), self.parsePref(s_pref)) - - def parsePref(self, prefs): - lang_prefs = [] - if (prefs.find(self.custom_prefs_delim) > 0): - s_prefs = prefs.split(self.custom_prefs_delim) - else: - s_prefs = [prefs] - for pref in s_prefs: - # custom cond sub pref - if (pref.find(self.custom_condSub_delim) > 0): - pref = pref.split(self.custom_condSub_delim) - if len(pref) != 2: - self.log(LOG_INFO, 'Custom cond subs prefs parse error: {0}'.format(pref)) - else: - temp_a = (languageTranslate(pref[0], 3, 0), pref[0]) - temp_s = (languageTranslate(pref[1], 3, 0), pref[1]) - if (temp_a[0] and temp_a[1] and temp_s[0] and temp_s[1]): - if (temp_s[1] == 'non'): - forced_tag = 'true' - else: - forced_tag = 'false' - lang_prefs.append((temp_a[0], temp_a[1], temp_s[0], temp_s[1], forced_tag)) - else: - self.log(LOG_INFO, 'Custom cond sub prefs: lang code not found in db!'\ - ' Please report this: {0}:{1}'.format(temp_a, temp_s)) - # custom audio or subtitle pref - else: - temp_pref = (languageTranslate(pref, 3, 0), pref) - if temp_pref[0]: - lang_prefs.append(temp_pref) - else: - self.log(LOG_INFO, 'Custom audio prefs: lang code {0} not found in db!'\ - ' Please report this'.format(pref)) - return lang_prefs diff --git a/service.languagepreferencemanager/resources/lib/prefsettings.py b/service.languagepreferencemanager/resources/lib/prefsettings.py deleted file mode 100644 index 43476518d..000000000 --- a/service.languagepreferencemanager/resources/lib/prefsettings.py +++ /dev/null @@ -1,164 +0,0 @@ -import xbmc, xbmcaddon -import re -from langcodes import * -from prefparser import PrefParser - -LOG_NONE = 0 -LOG_ERROR = 1 -LOG_INFO = 2 -LOG_DEBUG = 3 - - - -class settings(): - - def log(self, level, msg): - if level <= self.logLevel: - if level == LOG_ERROR: - l = xbmc.LOGERROR - elif level == LOG_INFO: - l = xbmc.LOGINFO - elif level == LOG_DEBUG: - l = xbmc.LOGDEBUG - xbmc.log("[Language Preference Manager]: " + str(msg), l) - - def init(self): - addon = xbmcaddon.Addon() - self.logLevel = addon.getSetting('log_level') - if self.logLevel and len(self.logLevel) > 0: - self.logLevel = int(self.logLevel) - else: - self.logLevel = LOG_INFO - - self.custom_audio = [] - self.custom_subs = [] - self.custom_condsub = [] - - self.service_enabled = addon.getSetting('enabled') == 'true' - - def __init__( self ): - self.init() - - def readSettings(self): - self.readPrefs() - self.readCustomPrefs() - self.log(LOG_DEBUG, - '\n##### LPM Settings #####\n' \ - 'delay: {0}ms\n' \ - 'audio on: {1}\n' \ - 'subs on: {2}\n' \ - 'cond subs on: {3}\n' \ - 'turn subs on: {4}, turn subs off: {5}\n' \ - 'signs: {15}\n' \ - 'blacklisted keywords: {16}\n' \ - 'use file name: {6}, file name regex: {7}\n' \ - 'at least one pref on: {8}\n'\ - 'audio prefs: {9}\n' \ - 'sub prefs: {10}\n' \ - 'cond sub prefs: {11}\n' \ - 'custom audio prefs: {12}\n' \ - 'custom subs prefs: {13}\n' - 'custom cond subs prefs: {14}\n' - '##### LPM Settings #####\n' - .format(self.delay, self.audio_prefs_on, self.sub_prefs_on, - self.condsub_prefs_on, self.turn_subs_on, self.turn_subs_off, - self.useFilename, self.filenameRegex, self.at_least_one_pref_on, - self.AudioPrefs, self.SubtitlePrefs, self.CondSubtitlePrefs, - self.custom_audio, self.custom_subs, self.custom_condsub, self.ignore_signs_on, - ','.join(self.keyword_blacklist)) - ) - - def readPrefs(self): - addon = xbmcaddon.Addon() - - self.service_enabled = addon.getSetting('enabled') == 'true' - self.delay = int(addon.getSetting('delay')) - self.audio_prefs_on = addon.getSetting('enableAudio') == 'true' - self.sub_prefs_on = addon.getSetting('enableSub') == 'true' - self.condsub_prefs_on = addon.getSetting('enableCondSub') == 'true' - self.turn_subs_on = addon.getSetting('turnSubsOn') == 'true' - self.turn_subs_off = addon.getSetting('turnSubsOff') == 'true' - self.ignore_signs_on = addon.getSetting('signs') == 'true' - self.keyword_blacklist_enabled = addon.getSetting('enableKeywordBlacklist') == 'true' - self.keyword_blacklist = addon.getSetting('KeywordBlacklist') - if self.keyword_blacklist and self.keyword_blacklist_enabled: - self.keyword_blacklist = self.keyword_blacklist.lower().split(',') - else: - self.keyword_blacklist = [] - self.useFilename = addon.getSetting('useFilename') == 'true' - self.filenameRegex = addon.getSetting('filenameRegex') - if self.useFilename: - self.reg = re.compile(self.filenameRegex, re.IGNORECASE) - self.split = re.compile(r'[_|.|-]*', re.IGNORECASE) - - self.at_least_one_pref_on = (self.audio_prefs_on - or self.sub_prefs_on - or self.condsub_prefs_on - or self.useFilename) - - self.AudioPrefs = [(set(), [ - (languageTranslate(addon.getSetting('AudioLang01'), 4, 0) , - languageTranslate(addon.getSetting('AudioLang01'), 4, 3)), - (languageTranslate(addon.getSetting('AudioLang02'), 4, 0) , - languageTranslate(addon.getSetting('AudioLang02'), 4, 3)), - (languageTranslate(addon.getSetting('AudioLang03'), 4, 0) , - languageTranslate(addon.getSetting('AudioLang03'), 4, 3))] - )] - self.SubtitlePrefs = [(set(), [ - (languageTranslate(addon.getSetting('SubLang01'), 4, 0) , - languageTranslate(addon.getSetting('SubLang01'), 4, 3), - addon.getSetting('SubForced01')), - (languageTranslate(addon.getSetting('SubLang02'), 4, 0) , - languageTranslate(addon.getSetting('SubLang02'), 4, 3), - addon.getSetting('SubForced02')), - (languageTranslate(addon.getSetting('SubLang03'), 4, 0) , - languageTranslate(addon.getSetting('SubLang03'), 4, 3), - addon.getSetting('SubForced03'))] - )] - self.CondSubtitlePrefs = [(set(), [ - ( - languageTranslate(addon.getSetting('CondAudioLang01'), 4, 0), - languageTranslate(addon.getSetting('CondAudioLang01'), 4, 3), - languageTranslate(addon.getSetting('CondSubLang01'), 4, 0), - languageTranslate(addon.getSetting('CondSubLang01'), 4, 3), - addon.getSetting('CondSubForced01') - ), - ( - languageTranslate(addon.getSetting('CondAudioLang02'), 4, 0), - languageTranslate(addon.getSetting('CondAudioLang02'), 4, 3), - languageTranslate(addon.getSetting('CondSubLang02'), 4, 0), - languageTranslate(addon.getSetting('CondSubLang02'), 4, 3), - addon.getSetting('CondSubForced02') - ), - ( - languageTranslate(addon.getSetting('CondAudioLang03'), 4, 0), - languageTranslate(addon.getSetting('CondAudioLang03'), 4, 3), - languageTranslate(addon.getSetting('CondSubLang03'), 4, 0), - languageTranslate(addon.getSetting('CondSubLang03'), 4, 3), - addon.getSetting('CondSubForced03') - )] - )] - - def readCustomPrefs(self): - addon = xbmcaddon.Addon() - self.custom_audio = [] - self.custom_audio_prefs_on = False - self.custom_subs = [] - self.custom_sub_prefs_on = False - self.custom_condsub = [] - self.custom_condsub_prefs_on = False - - prefParser = PrefParser() - self.custom_audio = prefParser.parsePrefString( - addon.getSetting('CustomAudio')) - self.custom_subs = prefParser.parsePrefString( - addon.getSetting('CustomSub')) - self.custom_condsub = prefParser.parsePrefString( - addon.getSetting('CustomCondSub')) - - if len(self.custom_audio) > 0: - self.custom_audio_prefs_on = True - if len(self.custom_subs) > 0: - self.custom_sub_prefs_on = True - if len(self.custom_condsub) >0: - self.custom_condsub_prefs_on = True diff --git a/service.languagepreferencemanager/resources/lib/prefutils.py b/service.languagepreferencemanager/resources/lib/prefutils.py deleted file mode 100644 index 7d9b9e994..000000000 --- a/service.languagepreferencemanager/resources/lib/prefutils.py +++ /dev/null @@ -1,382 +0,0 @@ -import os, sys, re -import xbmc, xbmcaddon, xbmcvfs - -import json as simplejson - -from langcodes import * -from prefsettings import settings - -settings = settings() - -LOG_NONE = 0 -LOG_ERROR = 1 -LOG_INFO = 2 -LOG_DEBUG = 3 - -def log(level, msg): - if level <= settings.logLevel: - if level == LOG_ERROR: - l = xbmc.LOGERROR - elif level == LOG_INFO: - l = xbmc.LOGINFO - elif level == LOG_DEBUG: - l = xbmc.LOGDEBUG - xbmc.log("[Language Preference Manager]: " + str(msg), l) - -class LangPref_Monitor( xbmc.Monitor ): - - def __init__( self ): - xbmc.Monitor.__init__( self ) - - def onSettingsChanged( self ): - settings.init() - settings.readSettings() - -class LangPrefMan_Player(xbmc.Player) : - - def __init__ (self): - self.LPM_initial_run_done = False - settings.readSettings() - xbmc.Player.__init__(self) - - def onPlayBackStarted(self): - if settings.service_enabled and settings.at_least_one_pref_on: - log(LOG_DEBUG, 'New AV Playback initiated - Resetting LPM Initial Flag') - self.LPM_initial_run_done = False - - def onAVStarted(self): - if settings.service_enabled and settings.at_least_one_pref_on and self.isPlayingVideo(): - log(LOG_DEBUG, 'Playback started') - self.audio_changed = False - # switching an audio track to early leads to a reopen -> start at the beginning - if settings.delay > 0: - log(LOG_DEBUG, "Delaying preferences evaluation by {0} ms".format(settings.delay)) - xbmc.sleep(settings.delay) - log(LOG_DEBUG, 'Getting video properties') - self.getDetails() - self.evalPrefs() - self.LPM_initial_run_done = True - - def onAVChange(self): - if self.LPM_initial_run_done and settings.service_enabled and settings.at_least_one_pref_on and self.isPlayingVideo(): - log(LOG_DEBUG, 'AVChange detected - Checking possible change of audio track...') - self.audio_changed = False - if settings.delay > 0: - log(LOG_DEBUG, "Delaying preferences evaluation by {0} ms".format(settings.delay)) - xbmc.sleep(settings.delay) - previous_audio_index = self.selected_audio_stream['index'] - previous_audio_language = self.selected_audio_stream['language'] - log(LOG_DEBUG, 'Getting video properties') - self.getDetails() - if (self.selected_audio_stream['index'] != previous_audio_index): - log(LOG_INFO, 'Audio track changed from {0} to {1}. Reviewing Conditional Subtitles rules...'.format(previous_audio_language, self.selected_audio_stream['language'])) - self.evalPrefs() - - def evalPrefs(self): - # recognized filename audio or filename subtitle - fa = False - fs = False - if settings.useFilename and not self.LPM_initial_run_done: - audio, sub = self.evalFilenamePrefs() - if (audio >= 0) and audio < len(self.audiostreams): - log(LOG_INFO, 'Filename preference: Match, selecting audio track {0}'.format(audio)) - self.setAudioStream(audio) - self.audio_changed = True - fa = True - else: - log(LOG_INFO, 'Filename preference: No match found for audio track ({0})'.format(self.getPlayingFile())) - - if (sub >= 0) and sub < len(self.subtitles): - self.setSubtitleStream(sub) - fs = True - log(LOG_INFO, 'Filename preference: Match, selecting subtitle track {0}'.format(sub)) - if settings.turn_subs_on: - log(LOG_DEBUG, 'Subtitle: enabling subs' ) - self.showSubtitles(True) - else: - log(LOG_INFO, 'Filename preference: No match found for subtitle track ({0})'.format(self.getPlayingFile())) - if settings.turn_subs_off: - log(LOG_INFO, 'Subtitle: disabling subs' ) - self.showSubtitles(False) - - if settings.audio_prefs_on and not fa and not self.LPM_initial_run_done: - if settings.custom_audio_prefs_on: - trackIndex = self.evalAudioPrefs(settings.custom_audio) - else: - trackIndex = self.evalAudioPrefs(settings.AudioPrefs) - - if trackIndex == -2: - log(LOG_INFO, 'Audio: None of the preferred languages is available' ) - elif trackIndex >= 0: - self.setAudioStream(trackIndex) - self.audio_changed = True - - if settings.sub_prefs_on and not fs and not self.LPM_initial_run_done: - if settings.custom_sub_prefs_on: - trackIndex = self.evalSubPrefs(settings.custom_subs) - else: - trackIndex = self.evalSubPrefs(settings.SubtitlePrefs) - - if trackIndex == -2: - log(LOG_INFO, 'Subtitle: None of the preferred languages is available' ) - if settings.turn_subs_off: - log(LOG_INFO, 'Subtitle: disabling subs' ) - self.showSubtitles(False) - if trackIndex == -1: - log(LOG_INFO, 'Subtitle: Preferred subtitle is selected but might not be enabled' ) - if settings.turn_subs_on and not self.selected_sub_enabled: - log(LOG_INFO, 'Subtitle: enabling subs because selected sub is not enabled' ) - self.showSubtitles(True) - elif trackIndex >= 0: - self.setSubtitleStream(trackIndex) - if settings.turn_subs_on: - log(LOG_INFO, 'Subtitle: enabling subs' ) - self.showSubtitles(True) - - if settings.condsub_prefs_on and not fs: - if settings.custom_condsub_prefs_on: - trackIndex = self.evalCondSubPrefs(settings.custom_condsub) - else: - trackIndex = self.evalCondSubPrefs(settings.CondSubtitlePrefs) - - if trackIndex == -1: - log(LOG_INFO, 'Conditional subtitle: disabling subs' ) - self.showSubtitles(False) - if trackIndex == -2: - log(LOG_INFO, 'Conditional subtitle: No matching preferences found for current audio stream. Doing nothing.') - elif trackIndex >= 0: - self.setSubtitleStream(trackIndex) - if settings.turn_subs_on: - log(LOG_DEBUG, 'Subtitle: enabling subs' ) - self.showSubtitles(True) - - # Workaround to an old Kodi bug creating 10-15 sec latency when activating a subtitle track. - # Force very short rewind to avoid 10-15sec delay and first few subtitles lines potentially lost - # but if we are very close to beginning, then restart from time 0 - if (self.getTime() <= 10): - self.seekTime(0) - else: - self.seekTime(self.getTime()-1) - - def evalFilenamePrefs(self): - log(LOG_DEBUG, 'Evaluating filename preferences' ) - audio = -1 - sub = -1 - filename = self.getPlayingFile() - matches = settings.reg.findall(filename) - fileprefs = [] - for m in matches: - sp = settings.split.split(m) - fileprefs.append(sp) - - for pref in fileprefs: - if len(pref) == 2: - if (pref[0].lower() == 'audiostream'): - audio = int(pref[1]) - log(LOG_INFO, 'audio track extracted from filename: {0}'.format(audio)) - elif(pref[0].lower() == 'subtitle'): - sub = int(pref[1]) - log(LOG_INFO, 'subtitle track extracted from filename: {0}'.format(sub)) - log(LOG_DEBUG, 'filename: audio: {0}, sub: {1} ({2})'.format(audio, sub, filename)) - return audio, sub - - def evalAudioPrefs(self, audio_prefs): - log(LOG_DEBUG, 'Evaluating audio preferences' ) - i = 0 - for pref in audio_prefs: - i += 1 - g_t, preferences = pref - # genre or tags are given (g_t not empty) but none of them matches the video's tags/genres - if g_t and (not (self.genres_and_tags & g_t)): - continue - - log(LOG_INFO,'Audio: genre/tag preference {0} met with intersection {1}'.format(g_t, (self.genres_and_tags & g_t))) - for pref in preferences: - name, codes = pref - codes = codes.split(r',') - for code in codes: - if (code is None): - log(LOG_DEBUG,'continue') - continue - if (self.selected_audio_stream and - 'language' in self.selected_audio_stream and - (code == self.selected_audio_stream['language'] or name == self.selected_audio_stream['language'])): - log(LOG_INFO, 'Selected audio language matches preference {0} ({1})'.format(i, name) ) - return -1 - else: - for stream in self.audiostreams: - if ((code == stream['language']) or (name == stream['language'])): - log(LOG_INFO, 'Audio language of stream {0} matches preference {1} ({2})'.format(stream['index'], i, name) ) - return stream['index'] - log(LOG_INFO, 'Audio: preference {0} ({1}:{2}) not available'.format(i, name, code) ) - i += 1 - return -2 - - def evalSubPrefs(self, sub_prefs): - log(LOG_DEBUG, 'Evaluating subtitle preferences' ) - log(LOG_DEBUG, 'Subtitle names containing the following keywords are blacklisted: {0}'.format(','.join(settings.keyword_blacklist))) - i = 0 - for pref in sub_prefs: - i += 1 - g_t, preferences = pref - # genre or tags are given (g_t not empty) but none of them matches the video's tags/genres - if g_t and (not (self.genres_and_tags & g_t)): - continue - - log(LOG_INFO,'Subtitle: genre/tag preference {0} met with intersection {1}'.format(g_t, (self.genres_and_tags & g_t))) - for pref in preferences: - name, codes, forced = pref - codes = codes.split(r',') - for code in codes: - if (code is None): - log(LOG_DEBUG,'continue') - continue - if (self.selected_sub and - 'language' in self.selected_sub and - ((code == self.selected_sub['language'] or name == self.selected_sub['language']) and self.testForcedFlag(forced, self.selected_sub['name'], self.selected_sub['isforced']))): - log(LOG_INFO, 'Selected subtitle language matches preference {0} ({1})'.format(i, name) ) - return -1 - else: - for sub in self.subtitles: - if (settings.keyword_blacklist_enabled and any(keyword in sub['name'].lower() for keyword in settings.keyword_blacklist)): - log(LOG_INFO,'SubPrefs : one subtitle track is found matching Keyword Blacklist : {0}. Skipping it.'.format(','.join(settings.keyword_blacklist))) - continue - if (settings.ignore_signs_on and self.isSignsSub(sub['name'])): - log(LOG_INFO,'SubPrefs : ignore_signs toggle is on and one such subtitle track is found. Skipping it.') - continue - if ((code == sub['language'] or name == sub['language']) and self.testForcedFlag(forced, sub['name'], sub['isforced'])): - log(LOG_INFO, 'Subtitle language of subtitle {0} matches preference {1} ({2})'.format((sub['index']+1), i, name) ) - return sub['index'] - log(LOG_INFO, 'Subtitle: preference {0} ({1}:{2}) not available'.format(i, name, code) ) - i += 1 - return -2 - - def evalCondSubPrefs(self, condsub_prefs): - log(LOG_DEBUG, 'Evaluating conditional subtitle preferences' ) - log(LOG_DEBUG, 'Subtitle names containing the following keywords are blacklisted: {0}'.format(','.join(settings.keyword_blacklist))) - # if the audio track has been changed wait some time - if (self.audio_changed and settings.delay > 0): - log(LOG_DEBUG, "Delaying preferences evaluation by {0} ms".format(4*settings.delay)) - xbmc.sleep(4*settings.delay) - log(LOG_DEBUG, 'Getting video properties') - self.getDetails() - i = 0 - for pref in condsub_prefs: - i += 1 - g_t, preferences = pref - # genre or tags are given (g_t not empty) but none of them matches the video's tags/genres - if g_t and (not (self.genres_and_tags & g_t)): - continue - - log(LOG_INFO,'Cond Sub: genre/tag preference {0} met with intersection {1}'.format(g_t, (self.genres_and_tags & g_t))) - for pref in preferences: - audio_name, audio_code, sub_name, sub_code, forced = pref - if (audio_code is None): - log(LOG_DEBUG,'continue') - continue - - if (self.selected_audio_stream and - 'language' in self.selected_audio_stream and - (audio_code == self.selected_audio_stream['language'] or audio_name == self.selected_audio_stream['language'] or audio_code == "any")): - log(LOG_INFO, 'Selected audio language matches conditional preference {0} ({1}:{2}), force tag is {3}'.format(i, audio_name, sub_name, forced) ) - if (sub_code == "non"): - if (forced == 'true'): - log(LOG_INFO, 'Subtitle condition is None but forced is true, searching a forced subtitle matching selected audio...') - for sub in self.subtitles: - log(LOG_DEBUG, 'Looping subtitles...') - if ((audio_code == sub['language']) or (audio_name == sub['language'])): - log(LOG_DEBUG, 'One potential match found...') - if (self.testForcedFlag(forced, sub['name'], sub['isforced'])): - log(LOG_DEBUG, 'One forced match found...') - log(LOG_INFO, 'Language of subtitle {0} matches audio preference {1} ({2}:{3}) with forced overriding rule {4}'.format((sub['index']+1), i, audio_name, sub_name, forced) ) - return sub['index'] - log(LOG_INFO, 'Conditional subtitle: no match found for preference {0} ({1}:{2}) with forced overriding rule {3}'.format(i, audio_name, sub_name, forced) ) - return -1 - else: - for sub in self.subtitles: - if (settings.keyword_blacklist_enabled and any(keyword in sub['name'].lower() for keyword in settings.keyword_blacklist)): - log(LOG_INFO,'CondSubs : one subtitle track is found matching Keyword Blacklist : {0}. Skipping it.'.format(','.join(settings.keyword_blacklist))) - continue - if (settings.ignore_signs_on and self.isSignsSub(sub['name'])): - log(LOG_INFO,'CondSubs : ignore_signs toggle is on and one such subtitle track is found. Skipping it.') - continue - if ((sub_code == sub['language']) or (sub_name == sub['language'])): - if (self.testForcedFlag(forced, sub['name'], sub['isforced'])): - log(LOG_INFO, 'Language of subtitle {0} matches conditional preference {1} ({2}:{3}) forced {4}'.format((sub['index']+1), i, audio_name, sub_name, forced) ) - return sub['index'] - log(LOG_INFO, 'Conditional subtitle: no match found for preference {0} ({1}:{2})'.format(i, audio_name, sub_name) ) - i += 1 - return -2 - - def isSignsSub(self, subName): - test = subName.lower() - matches = ['signs'] - return any(x in test for x in matches) - - def testForcedFlag(self, forced, subName, subForcedTag): - test = subName.lower() - matches = ['forced', 'forcés'] - found = any(x in test for x in matches) - # Only when looking for forced subs : - # in case the sub name is plain empty or not well documented, - # check also the sub isforced tag and consider it a match if set - if (forced and not found and subForcedTag): - found = True - return ((forced == 'false') and not found) or ((forced == 'true') and found) - - def isExternalSub(self, subName): - test = subName.lower() - matches = ['ext'] - return any(x in test for x in matches) - - def getDetails(self): - activePlayers ='{"jsonrpc": "2.0", "method": "Player.GetActivePlayers", "id": 1}' - json_query = xbmc.executeJSONRPC(activePlayers) - #json_query = unicode(json_query, 'utf-8', errors='ignore') - json_response = simplejson.loads(json_query) - activePlayerID = json_response['result'][0]['playerid'] - details_query_dict = { "jsonrpc": "2.0", - "method": "Player.GetProperties", - "params": { "properties": - ["currentaudiostream", "audiostreams", "subtitleenabled", - "currentsubtitle", "subtitles" ], - "playerid": activePlayerID }, - "id": 1} - details_query_string = simplejson.dumps(details_query_dict) - json_query = xbmc.executeJSONRPC(details_query_string) - #json_query = unicode(json_query, 'utf-8', errors='ignore') - json_response = simplejson.loads(json_query) - - if 'result' in json_response and json_response['result'] != None: - self.selected_audio_stream = json_response['result']['currentaudiostream'] - self.selected_sub = json_response['result']['currentsubtitle'] - self.selected_sub_enabled = json_response['result']['subtitleenabled'] - self.audiostreams = json_response['result']['audiostreams'] - self.subtitles = json_response['result']['subtitles'] - log(LOG_DEBUG, json_response ) - - if (not settings.custom_condsub_prefs_on and not settings.custom_audio_prefs_on and not settings.custom_sub_prefs_on): - log(LOG_DEBUG, 'No custom prefs used at all, skipping extra Video tags/genres JSON query.') - self.genres_and_tags = set() - return - - genre_tags_query_dict = {"jsonrpc": "2.0", - "method": "Player.GetItem", - "params": { "properties": - ["genre", "tag"], - "playerid": activePlayerID }, - "id": 1} - genre_tags_query_string = simplejson.dumps(genre_tags_query_dict) - json_query = xbmc.executeJSONRPC(genre_tags_query_string) - #json_query = unicode(json_query, 'utf-8', errors='ignore') - json_response = simplejson.loads(json_query) - if 'result' in json_response and json_response['result'] != None: - gt = [] - if 'genre' in json_response['result']['item']: - gt = json_response['result']['item']['genre'] - if 'tag' in json_response['result']['item']: - gt.extend(json_response['result']['item']['tag']) - self.genres_and_tags = set(map(lambda x:x.lower(), gt)) - log(LOG_DEBUG, 'Video tags/genres: {0}'.format(self.genres_and_tags)) - log(LOG_DEBUG, json_response ) - diff --git a/service.languagepreferencemanager/resources/settings.xml b/service.languagepreferencemanager/resources/settings.xml deleted file mode 100644 index 0b92ffb63..000000000 --- a/service.languagepreferencemanager/resources/settings.xml +++ /dev/null @@ -1,842 +0,0 @@ - -

    - - - - false - - - - 1 - - - - - - - - - - - - - - false - - - - false - - - - false - - - - audiostream[_|.|-]*\d+|subtitle[_|.|-]*\d+ - - false - - - 30117 - - - - 300 - - 30112 - - - - false - - - - false - - - - - - false - - - - - - true - - - 30126 - - false - - true - - - - - - true - - - 30127 - - - true - - - - - - - - false - - - - - - 15 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 45 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - 30118 - - - - - - - - false - - - - - - 15 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - - - 11 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - - - 45 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - - - - - true - - - 30119 - - - - - - - - false - - - - - - 15 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 45 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - - - 11 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 15 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - - - 11 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 11 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - - - - - - true - - - 30121 - - - - -
    - diff --git a/service.watchedlist/LICENSE.txt b/service.watchedlist/LICENSE.txt deleted file mode 100644 index 94a9ed024..000000000 --- a/service.watchedlist/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/service.watchedlist/addon.xml b/service.watchedlist/addon.xml deleted file mode 100644 index 1c65ac43d..000000000 --- a/service.watchedlist/addon.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - executable - - - - - Save watched state of movies and TV-series episodes independent from filenames - Gesehen-Status von Filmen und Serien-Episoden unabhängig von Dateinamen speichern - - Export: Searches the Kodi-Database for watched files. Determine imdb-id and thetvdb-id to identify movies and TV-episodes. Then save the list to a new independent table. - Import: Set the watched state for each video file in Kodi. - Automatic background process without user interaction. - - Export: Durchsucht die Kodi-Datenbank nach gesehenen Filmen und ordnet den Dateien die eindeutigen Kennnummern von imdb und TheTVDB zu. Gesehene Filme und Episoden werden jeweils in einer eigenen Datenbank gespeichert. - Import: Der Gesehen-Status von Medien in Kodi wird aus der Gesehenen-Tabelle geholt. - Die Synchronisierung geschieht automatisch im Hintergrund ohne Benutzereingriff. - This script does not regard the file format. A Movie watched in DVD quality will also set the 1080p version as watched. - Dieses Script ignoriert das Dateiformat. Ein gesehener Film in DVD-Qualität wird auch in der BlueRay-Version als gesehen gekennzeichnet. - all - GPL-2.0-or-later - https://forum.kodi.tv/showthread.php?tid=164652 - https://kodi.wiki/view/Add-on:WatchedList - https://github.com/SchapplM/xbmc-addon-service-watchedlist - 1.3.6 - Dependency update for Kodi Nexus - - icon.png - fanart.jpg - - - diff --git a/service.watchedlist/changelog.txt b/service.watchedlist/changelog.txt deleted file mode 100644 index f97056bf0..000000000 --- a/service.watchedlist/changelog.txt +++ /dev/null @@ -1,109 +0,0 @@ -version 1.3.5 (28.11.2021) -* Fix for inconsistent imdb/tvdb numbers and new database format - -version 1.3.4 (23.10.2021) -* Fix for The Movie Database scraper - -version 1.3.3 (01.08.2021) -* Fix for new python interface in Kodi v20 - -version 1.3 (24.04.2020) -* Updated to work with Python 3 - -version 1.2.7 (03.05.2019) -* Minor fixes (mysql access protection, remove credentials from log file) - -version 1.2.6 (16.02.2019) -* Fixed waiting time for periodic update during playback - -version 1.2.5 (04.01.2018) -* Fix SMB access in Windows, minor code improvements - -version 1.2.4 (01.01.2018) -* Fix in background user watching - -version 1.2.3 (28.12.2017) -* Minor fixes (unicode support, less blocking on shutdown, backup file rotation on network shares, error handling and logging) - -version 1.2.2 (23.12.2017) -* Minor fixes, fixed buggalo emails - -version 1.2.1 (26.11.2017) -* Fixed Dropbox API: Change from v1 to v2 - -version 1.2 (21.05.2017) -* Added API and python module to use this addon in other addons -* minor fixes - -version 1.1.4 (28.04.2017) - * Fixed error in English language file - -version 1.1.3 (16.04.2017) - * Added verbosity option for graphical user notifications - * Added limitation of number of backup files - -version 1.1.2 (12.06.2016) - * Added fix to avoid infinite waiting if startup delay time is 0 - -version 1.1.1 (29.05.2016) - * Added fix for non-working python dropbox import - -version 1.1.0 (02.04.2016) - * Added dropbox synchronization for the database - -version 1.0.5 (24.12.2015) - * Enabled IPv6 adresses for hostnames - -version 1.0.4 (16.05.2015) - * Fixed mysql timestamp bug - -version 1.0.3 (11.01.2015) - * Fixed wrong implementation of startup delay - * Fixed missing startup execution if autostart mode is set to periodic - -version 1.0.2 (10.01.2015) - * Fixed support for Database file got lost in version 1.0.0 - -version 1.0.1 (13.12.2014) - * Fixed unwanted waiting time in autostart - -version 1.0.0 (01.09.2014) - * Added mySQL Database support for the WatchedList Database - -version 0.9.8 (31.08.2014) - * Fix for Unicode Path problems - * Fix for SQLite Error handling - -version 0.9.7 (14.06.2014) - * Added custom sleep function to handle requested shutdown in Gotham - -version 0.9.6 (23.09.2013) - * Fixed tvshow id with imdb-scraper - -version 0.9.5 (18.09.2013) - * Fixed bug in watching user actions - -version 0.9.4 (09.09.2013) - * Fixed bug in watching user actions - -version 0.9.3 (04.09.2013) - * Fixed minor bugs - -version 0.9.2 (01.08.2013) - * Fixed minor bugs - -version 0.9.1 (24.06.2013) - * Fixed: Network share problems in Linux - -version 0.9.0 (09.06.2013) - * Added: Check watched-states permanently and enable to set media as unwatched - -version 0.8.1 (22.05.2013) - * Fixed: Duplicate movies and tv episodes get marked as watched - -version 0.8.0 (16.05.2013) - * Fixed: lastplayed-information is now also stored in the database (although it is sometimes missing in XBMC) - * Added: Exceptions are catched with buggalo and bug reports are sent - -version 0.7.0 (11.05.2013) - * Initial release diff --git a/service.watchedlist/default.py b/service.watchedlist/default.py deleted file mode 100644 index b7c768b54..000000000 --- a/service.watchedlist/default.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -This file is entry point for automatic start via Kodi -""" - -import sys - -import xbmc - -import lib.watchedlist.utils as utils -from lib.watchedlist.watchedlist import WatchedList - -__remotedebug__ = False -# Append pydev remote debugger -if __remotedebug__: - utils.log("Initialize remote debugging.") - # Make pydev debugger works for auto reload. - try: - import pydevd - pydevd.settrace('localhost', port=60678, stdoutToServer=True, stderrToServer=True) - except ImportError: - sys.stderr.write("Error: " + - "You must add org.python.pydev.debug.pysrc to your PYTHONPATH.") - utils.showNotification('WatchedList Error', 'remote debug could not be imported.', xbmc.LOGERROR) - sys.exit(1) - except BaseException: - utils.showNotification('WatchedList Error', 'remote debug in pydev is activated, but remote server not responding.', xbmc.LOGERROR) - sys.exit(1) - -# Run the program -utils.log("WatchedList Database Service starting...") -WatchedList().runProgram() diff --git a/service.watchedlist/fanart.jpg b/service.watchedlist/fanart.jpg deleted file mode 100644 index 55fbe5380188ffa0b57187ffd40f8c7c87fdc4e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147130 zcmb4qWmFVS)b}nd-AhV?yTH;7l1mA@^wKFI-Cd$fm(;Q>-Q8V^(kiJE3J6H^2SGpt zB!t)JyyyAwethqIm@{+FnV$Q*ckZ40#rt&tHS#gyF#rez0D%7z;Qkvx4L}GYAS3`0 z5)u#+5fKuTQj?OBkdV?*Qjt?L(lIeH(lIbFvq3qSSst=7FmMWTKIGwr@xvZ)2#E^u zi9-2ceE-u3kcfzgl$ey3l$4f_nSq(_|C{ay0W`#Tp9lc>KyCmY4G^COcs~kY1px5y z@c(DH|4aW$AOIl|0r5XBk{STS0}fE*wAZ>0D%0A;`qeu(^IsHLfj7{!jrd6exT@j&HcP0_2woef&D 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ԗ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

    eXTq>h@)YKFV?Nf}HbGnO~U&uIFN8C+`} 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 z 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�eiDy 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�JhBP1(8nwOBIW+VaO1! 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 a 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 diff --git a/service.watchedlist/lib/watchedlist/api.py b/service.watchedlist/lib/watchedlist/api.py deleted file mode 100644 index 4685edef6..000000000 --- a/service.watchedlist/lib/watchedlist/api.py +++ /dev/null @@ -1,110 +0,0 @@ -""" -This file contains API functions for the usage of WatchedList with other Kodi addons -""" - -import time - -import xbmc - -from lib.watchedlist.watchedlist import WatchedList -import lib.watchedlist.utils as utils - - -def change_watched_movie(imdb_id, playCount=1, name=''): - """ - Change the watched state of one movie in the WL database - - Args: - imdb_id: ID of the movie in the imdb. Format: Integer, numbers after 'tt0012345' - playCount: Unsigned Integer - name: Title of the movie (optional) - - Returns: - Error Code (0=No error) - """ - - if not name: - name = 'tt%d' % imdb_id - if playCount == 0: - lastPlayed = 0 - else: - lastPlayed = int(time.time()) - row_xbmc = [imdb_id, 0, 0, lastPlayed, playCount, name, 0] # 0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6empty, 7movieid - saveanyway = True - commit = True - lastChange = lastPlayed - with WatchedList(True) as WL: - if WL.get_watched_wl(1): # Read the WL database - utils.showNotification(utils.getString(32102), utils.getString(32602), xbmc.LOGERROR) - return 1 - WL.wl_update_media('movie', row_xbmc, saveanyway, commit, lastChange) - return 0 - - -def change_watched_episode(tvdb_id, season, episode, playCount=1, name=''): - """ - Change the watched state of one episode in the WL database - - Args: - tvdb_id: ID of the tv show in tvdb. Format: Integer - season: Number of the season (Integer) within the show - episode: Number of the episode within the season (Integer) - playCount: Unsigned Integer - name: Name of the Episode (optional) - - Returns: - Error Code (0=No error) - """ - - if not name: - name = 'tvdb%d S%02dE%02d' % (tvdb_id, season, episode) - if playCount == 0: - lastPlayed = 0 - else: - lastPlayed = int(time.time()) - row_xbmc = [tvdb_id, season, episode, lastPlayed, playCount, name, 0] # 0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6empty, 7movieid - saveanyway = True - commit = True - lastChange = lastPlayed - with WatchedList(True) as WL: - if WL.get_watched_wl(1): # Read the WL database - utils.showNotification(utils.getString(32102), utils.getString(32602), xbmc.LOGERROR) - return 1 - WL.wl_update_media('episode', row_xbmc, saveanyway, commit, lastChange) - return 0 - - -def change_watched_episodes(tvdb_id, seasons, episodes, playCount, names): - """ - Change the watched state of multiple episodes of one tv show in the WL database - - Args: - tvdb_id: ID of the tv show in tvdb. Format: Integer - seasons: Number of the seasons for the affected episodes (list of Integers) - episodes: Number of the episodes within the seasons (list of Integers, same length as seasons list). - playCount: Unsigned Integer - names: Names of the Episodes (list of strings, same length as lists above) - - Returns: - Error Code (0=No error) - """ - - if playCount == 0: - lastPlayed = 0 - else: - lastPlayed = int(time.time()) - with WatchedList(True) as WL: - if WL.get_watched_wl(1): # Read the WL database - utils.showNotification(utils.getString(32102), utils.getString(32602), xbmc.LOGERROR) - return 1 - for i in range(len(seasons)): - row_xbmc_i = [tvdb_id, seasons[i], episodes[i], lastPlayed, playCount, names[i], 0] # 0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6empty, 7movieid - saveanyway = True - if i == len(seasons) - 1: - commit = True # Only commit the last row to reduce file access to the database - else: - commit = False - lastChange = lastPlayed - - WL.wl_update_media('episode', row_xbmc_i, saveanyway, commit, lastChange) - return 0 diff --git a/service.watchedlist/lib/watchedlist/utils.py b/service.watchedlist/lib/watchedlist/utils.py deleted file mode 100644 index c49f88926..000000000 --- a/service.watchedlist/lib/watchedlist/utils.py +++ /dev/null @@ -1,209 +0,0 @@ -""" -This file contains additional utility functions -""" -import os -import time -import re -import random -import json - -import xbmc -import xbmcgui -import xbmcvfs -import xbmcaddon -import buggalo - -_addon_id = u'service.watchedlist' -_Addon = xbmcaddon.Addon(_addon_id) - - -def data_dir(): - """"get user data directory of this addon. - according to http://wiki.xbmc.org/index.php?title=Add-on_Rules#Requirements_for_scripts_and_plugins - """ - _datapath = xbmcvfs.translatePath(_Addon.getAddonInfo('profile')) - if not xbmcvfs.exists(_datapath): - xbmcvfs.mkdir(_datapath) - return _datapath - - -def addon_dir(): - """"get source directory of this addon. - according to http://wiki.xbmc.org/index.php?title=Add-on_Rules#Requirements_for_scripts_and_plugins - """ - return _Addon.getAddonInfo('path') - - -def log(message, loglevel=xbmc.LOGINFO): - """"save message to xbmc.log. - - Args: - message: has to be unicode, http://wiki.xbmc.org/index.php?title=Add-on_unicode_paths#Logging - loglevel: xbmc.LOGDEBUG, xbmc.LOGINFO, xbmc.LOGWARNING, xbmc.LOGERROR, xbmc.LOGFATAL - """ - xbmc.log(_addon_id + u": " + message, level=loglevel) - - -def showNotification(title, message, loglevel, showtime=4000): - """Show Notification - - Args: - title: has to be unicode - message: has to be unicode - loglevel: Log-level of the message (equivalent to xbmc.LOGDEBUG ... xbmc.LOGFATAL) - showtime: Time that the message is beeing displayed - """ - # Check log level - if getSetting('verbosity') == '1' and loglevel < xbmc.LOGINFO: - return # setting "only infos" - elif getSetting('verbosity') == '2' and loglevel < xbmc.LOGWARNING: - return # setting "only warnings" - elif getSetting('verbosity') == '3' and loglevel < xbmc.LOGERROR: - return # setting "only errors" - elif getSetting('verbosity') == '4': - return # setting "None" - _addoniconpath = _Addon.getAddonInfo('icon') - log(u'Notification. %s: %s' % (title, message)) - if not xbmc.Player().isPlaying(): # do not show the notification, if a video is being played. - xbmcgui.Dialog().notification(title, message, _addoniconpath, showtime) - - -def setSetting(name, value): - _Addon.setSetting(name, value) - - -def getSetting(name): - # The returned value from getSetting is not unicode, only string - # This function returns unicode - return _Addon.getSetting(name) - - -def getString(string_id): - # return a localized string from resources/language/*.po - # The returned string is unicode - return _Addon.getLocalizedString(string_id) - -def footprint(): - """Print settings to log file""" - log(u'data_dir() = %s' % data_dir(), xbmc.LOGDEBUG) - log(u'addon_dir() = %s' % addon_dir(), xbmc.LOGDEBUG) - log(u'verbosity = %s' % getSetting('verbosity'), xbmc.LOGDEBUG) - log(u'w_movies = %s' % getSetting('w_movies'), xbmc.LOGDEBUG) - log(u'w_episodes = %s' % getSetting('w_episodes'), xbmc.LOGDEBUG) - log(u'autostart = %s' % getSetting('autostart'), xbmc.LOGDEBUG) - log(u'delay = %s' % getSetting('delay'), xbmc.LOGDEBUG) - log(u'starttype = %s' % getSetting('starttype'), xbmc.LOGDEBUG) - log(u'interval = %s' % getSetting('interval'), xbmc.LOGDEBUG) - log(u'watch_user = %s' % getSetting('watch_user'), xbmc.LOGDEBUG) - log(u'progressdialog = %s' % getSetting('progressdialog'), xbmc.LOGDEBUG) - log(u'db_format = %s' % getSetting('db_format'), xbmc.LOGDEBUG) - log(u'extdb = %s' % getSetting('extdb'), xbmc.LOGDEBUG) - log(u'dbpath = %s' % getSetting('dbpath'), xbmc.LOGDEBUG) - log(u'dbfilename = %s' % getSetting('dbfilename'), xbmc.LOGDEBUG) - log(u'dbbackup = %s' % getSetting('dbbackup'), xbmc.LOGDEBUG) - log(u'dropbox_enabled = %s' % getSetting('dropbox_enabled'), xbmc.LOGDEBUG) - log(u'dropbox_apikey = %s' % getSetting('dropbox_apikey'), xbmc.LOGDEBUG) - log(u'mysql_server = %s' % getSetting('mysql_server'), xbmc.LOGDEBUG) - log(u'mysql_port = %s' % getSetting('mysql_port'), xbmc.LOGDEBUG) - log(u'mysql_user = *******', xbmc.LOGDEBUG) - log(u'mysql_pass = *******', xbmc.LOGDEBUG) - - -def sqlDateTimeToTimeStamp(sqlDateTime): - """Convert SQLite DateTime to Unix Timestamp - - Args: - sqlDateTime: E.g. "2013-05-10 21:23:24" - Returns: - timestamp: E.g. 1368213804 - """ - # sqlDateTime is a string (only from SQLite db. Mysql returns object) - if sqlDateTime == '': - return 0 # NULL timestamp - else: - # the usage of strptime produces the error "Failed to import _strptime because the import lock is held by another thread." - # to solve this, in case of error try again after random time - try: - for i in range(5): - try: - return int(time.mktime(time.strptime(sqlDateTime, "%Y-%m-%d %H:%M:%S"))) - except BaseException: - xbmc.wait(random.randint(200, 500)) - except BaseException: - return 0 # error, but timestamp=0 works in the addon - - -def TimeStamptosqlDateTime(TimeStamp): - """Convert Unix Timestamp to SQLite DateTime - - Args: - timestamp: E.g. 1368213804 - - Returns: - sqlDateTime: E.g. "2013-05-10 21:23:24" - """ - if TimeStamp == 0: - return "" - return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(TimeStamp)) - - -def executeJSON(request): - """Execute JSON-RPC Command - - Args: - request: Dictionary with JSON-RPC Commands - """ - rpccmd = json.dumps(request) # create string from dict - json_query = xbmc.executeJSONRPC(rpccmd) - json_response = json.loads(json_query) - # in case of exception this will be sent - buggalo.addExtraData('len(json_query)', len(json_query)) - buggalo.addExtraData('len(json_response)', len(json_response)) - return json_response - - -def buggalo_extradata_settings(): - """"add extradata to buggalo""" - - buggalo.addExtraData('data_dir', data_dir()) - buggalo.addExtraData('addon_dir', addon_dir()) - buggalo.addExtraData('setting_verbosity', getSetting("verbosity")) - buggalo.addExtraData('setting_w_movies', getSetting("w_movies")) - buggalo.addExtraData('setting_w_episodes', getSetting("w_episodes")) - buggalo.addExtraData('setting_autostart', getSetting("autostart")) - buggalo.addExtraData('setting_delay', getSetting("delay")) - buggalo.addExtraData('setting_starttype', getSetting("starttype")) - buggalo.addExtraData('setting_interval', getSetting("interval")) - buggalo.addExtraData('setting_progressdialog', getSetting("progressdialog")) - buggalo.addExtraData('setting_watch_user', getSetting("watch_user")) - buggalo.addExtraData('setting_extdb', getSetting("extdb")) - buggalo.addExtraData('setting_dbpath', getSetting("dbpath")) - buggalo.addExtraData('setting_dbfilename', getSetting("dbfilename")) - buggalo.addExtraData('setting_dbbackup', getSetting("dbbackup")) - buggalo.addExtraData('setting_db_format', getSetting("db_format")) - buggalo.addExtraData('setting_mysql_server', getSetting("mysql_server")) - buggalo.addExtraData('setting_mysql_port', getSetting("mysql_port")) - buggalo.addExtraData('setting_mysql_db', getSetting("mysql_db")) - - -def fileaccessmode(path): - """"determine file access mode for the given path - in case of network shares no direct access is possible - on windows, smb paths can be accessed directly in certain conditions, - which are ignored for the sake of simplicity - - Args: - path: Path to File - - Returns: - copy_mode: Mode of file access: 'copy' or 'normal' - """ - - res_nw = re.compile(r'(.*?)://(.*?)').findall(path) - if res_nw: - # Path with smb://, nfs:// or ftp:// is correct, but can not be accessed with normal python file access. - # Copy the file with the virtual file system - return 'copy' - else: - # "normal" path on local filesystem - return 'normal' diff --git a/service.watchedlist/lib/watchedlist/watchedlist.py b/service.watchedlist/lib/watchedlist/watchedlist.py deleted file mode 100644 index a165ba97a..000000000 --- a/service.watchedlist/lib/watchedlist/watchedlist.py +++ /dev/null @@ -1,1846 +0,0 @@ -""" -This file contains the class of the addon - -Settings for this addon: -w_movies - 'true', 'false': save watched state of movies -w_episodes - 'true', 'false': save watched state of movies -autostart -delay - delay after startup in minutes: '0', '5', '10', ... -starttype - '0' = No autostart - '1' = One Execution after Kodi start - '2' = Periodic start of the addon -interval -watch_user -progressdialog -verbosity - '0' = All messages (debug) - '1' = Only info / notification - '2' = Only warnings - '3' = Only errors - '4' = No Messages -db_format - '0' = SQLite File - '1' = MYSQL Server -drobox_enabled -extdb - 'true', 'false': Use external database file -dbpath - String: Specify path to external database file -dbfilename -dbbackupcount -mysql_server -mysql_port -mysql_db -mysql_user -mysql_pass -""" - -import sys -import os -import re -import time -import sqlite3 -import base64 - -import xbmc -import xbmcgui -import xbmcvfs -import mysql.connector -import buggalo - -import lib.watchedlist.utils as utils - -try: - import dropbox - from dropbox.exceptions import ApiError as DropboxApiError - DROPBOX_APP_KEY = base64.b64decode("YmhkMnY4aGdzbXF3Y2d0").decode('ascii') - DROPBOX_APP_SECRET = base64.b64decode("dDJjZXBvZXZqcXl1Ym5k").decode('ascii') - DROPBOX_ENABLED = True -except BaseException: - DROPBOX_ENABLED = False - if utils.getSetting("dropbox_enabled") == 'true': - utils.showNotification(utils.getString(32708), utils.getString(32720), xbmc.LOGWARNING) - -if utils.getSetting('dbbackupcount') != '0': - import zipfile - import datetime - -buggalo.EMAIL_CONFIG = {"recipient": base64.b64decode("bXNhaGFkbDYwQGdtYWlsLmNvbQ==").decode('ascii'), - "sender": base64.b64decode("QnVnZ2FsbyA8a29kaXdhdGNoZWRsaXN0QGdtYWlsLmNvbT4=").decode('ascii'), - "server": base64.b64decode("c210cC5nb29nbGVtYWlsLmNvbQ==").decode('ascii'), - "method": "ssl", - "user": base64.b64decode("a29kaXdhdGNoZWRsaXN0QGdtYWlsLmNvbQ==").decode('ascii'), - "pass": base64.b64decode("bWNneHd1and6c3ducW1iaA==").decode('ascii')} - -QUERY_MV_INSERT_SQLITE = 'INSERT OR IGNORE INTO movie_watched (idMovieImdb,playCount,lastChange,lastPlayed,title) VALUES (?, ?, ?, ?, ?)' -QUERY_MV_INSERT_MYSQL = 'INSERT IGNORE INTO movie_watched (idMovieImdb,playCount,lastChange,lastPlayed,title) VALUES (%s, %s, FROM_UNIXTIME(%s), FROM_UNIXTIME(%s), %s)' -QUERY_EP_INSERT_SQLITE = 'INSERT OR IGNORE INTO episode_watched (idShow,season,episode,playCount,lastChange,lastPlayed) VALUES (?, ?, ?, ?, ?, ?)' -QUERY_EP_INSERT_MYSQL = 'INSERT IGNORE INTO episode_watched (idShow,season,episode,playCount,lastChange,lastPlayed) VALUES (%s, %s, %s, %s, FROM_UNIXTIME(%s), FROM_UNIXTIME(%s))' - -QUERY_MV_UPDATE_SQLITE = 'UPDATE movie_watched SET playCount = ?, lastplayed = ?, lastChange = ? WHERE idMovieImdb LIKE ?' -QUERY_MV_UPDATE_MYSQL = 'UPDATE movie_watched SET playCount = %s, lastplayed = FROM_UNIXTIME(%s), lastChange = FROM_UNIXTIME(%s) WHERE idMovieImdb LIKE %s' -QUERY_EP_UPDATE_SQLITE = 'UPDATE episode_watched SET playCount = ?, lastPlayed = ?, lastChange = ? WHERE idShow LIKE ? AND season LIKE ? AND episode LIKE ?' -QUERY_EP_UPDATE_MYSQL = 'UPDATE episode_watched SET playCount = %s, lastPlayed = FROM_UNIXTIME(%s), lastChange = FROM_UNIXTIME(%s) WHERE idShow LIKE %s AND season LIKE %s AND episode LIKE %s' - -# Queries to create tables for movies ("mv"), episodes ("ep") and series ("ss") for sqlite and mysql -QUERY_CREATE_MV_SQLITE = "CREATE TABLE IF NOT EXISTS movie_watched (idMovieImdb INTEGER PRIMARY KEY,playCount INTEGER,lastChange INTEGER,lastPlayed INTEGER,title TEXT)" -QUERY_CREATE_EP_SQLITE = "CREATE TABLE IF NOT EXISTS episode_watched (idShow INTEGER, season INTEGER, episode INTEGER, playCount INTEGER,lastChange INTEGER,lastPlayed INTEGER, PRIMARY KEY (idShow, season, episode))" -QUERY_CREATE_SS_SQLITE = "CREATE TABLE IF NOT EXISTS tvshows (idShow INTEGER, title TEXT, PRIMARY KEY (idShow))" - -QUERY_CREATE_MV_MYSQL = ("CREATE TABLE IF NOT EXISTS `movie_watched` (" - "`idMovieImdb` int unsigned NOT NULL," - "`playCount` tinyint unsigned DEFAULT NULL," - "`lastChange` timestamp NULL DEFAULT NULL," - "`lastPlayed` timestamp NULL DEFAULT NULL," - "`title` text," - "PRIMARY KEY (`idMovieImdb`)" - ") ENGINE=InnoDB DEFAULT CHARSET=utf8;") -QUERY_CREATE_EP_MYSQL = ("CREATE TABLE IF NOT EXISTS `episode_watched` (" - "`idShow` int unsigned NOT NULL DEFAULT '0'," - "`season` smallint unsigned NOT NULL DEFAULT '0'," - "`episode` smallint unsigned NOT NULL DEFAULT '0'," - "`playCount` tinyint unsigned DEFAULT NULL," - "`lastChange` timestamp NULL DEFAULT NULL," - "`lastPlayed` timestamp NULL DEFAULT NULL," - "PRIMARY KEY (`idShow`,`season`,`episode`)" - ") ENGINE=InnoDB DEFAULT CHARSET=utf8;") -QUERY_CREATE_SS_MYSQL = ("CREATE TABLE IF NOT EXISTS `tvshows` (" - "`idShow` int unsigned NOT NULL," - "`title` text," - "PRIMARY KEY (`idShow`)" - ") ENGINE=InnoDB DEFAULT CHARSET=utf8;") - -# Queries for clearing data from the tables -QUERY_CLEAR_MV_SQLITE = "DELETE FROM movie_watched;" -QUERY_CLEAR_EP_SQLITE = "DELETE FROM episode_watched;" - -# Queries for selecting all table entries -QUERY_SELECT_MV_SQLITE = "SELECT idMovieImdb, lastPlayed, playCount, title, lastChange FROM movie_watched ORDER BY title" -QUERY_SELECT_MV_MYSQL = "SELECT `idMovieImdb`, UNIX_TIMESTAMP(`lastPlayed`), `playCount`, `title`, UNIX_TIMESTAMP(`lastChange`) FROM `movie_watched` ORDER BY `title`" -QUERY_SELECT_EP_SQLITE = "SELECT idShow, season, episode, lastPlayed, playCount, lastChange FROM episode_watched ORDER BY idShow, season, episode" -QUERY_SELECT_EP_MYSQL = "SELECT `idShow`, `season`, `episode`, UNIX_TIMESTAMP(`lastPlayed`), `playCount`, UNIX_TIMESTAMP(`lastChange`) FROM `episode_watched` ORDER BY `idShow`, `season`, `episode`" - -# Queries for inserting tv series -QUERY_INSERT_SS_SQLITE = "INSERT OR IGNORE INTO tvshows (idShow,title) VALUES (?, ?)" -QUERY_INSERT_SS_MYSQL = "INSERT IGNORE INTO tvshows (idShow,title) VALUES (%s, %s)" - - -class WatchedList: - """ - Main class of the add-on - """ - - def __init__(self, externalcall=False): - """ - Initialize Class, default values for all class variables - - Args: - externalcall: Flag if the class was created for use with another Addon (via the API). - In this case some features will be deactivated for speed purpose - """ - self.watchedmovielist_wl = list([]) # 0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6lastChange - self.watchedepisodelist_wl = list([]) # 0tvdbnumber, 1season, 2episode, 3lastplayed, 4playcount, 5empty, 6lastChange - - self.watchedmovielist_xbmc = list([]) # 0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6empty, 7movieid - self.watchedepisodelist_xbmc = list([]) # 0tvdbnumber, 1season, 2episode, 3lastplayed, 4playcount, 5name, 6empty, 7episodeid - - self.tvshows = {} # dict: key=xbmcid, value=[tvdbnumber, showname] - self.tvshownames = {} # dict: key=tvdbnumber, value=showname - - self.sqlcon_wl = 0 - self.sqlcursor_wl = 0 - self.sqlcon_db = 0 - self.sqlcursor_db = 0 - - self.db_method = 'file' # either 'file' or 'mysql' - - # flag to remember copying the databasefile if requested - self.dbbackupdone = False - - self.watch_user_changes_count = 0 - - # normal access of files or access over the Kodi virtual file system (on unix) - self.dbfileaccess = 'normal' - - self.dbpath = '' - self.dbdirectory = '' - self.dropbox_path = None - self.downloaded_dropbox_timestamp = 0 - self.dbdirectory_copy = '' - self.dbpath_copy = '' - - # monitor for shutdown detection - self.monitor = xbmc.Monitor() - - if externalcall: - # No Dropbox for external API calls - self.downloaded_dropbox_timestamp = float('inf') - # No database backup - self.dbbackupdone = True - - def __del__(self): - ''' Cleanup db when object destroyed ''' - self.close_db(3) # changes have to be committed before - - def __enter__(self): # for using the class in a with-statement - return self - - def __exit__(self, exc_type, exc_value, traceback): # for using the class in a with-statement - self.close_db(3) # changes have to be committed before - - def runProgram(self): - """ - entry point for automatic start. - Main function to call other functions - infinite loop for periodic database update - - Returns: - return codes: - 0 success - 2 undefined - 3 error/exit - 4 planned exit (no error) - """ - try: - # workaround to disable autostart, if requested - if utils.getSetting("autostart") == 'false': - return 0 - - utils.buggalo_extradata_settings() - utils.footprint() - - # wait the delay time after startup - delaytime = int(utils.getSetting("delay")) * 60 # in seconds - utils.log(u'Delay time before execution: %d seconds' % delaytime, xbmc.LOGDEBUG) - utils.showNotification(utils.getString(32101), utils.getString(32004) % int(utils.getSetting("delay")), xbmc.LOGINFO) - if self.monitor.waitForAbort(1 + delaytime): # wait at least one second (zero waiting time waits infinitely) - return 0 - - # load all databases - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(): - utils.showNotification(utils.getString(32102), utils.getString(32601), xbmc.LOGERROR) - return 3 - if not self.tvshownames: - if self.sync_tvshows(): - return 2 - if not self.watchedmovielist_wl: - if self.get_watched_wl(1): - return 2 - if not self.watchedmovielist_xbmc: - if self.get_watched_xbmc(1): - return 2 - executioncount = 0 - idletime = 0 - - if utils.getSetting("watch_user") == 'true': - utils.showNotification(utils.getString(32101), utils.getString(32005), xbmc.LOGINFO) - - # handle the periodic execution - while int(utils.getSetting("starttype")) > 0 or utils.getSetting("watch_user") == 'true': - starttime = time.time() - # determine sleeptime before next full watched-database update - if utils.getSetting("starttype") == '1' and executioncount == 0: # one execution after startup - sleeptime = 0 - elif utils.getSetting("starttype") == '2': # periodic execution - if executioncount == 0: # with periodic execution, one update after startup and then periodic - sleeptime = 0 - else: - sleeptime = int(utils.getSetting("interval")) * 3600 # wait interval until next startup in [seconds] - # wait and then update again - utils.log(u'wait %d seconds until next update' % sleeptime) - utils.showNotification(utils.getString(32101), utils.getString(32003) % (sleeptime / 3600), xbmc.LOGINFO) - else: # no autostart, only watch user - sleeptime = 3600 # arbitrary time for infinite loop - - # sleep the requested time and watch user changes - while True: - if self.monitor.abortRequested(): - return 4 - # check if user changes arrived - if utils.getSetting("watch_user") == 'true': - idletime_old = idletime - idletime = xbmc.getGlobalIdleTime() # Kodi idletime in seconds - # check if user could have made changes and process these changes to the wl database - self.watch_user_changes(idletime_old, idletime) - # check if time for update arrived - if time.time() > starttime + sleeptime: - break - if self.monitor.waitForAbort(1): - return 4 # wait 1 second until next check if Kodi terminates and user made changes - # perform full update - if utils.getSetting("starttype") == '1' and executioncount == 0 or utils.getSetting("starttype") == '2': - self.runUpdate(False) - executioncount += 1 - - # check for exiting program - if int(utils.getSetting("starttype")) < 2 and utils.getSetting("watch_user") == 'false': - return 0 # the program may exit. No purpose for background process - - return 0 - except SystemExit: - return 4 - except BaseException: - buggalo.onExceptionRaised() - - def runUpdate(self, manualstart): - """ - entry point for manual start. - this function is called for periodic update for automatic start - perform the update step by step - - Args: - manualstart: True if called manually - - Returns: - return code: - 0 success - 2 SystemExit - 3 Error opening database - 4 Error getting watched state from addon database - 5 Error getting watched state from Kodi database - 6 Error writing WL Database - 7 Error writing Kodi database - 8 Error merging dropbox database into local watched list - 9 Error merging local database into dropbox - 10 Error performing database backup - """ - - try: - utils.buggalo_extradata_settings() - # check if player is running before doing the update. Only do this check for automatic start - while xbmc.Player().isPlaying() and not manualstart: - if self.monitor.waitForAbort(60): - return 1 # wait one minute until next check for active playback - if not xbmc.Player().isPlaying(): - if self.monitor.waitForAbort(180): - return 1 # wait 3 minutes so the dialogue does not pop up directly after the playback ends - - # load the addon-database - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(True): # True: Manual start - utils.showNotification(utils.getString(32102), utils.getString(32601), xbmc.LOGERROR) - return 3 - - if self.sync_tvshows(): - utils.showNotification(utils.getString(32102), utils.getString(32604), xbmc.LOGERROR) - return 5 - - # get the watched state from the addon - if self.get_watched_wl(0): - utils.showNotification(utils.getString(32102), utils.getString(32602), xbmc.LOGERROR) - return 4 - - # get watched state from xbmc - if self.get_watched_xbmc(0): - utils.showNotification(utils.getString(32102), utils.getString(32603), xbmc.LOGERROR) - return 5 - - if self.sync_tvshows(): - utils.showNotification(utils.getString(32102), utils.getString(32604), xbmc.LOGERROR) - return 5 - - # attempt to merge the database from dropbox - if DROPBOX_ENABLED and utils.getSetting("dropbox_enabled") == 'true' and self.merge_dropbox_local(): - utils.showNotification(utils.getString(32102), utils.getString(32607), xbmc.LOGERROR) - # do not abort execution of the whole addon if dropbox fails (e.g. due to network issues) - # return 8 - - # import from Kodi into addon database - res = self.write_wl_wdata() - if res == 2: # user exit - return 0 - elif res == 1: # error - utils.showNotification(utils.getString(32102), utils.getString(32604), xbmc.LOGERROR) - return 6 - - # export from addon database into Kodi database - res = self.write_xbmc_wdata((utils.getSetting("progressdialog") == 'true'), 2) - if res == 2: # user exit - return 0 - elif res == 1: # error - utils.showNotification(utils.getString(32102), utils.getString(32605), xbmc.LOGERROR) - return 7 - - utils.showNotification(utils.getString(32101), utils.getString(32107), xbmc.LOGINFO) - utils.log(u'runUpdate exited with success', xbmc.LOGDEBUG) - - # sync with dropbox - if DROPBOX_ENABLED and utils.getSetting("dropbox_enabled") == 'true': - if self.merge_local_dropbox() == 0: - self.close_db(2) # save the database to file. - self.pushToDropbox() - else: - return 9 - - # close the watchedlist database. Is only closed locally in case of error - self.close_db(1) - - # delete old backup files of the database - # do this at the end for not destroying valuable backup in case something went wrong before - if self.database_backup_delete(): - return 10 - return 0 - except SystemExit: - return 2 - except BaseException: - buggalo.onExceptionRaised() - - def load_db(self, manualstart=False): - """Load WL database - - Args: - manualstart: True if called manually; only retry opening db once - - Returns: - return code: - 0 successfully opened database - 1 error - 2 shutdown (serious error in subfunction) - """ - - try: - if int(utils.getSetting("db_format")) != 1: - # SQlite3 database in a file - # load the db path - if utils.getSetting("extdb") == 'false': - # use the default file - self.dbdirectory = xbmcvfs.translatePath(utils.data_dir()) - buggalo.addExtraData('dbdirectory', self.dbdirectory) - self.dbpath = os.path.join(self.dbdirectory, "watchedlist.db") - else: - wait_minutes = 1 # retry waittime if db path does not exist/ is offline - - while not self.monitor.abortRequested(): - # use a user specified file, for example to synchronize multiple clients - self.dbdirectory = xbmcvfs.translatePath(utils.getSetting("dbpath")) - self.dbfileaccess = utils.fileaccessmode(self.dbdirectory) - self.dbpath = os.path.join(self.dbdirectory, utils.getSetting("dbfilename")) - - if not xbmcvfs.exists(self.dbdirectory): # do not use os.path.exists to access smb:// paths - if manualstart: - utils.log(u'db path does not exist: %s' % self.dbdirectory, xbmc.LOGWARNING) - return 1 # raise error on manual start if directory not accessible (we do not want to wait in that case) - else: - utils.log(u'db path does not exist, wait %d minutes: %s' % (wait_minutes, self.dbdirectory), xbmc.LOGWARNING) - - utils.showNotification(utils.getString(32102), utils.getString(32002) % self.dbdirectory, xbmc.LOGWARNING) - # Wait "wait_minutes" minutes until next check for file path (necessary on network shares, that are offline) - wait_minutes += wait_minutes # increase waittime until next check - if self.monitor.waitForAbort(wait_minutes * 60): - return 2 - else: - break # directory exists, continue below - - # on unix, smb-shares can not be accessed with sqlite3 --> copy the db with Kodi file system operations and work in mirror directory - buggalo.addExtraData('dbfileaccess', self.dbfileaccess) - buggalo.addExtraData('dbdirectory', self.dbdirectory) - buggalo.addExtraData('dbpath', self.dbpath) - if self.dbfileaccess == 'copy': - self.dbdirectory_copy = self.dbdirectory - self.dbpath_copy = self.dbpath # path to db file as in the settings (but not accessable) - buggalo.addExtraData('dbdirectory_copy', self.dbdirectory_copy) - buggalo.addExtraData('dbpath_copy', self.dbpath_copy) - # work in copy directory in the Kodi profile folder - self.dbdirectory = os.path.join(xbmcvfs.translatePath(utils.data_dir()), 'dbcopy' + os.sep) - if not xbmcvfs.exists(self.dbdirectory): # directory has to end with '/' (os.sep) - xbmcvfs.mkdir(self.dbdirectory) - utils.log(u'created directory %s' % str(self.dbdirectory)) - self.dbpath = os.path.join(self.dbdirectory, "watchedlist.db") - if xbmcvfs.exists(self.dbpath_copy): - success = xbmcvfs.copy(self.dbpath_copy, self.dbpath) # copy the external db file to local mirror directory - utils.log(u'copied db file from share: %s -> %s. Success: %d' % (self.dbpath_copy, self.dbpath, success), xbmc.LOGDEBUG) - - buggalo.addExtraData('dbdirectory', self.dbdirectory) - buggalo.addExtraData('dbpath', self.dbpath) - - # connect to the local wl database. create database if it does not exist - self.sqlcon_wl = sqlite3.connect(self.dbpath) - self.sqlcursor_wl = self.sqlcon_wl.cursor() - else: - # MySQL Database on a server - self.sqlcon_wl = mysql.connector.connect(user=utils.getSetting("mysql_user"), password=utils.getSetting("mysql_pass"), database=utils.getSetting("mysql_db"), host=utils.getSetting("mysql_server"), port=utils.getSetting("mysql_port")) - self.sqlcursor_wl = self.sqlcon_wl.cursor() - - # create tables if they don't exist - if int(utils.getSetting("db_format")) != 1: # sqlite file - self.sqlcursor_wl.execute(QUERY_CREATE_MV_SQLITE) - self.sqlcursor_wl.execute(QUERY_CREATE_EP_SQLITE) - self.sqlcursor_wl.execute(QUERY_CREATE_SS_SQLITE) - else: # mysql network database - self.sqlcursor_wl.execute(QUERY_CREATE_MV_MYSQL) - self.sqlcursor_wl.execute(QUERY_CREATE_EP_MYSQL) - self.sqlcursor_wl.execute(QUERY_CREATE_SS_MYSQL) - - # check for dropbox - if DROPBOX_ENABLED and utils.getSetting("dropbox_enabled") == 'true': - # Download Dropbox database only once a day to reduce traffic. - if time.time() > self.downloaded_dropbox_timestamp + 3600.0 * 24.0: - if self.pullFromDropbox(): - return 1 - self.downloaded_dropbox_timestamp = time.time() - # connect to the dropbox wl database. - if self.dropbox_path is not None: - self.sqlcon_db = sqlite3.connect(self.dropbox_path) - self.sqlcursor_db = self.sqlcon_db.cursor() - # create tables in dropbox file, if they don't exist - self.sqlcursor_db.execute(QUERY_CREATE_MV_SQLITE) - self.sqlcursor_db.execute(QUERY_CREATE_EP_SQLITE) - self.sqlcursor_db.execute(QUERY_CREATE_SS_SQLITE) - - buggalo.addExtraData('db_connstatus', 'connected') - except sqlite3.Error as err: - try: - errstring = err.args[0] # TODO: Find out, why this does not work some times - except BaseException: - errstring = '' - utils.log(u"Database error while opening %s. '%s'" % (self.dbpath, errstring), xbmc.LOGERROR) - utils.showNotification(utils.getString(32109), errstring, xbmc.LOGERROR) - self.close_db(3) - buggalo.addExtraData('db_connstatus', 'sqlite3 error, closed') - return 1 - except mysql.connector.Error as err: - # Catch common mysql errors and show them to guide the user - utils.log(u"Database error while opening mySQL DB %s [%s:%s@%s]. %s" % (utils.getSetting("mysql_db"), utils.getSetting("mysql_user"), utils.getSetting("mysql_pass"), utils.getSetting("mysql_db"), err.msg), xbmc.LOGERROR) - if err.errno == mysql.connector.errorcode.ER_DBACCESS_DENIED_ERROR: - utils.showNotification(utils.getString(32108), utils.getString(32210) % (utils.getSetting("mysql_user"), utils.getSetting("mysql_db")), xbmc.LOGERROR) - elif err.errno == mysql.connector.errorcode.ER_ACCESS_DENIED_ERROR: - utils.showNotification(utils.getString(32108), utils.getString(32208), xbmc.LOGERROR) - elif err.errno == mysql.connector.errorcode.ER_BAD_DB_ERROR: - utils.showNotification(utils.getString(32108), utils.getString(32209) % utils.getSetting("mysql_db"), xbmc.LOGERROR) - else: - utils.showNotification(utils.getString(32108), err.msg, xbmc.LOGERROR) - buggalo.addExtraData('db_connstatus', 'mysql error, closed') - self.close_db(3) - return 1 - except SystemExit: - return 1 - except BaseException: - utils.log(u"Error while opening %s: %s" % (self.dbpath, sys.exc_info()[2]), xbmc.LOGERROR) - self.close_db(3) - buggalo.addExtraData('dbpath', self.dbpath) - buggalo.addExtraData('db_connstatus', 'error, closed') - buggalo.onExceptionRaised() - return 1 - # only commit the changes if no error occured to ensure database persistence - self.sqlcon_wl.commit() - return 0 - - def close_db(self, flag): - """Close WL database - Argument: - flag - 1 for closing the WatchedList database - 2 for closing the DropBox database - 3 for closing both - - Returns: - return code: - 0 successfully closed database - 1 error - """ - # close watchedlist db (if it is open) - if self.sqlcon_wl and (flag == 1 or flag == 3): - if self.sqlcon_wl: - self.sqlcon_wl.close() - self.sqlcon_wl = 0 - # copy the db file back to the shared directory, if needed - if utils.getSetting("db_format") == '0' and self.dbfileaccess == 'copy': - if xbmcvfs.exists(self.dbpath): - success = xbmcvfs.copy(self.dbpath, self.dbpath_copy) - utils.log(u'copied db file to share: %s -> %s. Success: %d' % (self.dbpath, self.dbpath_copy, success), xbmc.LOGDEBUG) - if not success: - utils.showNotification(utils.getString(32102), utils.getString(32606) % self.dbpath, xbmc.LOGERROR) - return 1 - buggalo.addExtraData('db_connstatus', 'closed') - # close dropbox db - if flag == 2 or flag == 3: - if self.sqlcon_db: - self.sqlcon_db.close() - self.sqlcon_db = 0 - return 0 - - def get_watched_xbmc(self, silent): - """Get Watched States of Kodi Database - - Args: - silent: Do not show notifications if True - - Returns: - return code: - 0 success - 1 error - 4 planned exit (no error) - """ - try: - - ############################################ - # first tv shows with TheTVDB-ID, then tv episodes - if utils.getSetting("w_episodes") == 'true': - ############################################ - # get imdb tv-show id from Kodi database - utils.log(u'get_watched_xbmc: Get all TV shows from Kodi database', xbmc.LOGDEBUG) - json_response = utils.executeJSON({ - "jsonrpc": "2.0", - "method": "VideoLibrary.GetTVShows", - "params": { - "properties": ["title", "uniqueid"], - "sort": {"order": "ascending", "method": "title"} - }, - "id": 1}) - if 'result' in json_response and json_response['result'] is not None and 'tvshows' in json_response['result']: - for item in json_response['result']['tvshows']: - if self.monitor.abortRequested(): - self.close_db(3) - return 4 - tvshowId_xbmc = int(item['tvshowid']) - if not 'uniqueid' in item: - utils.log(u'get_watched_xbmc: tv show "%s" has no field uniqueid in database. tvshowid=%d. Try rescraping.' % (item['title'], tvshowId_xbmc), xbmc.LOGINFO) - continue - try: - tvshowId_tvdb = int(item['uniqueid']['tvdb']) - except BaseException: - utils.log(u'get_watched_xbmc: tv show "%s" has no tvdb-number in database. tvshowid=%d. Unique IDs: %s. Try rescraping.' % (item['title'], tvshowId_xbmc, str(list(item['uniqueid'].keys()))), xbmc.LOGINFO) - if not silent: - utils.showNotification(utils.getString(32101), utils.getString(32297) % (item['title'], tvshowId_xbmc), xbmc.LOGINFO) - tvshowId_tvdb = int(0) - self.tvshows[tvshowId_xbmc] = list([tvshowId_tvdb, item['title']]) - if tvshowId_tvdb > 0: - self.tvshownames[tvshowId_tvdb] = item['title'] - - # Get all watched movies and episodes by unique id from xbmc-database via JSONRPC - self.watchedmovielist_xbmc = list([]) - self.watchedepisodelist_xbmc = list([]) - for modus in ['movie', 'episode']: - if self.monitor.abortRequested(): - self.close_db(3) - return 4 - buggalo.addExtraData('modus', modus) - if modus == 'movie' and utils.getSetting("w_movies") != 'true': - continue - if modus == 'episode' and utils.getSetting("w_episodes") != 'true': - continue - utils.log(u'get_watched_xbmc: Get all %ss from Kodi database' % modus, xbmc.LOGDEBUG) - if modus == 'movie': - # use the JSON-RPC to access the xbmc-database. - json_response = utils.executeJSON({ - "jsonrpc": "2.0", - "method": "VideoLibrary.GetMovies", - "params": { - "properties": ["title", "year", "lastplayed", "playcount", "uniqueid"], - "sort": {"order": "ascending", "method": "title"} - }, - "id": 1 - }) - else: - json_response = utils.executeJSON({ - "jsonrpc": "2.0", - "method": "VideoLibrary.GetEpisodes", - "params": { - "properties": ["tvshowid", "season", "episode", "playcount", "showtitle", "lastplayed", "uniqueid"] - }, - "id": 1 - }) - if modus == 'movie': - searchkey = 'movies' - else: - searchkey = 'episodes' - if 'result' in json_response and json_response['result'] is not None and searchkey in json_response['result']: - # go through all watched movies and save them in the class-variable self.watchedmovielist_xbmc - for item in json_response['result'][searchkey]: - if self.monitor.abortRequested(): - break - if not 'uniqueid' in item: - if modus == 'movie': - utils.log(u'get_watched_xbmc: Movie %s has no field uniqueid in database. Try rescraping.' % (item['title']), xbmc.LOGINFO) - else: # episode - utils.log(u'get_watched_xbmc: Episode id %d (show %d, S%02dE%02d) has no field uniqueid in database. Try rescraping.' % (item['episodeid'], item['tvshowid'], item['season'], item['episode']), xbmc.LOGINFO) - continue - if modus == 'movie': - name = item['title'] + ' (' + str(item['year']) + ')' - try: - # check if movie number is in imdb-format (scraper=imdb) - res = re.compile(r'tt(\d+)').findall(item['uniqueid']['imdb']) - imdbId = int(res[0]) - except BaseException: - # no imdb-number for this movie in database. Skip - utils.log(u'get_watched_xbmc: Movie %s has no imdb-number in database. movieid=%d. IDs are %s. Try rescraping' % (name, int(item['movieid']), str(list(item['uniqueid'].keys()))), xbmc.LOGINFO) - imdbId = 0 - continue - else: # episodes - tvshowId_xbmc = item['tvshowid'] - try: - tvshowName_xbmc = item['showtitle'] - except BaseException: - # TODO: Something is wrong with the database or the json output since the field tvshowid is missing although requested. Check if this error still occurs and remove try-except - utils.log(u'get_watched_xbmc: TV episode id %d (show %d, S%02dE%02d) has no associated showtitle. Skipping.' % (item['episodeid'], item['tvshowid'], item['season'], item['episode']), xbmc.LOGWARNING) - continue - name = '%s S%02dE%02d' % (tvshowName_xbmc, item['season'], item['episode']) - try: - tvshowId_tvdb = self.tvshows[tvshowId_xbmc][0] - except BaseException: - utils.log(u'get_watched_xbmc: Kodi tv showid %d is not in Kodi-table tvshows. Skipping episode id %d (%s)' % (item['tvshowid'], item['episodeid'], name), xbmc.LOGINFO) - continue - if tvshowId_tvdb == 0: - utils.log(u'get_watched_xbmc: tvshow %d has no tvdb-number. Skipping episode id %d (%s)' % (item['tvshowid'], item['episodeid'], name), xbmc.LOGDEBUG) - continue - lastplayed = utils.sqlDateTimeToTimeStamp(item['lastplayed']) # convert to integer-timestamp - playcount = int(item['playcount']) - # add data to the class-variables - if modus == 'movie': - self.watchedmovielist_xbmc.append(list([imdbId, 0, 0, lastplayed, playcount, name, 0, int(item['movieid'])])) # 0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6empty, 7movieid - else: - self.watchedepisodelist_xbmc.append(list([tvshowId_tvdb, int(item['season']), int(item['episode']), lastplayed, playcount, name, 0, int(item['episodeid'])])) # 0tvdbnumber, 1season, 2episode, 3lastplayed, 4playcount, 5name, 6empty, 7episodeid - if not silent: - utils.showNotification(utils.getString(32101), utils.getString(32299) % (len(self.watchedmovielist_xbmc), len(self.watchedepisodelist_xbmc)), xbmc.LOGINFO) - if self.monitor.abortRequested(): - self.close_db(3) - return 4 - return 0 - except SystemExit: - return 4 - except BaseException: - utils.log(u'get_watched_xbmc: error getting the Kodi database : %s' % sys.exc_info()[2], xbmc.LOGERROR) - self.close_db(3) - buggalo.onExceptionRaised() - return 1 - - def get_watched_wl(self, silent): - """Get Watched States of WL Database - - Args: - silent: Do not show notifications if True - - Returns: - return code: - 0 successfully got watched states from WL-database - 1 unknown error (programming related) - 2 shutdown (error in subfunction) - 3 error related to opening the database - 4 exit requested (no error) - """ - - try: - buggalo.addExtraData('self_sqlcursor', self.sqlcursor_wl) - buggalo.addExtraData('self_sqlcon', self.sqlcon_wl) - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(): - return 2 - - # get watched movies from addon database - self.watchedmovielist_wl = list([]) - if utils.getSetting("w_movies") == 'true': - utils.log(u'get_watched_wl: Get watched movies from WL database', xbmc.LOGDEBUG) - if int(utils.getSetting("db_format")) != 1: # SQLite3 File. Timestamp stored as integer - self.sqlcursor_wl.execute(QUERY_SELECT_MV_SQLITE) - else: # mySQL: Create integer timestamp with the request - self.sqlcursor_wl.execute(QUERY_SELECT_MV_MYSQL) - rows = self.sqlcursor_wl.fetchall() - for row in rows: - if self.monitor.abortRequested(): - self.close_db(1) - return 4 - self.watchedmovielist_wl.append(list([int(row[0]), 0, 0, int(row[1]), int(row[2]), row[3], int(row[4])])) # 0tvdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6lastChange - - # get watched episodes from addon database - self.watchedepisodelist_wl = list([]) - if utils.getSetting("w_episodes") == 'true': - utils.log(u'get_watched_wl: Get watched episodes from WL database', xbmc.LOGDEBUG) - if int(utils.getSetting("db_format")) != 1: # SQLite3 File. Timestamp stored as integer - self.sqlcursor_wl.execute(QUERY_SELECT_EP_SQLITE) - else: # mySQL: Create integer timestamp with the request - self.sqlcursor_wl.execute(QUERY_SELECT_EP_MYSQL) - - rows = self.sqlcursor_wl.fetchall() - for row in rows: - if self.monitor.abortRequested(): - self.close_db(1) - return 4 - try: - name = '%s S%02dE%02d' % (self.tvshownames[int(row[0])], int(row[1]), int(row[2])) - except BaseException: - name = 'tvdb-id %d S%02dE%02d' % (int(row[0]), int(row[1]), int(row[2])) - self.watchedepisodelist_wl.append(list([int(row[0]), int(row[1]), int(row[2]), int(row[3]), int(row[4]), name, int(row[5])])) # 0tvdbnumber, 1season, 2episode, 3lastplayed, 4playcount, 5name, 6lastChange - - if not silent: - utils.showNotification(utils.getString(32101), utils.getString(32298) % (len(self.watchedmovielist_wl), len(self.watchedepisodelist_wl)), xbmc.LOGINFO) - return 0 - except sqlite3.Error as err: - try: - errstring = err.args[0] # TODO: Find out, why this does not work some times - except BaseException: - errstring = '' - utils.log(u'get_watched_wl: SQLite Database error getting the wl database. %s' % errstring, xbmc.LOGERROR) - self.close_db(1) - # error could be that the database is locked (for tv show strings). This is not an error to disturb the other functions - return 3 - except mysql.connector.Error as err: - utils.log(u'get_watched_wl: MySQL Database error getting the wl database. %s' % err, xbmc.LOGERROR) - return 3 - except SystemExit: - return 4 - except BaseException: - utils.log(u'get_watched_wl: Error getting the wl database : %s' % sys.exc_info()[2], xbmc.LOGERROR) - self.close_db(1) - buggalo.onExceptionRaised() - return 1 - - def sync_tvshows(self): - """Sync List of TV Shows from Kodi to WL Database - - Returns: - return code: - 0 successfully synched tv shows - 1 database access error - 2 database loading error - 4 exit requested (no error) - """ - - try: - utils.log(u'sync_tvshows: sync tvshows with wl database : %s' % sys.exc_info()[2], xbmc.LOGDEBUG) - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(): - return 2 - # write eventually new tv shows to wl database - for xbmcid in self.tvshows: - if self.monitor.abortRequested(): - break # all queries will be commited - values = self.tvshows[xbmcid] - if values[0] == 0: - # no imdb-id saved for this tv show. Nothing to process. - continue - if int(utils.getSetting("db_format")) != 1: # sqlite3 - self.sqlcursor_wl.execute(QUERY_INSERT_SS_SQLITE, values) - else: # mysql - self.sqlcursor_wl.execute(QUERY_INSERT_SS_MYSQL, values) - self.database_backup() - self.sqlcon_wl.commit() - if self.monitor.abortRequested(): - self.close_db(1) - return 4 - # get all known tv shows from wl database - self.sqlcursor_wl.execute("SELECT idShow, title FROM tvshows") - rows = self.sqlcursor_wl.fetchall() - for row_i in rows: - if self.monitor.abortRequested(): - break - self.tvshownames[int(row_i[0])] = row_i[1] - except sqlite3.Error as err: - try: - errstring = err.args[0] # TODO: Find out, why this does not work some times - except BaseException: - errstring = '' - utils.log(u'sync_tvshows: SQLite Database error accessing the wl database: ''%s''' % errstring, xbmc.LOGERROR) - self.close_db(1) - # error could be that the database is locked (for tv show strings). - return 1 - except mysql.connector.Error as err: - utils.log(u"sync_tvshows: MySQL Database error accessing the wl database: ''%s''" % (err), xbmc.LOGERROR) - self.close_db(1) - return 1 - except SystemExit: - return 4 - except BaseException: - utils.log(u'sync_tvshows: Error getting the wl database: ''%s''' % sys.exc_info()[2], xbmc.LOGERROR) - self.close_db(1) - buggalo.onExceptionRaised() - return 1 - if self.monitor.abortRequested(): - return 4 - return 0 - - def write_wl_wdata(self): - """Go through all watched movies from Kodi and check whether they are up to date in the addon database - - Returns: - return code: - 0 successfully written WL - 1 program exception - 2 database loading error - 4 SystemExit - """ - - buggalo.addExtraData('self_sqlcursor', self.sqlcursor_wl) - buggalo.addExtraData('self_sqlcon', self.sqlcon_wl) - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(): - return 2 - for modus in ['movie', 'episode']: - buggalo.addExtraData('modus', modus) - if modus == 'movie' and utils.getSetting("w_movies") != 'true': - continue - if modus == 'episode' and utils.getSetting("w_episodes") != 'true': - continue - utils.log(u'write_wl_wdata: Write watched %ss to WL database' % modus, xbmc.LOGDEBUG) - count_insert = 0 - count_update = 0 - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS = xbmcgui.DialogProgress() - DIALOG_PROGRESS.create(utils.getString(32101), utils.getString(32105)) - if modus == 'movie': - list_length = len(self.watchedmovielist_xbmc) - else: - list_length = len(self.watchedepisodelist_xbmc) - - for i in range(list_length): - if self.monitor.abortRequested(): - break # this loop can take some time in debug mode and prevents Kodi to exit - if utils.getSetting("progressdialog") == 'true' and DIALOG_PROGRESS.iscanceled(): - if modus == 'movie': - strno = 32202 - else: - strno = 32203 - utils.showNotification(utils.getString(strno), utils.getString(32301) % (count_insert, count_update), xbmc.LOGINFO) - return 2 - if modus == 'movie': - row_xbmc = self.watchedmovielist_xbmc[i] - else: - row_xbmc = self.watchedepisodelist_xbmc[i] - - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.update(int(100 * (i + 1) / list_length), (utils.getString(32105)+"\n"+utils.getString(32610) % (i + 1, list_length, row_xbmc[5]))) - - try: - res = self._wl_update_media(modus, row_xbmc, 0, 0, 0) - count_insert += res['num_new'] - count_update += res['num_update'] - - except sqlite3.Error as err: - try: - errstring = err.args[0] # TODO: Find out, why this does not work some times - except BaseException: - errstring = '' - utils.log(u'write_wl_wdata: SQLite Database error ''%s'' while updating %s %s' % (errstring, modus, row_xbmc[5]), xbmc.LOGERROR) - # error at this place is the result of duplicate movies, which produces a DUPLICATE PRIMARY KEY ERROR - return 1 - except mysql.connector.Error as err: - utils.log(u'write_wl_wdata: MySQL Database error ''%s'' while updating %s %s' % (err, modus, row_xbmc[5]), xbmc.LOGERROR) - self.close_db(1) - return 1 # error while writing. Do not continue with episodes, if movies raised an exception - except SystemExit: - return 4 - except BaseException: - utils.log(u'write_wl_wdata: Error while updating %s %s: %s' % (modus, row_xbmc[5], sys.exc_info()[2]), xbmc.LOGERROR) - self.close_db(1) - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.close() - buggalo.addExtraData('count_update', count_update) - buggalo.addExtraData('count_insert', count_insert) - buggalo.onExceptionRaised() - return 1 - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.close() - if self.monitor.abortRequested(): - break # break outer loop if exit requested. Do not do any database operations below - # only commit the changes if no error occured to ensure database persistence - if count_insert > 0 or count_update > 0: - self.database_backup() - self.sqlcon_wl.commit() - if modus == 'movie': - strno = [32202, 32301] - else: - strno = [32203, 32301] - utils.showNotification(utils.getString(strno[0]), utils.getString(strno[1]) % (count_insert, count_update), xbmc.LOGINFO) - return 0 - - def write_xbmc_wdata(self, progressdialogue, notifications): - """Go through all watched movies/episodes from the wl-database and check, - if the xbmc-database is up to date - - Args: - progressdialogue: Show Progress Bar if True - notifications: 0= no, 1=only changed info, 2=all - - Returns: - return code: - 0 successfully written Kodi database - 1 program exception - 2 cancel by user interaction - 4 SystemExit - """ - - for modus in ['movie', 'episode']: - buggalo.addExtraData('modus', modus) - if modus == 'movie' and utils.getSetting("w_movies") != 'true': - continue - if modus == 'episode' and utils.getSetting("w_episodes") != 'true': - continue - - utils.log(u'write_xbmc_wdata: Write watched %ss to Kodi database (pd=%d, noti=%d)' % (modus, progressdialogue, notifications), xbmc.LOGDEBUG) - count_update = 0 - if progressdialogue: - DIALOG_PROGRESS = xbmcgui.DialogProgress() - DIALOG_PROGRESS.create(utils.getString(32101), utils.getString(32106)) - - # list to iterate over - if modus == 'movie': - list_length = len(self.watchedmovielist_wl) - else: - list_length = len(self.watchedepisodelist_wl) - # iterate over wl-list - for j in range(list_length): - if self.monitor.abortRequested(): - break # this loop can take some time in debug mode and prevents Kodi to exit - if progressdialogue and DIALOG_PROGRESS.iscanceled(): - if notifications > 0: - utils.showNotification(utils.getString(32204), utils.getString(32302) % (count_update), xbmc.LOGINFO) - return 2 - # get media-specific list items - if modus == 'movie': - row_wl = self.watchedmovielist_wl[j] - else: - row_wl = self.watchedepisodelist_wl[j] - season = row_wl[1] - episode = row_wl[2] - imdbId = row_wl[0] - name = row_wl[5] - - if progressdialogue: - DIALOG_PROGRESS.update(int(100 * (j + 1) / list_length), (utils.getString(32106)+"\n"+utils.getString(32610) % (j + 1, list_length, name))) - try: - # search the unique movie/episode id in the xbmc-list - if modus == 'movie': - indices = [i for i, x in enumerate(self.watchedmovielist_xbmc) if x[0] == imdbId] # the movie can have multiple entries in xbmc - else: - indices = [i for i, x in enumerate(self.watchedepisodelist_xbmc) if x[0] == imdbId and x[1] == season and x[2] == episode] - lastplayed_wl = row_wl[3] - playcount_wl = row_wl[4] - lastchange_wl = row_wl[6] - if indices: - # the movie/episode is already in the xbmc-list - for i in indices: - if modus == 'movie': - row_xbmc = self.watchedmovielist_xbmc[i] - else: - row_xbmc = self.watchedepisodelist_xbmc[i] - - lastplayed_xbmc = row_xbmc[3] - playcount_xbmc = row_xbmc[4] - - change_xbmc_db = False - # check if movie/episode is set as unwatched in the wl database - if playcount_wl != playcount_xbmc and lastchange_wl > lastplayed_xbmc: - change_xbmc_db = True - # compare playcount and lastplayed (update if Kodi data is older) - if playcount_xbmc < playcount_wl or (lastplayed_xbmc < lastplayed_wl and playcount_wl > 0): - change_xbmc_db = True - if not change_xbmc_db: - # utils.log(u'write_xbmc_wdata: Kodi database up-to-date for tt%d, %s' % (imdbId, row_xbmc[2]), xbmc.LOGDEBUG) - continue - # check if the lastplayed-timestamp in wl is useful - if playcount_wl == 0: - lastplayed_new = 0 - else: - if lastplayed_wl == 0: - lastplayed_new = lastplayed_xbmc - else: - lastplayed_new = lastplayed_wl - # update database - mediaid = row_xbmc[7] - if modus == 'movie': - jsonmethod = "VideoLibrary.SetMovieDetails" - idfieldname = "movieid" - else: - jsonmethod = "VideoLibrary.SetEpisodeDetails" - idfieldname = "episodeid" - jsondict = { - "jsonrpc": "2.0", - "method": jsonmethod, - "params": {idfieldname: mediaid, "playcount": playcount_wl, "lastplayed": utils.TimeStamptosqlDateTime(lastplayed_new)}, - "id": 1 - } - json_response = utils.executeJSON(jsondict) - if 'result' in json_response and json_response['result'] == 'OK': - utils.log(u'write_xbmc_wdata: Kodi database updated for %s. playcount: {%d -> %d}, lastplayed: {"%s" -> "%s"} (%sid=%d)' % (name, playcount_xbmc, playcount_wl, utils.TimeStamptosqlDateTime(lastplayed_xbmc), utils.TimeStamptosqlDateTime(lastplayed_new), modus, mediaid), xbmc.LOGINFO) - if playcount_wl == 0: - if notifications > 0: - utils.showNotification(utils.getString(32404), name, xbmc.LOGDEBUG) - else: - if notifications > 0: - utils.showNotification(utils.getString(32401), name, xbmc.LOGDEBUG) - count_update += 1 - # update the xbmc-db-mirror-variable - if modus == 'movie': - self.watchedmovielist_xbmc[i][3] = lastplayed_new - self.watchedmovielist_xbmc[i][4] = playcount_wl - else: - self.watchedepisodelist_xbmc[i][3] = lastplayed_new - self.watchedepisodelist_xbmc[i][4] = playcount_wl - else: - utils.log(u'write_xbmc_wdata: error updating Kodi database. %s. json_response=%s' % (name, str(json_response)), xbmc.LOGERROR) - - else: - # the movie is in the watched-list but not in the xbmc-list -> no action - # utils.log(u'write_xbmc_wdata: movie not in Kodi database: tt%d, %s' % (imdbId, row_xbmc[2]), xbmc.LOGDEBUG) - continue - except SystemExit: - return 4 - except BaseException: - utils.log(u"write_xbmc_wdata: Error while updating %s %s: %s" % (modus, name, sys.exc_info()[2]), xbmc.LOGERROR) - if progressdialogue: - DIALOG_PROGRESS.close() - buggalo.addExtraData('count_update', count_update) - buggalo.onExceptionRaised() - return 1 - - if progressdialogue: - DIALOG_PROGRESS.close() - if self.monitor.abortRequested(): - break # break the outer loop (movie/episode if exit requested) - if notifications > 1: - if modus == 'movie': - strno = [32204, 32302] - else: - strno = [32205, 32303] - utils.showNotification(utils.getString(strno[0]), utils.getString(strno[1]) % (count_update), xbmc.LOGINFO) - return 0 - - def database_backup(self): - """create a copy of the database, in case something goes wrong (only if database file is used) - - Returns: - return code: - 0 successfully copied database - 1 file writing error - 2 program exception - 4 SystemExit - """ - - if utils.getSetting("db_format") != '0': - return 0 # no backup needed since we are using mysql database - - if utils.getSetting('dbbackupcount') == '0': - return 0 # no backup requested in the addon settings - - if not self.dbbackupdone: - if not xbmcvfs.exists(self.dbpath): - utils.log(u'database_backup: directory %s does not exist. No backup possible.' % self.dbpath, xbmc.LOGERROR) - return 1 - now = datetime.datetime.now() - timestr = u'%04d%02d%02d_%02d%02d%02d' % (now.year, now.month, now.day, now.hour, now.minute, now.second) - zipfilename = os.path.join(self.dbdirectory, timestr + u'-watchedlist.db.zip') - try: - with zipfile.ZipFile(zipfilename, 'w') as zf: - zf.write(self.dbpath, arcname='watchedlist.db', compress_type=zipfile.ZIP_DEFLATED) - self.dbbackupdone = True - utils.log(u'database_backup: database backup copy created to %s' % zipfilename, xbmc.LOGINFO) - # copy the zip file with Kodi file system, if needed - if self.dbfileaccess == 'copy': - xbmcvfs.copy(zipfilename, os.path.join(self.dbdirectory_copy, timestr + u'-watchedlist.db.zip')) - xbmcvfs.delete(zipfilename) - except ValueError as err: # e.g. "timestamps before 1980" - utils.showNotification(utils.getString(32102), utils.getString(32608) % str(err), xbmc.LOGERROR) - utils.log(u'database_backup: Error creating database backup %s: %s' % (zipfilename, str(err)), xbmc.LOGERROR) - self.dbbackupdone = True # pretend this was done to avoid log spamming - return 2 - except IOError as err: # e.g. "permission denied" - utils.showNotification(utils.getString(32102), utils.getString(32608) % err.strerror, xbmc.LOGERROR) - utils.log(u'database_backup: Error creating database backup %s: (%s) %s' % (zipfilename, err.errno, err.strerror), xbmc.LOGERROR) - self.dbbackupdone = True # pretend this was done to avoid log spamming - return 2 - except SystemExit: - return 4 - except BaseException: - buggalo.addExtraData('zipfilename', zipfilename) - buggalo.onExceptionRaised() - return 2 - return 0 - - def database_backup_delete(self): - """delete old backup files - - Returns: - return code: - 0 no operation done or operation successful - 1 error deleting the backups - """ - - if not self.dbbackupdone: - return 0 - # Limit number of backup files to the specified value - backupsize = int(utils.getSetting('dbbackupcount')) - if backupsize == -1: - return 0 # do not delete old backup files - if self.dbfileaccess == 'copy': - # Database is on a network share. The backup is also copied to that location. Delete old backups there. - backupdir = self.dbdirectory_copy - else: - # Database and backups are in the default folders - backupdir = self.dbdirectory - - files = xbmcvfs.listdir(backupdir)[1] - # find database copy files among all files in that directory - files_match = [] - for i, f in enumerate(files): - if self.monitor.abortRequested(): - break - if re.match(r'\d+_\d+-watchedlist\.db\.zip', f) is not None: # match the filename string from database_backup() - files_match.append(f) - files_match = sorted(files_match, reverse=True) - # Iterate over backup files starting with newest. Delete oldest - for i, f in enumerate(files_match): - if self.monitor.abortRequested(): - break - if i >= int(utils.getSetting('dbbackupcount')): - # delete file - utils.log(u'database_backup_delete: Delete old backup file %d/%d (%s)' % (i + 1, len(files_match), f), xbmc.LOGINFO) - try: - xbmcvfs.delete(os.path.join(backupdir, f)) - except BaseException: - utils.log(u'database_backup_delete: Error deleting old backup file %d (%s)' % (i, os.path.join(backupdir, f)), xbmc.LOGERROR) - return 1 - return 0 - - def watch_user_changes(self, idletime_old, idletime): - """check if the user made changes in the watched states. Especially setting movies as "not watched". - This can not be recognized by the other functions - - Args: - idletime_old: Old Idle Time - idletime: New Idle Time - - Returns: - return code: - 0 no operation done - 1 operation successful - 2 database error - 4 system exit (no error) - """ - - if xbmc.Player().isPlaying(): - return 0 - if idletime > idletime_old: - # the idle time increased. No user interaction probably happened - return 0 - self.watch_user_changes_count = self.watch_user_changes_count + 1 - utils.log(u'watch_user_changes: Check for user changes (no. %d)' % self.watch_user_changes_count, xbmc.LOGDEBUG) - - # save previous state - old_watchedmovielist_xbmc = self.watchedmovielist_xbmc - old_watchedepisodelist_xbmc = self.watchedepisodelist_xbmc - # get new state - self.get_watched_xbmc(1) - # save exception information - buggalo.addExtraData('len_old_watchedmovielist_xbmc', len(old_watchedmovielist_xbmc)) - buggalo.addExtraData('len_old_watchedepisodelist_xbmc', len(old_watchedepisodelist_xbmc)) - buggalo.addExtraData('len_self_watchedmovielist_xbmc', len(self.watchedmovielist_xbmc)) - buggalo.addExtraData('len_self_watchedepisodelist_xbmc', len(self.watchedepisodelist_xbmc)) - # Separate the change detection and the change in the database to - # prevent circle reference: Two steps for watching user changes - # First step: Compare states of movies/episodes - for modus in ['movie', 'episode']: - if self.monitor.abortRequested(): - return 4 - buggalo.addExtraData('modus', modus) - if modus == 'movie' and utils.getSetting("w_movies") != 'true': - continue - if modus == 'episode' and utils.getSetting("w_episodes") != 'true': - continue - if modus == 'movie': - list_new = self.watchedmovielist_xbmc - list_old = old_watchedmovielist_xbmc - else: - list_new = self.watchedepisodelist_xbmc - list_old = old_watchedepisodelist_xbmc - if not list_old or not list_new: - # one of the lists is empty: nothing to compare. No user changes noticable - continue - indices_changed = list([]) # list for corresponding new/old indices - for i_n, row_xbmc in enumerate(list_new): - if self.monitor.abortRequested(): - return 4 - mediaid = row_xbmc[7] - lastplayed_new = row_xbmc[3] - playcount_new = row_xbmc[4] - # index of this movie/episode in the old database (before the change by the user) - if (len(list_old) > i_n) and (list_old[i_n][7] == mediaid): - i_o = i_n # db did not change - else: # search the movieid - i_o = [i for i, x in enumerate(list_old) if x[7] == mediaid] - if not i_o: - continue # movie is not in old array - i_o = i_o[0] # convert list to int - lastplayed_old = list_old[i_o][3] - playcount_old = list_old[i_o][4] - - if playcount_new != playcount_old or lastplayed_new != lastplayed_old: - if playcount_new == playcount_old and playcount_new == 0: - continue # do not add lastplayed to database, when playcount = 0 - # The user changed the playcount or lastplayed. - # update wl with new watched state - indices_changed.append([i_n, i_o]) - - # Second step: Go through all movies changed by the user - for icx in indices_changed: - if self.monitor.abortRequested(): - return 4 - i_o = icx[1] - i_n = icx[0] - row_xbmc = list_new[i_n] - row_xbmc_old = list_old[i_o] - lastplayed_old = row_xbmc_old[3] - playcount_old = row_xbmc_old[4] - lastplayed_new = row_xbmc[3] - playcount_new = row_xbmc[4] - mediaid = row_xbmc[7] - utils.log(u'watch_user_changes: %s "%s" changed playcount {%d -> %d} lastplayed {"%s" -> "%s"}. %sid=%d' % (modus, row_xbmc[5], playcount_old, playcount_new, utils.TimeStamptosqlDateTime(lastplayed_old), utils.TimeStamptosqlDateTime(lastplayed_new), modus, mediaid)) - try: - self._wl_update_media(modus, row_xbmc, 1, 1, 0) - except sqlite3.Error as err: - try: - errstring = err.args[0] # TODO: Find out, why this does not work some times - except BaseException: - errstring = '' - utils.log(u'watch_user_changes: SQLite Database error (%s) while updating %s %s' % (errstring, modus, row_xbmc[5])) - utils.showNotification(utils.getString(32102), utils.getString(32606) % ('(%s)' % errstring), xbmc.LOGERROR) - # error because of db locked or similar error - self.close_db(1) - return 2 - except mysql.connector.Error as err: - # Catch common mysql errors and show them to guide the user - utils.log(u'watch_user_changes: MySQL Database error (%s) while updating %s %s' % (err, modus, row_xbmc[5])) - utils.showNotification(utils.getString(32102), utils.getString(32606) % ('(%s)' % err), xbmc.LOGERROR) - self.close_db(1) - return 2 - - # update Kodi watched status, e.g. to set duplicate movies also as watched - if indices_changed: - self.write_xbmc_wdata(0, 1) # this changes self.watchedmovielist_xbmc - return 1 - - def _wl_update_media(self, mediatype, row_xbmc, saveanyway, commit, lastChange): - """update the wl database for one movie/episode with the information in row_xbmc. - - This function is intended to be private and should not be called externally - - Args: - mediatype: 'episode' or 'movie' - row_xbmc: One row of the Kodi media table self.watchedmovielist_xbmc. - saveanyway: Skip checks whether not to save the changes - commit: The db change is committed directly (slow with many movies, but safe) - lastChange: Last change timestamp of the given data. - If 0: Data from kodi. - If >0: Data from other watchedlist database for merging - - Returns: Dict with fields - errcode: - 0 No errors - 2 error loading the database - num_new, num_update: - Number of new and updated entries - """ - retval = {'errcode': 0, 'num_new': 0, 'num_update': 0} - buggalo.addExtraData('self_sqlcursor', self.sqlcursor_wl) - buggalo.addExtraData('self_sqlcon', self.sqlcon_wl) - buggalo.addExtraData('len_self_watchedmovielist_wl', len(self.watchedmovielist_wl)) - buggalo.addExtraData('len_self_watchedepisodelist_wl', len(self.watchedepisodelist_wl)) - buggalo.addExtraData('len_self_tvshownames', len(self.tvshownames)) - buggalo.addExtraData('row_xbmc', row_xbmc) - buggalo.addExtraData('saveanyway', saveanyway) - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(): - retval['errcode'] = 2 - return retval - - buggalo.addExtraData('modus', mediatype) - # row_xbmc: 0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6empty, 7movieid - imdbId = row_xbmc[0] - lastplayed_xbmc = row_xbmc[3] - playcount_xbmc = row_xbmc[4] - name = row_xbmc[5] - if mediatype == 'episode': - season = row_xbmc[1] - episode = row_xbmc[2] - - self.database_backup() - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(): - retval['errcode'] = 2 - return retval - if not saveanyway and playcount_xbmc == 0 and lastChange == 0: - # playcount in xbmc-list is empty. Nothing to save - # utils.log(u'wl_update_%s: not watched in xbmc: tt%d, %s' % (modus, imdbId, name), xbmc.LOGDEBUG) - return retval - if lastChange == 0: - lastchange_new = int(time.time()) - else: # data from WL database with given last change timestamp - lastchange_new = lastChange - if lastplayed_xbmc == -1: # used for external calls - lastplayed_xbmc = int(time.time()) - if mediatype == 'movie': - j = [ii for ii, x in enumerate(self.watchedmovielist_wl) if x[0] == imdbId] - else: # if mediatype == 'episode': - j = [ii for ii, x in enumerate(self.watchedepisodelist_wl) if x[0] == imdbId and x[1] == season and x[2] == episode] - if j: # j is the list of indexes of the occurences of the given row - j = j[0] # there can only be one valid index j, since only one entry in wl per imdbId - # the movie is already in the watched-list - if mediatype == 'movie': - row_wl = self.watchedmovielist_wl[j] - else: - row_wl = self.watchedepisodelist_wl[j] - lastplayed_wl = row_wl[3] - playcount_wl = row_wl[4] - lastchange_wl = row_wl[6] - - if not saveanyway: - # check if an update of the wl database is necessary (xbmc watched status newer) - if lastChange == 0: # information from xbmc: Criterion Playcount and lastplayed-timestamp - if lastchange_wl > lastplayed_xbmc: - return retval # no update of WL-db. Return - if playcount_wl >= playcount_xbmc and lastplayed_wl >= lastplayed_xbmc: - return retval # everything up-to-date - elif lastChange <= lastchange_wl: # information from watchedlist. Only criterion: lastChange-timestamp - return retval - - # check if the lastplayed-timestamp in Kodi is useful - if lastplayed_xbmc == 0 and lastChange == 0: - lastplayed_new = lastplayed_wl - else: - lastplayed_new = lastplayed_xbmc - else: - lastplayed_new = lastplayed_xbmc - - if mediatype == 'movie': - if int(utils.getSetting("db_format")) != 1: # sqlite3 - sql = QUERY_MV_UPDATE_SQLITE - else: # mysql - sql = QUERY_MV_UPDATE_MYSQL - values = list([playcount_xbmc, lastplayed_new, lastchange_new, imdbId]) - else: - if int(utils.getSetting("db_format")) != 1: # sqlite3 - sql = QUERY_EP_UPDATE_SQLITE - else: # mysql - sql = QUERY_EP_UPDATE_MYSQL - values = list([playcount_xbmc, lastplayed_new, lastchange_new, imdbId, season, episode]) - self.sqlcursor_wl.execute(sql, values) - retval['num_update'] = self.sqlcursor_wl.rowcount - # update the local mirror variable of the wl database: # 0imdbnumber, season, episode, 3lastPlayed, 4playCount, 5title, 6lastChange - if mediatype == 'movie': - self.watchedmovielist_wl[j] = list([imdbId, 0, 0, lastplayed_new, playcount_xbmc, name, lastchange_new]) - else: - self.watchedepisodelist_wl[j] = list([imdbId, season, episode, lastplayed_new, playcount_xbmc, name, lastchange_new]) - utils.log(u'wl_update_%s: updated wl db for "%s" (id %d). playcount: {%d -> %d}. lastplayed: {"%s" -> "%s"}. lastchange: "%s. Affected %d row."' % (mediatype, name, imdbId, playcount_wl, playcount_xbmc, utils.TimeStamptosqlDateTime(lastplayed_wl), utils.TimeStamptosqlDateTime(lastplayed_new), utils.TimeStamptosqlDateTime(lastchange_new), self.sqlcursor_wl.rowcount), xbmc.LOGDEBUG) - if playcount_xbmc > 0: - utils.showNotification(utils.getString(32403), name, xbmc.LOGDEBUG) - else: - utils.showNotification(utils.getString(32405), name, xbmc.LOGDEBUG) - else: - # the movie is not in the watched-list -> insert the movie - # order: idMovieImdb,playCount,lastChange,lastPlayed,title - if mediatype == 'movie': - if int(utils.getSetting("db_format")) != 1: # sqlite3 - sql = QUERY_MV_INSERT_SQLITE - else: # mysql - sql = QUERY_MV_INSERT_MYSQL - values = list([imdbId, playcount_xbmc, lastchange_new, lastplayed_xbmc, name]) - else: # episode - if int(utils.getSetting("db_format")) != 1: # sqlite3 - sql = QUERY_EP_INSERT_SQLITE - else: # mysql - sql = QUERY_EP_INSERT_MYSQL - values = list([imdbId, season, episode, playcount_xbmc, lastchange_new, lastplayed_xbmc]) - self.sqlcursor_wl.execute(sql, values) - utils.log(u'wl_update_%s: new entry for wl database: "%s", lastChange="%s", lastPlayed="%s", playCount=%d. Affected %d row.' % (mediatype, name, utils.TimeStamptosqlDateTime(lastchange_new), utils.TimeStamptosqlDateTime(lastplayed_xbmc), playcount_xbmc, self.sqlcursor_wl.rowcount)) - retval['num_new'] = self.sqlcursor_wl.rowcount - # update the local mirror variable of the wl database - if mediatype == 'movie': - self.watchedmovielist_wl.append(list([imdbId, 0, 0, lastplayed_xbmc, playcount_xbmc, name, lastchange_new])) - else: - self.watchedepisodelist_wl.append(list([imdbId, season, episode, lastplayed_xbmc, playcount_xbmc, name, lastchange_new])) - if playcount_xbmc > 0: - utils.showNotification(utils.getString(32402), name, xbmc.LOGDEBUG) - else: - utils.showNotification(utils.getString(32405), name, xbmc.LOGDEBUG) - if commit: - self.sqlcon_wl.commit() - return retval - - def wl_update_media(self, mediatype, row_xbmc, saveanyway, commit, lastChange): - """update the wl database for one movie/episode with the information in row_xbmc. - - Function for external access with basic error handling - - Args: - mediatype: 'episode' or 'movie' - row_xbmc: One row of the Kodi media table self.watchedmovielist_xbmc or self.watchedepisodelist_xbmc. - List with [0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6empty, 7movieid] - or [0tvdbnumber, 1season, 2episode, 3lastplayed, 4playcount, 5name, 6empty, 7episodeid] - saveanyway: Skip checks whether not to save the changes - commit: The db change is committed directly (slow with many movies, but safe) - lastChange: Last change timestamp of the given data. - If 0: Data from kodi. - If >0: Data from other watchedlist database for merging - - Returns: Dict with fields - errcode: - 0 No errors - 1 error with the database - 2 error loading the database - num_new, num_update: - Number of new and updated entries - """ - retval = {'errcode': 0, 'num_new': 0, 'num_update': 0} - try: - return self._wl_update_media(mediatype, row_xbmc, saveanyway, commit, lastChange) - except sqlite3.Error as err: - try: - errstring = err.args[0] # TODO: Find out, why this does not work some times - except BaseException: - errstring = '' - utils.log(u'wl_update_media: SQLite Database error accessing the wl database: ''%s''' % errstring, xbmc.LOGERROR) - utils.showNotification(utils.getString(32109), errstring, xbmc.LOGERROR) - self.close_db(1) - retval['errcode'] = 1 - except mysql.connector.Error as err: - utils.log(u"wl_update_media: MySQL Database error accessing the wl database: ''%s''" % (err.msg), xbmc.LOGERROR) - utils.showNotification(utils.getString(32108), err.msg, xbmc.LOGERROR) - self.close_db(1) - retval['errcode'] = 1 - return retval - - def merge_dropbox_local(self): - """ - Merge the remote (eg: Dropbox) database into the local one - The resulting merged database contains all watched movies and episodes of both databases - - Returns: - return code: - 0 successfully synched databases - 1 database access error - 2 database loading error - 4 exit requested (no error) - """ - - if not self.dropbox_path: - utils.log(u'merge_dropbox_local: no dropbox path -- assuming download failed. not merging remote database.') - return 1 - - try: - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(): - return 2 - - # do not merge tvshows between dropbox and local wl database. - # Only movies and episodes - count_insert = 0 - count_update = 0 - for mediatype in ['movie', 'episode']: - # strno: number of string for heading of notifications - # sql_select_dropbox: Definitions of SQL queries to get data from the dropbox database - if mediatype == 'movie': - strno = 32711 - sql_select_dropbox = QUERY_SELECT_MV_SQLITE - else: - strno = 32712 - sql_select_dropbox = QUERY_SELECT_EP_SQLITE - utils.log(u'wl_merge_dropbox_local (%s): Start merging the remote into the local database' % mediatype) - self.sqlcursor_db.execute(sql_select_dropbox) - # loop through all rows of the remote (dropbox) database and merge it into the local database with - # with the function for merging the Kodi database - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS = xbmcgui.DialogProgress() - DIALOG_PROGRESS.create(utils.getString(strno), utils.getString(32105)) - rows = self.sqlcursor_db.fetchall() - list_length = len(rows) - for i in range(list_length): - if self.monitor.abortRequested(): - break - row = rows[i] # see definition of sql_select_dropbox for contents of `row` - if mediatype == 'movie': # idMovieImdb, 1lastPlayed, 2playCount, 3title, 4lastChange - name = "%s" % row[3] - playCount = row[2] - lastChange = row[4] - lastPlayed = row[1] - else: # 0idShow, 1season, 2episode, 3lastPlayed, 4playCount, 5lastChange - try: - name = '%s S%02dE%02d' % (self.tvshownames[int(row[0])], int(row[1]), int(row[2])) - except BaseException: - name = 'tvdb-id %d S%02dE%02d' % (int(row[0]), int(row[1]), int(row[2])) - playCount = row[4] - lastChange = row[5] - lastPlayed = row[3] - - # handle the row from the dropbox database as if it came from the Kodi database and - # store it in the local WL database (same function call) - # row_xbmc_sim: 0imdbnumber, 1seasonnumber, 2episodenumber, 3lastPlayed, 4playCount, 5title, 6empty, 7movieid - row_xbmc_sim = [0, 0, 0, lastPlayed, playCount, name, 0] - if mediatype == 'movie': - row_xbmc_sim[0] = row[0] - else: - row_xbmc_sim[0:3] = row[0:3] - res = self._wl_update_media(mediatype, row_xbmc_sim, 0, 0, lastChange) - count_insert += res['num_new'] - count_update += res['num_update'] - - # check if update is canceled - if utils.getSetting("progressdialog") == 'true' and DIALOG_PROGRESS.iscanceled(): - return 2 - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.update(int(100 * (i + 1) / list_length), (utils.getString(32105)+"\n"+utils.getString(32610) % (i + 1, list_length, row_xbmc_sim[5]))) - - utils.showNotification(utils.getString(strno), utils.getString(32301) % (count_insert, count_update), xbmc.LOGINFO) - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.close() - if self.monitor.abortRequested(): - return 4 - except sqlite3.Error as err: - try: - errstring = err.args[0] # TODO: Find out, why this does not work some times - except BaseException: - errstring = '' - utils.log(u'merge_dropbox_local: SQLite Database error accessing the wl database: ''%s''' % errstring, xbmc.LOGERROR) - self.close_db(3) - # error could be that the database is locked (for tv show strings). - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.close() - return 1 - except SystemExit: - return 4 - except BaseException: - utils.log(u'merge_dropbox_local: Error getting the wl database: ''%s''' % sys.exc_info()[2], xbmc.LOGERROR) - self.close_db(3) - buggalo.onExceptionRaised() - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.close() - return 1 - # commit all changes: This saves the database file physically - self.sqlcon_wl.commit() - return 0 - - def merge_local_dropbox(self): - """ - Merge the local database into the remote one (e.g. dropbox) by copying all tables directly - the content is already merged after loading the remote database (merge_dropbox_local) - - Returns: - return code: - 0 successfully synched databases - 1 database access error - 2 database loading error - 4 exit requested (no error) - """ - - if not self.dropbox_path: - utils.log(u'merge_dropbox: no dropbox path -- assuming download failed. not merging remote database.') - return 1 - - try: - if self.sqlcursor_wl == 0 or self.sqlcon_wl == 0: - if self.load_db(): - return 2 - - # do not merge tvshows between dropbox and local wl database - - # clear dropbox database and just insert all rows from the local db - self.sqlcursor_db.execute(QUERY_CLEAR_MV_SQLITE) - self.sqlcursor_db.execute(QUERY_CLEAR_EP_SQLITE) - - for mediatype in ['movie', 'episode']: - # strno: number of string for heading of notifications - # sql_select_wl: Definitions of SQL queries to get data from the local database - utils.log(u'merge_local_dropbox (%s): Start merging the local into the remote database' % mediatype) - if mediatype == 'movie': - strno = 32718 - rows = self.watchedmovielist_wl # 0imdbnumber, 1empty, 2empty, 3lastPlayed, 4playCount, 5title, 6lastChange - else: - strno = 32719 - rows = self.watchedepisodelist_wl # 0tvdbnumber, 1season, 2episode, 3lastplayed, 4playcount, 5empty, 6lastChange - - # loop through all rows of the local database and merge it into the remote (dropbox) database - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS = xbmcgui.DialogProgress() - DIALOG_PROGRESS.create(utils.getString(strno), utils.getString(32716)) - list_length = len(rows) - for i in range(list_length): - if self.monitor.abortRequested(): - break - row = rows[i] # see definition of queries for contents of `row` - if mediatype == 'movie': - name = row[5] - sql = QUERY_MV_INSERT_SQLITE # idMovieImdb,playCount,lastChange,lastPlayed,title - values = list([row[0], row[4], row[6], row[3], row[5]]) - else: - try: - name = '%s S%02dE%02d' % (self.tvshownames[int(row[0])], int(row[1]), int(row[2])) - except BaseException: - name = 'tvdb-id %d S%02dE%02d' % (int(row[0]), int(row[1]), int(row[2])) - sql = QUERY_EP_INSERT_SQLITE # idShow,season,episode,playCount,lastChange,lastPlayed - values = list([row[0], row[1], row[2], row[4], row[6], row[3]]) - self.sqlcursor_db.execute(sql, values) - - # check if update is canceled DIALOG_PROGRESS.close() - if utils.getSetting("progressdialog") == 'true' and DIALOG_PROGRESS.iscanceled(): - return 2 - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.update(int(100 * (i + 1) / list_length), (utils.getString(32716)+"\n"+utils.getString(32610) % (i + 1, list_length, name))) - utils.showNotification(utils.getString(strno), (utils.getString(32717)) % list_length, xbmc.LOGINFO) - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.close() - if self.monitor.abortRequested(): - return 4 # no further database operations - except sqlite3.Error as err: - try: - errstring = err.args[0] # TODO: Find out, why this does not work some times - except BaseException: - errstring = '' - utils.log(u'merge_local_dropbox: SQLite Database error accessing the wl database: ''%s''' % errstring, xbmc.LOGERROR) - self.close_db(3) - # error could be that the database is locked (for tv show strings). - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.close() - return 1 - except SystemExit: - return 4 - except BaseException: - utils.log(u'merge_local_dropbox: Error getting the wl database: ''%s''' % sys.exc_info()[2], xbmc.LOGERROR) - self.close_db(3) - buggalo.onExceptionRaised() - if utils.getSetting("progressdialog") == 'true': - DIALOG_PROGRESS.close() - return 1 - # only commit the changes if no error occured above (to ensure database persistence) - self.sqlcon_db.commit() - self.close_db(2) # close dropbox database - return 0 - - def pushToDropbox(self): - dropbox_key = utils.getSetting('dropbox_apikey') - - #utils.showNotification(utils.getString(32204), utils.getString(32302)%(count_update)) - # feign success if there is no local dropbox database file - if not (self.dropbox_path and dropbox_key): - return - - dest_file = '/' + 'watchedlist.db' - old_file = '/old' + 'watchedlist.db' - - client = dropbox.Dropbox(dropbox_key) - - # delete the old watched list. Failure here doesn't really matter - try: - client.files_delete(old_file) - except BaseException: - utils.log(u'Dropbox error: Unable to delete previous old watched list (%s)' % old_file) - - # rename the previously uploaded watchlist to "oldWHATEVER" - try: - client.files_move_v2(dest_file, old_file) - except BaseException: - utils.log(u'Dropbox error: Unable rename previous watched list') - - f = open(self.dropbox_path, 'rb') - try: - client.files_upload(f.read(), dest_file) - except DropboxApiError as err: - utils.log(u'Dropbox upload error: ' + str(err)) - utils.showNotification(utils.getString(32708), utils.getString(32709), xbmc.LOGERROR) - return - finally: - f.close() - utils.showNotification(utils.getString(32713), utils.getString(32714), xbmc.LOGINFO) - utils.log(u'Dropbox upload complete: %s -> %s' % (self.dropbox_path, dest_file)) - - def pullFromDropbox(self): - """ - Downloads the dropbox database - - Returns: - return code: - 0 successfully downloaded databases - 1 database download error - """ - dropbox_key = utils.getSetting('dropbox_apikey') - - if not dropbox_key: - # no dropbox authorization key entered. Feature does not work. - utils.showNotification(utils.getString(32708), utils.getString(32715), xbmc.LOGWARNING) - return 0 - - utils.log(u'Downloading WatchedList from dropbox') - - client = dropbox.Dropbox(dropbox_key) - - # save the dropbox database file in the user data directory (this is only a temporary file for upload and download) - self.dropbox_path = os.path.join(utils.data_dir(), "dropbox.db") - dropbox_file_exists = False - - remote_file = '/' + 'watchedlist.db' - old_file = '/old' + 'watchedlist.db' - # first: Try downloading the database file (if existent). - # if that fails, try restoring the backup file (if existent). - # if that also fails, the database will be rewritten (in other function) - try: - trycount = 0 - while trycount <= 4: # two tries for db file (trycount 1, 2), then try copying backup and download that (trycount 3,4) - if self.monitor.abortRequested(): - break - trycount = trycount + 1 - try: - client.files_download_to_file(self.dropbox_path, remote_file) - dropbox_file_exists = True - break - except DropboxApiError as err: - # file not available, e.g. deleted or first execution. - utils.log(u'Dropbox database download failed. %s.' % str(err)) - time.sleep(0.5) # wait to avoid immediate re-try - if err[1].is_path() and isinstance(err[1].get_path(), dropbox.files.LookupError): - # Error reason: file does not exist - trycount = trycount + 1 # do not try second time on downloading non-existing file - if trycount == 2 and not dropbox_file_exists: - try: - # No file was downloaded after second try. That means the dropbox file does not exist - # Try restoring the backup file, if existent - client.files_copy(old_file, remote_file) - except DropboxApiError as err: # files_copy raises RelocationError - # file not available, e.g. deleted or not existing - utils.log(u'Dropbox restore database backup failed. %s.' % str(err)) - break - except BaseException: # catch this error, the dropbox mode will be disabled - utils.log(u'Dropbox download error: ' + str(sys.exc_info())) - utils.showNotification(utils.getString(32708), utils.getString(32710), xbmc.LOGERROR) - self.dropbox_path = '' - return 1 - # check if file was written - if dropbox_file_exists: - utils.log(u'Dropbox database downloaded: %s -> %s' % (remote_file, self.dropbox_path)) - else: - utils.log(u'Dropbox database download failed. No remote file available.') - return 0 - - def get_movie_status(self, imdbId): - """ - Return the watched state of one movie from the internal WL database copy - requires this class to have a loaded database - - Args: - imdbId (Integer) - - Returns: - List with [Playcount, lastPlayed (integer timestamp), lastChange (integer timestamp)] - if no entry is available, playcount is -1 - """ - j = [ii for ii, x in enumerate(self.watchedmovielist_wl) if x[0] == imdbId] - if not j: - return [-1, 0, 0] - return [self.watchedmovielist_wl[j[0]][x] for x in [4, 3, 6]] # return 4playCount, 3lastPlayed, 6lastChange - - def get_episode_status(self, tvdbId, season, episode): - """ - Return the watched state of one tv series episode from the internal WL database copy - requires this class to have a loaded database - - Args: - tvdbId, season, episode (Integer) - - Returns: - List with [Playcount, lastPlayed (integer timestamp), lastChange (integer timestamp)] - if no entry is available, playcount is -1 - """ - j = [ii for ii, x in enumerate(self.watchedepisodelist_wl) if x[0] == tvdbId and x[1] == season and x[2] == episode] - if not j: - return [-1, 0, 0] - return [self.watchedepisodelist_wl[j[0]][x] for x in [4, 3, 6]] # return 4playCount, 3lastPlayed, 6lastChange diff --git a/service.watchedlist/manual.py b/service.watchedlist/manual.py deleted file mode 100644 index 1a18e3a64..000000000 --- a/service.watchedlist/manual.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -This file is entry point for manual start via the programs menu -""" -import sys - -import xbmc -import xbmcgui - -import lib.watchedlist.utils as utils -from lib.watchedlist.watchedlist import WatchedList - - -__remotedebug__ = False -# append pydev remote debugger -if __remotedebug__: - utils.log("Initialize remote debugging.") - # Make pydev debugger works for auto reload. - try: - import pydevd - pydevd.settrace('localhost', port=60678, stdoutToServer=True, stderrToServer=True) - except ImportError: - sys.stderr.write("Error: " + - "You must add org.python.pydev.debug.pysrc to your PYTHONPATH.") - utils.showNotification('WatchedList Error', 'remote debug could not be imported.', xbmc.LOGFATAL) - sys.exit(1) - except BaseException: - utils.showNotification('WatchedList Error', 'remote debug in pydev is activated, but remote server not responding.', xbmc.LOGERROR) - sys.exit(1) - -if (not utils.getSetting("autostart") == 'true') or xbmcgui.Dialog().yesno(utils.getString(32101), utils.getString(32001)): - # Check if we should run updates (only ask if autostart is on) - # run the program - utils.log("Update Library Manual Run.") - WatchedList().runUpdate(True) # one time update diff --git a/service.watchedlist/resources/language/resource.language.de_de/strings.po b/service.watchedlist/resources/language/resource.language.de_de/strings.po deleted file mode 100644 index 3eeb7c43b..000000000 --- a/service.watchedlist/resources/language/resource.language.de_de/strings.po +++ /dev/null @@ -1,389 +0,0 @@ -# Kodi Media Center language file -# Addon Name: WatchedList -# Addon id: service.watchedlist -# Addon Provider: schapplm -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: 2016-03-28 16:47+0000\n" -"PO-Revision-Date: 2017-12-30 10:56+0100\n" -"Last-Translator: schapplm\n" -"Language-Team: schapplm\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: de_DE\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgctxt "Addon Summary" -msgid "Save watched Movies and TV Episodes independent from filenames" -msgstr "Gesehen-Status von Filmen und Serien-Episoden unabhängig von Dateinamen speichern" - -msgctxt "Addon Description" -msgid "Export: Searches the Kodi-Database for watched files. Determine imdb-id and thetvdb-id to identify movies and TV-episodes. Then save the list to a new independent table.\nImport: Set the watched state for each video file in Kodi.\nAutomatic background process without user interaction." -msgstr "Export: Durchsucht die Kodi-Datenbank nach gesehenen Filmen und ordnet den Dateien die eindeutigen Kennnummern von imdb und TheTVDB zu. Gesehene Filme und Episoden werden jeweils in einer eigenen Datenbank gespeichert.\nImport: Der Gesehen-Status von Medien in Kodi wird aus der Gesehenen-Tabelle geholt.\nDie Synchronisierung geschieht automatisch im Hintergrund ohne Benutzereingriff." - -msgctxt "Addon Disclaimer" -msgid "This script does not regard the file format. A Movie watched in DVD quality will also set the 1080p version as watched." -msgstr "Dieses Script ignoriert das Dateiformat. Ein gesehener Film in DVD-Qualität wird auch in der BlueRay-Version als gesehen gekennzeichnet." - -msgctxt "#30001" -msgid "Basic Settings" -msgstr "Grundeinstellungen" - -msgctxt "#30002" -msgid "Database" -msgstr "Datenbank" - -msgctxt "#30011" -msgid "Update movies watched state" -msgstr "Aktualisiere Gesehen-Status von Filmen" - -msgctxt "#30012" -msgid "Update episodes watched state" -msgstr "Aktualisiere Gesehen-Status von Episoden" - -msgctxt "#30013" -msgid "autostart mode" -msgstr "Starttyp" - -msgctxt "#30014" -msgid "Update interval [hours]" -msgstr "Aktualisierungs-Intervall [Stunden]" - -msgctxt "#30015" -msgid "Startup delay before action [minutes]" -msgstr "Start-Verzögerung [Minuten]" - -msgctxt "#30016" -msgid "Progress Dialog" -msgstr "Fortschrittsanzeige" - -msgctxt "#30017" -msgid "Use non-default database file" -msgstr "Eigene Datenbank-Datei" - -msgctxt "#30018" -msgid "Path to database file" -msgstr "Pfad zur Datenbank-Datei" - -msgctxt "#30019" -msgid "Database filename (SQLite Database, *.db)" -msgstr "Dateiname (*.db)" - -msgctxt "#30020" -msgid "Number of backup copies (-1=infinite)" -msgstr "Anzahl an Sicherungskopien (-1=unendlich)" - -msgctxt "#30021" -msgid "Start with Kodi (autorun)" -msgstr "Automatisch mit Kodi starten" - -msgctxt "#30022" -msgid "follow user setting watched/unwatched" -msgstr "Gesehen-Änderungen laufend überwachen" - -msgctxt "#30023" -msgid "Dropbox Auth Code" -msgstr "Dropbox Autorisierungs-Code" - -msgctxt "#30024" -msgid "Amount of User Information" -msgstr "Grad der Benutzerinformation" - -msgctxt "#30025" -msgid "All" -msgstr "Alle" - -msgctxt "#30026" -msgid "Only Info" -msgstr "Nur Infos" - -msgctxt "#30027" -msgid "Only Warning" -msgstr "Nur Warnungen" - -msgctxt "#30028" -msgid "Only Error" -msgstr "Nur Fehler" - -msgctxt "#30029" -msgid "None" -msgstr "Keine" - -msgctxt "#30030" -msgid "no update" -msgstr "Keine Aktualisierung" - -msgctxt "#30031" -msgid "one update" -msgstr "Einmalig" - -msgctxt "#30032" -msgid "periodic" -msgstr "Periodisch" - -msgctxt "#30040" -msgid "DB Method" -msgstr "DB-Art" - -msgctxt "#30041" -msgid "File" -msgstr "Datei" - -msgctxt "#30042" -msgid "MySQL" -msgstr "MySQL" - -msgctxt "#30043" -msgid "Options for accessing SQLite-DB-File" -msgstr "Optionen für SQLite-Datei-Zugriff" - -msgctxt "#30044" -msgid "Options for accessing MySQL-Server" -msgstr "Optionen für MySQL-Server-Zugriff" - -msgctxt "#30045" -msgid "Dropbox synchronization" -msgstr "Dropbox-Synchronisierung" - -msgctxt "#30051" -msgid "MySQL Server" -msgstr "MySQL Server" - -msgctxt "#30052" -msgid "MySQL Database" -msgstr "MySQL Datenbank" - -msgctxt "#30053" -msgid "MySQL Username" -msgstr "MySQL Benutzername" - -msgctxt "#30054" -msgid "MySQL Password" -msgstr "MySQL Kennwort" - -msgctxt "#30055" -msgid "MySQL Port" -msgstr "MySQL Port" - -msgctxt "#32001" -msgid "manually run the database update again?" -msgstr "Datenbank-Aktualisierung nochmal starten?" - -msgctxt "#32002" -msgid "DB path does not exist: %s" -msgstr "DB-Pfad existiert nicht: %s" - -msgctxt "#32003" -msgid "next update in %d hours" -msgstr "Nächste Aktualisierung in %d Stunden" - -msgctxt "#32004" -msgid "begin update in %d minutes" -msgstr "Starte Aktualisierung in %d Minuten" - -msgctxt "#32005" -msgid "running observation of changes of watched states" -msgstr "laufende Überwachung von Änderungen des Gesehen-Status" - -msgctxt "#32101" -msgid "WatchedList" -msgstr "WatchedList" - -msgctxt "#32102" -msgid "Watchedlist: Error" -msgstr "WatchedList: Fehler" - -msgctxt "#32103" -msgid "Load watched states from addon-database..." -msgstr "Lade Gesehen-Status aus Gesehen-Datenbank..." - -msgctxt "#32104" -msgid "load watched states Kodi-database ..." -msgstr "Lade Gesehene-Status aus Kodi-Datenbank ..." - -msgctxt "#32105" -msgid "update the addon watched-database ..." -msgstr "Aktualisiere die Gesehen-Datenbank: ..." - -msgctxt "#32106" -msgid "update the Kodi-database ..." -msgstr "Aktualisiere die Kodi-Datenbank ..." - -msgctxt "#32107" -msgid "update complete." -msgstr "Aktualisierung abgeschlossen." - -msgctxt "#32108" -msgid "Watchedlist: MySQL Error (WL DB)" -msgstr "Watchedlist: MySQL Fehler (WL DB)" - -msgctxt "#32109" -msgid "Watchedlist: SQLite Error (WL DB)" -msgstr "Watchedlist: SQLite Fehler (WL DB)" - -msgctxt "#32202" -msgid "Addon movie database" -msgstr "Gesehen-Datenbank (Filme)" - -msgctxt "#32203" -msgid "Addon episode database" -msgstr "Gesehen-Datenbank (Episoden)" - -msgctxt "#32204" -msgid "Kodi-movie database" -msgstr "Kodi-Filmdatenbank" - -msgctxt "#32205" -msgid "Kodi-episode database" -msgstr "Kodi-Episodendatenbank" - -msgctxt "#32208" -msgid "Access Denied (username/password/rights)" -msgstr "Zugriff verweigert (Benutzername/Kennwort/Rechte)" - -msgctxt "#32209" -msgid "Database '%s' does not exist" -msgstr "Datenbank '%s' existiert nicht" - -msgctxt "#32210" -msgid "Access denied (user '%s', DB '%s')" -msgstr "Zugriff verweigert (Benutzer '%s', DB '%s')" - -msgctxt "#32297" -msgid "TV-Show \"%s\" (ID %d) has no tvdb-number. No processing with WL possible. Try rescraping." -msgstr "TV-Serie \"%s\" (ID %d) hat keine tvdb-Nummer. Keine Verarbeitung mit WL möglich." - -msgctxt "#32298" -msgid "%d movies and %d episodes read from WL." -msgstr "%d Filme, %d Episoden in WL." - -msgctxt "#32299" -msgid "%d movies and %d episodes read from Kodi-DB." -msgstr "%d Filme, %d Episoden in Kodi-DB." - -msgctxt "#32301" -msgid "%d watched new. %d updated" -msgstr "%d neu gesehen. %d aktualisiert." - -msgctxt "#32302" -msgid "%d movies marked as watched" -msgstr "%d Filme als gesehen markiert." - -msgctxt "#32303" -msgid "%d episodes marked as watched" -msgstr "%d Episoden als gesehen markiert." - -msgctxt "#32401" -msgid "Set as watched (Kodi-DB)" -msgstr "Als gesehen markiert (Kodi-DB)" - -msgctxt "#32402" -msgid "Remember as newly watched (WL-DB)" -msgstr "Merke als neu gesehen (WL-DB)" - -msgctxt "#32403" -msgid "Remember as watched (updated) (WL-DB)" -msgstr "Merke als gesehen (aktualisiert) (WL-DB)" - -msgctxt "#32404" -msgid "Set as not watched (Kodi-DB)" -msgstr "Als ungesehen markiert (Kodi-DB)" - -msgctxt "#32405" -msgid "Remember as not watched (WL-DB)" -msgstr "Merke als ungesehen (WL-DB)" - -msgctxt "#32601" -msgid "Error opening WL-database" -msgstr "Öffnen der Gesehen-Datenbank" - -msgctxt "#32602" -msgid "Error loading WL-database" -msgstr "Laden der Gesehen-Datenbank" - -msgctxt "#32603" -msgid "Error loading Kodi-database" -msgstr "Laden der Kodi-Datenbank" - -msgctxt "#32604" -msgid "Error updating WL database" -msgstr "Aktualisieren der Gesehen-Datenbank" - -msgctxt "#32605" -msgid "Error updating Kodi-database" -msgstr "Aktualisieren der Kodi-Datenbank" - -msgctxt "#32606" -msgid "Writing the WL-database file %s" -msgstr "Beim Schreiben der Gesehen-Datenbank %s" - -msgctxt "#32607" -msgid "Unable to merge dropbox data" -msgstr "Zusammenführung mit Dropbox" - -msgctxt "#32608" -msgid "Doing a database backup (%s)" -msgstr "Beim Sichern der Datenbank (%s)" - -msgctxt "#32610" -msgid "%d/%d: %s" -msgstr "%d/%d: %s" - -msgctxt "#32611" -msgid "%d/%d: %s S%02dE%02d" -msgstr "%d/%d: %s S%02dE%02d" - -msgctxt "#32708" -msgid "Dropbox Error" -msgstr "Dropbox Fehler" - -msgctxt "#32709" -msgid "Unable to upload" -msgstr "Hochladen nicht möglich" - -msgctxt "#32710" -msgid "Unable to download" -msgstr "Herunterladen nicht möglich" - -msgctxt "#32711" -msgid "WatchedList: Dropbox-Import (Movies)" -msgstr "WatchedList: Dropbox-Import (Filme)" - -msgctxt "#32712" -msgid "WatchedList: Dropbox-Import (Episodes)" -msgstr "WatchedList: Dropbox-Import (Episoden)" - -msgctxt "#32713" -msgid "Dropbox synchronization" -msgstr "Dropbox-Synchronisierung" - -msgctxt "#32714" -msgid "Upload successfull" -msgstr "Hochladen erfolgreich" - -msgctxt "#32715" -msgid "Empty authorization code in settings" -msgstr "Leerer Autorisierungscode in Einstellungen" - -msgctxt "#32716" -msgid "Update the Dropbox database: ..." -msgstr "Aktualisiere die Dropbox-Datenbank: ..." - -msgctxt "#32717" -msgid "Dropbox database updated: %d entries." -msgstr "Dropbox-Datenbank aktualisiert. %d Einträge." - -msgctxt "#32718" -msgid "WatchedList: Dropbox-Export (Movies)" -msgstr "WatchedList: Dropbox-Export (Filme)" - -msgctxt "#32719" -msgid "WatchedList: Dropbox-Export (Episodes)" -msgstr "WatchedList: Dropbox-Export (Episoden)" - -msgctxt "#32720" -msgid "Error importing python Dropbox API. Disable function." -msgstr "Fehler beim Laden der Dropbox API. Deaktiviere Funktion." diff --git a/service.watchedlist/resources/language/resource.language.en_gb/strings.po b/service.watchedlist/resources/language/resource.language.en_gb/strings.po deleted file mode 100644 index e64d9df32..000000000 --- a/service.watchedlist/resources/language/resource.language.en_gb/strings.po +++ /dev/null @@ -1,419 +0,0 @@ -# Kodi Media Center language file -# Addon Name: WatchedList -# Addon id: service.watchedlist -# Addon Provider: schapplm -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: 2016-03-28 16:47+0000\n" -"PO-Revision-Date: 2017-12-30 10:56+0100\n" -"Last-Translator: schapplm\n" -"Language-Team: schapplm\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Language: en_GB\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgctxt "Addon Summary" -msgid "Save watched Movies and TV Episodes independent from filenames" -msgstr "" - -msgctxt "Addon Description" -msgid "Export: Searches the Kodi-Database for watched files. Determine imdb-id and thetvdb-id to identify movies and TV-episodes. Then save the list to a new independent table.\nImport: Set the watched state for each video file in Kodi.\nAutomatic background process without user interaction." -msgstr "" - -msgctxt "Addon Disclaimer" -msgid "This script does not regard the file format. A Movie watched in DVD quality will also set the 1080p version as watched." -msgstr "" - -# Notification headers - -msgctxt "#30001" -msgid "Basic Settings" -msgstr "" - -msgctxt "#30002" -msgid "Database" -msgstr "" - -msgctxt "#30011" -msgid "Update movies watched state" -msgstr "" - -msgctxt "#30012" -msgid "Update episodes watched state" -msgstr "" - -msgctxt "#30013" -msgid "autostart mode" -msgstr "" - -msgctxt "#30014" -msgid "Update interval [hours]" -msgstr "" - -msgctxt "#30015" -msgid "Startup delay before action [minutes]" -msgstr "" - -msgctxt "#30016" -msgid "Progress Dialog" -msgstr "" - -msgctxt "#30017" -msgid "Use non-default database file" -msgstr "" - -msgctxt "#30018" -msgid "Path to database file" -msgstr "" - -msgctxt "#30019" -msgid "Database filename (SQLite Database, *.db)" -msgstr "" - -msgctxt "#30020" -msgid "Number of backup copies (-1=infinite)" -msgstr "" - -msgctxt "#30021" -msgid "Start with Kodi (autorun)" -msgstr "" - -msgctxt "#30022" -msgid "follow user setting watched/unwatched" -msgstr "" - -msgctxt "#30023" -msgid "Dropbox Auth Code" -msgstr "" - -msgctxt "#30024" -msgid "Amount of User Information" -msgstr "" - -msgctxt "#30025" -msgid "All" -msgstr "" - -msgctxt "#30026" -msgid "Only Info" -msgstr "" - -msgctxt "#30027" -msgid "Only Warning" -msgstr "" - -msgctxt "#30028" -msgid "Only Error" -msgstr "" - -msgctxt "#30029" -msgid "None" -msgstr "" - -msgctxt "#30030" -msgid "no update" -msgstr "" - -msgctxt "#30031" -msgid "one update" -msgstr "" - -msgctxt "#30032" -msgid "periodic" -msgstr "" - -# empty strings from id 30033 to 30039 - -msgctxt "#30040" -msgid "DB Method" -msgstr "" - -msgctxt "#30041" -msgid "File" -msgstr "" - -msgctxt "#30042" -msgid "MySQL" -msgstr "" - -msgctxt "#30043" -msgid "Options for accessing SQLite-DB-File" -msgstr "" - -msgctxt "#30044" -msgid "Options for accessing MySQL-Server" -msgstr "" - -msgctxt "#30045" -msgid "Dropbox synchronization" -msgstr "" - -# empty strings from id 30046 to 30050 - -msgctxt "#30051" -msgid "MySQL Server" -msgstr "" - -msgctxt "#30052" -msgid "MySQL Database" -msgstr "" - -msgctxt "#30053" -msgid "MySQL Username" -msgstr "" - -msgctxt "#30054" -msgid "MySQL Password" -msgstr "" - -msgctxt "#30055" -msgid "MySQL Port" -msgstr "" - -# empty strings from id 30056 to 32000 - -msgctxt "#32001" -msgid "manually run the database update again?" -msgstr "" - -msgctxt "#32002" -msgid "DB path does not exist: %s" -msgstr "" - -msgctxt "#32003" -msgid "next update in %d hours" -msgstr "" - -msgctxt "#32004" -msgid "begin update in %d minutes" -msgstr "" - -msgctxt "#32005" -msgid "running observation of changes of watched states" -msgstr "" - -# empty strings from id 32006 to 32100 - -msgctxt "#32101" -msgid "WatchedList" -msgstr "" - -msgctxt "#32102" -msgid "Watchedlist: Error" -msgstr "" - -msgctxt "#32103" -msgid "Load watched states from addon-database..." -msgstr "" - -msgctxt "#32104" -msgid "load watched states Kodi-database ..." -msgstr "" - -msgctxt "#32105" -msgid "update the addon watched-database ..." -msgstr "" - -msgctxt "#32106" -msgid "update the Kodi-database ..." -msgstr "" - -msgctxt "#32107" -msgid "update complete." -msgstr "" - -msgctxt "#32108" -msgid "Watchedlist: MySQL Error (WL DB)" -msgstr "" - -msgctxt "#32109" -msgid "Watchedlist: SQLite Error (WL DB)" -msgstr "" - -# empty strings from id 32110 to 32201 - -msgctxt "#32202" -msgid "Addon movie database" -msgstr "" - -msgctxt "#32203" -msgid "Addon episode database" -msgstr "" - -msgctxt "#32204" -msgid "Kodi-movie database" -msgstr "" - -msgctxt "#32205" -msgid "Kodi-episode database" -msgstr "" - -# empty strings from id 32206 to 32207 - -msgctxt "#32208" -msgid "Access Denied (username/password/rights)" -msgstr "" - -msgctxt "#32209" -msgid "Database '%s' does not exist" -msgstr "" - -msgctxt "#32210" -msgid "Access denied (user '%s', DB '%s')" -msgstr "" - -# empty strings from id 32211 to 32296 - -msgctxt "#32297" -msgid "TV-Show \"%s\" (ID %d) has no tvdb-number. No processing with WL possible. Try rescraping." -msgstr "" - -msgctxt "#32298" -msgid "%d movies and %d episodes read from WL." -msgstr "" - -msgctxt "#32299" -msgid "%d movies and %d episodes read from Kodi-DB." -msgstr "" - -# empty string with id 32300 - -msgctxt "#32301" -msgid "%d watched new. %d updated" -msgstr "" - -msgctxt "#32302" -msgid "%d movies marked as watched" -msgstr "" - -msgctxt "#32303" -msgid "%d episodes marked as watched" -msgstr "" - -# Error Messages -# empty strings from id 32304 to 32400 - -msgctxt "#32401" -msgid "Set as watched (Kodi-DB)" -msgstr "" - -msgctxt "#32402" -msgid "Remember as newly watched (WL-DB)" -msgstr "" - -msgctxt "#32403" -msgid "Remember as watched (updated) (WL-DB)" -msgstr "" - -msgctxt "#32404" -msgid "Set as not watched (Kodi-DB)" -msgstr "" - -msgctxt "#32405" -msgid "Remember as not watched (WL-DB)" -msgstr "" - -# Notification text -# empty strings from id 32406 to 32600 - -msgctxt "#32601" -msgid "Error opening WL-database" -msgstr "" - -msgctxt "#32602" -msgid "Error loading WL-database" -msgstr "" - -msgctxt "#32603" -msgid "Error loading Kodi-database" -msgstr "" - -msgctxt "#32604" -msgid "Error updating WL database" -msgstr "" - -msgctxt "#32605" -msgid "Error updating Kodi-database" -msgstr "" - -msgctxt "#32606" -msgid "Writing the WL-database file %s" -msgstr "" - -msgctxt "#32607" -msgid "Unable to merge dropbox data" -msgstr "" - -msgctxt "#32608" -msgid "Doing a database backup (%s)" -msgstr "" - -# Progress Dialog -# empty string with id 32609 - -msgctxt "#32610" -msgid "%d/%d: %s" -msgstr "" - -msgctxt "#32611" -msgid "%d/%d: %s S%02dE%02d" -msgstr "" - -# Dropbox related messages -# empty strings from id 32612 to 32707 - -msgctxt "#32708" -msgid "Dropbox Error" -msgstr "" - -msgctxt "#32709" -msgid "Unable to upload" -msgstr "" - -msgctxt "#32710" -msgid "Unable to download" -msgstr "" - -msgctxt "#32711" -msgid "WatchedList: Dropbox-Import (Movies)" -msgstr "" - -msgctxt "#32712" -msgid "WatchedList: Dropbox-Import (Episodes)" -msgstr "" - -msgctxt "#32713" -msgid "Dropbox synchronization" -msgstr "" - -msgctxt "#32714" -msgid "Upload successfull" -msgstr "" - -msgctxt "#32715" -msgid "Empty authorization code in settings" -msgstr "" - -msgctxt "#32716" -msgid "Update the Dropbox database: ..." -msgstr "" - -msgctxt "#32717" -msgid "Dropbox database updated: %d entries." -msgstr "" - -msgctxt "#32718" -msgid "WatchedList: Dropbox-Export (Movies)" -msgstr "" - -msgctxt "#32719" -msgid "WatchedList: Dropbox-Export (Episodes)" -msgstr "" - -msgctxt "#32720" -msgid "Error importing python Dropbox API. Disable function." -msgstr "" diff --git a/service.watchedlist/resources/language/resource.language.he_il/strings.po b/service.watchedlist/resources/language/resource.language.he_il/strings.po deleted file mode 100644 index 610f7762d..000000000 --- a/service.watchedlist/resources/language/resource.language.he_il/strings.po +++ /dev/null @@ -1,409 +0,0 @@ -# Kodi Media Center language file -# Addon Name: WatchedList -# Addon id: service.watchedlist -# Addon Provider: schapplm -msgid "" -msgstr "" -"Project-Id-Version: XBMC-Addons\n" -"Report-Msgid-Bugs-To: alanwww1@xbmc.org\n" -"POT-Creation-Date: 2016-03-28 16:47+0000\n" -"PO-Revision-Date: 2017-10-09 11:16+0300\n" -"Last-Translator: A. Dambledore\n" -"Language-Team: Eng2Heb\n" -"Language: he_IL\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - - -msgctxt "Addon Summary" -msgid "Save watched Movies and TV Episodes independent from filenames" -msgstr "שומר מצב נצפה לסרטים ופרקים טלוויזיה עצמאית משמות קבצים" - -msgctxt "Addon Description" -msgid "" -"Export: Searches the Kodi-Database for watched files. Determine imdb-id and thetvdb-id to identify movies and TV-episodes. Then save the list to a new independent table.\n" -"Import: Set the watched state for each video file in Kodi.\n" -"Automatic background process without user interaction." -msgstr "" -"ייצוא: מחפש את מסד הנתונים של קודי עבור קבצים שנצפו. קבע את iddb-id ו- thetvdb-id כדי לזהות סרטים ופרטי טלוויזיה. לאחר מכן שמור את הרשימה בטבלה עצמאית חדשה.\n" -"ייבוא: הגדר את מצב נצפה עבור כל קובץ וידאו בקודי.\n" -"תהליך רקע אוטומטי ללא אינטראקציה עם המשתמש." - -msgctxt "Addon Disclaimer" -msgid "This script does not regard the file format. A Movie watched in DVD quality will also set\tthe 1080p version as watched." -msgstr "הסקריפט הזה אינו מתייחס לתבנית הקובץ. סרט שנצפה באיכות DVD, יקבע גם את גרסת 1080p כנצפה." - -# Notification headers -msgctxt "#30001" -msgid "Basic Settings" -msgstr "הגדרות בסיסיות" - -msgctxt "#30002" -msgid "Database" -msgstr "מסד נתונים" - -msgctxt "#30011" -msgid "Update movies watched state" -msgstr "עדכון מצב נצפה לסרטים" - -msgctxt "#30012" -msgid "Update episodes watched state" -msgstr "עדכון מצב נצפה לפרקים" - -msgctxt "#30013" -msgid "autostart mode" -msgstr "מצב אתחול אוטומטי" - -msgctxt "#30014" -msgid "Update interval [hours]" -msgstr "מרווח בין עדכונים (שעות)" - -msgctxt "#30015" -msgid "Startup delay before action [minutes]" -msgstr "השהיית הפעלה לפני פעולה [דקות]" - -msgctxt "#30016" -msgid "Progress Dialog" -msgstr "דיאלוג התקדמות" - -msgctxt "#30017" -msgid "Use non-default database file" -msgstr "השתמש בקובץ מסד נתונים שאינו ברירת מחדל" - -msgctxt "#30018" -msgid "Path to database file" -msgstr "הנתיב אל קובץ מסד הנתונים" - -msgctxt "#30019" -msgid "Database filename (SQLite Database, *.db)" -msgstr "שם הקובץ של מסד הנתונים (מסד הנתונים SQLite, * .db)" - -msgctxt "#30020" -msgid "Number of backup copies (-1=infinite)" -msgstr "מספר עותקי גיבוי (-1 = אינסופי)" - -msgctxt "#30021" -msgid "Start with Kodi (autorun)" -msgstr "להתחיל עם קודי (הפעלה אוטומטית)" - -msgctxt "#30022" -msgid "follow user setting watched/unwatched" -msgstr "עקוב אחר הגדרות המשתמש למצב נצפה או לא נצפה" - -msgctxt "#30023" -msgid "Dropbox Auth Code" -msgstr "קוד אימות בדרופבוקס" - -msgctxt "#30024" -msgid "Amount of User Information" -msgstr "כמות מידע משתמש" - -msgctxt "#30025" -msgid "All" -msgstr "הכול" - -msgctxt "#30026" -msgid "Only Info" -msgstr "רק מידע" - -msgctxt "#30027" -msgid "Only Warning" -msgstr "רק אזהרה" - -msgctxt "#30028" -msgid "Only Error" -msgstr "רק שגיאה" - -msgctxt "#30029" -msgid "None" -msgstr "ללא" - -msgctxt "#30030" -msgid "no update" -msgstr "אין עדכון" - -msgctxt "#30031" -msgid "one update" -msgstr "עדכון אחד" - -msgctxt "#30032" -msgid "periodic" -msgstr "תקופתיים" - -# empty strings from id 30033 to 30039 -msgctxt "#30040" -msgid "DB Method" -msgstr "שיטת DB" - -msgctxt "#30041" -msgid "File" -msgstr "קובץ" - -msgctxt "#30042" -msgid "MySQL" -msgstr "MySQL" - -msgctxt "#30043" -msgid "Options for accessing SQLite-DB-File" -msgstr "אפשרויות לגישה SQLite-DB-File" - -msgctxt "#30044" -msgid "Options for accessing MySQL-Server" -msgstr "אפשרויות לגישה שרת MySQL" - -msgctxt "#30045" -msgid "Dropbox synchronization" -msgstr "סנכרון דרופבוקס" - -# empty strings from id 30046 to 30050 -msgctxt "#30051" -msgid "MySQL Server" -msgstr "MySQL שרת" - -msgctxt "#30052" -msgid "MySQL Database" -msgstr "MySQL מסד הנתונים" - -msgctxt "#30053" -msgid "MySQL Username" -msgstr "MySQL שם המשתמש" - -msgctxt "#30054" -msgid "MySQL Password" -msgstr "MySQL סיסמה" - -msgctxt "#30055" -msgid "MySQL Port" -msgstr "MySQL פורט" - -# empty strings from id 30056 to 32000 -msgctxt "#32001" -msgid "manually run the database update again?" -msgstr "להפעיל באופן ידני את העדכון מסד הנתונים שוב?" - -msgctxt "#32002" -msgid "DB path does not exist: %s" -msgstr "לא קיים נתיב לבסיס הנתונים: %s" - -msgctxt "#32003" -msgid "next update in %d hours" -msgstr "העדכון הבא בעוד %d שעות" - -msgctxt "#32004" -msgid "begin update in %d minutes" -msgstr "העדכון הבא בעוד %d דקות" - -msgctxt "#32005" -msgid "running observation of changes of watched states" -msgstr "מריץ סריקה לשינויים במצב נצפה" - -# empty strings from id 32006 to 32100 -msgctxt "#32101" -msgid "WatchedList" -msgstr "רשימת נצפה" - -msgctxt "#32102" -msgid "Watchedlist: Error" -msgstr "רשימת נצפה: שגיאה" - -msgctxt "#32103" -msgid "Load watched states from addon-database..." -msgstr "טוען מצב נצפה מתוך מסד הנתונים של ההרחבה..." - -msgctxt "#32104" -msgid "load watched states Kodi-database ..." -msgstr "טוען מצב נצפה מתוך מסד הנתונים של קודי..." - -msgctxt "#32105" -msgid "update the addon watched-database ..." -msgstr "עדכון את מצב נצפה במסד הנתונים של ההרחבה..." - -msgctxt "#32106" -msgid "update the Kodi-database ..." -msgstr "עדכון את מסד הנתונים של קודי..." - -msgctxt "#32107" -msgid "update complete." -msgstr "העדכון הושלם..." - -msgctxt "#32108" -msgid "Watchedlist: MySQL Error (WL DB)" -msgstr "רשימת נצפה: שגיאה MySQL (WL DB)" - -msgctxt "#32109" -msgid "Watchedlist: SQLite Error (WL DB)" -msgstr "רשימת נצפה: שגיאה SQLite (WL DB)" - -# empty strings from id 32110 to 32201 -msgctxt "#32202" -msgid "Addon movie database" -msgstr "מסד נתוני סרטים של ההרחבה" - -msgctxt "#32203" -msgid "Addon episode database" -msgstr "מסד נתוני פרקים של ההרחבה" - -msgctxt "#32204" -msgid "Kodi-movie database" -msgstr "מסד נתוני סרטים של קודי" - -msgctxt "#32205" -msgid "Kodi-episode database" -msgstr "מסד נתוני פרקים של קודי" - -# empty strings from id 32206 to 32207 -msgctxt "#32208" -msgid "Access Denied (username/password/rights)" -msgstr "הגישה נדחתה (שם משתמש/סיסמה/זכויות)" - -msgctxt "#32209" -msgid "Database '%s' does not exist" -msgstr "מסד הנתונים '%s' אינו קיים" - -msgctxt "#32210" -msgid "Access denied (user '%s', DB '%s')" -msgstr "הגישה נדחתה (המשתמש '%s', DB '%s')" - -# empty strings from id 32211 to 32296 -msgctxt "#32297" -msgid "TV-Show \"%s\" (ID %d) has no tvdb-number. No processing with WL possible. Try rescraping." -msgstr "סדרות \"%s\" (מזהה %d) אין מספר-tvdb. אין אפשרות לעבד עם WL. נסה לבצע סקרייפינג מחדש." - -msgctxt "#32298" -msgid "%d movies and %d episodes read from WL." -msgstr "%d סרטים, פרקים %d נקראו מ-WL." - -msgctxt "#32299" -msgid "%d movies and %d episodes read from Kodi-DB." -msgstr "%d סרטים, פרקים %d נקראו ממסד הנתונים של קודי." - -# empty string with id 32300 -msgctxt "#32301" -msgid "%d watched new. %d updated" -msgstr "%d מצב נצפה חדש. %d עודכן" - -msgctxt "#32302" -msgid "%d movies marked as watched" -msgstr "%d סרטים שסומנו כנצפה" - -msgctxt "#32303" -msgid "%d episodes marked as watched" -msgstr "%d פרקים שסומנו כנצפה" - -# Error Messages -# empty strings from id 32304 to 32400 -msgctxt "#32401" -msgid "Set as watched (Kodi-DB)" -msgstr "הגדר כנצפה (קודי-DB)" - -msgctxt "#32402" -msgid "Remember as newly watched (WL-DB)" -msgstr "זכור כנצפה לאחרונה (WL-DB)" - -msgctxt "#32403" -msgid "Remember as watched (updated) (WL-DB)" -msgstr "זכור כנצפה (מעודכן) (WL-DB)" - -msgctxt "#32404" -msgid "Set as not watched (Kodi-DB)" -msgstr "הגדר כלא נצפה (קודי-DB)" - -msgctxt "#32405" -msgid "Remember as not watched (WL-DB)" -msgstr "זכור כלא נצפה (WL-DB)" - -# Notification text -# empty strings from id 32406 to 32600 -msgctxt "#32601" -msgid "Error opening WL-database" -msgstr "שגיאה בפתיחת מסד הנתונים WL" - -msgctxt "#32602" -msgid "Error loading WL-database" -msgstr "שגיאה בטעינת מסד הנתונים WL" - -msgctxt "#32603" -msgid "Error loading Kodi-database" -msgstr "שגיאה בטעינת מסד הנתונים של קודי" - -msgctxt "#32604" -msgid "Error updating WL database" -msgstr "שגיאה בעת עדכון מסד נתונים WL" - -msgctxt "#32605" -msgid "Error updating Kodi-database" -msgstr "שגיאה בעת עדכון מסד נתונים קודי" - -msgctxt "#32606" -msgid "Writing the WL-database file %s" -msgstr "כתיבת קובץ WL-מסד הנתונים %s" - -msgctxt "#32607" -msgid "Unable to merge dropbox data" -msgstr "אין אפשרות למזג נתונים מדרופבוקס" - -# Progress Dialog -# empty string with id 32609 -msgctxt "#32610" -msgid "%d/%d: %s" -msgstr "% d/%d: %s" - -msgctxt "#32611" -msgid "%d/%d: %s S%02dE%02d" -msgstr "% d/%d: %s S % 02dE % 02d" - -# Dropbox related messages -# empty strings from id 32612 to 32707 -msgctxt "#32708" -msgid "Dropbox Error" -msgstr "שגיאה בדרופבוקס" - -msgctxt "#32709" -msgid "Unable to upload" -msgstr "לא מצליח להעלות" - -msgctxt "#32710" -msgid "Unable to download" -msgstr "לא מצליח להוריד" - -msgctxt "#32711" -msgid "WatchedList: Dropbox-Import (Movies)" -msgstr "דרופבוקס-ייבוא (סרטים)" - -msgctxt "#32712" -msgid "WatchedList: Dropbox-Import (Episodes)" -msgstr "דרופבוקס-ייבוא (פרקים)" - -msgctxt "#32713" -msgid "Dropbox synchronization" -msgstr "סנכרון דרופבוקס" - -msgctxt "#32714" -msgid "Upload successfull" -msgstr "העלאה הסתיימה בהצלחה" - -msgctxt "#32715" -msgid "Empty authorization code in settings" -msgstr "קוד אישור ריק בהגדרות" - -msgctxt "#32716" -msgid "Update the Dropbox database: ..." -msgstr "עדכן את מסד הנתונים של דרופבוקס:..." - -msgctxt "#32717" -msgid "Dropbox database updated: %d entries." -msgstr "דרופבוקס - עדכון מסד הנתונים: %d ערכים." - -msgctxt "#32718" -msgid "WatchedList: Dropbox-Export (Movies)" -msgstr "דרופבוקס-ייצוא (סרטים)" - -msgctxt "#32719" -msgid "WatchedList: Dropbox-Export (Episodes)" -msgstr "דרופבוקס-ייצוא (פרקים)" - -msgctxt "#32720" -msgid "Error importing python Dropbox API. Disable function." -msgstr "שגיאת ייבוא מפתח פיתון Dropbox API. בטל את הפונקציה." diff --git a/service.watchedlist/resources/settings.xml b/service.watchedlist/resources/settings.xml deleted file mode 100644 index 3635d162f..000000000 --- a/service.watchedlist/resources/settings.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    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 Te{A4?Y~X)v;D6b`KlA?|xp+ot diff --git a/service.languagepreferencemanager/resources/icon.png b/service.languagepreferencemanager/resources/icon.png deleted file mode 100644 index 6c03207a93f6cea04a600d9b98ee6a43597fb5e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111986 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%0D1Cw-g8Pddw;*67=AF*h+Zs9pgF1$- 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

    W=KhLr?Mi^Zo>yI5meM5 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 XyhrqS^olM0i - - - - - - - - - - - - - - diff --git a/script.service.hyperion/service.py b/script.service.hyperion/service.py deleted file mode 100644 index 3a02c59c3..000000000 --- a/script.service.hyperion/service.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -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.gui import GuiHandler -from resources.lib.logger import Logger -from resources.lib.monitor import HyperionMonitor -from resources.lib.settings import SettingsManager - -ADDON_NAME = "script.service.hyperion" - - -def main() -> None: - addon = xbmcaddon.Addon(ADDON_NAME) - logger = Logger(addon.getAddonInfo("name")) - settings_manager = SettingsManager(addon.getSettings(), logger) - player = xbmc.Player() - output_handler = GuiHandler(addon, settings_manager) - monitor = HyperionMonitor(settings_manager, player, output_handler, logger) - monitor.main_loop() - - -if __name__ == "__main__": - main() diff --git a/script.wikipedia/LICENSE.txt b/script.wikipedia/LICENSE.txt deleted file mode 100644 index f288702d2..000000000 --- a/script.wikipedia/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/script.wikipedia/README.md b/script.wikipedia/README.md deleted file mode 100644 index d507902d2..000000000 --- a/script.wikipedia/README.md +++ /dev/null @@ -1,72 +0,0 @@ -## Wikipedia Scripted Window -Create the following xml dialog in your skin - -``` -script-wikipedia.xml -``` - -```xml - - - 9902 - - - - -``` - -## Required Controls - -| ID | Type | Description | -| :--- | :--- | :--- | -| 9901 | label | Title of the Wikipedia article | -| 9902 | list | List of sections containing the table of contents. Scrolling the list changes text loaded in the section textbox 9903. Clicking a listitem opens a select dialog for page links in the section | -| 9903 | textbox | Textbox with the text of the section focused in 9902 | -| 9904 | label | Creative commons attribution label. REQUIRED! You MUST display this text as per Wikipedia licensing requirements | -| 9905 | image | Creative commons licence logo. The license logo is optional as long as you display the attribution label | -| 61 | scrollbar | Page control for section textbox. Clicking the scrollbar will pop-up select dialog for page links in the section | - -## Window Properties - -| Property | Description | -| :--- | :--- | -| Window.Property(Backdrop) | First result found on wikimedia commons for search term with landscape aspect. Not always accurate but can be useful to use in place of background fanart. This image is aliased to Window(Home).Property(Wikipedia.Backdrop) if you need to use it in a window underneath the dialog. | -| Window.Property(Image) | If the current section has an image, the first image will be added to this property. Otherwise it gets the first image for the page | -| Window.Property(ImageText) | The alt text for the image which is displayed on wikipedia for vision impaired users or when the image does not load | - - -## Changing Tag Formatting - -HTML tag text formatting can be modified using a skin string. - -Example: Change all `` hyperlinks to red -`Skin.SetString(Wikipedia.Format.Link,[COLOR=red]{}[/COLOR])` - -The `{}` curly braces will be replaced with the text between the HTML tags - -| Skin String | Affected HTML Tags | -| :--- | :--- | -| Wikipedia.Format.Link | `` | -| Wikipedia.Format.Bold | ` and class:mw-headline` | -| Wikipedia.Format.Emphasis | ` ` | -| Wikipedia.Format.Superscript | `` | - -## Opening / Searching - -``` -RunScript(script.wikipedia,wikipedia=SEARCHTERM) -``` - -Searches wikipedia for the search term and provides a select dialog for user to select from results. - -Optionally can add a `tmdb_type=TYPE` param to tailor the search for more relevant results -Optionally can add a `xml_file=FILENAME` param to use alternate skin template -Optionally can add a `language=CODE` param to set language with two letter ISO 639-1 code - -Supported language codes: `it` `de` `fr` `es` `en` - -``` -RunScript(script.wikipedia,wikipedia=Alien,tmdb_type=movie,language=en) -RunScript(script.wikipedia,wikipedia=Chernobyl,tmdb_type=tv,language=en) -RunScript(script.wikipedia,wikipedia=Matt Smith,tmdb_type=person,language=en) -``` diff --git a/script.wikipedia/addon.xml b/script.wikipedia/addon.xml deleted file mode 100644 index 16c557139..000000000 --- a/script.wikipedia/addon.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - -

    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

    j-HIX0O3AX@Kx6(5$ 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

  • 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 axeV-gTQ3YENSp+j6bKQu#B=_A{{H|$qnl^| literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/0.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/0.png new file mode 100644 index 0000000000000000000000000000000000000000..e04b08334bfe1568010fea3b1938ee589ba7ea38 GIT binary patch literal 4573 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/1.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/1.png new file mode 100644 index 0000000000000000000000000000000000000000..75318efd6da3ba48d9eecd6b01bc9b616e5ac214 GIT binary patch literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>foX!Li(^Q|oVT}c=Sl@KxCW|u zamsz()F@T(Uv&x3?NpyS<&@l$U5OQILK(huY-u$q5a$MJ#seDOOFonPaCsgO^c{cv z@vVIO;fEh4r}G>xD1R><|J(L^!+*oR#}!hC>-OJ2zqk8$p>bo+V~c%rZ@ewry|cXV z{yL)x&w=2wL|lA){PTN9AJ4R%@U&>BP4B~}PoJi~i`@_rV=>`s)>fY$0|C%E_IYXoh6e4cd0cp6x^FTIGGBkQsIj9l zx_Fzzkps3B9kUDVYjxgB4l0;i~P2LZ-MipYh d11T}ByAaQHdaL!EmTWnYsHdx+%Q~loCIEBU+&lmP literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/2.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/2.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a4f64065fb35623e7e383bfb870b6e98cac170 GIT binary patch literal 3368 zcmbW4c{tSj7srQe(ID$hb17jayR4&$>?UirD1#QlQ(=l4L|Ky3l)Ws2C}gHFs4Usj zT!b4D)kL{2E+tvA`<<`n{`vdszMf}z9`pI0@8>Me{j35eyLKCgco#6K$ z$VY$=elpyj(om=!GemO}mn%8nI71H3A7%N24`y6@xW=~`D#N>>Xn(A z;@&Vd>He8-J-w|ry!R2YAtqlb~dDP=$zhfJ8sZuG}(GD=FGAUJhobQdFJySfYmK9ZMPaD zz{B0#`^YBqNq=Cdt*vd+kw;GPH*VbMrX7mVW8}5Z5r#hlgM))5{ejPPfu20$Xlm~o zm$f;CEPfstb^#*#k8`G;ke5@l~rT*p1m+s8YQ!MvDKv_jaMb0>CZE37CQ-eYq z_h1TbpgJ?uPK5pZt37oLI1RiMT3TD48^1W-ohyV!qkY#`nu9FmldZpwj*e;rjgiYg z;}_b$(`y05?@||K-}MhMw^KUDev<0KzA58yxZePut4@9SeUq24_BjS$faaA2KIuIY zg7F~$9*70#4kO-e{yH+^fTCDp+=AA%02~2OQ&Y1m?wfSaqpRxb>+7@I+S*t~vYP1X zy1F_!!j&IBp`oF=Q{oqE_p7R^&Mz)5`dv-BcKr`v8Yn0z*gJszdTD^e;natH`|yl@ zS98|CRtVU0vRlY#;8lVz)v z%7TO9f(Ouak4itg3l}b^8*#FtJXh2*-umn4K^DQ2(9kg85&*wscJQ?hiokIrxj*z~5cj`WoP_>H$DrUOr|4Yg6oyXOx?hlke{UrBnm*EOiZlBP{klXng1g=XanfV+_|w3P6T~+=fE?3 zS&B6wqp#5e_-5jBVNG_(r#rj#FT};i$Fsb!XprABWAu1deItTsce!Ixp- zX+%K$e0+QrUUKJ=Qv{|---D_=+W?~IJ12!awMO9SI(H4n3#C7o;sON zr_+-xO{f?=IWANWRm{u7!*jpOPkS=vQ^VC&y{U63^E1Fbb!*6>T!WxUBd@WsabtUX zJF!=>*}_aOxK-k0c)i!=NOLTI(KsJJKYuE1yKzE{UM@L7|$p=3!;ski% zN|LF7!r6y=&gJisxNocEeE$4-we|-%f!#O(MWp4}lW9(+E-5+u&ap9$y&pb&I6|hW z49kvmIEo%Iid_0}{V#$<99kkSMZ>!xaxcCIM40;*;l7MSoLFzflTjiT45uXl_j0Ui zgEe)*EVL+F^5=<(30ym6>kmai=@uq~hfQ#MNus?$Lq36E+j=JOV}F0Y1zFY>Eoe$K zH#g^Lr@-aTD~vb41C!>KmX;|wRx2(0w!U|9agk`JED3QpqJseHsDaaEaWaNY2@emi z=w86Kc#8^#eg9PB3|-o~s|;u@c1L`k9;!Sm(oS)p5h$i)S(G*;F91YR^x12c&=bU| z4ON-)M42lnDk>(cvf<7prUj1W-Mk|@4{VkCrWV3ecx#~N=nmANZW>&g_;YW{*a(F- zTour#1b@m=5=%6nfrL9$U?4CY(*jYsBF#AIyn9G9?R9w3)7jZsd7R;vqRkbB*U->l zGQAt46qnz(p3}>|3V58|7JS^#&rhkH3)1P&_5XvI#d-+Ctf6&ByxwM; z=&7FhqN=Luo+^LOTqL+{2(@Bw=@JQOD%u3PO`N^_{#jGbMM%Q0rf;fkDN-=LXA)f7LcVRDwUd|&VKdk70>76*KOut9!^5o_K<{W1T6Anog2yJiSOHl3gJN8AXGe7|)EudqgFqq@;Rr3HHT($x$ovO&aN0Sy@L4F;chN z9zy%1&v6+bs$=`7#g5NL^H*1MV5TaqqdAR|5)u-ivyt+JsrO9%>@Giz*NwbgUpST1t{lrCCaw-WW?D6u->{n!L%Z&ZDYuB!$ z;M>41F3f@GjkRUCE=i|D%gD$`R$5w`ZMg56*&48=0ZY6R7K?omG~AFIYKcl%0(4-I z_2KxT&46qdVd#&DLYUq`>}AHvk240g@e5;okh>wh#uc>eP>3Pijp%5OM|xd-)cT4p zgFK?5Fj7G{bm&mP)$_UIl#O?#&c*I$d4g{yBqUh5y1Gg-$S^Mc-htdbZVW-@-a|)9zf8BD@U7X6oI$cSWXh zP+^56YDPwe6ePiW0M9iIWA)6h@0>cTG7Qpiq5%3u?m;`4O92_9NDU+7-vj)~c2Q2x zNKa3Ht84`;-a)-`u1xbfOfDcKrRv^<+y{0w5M@=G8{P=22(PKBc@J@ys31lJwll~R zmkc=%EpAJ(5Z@Bb<@c+rt3P(7eh2dN^Y?6B2x1M}W4%oo20FVO27}p(@vBp;>XMR@ zn{N1Uc)OXYsVNe!Y??j}A7p8xv!|Nmn=F4#n=uO_gbMZB0tP7p2Z&7Ye3#QYC* CbTqO6 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/3.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/3.png new file mode 100644 index 0000000000000000000000000000000000000000..21897e381aab8c869d8734a9f034c01607080be2 GIT binary patch literal 4067 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 xakq8Ty9d`TA>xfB~M5z%igpjOL4I;{9 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 Al>h($ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/6.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/6.png new file mode 100644 index 0000000000000000000000000000000000000000..061359615b000322caa81f883b14dd40853dc293 GIT binary patch literal 5154 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/7.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/7.png new file mode 100644 index 0000000000000000000000000000000000000000..a9e573d2095bd5c85a89df0dccef2c089d810af0 GIT binary patch literal 2246 zcmb7GdpOkj8Xwolwb-?zS*ElnEk}(@WYM_f5^_uIVP?WHvcwr|Yf4xs_R3S#3`)od_YTh}>^O`+n!=pYxo*&gXgXJo9^h@B4l}@8^9-lKpuLsr`!k zaX6fmm8F>@{C$dk#6;nDm1}hY4kwmkWoCRKEdS%1;lSQadwz^?%f^Q3NeZ@+Kv6SC3HP!K|3#JNI3?o{vYV55$A3R(&@>%@iaLxVb9%A zX3Uo%JEF1kEOM-dtk~}&f&$HCB3VI9ct$V|MG7Y;*JpLlHZ+o+Fh?Jx^#?h~pkGqV7aTa+Bqx0Pg|3<=s}3+BO_*WRuo;UFy(a ze}BKcG_&);kh+?hnu>Io$8f`yVVm;0x;iZ#9i4$yN-Vd|=Xt?#q5GAUl_61bL{jMd zNK=nqZ*Nd=a4=;|#4=z1#}65rsnY;^Rr%$y=w@H*caS|5yL= zNYIqls_X6TwHXQ(IJiFl=201oQ(9WuwQ3v7%{cBLe1Wwxp!wEZ)-B*Z2PHBU}=X$BXnP(COa;suu*0J^*Ae`UeIEn%czK zme$tRH_bT?-o^n7h$teu9pKsa~qT=MLr*ldx6$CsR(oYFPf&+eR{U4_!MVT%*L z@EHaL1-V1-8F%j7QJcK%@9!@unh+_axEMI|d!cCzZ)4FE|FkV?d#$NWg8i!b$JvYC zgcp~!bF;FtrnfZ66YpP^*=5FEaCUY^-DGR|^bt_AYA)68@6q!b+E)&npWb#di;Iho zf+i$TjMjdF))wg?8Z`H+)(f>f2p>`L%$)!9-*+l&hC+=I>+=+E!a7h{*!m0Eb7|_= z^h`!}&Xtiy1_z0vVv$O4=vw?Z{4h{RRPw9wEe#@F8~`uG)JRVC=4kmKR+X-`o{4B8 zb8~b4Xd=1+BaMYDPFq`B0j-Ov(3Sf2cWZwXO>;j~cLWc$V-FH5nrj-b+;05lQ}N^^)6-U8fZ?dj=Rgj`etBMbqk z^50MeNgTU8y7C1K99>*o%J?Fvz=B!hnRw8F?_aC|q#CU5DQ_ZD!f&XWQh_NkwFUxY zG7MsNd8gr(C)^~tW8Z?j!(h0pNM5G&*ZRd+W`Zz(J*Z0(}^$aLMF*g{7$TL&la{ z0+R3%P%gnDj>w7$1Bpcwj77YN#Fu;KYXY7kSPKboSb6ARVKzB+<#oLkTDKM`iS{}S z4v`8LszvY3F5D}Q#<6EqwB~+(eifRs$Wc0egOv_@Do`ktDr`b3Dk`RXvu7|Ewfbxp zizNw!ND_%Ag>X6P-UK*W1IS(IuA+VZLSA0J5gI6m!;4La6g2hp)?EPB>Qy+zPFPYi zqO6!UKy~s`A1>zDe6)G+E^l+WJ5Bivbu;&t<LK!@m^-_qj#(ekRQDrXeiaV9D6vtFs)JtNAFP{1*}0t0-CIj3hx zIA0G&&v^F|EjTB1VYKy3)Ygg>%C`~2{l%iPrKQDSRi<&V`*aIqcCgB=rwn-IO+S(3^|k&R0_o0Ejma)3S7yCa|h_B0x;CNlh_Pizdw&B*v?_(nTslYP>7 zGuInHr}G&^tj&FoG4LAih!cXWfA7P6zW8wa#=n0Uc;FoAC%bV-2AU{GiT>wbfyEiS XE8;wgK)7xgdS-R@yjiu$rT9Mq`Y|CP literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/8.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/8.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f827e6eb644ea4276f2a4b7901ba3038a3e148 GIT binary patch literal 5382 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/A.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/A.png new file mode 100644 index 0000000000000000000000000000000000000000..f674ffbb1c766d4abb87b9ed82d1de510518cd40 GIT binary patch literal 4290 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 HT}k*Ke^#3% literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/B.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/B.png new file mode 100644 index 0000000000000000000000000000000000000000..c31c541e42d9b28609dbb2b279d5ca5a4dabbdca GIT binary patch literal 3575 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 literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/C.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/C.png new file mode 100644 index 0000000000000000000000000000000000000000..551976f503ff85eb88536e06c7905eaf9f6b3261 GIT binary patch literal 4192 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 MHL@hq4PD6p1w5-7djJ3c literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/E.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/E.png new file mode 100644 index 0000000000000000000000000000000000000000..565e1ec3b356dcb9adb8dfdeea5dab7c7ec550b8 GIT binary patch literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>f$_bki(^Q|oVT|PyO<4l7!JNT z@qhoCDd8;BSa|#lKQkl>bZgnm0hQwe_h(K%TvqOXZt>YO7yo{I_x>C6gXx?sO%4hi z1c*bQzcF|5JKlNLbP0l+XkK DPEUGx literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/F.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/F.png new file mode 100644 index 0000000000000000000000000000000000000000..fd23c2b460135913a09a5a3ac0c9bc6211257c7d GIT binary patch literal 539 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>f$@>2i(^Q|oVT|Ravm|@VL151 z@3pT*Mc;3%CDz`8`Ed(=cpS;p<6voY5Eudk cQgnTAs;~9q)bHB+JQXDB>FVdQ&MBb@02AMIYXATM literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/G.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/G.png new file mode 100644 index 0000000000000000000000000000000000000000..e0a4584390aba1bfd4b3b398570d9d7b1f455f27 GIT binary patch literal 4383 zcmbVQc{r5q+eT$dNGc**65j0lGPaQzOZ2wbvPHb(O{0v)PH5qsFj1B?rbM(LB4dq^ zdhH`*-(n06$u7%xJ^hZ~_s{p=cOD1hdFFZU`?{~?yv|GP8EZ2hE@3V0N3)fce`hM0c09>b$)2nwExSb$QoBewMi5ffed};fS7`esZ$|C4 ztCy4=`{;%%21;Vsz-1r8Z9)j%_dV6FQsVCL+(v5xp?_%T7(Y8$^8bU;27f2-&4dRQ z*{U)!GG+xmGdC8pa&mH%DB0&vJmk7wx4$!&~-FJ89>n5o3{kHqA=<+$n&kr{_f7KEsVSR?N#a+qa#6mpHPB z6%?Y?yvYxqv-SXIz=aDJmcDu<=u1De$S(G9IT=YQw z;pkeo!0pYI;W-wI<+-cX>uvAy>|lkKl9E!wa^;SM&l7%YtrT=XhGE2(9_y5)rK_v! z@Yd$96~^S`Bt0MX!^G6o^kd`>6z{#bxVR3NC!w{<+?_*1Lt7gQZHCm;)KqMRsZpd$ zL64S(hQ?Z`fjDc|=f4zFnr=+BKRwAAU29a~#kb2b&$hq4ygJd;|ZTOR3%6 z-L}s;W92s`W*AL%Vy$(Uh6m81mh%_3R79FSz zT6o?wv$XEjvMIvN86CTjm7Sga!i(vzI~cYy7%=?rLpi(YrQon|fR~q-G)r%EIoJ0Y za)P(ih^;k-Uzw9NS^y5UwY3$V-r_YgJw092>+^0n0%B<-!8h`A?!-e2PYecA``+sz zAkVSn??WjO3)B&Q66&4raJBwHuG_e3Sy6FuabIt5@1S*N4%JrnAXgtjRYp!u?#c>e z!9_<$M<>M;xxNKs^fs-Oz-XluKdJ*O6GU|UE^k7LuWjA_<33g@5i&LD^JU%8)gPnx z0l4Pn?Y)B77E#vYv3S#G9ZqF_6I?GihFa;iP30@A zC0Z`4rs)C%(07X$V&qiQtcc6sd*4b4Y#ZtXFHZd_oWL4QKb@|5b$uemHQZrJj~;KB zAG$hvS3J=ts(%kuzJAE^_ooy&YD|OsJV~i~bqt9>K-PjedYM*u3C!oNQ+85scsvUD z`SYh=U)j$Ke*?k*%7?i#F@Yvf{enM-<@gP^R>u=)S>;*{fR*6hQ|NA5dtYDQzn%p9 zJX<-c!Djp}uyDB*Jy*G4GtA5p%^A7cTjaSnrKO{{w>NguUKO7h`g(BwBM&z>H=`HlPk1wArAh!|360U5u~8RZ z+2)N+r(J;LcRq9Gj1k)G=m}X_*~0*%=xg7<7J4+&aJ{uX}4GPF|&A)c_>Z#IEP8si*q^F z_lNWc@TKXb=R0CvPBf(`F~%C!M(ghG>ulw5>u`zKT2Y~RIZ~5Z_2a`{B{DwVP5H3XJD*-vFu&R1M}OrJE&Kph zl@F>!moV9!R#;f5f|xKkH8my66usP&?_7an?0SQ{4aiE5_H-aN{BuYS$KX^Rj#4Z< z0kvq3axd*?Jp*Jl?y|qPOJld7jmmd;UqWBH#$6#7^Dh94`ib-hqhPC>x#u9FiWwyp zp=&=UiU~Vt7wXY59XRzw1NNnY_gm{TNN+Na-(zH4|GQmabz`7@@N^Fjat(=-360>m zzBJpO{aUb(=649z(f?dxt*xzjnG$cJZ%W7`USFl^o!q8?xFnIR zyu9n1;fBoX?ARwm62|~pjXNcdXL62?c^QXpv4;x$8GRW*=BGI<%i9p_(S2d8b^ER?mT~_$Jz@G8WhWZLA0*c^`X= zs3XZg%5Nzv*@uC%r24ZteYarCGWjC$^o*0L3&|HfN}?v7%w{)dK9bgd3e^XJ3y@o|G% zIT~htv`(2D?ExwPhR^ior_pU+sT)^$5fx_bc>QMS4GNcy1*JSf``) z^log=9ioAX8Puoo(=##tM_q!M*(o@N^vvP-gn$0lLOh%02~Bc|AXP!Ny?i+X0U28~dR12Twe-b2+N7X!PYc zU=VqMxowY>210Aa3#1EKGZ@6Us_50t@a;zNhz*rkx5=jF=H`K_kQF?_7tRO`2`Y7q z^4{GcE~3cIbZl>xnJjtt?p>lHS5uLXhlj^8)`0tdrY>?{|L3P;3FO~jfRIT6j%{yM z>L%y!V1@1+{q{LY#$51@r$aZWJ?O-lu1XDH{1Zxo#I+LA8~LW{U$Yf+^j4*0az;eo z+HOv}f>Tf&f#V3xHjLOO-`AmSFu@`#J};Xjqh~lS4@uId5lY zm!wD!6(BW4Ntdb77fz$aG3(Q>3aTZYbJwajm-~G?q)N?#^I;vVaGWWD1v)N^q%j;Y z9JV5gkK2yOVx$obqC7zi0J&I|yDcmMM%lk^lNLq5sP^T#;rCSkTKvR(pdQljiU|{Y z=?j*yO_D`6y)(y#D(zg{?+vy5;kcl%)MW1Y6I~FFc@*=*U@K7WRJqJk+83~(=T%mcN7MbF`akZjQ-e*dbXIGISqU-xKvq;aLvr67eQ zIb;n%i2yz13Vkk_-b#^s1r8Y;7#L`7Na>zzZ&k@hJb{X?m9T55Oj=;HQ47Fn_o1iv z5#HFJeR00rvng2th?>=ritbzcNMU4z%<2fA{!k>3*4EYz9I1)ifwW;LPOA{b*@yP> z0(Q2xw$O$(bt%?=sWa{oXRp6_{`|Q#-|n564pSF-_U+rJrLL}?+TukpHa6y9>6AUR z&go=9r#B-I2x>jz=g=zxeBBpw+?k+Q=DS2&5xDnlW2RV%;QQZ&-T0RXcLPbZ*Q zP;7W}vD3z|3nr$Y^R~hxUyC3)APikPBD^Tp?N2i2015z@Aw7$)?9?N}R7OKM6iJ}@ z_52j@qnLj1A`Z^NBR+d|M+O~c6Cj@1Dt{*ZcpoYG3TSfQLVJ0nVvx=gGJD(fN9q1= z6B85qYu}P=Y+=~Ub9n0&$CqFC3-CKSHdKSKau6+b5GC(Msq<03wUMr&lNY@~JQ88*R$;oW#hY3wBikH|yBk?Jd=_dxJVLMT50Vu}G&tO+~`uJ&6Dt_p9EhXK&i#>U1~Hv#&CRC8jB z`{6r#U=Br+47w=f;`NF_Jba{qTJ|qvI)Q`RQ=#%@vn1Aw!TVE_OC literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/H.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/H.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8e41fe276ea2824d4bcca782a2645939a7a03b GIT binary patch literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>f$@Q-i(^Q|oVT|xaxyE5xE`!k z{JTBJ%0eI_%rlK^LU+N3)32F;s_}py=k8SAh|0cOdGE}fUGJywc%8ndjK5(rCrguq z0>>aC_LTE$WUt*?&HVo?Hf$^B9i(^Q|oVS-Zavm@cU~xSC z_xqoB362UInr1Tfd4H<}s>BDrt(lx`Y^?tMT9o_$gX_M(XD%>qbP(WR86{{P21v0Y Z{)=HE535Syj)R&YQBPMtmvv4FO#oGiW|aT{ literal 0 HcmV?d00001 diff --git a/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/J.png b/script.plexmod/resources/skins/Main/media/script.plex/sign_in/digits/J.png new file mode 100644 index 0000000000000000000000000000000000000000..e0c6c3a98c81e29cc6aa3e0d9a768cc3bec88392 GIT binary patch literal 1134 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST~P>fyLC*#WAE}&fB}TD`Y|?jz9dK z@j~D-{If9rZ5Rx+3Lm(>Qg`d&s`s@IcKAnUFK0W~ zyf$xBbb@)KgMt7D3)3itI|y`yJl^lE6tHmdUaN4N?fmQJ=Lf^ut2(~k=GxXM-B2vR zF^%iVw}YSmN!jpki_)54&368G?FXA1St}jh$=JL~T9@&50& zRlDjRoOmCdUC$2`(%sl(6BDXz|L))01Cau{f+v!jpVyjK$i3O(qR`Jj@B3MxotM`% z=IrzQapl2Aaklf#bDzaI`tjBAFX3)cJu7>{7^wbk)NY#!wKpcw3VXjRhnA*&xN)BS zd~?P*(I+og?JECp<~&ea#?hHlr}GW&ks+Sr&E`3L{|w0o}4udDD5mAxC|{{6+X zWF`KPtF@t}pXJK#uD@J`W1N(2XC$?10&0f3rQdIH#;;`ql-Y+?yv8(kU_u8%fwz?6kYu75w54o!RDB