From 179a785adb52754ff8f883c1b23020879cf02e98 Mon Sep 17 00:00:00 2001 From: fojadrachi Date: Sat, 26 Sep 2026 21:00:36 +0200 Subject: [PATCH] feat: Playtube Stream Dock Plugin 1.0.0 (Ajazz AKP153E) mit Icon-Pack --- .gitignore | 7 + README.md | 64 + build.mjs | 36 + com.fojadrachi.playtube.sdPlugin/de.json | 69 + com.fojadrachi.playtube.sdPlugin/en.json | 69 + .../manifest.json | 444 ++ .../plugin/index.js | 4629 +++++++++++++++++ .../propertyInspector/index.html | 246 + .../static/btn/like_0.png | Bin 0 -> 3118 bytes .../static/btn/like_1.png | Bin 0 -> 2547 bytes .../static/btn/mute_0.png | Bin 0 -> 2646 bytes .../static/btn/mute_1.png | Bin 0 -> 2433 bytes .../static/btn/next_0.png | Bin 0 -> 2652 bytes .../static/btn/nowplaying_0.png | Bin 0 -> 2249 bytes .../static/btn/playlist_0.png | Bin 0 -> 2123 bytes .../static/btn/playpause_0.png | Bin 0 -> 2194 bytes .../static/btn/playpause_1.png | Bin 0 -> 2117 bytes .../static/btn/previous_0.png | Bin 0 -> 2618 bytes .../static/btn/repeat_0.png | Bin 0 -> 912 bytes .../static/btn/repeat_1.png | Bin 0 -> 2809 bytes .../static/btn/repeat_2.png | Bin 0 -> 2993 bytes .../static/btn/seekback_0.png | Bin 0 -> 2090 bytes .../static/btn/seekforward_0.png | Bin 0 -> 2128 bytes .../static/btn/show_0.png | Bin 0 -> 2228 bytes .../static/btn/shuffle_0.png | Bin 0 -> 2886 bytes .../static/btn/switchtab_0.png | Bin 0 -> 2070 bytes .../static/btn/volumedown_0.png | Bin 0 -> 1950 bytes .../static/btn/volumeset_0.png | Bin 0 -> 2646 bytes .../static/btn/volumeup_0.png | Bin 0 -> 2134 bytes .../static/icon/icon@2x.png | Bin 0 -> 5267 bytes .../static/icon/like@2x.png | Bin 0 -> 2072 bytes .../static/icon/mute@2x.png | Bin 0 -> 2056 bytes .../static/icon/next@2x.png | Bin 0 -> 1795 bytes .../static/icon/nowplaying@2x.png | Bin 0 -> 1673 bytes .../static/icon/playlist@2x.png | Bin 0 -> 1585 bytes .../static/icon/playpause@2x.png | Bin 0 -> 1681 bytes .../static/icon/previous@2x.png | Bin 0 -> 1786 bytes .../static/icon/repeat@2x.png | Bin 0 -> 1891 bytes .../static/icon/seekback@2x.png | Bin 0 -> 1613 bytes .../static/icon/seekforward@2x.png | Bin 0 -> 1622 bytes .../static/icon/show@2x.png | Bin 0 -> 1828 bytes .../static/icon/shuffle@2x.png | Bin 0 -> 2103 bytes .../static/icon/switchtab@2x.png | Bin 0 -> 1650 bytes .../static/icon/volumedown@2x.png | Bin 0 -> 1430 bytes .../static/icon/volumeset@2x.png | Bin 0 -> 2056 bytes .../static/icon/volumeup@2x.png | Bin 0 -> 1591 bytes .../icon.png | Bin 0 -> 5337 bytes .../icons.json | 1562 ++++++ .../icons/dark_aniworld.png | Bin 0 -> 6143 bytes .../icons/dark_arrow-down.png | Bin 0 -> 2630 bytes .../icons/dark_arrow-left.png | Bin 0 -> 1976 bytes .../icons/dark_arrow-right.png | Bin 0 -> 1967 bytes .../icons/dark_arrow-up.png | Bin 0 -> 2771 bytes .../icons/dark_bell.png | Bin 0 -> 3235 bytes .../icons/dark_calendar.png | Bin 0 -> 3875 bytes .../icons/dark_check.png | Bin 0 -> 2338 bytes .../icons/dark_chevron-down.png | Bin 0 -> 2767 bytes .../icons/dark_chevron-left.png | Bin 0 -> 2793 bytes .../icons/dark_chevron-right.png | Bin 0 -> 2801 bytes .../icons/dark_chevron-up.png | Bin 0 -> 2808 bytes .../icons/dark_chrome.png | Bin 0 -> 6857 bytes .../icons/dark_clock.png | Bin 0 -> 5907 bytes .../icons/dark_close.png | Bin 0 -> 2845 bytes .../icons/dark_discord.png | Bin 0 -> 4683 bytes .../icons/dark_download.png | Bin 0 -> 4408 bytes .../icons/dark_eye-off.png | Bin 0 -> 5079 bytes .../icons/dark_eye.png | Bin 0 -> 4775 bytes .../icons/dark_file.png | Bin 0 -> 2937 bytes .../icons/dark_folder.png | Bin 0 -> 2689 bytes .../icons/dark_forward.png | Bin 0 -> 2927 bytes .../icons/dark_gear.png | Bin 0 -> 4975 bytes .../icons/dark_globe.png | Bin 0 -> 7464 bytes .../icons/dark_grid.png | Bin 0 -> 3632 bytes .../icons/dark_headphones.png | Bin 0 -> 4116 bytes .../icons/dark_heart.png | Bin 0 -> 4703 bytes .../icons/dark_heartfill.png | Bin 0 -> 3480 bytes .../icons/dark_home.png | Bin 0 -> 3082 bytes .../icons/dark_info.png | Bin 0 -> 5804 bytes .../icons/dark_lightbulb.png | Bin 0 -> 3721 bytes .../icons/dark_lock.png | Bin 0 -> 3188 bytes .../icons/dark_mail.png | Bin 0 -> 3884 bytes .../icons/dark_medal.png | Bin 0 -> 4573 bytes .../icons/dark_menu.png | Bin 0 -> 2323 bytes .../icons/dark_mic.png | Bin 0 -> 3752 bytes .../icons/dark_minus.png | Bin 0 -> 1441 bytes .../icons/dark_monitor.png | Bin 0 -> 3260 bytes .../icons/dark_moon.png | Bin 0 -> 3117 bytes .../icons/dark_more.png | Bin 0 -> 2148 bytes .../icons/dark_mute.png | Bin 0 -> 3685 bytes .../icons/dark_netflix.png | Bin 0 -> 3667 bytes .../icons/dark_next.png | Bin 0 -> 3403 bytes .../icons/dark_note.png | Bin 0 -> 3053 bytes .../icons/dark_nvidia.png | Bin 0 -> 4099 bytes .../icons/dark_pause.png | Bin 0 -> 2644 bytes .../icons/dark_pc-monitor.png | Bin 0 -> 5079 bytes .../icons/dark_play.png | Bin 0 -> 3012 bytes .../icons/dark_playlist.png | Bin 0 -> 2903 bytes .../icons/dark_plus.png | Bin 0 -> 2793 bytes .../icons/dark_power.png | Bin 0 -> 5019 bytes .../icons/dark_previous.png | Bin 0 -> 3396 bytes .../icons/dark_prismlens.png | Bin 0 -> 7641 bytes .../icons/dark_refresh.png | Bin 0 -> 4328 bytes .../icons/dark_repeat.png | Bin 0 -> 3731 bytes .../icons/dark_repeatone.png | Bin 0 -> 4185 bytes .../icons/dark_rewind.png | Bin 0 -> 2856 bytes .../icons/dark_search.png | Bin 0 -> 4513 bytes .../icons/dark_shuffle.png | Bin 0 -> 4637 bytes .../icons/dark_star.png | Bin 0 -> 3872 bytes .../icons/dark_steam.png | Bin 0 -> 6518 bytes .../icons/dark_steelseries.png | Bin 0 -> 4547 bytes .../icons/dark_stop.png | Bin 0 -> 2151 bytes .../icons/dark_sun.png | Bin 0 -> 4753 bytes .../icons/dark_tabs.png | Bin 0 -> 2963 bytes .../icons/dark_trash.png | Bin 0 -> 3810 bytes .../icons/dark_twitch.png | Bin 0 -> 3305 bytes .../icons/dark_upload.png | Bin 0 -> 4263 bytes .../icons/dark_vol.png | Bin 0 -> 4462 bytes .../icons/dark_voldown.png | Bin 0 -> 2201 bytes .../icons/dark_volup.png | Bin 0 -> 2688 bytes .../icons/dark_warning.png | Bin 0 -> 4061 bytes .../icons/dark_wifi.png | Bin 0 -> 3954 bytes .../icons/dark_window.png | Bin 0 -> 2833 bytes .../icons/dark_youtube.png | Bin 0 -> 3155 bytes .../icons/gradient_aniworld.png | Bin 0 -> 7918 bytes .../icons/gradient_arrow-down.png | Bin 0 -> 4861 bytes .../icons/gradient_arrow-left.png | Bin 0 -> 4188 bytes .../icons/gradient_arrow-right.png | Bin 0 -> 4212 bytes .../icons/gradient_arrow-up.png | Bin 0 -> 4770 bytes .../icons/gradient_bell.png | Bin 0 -> 5300 bytes .../icons/gradient_calendar.png | Bin 0 -> 5399 bytes .../icons/gradient_check.png | Bin 0 -> 4691 bytes .../icons/gradient_chevron-down.png | Bin 0 -> 5144 bytes .../icons/gradient_chevron-left.png | Bin 0 -> 5152 bytes .../icons/gradient_chevron-right.png | Bin 0 -> 5153 bytes .../icons/gradient_chevron-up.png | Bin 0 -> 5094 bytes .../icons/gradient_chrome.png | Bin 0 -> 8549 bytes .../icons/gradient_clock.png | Bin 0 -> 7639 bytes .../icons/gradient_close.png | Bin 0 -> 4871 bytes .../icons/gradient_discord.png | Bin 0 -> 6629 bytes .../icons/gradient_download.png | Bin 0 -> 6070 bytes .../icons/gradient_eye-off.png | Bin 0 -> 7138 bytes .../icons/gradient_eye.png | Bin 0 -> 6823 bytes .../icons/gradient_file.png | Bin 0 -> 5364 bytes .../icons/gradient_folder.png | Bin 0 -> 4541 bytes .../icons/gradient_forward.png | Bin 0 -> 5175 bytes .../icons/gradient_gear.png | Bin 0 -> 6858 bytes .../icons/gradient_globe.png | Bin 0 -> 9042 bytes .../icons/gradient_grid.png | Bin 0 -> 5605 bytes .../icons/gradient_headphones.png | Bin 0 -> 6043 bytes .../icons/gradient_heart.png | Bin 0 -> 6756 bytes .../icons/gradient_heartfill.png | Bin 0 -> 5596 bytes .../icons/gradient_home.png | Bin 0 -> 5010 bytes .../icons/gradient_info.png | Bin 0 -> 7546 bytes .../icons/gradient_lightbulb.png | Bin 0 -> 5952 bytes .../icons/gradient_lock.png | Bin 0 -> 5415 bytes .../icons/gradient_mail.png | Bin 0 -> 6222 bytes .../icons/gradient_medal.png | Bin 0 -> 6508 bytes .../icons/gradient_menu.png | Bin 0 -> 4411 bytes .../icons/gradient_mic.png | Bin 0 -> 5905 bytes .../icons/gradient_minus.png | Bin 0 -> 3737 bytes .../icons/gradient_monitor.png | Bin 0 -> 5223 bytes .../icons/gradient_moon.png | Bin 0 -> 5541 bytes .../icons/gradient_more.png | Bin 0 -> 4667 bytes .../icons/gradient_mute.png | Bin 0 -> 5893 bytes .../icons/gradient_netflix.png | Bin 0 -> 5569 bytes .../icons/gradient_next.png | Bin 0 -> 5429 bytes .../icons/gradient_note.png | Bin 0 -> 5252 bytes .../icons/gradient_nvidia.png | Bin 0 -> 6092 bytes .../icons/gradient_pause.png | Bin 0 -> 4974 bytes .../icons/gradient_pc-monitor.png | Bin 0 -> 6672 bytes .../icons/gradient_play.png | Bin 0 -> 5337 bytes .../icons/gradient_playlist.png | Bin 0 -> 5087 bytes .../icons/gradient_plus.png | Bin 0 -> 4561 bytes .../icons/gradient_power.png | Bin 0 -> 6927 bytes .../icons/gradient_previous.png | Bin 0 -> 5410 bytes .../icons/gradient_prismlens.png | Bin 0 -> 9335 bytes .../icons/gradient_refresh.png | Bin 0 -> 6360 bytes .../icons/gradient_repeat.png | Bin 0 -> 5840 bytes .../icons/gradient_repeatone.png | Bin 0 -> 6283 bytes .../icons/gradient_rewind.png | Bin 0 -> 5137 bytes .../icons/gradient_search.png | Bin 0 -> 6464 bytes .../icons/gradient_shuffle.png | Bin 0 -> 6539 bytes .../icons/gradient_star.png | Bin 0 -> 6036 bytes .../icons/gradient_steam.png | Bin 0 -> 8291 bytes .../icons/gradient_steelseries.png | Bin 0 -> 6519 bytes .../icons/gradient_stop.png | Bin 0 -> 4528 bytes .../icons/gradient_sun.png | Bin 0 -> 6691 bytes .../icons/gradient_tabs.png | Bin 0 -> 4885 bytes .../icons/gradient_trash.png | Bin 0 -> 5877 bytes .../icons/gradient_twitch.png | Bin 0 -> 5183 bytes .../icons/gradient_upload.png | Bin 0 -> 5815 bytes .../icons/gradient_vol.png | Bin 0 -> 6701 bytes .../icons/gradient_voldown.png | Bin 0 -> 4606 bytes .../icons/gradient_volup.png | Bin 0 -> 5068 bytes .../icons/gradient_warning.png | Bin 0 -> 6079 bytes .../icons/gradient_wifi.png | Bin 0 -> 6108 bytes .../icons/gradient_window.png | Bin 0 -> 4886 bytes .../icons/gradient_youtube.png | Bin 0 -> 5233 bytes .../manifest.json | 7 + .../previews/preview1.png | Bin 0 -> 5337 bytes install.ps1 | 34 + package-lock.json | 527 ++ package.json | 23 + src/actions.js | 220 + src/controller.js | 290 ++ src/host.js | 125 + src/infoPanel.js | 110 + src/logger.js | 50 + src/main.js | 45 + src/playtubeClient.js | 233 + tests/actions.test.js | 112 + tests/controller.test.js | 204 + tests/infoPanel.test.js | 70 + tests/playtubeClient.test.js | 129 + tools/brand.mjs | 15 + tools/generate-assets.mjs | 151 + tools/generate-iconpack.mjs | 119 + tools/glyphs-apps.mjs | 129 + tools/glyphs-extra.mjs | 248 + tools/glyphs.mjs | 141 + tools/raster.mjs | 146 + 221 files changed, 10254 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 build.mjs create mode 100644 com.fojadrachi.playtube.sdPlugin/de.json create mode 100644 com.fojadrachi.playtube.sdPlugin/en.json create mode 100644 com.fojadrachi.playtube.sdPlugin/manifest.json create mode 100644 com.fojadrachi.playtube.sdPlugin/plugin/index.js create mode 100644 com.fojadrachi.playtube.sdPlugin/propertyInspector/index.html create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/like_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/like_1.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/mute_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/mute_1.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/next_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/nowplaying_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/playlist_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/playpause_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/playpause_1.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/previous_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/repeat_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/repeat_1.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/repeat_2.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/seekback_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/seekforward_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/show_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/shuffle_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/switchtab_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/volumedown_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/volumeset_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/btn/volumeup_0.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/icon@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/like@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/mute@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/next@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/nowplaying@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/playlist@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/playpause@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/previous@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/repeat@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/seekback@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/seekforward@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/show@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/shuffle@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/switchtab@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/volumedown@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/volumeset@2x.png create mode 100644 com.fojadrachi.playtube.sdPlugin/static/icon/volumeup@2x.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icon.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons.json create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_aniworld.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-down.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-left.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-right.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-up.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_bell.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_calendar.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_check.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-down.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-left.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-right.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-up.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chrome.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_clock.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_close.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_discord.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_download.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_eye-off.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_eye.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_file.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_folder.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_forward.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_gear.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_globe.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_grid.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_headphones.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_heart.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_heartfill.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_home.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_info.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_lightbulb.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_lock.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_mail.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_medal.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_menu.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_mic.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_minus.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_monitor.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_moon.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_more.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_mute.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_netflix.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_next.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_note.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_nvidia.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_pause.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_pc-monitor.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_play.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_playlist.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_plus.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_power.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_previous.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_prismlens.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_refresh.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_repeat.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_repeatone.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_rewind.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_search.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_shuffle.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_star.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_steam.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_steelseries.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_stop.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_sun.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_tabs.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_trash.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_twitch.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_upload.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_vol.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_voldown.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_volup.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_warning.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_wifi.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_window.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_youtube.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_aniworld.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_arrow-down.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_arrow-left.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_arrow-right.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_arrow-up.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_bell.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_calendar.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_check.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chevron-down.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chevron-left.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chevron-right.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chevron-up.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chrome.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_clock.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_close.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_discord.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_download.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_eye-off.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_eye.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_file.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_folder.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_forward.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_gear.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_globe.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_grid.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_headphones.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_heart.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_heartfill.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_home.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_info.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_lightbulb.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_lock.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_mail.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_medal.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_menu.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_mic.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_minus.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_monitor.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_moon.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_more.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_mute.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_netflix.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_next.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_note.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_nvidia.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_pause.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_pc-monitor.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_play.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_playlist.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_plus.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_power.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_previous.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_prismlens.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_refresh.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_repeat.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_repeatone.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_rewind.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_search.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_shuffle.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_star.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_steam.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_steelseries.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_stop.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_sun.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_tabs.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_trash.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_twitch.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_upload.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_vol.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_voldown.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_volup.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_warning.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_wifi.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_window.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_youtube.png create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/manifest.json create mode 100644 iconpack/com.fojadrachi.playtube.sdIconPack/previews/preview1.png create mode 100644 install.ps1 create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/actions.js create mode 100644 src/controller.js create mode 100644 src/host.js create mode 100644 src/infoPanel.js create mode 100644 src/logger.js create mode 100644 src/main.js create mode 100644 src/playtubeClient.js create mode 100644 tests/actions.test.js create mode 100644 tests/controller.test.js create mode 100644 tests/infoPanel.test.js create mode 100644 tests/playtubeClient.test.js create mode 100644 tools/brand.mjs create mode 100644 tools/generate-assets.mjs create mode 100644 tools/generate-iconpack.mjs create mode 100644 tools/glyphs-apps.mjs create mode 100644 tools/glyphs-extra.mjs create mode 100644 tools/glyphs.mjs create mode 100644 tools/raster.mjs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..497a428 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +dist/ +*.log +log/ +# Das Icon-Pack wird mit "npm run iconpack" erzeugt; das fertige .sdIconPack liegt im Repo, +# die losen Ordner (gradient/, dark/) und das Zip nicht. +iconpack/Playtube-Icons/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..2d53abb --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# Playtube – Stream Dock Plugin + +Plugin für **Stream Dock** (Ajazz AKP153E und andere Mirabox/HotSpot-Geräte), mit dem du +[Playtube](https://git.fojadrachi.de/admin/Playtube) steuern kannst: Wiedergabe, Lautstärke +(lauter/leiser/stumm), Playlist-Auswahl, Cover und Titel auf den Tasten. + +## Voraussetzungen + +- Stream Dock Software ab 3.10.188 (Windows), Gerät z. B. Ajazz AKP153E. +- **Playtube ab 4.5.1** (oder Playtube Edge), denn erst ab dieser Version gibt es die lokale + Fernsteuerung. Das Plugin verbindet sich über eine Named Pipe + (`\\.\pipe\Playtube.Remote.`, nur dein Windows-Benutzer) – kein Netzwerk, kein Konto. +- Ohne laufendes Playtube zeigen die Tasten „Playtube offline". + +## Installieren + +```powershell +powershell -ExecutionPolicy Bypass -File install.ps1 +``` + +Danach Stream Dock komplett beenden (Tray-Symbol → Beenden) und neu starten. Die Aktionen +findest du in der Kategorie **Playtube**. Das Skript installiert auch das Icon-Pack. + +## Aktionen + +| Aktion | Was sie tut | +|---|---| +| Wiedergabe/Pause | Umschalten, Symbol zeigt den Zustand | +| Vorheriger / Nächster Titel | Titel springen | +| Zurück-/Vorspulen | ± Sekunden (einstellbar) | +| Lauter / Leiser | Schrittweite einstellbar, gedrückt halten wiederholt | +| Lautstärke setzen | Feste Lautstärke | +| Stumm | Ton aus/ein, zeigt die Lautstärke | +| Aktueller Titel | Cover und Titel; auf dem Info-Display eine große Karte mit Interpret und Fortschritt | +| Gefällt mir, Zufall, Wiederholen | Umschalten, Symbol zeigt den Zustand | +| Playlist abspielen | Playlist aus YouTube Music wählen (Liste wird von Playtube geladen) | +| Tab wechseln / Playtube anzeigen | YouTube ↔ YouTube Music, Fenster nach vorn | + +Pro Taste einstellbar: Ziel-Tab (automatisch = aktiver Tab, YouTube oder YouTube Music), je +nach Aktion Schrittweite, Sekunden, Lautstärke, Playlist, Titelanzeige. Alle Aktionen sind auch +auf den Info-Feldern rechts am Gerät nutzbar. + +## Icon-Pack + +`iconpack/com.fojadrachi.playtube.sdIconPack` enthält 75 Symbole im Playtube-Look (Verlauf +violett → pink): Ordner, Pfeile, Einstellungen, Player-Symbole und vereinfachte App-Symbole +(Chrome, Discord, Steam, …; eigene Zeichnungen, keine Original-Logos). Zwei Varianten: +`gradient_*` und `dark_*`. In der Stream-Dock-Software über das Bild einer Taste auswählbar. + +## Entwicklung + +```bash +npm install +npm test # 40 Tests (Node >= 20) +npm run build # bündelt src/ nach com.fojadrachi.playtube.sdPlugin/plugin/index.js +npm run assets # erzeugt manifest.json, Übersetzungen und Tasten-Icons +npm run iconpack # erzeugt das Icon-Pack (+ Zip in dist/) +npm run package # Zip des Plugins in dist/ +``` + +Aufbau: `src/playtubeClient.js` (Pipe-Protokoll), `src/actions.js` (Aktionen, reine +Funktionen), `src/controller.js` (Tasten ↔ Playtube), `src/infoPanel.js` (Karte fürs +Info-Display), `src/host.js` (Stream-Dock-WebSocket), `tools/` (Icon-Generator). +Das gebündelte `plugin/index.js` liegt im Repo, damit `install.ps1` ohne Build funktioniert. diff --git a/build.mjs b/build.mjs new file mode 100644 index 0000000..0a963e7 --- /dev/null +++ b/build.mjs @@ -0,0 +1,36 @@ +// Buendelt das Plugin (inkl. "ws") zu com.fojadrachi.playtube.sdPlugin/plugin/index.js. +// Mit --zip zusaetzlich dist/Playtube-StreamDock-.zip erzeugen. +import { execFileSync } from 'node:child_process'; +import { mkdirSync, readFileSync, rmSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { build } from 'esbuild'; + +const ROOT = path.dirname(fileURLToPath(import.meta.url)); +const PLUGIN_NAME = 'com.fojadrachi.playtube.sdPlugin'; +const OUTFILE = path.join(ROOT, PLUGIN_NAME, 'plugin', 'index.js'); +const { version } = JSON.parse(readFileSync(path.join(ROOT, 'package.json'), 'utf8')); + +await build({ + entryPoints: [path.join(ROOT, 'src', 'main.js')], + outfile: OUTFILE, + bundle: true, + platform: 'node', + target: 'node20', + format: 'cjs', + // Optionale native Beschleuniger von "ws" - nicht noetig, ws faellt auf reines JS zurueck. + external: ['bufferutil', 'utf-8-validate'], + legalComments: 'none', + logLevel: 'info', +}); + +if (process.argv.includes('--zip')) { + const dist = path.join(ROOT, 'dist'); + const zip = path.join(dist, `Playtube-StreamDock-${version}.zip`); + mkdirSync(dist, { recursive: true }); + rmSync(zip, { force: true }); + // tar.exe (bsdtar, in Windows 10+ enthalten) kann Zip-Archive schreiben. + const tar = process.platform === 'win32' ? path.join(process.env.SystemRoot || 'C:\\Windows', 'System32', 'tar.exe') : 'tar'; + execFileSync(tar, ['-a', '-c', '-f', zip, '-C', ROOT, PLUGIN_NAME], { stdio: 'inherit' }); + process.stdout.write(`Paket: ${zip}\n`); +} diff --git a/com.fojadrachi.playtube.sdPlugin/de.json b/com.fojadrachi.playtube.sdPlugin/de.json new file mode 100644 index 0000000..2723b4d --- /dev/null +++ b/com.fojadrachi.playtube.sdPlugin/de.json @@ -0,0 +1,69 @@ +{ + "Name": "Playtube", + "Description": "Playtube (YouTube / YouTube Musik) steuern", + "Category": "Playtube", + "com.fojadrachi.playtube.playpause": { + "Name": "Wiedergabe/Pause", + "Tooltip": "Wiedergabe starten oder pausieren" + }, + "com.fojadrachi.playtube.previous": { + "Name": "Vorheriger Titel", + "Tooltip": "Zum vorherigen Titel springen" + }, + "com.fojadrachi.playtube.next": { + "Name": "Nächster Titel", + "Tooltip": "Zum nächsten Titel springen" + }, + "com.fojadrachi.playtube.seekback": { + "Name": "Zurückspulen", + "Tooltip": "Ein paar Sekunden zurückspringen" + }, + "com.fojadrachi.playtube.seekforward": { + "Name": "Vorspulen", + "Tooltip": "Ein paar Sekunden vorspringen" + }, + "com.fojadrachi.playtube.volumeup": { + "Name": "Lauter", + "Tooltip": "Lauter (gedrückt halten für Dauer-Anpassung)" + }, + "com.fojadrachi.playtube.volumedown": { + "Name": "Leiser", + "Tooltip": "Leiser (gedrückt halten für Dauer-Anpassung)" + }, + "com.fojadrachi.playtube.volumeset": { + "Name": "Lautstärke setzen", + "Tooltip": "Auf eine feste Lautstärke springen" + }, + "com.fojadrachi.playtube.mute": { + "Name": "Stummschalten", + "Tooltip": "Ton aus- oder einschalten" + }, + "com.fojadrachi.playtube.nowplaying": { + "Name": "Aktueller Titel", + "Tooltip": "Cover und Titel, Drücken = Wiedergabe/Pause" + }, + "com.fojadrachi.playtube.like": { + "Name": "Gefällt mir", + "Tooltip": "Aktuellen Titel mit „Gefällt mir“ markieren" + }, + "com.fojadrachi.playtube.shuffle": { + "Name": "Zufallswiedergabe", + "Tooltip": "Zufallswiedergabe umschalten" + }, + "com.fojadrachi.playtube.repeat": { + "Name": "Wiederholen", + "Tooltip": "Wiederholungsmodus wechseln" + }, + "com.fojadrachi.playtube.playlist": { + "Name": "Playlist abspielen", + "Tooltip": "Eine Playlist aus YouTube Music starten" + }, + "com.fojadrachi.playtube.switchtab": { + "Name": "Tab wechseln", + "Tooltip": "Zwischen YouTube und YouTube Musik wechseln" + }, + "com.fojadrachi.playtube.show": { + "Name": "Playtube anzeigen", + "Tooltip": "Das Playtube-Fenster in den Vordergrund holen" + } +} diff --git a/com.fojadrachi.playtube.sdPlugin/en.json b/com.fojadrachi.playtube.sdPlugin/en.json new file mode 100644 index 0000000..1c485e2 --- /dev/null +++ b/com.fojadrachi.playtube.sdPlugin/en.json @@ -0,0 +1,69 @@ +{ + "Name": "Playtube", + "Description": "Control Playtube (YouTube / YouTube Music)", + "Category": "Playtube", + "com.fojadrachi.playtube.playpause": { + "Name": "Play/Pause", + "Tooltip": "Toggle playback" + }, + "com.fojadrachi.playtube.previous": { + "Name": "Previous track", + "Tooltip": "Go to the previous track" + }, + "com.fojadrachi.playtube.next": { + "Name": "Next track", + "Tooltip": "Skip to the next track" + }, + "com.fojadrachi.playtube.seekback": { + "Name": "Rewind", + "Tooltip": "Jump back a few seconds" + }, + "com.fojadrachi.playtube.seekforward": { + "Name": "Fast forward", + "Tooltip": "Jump forward a few seconds" + }, + "com.fojadrachi.playtube.volumeup": { + "Name": "Volume up", + "Tooltip": "Louder (hold to keep going)" + }, + "com.fojadrachi.playtube.volumedown": { + "Name": "Volume down", + "Tooltip": "Quieter (hold to keep going)" + }, + "com.fojadrachi.playtube.volumeset": { + "Name": "Set volume", + "Tooltip": "Jump to a fixed volume" + }, + "com.fojadrachi.playtube.mute": { + "Name": "Mute", + "Tooltip": "Mute or unmute" + }, + "com.fojadrachi.playtube.nowplaying": { + "Name": "Now playing", + "Tooltip": "Cover and title, press to play/pause" + }, + "com.fojadrachi.playtube.like": { + "Name": "Like", + "Tooltip": "Like the current track" + }, + "com.fojadrachi.playtube.shuffle": { + "Name": "Shuffle", + "Tooltip": "Toggle shuffle" + }, + "com.fojadrachi.playtube.repeat": { + "Name": "Repeat", + "Tooltip": "Cycle repeat mode" + }, + "com.fojadrachi.playtube.playlist": { + "Name": "Play playlist", + "Tooltip": "Start a playlist from YouTube Music" + }, + "com.fojadrachi.playtube.switchtab": { + "Name": "Switch tab", + "Tooltip": "Switch between YouTube and YouTube Music" + }, + "com.fojadrachi.playtube.show": { + "Name": "Show Playtube", + "Tooltip": "Bring the Playtube window to the front" + } +} diff --git a/com.fojadrachi.playtube.sdPlugin/manifest.json b/com.fojadrachi.playtube.sdPlugin/manifest.json new file mode 100644 index 0000000..b5125f9 --- /dev/null +++ b/com.fojadrachi.playtube.sdPlugin/manifest.json @@ -0,0 +1,444 @@ +{ + "Actions": [ + { + "Icon": "static/icon/playpause@2x.png", + "Name": "Play/Pause", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/playpause_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + }, + { + "Image": "static/btn/playpause_1.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Toggle playback", + "UUID": "com.fojadrachi.playtube.playpause", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/previous@2x.png", + "Name": "Previous track", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/previous_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Go to the previous track", + "UUID": "com.fojadrachi.playtube.previous", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/next@2x.png", + "Name": "Next track", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/next_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Skip to the next track", + "UUID": "com.fojadrachi.playtube.next", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/seekback@2x.png", + "Name": "Rewind", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/seekback_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Jump back a few seconds", + "UUID": "com.fojadrachi.playtube.seekback", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/seekforward@2x.png", + "Name": "Fast forward", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/seekforward_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Jump forward a few seconds", + "UUID": "com.fojadrachi.playtube.seekforward", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/volumeup@2x.png", + "Name": "Volume up", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/volumeup_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Louder (hold to keep going)", + "UUID": "com.fojadrachi.playtube.volumeup", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/volumedown@2x.png", + "Name": "Volume down", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/volumedown_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Quieter (hold to keep going)", + "UUID": "com.fojadrachi.playtube.volumedown", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/volumeset@2x.png", + "Name": "Set volume", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/volumeset_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Jump to a fixed volume", + "UUID": "com.fojadrachi.playtube.volumeset", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/mute@2x.png", + "Name": "Mute", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/mute_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + }, + { + "Image": "static/btn/mute_1.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Mute or unmute", + "UUID": "com.fojadrachi.playtube.mute", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/nowplaying@2x.png", + "Name": "Now playing", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/nowplaying_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Cover and title, press to play/pause", + "UUID": "com.fojadrachi.playtube.nowplaying", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/like@2x.png", + "Name": "Like", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/like_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + }, + { + "Image": "static/btn/like_1.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Like the current track", + "UUID": "com.fojadrachi.playtube.like", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/shuffle@2x.png", + "Name": "Shuffle", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/shuffle_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Toggle shuffle", + "UUID": "com.fojadrachi.playtube.shuffle", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/repeat@2x.png", + "Name": "Repeat", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/repeat_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + }, + { + "Image": "static/btn/repeat_1.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + }, + { + "Image": "static/btn/repeat_2.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Cycle repeat mode", + "UUID": "com.fojadrachi.playtube.repeat", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/playlist@2x.png", + "Name": "Play playlist", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/playlist_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Start a playlist from YouTube Music", + "UUID": "com.fojadrachi.playtube.playlist", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/switchtab@2x.png", + "Name": "Switch tab", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/switchtab_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Switch between YouTube and YouTube Music", + "UUID": "com.fojadrachi.playtube.switchtab", + "PropertyInspectorPath": "propertyInspector/index.html" + }, + { + "Icon": "static/icon/show@2x.png", + "Name": "Show Playtube", + "DisableAutomaticStates": true, + "States": [ + { + "Image": "static/btn/show_0.png", + "TitleAlignment": "bottom", + "FontSize": "11", + "FontStyle": "Bold", + "TitleColor": "#ffffff" + } + ], + "Settings": {}, + "Controllers": [ + "Keypad", + "Information" + ], + "UserTitleEnabled": false, + "SupportedInMultiActions": true, + "Tooltip": "Bring the Playtube window to the front", + "UUID": "com.fojadrachi.playtube.show", + "PropertyInspectorPath": "propertyInspector/index.html" + } + ], + "SDKVersion": 1, + "Author": "Playtube", + "Name": "Playtube", + "Icon": "static/icon/icon@2x.png", + "CodePathWin": "plugin/index.js", + "Description": "Control Playtube (YouTube / YouTube Music) from your Stream Dock", + "Category": "Playtube", + "CategoryIcon": "static/icon/icon@2x.png", + "Version": "1.0.0", + "OS": [ + { + "Platform": "windows", + "MinimumVersion": "10" + } + ], + "Software": { + "MinimumVersion": "3.10.188.226" + }, + "Nodejs": { + "Version": "20" + } +} diff --git a/com.fojadrachi.playtube.sdPlugin/plugin/index.js b/com.fojadrachi.playtube.sdPlugin/plugin/index.js new file mode 100644 index 0000000..49fa2fe --- /dev/null +++ b/com.fojadrachi.playtube.sdPlugin/plugin/index.js @@ -0,0 +1,4629 @@ +"use strict"; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; + +// node_modules/ws/lib/constants.js +var require_constants = __commonJS({ + "node_modules/ws/lib/constants.js"(exports2, module2) { + "use strict"; + var BINARY_TYPES = ["nodebuffer", "arraybuffer", "fragments"]; + var hasBlob = typeof Blob !== "undefined"; + if (hasBlob) BINARY_TYPES.push("blob"); + module2.exports = { + BINARY_TYPES, + CLOSE_TIMEOUT: 3e4, + EMPTY_BUFFER: Buffer.alloc(0), + GUID: "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", + hasBlob, + kForOnEventAttribute: Symbol("kIsForOnEventAttribute"), + kListener: Symbol("kListener"), + kStatusCode: Symbol("status-code"), + kWebSocket: Symbol("websocket"), + NOOP: () => { + } + }; + } +}); + +// node_modules/ws/lib/buffer-util.js +var require_buffer_util = __commonJS({ + "node_modules/ws/lib/buffer-util.js"(exports2, module2) { + "use strict"; + var { EMPTY_BUFFER } = require_constants(); + var FastBuffer = Buffer[Symbol.species]; + function concat(list, totalLength) { + if (list.length === 0) return EMPTY_BUFFER; + if (list.length === 1) return list[0]; + const target = Buffer.allocUnsafe(totalLength); + let offset = 0; + for (let i = 0; i < list.length; i++) { + const buf = list[i]; + target.set(buf, offset); + offset += buf.length; + } + if (offset < totalLength) { + return new FastBuffer(target.buffer, target.byteOffset, offset); + } + return target; + } + function _mask(source, mask, output, offset, length) { + for (let i = 0; i < length; i++) { + output[offset + i] = source[i] ^ mask[i & 3]; + } + } + function _unmask(buffer, mask) { + for (let i = 0; i < buffer.length; i++) { + buffer[i] ^= mask[i & 3]; + } + } + function toArrayBuffer(buf) { + if (buf.length === buf.buffer.byteLength) { + return buf.buffer; + } + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length); + } + function toBuffer(data) { + toBuffer.readOnly = true; + if (Buffer.isBuffer(data)) return data; + let buf; + if (data instanceof ArrayBuffer) { + buf = new FastBuffer(data); + } else if (ArrayBuffer.isView(data)) { + buf = new FastBuffer(data.buffer, data.byteOffset, data.byteLength); + } else { + buf = Buffer.from(data); + toBuffer.readOnly = false; + } + return buf; + } + module2.exports = { + concat, + mask: _mask, + toArrayBuffer, + toBuffer, + unmask: _unmask + }; + if (!process.env.WS_NO_BUFFER_UTIL) { + try { + const bufferUtil = require("bufferutil"); + module2.exports.mask = function(source, mask, output, offset, length) { + if (length < 48) _mask(source, mask, output, offset, length); + else bufferUtil.mask(source, mask, output, offset, length); + }; + module2.exports.unmask = function(buffer, mask) { + if (buffer.length < 32) _unmask(buffer, mask); + else bufferUtil.unmask(buffer, mask); + }; + } catch (e) { + } + } + } +}); + +// node_modules/ws/lib/limiter.js +var require_limiter = __commonJS({ + "node_modules/ws/lib/limiter.js"(exports2, module2) { + "use strict"; + var kDone = Symbol("kDone"); + var kRun = Symbol("kRun"); + var Limiter = class { + /** + * Creates a new `Limiter`. + * + * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed + * to run concurrently + */ + constructor(concurrency) { + this[kDone] = () => { + this.pending--; + this[kRun](); + }; + this.concurrency = concurrency || Infinity; + this.jobs = []; + this.pending = 0; + } + /** + * Adds a job to the queue. + * + * @param {Function} job The job to run + * @public + */ + add(job) { + this.jobs.push(job); + this[kRun](); + } + /** + * Removes a job from the queue and runs it if possible. + * + * @private + */ + [kRun]() { + if (this.pending === this.concurrency) return; + if (this.jobs.length) { + const job = this.jobs.shift(); + this.pending++; + job(this[kDone]); + } + } + }; + module2.exports = Limiter; + } +}); + +// node_modules/ws/lib/permessage-deflate.js +var require_permessage_deflate = __commonJS({ + "node_modules/ws/lib/permessage-deflate.js"(exports2, module2) { + "use strict"; + var zlib = require("zlib"); + var bufferUtil = require_buffer_util(); + var Limiter = require_limiter(); + var { kStatusCode } = require_constants(); + var FastBuffer = Buffer[Symbol.species]; + var TRAILER = Buffer.from([0, 0, 255, 255]); + var kPerMessageDeflate = Symbol("permessage-deflate"); + var kTotalLength = Symbol("total-length"); + var kCallback = Symbol("callback"); + var kBuffers = Symbol("buffers"); + var kError = Symbol("error"); + var zlibLimiter; + var PerMessageDeflate = class { + /** + * Creates a PerMessageDeflate instance. + * + * @param {Object} [options] Configuration options + * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support + * for, or request, a custom client window size + * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/ + * acknowledge disabling of client context takeover + * @param {Number} [options.concurrencyLimit=10] The number of concurrent + * calls to zlib + * @param {Boolean} [options.isServer=false] Create the instance in either + * server or client mode + * @param {Number} [options.maxPayload=0] The maximum allowed message length + * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the + * use of a custom server window size + * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept + * disabling of server context takeover + * @param {Number} [options.threshold=1024] Size (in bytes) below which + * messages should not be compressed if context takeover is disabled + * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on + * deflate + * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on + * inflate + */ + constructor(options) { + this._options = options || {}; + this._threshold = this._options.threshold !== void 0 ? this._options.threshold : 1024; + this._maxPayload = this._options.maxPayload | 0; + this._isServer = !!this._options.isServer; + this._deflate = null; + this._inflate = null; + this.params = null; + if (!zlibLimiter) { + const concurrency = this._options.concurrencyLimit !== void 0 ? this._options.concurrencyLimit : 10; + zlibLimiter = new Limiter(concurrency); + } + } + /** + * @type {String} + */ + static get extensionName() { + return "permessage-deflate"; + } + /** + * Create an extension negotiation offer. + * + * @return {Object} Extension parameters + * @public + */ + offer() { + const params = {}; + if (this._options.serverNoContextTakeover) { + params.server_no_context_takeover = true; + } + if (this._options.clientNoContextTakeover) { + params.client_no_context_takeover = true; + } + if (this._options.serverMaxWindowBits) { + params.server_max_window_bits = this._options.serverMaxWindowBits; + } + if (this._options.clientMaxWindowBits) { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } else if (this._options.clientMaxWindowBits == null) { + params.client_max_window_bits = true; + } + return params; + } + /** + * Accept an extension negotiation offer/response. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Object} Accepted configuration + * @public + */ + accept(configurations) { + configurations = this.normalizeParams(configurations); + this.params = this._isServer ? this.acceptAsServer(configurations) : this.acceptAsClient(configurations); + return this.params; + } + /** + * Releases all resources used by the extension. + * + * @public + */ + cleanup() { + if (this._inflate) { + this._inflate.close(); + this._inflate = null; + } + if (this._deflate) { + const callback = this._deflate[kCallback]; + this._deflate.close(); + this._deflate = null; + if (callback) { + callback( + new Error( + "The deflate stream was closed while data was being processed" + ) + ); + } + } + } + /** + * Accept an extension negotiation offer. + * + * @param {Array} offers The extension negotiation offers + * @return {Object} Accepted configuration + * @private + */ + acceptAsServer(offers) { + const opts = this._options; + const accepted = offers.find((params) => { + if (opts.serverNoContextTakeover === false && params.server_no_context_takeover || params.server_max_window_bits && (opts.serverMaxWindowBits === false || typeof opts.serverMaxWindowBits === "number" && opts.serverMaxWindowBits > params.server_max_window_bits) || typeof opts.clientMaxWindowBits === "number" && (typeof params.client_max_window_bits === "number" ? opts.clientMaxWindowBits > params.client_max_window_bits : !params.client_max_window_bits)) { + return false; + } + return true; + }); + if (!accepted) { + throw new Error("None of the extension offers can be accepted"); + } + if (opts.serverNoContextTakeover) { + accepted.server_no_context_takeover = true; + } + if (opts.clientNoContextTakeover) { + accepted.client_no_context_takeover = true; + } + if (typeof opts.serverMaxWindowBits === "number") { + accepted.server_max_window_bits = opts.serverMaxWindowBits; + } + if (typeof opts.clientMaxWindowBits === "number") { + accepted.client_max_window_bits = opts.clientMaxWindowBits; + } else if (accepted.client_max_window_bits === true || opts.clientMaxWindowBits === false) { + delete accepted.client_max_window_bits; + } + return accepted; + } + /** + * Accept the extension negotiation response. + * + * @param {Array} response The extension negotiation response + * @return {Object} Accepted configuration + * @private + */ + acceptAsClient(response) { + const params = response[0]; + if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) { + throw new Error('Unexpected parameter "client_no_context_takeover"'); + } + if (!params.client_max_window_bits) { + if (typeof this._options.clientMaxWindowBits === "number") { + params.client_max_window_bits = this._options.clientMaxWindowBits; + } + } else if (this._options.clientMaxWindowBits === false || typeof this._options.clientMaxWindowBits === "number" && params.client_max_window_bits > this._options.clientMaxWindowBits) { + throw new Error( + 'Unexpected or invalid parameter "client_max_window_bits"' + ); + } + return params; + } + /** + * Normalize parameters. + * + * @param {Array} configurations The extension negotiation offers/reponse + * @return {Array} The offers/response with normalized parameters + * @private + */ + normalizeParams(configurations) { + configurations.forEach((params) => { + Object.keys(params).forEach((key) => { + let value = params[key]; + if (value.length > 1) { + throw new Error(`Parameter "${key}" must have only a single value`); + } + value = value[0]; + if (key === "client_max_window_bits") { + if (value !== true) { + const num = +value; + if (!Number.isInteger(num) || num < 8 || num > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + value = num; + } else if (!this._isServer) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + } else if (key === "server_max_window_bits") { + const num = +value; + if (!Number.isInteger(num) || num < 8 || num > 15) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + value = num; + } else if (key === "client_no_context_takeover" || key === "server_no_context_takeover") { + if (value !== true) { + throw new TypeError( + `Invalid value for parameter "${key}": ${value}` + ); + } + } else { + throw new Error(`Unknown parameter "${key}"`); + } + params[key] = value; + }); + }); + return configurations; + } + /** + * Decompress data. Concurrency limited. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public + */ + decompress(data, fin, callback) { + zlibLimiter.add((done) => { + this._decompress(data, fin, (err, result) => { + done(); + callback(err, result); + }); + }); + } + /** + * Compress data. Concurrency limited. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @public + */ + compress(data, fin, callback) { + zlibLimiter.add((done) => { + this._compress(data, fin, (err, result) => { + done(); + callback(err, result); + }); + }); + } + /** + * Decompress data. + * + * @param {Buffer} data Compressed data + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _decompress(data, fin, callback) { + const endpoint = this._isServer ? "client" : "server"; + if (!this._inflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; + this._inflate = zlib.createInflateRaw({ + ...this._options.zlibInflateOptions, + windowBits + }); + this._inflate[kPerMessageDeflate] = this; + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + this._inflate.on("error", inflateOnError); + this._inflate.on("data", inflateOnData); + } + this._inflate[kCallback] = callback; + this._inflate.write(data); + if (fin) this._inflate.write(TRAILER); + this._inflate.flush(() => { + const err = this._inflate[kError]; + if (err) { + this._inflate.close(); + this._inflate = null; + callback(err); + return; + } + const data2 = bufferUtil.concat( + this._inflate[kBuffers], + this._inflate[kTotalLength] + ); + if (this._inflate._readableState.endEmitted) { + this._inflate.close(); + this._inflate = null; + } else { + this._inflate[kTotalLength] = 0; + this._inflate[kBuffers] = []; + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._inflate.reset(); + } + } + callback(null, data2); + }); + } + /** + * Compress data. + * + * @param {(Buffer|String)} data Data to compress + * @param {Boolean} fin Specifies whether or not this is the last fragment + * @param {Function} callback Callback + * @private + */ + _compress(data, fin, callback) { + const endpoint = this._isServer ? "server" : "client"; + if (!this._deflate) { + const key = `${endpoint}_max_window_bits`; + const windowBits = typeof this.params[key] !== "number" ? zlib.Z_DEFAULT_WINDOWBITS : this.params[key]; + this._deflate = zlib.createDeflateRaw({ + ...this._options.zlibDeflateOptions, + windowBits + }); + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + this._deflate.on("data", deflateOnData); + } + this._deflate[kCallback] = callback; + this._deflate.write(data); + this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { + if (!this._deflate) { + return; + } + let data2 = bufferUtil.concat( + this._deflate[kBuffers], + this._deflate[kTotalLength] + ); + if (fin) { + data2 = new FastBuffer(data2.buffer, data2.byteOffset, data2.length - 4); + } + this._deflate[kCallback] = null; + this._deflate[kTotalLength] = 0; + this._deflate[kBuffers] = []; + if (fin && this.params[`${endpoint}_no_context_takeover`]) { + this._deflate.reset(); + } + callback(null, data2); + }); + } + }; + module2.exports = PerMessageDeflate; + function deflateOnData(chunk) { + this[kBuffers].push(chunk); + this[kTotalLength] += chunk.length; + } + function inflateOnData(chunk) { + this[kTotalLength] += chunk.length; + if (this[kPerMessageDeflate]._maxPayload < 1 || this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload) { + this[kBuffers].push(chunk); + return; + } + this[kError] = new RangeError("Max payload size exceeded"); + this[kError].code = "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"; + this[kError][kStatusCode] = 1009; + this.removeListener("data", inflateOnData); + this.reset(); + } + function inflateOnError(err) { + this[kPerMessageDeflate]._inflate = null; + if (this[kError]) { + this[kCallback](this[kError]); + return; + } + err[kStatusCode] = 1007; + this[kCallback](err); + } + } +}); + +// node_modules/ws/lib/validation.js +var require_validation = __commonJS({ + "node_modules/ws/lib/validation.js"(exports2, module2) { + "use strict"; + var { isUtf8 } = require("buffer"); + var { hasBlob } = require_constants(); + var tokenChars = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 0 - 15 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + // 16 - 31 + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + // 32 - 47 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + // 48 - 63 + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + // 64 - 79 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + // 80 - 95 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + // 96 - 111 + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0 + // 112 - 127 + ]; + function isValidStatusCode(code) { + return code >= 1e3 && code <= 1014 && code !== 1004 && code !== 1005 && code !== 1006 || code >= 3e3 && code <= 4999; + } + function _isValidUTF8(buf) { + const len = buf.length; + let i = 0; + while (i < len) { + if ((buf[i] & 128) === 0) { + i++; + } else if ((buf[i] & 224) === 192) { + if (i + 1 === len || (buf[i + 1] & 192) !== 128 || (buf[i] & 254) === 192) { + return false; + } + i += 2; + } else if ((buf[i] & 240) === 224) { + if (i + 2 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || buf[i] === 224 && (buf[i + 1] & 224) === 128 || // Overlong + buf[i] === 237 && (buf[i + 1] & 224) === 160) { + return false; + } + i += 3; + } else if ((buf[i] & 248) === 240) { + if (i + 3 >= len || (buf[i + 1] & 192) !== 128 || (buf[i + 2] & 192) !== 128 || (buf[i + 3] & 192) !== 128 || buf[i] === 240 && (buf[i + 1] & 240) === 128 || // Overlong + buf[i] === 244 && buf[i + 1] > 143 || buf[i] > 244) { + return false; + } + i += 4; + } else { + return false; + } + } + return true; + } + function isBlob(value) { + return hasBlob && typeof value === "object" && typeof value.arrayBuffer === "function" && typeof value.type === "string" && typeof value.stream === "function" && (value[Symbol.toStringTag] === "Blob" || value[Symbol.toStringTag] === "File"); + } + module2.exports = { + isBlob, + isValidStatusCode, + isValidUTF8: _isValidUTF8, + tokenChars + }; + if (isUtf8) { + module2.exports.isValidUTF8 = function(buf) { + return buf.length < 24 ? _isValidUTF8(buf) : isUtf8(buf); + }; + } else if (!process.env.WS_NO_UTF_8_VALIDATE) { + try { + const isValidUTF8 = require("utf-8-validate"); + module2.exports.isValidUTF8 = function(buf) { + return buf.length < 32 ? _isValidUTF8(buf) : isValidUTF8(buf); + }; + } catch (e) { + } + } + } +}); + +// node_modules/ws/lib/receiver.js +var require_receiver = __commonJS({ + "node_modules/ws/lib/receiver.js"(exports2, module2) { + "use strict"; + var { Writable } = require("stream"); + var PerMessageDeflate = require_permessage_deflate(); + var { + BINARY_TYPES, + EMPTY_BUFFER, + kStatusCode, + kWebSocket + } = require_constants(); + var { concat, toArrayBuffer, unmask } = require_buffer_util(); + var { isValidStatusCode, isValidUTF8 } = require_validation(); + var FastBuffer = Buffer[Symbol.species]; + var GET_INFO = 0; + var GET_PAYLOAD_LENGTH_16 = 1; + var GET_PAYLOAD_LENGTH_64 = 2; + var GET_MASK = 3; + var GET_DATA = 4; + var INFLATING = 5; + var DEFER_EVENT = 6; + var Receiver = class extends Writable { + /** + * Creates a Receiver instance. + * + * @param {Object} [options] Options object + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {String} [options.binaryType=nodebuffer] The type for binary data + * @param {Object} [options.extensions] An object containing the negotiated + * extensions + * @param {Boolean} [options.isServer=false] Specifies whether to operate in + * client or server mode + * @param {Number} [options.maxBufferedChunks=0] The maximum number of + * buffered data chunks + * @param {Number} [options.maxFragments=0] The maximum number of message + * fragments + * @param {Number} [options.maxPayload=0] The maximum allowed message length + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + */ + constructor(options = {}) { + super(); + this._allowSynchronousEvents = options.allowSynchronousEvents !== void 0 ? options.allowSynchronousEvents : true; + this._binaryType = options.binaryType || BINARY_TYPES[0]; + this._extensions = options.extensions || {}; + this._isServer = !!options.isServer; + this._maxBufferedChunks = options.maxBufferedChunks | 0; + this._maxFragments = options.maxFragments | 0; + this._maxPayload = options.maxPayload | 0; + this._skipUTF8Validation = !!options.skipUTF8Validation; + this[kWebSocket] = void 0; + this._bufferedBytes = 0; + this._buffers = []; + this._compressed = false; + this._payloadLength = 0; + this._mask = void 0; + this._fragmented = 0; + this._masked = false; + this._fin = false; + this._opcode = 0; + this._totalPayloadLength = 0; + this._messageLength = 0; + this._numFragments = 0; + this._fragments = []; + this._errored = false; + this._loop = false; + this._state = GET_INFO; + } + /** + * Implements `Writable.prototype._write()`. + * + * @param {Buffer} chunk The chunk of data to write + * @param {String} encoding The character encoding of `chunk` + * @param {Function} cb Callback + * @private + */ + _write(chunk, encoding, cb) { + if (this._opcode === 8 && this._state == GET_INFO) return cb(); + if (this._maxBufferedChunks > 0 && this._buffers.length >= this._maxBufferedChunks) { + cb( + this.createError( + RangeError, + "Too many buffered chunks", + false, + 1008, + "WS_ERR_TOO_MANY_BUFFERED_PARTS" + ) + ); + return; + } + this._bufferedBytes += chunk.length; + this._buffers.push(chunk); + this.startLoop(cb); + } + /** + * Consumes `n` bytes from the buffered data. + * + * @param {Number} n The number of bytes to consume + * @return {Buffer} The consumed bytes + * @private + */ + consume(n) { + this._bufferedBytes -= n; + if (n === this._buffers[0].length) return this._buffers.shift(); + if (n < this._buffers[0].length) { + const buf = this._buffers[0]; + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + return new FastBuffer(buf.buffer, buf.byteOffset, n); + } + const dst = Buffer.allocUnsafe(n); + do { + const buf = this._buffers[0]; + const offset = dst.length - n; + if (n >= buf.length) { + dst.set(this._buffers.shift(), offset); + } else { + dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset); + this._buffers[0] = new FastBuffer( + buf.buffer, + buf.byteOffset + n, + buf.length - n + ); + } + n -= buf.length; + } while (n > 0); + return dst; + } + /** + * Starts the parsing loop. + * + * @param {Function} cb Callback + * @private + */ + startLoop(cb) { + this._loop = true; + do { + switch (this._state) { + case GET_INFO: + this.getInfo(cb); + break; + case GET_PAYLOAD_LENGTH_16: + this.getPayloadLength16(cb); + break; + case GET_PAYLOAD_LENGTH_64: + this.getPayloadLength64(cb); + break; + case GET_MASK: + this.getMask(); + break; + case GET_DATA: + this.getData(cb); + break; + case INFLATING: + case DEFER_EVENT: + this._loop = false; + return; + } + } while (this._loop); + if (!this._errored) cb(); + } + /** + * Reads the first two bytes of a frame. + * + * @param {Function} cb Callback + * @private + */ + getInfo(cb) { + if (this._bufferedBytes < 2) { + this._loop = false; + return; + } + const buf = this.consume(2); + if ((buf[0] & 48) !== 0) { + const error = this.createError( + RangeError, + "RSV2 and RSV3 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_2_3" + ); + cb(error); + return; + } + const compressed = (buf[0] & 64) === 64; + if (compressed && !this._extensions[PerMessageDeflate.extensionName]) { + const error = this.createError( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" + ); + cb(error); + return; + } + this._fin = (buf[0] & 128) === 128; + this._opcode = buf[0] & 15; + this._payloadLength = buf[1] & 127; + if (this._opcode === 0) { + if (compressed) { + const error = this.createError( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" + ); + cb(error); + return; + } + if (!this._fragmented) { + const error = this.createError( + RangeError, + "invalid opcode 0", + true, + 1002, + "WS_ERR_INVALID_OPCODE" + ); + cb(error); + return; + } + this._opcode = this._fragmented; + } else if (this._opcode === 1 || this._opcode === 2) { + if (this._fragmented) { + const error = this.createError( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + "WS_ERR_INVALID_OPCODE" + ); + cb(error); + return; + } + this._compressed = compressed; + } else if (this._opcode > 7 && this._opcode < 11) { + if (!this._fin) { + const error = this.createError( + RangeError, + "FIN must be set", + true, + 1002, + "WS_ERR_EXPECTED_FIN" + ); + cb(error); + return; + } + if (compressed) { + const error = this.createError( + RangeError, + "RSV1 must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_RSV_1" + ); + cb(error); + return; + } + if (this._payloadLength > 125 || this._opcode === 8 && this._payloadLength === 1) { + const error = this.createError( + RangeError, + `invalid payload length ${this._payloadLength}`, + true, + 1002, + "WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH" + ); + cb(error); + return; + } + } else { + const error = this.createError( + RangeError, + `invalid opcode ${this._opcode}`, + true, + 1002, + "WS_ERR_INVALID_OPCODE" + ); + cb(error); + return; + } + if (!this._fin && !this._fragmented) this._fragmented = this._opcode; + this._masked = (buf[1] & 128) === 128; + if (this._isServer) { + if (!this._masked) { + const error = this.createError( + RangeError, + "MASK must be set", + true, + 1002, + "WS_ERR_EXPECTED_MASK" + ); + cb(error); + return; + } + } else if (this._masked) { + const error = this.createError( + RangeError, + "MASK must be clear", + true, + 1002, + "WS_ERR_UNEXPECTED_MASK" + ); + cb(error); + return; + } + if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16; + else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64; + else this.haveLength(cb); + } + /** + * Gets extended payload length (7+16). + * + * @param {Function} cb Callback + * @private + */ + getPayloadLength16(cb) { + if (this._bufferedBytes < 2) { + this._loop = false; + return; + } + this._payloadLength = this.consume(2).readUInt16BE(0); + this.haveLength(cb); + } + /** + * Gets extended payload length (7+64). + * + * @param {Function} cb Callback + * @private + */ + getPayloadLength64(cb) { + if (this._bufferedBytes < 8) { + this._loop = false; + return; + } + const buf = this.consume(8); + const num = buf.readUInt32BE(0); + if (num > Math.pow(2, 53 - 32) - 1) { + const error = this.createError( + RangeError, + "Unsupported WebSocket frame: payload length > 2^53 - 1", + false, + 1009, + "WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH" + ); + cb(error); + return; + } + this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4); + this.haveLength(cb); + } + /** + * Payload length has been read. + * + * @param {Function} cb Callback + * @private + */ + haveLength(cb) { + if (this._payloadLength && this._opcode < 8) { + this._totalPayloadLength += this._payloadLength; + if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { + const error = this.createError( + RangeError, + "Max payload size exceeded", + false, + 1009, + "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH" + ); + cb(error); + return; + } + } + if (this._masked) this._state = GET_MASK; + else this._state = GET_DATA; + } + /** + * Reads mask bytes. + * + * @private + */ + getMask() { + if (this._bufferedBytes < 4) { + this._loop = false; + return; + } + this._mask = this.consume(4); + this._state = GET_DATA; + } + /** + * Reads data bytes. + * + * @param {Function} cb Callback + * @private + */ + getData(cb) { + let data = EMPTY_BUFFER; + if (this._payloadLength) { + if (this._bufferedBytes < this._payloadLength) { + this._loop = false; + return; + } + data = this.consume(this._payloadLength); + if (this._masked && (this._mask[0] | this._mask[1] | this._mask[2] | this._mask[3]) !== 0) { + unmask(data, this._mask); + } + } + if (this._opcode > 7) { + this.controlMessage(data, cb); + return; + } + if (this._maxFragments > 0 && ++this._numFragments > this._maxFragments) { + const error = this.createError( + RangeError, + "Too many message fragments", + false, + 1008, + "WS_ERR_TOO_MANY_BUFFERED_PARTS" + ); + cb(error); + return; + } + if (this._compressed) { + this._state = INFLATING; + this.decompress(data, cb); + return; + } + if (data.length) { + this._messageLength = this._totalPayloadLength; + this._fragments.push(data); + } + this.dataMessage(cb); + } + /** + * Decompresses data. + * + * @param {Buffer} data Compressed data + * @param {Function} cb Callback + * @private + */ + decompress(data, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; + perMessageDeflate.decompress(data, this._fin, (err, buf) => { + if (err) return cb(err); + if (buf.length) { + this._messageLength += buf.length; + if (this._messageLength > this._maxPayload && this._maxPayload > 0) { + const error = this.createError( + RangeError, + "Max payload size exceeded", + false, + 1009, + "WS_ERR_UNSUPPORTED_MESSAGE_LENGTH" + ); + cb(error); + return; + } + this._fragments.push(buf); + } + this.dataMessage(cb); + if (this._state === GET_INFO) this.startLoop(cb); + }); + } + /** + * Handles a data message. + * + * @param {Function} cb Callback + * @private + */ + dataMessage(cb) { + if (!this._fin) { + this._state = GET_INFO; + return; + } + const messageLength = this._messageLength; + const fragments = this._fragments; + this._totalPayloadLength = 0; + this._messageLength = 0; + this._fragmented = 0; + this._numFragments = 0; + this._fragments = []; + if (this._opcode === 2) { + let data; + if (this._binaryType === "nodebuffer") { + data = concat(fragments, messageLength); + } else if (this._binaryType === "arraybuffer") { + data = toArrayBuffer(concat(fragments, messageLength)); + } else if (this._binaryType === "blob") { + data = new Blob(fragments); + } else { + data = fragments; + } + if (this._allowSynchronousEvents) { + this.emit("message", data, true); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit("message", data, true); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } else { + const buf = concat(fragments, messageLength); + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + const error = this.createError( + Error, + "invalid UTF-8 sequence", + true, + 1007, + "WS_ERR_INVALID_UTF8" + ); + cb(error); + return; + } + if (this._state === INFLATING || this._allowSynchronousEvents) { + this.emit("message", buf, false); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit("message", buf, false); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } + } + /** + * Handles a control message. + * + * @param {Buffer} data Data to handle + * @return {(Error|RangeError|undefined)} A possible error + * @private + */ + controlMessage(data, cb) { + if (this._opcode === 8) { + if (data.length === 0) { + this._loop = false; + this.emit("conclude", 1005, EMPTY_BUFFER); + this.end(); + } else { + const code = data.readUInt16BE(0); + if (!isValidStatusCode(code)) { + const error = this.createError( + RangeError, + `invalid status code ${code}`, + true, + 1002, + "WS_ERR_INVALID_CLOSE_CODE" + ); + cb(error); + return; + } + const buf = new FastBuffer( + data.buffer, + data.byteOffset + 2, + data.length - 2 + ); + if (!this._skipUTF8Validation && !isValidUTF8(buf)) { + const error = this.createError( + Error, + "invalid UTF-8 sequence", + true, + 1007, + "WS_ERR_INVALID_UTF8" + ); + cb(error); + return; + } + this._loop = false; + this.emit("conclude", code, buf); + this.end(); + } + this._state = GET_INFO; + return; + } + if (this._allowSynchronousEvents) { + this.emit(this._opcode === 9 ? "ping" : "pong", data); + this._state = GET_INFO; + } else { + this._state = DEFER_EVENT; + setImmediate(() => { + this.emit(this._opcode === 9 ? "ping" : "pong", data); + this._state = GET_INFO; + this.startLoop(cb); + }); + } + } + /** + * Builds an error object. + * + * @param {function(new:Error|RangeError)} ErrorCtor The error constructor + * @param {String} message The error message + * @param {Boolean} prefix Specifies whether or not to add a default prefix to + * `message` + * @param {Number} statusCode The status code + * @param {String} errorCode The exposed error code + * @return {(Error|RangeError)} The error + * @private + */ + createError(ErrorCtor, message, prefix, statusCode, errorCode) { + this._loop = false; + this._errored = true; + const err = new ErrorCtor( + prefix ? `Invalid WebSocket frame: ${message}` : message + ); + Error.captureStackTrace(err, this.createError); + err.code = errorCode; + err[kStatusCode] = statusCode; + return err; + } + }; + module2.exports = Receiver; + } +}); + +// node_modules/ws/lib/sender.js +var require_sender = __commonJS({ + "node_modules/ws/lib/sender.js"(exports2, module2) { + "use strict"; + var { Duplex } = require("stream"); + var { randomFillSync } = require("crypto"); + var { + types: { isUint8Array } + } = require("util"); + var PerMessageDeflate = require_permessage_deflate(); + var { EMPTY_BUFFER, kWebSocket, NOOP } = require_constants(); + var { isBlob, isValidStatusCode } = require_validation(); + var { mask: applyMask, toBuffer } = require_buffer_util(); + var kByteLength = Symbol("kByteLength"); + var maskBuffer = Buffer.alloc(4); + var RANDOM_POOL_SIZE = 8 * 1024; + var randomPool; + var randomPoolPointer = RANDOM_POOL_SIZE; + var DEFAULT = 0; + var DEFLATING = 1; + var GET_BLOB_DATA = 2; + var Sender = class _Sender { + /** + * Creates a Sender instance. + * + * @param {Duplex} socket The connection socket + * @param {Object} [extensions] An object containing the negotiated extensions + * @param {Function} [generateMask] The function used to generate the masking + * key + */ + constructor(socket, extensions, generateMask) { + this._extensions = extensions || {}; + if (generateMask) { + this._generateMask = generateMask; + this._maskBuffer = Buffer.alloc(4); + } + this._socket = socket; + this._firstFragment = true; + this._compress = false; + this._bufferedBytes = 0; + this._queue = []; + this._state = DEFAULT; + this.onerror = NOOP; + this[kWebSocket] = void 0; + } + /** + * Frames a piece of data according to the HyBi WebSocket protocol. + * + * @param {(Buffer|String)} data The data to frame + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @return {(Buffer|String)[]} The framed data + * @public + */ + static frame(data, options) { + let mask; + let merge = false; + let offset = 2; + let skipMasking = false; + if (options.mask) { + mask = options.maskBuffer || maskBuffer; + if (options.generateMask) { + options.generateMask(mask); + } else { + if (randomPoolPointer === RANDOM_POOL_SIZE) { + if (randomPool === void 0) { + randomPool = Buffer.alloc(RANDOM_POOL_SIZE); + } + randomFillSync(randomPool, 0, RANDOM_POOL_SIZE); + randomPoolPointer = 0; + } + mask[0] = randomPool[randomPoolPointer++]; + mask[1] = randomPool[randomPoolPointer++]; + mask[2] = randomPool[randomPoolPointer++]; + mask[3] = randomPool[randomPoolPointer++]; + } + skipMasking = (mask[0] | mask[1] | mask[2] | mask[3]) === 0; + offset = 6; + } + let dataLength; + if (typeof data === "string") { + if ((!options.mask || skipMasking) && options[kByteLength] !== void 0) { + dataLength = options[kByteLength]; + } else { + data = Buffer.from(data); + dataLength = data.length; + } + } else { + dataLength = data.length; + merge = options.mask && options.readOnly && !skipMasking; + } + let payloadLength = dataLength; + if (dataLength >= 65536) { + offset += 8; + payloadLength = 127; + } else if (dataLength > 125) { + offset += 2; + payloadLength = 126; + } + const target = Buffer.allocUnsafe(merge ? dataLength + offset : offset); + target[0] = options.fin ? options.opcode | 128 : options.opcode; + if (options.rsv1) target[0] |= 64; + target[1] = payloadLength; + if (payloadLength === 126) { + target.writeUInt16BE(dataLength, 2); + } else if (payloadLength === 127) { + target[2] = target[3] = 0; + target.writeUIntBE(dataLength, 4, 6); + } + if (!options.mask) return [target, data]; + target[1] |= 128; + target[offset - 4] = mask[0]; + target[offset - 3] = mask[1]; + target[offset - 2] = mask[2]; + target[offset - 1] = mask[3]; + if (skipMasking) return [target, data]; + if (merge) { + applyMask(data, mask, target, offset, dataLength); + return [target]; + } + applyMask(data, mask, data, 0, dataLength); + return [target, data]; + } + /** + * Sends a close message to the other peer. + * + * @param {Number} [code] The status code component of the body + * @param {(String|Buffer)} [data] The message component of the body + * @param {Boolean} [mask=false] Specifies whether or not to mask the message + * @param {Function} [cb] Callback + * @public + */ + close(code, data, mask, cb) { + let buf; + if (code === void 0) { + buf = EMPTY_BUFFER; + } else if (typeof code !== "number" || !isValidStatusCode(code)) { + throw new TypeError("First argument must be a valid error code number"); + } else if (data === void 0 || !data.length) { + buf = Buffer.allocUnsafe(2); + buf.writeUInt16BE(code, 0); + } else { + const length = Buffer.byteLength(data); + if (length > 123) { + throw new RangeError("The message must not be greater than 123 bytes"); + } + buf = Buffer.allocUnsafe(2 + length); + buf.writeUInt16BE(code, 0); + if (typeof data === "string") { + buf.write(data, 2); + } else if (isUint8Array(data)) { + buf.set(data, 2); + } else { + throw new TypeError("Second argument must be a string or a Uint8Array"); + } + } + const options = { + [kByteLength]: buf.length, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 8, + readOnly: false, + rsv1: false + }; + if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, buf, false, options, cb]); + } else { + this.sendFrame(_Sender.frame(buf, options), cb); + } + } + /** + * Sends a ping message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public + */ + ping(data, mask, cb) { + let byteLength; + let readOnly; + if (typeof data === "string") { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; + } + if (byteLength > 125) { + throw new RangeError("The data size must not be greater than 125 bytes"); + } + const options = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 9, + readOnly, + rsv1: false + }; + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, false, options, cb]); + } else { + this.getBlobData(data, false, options, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, false, options, cb]); + } else { + this.sendFrame(_Sender.frame(data, options), cb); + } + } + /** + * Sends a pong message to the other peer. + * + * @param {*} data The message to send + * @param {Boolean} [mask=false] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback + * @public + */ + pong(data, mask, cb) { + let byteLength; + let readOnly; + if (typeof data === "string") { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; + } + if (byteLength > 125) { + throw new RangeError("The data size must not be greater than 125 bytes"); + } + const options = { + [kByteLength]: byteLength, + fin: true, + generateMask: this._generateMask, + mask, + maskBuffer: this._maskBuffer, + opcode: 10, + readOnly, + rsv1: false + }; + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, false, options, cb]); + } else { + this.getBlobData(data, false, options, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, false, options, cb]); + } else { + this.sendFrame(_Sender.frame(data, options), cb); + } + } + /** + * Sends a data message to the other peer. + * + * @param {*} data The message to send + * @param {Object} options Options object + * @param {Boolean} [options.binary=false] Specifies whether `data` is binary + * or text + * @param {Boolean} [options.compress=false] Specifies whether or not to + * compress `data` + * @param {Boolean} [options.fin=false] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Function} [cb] Callback + * @public + */ + send(data, options, cb) { + const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; + let opcode = options.binary ? 2 : 1; + let rsv1 = options.compress; + let byteLength; + let readOnly; + if (typeof data === "string") { + byteLength = Buffer.byteLength(data); + readOnly = false; + } else if (isBlob(data)) { + byteLength = data.size; + readOnly = false; + } else { + data = toBuffer(data); + byteLength = data.length; + readOnly = toBuffer.readOnly; + } + if (this._firstFragment) { + this._firstFragment = false; + if (rsv1 && perMessageDeflate && perMessageDeflate.params[perMessageDeflate._isServer ? "server_no_context_takeover" : "client_no_context_takeover"]) { + rsv1 = byteLength >= perMessageDeflate._threshold; + } + this._compress = rsv1; + } else { + rsv1 = false; + opcode = 0; + } + if (options.fin) this._firstFragment = true; + const opts = { + [kByteLength]: byteLength, + fin: options.fin, + generateMask: this._generateMask, + mask: options.mask, + maskBuffer: this._maskBuffer, + opcode, + readOnly, + rsv1 + }; + if (isBlob(data)) { + if (this._state !== DEFAULT) { + this.enqueue([this.getBlobData, data, this._compress, opts, cb]); + } else { + this.getBlobData(data, this._compress, opts, cb); + } + } else if (this._state !== DEFAULT) { + this.enqueue([this.dispatch, data, this._compress, opts, cb]); + } else { + this.dispatch(data, this._compress, opts, cb); + } + } + /** + * Gets the contents of a blob as binary data. + * + * @param {Blob} blob The blob + * @param {Boolean} [compress=false] Specifies whether or not to compress + * the data + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private + */ + getBlobData(blob, compress, options, cb) { + this._bufferedBytes += options[kByteLength]; + this._state = GET_BLOB_DATA; + blob.arrayBuffer().then((arrayBuffer) => { + if (this._socket.destroyed) { + const err = new Error( + "The socket was closed while the blob was being read" + ); + process.nextTick(callCallbacks, this, err, cb); + return; + } + this._bufferedBytes -= options[kByteLength]; + const data = toBuffer(arrayBuffer); + if (!compress) { + this._state = DEFAULT; + this.sendFrame(_Sender.frame(data, options), cb); + this.dequeue(); + } else { + this.dispatch(data, compress, options, cb); + } + }).catch((err) => { + process.nextTick(onError, this, err, cb); + }); + } + /** + * Dispatches a message. + * + * @param {(Buffer|String)} data The message to send + * @param {Boolean} [compress=false] Specifies whether or not to compress + * `data` + * @param {Object} options Options object + * @param {Boolean} [options.fin=false] Specifies whether or not to set the + * FIN bit + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Boolean} [options.mask=false] Specifies whether or not to mask + * `data` + * @param {Buffer} [options.maskBuffer] The buffer used to store the masking + * key + * @param {Number} options.opcode The opcode + * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be + * modified + * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the + * RSV1 bit + * @param {Function} [cb] Callback + * @private + */ + dispatch(data, compress, options, cb) { + if (!compress) { + this.sendFrame(_Sender.frame(data, options), cb); + return; + } + const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; + this._bufferedBytes += options[kByteLength]; + this._state = DEFLATING; + perMessageDeflate.compress(data, options.fin, (_, buf) => { + if (this._socket.destroyed) { + const err = new Error( + "The socket was closed while data was being compressed" + ); + callCallbacks(this, err, cb); + return; + } + this._bufferedBytes -= options[kByteLength]; + this._state = DEFAULT; + options.readOnly = false; + this.sendFrame(_Sender.frame(buf, options), cb); + this.dequeue(); + }); + } + /** + * Executes queued send operations. + * + * @private + */ + dequeue() { + while (this._state === DEFAULT && this._queue.length) { + const params = this._queue.shift(); + this._bufferedBytes -= params[3][kByteLength]; + Reflect.apply(params[0], this, params.slice(1)); + } + } + /** + * Enqueues a send operation. + * + * @param {Array} params Send operation parameters. + * @private + */ + enqueue(params) { + this._bufferedBytes += params[3][kByteLength]; + this._queue.push(params); + } + /** + * Sends a frame. + * + * @param {(Buffer | String)[]} list The frame to send + * @param {Function} [cb] Callback + * @private + */ + sendFrame(list, cb) { + if (list.length === 2) { + this._socket.cork(); + this._socket.write(list[0]); + this._socket.write(list[1], cb); + this._socket.uncork(); + } else { + this._socket.write(list[0], cb); + } + } + }; + module2.exports = Sender; + function callCallbacks(sender, err, cb) { + if (typeof cb === "function") cb(err); + for (let i = 0; i < sender._queue.length; i++) { + const params = sender._queue[i]; + const callback = params[params.length - 1]; + if (typeof callback === "function") callback(err); + } + } + function onError(sender, err, cb) { + callCallbacks(sender, err, cb); + sender.onerror(err); + } + } +}); + +// node_modules/ws/lib/event-target.js +var require_event_target = __commonJS({ + "node_modules/ws/lib/event-target.js"(exports2, module2) { + "use strict"; + var { kForOnEventAttribute, kListener } = require_constants(); + var kCode = Symbol("kCode"); + var kData = Symbol("kData"); + var kError = Symbol("kError"); + var kMessage = Symbol("kMessage"); + var kReason = Symbol("kReason"); + var kTarget = Symbol("kTarget"); + var kType = Symbol("kType"); + var kWasClean = Symbol("kWasClean"); + var Event = class { + /** + * Create a new `Event`. + * + * @param {String} type The name of the event + * @throws {TypeError} If the `type` argument is not specified + */ + constructor(type) { + this[kTarget] = null; + this[kType] = type; + } + /** + * @type {*} + */ + get target() { + return this[kTarget]; + } + /** + * @type {String} + */ + get type() { + return this[kType]; + } + }; + Object.defineProperty(Event.prototype, "target", { enumerable: true }); + Object.defineProperty(Event.prototype, "type", { enumerable: true }); + var CloseEvent = class extends Event { + /** + * Create a new `CloseEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {Number} [options.code=0] The status code explaining why the + * connection was closed + * @param {String} [options.reason=''] A human-readable string explaining why + * the connection was closed + * @param {Boolean} [options.wasClean=false] Indicates whether or not the + * connection was cleanly closed + */ + constructor(type, options = {}) { + super(type); + this[kCode] = options.code === void 0 ? 0 : options.code; + this[kReason] = options.reason === void 0 ? "" : options.reason; + this[kWasClean] = options.wasClean === void 0 ? false : options.wasClean; + } + /** + * @type {Number} + */ + get code() { + return this[kCode]; + } + /** + * @type {String} + */ + get reason() { + return this[kReason]; + } + /** + * @type {Boolean} + */ + get wasClean() { + return this[kWasClean]; + } + }; + Object.defineProperty(CloseEvent.prototype, "code", { enumerable: true }); + Object.defineProperty(CloseEvent.prototype, "reason", { enumerable: true }); + Object.defineProperty(CloseEvent.prototype, "wasClean", { enumerable: true }); + var ErrorEvent = class extends Event { + /** + * Create a new `ErrorEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.error=null] The error that generated this event + * @param {String} [options.message=''] The error message + */ + constructor(type, options = {}) { + super(type); + this[kError] = options.error === void 0 ? null : options.error; + this[kMessage] = options.message === void 0 ? "" : options.message; + } + /** + * @type {*} + */ + get error() { + return this[kError]; + } + /** + * @type {String} + */ + get message() { + return this[kMessage]; + } + }; + Object.defineProperty(ErrorEvent.prototype, "error", { enumerable: true }); + Object.defineProperty(ErrorEvent.prototype, "message", { enumerable: true }); + var MessageEvent = class extends Event { + /** + * Create a new `MessageEvent`. + * + * @param {String} type The name of the event + * @param {Object} [options] A dictionary object that allows for setting + * attributes via object members of the same name + * @param {*} [options.data=null] The message content + */ + constructor(type, options = {}) { + super(type); + this[kData] = options.data === void 0 ? null : options.data; + } + /** + * @type {*} + */ + get data() { + return this[kData]; + } + }; + Object.defineProperty(MessageEvent.prototype, "data", { enumerable: true }); + var EventTarget = { + /** + * Register an event listener. + * + * @param {String} type A string representing the event type to listen for + * @param {(Function|Object)} handler The listener to add + * @param {Object} [options] An options object specifies characteristics about + * the event listener + * @param {Boolean} [options.once=false] A `Boolean` indicating that the + * listener should be invoked at most once after being added. If `true`, + * the listener would be automatically removed when invoked. + * @public + */ + addEventListener(type, handler, options = {}) { + for (const listener of this.listeners(type)) { + if (!options[kForOnEventAttribute] && listener[kListener] === handler && !listener[kForOnEventAttribute]) { + return; + } + } + let wrapper; + if (type === "message") { + wrapper = function onMessage(data, isBinary) { + const event = new MessageEvent("message", { + data: isBinary ? data : data.toString() + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "close") { + wrapper = function onClose(code, message) { + const event = new CloseEvent("close", { + code, + reason: message.toString(), + wasClean: this._closeFrameReceived && this._closeFrameSent + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "error") { + wrapper = function onError(error) { + const event = new ErrorEvent("error", { + error, + message: error.message + }); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else if (type === "open") { + wrapper = function onOpen() { + const event = new Event("open"); + event[kTarget] = this; + callListener(handler, this, event); + }; + } else { + return; + } + wrapper[kForOnEventAttribute] = !!options[kForOnEventAttribute]; + wrapper[kListener] = handler; + if (options.once) { + this.once(type, wrapper); + } else { + this.on(type, wrapper); + } + }, + /** + * Remove an event listener. + * + * @param {String} type A string representing the event type to remove + * @param {(Function|Object)} handler The listener to remove + * @public + */ + removeEventListener(type, handler) { + for (const listener of this.listeners(type)) { + if (listener[kListener] === handler && !listener[kForOnEventAttribute]) { + this.removeListener(type, listener); + break; + } + } + } + }; + module2.exports = { + CloseEvent, + ErrorEvent, + Event, + EventTarget, + MessageEvent + }; + function callListener(listener, thisArg, event) { + if (typeof listener === "object" && listener.handleEvent) { + listener.handleEvent.call(listener, event); + } else { + listener.call(thisArg, event); + } + } + } +}); + +// node_modules/ws/lib/extension.js +var require_extension = __commonJS({ + "node_modules/ws/lib/extension.js"(exports2, module2) { + "use strict"; + var { tokenChars } = require_validation(); + function push(dest, name, elem) { + if (dest[name] === void 0) dest[name] = [elem]; + else dest[name].push(elem); + } + function parse(header) { + const offers = /* @__PURE__ */ Object.create(null); + let params = /* @__PURE__ */ Object.create(null); + let mustUnescape = false; + let isEscaping = false; + let inQuotes = false; + let extensionName; + let paramName; + let start = -1; + let code = -1; + let end = -1; + let i = 0; + for (; i < header.length; i++) { + code = header.charCodeAt(i); + if (extensionName === void 0) { + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (i !== 0 && (code === 32 || code === 9)) { + if (end === -1 && start !== -1) end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) end = i; + const name = header.slice(start, end); + if (code === 44) { + push(offers, name, params); + params = /* @__PURE__ */ Object.create(null); + } else { + extensionName = name; + } + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (paramName === void 0) { + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (code === 32 || code === 9) { + if (end === -1 && start !== -1) end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) end = i; + push(params, header.slice(start, end), true); + if (code === 44) { + push(offers, extensionName, params); + params = /* @__PURE__ */ Object.create(null); + extensionName = void 0; + } + start = end = -1; + } else if (code === 61 && start !== -1 && end === -1) { + paramName = header.slice(start, i); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else { + if (isEscaping) { + if (tokenChars[code] !== 1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (start === -1) start = i; + else if (!mustUnescape) mustUnescape = true; + isEscaping = false; + } else if (inQuotes) { + if (tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (code === 34 && start !== -1) { + inQuotes = false; + end = i; + } else if (code === 92) { + isEscaping = true; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } else if (code === 34 && header.charCodeAt(i - 1) === 61) { + inQuotes = true; + } else if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (start !== -1 && (code === 32 || code === 9)) { + if (end === -1) end = i; + } else if (code === 59 || code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) end = i; + let value = header.slice(start, end); + if (mustUnescape) { + value = value.replace(/\\/g, ""); + mustUnescape = false; + } + push(params, paramName, value); + if (code === 44) { + push(offers, extensionName, params); + params = /* @__PURE__ */ Object.create(null); + extensionName = void 0; + } + paramName = void 0; + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } + } + if (start === -1 || inQuotes || code === 32 || code === 9) { + throw new SyntaxError("Unexpected end of input"); + } + if (end === -1) end = i; + const token = header.slice(start, end); + if (extensionName === void 0) { + push(offers, token, params); + } else { + if (paramName === void 0) { + push(params, token, true); + } else if (mustUnescape) { + push(params, paramName, token.replace(/\\/g, "")); + } else { + push(params, paramName, token); + } + push(offers, extensionName, params); + } + return offers; + } + function format(extensions) { + return Object.keys(extensions).map((extension) => { + let configurations = extensions[extension]; + if (!Array.isArray(configurations)) configurations = [configurations]; + return configurations.map((params) => { + return [extension].concat( + Object.keys(params).map((k) => { + let values = params[k]; + if (!Array.isArray(values)) values = [values]; + return values.map((v) => v === true ? k : `${k}=${v}`).join("; "); + }) + ).join("; "); + }).join(", "); + }).join(", "); + } + module2.exports = { format, parse }; + } +}); + +// node_modules/ws/lib/websocket.js +var require_websocket = __commonJS({ + "node_modules/ws/lib/websocket.js"(exports2, module2) { + "use strict"; + var EventEmitter = require("events"); + var https = require("https"); + var http = require("http"); + var net = require("net"); + var tls = require("tls"); + var { randomBytes, createHash } = require("crypto"); + var { Duplex, Readable } = require("stream"); + var { URL } = require("url"); + var PerMessageDeflate = require_permessage_deflate(); + var Receiver = require_receiver(); + var Sender = require_sender(); + var { isBlob } = require_validation(); + var { + BINARY_TYPES, + CLOSE_TIMEOUT, + EMPTY_BUFFER, + GUID, + kForOnEventAttribute, + kListener, + kStatusCode, + kWebSocket, + NOOP + } = require_constants(); + var { + EventTarget: { addEventListener, removeEventListener } + } = require_event_target(); + var { format, parse } = require_extension(); + var { toBuffer } = require_buffer_util(); + var kAborted = Symbol("kAborted"); + var protocolVersions = [8, 13]; + var readyStates = ["CONNECTING", "OPEN", "CLOSING", "CLOSED"]; + var subprotocolRegex = /^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/; + var WebSocket = class _WebSocket extends EventEmitter { + /** + * Create a new `WebSocket`. + * + * @param {(String|URL)} address The URL to which to connect + * @param {(String|String[])} [protocols] The subprotocols + * @param {Object} [options] Connection options + */ + constructor(address, protocols, options) { + super(); + this._binaryType = BINARY_TYPES[0]; + this._closeCode = 1006; + this._closeFrameReceived = false; + this._closeFrameSent = false; + this._closeMessage = EMPTY_BUFFER; + this._closeTimer = null; + this._errorEmitted = false; + this._extensions = {}; + this._paused = false; + this._protocol = ""; + this._readyState = _WebSocket.CONNECTING; + this._receiver = null; + this._sender = null; + this._socket = null; + if (address !== null) { + this._bufferedAmount = 0; + this._isServer = false; + this._redirects = 0; + if (protocols === void 0) { + protocols = []; + } else if (!Array.isArray(protocols)) { + if (typeof protocols === "object" && protocols !== null) { + options = protocols; + protocols = []; + } else { + protocols = [protocols]; + } + } + initAsClient(this, address, protocols, options); + } else { + this._autoPong = options.autoPong; + this._closeTimeout = options.closeTimeout; + this._isServer = true; + } + } + /** + * For historical reasons, the custom "nodebuffer" type is used by the default + * instead of "blob". + * + * @type {String} + */ + get binaryType() { + return this._binaryType; + } + set binaryType(type) { + if (!BINARY_TYPES.includes(type)) return; + this._binaryType = type; + if (this._receiver) this._receiver._binaryType = type; + } + /** + * @type {Number} + */ + get bufferedAmount() { + if (!this._socket) return this._bufferedAmount; + return this._socket._writableState.length + this._sender._bufferedBytes; + } + /** + * @type {String} + */ + get extensions() { + return Object.keys(this._extensions).join(); + } + /** + * @type {Boolean} + */ + get isPaused() { + return this._paused; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onclose() { + return null; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onerror() { + return null; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onopen() { + return null; + } + /** + * @type {Function} + */ + /* istanbul ignore next */ + get onmessage() { + return null; + } + /** + * @type {String} + */ + get protocol() { + return this._protocol; + } + /** + * @type {Number} + */ + get readyState() { + return this._readyState; + } + /** + * @type {String} + */ + get url() { + return this._url; + } + /** + * Set up the socket and the internal resources. + * + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Object} options Options object + * @param {Boolean} [options.allowSynchronousEvents=false] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {Function} [options.generateMask] The function used to generate the + * masking key + * @param {Number} [options.maxBufferedChunks=0] The maximum number of + * buffered data chunks + * @param {Number} [options.maxFragments=0] The maximum number of message + * fragments + * @param {Number} [options.maxPayload=0] The maximum allowed message size + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @private + */ + setSocket(socket, head, options) { + const receiver = new Receiver({ + allowSynchronousEvents: options.allowSynchronousEvents, + binaryType: this.binaryType, + extensions: this._extensions, + isServer: this._isServer, + maxBufferedChunks: options.maxBufferedChunks, + maxFragments: options.maxFragments, + maxPayload: options.maxPayload, + skipUTF8Validation: options.skipUTF8Validation + }); + const sender = new Sender(socket, this._extensions, options.generateMask); + this._receiver = receiver; + this._sender = sender; + this._socket = socket; + receiver[kWebSocket] = this; + sender[kWebSocket] = this; + socket[kWebSocket] = this; + receiver.on("conclude", receiverOnConclude); + receiver.on("drain", receiverOnDrain); + receiver.on("error", receiverOnError); + receiver.on("message", receiverOnMessage); + receiver.on("ping", receiverOnPing); + receiver.on("pong", receiverOnPong); + sender.onerror = senderOnError; + if (socket.setTimeout) socket.setTimeout(0); + if (socket.setNoDelay) socket.setNoDelay(); + if (head.length > 0) socket.unshift(head); + socket.on("close", socketOnClose); + socket.on("data", socketOnData); + socket.on("end", socketOnEnd); + socket.on("error", socketOnError); + this._readyState = _WebSocket.OPEN; + this.emit("open"); + } + /** + * Emit the `'close'` event. + * + * @private + */ + emitClose() { + if (!this._socket) { + this._readyState = _WebSocket.CLOSED; + this.emit("close", this._closeCode, this._closeMessage); + return; + } + if (this._extensions[PerMessageDeflate.extensionName]) { + this._extensions[PerMessageDeflate.extensionName].cleanup(); + } + this._receiver.removeAllListeners(); + this._readyState = _WebSocket.CLOSED; + this.emit("close", this._closeCode, this._closeMessage); + } + /** + * Start a closing handshake. + * + * +----------+ +-----------+ +----------+ + * - - -|ws.close()|-->|close frame|-->|ws.close()|- - - + * | +----------+ +-----------+ +----------+ | + * +----------+ +-----------+ | + * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING + * +----------+ +-----------+ | + * | | | +---+ | + * +------------------------+-->|fin| - - - - + * | +---+ | +---+ + * - - - - -|fin|<---------------------+ + * +---+ + * + * @param {Number} [code] Status code explaining why the connection is closing + * @param {(String|Buffer)} [data] The reason why the connection is + * closing + * @public + */ + close(code, data) { + if (this.readyState === _WebSocket.CLOSED) return; + if (this.readyState === _WebSocket.CONNECTING) { + const msg = "WebSocket was closed before the connection was established"; + abortHandshake(this, this._req, msg); + return; + } + if (this.readyState === _WebSocket.CLOSING) { + if (this._closeFrameSent && (this._closeFrameReceived || this._receiver._writableState.errorEmitted)) { + this._socket.end(); + } + return; + } + this._readyState = _WebSocket.CLOSING; + this._sender.close(code, data, !this._isServer, (err) => { + if (err) return; + this._closeFrameSent = true; + if (this._closeFrameReceived || this._receiver._writableState.errorEmitted) { + this._socket.end(); + } + }); + setCloseTimer(this); + } + /** + * Pause the socket. + * + * @public + */ + pause() { + if (this.readyState === _WebSocket.CONNECTING || this.readyState === _WebSocket.CLOSED) { + return; + } + this._paused = true; + this._socket.pause(); + } + /** + * Send a ping. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the ping is sent + * @public + */ + ping(data, mask, cb) { + if (this.readyState === _WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); + } + if (typeof data === "function") { + cb = data; + data = mask = void 0; + } else if (typeof mask === "function") { + cb = mask; + mask = void 0; + } + if (typeof data === "number") data = data.toString(); + if (this.readyState !== _WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + if (mask === void 0) mask = !this._isServer; + this._sender.ping(data || EMPTY_BUFFER, mask, cb); + } + /** + * Send a pong. + * + * @param {*} [data] The data to send + * @param {Boolean} [mask] Indicates whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when the pong is sent + * @public + */ + pong(data, mask, cb) { + if (this.readyState === _WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); + } + if (typeof data === "function") { + cb = data; + data = mask = void 0; + } else if (typeof mask === "function") { + cb = mask; + mask = void 0; + } + if (typeof data === "number") data = data.toString(); + if (this.readyState !== _WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + if (mask === void 0) mask = !this._isServer; + this._sender.pong(data || EMPTY_BUFFER, mask, cb); + } + /** + * Resume the socket. + * + * @public + */ + resume() { + if (this.readyState === _WebSocket.CONNECTING || this.readyState === _WebSocket.CLOSED) { + return; + } + this._paused = false; + if (!this._receiver._writableState.needDrain) this._socket.resume(); + } + /** + * Send a data message. + * + * @param {*} data The message to send + * @param {Object} [options] Options object + * @param {Boolean} [options.binary] Specifies whether `data` is binary or + * text + * @param {Boolean} [options.compress] Specifies whether or not to compress + * `data` + * @param {Boolean} [options.fin=true] Specifies whether the fragment is the + * last one + * @param {Boolean} [options.mask] Specifies whether or not to mask `data` + * @param {Function} [cb] Callback which is executed when data is written out + * @public + */ + send(data, options, cb) { + if (this.readyState === _WebSocket.CONNECTING) { + throw new Error("WebSocket is not open: readyState 0 (CONNECTING)"); + } + if (typeof options === "function") { + cb = options; + options = {}; + } + if (typeof data === "number") data = data.toString(); + if (this.readyState !== _WebSocket.OPEN) { + sendAfterClose(this, data, cb); + return; + } + const opts = { + binary: typeof data !== "string", + mask: !this._isServer, + compress: true, + fin: true, + ...options + }; + if (!this._extensions[PerMessageDeflate.extensionName]) { + opts.compress = false; + } + this._sender.send(data || EMPTY_BUFFER, opts, cb); + } + /** + * Forcibly close the connection. + * + * @public + */ + terminate() { + if (this.readyState === _WebSocket.CLOSED) return; + if (this.readyState === _WebSocket.CONNECTING) { + const msg = "WebSocket was closed before the connection was established"; + abortHandshake(this, this._req, msg); + return; + } + if (this._socket) { + this._readyState = _WebSocket.CLOSING; + this._socket.destroy(); + } + } + }; + Object.defineProperty(WebSocket, "CONNECTING", { + enumerable: true, + value: readyStates.indexOf("CONNECTING") + }); + Object.defineProperty(WebSocket.prototype, "CONNECTING", { + enumerable: true, + value: readyStates.indexOf("CONNECTING") + }); + Object.defineProperty(WebSocket, "OPEN", { + enumerable: true, + value: readyStates.indexOf("OPEN") + }); + Object.defineProperty(WebSocket.prototype, "OPEN", { + enumerable: true, + value: readyStates.indexOf("OPEN") + }); + Object.defineProperty(WebSocket, "CLOSING", { + enumerable: true, + value: readyStates.indexOf("CLOSING") + }); + Object.defineProperty(WebSocket.prototype, "CLOSING", { + enumerable: true, + value: readyStates.indexOf("CLOSING") + }); + Object.defineProperty(WebSocket, "CLOSED", { + enumerable: true, + value: readyStates.indexOf("CLOSED") + }); + Object.defineProperty(WebSocket.prototype, "CLOSED", { + enumerable: true, + value: readyStates.indexOf("CLOSED") + }); + [ + "binaryType", + "bufferedAmount", + "extensions", + "isPaused", + "protocol", + "readyState", + "url" + ].forEach((property) => { + Object.defineProperty(WebSocket.prototype, property, { enumerable: true }); + }); + ["open", "error", "close", "message"].forEach((method) => { + Object.defineProperty(WebSocket.prototype, `on${method}`, { + enumerable: true, + get() { + for (const listener of this.listeners(method)) { + if (listener[kForOnEventAttribute]) return listener[kListener]; + } + return null; + }, + set(handler) { + for (const listener of this.listeners(method)) { + if (listener[kForOnEventAttribute]) { + this.removeListener(method, listener); + break; + } + } + if (typeof handler !== "function") return; + this.addEventListener(method, handler, { + [kForOnEventAttribute]: true + }); + } + }); + }); + WebSocket.prototype.addEventListener = addEventListener; + WebSocket.prototype.removeEventListener = removeEventListener; + module2.exports = WebSocket; + function initAsClient(websocket, address, protocols, options) { + const opts = { + allowSynchronousEvents: true, + autoPong: true, + closeTimeout: CLOSE_TIMEOUT, + protocolVersion: protocolVersions[1], + maxBufferedChunks: 256 * 1024, + maxFragments: 16 * 1024, + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: true, + followRedirects: false, + maxRedirects: 10, + ...options, + socketPath: void 0, + hostname: void 0, + protocol: void 0, + timeout: void 0, + method: "GET", + host: void 0, + path: void 0, + port: void 0 + }; + websocket._autoPong = opts.autoPong; + websocket._closeTimeout = opts.closeTimeout; + if (!protocolVersions.includes(opts.protocolVersion)) { + throw new RangeError( + `Unsupported protocol version: ${opts.protocolVersion} (supported versions: ${protocolVersions.join(", ")})` + ); + } + let parsedUrl; + if (address instanceof URL) { + parsedUrl = address; + } else { + try { + parsedUrl = new URL(address); + } catch { + throw new SyntaxError(`Invalid URL: ${address}`); + } + } + if (parsedUrl.protocol === "http:") { + parsedUrl.protocol = "ws:"; + } else if (parsedUrl.protocol === "https:") { + parsedUrl.protocol = "wss:"; + } + websocket._url = parsedUrl.href; + const isSecure = parsedUrl.protocol === "wss:"; + const isIpcUrl = parsedUrl.protocol === "ws+unix:"; + let invalidUrlMessage; + if (parsedUrl.protocol !== "ws:" && !isSecure && !isIpcUrl) { + invalidUrlMessage = `The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`; + } else if (isIpcUrl && !parsedUrl.pathname) { + invalidUrlMessage = "The URL's pathname is empty"; + } else if (parsedUrl.hash) { + invalidUrlMessage = "The URL contains a fragment identifier"; + } + if (invalidUrlMessage) { + const err = new SyntaxError(invalidUrlMessage); + if (websocket._redirects === 0) { + throw err; + } else { + emitErrorAndClose(websocket, err); + return; + } + } + const defaultPort = isSecure ? 443 : 80; + const key = randomBytes(16).toString("base64"); + const request = isSecure ? https.request : http.request; + const protocolSet = /* @__PURE__ */ new Set(); + let perMessageDeflate; + opts.createConnection = opts.createConnection || (isSecure ? tlsConnect : netConnect); + opts.defaultPort = opts.defaultPort || defaultPort; + opts.port = parsedUrl.port || defaultPort; + opts.host = parsedUrl.hostname.startsWith("[") ? parsedUrl.hostname.slice(1, -1) : parsedUrl.hostname; + opts.headers = { + ...opts.headers, + "Sec-WebSocket-Version": opts.protocolVersion, + "Sec-WebSocket-Key": key, + Connection: "Upgrade", + Upgrade: "websocket" + }; + opts.path = parsedUrl.pathname + parsedUrl.search; + opts.timeout = opts.handshakeTimeout; + if (opts.perMessageDeflate) { + perMessageDeflate = new PerMessageDeflate({ + ...opts.perMessageDeflate, + isServer: false, + maxPayload: opts.maxPayload + }); + opts.headers["Sec-WebSocket-Extensions"] = format({ + [PerMessageDeflate.extensionName]: perMessageDeflate.offer() + }); + } + if (protocols.length) { + for (const protocol of protocols) { + if (typeof protocol !== "string" || !subprotocolRegex.test(protocol) || protocolSet.has(protocol)) { + throw new SyntaxError( + "An invalid or duplicated subprotocol was specified" + ); + } + protocolSet.add(protocol); + } + opts.headers["Sec-WebSocket-Protocol"] = protocols.join(","); + } + if (opts.origin) { + if (opts.protocolVersion < 13) { + opts.headers["Sec-WebSocket-Origin"] = opts.origin; + } else { + opts.headers.Origin = opts.origin; + } + } + if (parsedUrl.username || parsedUrl.password) { + opts.auth = `${parsedUrl.username}:${parsedUrl.password}`; + } + if (isIpcUrl) { + const parts = opts.path.split(":"); + opts.socketPath = parts[0]; + opts.path = parts[1]; + } + let req; + if (opts.followRedirects) { + if (websocket._redirects === 0) { + websocket._originalIpc = isIpcUrl; + websocket._originalSecure = isSecure; + websocket._originalHostOrSocketPath = isIpcUrl ? opts.socketPath : parsedUrl.host; + const headers = options && options.headers; + options = { ...options, headers: {} }; + if (headers) { + for (const [key2, value] of Object.entries(headers)) { + options.headers[key2.toLowerCase()] = value; + } + } + } else if (websocket.listenerCount("redirect") === 0) { + const isSameHost = isIpcUrl ? websocket._originalIpc ? opts.socketPath === websocket._originalHostOrSocketPath : false : websocket._originalIpc ? false : parsedUrl.host === websocket._originalHostOrSocketPath; + if (!isSameHost || websocket._originalSecure && !isSecure) { + delete opts.headers.authorization; + delete opts.headers.cookie; + if (!isSameHost) delete opts.headers.host; + opts.auth = void 0; + } + } + if (opts.auth && !options.headers.authorization) { + options.headers.authorization = "Basic " + Buffer.from(opts.auth).toString("base64"); + } + req = websocket._req = request(opts); + if (websocket._redirects) { + websocket.emit("redirect", websocket.url, req); + } + } else { + req = websocket._req = request(opts); + } + if (opts.timeout) { + req.on("timeout", () => { + abortHandshake(websocket, req, "Opening handshake has timed out"); + }); + } + req.on("error", (err) => { + if (req === null || req[kAborted]) return; + req = websocket._req = null; + emitErrorAndClose(websocket, err); + }); + req.on("response", (res) => { + const location = res.headers.location; + const statusCode = res.statusCode; + if (location && opts.followRedirects && statusCode >= 300 && statusCode < 400) { + if (++websocket._redirects > opts.maxRedirects) { + abortHandshake(websocket, req, "Maximum redirects exceeded"); + return; + } + req.abort(); + let addr; + try { + addr = new URL(location, address); + } catch (e) { + const err = new SyntaxError(`Invalid URL: ${location}`); + emitErrorAndClose(websocket, err); + return; + } + initAsClient(websocket, addr, protocols, options); + } else if (!websocket.emit("unexpected-response", req, res)) { + abortHandshake( + websocket, + req, + `Unexpected server response: ${res.statusCode}` + ); + } + }); + req.on("upgrade", (res, socket, head) => { + websocket.emit("upgrade", res); + if (websocket.readyState !== WebSocket.CONNECTING) return; + req = websocket._req = null; + const upgrade = res.headers.upgrade; + if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") { + abortHandshake(websocket, socket, "Invalid Upgrade header"); + return; + } + const digest = createHash("sha1").update(key + GUID).digest("base64"); + if (res.headers["sec-websocket-accept"] !== digest) { + abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header"); + return; + } + const serverProt = res.headers["sec-websocket-protocol"]; + let protError; + if (serverProt !== void 0) { + if (!protocolSet.size) { + protError = "Server sent a subprotocol but none was requested"; + } else if (!protocolSet.has(serverProt)) { + protError = "Server sent an invalid subprotocol"; + } + } else if (protocolSet.size) { + protError = "Server sent no subprotocol"; + } + if (protError) { + abortHandshake(websocket, socket, protError); + return; + } + if (serverProt) websocket._protocol = serverProt; + const secWebSocketExtensions = res.headers["sec-websocket-extensions"]; + if (secWebSocketExtensions !== void 0) { + if (!perMessageDeflate) { + const message = "Server sent a Sec-WebSocket-Extensions header but no extension was requested"; + abortHandshake(websocket, socket, message); + return; + } + let extensions; + try { + extensions = parse(secWebSocketExtensions); + } catch (err) { + const message = "Invalid Sec-WebSocket-Extensions header"; + abortHandshake(websocket, socket, message); + return; + } + const extensionNames = Object.keys(extensions); + if (extensionNames.length !== 1 || extensionNames[0] !== PerMessageDeflate.extensionName) { + const message = "Server indicated an extension that was not requested"; + abortHandshake(websocket, socket, message); + return; + } + try { + perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]); + } catch (err) { + const message = "Invalid Sec-WebSocket-Extensions header"; + abortHandshake(websocket, socket, message); + return; + } + websocket._extensions[PerMessageDeflate.extensionName] = perMessageDeflate; + } + websocket.setSocket(socket, head, { + allowSynchronousEvents: opts.allowSynchronousEvents, + generateMask: opts.generateMask, + maxBufferedChunks: opts.maxBufferedChunks, + maxFragments: opts.maxFragments, + maxPayload: opts.maxPayload, + skipUTF8Validation: opts.skipUTF8Validation + }); + }); + if (opts.finishRequest) { + opts.finishRequest(req, websocket); + } else { + req.end(); + } + } + function emitErrorAndClose(websocket, err) { + websocket._readyState = WebSocket.CLOSING; + websocket._errorEmitted = true; + websocket.emit("error", err); + websocket.emitClose(); + } + function netConnect(options) { + options.path = options.socketPath; + return net.connect(options); + } + function tlsConnect(options) { + options.path = void 0; + if (!options.servername && options.servername !== "") { + options.servername = net.isIP(options.host) ? "" : options.host; + } + return tls.connect(options); + } + function abortHandshake(websocket, stream, message) { + websocket._readyState = WebSocket.CLOSING; + const err = new Error(message); + Error.captureStackTrace(err, abortHandshake); + if (stream.setHeader) { + stream[kAborted] = true; + stream.abort(); + if (stream.socket && !stream.socket.destroyed) { + stream.socket.destroy(); + } + process.nextTick(emitErrorAndClose, websocket, err); + } else { + stream.destroy(err); + stream.once("error", websocket.emit.bind(websocket, "error")); + stream.once("close", websocket.emitClose.bind(websocket)); + } + } + function sendAfterClose(websocket, data, cb) { + if (data) { + const length = isBlob(data) ? data.size : toBuffer(data).length; + if (websocket._socket) websocket._sender._bufferedBytes += length; + else websocket._bufferedAmount += length; + } + if (cb) { + const err = new Error( + `WebSocket is not open: readyState ${websocket.readyState} (${readyStates[websocket.readyState]})` + ); + process.nextTick(cb, err); + } + } + function receiverOnConclude(code, reason) { + const websocket = this[kWebSocket]; + websocket._closeFrameReceived = true; + websocket._closeMessage = reason; + websocket._closeCode = code; + if (websocket._socket[kWebSocket] === void 0) return; + websocket._socket.removeListener("data", socketOnData); + process.nextTick(resume, websocket._socket); + if (code === 1005) websocket.close(); + else websocket.close(code, reason); + } + function receiverOnDrain() { + const websocket = this[kWebSocket]; + if (!websocket.isPaused) websocket._socket.resume(); + } + function receiverOnError(err) { + const websocket = this[kWebSocket]; + if (websocket._socket[kWebSocket] !== void 0) { + websocket._socket.removeListener("data", socketOnData); + process.nextTick(resume, websocket._socket); + websocket.close(err[kStatusCode]); + } + if (!websocket._errorEmitted) { + websocket._errorEmitted = true; + websocket.emit("error", err); + } + } + function receiverOnFinish() { + this[kWebSocket].emitClose(); + } + function receiverOnMessage(data, isBinary) { + this[kWebSocket].emit("message", data, isBinary); + } + function receiverOnPing(data) { + const websocket = this[kWebSocket]; + if (websocket._autoPong) websocket.pong(data, !this._isServer, NOOP); + websocket.emit("ping", data); + } + function receiverOnPong(data) { + this[kWebSocket].emit("pong", data); + } + function resume(stream) { + stream.resume(); + } + function senderOnError(err) { + const websocket = this[kWebSocket]; + if (websocket.readyState === WebSocket.CLOSED) return; + if (websocket.readyState === WebSocket.OPEN) { + websocket._readyState = WebSocket.CLOSING; + setCloseTimer(websocket); + } + this._socket.end(); + if (!websocket._errorEmitted) { + websocket._errorEmitted = true; + websocket.emit("error", err); + } + } + function setCloseTimer(websocket) { + websocket._closeTimer = setTimeout( + websocket._socket.destroy.bind(websocket._socket), + websocket._closeTimeout + ); + } + function socketOnClose() { + const websocket = this[kWebSocket]; + this.removeListener("close", socketOnClose); + this.removeListener("data", socketOnData); + this.removeListener("end", socketOnEnd); + websocket._readyState = WebSocket.CLOSING; + if (!this._readableState.endEmitted && !websocket._closeFrameReceived && !websocket._receiver._writableState.errorEmitted && this._readableState.length !== 0) { + const chunk = this.read(this._readableState.length); + websocket._receiver.write(chunk); + } + websocket._receiver.end(); + this[kWebSocket] = void 0; + clearTimeout(websocket._closeTimer); + if (websocket._receiver._writableState.finished || websocket._receiver._writableState.errorEmitted) { + websocket.emitClose(); + } else { + websocket._receiver.on("error", receiverOnFinish); + websocket._receiver.on("finish", receiverOnFinish); + } + } + function socketOnData(chunk) { + if (!this[kWebSocket]._receiver.write(chunk)) { + this.pause(); + } + } + function socketOnEnd() { + const websocket = this[kWebSocket]; + websocket._readyState = WebSocket.CLOSING; + websocket._receiver.end(); + this.end(); + } + function socketOnError() { + const websocket = this[kWebSocket]; + this.removeListener("error", socketOnError); + this.on("error", NOOP); + if (websocket) { + websocket._readyState = WebSocket.CLOSING; + this.destroy(); + } + } + } +}); + +// node_modules/ws/lib/stream.js +var require_stream = __commonJS({ + "node_modules/ws/lib/stream.js"(exports2, module2) { + "use strict"; + var WebSocket = require_websocket(); + var { Duplex } = require("stream"); + function emitClose(stream) { + stream.emit("close"); + } + function duplexOnEnd() { + if (!this.destroyed && this._writableState.finished) { + this.destroy(); + } + } + function duplexOnError(err) { + this.removeListener("error", duplexOnError); + this.destroy(); + if (this.listenerCount("error") === 0) { + this.emit("error", err); + } + } + function createWebSocketStream(ws, options) { + let terminateOnDestroy = true; + const duplex = new Duplex({ + ...options, + autoDestroy: false, + emitClose: false, + objectMode: false, + writableObjectMode: false + }); + ws.on("message", function message(msg, isBinary) { + const data = !isBinary && duplex._readableState.objectMode ? msg.toString() : msg; + if (!duplex.push(data)) ws.pause(); + }); + ws.once("error", function error(err) { + if (duplex.destroyed) return; + terminateOnDestroy = false; + duplex.destroy(err); + }); + ws.once("close", function close() { + if (duplex.destroyed) return; + duplex.push(null); + }); + duplex._destroy = function(err, callback) { + if (ws.readyState === ws.CLOSED) { + callback(err); + process.nextTick(emitClose, duplex); + return; + } + let called = false; + ws.once("error", function error(err2) { + called = true; + callback(err2); + }); + ws.once("close", function close() { + if (!called) callback(err); + process.nextTick(emitClose, duplex); + }); + if (terminateOnDestroy) ws.terminate(); + }; + duplex._final = function(callback) { + if (ws.readyState === ws.CONNECTING) { + ws.once("open", function open() { + duplex._final(callback); + }); + return; + } + if (ws._socket === null) return; + if (ws._socket._writableState.finished) { + callback(); + if (duplex._readableState.endEmitted) duplex.destroy(); + } else { + ws._socket.once("finish", function finish() { + callback(); + }); + ws.close(); + } + }; + duplex._read = function() { + if (ws.isPaused) ws.resume(); + }; + duplex._write = function(chunk, encoding, callback) { + if (ws.readyState === ws.CONNECTING) { + ws.once("open", function open() { + duplex._write(chunk, encoding, callback); + }); + return; + } + ws.send(chunk, callback); + }; + duplex.on("end", duplexOnEnd); + duplex.on("error", duplexOnError); + return duplex; + } + module2.exports = createWebSocketStream; + } +}); + +// node_modules/ws/lib/subprotocol.js +var require_subprotocol = __commonJS({ + "node_modules/ws/lib/subprotocol.js"(exports2, module2) { + "use strict"; + var { tokenChars } = require_validation(); + function parse(header) { + const protocols = /* @__PURE__ */ new Set(); + let start = -1; + let end = -1; + let i = 0; + for (i; i < header.length; i++) { + const code = header.charCodeAt(i); + if (end === -1 && tokenChars[code] === 1) { + if (start === -1) start = i; + } else if (i !== 0 && (code === 32 || code === 9)) { + if (end === -1 && start !== -1) end = i; + } else if (code === 44) { + if (start === -1) { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + if (end === -1) end = i; + const protocol2 = header.slice(start, end); + if (protocols.has(protocol2)) { + throw new SyntaxError(`The "${protocol2}" subprotocol is duplicated`); + } + protocols.add(protocol2); + start = end = -1; + } else { + throw new SyntaxError(`Unexpected character at index ${i}`); + } + } + if (start === -1 || end !== -1) { + throw new SyntaxError("Unexpected end of input"); + } + const protocol = header.slice(start, i); + if (protocols.has(protocol)) { + throw new SyntaxError(`The "${protocol}" subprotocol is duplicated`); + } + protocols.add(protocol); + return protocols; + } + module2.exports = { parse }; + } +}); + +// node_modules/ws/lib/websocket-server.js +var require_websocket_server = __commonJS({ + "node_modules/ws/lib/websocket-server.js"(exports2, module2) { + "use strict"; + var EventEmitter = require("events"); + var http = require("http"); + var { Duplex } = require("stream"); + var { createHash } = require("crypto"); + var extension = require_extension(); + var PerMessageDeflate = require_permessage_deflate(); + var subprotocol = require_subprotocol(); + var WebSocket = require_websocket(); + var { CLOSE_TIMEOUT, GUID, kWebSocket } = require_constants(); + var keyRegex = /^[+/0-9A-Za-z]{22}==$/; + var RUNNING = 0; + var CLOSING = 1; + var CLOSED = 2; + var WebSocketServer = class extends EventEmitter { + /** + * Create a `WebSocketServer` instance. + * + * @param {Object} options Configuration options + * @param {Boolean} [options.allowSynchronousEvents=true] Specifies whether + * any of the `'message'`, `'ping'`, and `'pong'` events can be emitted + * multiple times in the same tick + * @param {Boolean} [options.autoPong=true] Specifies whether or not to + * automatically send a pong in response to a ping + * @param {Number} [options.backlog=511] The maximum length of the queue of + * pending connections + * @param {Boolean} [options.clientTracking=true] Specifies whether or not to + * track clients + * @param {Number} [options.closeTimeout=30000] Duration in milliseconds to + * wait for the closing handshake to finish after `websocket.close()` is + * called + * @param {Function} [options.handleProtocols] A hook to handle protocols + * @param {String} [options.host] The hostname where to bind the server + * @param {Number} [options.maxBufferedChunks=262144] The maximum number of + * buffered data chunks + * @param {Number} [options.maxFragments=16384] The maximum number of message + * fragments + * @param {Number} [options.maxPayload=104857600] The maximum allowed message + * size + * @param {Boolean} [options.noServer=false] Enable no server mode + * @param {String} [options.path] Accept only connections matching this path + * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable + * permessage-deflate + * @param {Number} [options.port] The port where to bind the server + * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S + * server to use + * @param {Boolean} [options.skipUTF8Validation=false] Specifies whether or + * not to skip UTF-8 validation for text and close messages + * @param {Function} [options.verifyClient] A hook to reject connections + * @param {Function} [options.WebSocket=WebSocket] Specifies the `WebSocket` + * class to use. It must be the `WebSocket` class or class that extends it + * @param {Function} [callback] A listener for the `listening` event + */ + constructor(options, callback) { + super(); + options = { + allowSynchronousEvents: true, + autoPong: true, + maxBufferedChunks: 256 * 1024, + maxFragments: 16 * 1024, + maxPayload: 100 * 1024 * 1024, + skipUTF8Validation: false, + perMessageDeflate: false, + handleProtocols: null, + clientTracking: true, + closeTimeout: CLOSE_TIMEOUT, + verifyClient: null, + noServer: false, + backlog: null, + // use default (511 as implemented in net.js) + server: null, + host: null, + path: null, + port: null, + WebSocket, + ...options + }; + if (options.port == null && !options.server && !options.noServer || options.port != null && (options.server || options.noServer) || options.server && options.noServer) { + throw new TypeError( + 'One and only one of the "port", "server", or "noServer" options must be specified' + ); + } + if (options.port != null) { + this._server = http.createServer((req, res) => { + const body = http.STATUS_CODES[426]; + res.writeHead(426, { + "Content-Length": body.length, + "Content-Type": "text/plain" + }); + res.end(body); + }); + this._server.listen( + options.port, + options.host, + options.backlog, + callback + ); + } else if (options.server) { + this._server = options.server; + } + if (this._server) { + const emitConnection = this.emit.bind(this, "connection"); + this._removeListeners = addListeners(this._server, { + listening: this.emit.bind(this, "listening"), + error: this.emit.bind(this, "error"), + upgrade: (req, socket, head) => { + this.handleUpgrade(req, socket, head, emitConnection); + } + }); + } + if (options.perMessageDeflate === true) options.perMessageDeflate = {}; + if (options.clientTracking) { + this.clients = /* @__PURE__ */ new Set(); + this._shouldEmitClose = false; + } + this.options = options; + this._state = RUNNING; + } + /** + * Returns the bound address, the address family name, and port of the server + * as reported by the operating system if listening on an IP socket. + * If the server is listening on a pipe or UNIX domain socket, the name is + * returned as a string. + * + * @return {(Object|String|null)} The address of the server + * @public + */ + address() { + if (this.options.noServer) { + throw new Error('The server is operating in "noServer" mode'); + } + if (!this._server) return null; + return this._server.address(); + } + /** + * Stop the server from accepting new connections and emit the `'close'` event + * when all existing connections are closed. + * + * @param {Function} [cb] A one-time listener for the `'close'` event + * @public + */ + close(cb) { + if (this._state === CLOSED) { + if (cb) { + this.once("close", () => { + cb(new Error("The server is not running")); + }); + } + process.nextTick(emitClose, this); + return; + } + if (cb) this.once("close", cb); + if (this._state === CLOSING) return; + this._state = CLOSING; + if (this.options.noServer || this.options.server) { + if (this._server) { + this._removeListeners(); + this._removeListeners = this._server = null; + } + if (this.clients) { + if (!this.clients.size) { + process.nextTick(emitClose, this); + } else { + this._shouldEmitClose = true; + } + } else { + process.nextTick(emitClose, this); + } + } else { + const server = this._server; + this._removeListeners(); + this._removeListeners = this._server = null; + server.close(() => { + emitClose(this); + }); + } + } + /** + * See if a given request should be handled by this server instance. + * + * @param {http.IncomingMessage} req Request object to inspect + * @return {Boolean} `true` if the request is valid, else `false` + * @public + */ + shouldHandle(req) { + if (this.options.path) { + const index = req.url.indexOf("?"); + const pathname = index !== -1 ? req.url.slice(0, index) : req.url; + if (pathname !== this.options.path) return false; + } + return true; + } + /** + * Handle a HTTP Upgrade request. + * + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Function} cb Callback + * @public + */ + handleUpgrade(req, socket, head, cb) { + socket.on("error", socketOnError); + const key = req.headers["sec-websocket-key"]; + const upgrade = req.headers.upgrade; + const version = +req.headers["sec-websocket-version"]; + if (req.method !== "GET") { + const message = "Invalid HTTP method"; + abortHandshakeOrEmitwsClientError(this, req, socket, 405, message); + return; + } + if (upgrade === void 0 || upgrade.toLowerCase() !== "websocket") { + const message = "Invalid Upgrade header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + if (key === void 0 || !keyRegex.test(key)) { + const message = "Missing or invalid Sec-WebSocket-Key header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + if (version !== 13 && version !== 8) { + const message = "Missing or invalid Sec-WebSocket-Version header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message, { + "Sec-WebSocket-Version": "13, 8" + }); + return; + } + if (!this.shouldHandle(req)) { + abortHandshake(socket, 400); + return; + } + const secWebSocketProtocol = req.headers["sec-websocket-protocol"]; + let protocols = /* @__PURE__ */ new Set(); + if (secWebSocketProtocol !== void 0) { + try { + protocols = subprotocol.parse(secWebSocketProtocol); + } catch (err) { + const message = "Invalid Sec-WebSocket-Protocol header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + } + const secWebSocketExtensions = req.headers["sec-websocket-extensions"]; + const extensions = {}; + if (this.options.perMessageDeflate && secWebSocketExtensions !== void 0) { + const perMessageDeflate = new PerMessageDeflate({ + ...this.options.perMessageDeflate, + isServer: true, + maxPayload: this.options.maxPayload + }); + try { + const offers = extension.parse(secWebSocketExtensions); + if (offers[PerMessageDeflate.extensionName]) { + perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]); + extensions[PerMessageDeflate.extensionName] = perMessageDeflate; + } + } catch (err) { + const message = "Invalid or unacceptable Sec-WebSocket-Extensions header"; + abortHandshakeOrEmitwsClientError(this, req, socket, 400, message); + return; + } + } + if (this.options.verifyClient) { + const info = { + origin: req.headers[`${version === 8 ? "sec-websocket-origin" : "origin"}`], + secure: !!(req.socket.authorized || req.socket.encrypted), + req + }; + if (this.options.verifyClient.length === 2) { + this.options.verifyClient(info, (verified, code, message, headers) => { + if (!verified) { + return abortHandshake(socket, code || 401, message, headers); + } + this.completeUpgrade( + extensions, + key, + protocols, + req, + socket, + head, + cb + ); + }); + return; + } + if (!this.options.verifyClient(info)) return abortHandshake(socket, 401); + } + this.completeUpgrade(extensions, key, protocols, req, socket, head, cb); + } + /** + * Upgrade the connection to WebSocket. + * + * @param {Object} extensions The accepted extensions + * @param {String} key The value of the `Sec-WebSocket-Key` header + * @param {Set} protocols The subprotocols + * @param {http.IncomingMessage} req The request object + * @param {Duplex} socket The network socket between the server and client + * @param {Buffer} head The first packet of the upgraded stream + * @param {Function} cb Callback + * @throws {Error} If called more than once with the same socket + * @private + */ + completeUpgrade(extensions, key, protocols, req, socket, head, cb) { + if (!socket.readable || !socket.writable) return socket.destroy(); + if (socket[kWebSocket]) { + throw new Error( + "server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration" + ); + } + if (this._state > RUNNING) return abortHandshake(socket, 503); + const digest = createHash("sha1").update(key + GUID).digest("base64"); + const headers = [ + "HTTP/1.1 101 Switching Protocols", + "Upgrade: websocket", + "Connection: Upgrade", + `Sec-WebSocket-Accept: ${digest}` + ]; + const ws = new this.options.WebSocket(null, void 0, this.options); + if (protocols.size) { + const protocol = this.options.handleProtocols ? this.options.handleProtocols(protocols, req) : protocols.values().next().value; + if (protocol) { + headers.push(`Sec-WebSocket-Protocol: ${protocol}`); + ws._protocol = protocol; + } + } + if (extensions[PerMessageDeflate.extensionName]) { + const params = extensions[PerMessageDeflate.extensionName].params; + const value = extension.format({ + [PerMessageDeflate.extensionName]: [params] + }); + headers.push(`Sec-WebSocket-Extensions: ${value}`); + ws._extensions = extensions; + } + this.emit("headers", headers, req); + socket.write(headers.concat("\r\n").join("\r\n")); + socket.removeListener("error", socketOnError); + ws.setSocket(socket, head, { + allowSynchronousEvents: this.options.allowSynchronousEvents, + maxBufferedChunks: this.options.maxBufferedChunks, + maxFragments: this.options.maxFragments, + maxPayload: this.options.maxPayload, + skipUTF8Validation: this.options.skipUTF8Validation + }); + if (this.clients) { + this.clients.add(ws); + ws.on("close", () => { + this.clients.delete(ws); + if (this._shouldEmitClose && !this.clients.size) { + process.nextTick(emitClose, this); + } + }); + } + cb(ws, req); + } + }; + module2.exports = WebSocketServer; + function addListeners(server, map) { + for (const event of Object.keys(map)) server.on(event, map[event]); + return function removeListeners() { + for (const event of Object.keys(map)) { + server.removeListener(event, map[event]); + } + }; + } + function emitClose(server) { + server._state = CLOSED; + server.emit("close"); + } + function socketOnError() { + this.destroy(); + } + function abortHandshake(socket, code, message, headers) { + message = message || http.STATUS_CODES[code]; + headers = { + Connection: "close", + "Content-Type": "text/html", + "Content-Length": Buffer.byteLength(message), + ...headers + }; + socket.once("finish", socket.destroy); + socket.end( + `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r +` + Object.keys(headers).map((h) => `${h}: ${headers[h]}`).join("\r\n") + "\r\n\r\n" + message + ); + } + function abortHandshakeOrEmitwsClientError(server, req, socket, code, message, headers) { + if (server.listenerCount("wsClientError")) { + const err = new Error(message); + Error.captureStackTrace(err, abortHandshakeOrEmitwsClientError); + server.emit("wsClientError", err, socket, req); + } else { + abortHandshake(socket, code, message, headers); + } + } + } +}); + +// node_modules/ws/index.js +var require_ws = __commonJS({ + "node_modules/ws/index.js"(exports2, module2) { + "use strict"; + var createWebSocketStream = require_stream(); + var extension = require_extension(); + var PerMessageDeflate = require_permessage_deflate(); + var Receiver = require_receiver(); + var Sender = require_sender(); + var subprotocol = require_subprotocol(); + var WebSocket = require_websocket(); + var WebSocketServer = require_websocket_server(); + WebSocket.createWebSocketStream = createWebSocketStream; + WebSocket.extension = extension; + WebSocket.PerMessageDeflate = PerMessageDeflate; + WebSocket.Receiver = Receiver; + WebSocket.Sender = Sender; + WebSocket.Server = WebSocketServer; + WebSocket.subprotocol = subprotocol; + WebSocket.WebSocket = WebSocket; + WebSocket.WebSocketServer = WebSocketServer; + module2.exports = WebSocket; + } +}); + +// src/host.js +var require_host = __commonJS({ + "src/host.js"(exports2, module2) { + "use strict"; + var { EventEmitter } = require("events"); + function parseArgs2(argv) { + const found = {}; + for (let i = 0; i < argv.length - 1; i += 1) { + switch (argv[i]) { + case "-port": + found.port = argv[i + 1]; + break; + case "-pluginUUID": + found.uuid = argv[i + 1]; + break; + case "-registerEvent": + found.registerEvent = argv[i + 1]; + break; + case "-info": + found.info = argv[i + 1]; + break; + default: + break; + } + } + let info = {}; + try { + info = JSON.parse(found.info || "{}"); + } catch { + info = {}; + } + return { port: found.port, uuid: found.uuid, registerEvent: found.registerEvent, info }; + } + var WS_OPEN = 1; + var StreamDockHost2 = class extends EventEmitter { + /** + * @param {{port: string|number, uuid: string, registerEvent: string, info?: object}} args + * @param {{WebSocket?: Function}} [deps] - Ersatz fuer das ws-Paket (Tests) + */ + constructor(args, deps = {}) { + super(); + this.port = args.port; + this.uuid = args.uuid; + this.registerEvent = args.registerEvent; + this.info = args.info || {}; + this.WebSocket = deps.WebSocket || require_ws(); + this.ws = null; + } + get language() { + return this.info.application && this.info.application.language || "en"; + } + connect() { + this.ws = new this.WebSocket(`ws://127.0.0.1:${this.port}`); + this.ws.on("open", () => { + this._send({ uuid: this.uuid, event: this.registerEvent }); + this.emit("open"); + }); + this.ws.on("message", (raw) => { + let message; + try { + message = JSON.parse(raw.toString()); + } catch { + return; + } + this.emit("event", message); + }); + this.ws.on("close", () => this.emit("close")); + this.ws.on("error", (error) => this.emit("error", error)); + } + close() { + if (this.ws) this.ws.close(); + } + // ------------------------------------------------------------- Befehle + setTitle(context, title) { + this._send({ event: "setTitle", context, payload: { target: 0, title: String(title ?? "") } }); + } + /** image = Data-URI (PNG/JPEG/SVG); ohne Wert wird das Standardbild des Zustands wiederhergestellt. */ + setImage(context, image) { + const payload = { target: 0 }; + if (image) payload.image = image; + this._send({ event: "setImage", context, payload }); + } + setState(context, state) { + this._send({ event: "setState", context, payload: { state } }); + } + setSettings(context, settings) { + this._send({ event: "setSettings", context, payload: settings }); + } + getSettings(context) { + this._send({ event: "getSettings", context }); + } + showAlert(context) { + this._send({ event: "showAlert", context }); + } + showOk(context) { + this._send({ event: "showOk", context }); + } + sendToPropertyInspector(action, context, payload) { + this._send({ event: "sendToPropertyInspector", action, context, payload }); + } + _send(message) { + if (this.ws && this.ws.readyState === WS_OPEN) { + this.ws.send(JSON.stringify(message)); + } + } + }; + module2.exports = { StreamDockHost: StreamDockHost2, parseArgs: parseArgs2 }; + } +}); + +// src/playtubeClient.js +var require_playtubeClient = __commonJS({ + "src/playtubeClient.js"(exports2, module2) { + "use strict"; + var net = require("net"); + var os = require("os"); + var path2 = require("path"); + var { EventEmitter } = require("events"); + var PIPE_PREFIX = "Playtube.Remote."; + var PIPE_NAMES = ["Playtube", "PlaytubeDev", "PlaytubeEdge", "PlaytubeEdgeDev"]; + var MAX_BUFFER_CHARS = 1 << 20; + var PlaytubeError = class extends Error { + constructor(code, message) { + super(message); + this.name = "PlaytubeError"; + this.code = code; + } + }; + function pipePath(name, platform = process.platform) { + const full = PIPE_PREFIX + name; + return platform === "win32" ? `\\\\.\\pipe\\${full}` : path2.join(os.tmpdir(), full); + } + var PlaytubeClient2 = class extends EventEmitter { + /** + * @param {object} [options] + * @param {string[]} [options.pipeNames] + * @param {string} [options.platform] + * @param {Function} [options.connect] - Ersatz fuer net.connect (Tests) + * @param {number} [options.requestTimeoutMs] + * @param {number[]} [options.backoffMs] + */ + constructor(options = {}) { + super(); + this.pipeNames = options.pipeNames || PIPE_NAMES; + this.platform = options.platform || process.platform; + this.connectFn = options.connect || net.connect; + this.requestTimeoutMs = options.requestTimeoutMs ?? 3e3; + this.backoffMs = options.backoffMs || [300, 600, 1200, 2500, 5e3]; + this.socket = null; + this.connected = false; + this.pipeName = null; + this.running = false; + this._nextId = 1; + this._pending = /* @__PURE__ */ new Map(); + this._buffer = ""; + this._failedRounds = 0; + this._retryTimer = null; + } + start() { + if (this.running) return; + this.running = true; + this._attempt(0); + } + stop() { + this.running = false; + clearTimeout(this._retryTimer); + this._retryTimer = null; + const socket = this.socket; + this.socket = null; + if (this.connected) { + this.connected = false; + this._rejectAll(new PlaytubeError("stopped", "Client gestoppt")); + } + if (socket) socket.destroy(); + } + /** + * Schickt einen Befehl und wartet auf die Antwort. + * @param {string} cmd + * @param {object} [fields] - target / value / playlist (undefined-Werte werden weggelassen) + * @returns {Promise} die komplette Antwort ({ok: true, ...}) + */ + request(cmd, fields = {}) { + if (!this.connected || !this.socket) { + return Promise.reject(new PlaytubeError("not_connected", "Playtube ist nicht verbunden")); + } + const id = this._nextId++; + const payload = { id, cmd }; + for (const [key, value] of Object.entries(fields)) { + if (value !== void 0 && value !== null) payload[key] = value; + } + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + this._pending.delete(id); + reject(new PlaytubeError("timeout", `Keine Antwort von Playtube auf "${cmd}"`)); + }, this.requestTimeoutMs); + this._pending.set(id, { resolve, reject, timer }); + this.socket.write(`${JSON.stringify(payload)} +`, (error) => { + if (error && this._pending.delete(id)) { + clearTimeout(timer); + reject(new PlaytubeError("write_failed", error.message)); + } + }); + }); + } + async status() { + const response = await this.request("status"); + if (!response.state) throw new PlaytubeError("bad_response", 'Status ohne "state"'); + return response.state; + } + async listPlaylists() { + const response = await this.request("list_playlists"); + return Array.isArray(response.playlists) ? response.playlists : []; + } + playPlaylist(playlistId) { + return this.request("play_playlist", { playlist: playlistId }); + } + // ------------------------------------------------------------------ intern + _attempt(index) { + if (!this.running) return; + if (index >= this.pipeNames.length) { + this._scheduleRetry(); + return; + } + const name = this.pipeNames[index]; + const socket = this.connectFn(pipePath(name, this.platform)); + let opened = false; + socket.setEncoding("utf8"); + socket.once("connect", () => { + if (!this.running) { + socket.destroy(); + return; + } + opened = true; + this.socket = socket; + this.connected = true; + this.pipeName = name; + this._failedRounds = 0; + this._buffer = ""; + this.emit("connected", name); + }); + socket.on("data", (chunk) => { + if (socket === this.socket) this._onData(chunk); + }); + socket.on("error", () => { + }); + socket.on("close", () => { + if (!opened) { + this._attempt(index + 1); + } else if (socket === this.socket) { + this._onLost(); + } + }); + } + _onLost() { + this.socket = null; + this.connected = false; + this.pipeName = null; + this._rejectAll(new PlaytubeError("disconnected", "Verbindung zu Playtube getrennt")); + this.emit("disconnected"); + this._failedRounds = 0; + this._scheduleRetry(); + } + _scheduleRetry() { + if (!this.running) return; + const delay = this.backoffMs[Math.min(this._failedRounds, this.backoffMs.length - 1)]; + this._failedRounds += 1; + this._retryTimer = setTimeout(() => this._attempt(0), delay); + } + _onData(chunk) { + this._buffer += chunk; + let newline; + while ((newline = this._buffer.indexOf("\n")) >= 0) { + const line = this._buffer.slice(0, newline).trim(); + this._buffer = this._buffer.slice(newline + 1); + if (line) this._onLine(line); + } + if (this._buffer.length > MAX_BUFFER_CHARS) { + this._buffer = ""; + if (this.socket) this.socket.destroy(); + } + } + _onLine(line) { + let message; + try { + message = JSON.parse(line); + } catch { + return; + } + const entry = this._pending.get(message.id); + if (!entry) return; + this._pending.delete(message.id); + clearTimeout(entry.timer); + if (message.ok) { + entry.resolve(message); + } else { + entry.reject(new PlaytubeError("remote", message.error || "Fehler in Playtube")); + } + } + _rejectAll(error) { + for (const entry of this._pending.values()) { + clearTimeout(entry.timer); + entry.reject(error); + } + this._pending.clear(); + } + }; + module2.exports = { PlaytubeClient: PlaytubeClient2, PlaytubeError, pipePath, PIPE_NAMES, PIPE_PREFIX }; + } +}); + +// src/actions.js +var require_actions = __commonJS({ + "src/actions.js"(exports2, module2) { + "use strict"; + var PREFIX = "com.fojadrachi.playtube."; + var DEFAULTS = Object.freeze({ + target: "auto", + // "auto" | "youtube" | "music" + step: 5, + // Lautstaerke-Schritt in Prozent + volume: 30, + // Ziel-Lautstaerke der Aktion "Lautstaerke setzen" + seconds: 10, + // Sprungweite beim Vor-/Zurueckspulen + tab: "toggle", + // Aktion "Tab wechseln": "toggle" | "youtube" | "music" + playlistId: "", + playlistTitle: "" + }); + var TARGETS = ["auto", "youtube", "music"]; + var TABS = ["toggle", "youtube", "music"]; + function clampInt(value, min, max, fallback) { + const number = Number.parseInt(value, 10); + if (!Number.isFinite(number)) return fallback; + return Math.max(min, Math.min(max, number)); + } + function normalizeSettings(raw, titleDefault = false) { + const settings = { ...DEFAULTS, ...raw || {} }; + if (!TARGETS.includes(settings.target)) settings.target = DEFAULTS.target; + if (!TABS.includes(settings.tab)) settings.tab = DEFAULTS.tab; + settings.step = clampInt(settings.step, 1, 25, DEFAULTS.step); + settings.volume = clampInt(settings.volume, 0, 100, DEFAULTS.volume); + settings.seconds = clampInt(settings.seconds, 1, 300, DEFAULTS.seconds); + const show = raw && raw.showTitle !== void 0 ? raw.showTitle : titleDefault; + settings.showTitle = show === true || show === "true"; + settings.playlistId = typeof settings.playlistId === "string" ? settings.playlistId.trim() : ""; + settings.playlistTitle = typeof settings.playlistTitle === "string" ? settings.playlistTitle : ""; + return settings; + } + function pickTab(state, target) { + if (!state || !state.tabs) return null; + const name = target === "auto" ? state.activeTab : target; + const info = state.tabs[name]; + return info ? { name, info } : null; + } + function wrapTitle(text, perLine = 8, maxLines = 3) { + const words = String(text || "").trim().split(/\s+/).filter(Boolean); + const lines = []; + let current = ""; + let truncated = false; + const push = (line) => { + if (lines.length < maxLines) lines.push(line); + else truncated = true; + }; + for (let word of words) { + while (word.length > perLine) { + if (current) { + push(current); + current = ""; + } + push(word.slice(0, perLine)); + word = word.slice(perLine); + } + if (!word) continue; + if (!current) current = word; + else if (current.length + 1 + word.length <= perLine) current += ` ${word}`; + else { + push(current); + current = word; + } + } + if (current) push(current); + if (truncated && lines.length) lines[lines.length - 1] = `${lines[lines.length - 1].slice(0, perLine - 2)}..`; + return lines.join("\n"); + } + function volumeTitle(tab) { + const volume = tab && tab.info.volume; + return typeof volume === "number" ? `${Math.round(volume)}%` : ""; + } + var OFFLINE_TITLE = "Playtube\noffline"; + var DEFINITIONS = { + playpause: { + titleDefault: false, + request: (s) => ({ cmd: "play_pause", fields: { target: s.target } }), + render: (s, state, connected) => { + if (!connected) return { state: 0, title: s.showTitle ? OFFLINE_TITLE : "" }; + const tab = pickTab(state, s.target); + return { + state: tab && tab.info.playing ? 1 : 0, + title: s.showTitle && tab && tab.info.title ? wrapTitle(tab.info.title) : "" + }; + } + }, + next: { request: (s) => ({ cmd: "next", fields: { target: s.target } }) }, + previous: { request: (s) => ({ cmd: "previous", fields: { target: s.target } }) }, + seekback: { + request: (s) => ({ cmd: "seek", fields: { target: s.target, value: -s.seconds } }), + render: (s) => ({ title: `-${s.seconds}s` }) + }, + seekforward: { + request: (s) => ({ cmd: "seek", fields: { target: s.target, value: s.seconds } }), + render: (s) => ({ title: `+${s.seconds}s` }) + }, + volumeup: { + press: "down", + repeat: { delayMs: 450, intervalMs: 140 }, + request: (s) => ({ cmd: "volume_change", fields: { target: s.target, value: s.step } }), + render: (s, state, connected) => ({ title: connected ? volumeTitle(pickTab(state, s.target)) : "" }) + }, + volumedown: { + press: "down", + repeat: { delayMs: 450, intervalMs: 140 }, + request: (s) => ({ cmd: "volume_change", fields: { target: s.target, value: -s.step } }), + render: (s, state, connected) => ({ title: connected ? volumeTitle(pickTab(state, s.target)) : "" }) + }, + volumeset: { + request: (s) => ({ cmd: "set_volume", fields: { target: s.target, value: s.volume } }), + render: (s) => ({ title: `${s.volume}%` }) + }, + mute: { + request: (s) => ({ cmd: "mute_toggle", fields: { target: s.target } }), + render: (s, state, connected) => { + const tab = connected ? pickTab(state, s.target) : null; + return { state: tab && tab.info.muted ? 1 : 0, title: tab && !tab.info.muted ? volumeTitle(tab) : "" }; + } + }, + nowplaying: { + titleDefault: true, + request: (s) => ({ cmd: "play_pause", fields: { target: s.target } }), + render: (s, state, connected) => { + if (!connected) return { coverUrl: null, title: s.showTitle ? OFFLINE_TITLE : "" }; + const tab = pickTab(state, s.target); + const info = tab && tab.info; + return { + coverUrl: info && info.hasVideo && info.thumbnail ? info.thumbnail : null, + title: s.showTitle && info && info.title ? wrapTitle(info.title) : "" + }; + } + }, + like: { + request: (s) => ({ cmd: "like", fields: { target: s.target } }), + render: (s, state, connected) => { + const tab = connected ? pickTab(state, s.target) : null; + return { state: tab && tab.info.likeStatus === "like" ? 1 : 0 }; + } + }, + shuffle: { request: (s) => ({ cmd: "shuffle", fields: { target: s.target } }) }, + repeat: { + request: (s) => ({ cmd: "repeat", fields: { target: s.target } }), + render: (s, state, connected) => { + const tab = connected ? pickTab(state, s.target) : null; + const mode = String(tab && tab.info.repeatMode || "").toUpperCase(); + return { state: mode === "ALL" ? 1 : mode === "ONE" ? 2 : 0 }; + } + }, + playlist: { + request: (s) => s.playlistId ? { cmd: "play_playlist", fields: { playlist: s.playlistId } } : null, + render: (s) => ({ title: s.playlistTitle ? wrapTitle(s.playlistTitle) : "" }) + }, + switchtab: { + request: (s) => ({ cmd: "switch_tab", fields: { target: s.tab === "toggle" ? "auto" : s.tab } }), + render: (s, state, connected) => { + if (!connected || !state) return { title: "" }; + if (state.visibleTab === "music") return { title: "Music" }; + if (state.visibleTab === "youtube") return { title: "YouTube" }; + return { title: "" }; + } + }, + show: { request: () => ({ cmd: "show", fields: {} }) } + }; + function actionIdFromUuid(uuid) { + if (typeof uuid !== "string" || !uuid.startsWith(PREFIX)) return null; + const id = uuid.slice(PREFIX.length); + return Object.prototype.hasOwnProperty.call(DEFINITIONS, id) ? id : null; + } + function renderAction(id, rawSettings, state, connected) { + const definition = DEFINITIONS[id]; + const settings = normalizeSettings(rawSettings, definition.titleDefault); + return definition.render ? definition.render(settings, state, connected) : {}; + } + function buildRequest(id, rawSettings) { + const definition = DEFINITIONS[id]; + const settings = normalizeSettings(rawSettings, definition.titleDefault); + return definition.request(settings); + } + module2.exports = { + PREFIX, + DEFAULTS, + DEFINITIONS, + normalizeSettings, + pickTab, + wrapTitle, + actionIdFromUuid, + renderAction, + buildRequest + }; + } +}); + +// src/infoPanel.js +var require_infoPanel = __commonJS({ + "src/infoPanel.js"(exports2, module2) { + "use strict"; + var { wrapTitle } = require_actions(); + var SIZE = 144; + var BACKGROUND = "#171b24"; + var ACCENT = "#ff4d5e"; + var TRACK = "#3a4152"; + var MUTED_TEXT = "#c3c9d6"; + var BAR_X = 10; + var BAR_WIDTH = SIZE - 2 * BAR_X; + var BAR_Y = 132; + var BAR_HEIGHT = 6; + var TITLE_LINE_HEIGHT = 25; + var TITLE_BASELINE_OFFSET = 7; + var FONT = 'font-family="Segoe UI, Arial, sans-serif"'; + var XML_ESCAPES = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }; + function escapeXml(text) { + return String(text).replace(/[&<>"']/g, (char) => XML_ESCAPES[char]); + } + function formatTime(seconds) { + if (!Number.isFinite(seconds) || seconds < 0) return "0:00"; + const whole = Math.floor(seconds); + return `${Math.floor(whole / 60)}:${String(whole % 60).padStart(2, "0")}`; + } + function textLines(text, x, y, lineHeight, size, color, weight, anchor = "middle") { + return String(text).split("\n").filter(Boolean).map((line, index) => `${escapeXml(line)}`).join(""); + } + function noteMarkup(cx, cy, scale) { + const s = scale; + return ``; + } + function backgroundMarkup(coverDataUri) { + if (!coverDataUri) return `${noteMarkup(72, 44, 1.1)}`; + return ``; + } + function shadeMarkup() { + return ``; + } + function playStateMarkup(playing) { + const cx = 118; + const cy = 26; + const disc = ``; + if (playing) { + return `${disc}`; + } + return `${disc}`; + } + function buildInfoSvg(view) { + const head = ``; + if (!view) { + return `${head}${noteMarkup(72, 44, 1.1)}${textLines("Playtube offline", 72, 120, 0, 14, "#ffffff", "bold")}`; + } + const hasTrack = Boolean(view.title); + const ratio = view.duration > 0 ? Math.max(0, Math.min(1, view.currentTime / view.duration)) : 0; + const parts = [backgroundMarkup(view.coverDataUri), shadeMarkup()]; + if (hasTrack) { + const title = wrapTitle(view.title, 10, 2); + const lineCount = title.split("\n").length; + const blockCenter = view.subtitle ? SIZE / 2 - 12 : SIZE / 2; + const firstBaseline = blockCenter - (lineCount - 1) * TITLE_LINE_HEIGHT / 2 + TITLE_BASELINE_OFFSET; + parts.push(textLines(title, SIZE / 2, firstBaseline, TITLE_LINE_HEIGHT, 22, "#ffffff", "bold")); + if (view.subtitle) { + const subtitleY = firstBaseline + (lineCount - 1) * TITLE_LINE_HEIGHT + 27; + parts.push(textLines(wrapTitle(view.subtitle, 13, 1), SIZE / 2, subtitleY, 0, 16, MUTED_TEXT, "normal")); + } + parts.push(playStateMarkup(view.playing)); + } else { + parts.push(textLines("Nichts spielt", 72, 120, 0, 14, "#ffffff", "bold")); + } + parts.push(``); + parts.push(``); + return `${head}${parts.join("")}`; + } + function svgToDataUri(svg) { + return `data:image/svg+xml;base64,${Buffer.from(svg, "utf8").toString("base64")}`; + } + module2.exports = { buildInfoSvg, svgToDataUri, formatTime, SIZE }; + } +}); + +// src/controller.js +var require_controller = __commonJS({ + "src/controller.js"(exports2, module2) { + "use strict"; + var { + DEFINITIONS, + actionIdFromUuid, + buildRequest, + normalizeSettings, + pickTab, + renderAction + } = require_actions(); + var { buildInfoSvg, svgToDataUri } = require_infoPanel(); + var POLL_INTERVAL_MS = 1e3; + var REFRESH_AFTER_COMMAND_MS = 350; + var COVER_CACHE_LIMIT = 24; + var COVER_TIMEOUT_MS = 4e3; + var KEY_IMAGE_PX = 144; + function sharpCoverUrl(url) { + return String(url).replace(/=w\d+-h\d+/, `=w${KEY_IMAGE_PX}-h${KEY_IMAGE_PX}`); + } + async function defaultFetchImage(url) { + const response = await fetch(url, { signal: AbortSignal.timeout(COVER_TIMEOUT_MS) }); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + const type = (response.headers.get("content-type") || "image/jpeg").split(";")[0]; + const bytes = Buffer.from(await response.arrayBuffer()); + return `data:${type};base64,${bytes.toString("base64")}`; + } + var Controller2 = class { + /** + * @param {object} deps + * @param {import('./host').StreamDockHost} deps.host + * @param {import('./playtubeClient').PlaytubeClient} deps.client + * @param {{info: Function, warn: Function, error: Function}} deps.logger + * @param {Function} [deps.fetchImage] - (url) => Promise + * @param {number} [deps.pollIntervalMs] + */ + constructor({ host, client, logger, fetchImage, pollIntervalMs }) { + this.host = host; + this.client = client; + this.logger = logger; + this.fetchImage = fetchImage || defaultFetchImage; + this.pollIntervalMs = pollIntervalMs ?? POLL_INTERVAL_MS; + this.keys = /* @__PURE__ */ new Map(); + this.state = null; + this.covers = /* @__PURE__ */ new Map(); + this.coverLoading = /* @__PURE__ */ new Set(); + this.repeaters = /* @__PURE__ */ new Map(); + this.pollTimer = null; + this.refreshTimer = null; + this.polling = false; + } + start() { + this.host.on("event", (message) => this.handleEvent(message)); + this.client.on("connected", (name) => { + this.logger.info(`Mit Playtube verbunden (${name})`); + this.poll(); + }); + this.client.on("disconnected", () => { + this.logger.info("Verbindung zu Playtube getrennt"); + this.state = null; + this.renderAll(); + }); + this.client.start(); + this.pollTimer = setInterval(() => this.poll(), this.pollIntervalMs); + } + stop() { + clearInterval(this.pollTimer); + clearTimeout(this.refreshTimer); + for (const context of [...this.repeaters.keys()]) this.stopRepeat(context); + this.client.stop(); + } + // ------------------------------------------------------------ Ereignisse + handleEvent(message) { + const { event, context } = message; + switch (event) { + case "willAppear": + return this.onAppear(message); + case "willDisappear": + this.stopRepeat(context); + this.keys.delete(context); + return void 0; + case "didReceiveSettings": + return this.onSettings(message); + case "keyDown": + return this.onKeyDown(context); + case "keyUp": + return this.onKeyUp(context); + case "sendToPlugin": + return this.onPropertyInspectorMessage(message); + default: + return void 0; + } + } + onAppear(message) { + const actionId = actionIdFromUuid(message.action); + if (!actionId) return; + const payload = message.payload || {}; + const settings = payload.settings || {}; + const info = payload.controller === "Information"; + this.logger.info(`willAppear ${actionId} controller=${payload.controller} info=${info}`); + this.keys.set(message.context, { actionId, settings, info, last: null }); + this.renderKey(message.context); + if (this.client.connected && !this.state) this.poll(); + } + onSettings(message) { + const key = this.keys.get(message.context); + if (!key) return; + key.settings = message.payload && message.payload.settings || {}; + key.last = null; + this.renderKey(message.context); + } + onKeyDown(context) { + const key = this.keys.get(context); + if (!key) return; + const definition = DEFINITIONS[key.actionId]; + if (definition.press !== "down") return; + this.execute(context); + const { delayMs, intervalMs } = definition.repeat || {}; + if (!delayMs) return; + this.stopRepeat(context); + const timers = {}; + timers.delayTimer = setTimeout(() => { + timers.intervalTimer = setInterval(() => this.execute(context, { quiet: true }), intervalMs); + }, delayMs); + this.repeaters.set(context, timers); + } + onKeyUp(context) { + const key = this.keys.get(context); + if (!key) return; + if (DEFINITIONS[key.actionId].press === "down") { + this.stopRepeat(context); + return; + } + this.execute(context); + } + stopRepeat(context) { + const timers = this.repeaters.get(context); + if (!timers) return; + clearTimeout(timers.delayTimer); + clearInterval(timers.intervalTimer); + this.repeaters.delete(context); + } + // ------------------------------------------------------------ Befehle + /** Fuehrt die Aktion einer Taste aus; `quiet` = kein Alarm bei Fehler (Dauerdruck). */ + async execute(context, { quiet = false } = {}) { + const key = this.keys.get(context); + if (!key) return; + const request = buildRequest(key.actionId, key.settings); + if (!request) { + this.host.showAlert(context); + return; + } + try { + await this.client.request(request.cmd, request.fields); + this.scheduleRefresh(); + } catch (error) { + this.logger.warn(`${request.cmd} fehlgeschlagen: ${error.message}`); + if (quiet) this.stopRepeat(context); + else this.host.showAlert(context); + } + } + scheduleRefresh() { + clearTimeout(this.refreshTimer); + this.refreshTimer = setTimeout(() => this.poll(), REFRESH_AFTER_COMMAND_MS); + } + // ------------------------------------------------------------ Status + async poll() { + if (this.polling || !this.client.connected || this.keys.size === 0) return; + this.polling = true; + try { + this.state = await this.client.status(); + this.renderAll(); + } catch (error) { + this.logger.warn(`Status nicht lesbar: ${error.message}`); + } finally { + this.polling = false; + } + } + renderAll() { + for (const context of this.keys.keys()) this.renderKey(context); + } + renderKey(context) { + const key = this.keys.get(context); + if (!key) return; + if (key.info && key.actionId === "nowplaying") { + this.renderInfo(context, key); + return; + } + const view = renderAction(key.actionId, key.settings, this.state, this.client.connected); + const coverUrl = view.coverUrl ? sharpCoverUrl(view.coverUrl) : null; + const cover = coverUrl ? this.covers.get(coverUrl) || null : null; + if (coverUrl && !cover) this.loadCover(coverUrl); + const next = { state: view.state, title: view.title, cover: cover ? coverUrl : null }; + const previous = key.last || {}; + const changed = (name) => previous[name] !== next[name]; + key.last = next; + if (view.state !== void 0 && changed("state")) this.host.setState(context, view.state); + if (view.title !== void 0 && changed("title")) this.host.setTitle(context, view.title); + if (view.coverUrl !== void 0 && changed("cover")) this.host.setImage(context, cover); + } + /** Hohes Info-Display: komplette "Aktueller Titel"-Karte als SVG-Bild. */ + renderInfo(context, key) { + let view = null; + if (this.client.connected) { + const tab = pickTab(this.state, normalizeSettings(key.settings).target); + const info = tab && tab.info || {}; + const coverUrl = info.thumbnail ? sharpCoverUrl(info.thumbnail) : null; + const coverDataUri = coverUrl ? this.covers.get(coverUrl) || null : null; + if (coverUrl && !coverDataUri) this.loadCover(coverUrl); + view = { + title: info.title || "", + subtitle: info.subtitle || "", + playing: Boolean(info.playing), + currentTime: info.currentTime, + duration: info.duration, + volume: info.volume, + coverDataUri + }; + } + const svg = buildInfoSvg(view); + if (svg === key.lastSvg) return; + key.lastSvg = svg; + this.host.setTitle(context, ""); + this.host.setImage(context, svgToDataUri(svg)); + } + async loadCover(url) { + if (this.coverLoading.has(url)) return; + this.coverLoading.add(url); + try { + const dataUri = await this.fetchImage(url); + this.covers.set(url, dataUri); + while (this.covers.size > COVER_CACHE_LIMIT) this.covers.delete(this.covers.keys().next().value); + this.renderAll(); + } catch (error) { + this.logger.warn(`Cover nicht ladbar: ${error.message}`); + } finally { + this.coverLoading.delete(url); + } + } + // ------------------------------------------------------------ Property Inspector + async onPropertyInspectorMessage(message) { + const payload = message.payload || {}; + if (payload.command !== "requestPlaylists") return; + const reply = (body) => this.host.sendToPropertyInspector(message.action, message.context, body); + if (!this.client.connected) { + reply({ command: "playlists", ok: false, error: "offline", playlists: [] }); + return; + } + try { + const playlists = await this.client.listPlaylists(); + reply({ command: "playlists", ok: true, playlists }); + } catch (error) { + this.logger.warn(`Playlists nicht lesbar: ${error.message}`); + reply({ command: "playlists", ok: false, error: error.code || "error", message: error.message, playlists: [] }); + } + } + }; + module2.exports = { Controller: Controller2, sharpCoverUrl }; + } +}); + +// src/logger.js +var require_logger = __commonJS({ + "src/logger.js"(exports2, module2) { + "use strict"; + var fs = require("fs"); + var path2 = require("path"); + var MAX_BYTES = 512 * 1024; + function createLogger2(directory) { + const file = path2.join(directory, "plugin.log"); + let ready = false; + function ensure() { + if (ready) return true; + try { + fs.mkdirSync(directory, { recursive: true }); + ready = true; + } catch { + ready = false; + } + return ready; + } + function write(level, message) { + if (!ensure()) return; + try { + try { + if (fs.statSync(file).size > MAX_BYTES) fs.renameSync(file, path2.join(directory, "plugin.old.log")); + } catch { + } + fs.appendFileSync(file, `${(/* @__PURE__ */ new Date()).toISOString()} ${level} ${message} +`); + } catch { + } + } + const describe = (value) => value instanceof Error ? value.stack || value.message : String(value); + return { + info: (message) => write("INFO ", describe(message)), + warn: (message) => write("WARN ", describe(message)), + error: (message) => write("ERROR", describe(message)) + }; + } + module2.exports = { createLogger: createLogger2 }; + } +}); + +// src/main.js +var path = require("path"); +var { StreamDockHost, parseArgs } = require_host(); +var { PlaytubeClient } = require_playtubeClient(); +var { Controller } = require_controller(); +var { createLogger } = require_logger(); +var EXIT_GRACE_MS = 2e3; +function main() { + const args = parseArgs(process.argv.slice(2)); + const logger = createLogger(path.join(__dirname, "..", "log")); + if (!args.port || !args.uuid || !args.registerEvent) { + logger.error(`Ungueltige Startparameter: ${process.argv.slice(2).join(" ")}`); + process.exit(1); + } + process.on("uncaughtException", (error) => logger.error(error)); + process.on("unhandledRejection", (error) => logger.error(error)); + const host = new StreamDockHost(args); + const pipeNames = process.env.PLAYTUBE_PIPE_NAMES ? process.env.PLAYTUBE_PIPE_NAMES.split(",") : void 0; + const client = new PlaytubeClient({ pipeNames }); + const controller = new Controller({ host, client, logger }); + controller.start(); + host.on("open", () => logger.info(`Bei Stream Dock registriert (Port ${args.port})`)); + host.on("error", (error) => logger.warn(`WebSocket-Fehler: ${error.message}`)); + host.on("close", () => { + logger.info("Verbindung zu Stream Dock beendet"); + controller.stop(); + setTimeout(() => process.exit(0), EXIT_GRACE_MS).unref(); + }); + host.connect(); +} +main(); diff --git a/com.fojadrachi.playtube.sdPlugin/propertyInspector/index.html b/com.fojadrachi.playtube.sdPlugin/propertyInspector/index.html new file mode 100644 index 0000000..5d29eb5 --- /dev/null +++ b/com.fojadrachi.playtube.sdPlugin/propertyInspector/index.html @@ -0,0 +1,246 @@ + + + + + Playtube + + + +
+ + +
+ + + + + + + + + + + + + + + + + + diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/like_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/like_0.png new file mode 100644 index 0000000000000000000000000000000000000000..96e889296a43eade8bb4f5c12e430063b81924ab GIT binary patch literal 3118 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 M8yM@C>p4XH7b!F6)&Kwi literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/like_1.png b/com.fojadrachi.playtube.sdPlugin/static/btn/like_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d86f672f89d3f6f7a25c467361c7b22b03c1f5 GIT binary patch literal 2547 zcmXX|d00|e90hk$bIMFKYchu{9dk?=mr_$K zwJ^<^T+`gjQFA4i8nH|el@XV~HTA;=us_~C?>qP0`#Zn)eea%o>+~sm%`LmOKp+rJ zq65K2iVWGKrXn2$C&petAh0?j;TQ!Ro*m)1x}HI(iq@%|u$lJ`{0}KTg(!TCH9p3& z_tV>6e4$N)S#^V|x2>_7irRTiqdg(l2^U5U5{8CuyGtJR);h)0($br;E0gP`YwoKT zMoMB|2*Ly_1D#qx!Kl6`4;y|lJ1%&fs(NR!{yCvZaAtf}k*y%<>jWenZ}P89f_QHB z!{j1LBl@RI)umYQa*iNA^M|!R|7t?yR?gSl&<1|5nP+UAznHtx5pgMZqjiBM7zNO4 zWETrW^1SyLoWGhBkRfO~fyeK7K-ZdH9T%ywS?-BbmWKJe5#{sBY$W?46I$nIeA3O_ z{&iF)D_`Km{O+7nr-yyKdn0~3ceTxN_qE{hmxc|$r7ric*h_$;o>P17W`>mU6Q5zo2>l{5Yj z8MH)>D#>*5g19j4K)HF1O^<-acOnRVAA%g_uONLRmw-8>&9=U|$H}Z515mXqQJehP z`MJMTq98+sp)1;IpiP58-sjc0ShNk?qBdy>6~v{jT_vr0~_yKUp@P zEdpa&T)*}nAyt>T#BKx(he{6Aoifl#Ur%H`!<--&kg3;Vrx%X)#fK;0*omPDrZC1D zSiigbbZp#>{>SaR40oN?c~|EU>ant@XIc_aJVnY+199_nS+v2|k$g%D!Y;orZjk>UokGRrVwh{`$9~%``PDb| zSJW=na=FihC`w2hY)PLoo?hx|RS!C1QyC19SS@hhavu*ipZ&P7``Hd@-KvYhO=2U% zI%oZ%cjZ-kru5)@$;5jY5VsJP{%AW>a< zLr#d7p-xbD)!&B9tYDv8{@(Mb{nuIh^A*$Rf;np~;=>>t>w0DS%FN#`?L#Zmv?yT2 z1j*5Y4P3L$5;t9rx%#zVd$OVN9Jz|wb2L4bW!;o&#Q_!W>JnT1v{Xqz-o!Rz`mgmt z-ew3z#z(4GN#3>X0T0}!NA3g#(xK**9dRNeU*mL32d%$-$o0LkCYc-; zs=!DgW0u$4?CNwHkGv|3AbF4-Tlj~e9cxU}Ofu%e4zD`OxyJ2XLv>bwKBM~p%*IA>O3COIYXxYaJNM*ED*%V=xV@EWwt+u6u@-p#oEh`qoo4I z2r7#*72bW&R&2MDk_M`%d*hI9>j#hC`RHhOyJohuQ+lpZ!p5$ZzBpXE4Gqi`oN)tG zkX6>r|L$CI3>PW^ANX(#^f4Y!tIF&$A;i40q=*y)W3p|WJwB$ptWdd}t5W^ChDGh{ zWkO7gWjBNqD(o@%V{f@3lNbM)WV`%*w$+4Blm;R*f1!R0J8A2i#)ax!+M8bK$@@|( zSlxZNrptcucvG1;Wk;-ij<$&;!K^)`uibRDtWH}*&_l9PZY|zX4!NGhgXM{_3gjY& zVnlC>Guz9ivP5LC>x12}*YJ!UP-ucQ)hrH;t++v_Q^Zck-{Do9blI19HAUFyI&sR? zW3|>O77q=^3^q zKZCUPflSaKzkM+ffngTI-gJQ7@WQz+nh~;oDCs`U|%vn>3X6|$~V~9m(Z{2}!B*2{k5MMb6Nrm1y=F>?bf8DzQWQF80e~Sx**M|A@NLvivImCzBf;WT8sb zVb^a;ztysrmrM$H@L%NSLUVoo=2G(<84^V1i1n1ss8rbudZ%we@6?Vr)|AB0N3*bNv7D__q-N literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/mute_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/mute_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6236bcf4e074f4bd6b23976a9b3d68d06835c7ac GIT binary patch literal 2646 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 Ql6etuuywVmJa8obA5-bR(*OVf literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/mute_1.png b/com.fojadrachi.playtube.sdPlugin/static/btn/mute_1.png new file mode 100644 index 0000000000000000000000000000000000000000..2362d13cf9481f0c8c535d71333f7b82a8c2b00d GIT binary patch literal 2433 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 LW>@&*f6o37WrxUq literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/nowplaying_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/nowplaying_0.png new file mode 100644 index 0000000000000000000000000000000000000000..2f61b9e725ac27c0bbbb05345d400f8f386086ce GIT binary patch literal 2249 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 literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/playpause_1.png b/com.fojadrachi.playtube.sdPlugin/static/btn/playpause_1.png new file mode 100644 index 0000000000000000000000000000000000000000..604b7e4e6354cc09d462bca0197df5fb0342c37b GIT binary patch literal 2117 zcmY+GX;c$g7RM_D2#{b9XgJ6aqT-|l#DmD96q*(UVOV0=roe87MFH7_fhN)-)%Lgo z0@~?TM*<9+LRbc9SsQJTMYbSI5E3FJr-=kRBtjaGHZxOI$$aoby-HQR`~Tm2-#fpT zn~XpoLxWug000>Jp7LTM_hR(Y(?v$9x3~iU^hmy5Uxct0ep?)3{>j&9PNJGm!sWX7FUS(=YJe|Z!6AQd6yqu z)7@hGAx@AdpH5kS%xe*K@^Yh+Bmc6{yV6@FVn&@#6Uw=B@}$?UGj_5_S@p-pIuAiq zhljK8>p8IY@^H?|<<0Gojl*lw2eg@kP|;!&R4;Guu&S45%XX>=s>y9=Hp-pC$P2cc zIX-hp)s(h=dtZBY{8Vpg{>*>4I@!;%FGw%(cb~s~)PKBdFXSXoIP+V9yLUkF(BoU~ zr)OU*Jmv=fbXJzhuX2~TN4l4^CH0jGoC8aFww**MR{pPbV`slFYrKW*x<>h~ufx}_ zEjpjS(G|E@oBBSLZ^+!K0E$e5boE%U&lPFdBAgEsSXHb#07q6Rl)^ytKCCdJF5xKq zIfAThee{<;$K6r=CX4A!E3cnI@;i~y}wLDdAyU@ z7m5+$M+yojq2F)S*7v%iGx~?7O9511StGEh^3XVStDPuhwIEF+7@RlviC~&Wu)X&i zE5w3q&imOEwbCZzu*7`PLiCiIv)TJ#q(U3khh1G~(A);@ViT5D)81sNd+`}s+A+?z z+E}WZc#DKLr%;Jg3eq4dP{ndV6J8c~zP>=iVMThX-ycF-U<`U1wtpF?6XYZCtec(- z4b2vO$L&tB`)AktFRm6!7p|K$K5bsob#Y$Tt?!DuCzxSGPiS*&>C1WV62gK61|RRz z1}h;m1&IbH{~?&-ik_VP{b>VkAC<_`D`u~Q=jmhX;6=c|ig%&E!Iben>Ru>pF#7i3 zSOncnQDB1vEllAeV*a}@LSzi1A!V`%y0A>9Y&vkDd{S9(SeRMDmVytm4&vKXQt&%J zG;9#&f;KaFv4_nVp7Dm|ZK+>eNEsG_|J)B8yFKLn=74$sldllR_=)`CB zp9~YFtm2gDaJ6U%-=d5OAtZde9TP$v*5WWp!y}Pdo|&inJG# zTH;h>Xo2HFow(@ZMdu8SsG`f93J}n_eI0=2Nk0&%6X%*M`nWraai9g2=&t`0+<^}E zOZO9cR`%El7%G@0U|gSt`-UXA`B(j1{9&G`{~-aX(Z2?^Plo5Xzu3|v7lGr4bIK_(XE4MmpWw=Ooqw5Iq9dob=mTQtX}#64 z`a6?fkoF|kKB+M`GkD_|kwvM3PYlKWD!w!Mf4~}|2aIhm|dI_<1m(iDMwcJU}(2R11^C) zOyCfR;ro^p8hwdUlx)r0_=JWRMHx0~=xyxL#V9I41&0+q{%YZ#0Ft+C=(qs7^<_z_#( u*kMA$V;J6WP-oPNLo+w$edOoL^Li&-k}DmWUm<@F0N;~=UX3UIcIAI>hq#*n literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/previous_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/previous_0.png new file mode 100644 index 0000000000000000000000000000000000000000..a7349cc14701d5c65f7feee427ca4eaeb33fe56d GIT binary patch literal 2618 zcmY+Gd0Y}}7sqG7B^R<>D+uuwqpb9%W|?T*%mOR7FjKkOVqpuKdP~$6Qp?hA5MDJc zDV5Z$>>`?`tuC1@B3Kr4Sm0 zq||8F1MxGRFYkD?<@xHN6+K&=DqSubxr+1HKxw&@1HWCnEdW#9)`)<8QtW5zTIZxtJu%+O99`f zf_ku^#XTuz60=QQX-P?)rs_{VF*n5|w&z{0NVS?A z9L-f)cQ`iB3b;2PhWx{PX7s78Ha7kN9B=8D92c6AFtP)~kLPAfv2 zqnND3!7Eq;*iTQicFw=_`$8Sa!j2`z{}PJ+&*_hV z%9W2qz!KNM66JE;02UNzJ@foXB3UVY&VFeSwwE)v3~NrqZKuME)nQ2ZNd37ixg&Jj|y|5rtKvpeP#6(PBC1X-y|sIS%O z*;$0>S^WzCp~pL(52WPCF+lHh5Z3CZf1Sb5%f{-~b;HrqVEr?Lkn+O-SKg7fj#QdR zFJHSo;A|UGbOhkWZw0wF6LRo9mM3kn_#XO2%;v58c5;&;7R^aG>mW;|gM}8v{fspg zu@f^M&S5Xr@am$?)kYHj4_RhEq7WqhB*d4rR(i>!kCV9a^?+h_XO>QZY;2Lsc$uqH z*hd6jO~ePuFJgI%kd0{wY8Lanzxm%ft>IITv^hAUHs|m3gh0Rt&HHm;e1BqZ94nA~ zp~_ZzOp558MIW@fdAQ0}W_+fbL&M-4n0dM+8)pwWSYH=870gLXTEx{sCM8$p0u;rA zT4V_U>rrm*qL+l>CWCk_5w+Sv!auoaN}Ifdm)%@2V)n2xX*nrEu6CT{{iHA!#G~}0 z$X2?`muY+a;{|dB7Us>RZxN7VNI+E+hZf?>Alb+hR+03-PSiLd#tlTNDQ5n|ZTtvp zBnLyxeql{XDPH_W2e)x7VMD*0J>CRK*2fxfE@dT*6|FYLJ(cS|a8Ex;wkpZnLGqR- zKv5rLFCzklcD#&+)MDNGT7a8CXk~_*aynwK8nh8fsWp+0S5t!0!y%u2+E9#zI-CTQ z97Afczd7Fh@W-E5i;duvGmXzdWs8W3(<^wy+_ZGU2(3(*jUrcx(b$`@2dZu5v`hAN zUpV{&P>Bh$Z|aA<8yL|b^)T^vgHO=;-YQm3j{GVs81uacVQIm;62w2bl&f>E9LZ55 zHW}lz2wPGDf#{k@iYZsb;7%R@xpDN0F~lM7%V;4OU1MNq_rGj~!!#0&`13G%CaLg{ zMc{=CRR%(UQa*@#pB4F2FLNFEur`J2GCoaZtQ2Dxo+C7Wb2#K3THlF?h^O!V#-Zur zD9ocI{i5At8iVyrE9a%zqYp7Y|8^@$bnUu0!s54zQij`u5ivHr+n3K3E>>j&!3)1!eE z8XP>)9;X$h9|0OoFz)!b+nM;UFyI&x>+_r?d|HS@59ldy)Y^KgeZekmRZpKmTbgkA zkpX>ywx7(rnBE$=#lAy%QWn!>>9Hc;D+sbSR-OFH=?#$-7ofw<HTo~7@x3p3j2rsr>eTSLVado4UvNDCE~ERMS|3u8 zgm^W`QtPT8Wbr2%2X?cbe0@A*eS8C@qZhkNqcM4BjyyQixfDr)!Uh23)By`bR)S@4-$Y%eT zRV2vq^VnT9Y+?SF+EZzvb9iT{@XS_jm`JZykyI#_xT**_XWyw*QY(~>Hz)^zGG>G^ zJOIp}8yM=8z^oCzAGcR24In571T2pMQy-cmzFsW*1>?P|VPzPi!XS+M|8SOyl@rPs jM)@BZi#}gmH>i30#bn-ZY{SdYObAe1-8UC)+7tI5&()rr literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/repeat_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/repeat_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e29b768ae7e762fcc9d9319ff91492267f5ef04c GIT binary patch literal 912 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q4M;wBd$farfjQjM#WAGf*4w-G*};J_#~<#I zRG<4QWO+_$)^aP+=}jJvOCDTsJQKvdv}-}rf@rbA;(`x%V}G(PT6*Nq&gW|1=Ty&o zxOt`Xrw?0gcYaSR`G0T6#9L;clsFU^RT@|(uuNbOa$xdc@?hWu3V?+eCV_>30w5u* zYAzV;w)lTTM$U%W(9IA3$Al4&}E)we#Mk2!@Z$x zmm9-dfeQjaK{*EA%wC39oEHMFaV(g}ICY;JLn_0HC#Fmq$_}dQ1RZ8FYUTDaoDvDp z%$_2;VEXy>>H2jgWmPxl%-f^4>3e>C3Db%e(^E_r{@n}w{Pgg8zxXc;r@od-Wqk4M zleJ3gx{Dg^Ul|wQF?}U_;p9hcji@q%I<9~{90obpuFlRhuKRL?iE&Hi$LM+Tix{=4 zO1qd!OlO|^=i_;Fw(XOvnp^=gTGy(C=DvQ#5W=uvPB{C59!A}$xqsW;>+RJn?P?eW z9A2+Kx2SlN!?e?xCJvGezwV#6IvqFr^JeJ=hNyp={c7HAee?d=1}BEEEE#j}ZwUKq zZFg#g$c0_|6B$_oF74!VU{Ia=ngPhnG;)~A>}BiAwj#)((AhzJej?)(&IJ|5k9}ot zjj-q6N-Y@}w|soX^VdOWK_BDYSXrQTzkB1iSOJAU^~P_r zVhCl>(DRHa)y}_tm2t(S>c@{Ct?-RoQVR5f7sF95T_(Zl#mm<4IZU;c*U*!gA8#Wk zK56+nK8JY$(}0GA@@bToGOUsa5MN#VJ?p@uyovLC7+)2a+Q_dka)@0I)W)#MilNdj zfM3^2eRWaeqsECJA9!e(Y0Cw0U08ehMd0%h literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/repeat_1.png b/com.fojadrachi.playtube.sdPlugin/static/btn/repeat_1.png new file mode 100644 index 0000000000000000000000000000000000000000..61825eb173b86d40d962ff07a7488cc8a34bbed4 GIT binary patch literal 2809 zcmY+Gdpy(oAIHD5nLA06X0r~OE+^9YMSRti<5DLow{S)-*`ZLbb2;p%i$ZN=F4ey2 zP-8@xggU|zb6duc%g-&zrED%K#P2)&bN<*q`@Z*nzrU}~`}=)-p0C?yY%CRIcgg|) zpkQrfehyyg;*T^M{vNj&c?kfrZ>-JD>?ysU2i^y7YrskgzgOv}2e9Qo>~YBZz5K6+v z5ntUgDpiW|K?rUUuiipX*Ix@M?m?3j7b@CnAyMKRv5GkkfCO$xL}PJL;z)cv6245X z@38Onlo0=_>1YAgdls)R!@kNJ9XY9oH?>Nv*RdFgjY5}Rj)GXd9&}i|3rn<;)cUO& z*8ATc_wdb@S&#GTN-PY->O?)8BKJlS(eQrvU;@Xr}u^uu>Oh{WhtprAEqr@S;i;su=?QnnCT@I zqJdk2u8-U6FQHE)#v^4_p!TRK&X(A=Lm_`Mwx*};x$1j6Wq3o(@j){ zS+Yyo_g5|LbghZF%qJd}7JlUE=&EmVaRpKBu4&Bx<-y^WX8&9lyqQT7x4V%gnDdQnrC4FMQ~XS7($I|6m+>EuBGp_VXY z)u^`m?RkEn;!QMfbhe0l=CywB8Kwwj#Zt+>ltMk<&5f-CzqWlUj4jW6pLMsxze#kS z+F8hsLge&a^{S?}6sq*yAjA|F2_1WGMvPIGP2MA`2LD~USo_C;l)lA4 ztz&;UB(REB6xG>_a}>Bd3#mtaQDrmiut4B0{JBQ^@IB)kxE){ipk^lt__>cdpP4d@ z*7XW!{wVi`^S9dm4xFpF_YQ-9ZBbC5^Jv?&@jzJj)j{4UI(HDAgSLIOvd_Ri@Itcka=Hlah3I&^Ld|C=qMeh zTL3Xqfio|bgFx%bYdMxI{?F1Kx zPYJZ0sU2laeL(X4cd`wMlR|mNetpD^i!be_J-Z;D-D37CmU5pb|Lu!$6oT)&lWmd} z@C1HWvAeHv!u$vSNvpT&3s`He6c^dn3NgneRquAsQdFk6W=0;L2xp}CbZQFlk9_t z!>?azH&wMe;;B6z)%t^x*^v$;G%pv}*5w-5gYyYH@^jU8gDvoBuM4#|=`~6p!i~dG zv(ILg$}sy)7ZObFS)YKvj##A&@Hq6q70U;39 y4ayLg`HlK7SG7-mLp@f!$(0djQ_;~MYRBJQXM-2VZiITUvQ literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/repeat_2.png b/com.fojadrachi.playtube.sdPlugin/static/btn/repeat_2.png new file mode 100644 index 0000000000000000000000000000000000000000..ec03b42dc71685dfd9dd7f5b567c18e0b9a8b2e5 GIT binary patch literal 2993 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 literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/seekback_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/seekback_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e287b88cf5748db1ab8aeadec16efd0bf6721d17 GIT binary patch literal 2090 zcmZveX;@R&7KTp}0un(4;+4t3gRLZjB9x)k6vHhTp@f39)w_plu-^M^cX}S zhzyR19uZ`)A`Xa!D^p0MDIl0sg^D6QJBQm}{gLEk@3p@Dt(Cpsooucz zTc2V^fgniVYrBU(_L&b}%e1j~!D2xV-r34u`~AktPjO0 z(uJ`4qMes2won=5 z-lVOC#ka=qB!C3D7sxY|Wv?2tSq>sH2?PVxcJ+OV=}Hxpr^l%yfkZ*2SVarQg#4K< zm@dr}H6v>TD=Thv6EHzzi=H+5VC3kMz!2l^RgILYe?4&UcVgoTAfSsjX4LJ~EcF~g zbl|=4Bo&M^P;uK9FOcA_9*T!RfNGOwf~JwrQl^FGE>-YL)lt0E)xfG2C)Ljxw@3r| zt!n0DT-gLnQ+v`&&*F)FB^q6|9T6C(a>AZOYqSMR)*C?DXYe^8zW{G7ULdDdlYZ|W zn7$03%i(VZPXfihCx5SVxg-8v?E&G%i&9hc%*}mas@v3ItL1R-;>%>?pE%hy@6V6< zg;CHTta<(l)26Qw{Z%V?_OmnW) zqr1ZWX9dbob>c0A=YZZ3@)kdoP`ECtgqh#V#wAqn%Xnq-7$rAUPW-77gXNY1L`Oo; zT5PReg_fEWy(-Ph6@>XFswaN%d*^oqEja_U|4D*Q537x#q3E z@0uH2wfmT_Yqwv%133?C>qn?i9y?Pnz^rgGNp$bULPILYh|5=1IgmMQ^{QK?M|cyf zJh?1)6>QH=$K2pq6ai24;aUme)6zEq5otdmafjKt40v;n{fW8(_3cVg=`v!c0UCIw ztd&r7xPz?4{6r{kE32WqMKqMEwp7R_{1K#MYsoH|niw(-JC!(R+4PN9X>n^*UjotH zhrCE3`>(pz?M%5vj1)aBu85w#L~gz0=Vdxt&zz#*#Ym+h=|b z7E+zmaiVwA+h=#LZE*6yy16T^pt`Qv!A#p)pZ-P?IoBQYY1WaPr}Oy5_pWJ%-&ULC zk0vUbrJuM^5mLz}2_-f2|BZ@hM?Uh8)ldrP;=w4`SKJ#`Z&y*D*GsR9XPxMWjmw~ko z_m0apMGDQHh&jX#;T6u=3ypSU`rwo#jGcKJ3R!@)y}R?t%n8m}W#;NA)~|b9eeX-6 zfl45Dd=_-$7fv5EYut3YHZd#%>sfj^wzGW>o``WCOP<7b7Y5Gckb~!NnwV?A*OL$E zu(th+z=P{`F|gUt(FPoaOO#lmM^DUz*FVt%J%wTi9|LL!$g=qoHPl4?ACJdQ(w^a% zL2Yq7YM@7CmX&vOYQP+d50`~&fUAqH4rf2mOsIij-QzqT68Ji{6c-l01ArAHzQh^u z(iAib`2YTZhbB;#d@)jce|fqdW=V~8D^Y8x&{sPfOq9p(T literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/seekforward_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/seekforward_0.png new file mode 100644 index 0000000000000000000000000000000000000000..7d12dae9b3a9c4deb93bb70802341202ca83708e GIT binary patch literal 2128 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 DT5Z!{ literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/shuffle_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/shuffle_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1634a5c7e87a203bd6dc64e601b1d2fe6a226e62 GIT binary patch literal 2886 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 Av;Y7A literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/switchtab_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/switchtab_0.png new file mode 100644 index 0000000000000000000000000000000000000000..470784c2ad0491592e3e7c8243d76ae47bb1e609 GIT binary patch literal 2070 zcmZvddpuO@8pmgu5aV(_mC9|JkSUi*$b>aaxiiL$?UIlbxr9z36RFucaiTJEk{vV1 zFriXAY?qwWY{e#{QEW_+aT{%#(ZojS%v$3gpU?SYt#`fe^FGh-_q=O;zUwN5?53`& zql!Qv)IHptePts9x;84w?o+N~jR=JDdk^P>ezc+4_d!2x3EcitvKo?YVDIm7p6Qt& zY~6v`mv(n>^X*2fMpIlPQgye9f`MAsBNW#L`ES?Dci;H6R$WXh<3!zm`}FXFtu3!= zdE_Tk>7-q~-5^jPZ*LMWtciUWx)+l7&*;MfwU;w|w^JbN6*8 z&Yd+B;1UW~xbch4JBM07#PF66Ce)4~W)p{>Iebi^f11)bo9;I;;I*&i#nI}?)JCU} zVhv?G-#=$l>K^6TPo|XIXkqUDD`}|L1B(|3$xF$U>tXiHbN1Z&Gf_<~NjS=EW+PTfQU9R0A^#ptaFT zvZ-NvV#RbNawCoImN8YW4vpDSivJKJauGhEZ`6O4RbbP$L-Q>@q5F^u=+V57Rf`Cy zzWD7nd_G)Qr~t3WJOW@{>n-^6ko5ek#Mc0%!R10zHtnGn-cIi6;jnxqgxH1zEy3$( z$dL-`<=CePxI`lqj-cI%gW|rRcl$s9q&c3$8AL)ApRZNagW`uke6}w9vU2P6 z#w4&8vB0bfi-MZMB4oW`FM;Okn(y=VokBqSN1Gzy=EgeVL)yz4-W8}172gD^!H4on z8P-kYjH?F0o&YGiB#cRhjCF`Dpbqx1`fqljF|FdHIG;Bmi%*DNKL($UgxLmnl#jnt zj2#4zfvgq{Ssc_!KUjUO=fMeAVK~w5w4R2^*oP% zsqffpg|B|Esi*zzC?+)yzg?^?d>?mD+jE1?#>gK@SKL0|U_Yh}#S!g7EwUuV7ivE< z!z_M_BS(DGcY3_%grx44B_@5YA%nZxe|09oRIS4goJC_o6W(#@cbolrN)g7a1%6J1 zNLq{)4wake4<@og=%n9;3jC>^;W#1{G*UxaYWZZTyK}JJ;Y2DSya&p;!AF_WlW2rI zmEBr{pRPhFi995`tL1@3>Aer}SAbu#vjCCwxHY~s<;QXB1DT;jW7#_q%?A*4Db}ZD z>ZJC*pj4I_vohjefXn_}h6h}a=f4~~1Bk3jum_eyh}7<>PQ?yqaFIZ4CMlti*|C;~ zw==3}bGQ3%R`iixj7~2iTrBb}HdFYAK^!K%vg{;~9jy}!?P&&y&E4TWh%H{N`@w}L z#erV6hRni+1FMBY`1(^gXK|Tn+XG zJs^j(Bt%bCc2s`y9U2ui0HQjnF&?wDKlgiI#Sks;Xunb}(!D%6c#s~D^8CI5CT%(c zdo;BlV0YbpMj~3({CC(_i-Dt!MMib@@&ADkQs#ALiuW_O(xcKd7Zty=ir z<4>5PYBMxwsekk^D*BFmb#yC9QZfUPVnL|4h!Uzi)V?aISF#T)fsL&m2L1u{p2RZ#!d| zmfA(Or<2~7ykcdS8Dj`y=^&l-LEzy}Y#!}IM2z(uGePnJpG!g4ksWX2C;n;zO*BGf z-*x_?k)J+eh89AcOo*RBZGIIWKZPpczWdMRf?$3*EF7*(esE z%jhhk)u_9tgUCoMfp~Hb;aF)V6IHXLcM}|lkZ3s3xP(wFt3kb&76-a%MjKEpZCpEN@OY7pKS3wj zs76HWWU9=p-lN)shBg?z%~gx5AazW8k7I)Z1dK4ST+XI7TIK`t)e{qL{|^seO22Jf zhX?JHb$F1>b7B6duvBzmsPa@HZUC%^rJd_o`|Arum^W5IRPU`YeG#(#KC84!7<86v zREnxLm;_|}>fFJrgCU-oC1)@x(9c$m+LLPx#lg^L1!+RM8+dW;2jzlm2;L+2<5NA> z23cZVkgy5s_y?2xcdNk1C1x<`nmpnE2iNK|WFT+!ms)`v>@*hz0W&k|xt!EbC{4HF p4D=4UveTN9l3d0tV6N;EU=)n*ad6PX$^Q2U4;QlY!$Ze1{s-qpn&SWf literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/volumedown_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/volumedown_0.png new file mode 100644 index 0000000000000000000000000000000000000000..580ca6dd86a4d365b457027a134a128ce80b80be GIT binary patch literal 1950 zcmY+Fdo+}39LL`=jKa8-Hd51A5~1A29?eVB9t@=>CUjOeUG;F%>oN5Ug!OvS;)f&RMf!Lb?i7v#29hGd=Q zd{*FW{MvcdP{G@Kf9-u&zIS6y$ys_|ps+0UUBas|xTAhg@5bQ};nug43HR2qu2$-P z(z@DLTD9kXv|?p1fnr5jtv>Ze7sUV%P zfTV%iGmA{$j1tr+z4ns!yQpX5gdMtXC1}`{LqZcgj}JokFUjNZZKp)E9&^t1kcuY4 zw{~j=7QXpm!xA(C8$Jf3mL)J&NG6jAq8P}d&e0-qvn@ixg(l z0$1MkfaSpXgOz#dWyoV04_uEFndWfw&oj4~fF7}79m|iLQ(Ue@ho{%*36p6ar4Pd! z#*a2nYtt%e9X`Hu)gGZR1=J#Gzwy*3t0Yihhc*{vqS7~&ztC_Z!D?^{g=!+6N^=<_ zFlwh%9MzJmjSpwEr#vAwiX(b(y!-`d$RJ1M%5d%}KI>B10RQ z?RNKUxHY0<$tZUV?peerTpcuWL2_eYG@H+HqHf*CN+UNK@~Tv6F3xgepWQ9ogUJ=k z1{3V4WgDcy#773Q{gY}g z^RpHp(HdD!=*XeJ>++sydrjsQ4L7eOkFGR$Uz}w7dU@1`iLUe>t6fP0zF?e2gA(+e zsj#_|#PI>4vvQ4@bojw45`{n^9T>^vUx3u%a87!T!ij34oJs>jCPmHz73+^_#aBh2 z1y>wFroMGPeFopLkVP|`OZn_gKLv=5emxSCbld*RCd!7HjrmCubJrx*{0Y$MrLaz9 z*_ipkCY=>#ZQw=?dD@XvwvU}WUi;G*flCUd2%DdhpR945=*pDNoTv_aavGKiEp3ok*>uek190u3a9>k9h$AMrDYe|s zRBZ;=nA^h5k58_BsUHPG03vvdjV?Yj^siWd*+&v8b>%lK&KBADfWqR`OM^Fa*R5*iAK#T0BJ>-$hJTV2^_zD0-E7xhrIMI6@u?Bj#nH2 literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/volumeset_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/volumeset_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6236bcf4e074f4bd6b23976a9b3d68d06835c7ac GIT binary patch literal 2646 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 Ql6etuuywVmJa8obA5-bR(*OVf literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/btn/volumeup_0.png b/com.fojadrachi.playtube.sdPlugin/static/btn/volumeup_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fdfacf62499220fb521777402be96b962ae6a957 GIT binary patch literal 2134 zcmY+Gd010d8pab62s;QtHi;2gR47tb(TKr<5M>Lp2ns27WDASz0VQUzK~156j544k zh(JIT9*})0RDlF*P1%A?!pPQAV30&m1{7!Rl0U{jlKb3yzxO@wcg}Nu=ic)7_0&)` zQbiyT8YD0G0N`2#{*;w~|HV^tod|@o3CZ0pkS1E44oSs&V)JIV!tvTKx{>tn`=)MR zrC!!Fh&GP5GhMv@y^d;+J@KQB*?BwZ+{3u317k`tYs zhj)H1NVz6j{oVHD6{qD7iF^M1(4{d-??D-3rZrPgl6{RF&7SwRPqx_b}0m9Fcg zF{!hSDamikr{DKRy;8u<6wf6iky=tOsf158RiiOHS(YemDWWiw;OvN>LE;Q?N@&8s z{-IR+CNc`FpXsVWfC8Dd0&u%)rv3#L59w||KC-|+>>(XntO;IK*y62BJ~U7>SiqMC zS`i0OgaE?i)_bU8jTYzd|0A6(p>W|y6NlhRC)n^P1`LMw3#We-3OUH1XDcd$xw)?W zQMS6 za6-^tb@JqmZwB@cj6Xtp7z-Mh*Xn<|il(7y2L2PWx(5g(un12Sr$$&uagJ|084R8p z+ez`jGHo{!3G|r2R6ii1IaEdhYY>}>@GvYi(y+nL$a1-TQln5Z@2Rpf5V09>E>v((I9F*S(ZV(N{A6`A8y}SE9mi>VMMppAx+j&fzX5aReK@t}L*$rmMUq zxkJ>_d};Fc$#vUbGpj0^3f8lv(CA0iF2ub9RVBV=_H4*te1S^!hu5wE+Jpy(22P}HIJXC<=i zre#oCvGv)cd?mFyii22n`EYz=+^`ooRcnth8eVomNw?CsfBcKHk$O7*iM@_r(x_sK z_jChp!Rs}{Y=w}1es1DvABVfrO)BSm`TP>X8SbB1>W=HS^BMQNEBr_vdriSHEm1{T z7!$MxU%>MZF%|^)6;KvO^0dC=v~vkuTlJVH6{OeNXR=OJ zBey!f+ep4j9})ynk4FxFhYGub3Cs4F2xh-a?@5k+d?%t`mg7x{r0Wx|YgV?=jN-m| zyjZcTP0aWtX=r3Gk=Agtl#0=c9jb!h+tJV#;X877!P-qPWSAPze*sUawOtUI$V%_m zBab1`1h!QDAd!4zuqTW8T;ncM0Vkm4v0fcv2tTVxW!5)u>m3Akj-ilIwZ6@m)Q%+% z%Jmo zi-m#Z0Rl*YFh1l7gD(;W>$o|DP!)EMxhKr%5d=W{c@x3$FAODC^=TmVX}nYl#Kc*- z!R8rFDvVk!cqE)LL{33I3T!ktx^_YP3s&Dyg-9uQe*5|lFhtAJq2okq3nj%t7>bm@x*&56F8+0zo=Ljc1X3jvtht{jp4)0)u YV_*NXK?U0bd@mqK9=`64C%?`8AEqjy&Hw-a literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/icon/icon@2x.png b/com.fojadrachi.playtube.sdPlugin/static/icon/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7b224e40e9d566cfb786bc407889db476db4d0de GIT binary patch literal 5267 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 literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/icon/playpause@2x.png b/com.fojadrachi.playtube.sdPlugin/static/icon/playpause@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..59efee9514c8633dbd7943061b8aa1d61b7c1091 GIT binary patch literal 1681 zcmV;C25$L@P)sxkA$R?kfdrBe4B+QYpR?_XkVwsc^TZsS)5U4bH+qmP(V@EfFU7d zAtsOx5D-X6!j`zAC6>;pRsX5mq%EcdOozVN=u>sRz^~Hj+vlG86C$&YXfpebYBKyW z&1&Z{&8qvjW(6m-w3qRnb{QwNOE{@r#P`}o{Gd(aN3m1*Nt?ncZ4#$yllZxI0l$cy z!0Flq&eXMjID)w{fA)b}qzsaCi0* zR@JP@9yp@O2uC#;9Mi0dT?Ke(<3ecXLg?V`h<%+43OBgm0VUzMW=%GAM3ccDz{3r( zN72cRrfzZpu3)%tHTPn1`qlT9@|cDTNQ6-JU9%) za2SWVtpHOhUS4<@FuGG)9gAlZA)dMwhVp+g8PshX)BUuezjP2cq1Et z%KzteH>R;wWrgRs^+mjD@Vq7m2#Xg+&o+QkO}9Tp>xZ$5$Mc%{L0G(Pd*1^{>)-V^ z2%lc9XgnVUWN}o<2T-cD_zO6j;uVSKH}z3K<IGr(h0)iT#BS<&_8<7aj+Z^&s0hg5^Q?cDfKojWo}urvXxZWg zO+6qizHJ?i3sACV>?`R0C{%WM!MYw07J~stld^!)|6}BMysYr<)OAxp<)sQ>Z>;VX1yp{Le7h-*Qq+ClLwFlTi-tE&0a=XUoh1U4YQdhwaJ`2) z-gwkx?W~qV)F0=Q@n@-sPqL;IRHxaB)W$1!5|Ynp{^5z#qHTp839VQ za(xm0{X>f4iGVDw9*3Id$`CM(!2Tgc@uKD%8-Pk*J-Ybv0el)=!}ym0#eaDeZ^C>X zgvGtBi=Qonm&gmmzKJUSpSKxL1Y~jP?JhB3+Ma-azl%BEq`3ox#m0b}zgrTxhrS00 zHh7u5ZMVXkk^q(77#J=xAbnhgLu1U2D%;`3%>RU0^84^a zKo;v3#Q@AYGVs>BONuvbZli$8@2ZS21YC=*A#!M(>E~I#crz4`#i9=jK>E1OoS0_* zZ7TB;ez@%L?uvj6wxqlY0n*3S*WhP9k}4E$)_fI&#fq7a zkL`NGJaKrkDD%AC;LTdDg0NUID-@9a&(UFMF(%1M;LTZDL0IhP6#}^G$imkUs3^R7 z2~g?%JiiRUXNh%$4@HW0hoK~1+;Rnk#d2eSpUUfTojn^b>IIO}cp@N+&CvG&raPA5 zs`pkrUcz#j0xG{5I?7LO3HLbq1c8I$qTbuG#9N?%EY@m+{KPxQlE~p$(J#GO<1JV& zfw0&~-VB(qr{S#kRV7|>15o*$MgEJ`a{;-J)1{Da%EWN?PbHH@uXk1w_Rw z94~Ec0m@#N!S$!g~bjlERy3c|y()xHrK znv1Fm literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/icon/previous@2x.png b/com.fojadrachi.playtube.sdPlugin/static/icon/previous@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3c7d71ee1286e77530496eba2744a9192fcba7a1 GIT binary patch literal 1786 zcmVsxkA&nV40+M6KB|53p|pME1K7S4ht>|ZMLUx?E1)PSA_4(P7?QvZ zV;KTrkc2YHB)ZhK{$1ygP+Y>D*dZ=Cd#(L`*Kb|2@7ZUw88aEDY>7jsZHeMDwwbCk zwi*9f+f#gF=Q)jU?bA4CpTar&B)+px;(Pl9eh?YQkM=mu+sAP}cN{bPVDz$AHMc9sMX1*$1zq4?agPe9m56 za`xb|vjT99_}h_xaZ;-^j5oqIacsgi5En*D~K9bK&^2FawMKL zJdyWZt?C2UlN^a>4G#}oPk5@eu9h6Ff+2tNcE>}ls|62TEncl^EAh1PQ0Hn!ox54t z2{1144B_FC+aKTQBU$1Z!$ZBurW4zbXR5?Ag@?!PCUyJSR^pk%Lxa1K=OLDA3`jil zcxZGt6th%UMdF#qLzBCqihUq0schiE?|$rO63;T8NG9>D<2AeMIiSR|ir11?4<_-f z` z0SnP(GQ8HjIxwm~Tdhb6!0h1-l#b!m+H3JFi_v8=yw<#jU{t?(dVtx$YbjE(GP?fO zvv5EvyZ{HJDj0fz`-xX~qyyuXGdn)ZV)PjqUNEng1JYDmUBG?93!fasM)KvZ&%yzz z@Y*;a)u)OcV5adJjzy3REJ81qqR+_i+VUQNQGMrW#jLuXQM~@r@vS0Z43Gw|T>uh& zBV%;UxJHUsdnAOh$^@(g2c*L5$iELpbv)Apq{8bw zIfUmLMM58Ni43nZzlHv(;oal=Kz2p|<+ zD8Cwvs;i<0Xa%q7(_So_EE0P0EV@L77v_LeEh(+|S6wrOS93UoSVaPvh%_JtUL^k> z2c+reX#=hr#%teWkuU;Ch1bOashXjBfO>d!M^z+Rmyqe;fK+&0`FFvnI>~x~T6jIB z6L_`u2Ky1q0+0r;I}J$DhS!QYb#+I)22muQV?TofQsJrjRbW(i82W(!1E`am^x4(JShr@_v4RDbRFIsSC6OiKeOb>9szVnO#QsMO!+yX4By*EP7Yur`66S0 zD*})PuP+Tqap|oU^8(QL#K7YtK}=LW%@E)M8D4)u1sK)DfF7Wgaf@J41go(%azH9P z0Z275pa-~@S(Tv+BX~_zWCS1)-atV)2c(%8&;#7-pikg<5OaY!5knRLXg^&>x~D<}5=NQ3u}03@0i&;!iG zd|uaQZCH=3ng*o88!EU7Ml~^D1dw{TG2K-eyD*5?Yp)CgQsE61-UOqX7|;XE6kfV9 z5IOG0Vqn$~AQj$l;SDgVi2*&pOyX@n+YWsd!OPhV9Y7kqku)I1rMD5lOyi|b7~zi} zA$faz7r=QkywSqzU{n(WdVu?dxBVlz|MO-%kFC7*ENjtuGCToDHRz)i)MK?~`+3tB z`|u`JWYT~Xc(KB39FS(jOb;+ycE_; zZvuU1hq8*d{Wov;i$*fMvBIlh@AE&gP~%a)c^q$i6Hww=#fukS0h4&v@#2M-!6cq_ zya~@`u+;uMiDvc`jA4)aFKsXC4nz9$zuzYcD09B|J=fe48sn zQ)@3Jo;f^qYjY9b87lEi;o+&r`}UsI)Xq?eXACd?&h|FGa8=?N!sEH~a@y3wRf(sK z=iPOKCEr$?TDU6lcE(d@JZ0K@RQa~r)WTJXXBICVd|Pd5;i|+liO1A)C>v7J*H~M+Fpr3;a`dRo^KMUXKXW)C1ari+Whl~0cTr7;ikA>6l z6Uiw2To{E*g;Q{uaF#z?(F}P|RgKNf7lGlwq+#opuH;p53%Qy_Tj6-mn8-hFBAT)4;y$zhd=`QED zG;+RUC|^;hTRwhPx5S^*Ex~!+BFPT`4;nZ>+~xex$oWX#%!9$Y^ zT1-y9#pEntc=GT_J~9pPt)~70h9?gXT21{p`8JcIAln0j{pMxHgEo@`9-AE2Y)@N; zmmLqE!N3@!nJZX4f zH+SPahJ?ld!;_8&-DbN530)P2Cmj!Z%=RYqfwZI!0}p!5UA>6m$;Kmz7@mB*K657q zWO#D%97Uagw2aqvA_VT*$wR|)6mHF3f@4`V?bJdV2AYdm#62YaPcQ9O51 zDM$OD zU~EP=l7EX{j!@$b6+gg$bc^Kns&v4Bby<~WsMj)@5pPb_{&yEJ z{|7*`831YU2q0}UG&5i-o}EirMcvXTAO+U&E>;F)dfYXZg03PK~+xA z=IYbGDdE!|D!fq1T|i2mVYGe{fL_Z)vhuQ3-G0D)IG~#fj{qut0EDY2a zU$>y$p5==7r1Tb`e4U>8YbVIXo`V5-&Eica0P}SK)L!8wSIn}-AOX}S-c;#LKx&+x z4b_fktj59W5zXQeK($^auvfUq6|?;@R6U|uylCkS45;pV82p(ax!9A4VF6H!c+(j0 zFkWKmsq80L%o2cF#hWg@4(Kr702(_JQ0$h}Vc^Af0pGvZr?i3>FTDnc;mOB~mtFU)tee30Qu$Ah`D`X(eyZe)1U@nEjZW^hBCa|@ZxFH+wj0uhL;l_PVwQi!oXFA zmmSZVae^hDRx1o#Wq9Iv{9@Ua>~mD{v|3@{D#MeCmk2zqRv5U-@TB4;0#B>O16LWI z)hZcpZ{UHecxLEPT&iSz+R6z$GZc@#JPJFEv_-O#fyZ9r$&GmUAfBK1A+)4$R|Pi) dl6zYT@jty({}}z>MnC`n002ovPDHLkV1jipmj(a; literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/icon/seekback@2x.png b/com.fojadrachi.playtube.sdPlugin/static/icon/seekback@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fce3f35348464e36624a5b9c54dcdf312432d0ad GIT binary patch literal 1613 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 literal 0 HcmV?d00001 diff --git a/com.fojadrachi.playtube.sdPlugin/static/icon/volumedown@2x.png b/com.fojadrachi.playtube.sdPlugin/static/icon/volumedown@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..83c47a35712e359121d50d183113ed9cdf6f7103 GIT binary patch literal 1430 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 DwebT} literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-down.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f54c56d5c114748ac74723da7ec912d98ef1c9 GIT binary patch literal 2630 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-right.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-right.png new file mode 100644 index 0000000000000000000000000000000000000000..4297fd5f057fec5aea3b862963404276f5d345de GIT binary patch literal 1967 zcmcgtX;c$e6rQ9(27!_wn^;YRuqYr1$Rc%4NI}4bu)CmuP-K_YO6njH5knBdQHn*7 zkfK76T^12RMV2FrtSX>@1T3he8e23XmA=8#Q$0spfAz=Ax$nE*z2EoVoOw6d$jVfjkR0suxMoHfV(@?wr{jaHa`fqUb1G; zEZvxSMf(#mQdUCoOI!gKI58BM{ZT;sE9xCO73{W zRlm8ts6tPCW&F_4-b?4i4}ZUmr>)wrh9gpFEQkOTDG&}%fI*DIe**e^=40}Iv{@v7 zQsCn@i#EPM^J49$4cz!lIbS8=5AS7@Ww3yCss0a|YkaJyU-m(x#80~@84^bl3fAytKk+- zw-!l}Qm9pTUs(_F&j#M}d=t;UwoU1NJdlTV;5rpcGBEN8sofY!_QKdY^!392w-)sJ zFaw%V#iZAcV#yyW;RQ8pKzj^}QdM|*nwa6>MBf%Wa8%mM`Jof1r}ajcdUF6}7H&yq zWc_2WvCjzWsz=||rW3g#wP&5DEYU3u=4gus@s!4MP8wcrfS6;)nK>!PSQNQQ)yRlL4`j~WDshRQRs^hI5=WWm<{3X7 zOaiNon!sZ_5PbToHHZ6MK!?KkqrP_$^LOK$k_X28a=w`;8xTakle>-xjAm*F$bLDi zCVKq>TA6BBbt24WeNIOEJ!H&odxVaU77EK{1@#ln^WLJ0g)%8ZY9h>* zsWeCigT2Hg3Yp(xheo9^n(U^7kQ-Cm$2eTcq$2OAFBh_853U7{9*Z3;*t#^q>#1-e zS)A1;$=P|N*$ZMq61~{@>4~M-v8xhlzCt-8V$+-6JB1`h|E`t-d z_!o9G+o8rO-D#PkTti$!#i<3a)d-#-)T9CH*b9q43&6zp$z#y!_w2uc56k^RaCopC zBAEb-Nn{XPvw+*r0pMRfDuL5U|4Ns5?;5+}j1nmqM?2)VHcR6)$fB|sjso5WNi(oo zi@?M;pq~BkD=G-<2=;&()!XngLqefV=I0As!TP0@^kTA6DjAfm+uwMFGJkEJjWJaD z;VRF|tdJEd2gl%;lw?;Xh%t~LhF?^F+W~crjxJ7fR#+Rnz(i@*pJ-V1W`hhz` zSA4<6{y)zL8tWtkMjH(Rqm77-HUc*7aG!v%%#9eaVPMtS!v3A-lfWQ`9BdtJO6fic Fe*xA!-pT*~ literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-up.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_arrow-up.png new file mode 100644 index 0000000000000000000000000000000000000000..e6672edd6748bff9df559cef09d4100bda2b7011 GIT binary patch literal 2771 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_calendar.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..12c2748c8da59b540f1caf395b05866d270f02c7 GIT binary patch literal 3875 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 RhsQ5+{A%U0yd~f5{wH7JGT;CJ literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_check.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_check.png new file mode 100644 index 0000000000000000000000000000000000000000..00fae57964c418787336eb6cfe733f91e0c3a6a1 GIT binary patch literal 2338 zcma)8YgAKL7QTtGT%|xl5ky`g28<0Uyu-L>&_d5+Hz@ zNbr#kHXx4xDr01Ppdct{3i8qcEm09dF%B_=h|nv~-W%ebZ3@`;;7zuYYO%Yx|@2UYpbpAzo+Odymu|{pU*>Itry@z81WJyrXF9LJJ=Zl@FlMSUfyn zKr9}fW57?CKELuu=RbilI)5_2A7P9%{z^<#B9;&M%a80jM7Do9m*@2}k5D-5BROi= zw<5b_Ds{=NlyOj;huNl|5;>R#glx=yKdGDhXMO6vb~~~>VEmCD#9ra`MzlXWJ>d0} z=&Kz};`QG-dpktHbnII}ZQR@tZziZ5o-QA(5#P4$m@qr-Nke1i3qt~W2}CMe3`JR+ z#AoeD<+1tv6XdbDXzu1Zn_DU5<s_8j+A!mR7 z&Q@r;oT%q7zzRh`I^>?6#Is=?89@smD?BB-(8Pl(6hR=iRIGc`T5g+*_<*o0{7a7F zUQP2kJK(Yjg*M>uq+<^z?cq^awUQOi#emHwC>l3qEhSpImqcYZLIpd^YmA$%7}qIG z*x|y%z)B+?o+=DE4i!Y_Wdis#;7v@XUa4pzFUpvA*&RJ9xWjIo=X+5L%zBPQl>CnCO7a_OL!7`}|AJqJK`2kaKT@xlTQY;gb z_s281ffr?2iedRc9eAMiyN@&td!iN5hPX8^SI}TR4yZ@u;Rf4_mv4%hukAdmk3CRM z+M`$_@8`)=h?K$Fkb9Z4&j?|SP~GF1f5!T06PdF&ftjs^O^eZk6Q-l0>( z>5YQK_9q&lg^PJthcafD2ki#Sp?FV8*nJaJE>@PKQr2D#T*t*0xkl=1?L8>c7L{^m zMHG(Z;G|8$R9uN%^Zly5T-Wv1#e`-hDIDc?N!~EM{~dG*B5i-u(EA8y>4b@$*H`6E z7j<@51)pHoz@ldWypag@G?ctofT&PvV^O%lQr4ENEAe_h7s;d}@jN=_wPxj(2|JT@ zPPHi__Au1eT`k>1qUs!rD~X1=w;E7DA&>%u8Mp{?5ZGc;`q^>r9V(;+NZFDXe%Gu zaMUp@Ohs`-UzT&|O>_W->D zG{85PZ%=lt=;D3kX(UQ}nM!1TDkkCV?LlTI)qq4E}F)j_|?b zoxD#$G_m@S=@%H_;aV@;8Fn|%&9oLDJ_4B@=&Hb3*vjrnOp`Cmz z*?IlW6&+;XI~AbG0TkE3jqi5!a=6x71X;n$c=4ai`{_ew%9vj&ANfXhn4>O49}0l2 zS(UR7Hx7F5kXdLZJF;iVFOwrd?6+T=wkvqbrc?EPiH;!L`H*h?VL%!<3U1(3;4`Mr xuNYyB`_Y&`h54&7`GC)--Vw$&|Fbx4-pPL_*Y>D3NZ_{*5X1b_8Vw}$4LMH literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-down.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-down.png new file mode 100644 index 0000000000000000000000000000000000000000..469bb7b28592c129a5a4870abf320cd065992354 GIT binary patch literal 2767 zcma)8eK?bQAD=yS8pSnYDmfe(NvXAzbH?V3r70$n#5kfRR-DMZOq_$3_nuHzu~vk< z6gv^~QrnEgXvrF-V`}n#?)K0Qjpv@{ub$_e=bY=h@9Vzq-}n3b{663B{rTS4C*8x{ zMO$l=76by(CLVD1gg`V*)i>-b2n3>^Qj-jUXk8^bfA1ALIQ?caD*vVN;~$qZTR+%o zGreE}n5Mw|atN)$cy>^$9+5fV8E*WrKjV02VYG+rBC$EECK8L~D8Jieg_Y310rsfzr6E1Ioem8@?Q2}_1(Kv$VMf)5zn)DZ$* z1%v;=(w|4ZO#Ta)mE=D>;7gbl8h__Z=sQz2f0&v-6y%=_0r~&Y(*H(oWfTt4eIK10 zxXb&HLmklv5&?A2FD8O+}_y zI35{zaV|0T%yUZ6gXOn*!m<0zh}}jD?iYCkTvW{YnJ(r*ArI|K&&lTOr0sgwnpDbJ zf6MCg<(?*$SFC6Umf*Lh^(j{STmFJRZcd*cWdm%q)ypy5&l5{=w2RQ_n6%8RMKpTG z%y{f`-vK5Avm8APST%*o^(a=3lnZ0%g5{V*KYG2+XS5Q~47arnSIx1{4+NQ4jnjEjtv)7Jm2ZJ1 z7%gHo71xt~%?gif#x9+VvXY@a?Y`D|H@~QF?wHrIXmy6ZU$uogfzd?-M(0J262t8v-{HYd(G~$@l#L{oq-#zH?4~>PZpB%|f2HCxRkA0Z?*0gF# zx)(|*9u*|6v}BTR4*0%p8AiizMM#Fuk*_HA-<$(dik%1u*B64Z6khG+hK)NNDd%V% znM4_S;#p)whoacYw_|EtrU)GyElz7Y9Wz< z6h<+lOLIs*Q6dif)<@^iGoOaQN~}M{S?upjrG88k=L6|^Hh}J}I#TC}R8N8BV9}y| zb05bq)jgAR6Wp3hyaw?;)a<#1K+o8_-CqAYx6V4EWWIHz1VD}J-7>$B_%u)5x!EAU zIbU#k-f}O(Bw$0=EZY;ueb@|#E1&wu!PKeJVlvoE<4zW=_k7#o0Zr*E{Ar$Yoz3eLAdf=`wu}5eNso0~ z63^(W>%6`rUx-TJDFtbsfUc>?Y^B$CmJl)8n|F+-QmNvCUD)vNSif{8#YZktWkmO=$_mkyQy$Fp5KD9t9M;6u2*r%3uMfjvDD0XNB&|1`rg zcAGF5-?6aEL?52IHaIe)@0kN8Pf)gX{|A4Ikl?kYnxpG2$>5yj$KvN*dqw6zy3QC* z$0)vmg~Eg3^iecFBHO^UYfC@{2uScVoPK)uc%DtZMV4CRhc#%uV^;@FK;W>f(&(rs&@ELBw;0&NQb+W$F>@n zULkdA1&uwfz4#x@)v|s{;;aW>pq58D59ZMN>-(nM-VgW+B@FIuH9UFbK7cx9Xd3po zt{yXKqgLLfO?uZ3jP6gU?ifo>^VGN8EGd5(RRk=R6Aht){<#K!T^)IDF^!({ zE;n`Q>a!vwRPZ}f(Q=TFX-qkiL;4I}4I;S4iNWHTcxW!;@JM>n@Qb#6_OE|0BsqL(l3*Uvmo54K?qnqyZpwgs3IAud r>~9#h6+iVioEDh(muLPKxU3QW6Fl}qW_KWHR3SuyyK@cxhoAoqq~))S literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-left.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-left.png new file mode 100644 index 0000000000000000000000000000000000000000..7617ab360bfae4c661b27e138428ae453160f9cb GIT binary patch literal 2793 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-right.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chevron-right.png new file mode 100644 index 0000000000000000000000000000000000000000..be00bb3f91d71fb17469aa7da5371f1b0903ef73 GIT binary patch literal 2801 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chrome.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6d888ae7a0f67d9e0f8df8e33aa637c81860fa GIT binary patch literal 6857 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 Qi3-rWWpuOR#)D`71w^EK3;+NC literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_clock.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..af2ff564cedd8a684b9e7c4cf7e9d13dc4e8e1f5 GIT binary patch literal 5907 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 YW%G0%2)$GShuy#}ePg|f>rPMp8&alQWB>pF literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_close.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_close.png new file mode 100644 index 0000000000000000000000000000000000000000..02dee8eddea4e391efa97172392651ad298f9063 GIT binary patch literal 2845 zcmc&$dpK0<8ehZ2av#RdAu@`?XxkN2k+B-1Fw--8Ja`I)?yjYp+_D_fs3z&kK0C@X zCqlWjmCBZOF0r*~P?VzFa(U3qm}DV3-Vu}x6pqb@>__nRLHsX?%j5Lp|k>7vNS5b zmdW+r`Uh)df8yWgUNE7IJ5f*LzHd&53-g=rS-vwtnp7)wpOTJ$#uDSgVy?um@z8r3 z$6&sFXcIYMtc`sLE{zT=-0xCVt2L2UKG3Yi(zz*h)~fx z2cA_`?pM_9c((_SgLB$&Q)>>IbBUYm(+1T2Zs<_L&^lg1wZKPB zGT-YnvCFYLY4wA)%C=9CFB3@`ncuot_~f``Crk=0Pm1A@&EZTvjJcr^V)SV}ola;O z4#EfRPI!gMoZ6FCj~AK7?lfUd8A)S!i;<+}*$_XbBJj2y3GtX+xyLRvIP@-bqpYeY zyvzt=!kMbr%Q+Y479-YF2aN7YO7Wu0L}v5m?0wp~zvdh~V2E@q=r5LZ@9N~8zU#41BzJkp&KU`X9Q$ zutErjBSymZUg})oVdn?!@(BEqI_t)=3seB@(dWWUj{%&gW%{$ z&S^<$z+M)?DUmP@Uzcq{U=FZHuIAzOYAe>&-Q+1<*Xwgdk{wjSGfbtLDfBWyZ}h;M zo&T}O9N0UtM`be+C8KAEC>(biE5twX8I?fN@hFso)I;EEov(&nJ+Uqk>xsnZu1fCl z8?tNR8g-T}EH=bHm2~=UB#y!r&aW?cRY6ZBFjdmVsC0SL+>9YX*8UV-=w*w3d~R!C zfx|2xZE*&!z5K&wuz#Y@Jt@g~cynje+m1ZA#skXg2RI>7Y+>(mh<7~5EY)j3-jq;s zOsR{3^Xo!_JBRx!&bG+(lb>hVUA$gz9c8bdat>nj=yOl;BR^YOkj+Vj916&Pfdite zc==d-i19{0P6sy4ZZacq!gqleD#-1OqX56>^^Z5TXW(bl32OPSHfG2##}l#C7tU*e zW&0|2k*q1L^^phUeYYjY06RY4;SLU!1hboDGmc}2)$~v@ZEsp0U0&$`{0YFkeu7RO z`*hj!Wbjncf2D0s@_bBqdHO&^6kBcOT6o`6laQ$>|B;nzG0xQ?EOf{a5jA+AU-nM}hCPw?N^!z51`T?HGMA1(XDbpiDW6u)&ZG$ONqVj4Z6w# zDjLMkux%`mUmPeZ=X(X#;6$AqgsmpS7Yr{dvcMTzb6GwC8PFo|Qjf7C1_rN8i7uMeWf&(#YfZD2Y z_$HiRV;zIIg;oeO2tLb+ewgXP_7PE>kXWL_2TP7ol6?=L?>E|fhZu!_(ZtI$P3ZEX z7-sQkz`O0L=bxOBtYSx8>Zex0#8D`5HW67HFA+0vU+2Z0Y?vjZD~W^l%m>6NDEBNs zXuBm(q$h;P=6JWNxM6@=#hml=dr{F|sX@atjIlOQ%EOc6*ZjZQqxtT{^+CfQg)rEG z5f}Rv{&p}4Mywh`EZGDjG8;K{~i2%`!ieBlE1XOi!eyz10p)2oSo4`dU z*Me7Zsjd6&j4aFqT#*8Yu^m58w=xy#Uh^)F18uAPoHVfOtk6x~=q{sKb+9o! zMYAbup!DWm2;rr-PFmvKSppjRd0X{9-CTLc>sf7-o9uN>E}HLsEofQ7nnG1m__yyJ zg2fHJ)G@gZ%$f=Wl6XqEHga#+bk%M^;ciZ#jLtc9;f_8&esyY_Vv$#3b?Za$5;uj~ z%S6?KPBe%&$QkL$q{`^V>`SSV{Dr_Ap;~MG(enKW%01ayt}#H(o^I7^p|Ysb^rz`E zI-Nb$f4g#yCm^>DE+=D?hQUQ7bBI@j?M|?5lxks#nY;Un?hZHa&oT-w(!cjgI-PY6 z3xvY))X_x~T6N$X-B=%zAbBd=HCH?Cs0csXpE`KIW2w<*Y0OQRHxq|zj9E=%2aMs& z&H}gC&A-KGKJEWKvHhPXIc?Yfnijtu-M$QvyQhOkcTYbott@E*V=u(n M^y9`-_KuW)1FCALmH+?% literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_discord.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_discord.png new file mode 100644 index 0000000000000000000000000000000000000000..d763f71adc6e586b9162e513324cabfa7617faaa GIT binary patch literal 4683 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_eye-off.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_eye-off.png new file mode 100644 index 0000000000000000000000000000000000000000..766d8d3a5366de2f2fc36ee216ca55f5da15e15e GIT binary patch literal 5079 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 F{{Tnc*Zcqg literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_file.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_file.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c2bc00173fc01ed69a139722fbe3503c78b21d GIT binary patch literal 2937 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_forward.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe71964b7f20ebdcc5d1d460653f5cc448df381 GIT binary patch literal 2927 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_gear.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_gear.png new file mode 100644 index 0000000000000000000000000000000000000000..56b1c440b6810ec713f0c79e4a5e8aeb630903a1 GIT binary patch literal 4975 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 Jsmb5B{tEzJ@g)EN literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_globe.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_globe.png new file mode 100644 index 0000000000000000000000000000000000000000..c899437ea29b914413a9164675484843d990dd5a GIT binary patch literal 7464 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 KuU6+?-2VWp%_|ZB literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_grid.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..a4fdec570846ef86557ff97270adbbd31ac577be GIT binary patch literal 3632 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_headphones.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_headphones.png new file mode 100644 index 0000000000000000000000000000000000000000..ec2a2f5794e491c75620f025039b67679c456e3a GIT binary patch literal 4116 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_heartfill.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_heartfill.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f8ad37e3b163cae1b13d11d4dc5f4c969c808e GIT binary patch literal 3480 zcma)9dpK0<9v&0BiA^T=E{vfDl}l8v%j`@hMWZOWCo+X3!>}2bEoEkiibP?g8kN{= zxx~oX8YU@|OYWD9GSv)PgmIm-*yr+`^X&7S{l|LN`hJ)9eZTMbt#7R#&G9H+R(i8E z3P(&0YWF2qW$5 ziI&a&>F3-9q@cj!U-c3yl{>zo(BT>A<7{a<-BMBFXX?~%D0#zIHcu;O?~RK|<`L;v z*qeI%G$JA<`AJ-Yp*g8~&Vrvun(Vz8vuF`6fsz~EgNTPoz$H;w=!TF-VPSAdg#4eF z{j>dk#z8FU_<%zoIk5~vAgvC zq@dJzv}gl)CPpbQaCnRI{(AY~C*F!Rf?(rR-zY)whAM8Xq2<20=cOgS(WdQU*QO*j z6--ZeggL8op4{|qfcP@ae^Bj(_5Eg3X~*!p?$I{Y_ea1|zo8IZ%(d$`{UBkK!PcYVy<6?#$h{|c3iB=7 z8D62!#2ux+zuzcjgrU%_2bZ`^vG?GoBuOSEx85OhbUk2TGw%;dV;JelzCu7TaU zy^=kbsA8V#B~5tFCbGI~lWYis#Y$!QtYZGD9hRRI8Ba%-`7g&N21lA)ts}-|9G3zu zkGK!Z^*f1o3q-jazFd3)qj>$)$w|IRSI8$XGPp^8n)RbWGL=Tv}rW>C4#0YRrYUk{BlyUSKJS7f^Ts$86WGA5Z z#o(pI>VXY?6IEa~mVTb2@t$;A-K-m#*2NxLkEpmGSDvcl8bv=%_-c+zZk2b zwXtTdx%12;l;480!d<*BnkI7}b*v*cxLa8a`of);FPf_80U8g)%H)TwSFheF(M>yR z<3MbT^*WX!@>^zpxiohN<~hHc?{Hhaj?KS(sVhwQ%6AY?X<9UlF)`^1tL96dD`;Vy zqH@=Z`N<*u!YfXuxS)F?4^5zOy=?<$oz_T2>;6F!+ype10kbWE_3hq?yRA5(>fBIk zE~ZuFH)tXt!nLvYi3=&}MVdf*BW9=h!*6b*YRlWe=TQ{&V$^U%=5^RvmApp28%Sf_ zUHJIKKqvJ@h$$NArV{-8PHS8CeUFwnywFfC`l!r!_4{{~k>bo#Uo>Ndcex20Ky9=rmA<+#FvQpHUL|gL8HHh?m3@^4z|apD64?Aw=4~ zWC0nH?{rhsL>ZoxR=GUs7Pm|p$BJn3iWi7v{FY4cbLtkroo6HhhIaxyCo+i4Pn6dH zbvdG(7FFf^01RX-fsB$p1B=-rD#5jhAGtt#!!66#LCj zRrLEcxbyhfdoP1EJ+v^>jXG+TvtEjjsv=R2y#^V5=J<~lEHvca2R=89-19WRT^DO- zWI7$Z%0eT2%v`XL)X{}LIIAoU6m-RKt`^pA%DMmKY5v$^l2aPsD~zjnT5&` zP>qkjDN@}5@Dw5_`ak9!5{|kQtW$IaX4h;kl&-3J)ti)!JIt|dzFE-xJiz&|Z@2=D z`b`@7pN)jYLoz%qpo~p4jnQdK^QLWl_sR7-6n1{pcUB8~o7H8t3zFL|+Io0=!-SQ@ z>*|NGHz0R2Z`Cd4KWw#u(znyN6H@&H(2I8rI+h{B!8C$4jlY6$l*_vq=K?L!Be1u< zqOEQRHl3Tm##87@8s!=iHB6-ocN?M6CWh>WIDu&sBuGjJo%{Iv?}mlU!8&bhN5spgwGcmZD zgyTr%Sa-xWXfHME0&P`Zl><_bJ|O$D&7o~ZdN0BW0G<~1V4ItTDs+s|p~TIM);?g4 z4!fmy0OEt3+sOjq73lFcPvO$vvS7D5FO;i5fz&iuBhja04`>%jq4;ZJ%iQ{=Zi=)` zfTI39(nf^iQeKcNv}-TJ8Z|UQq=uwUB?8ig!W!YBVy~B=8?C}49D_1rwElRqv+8_i zPhs()4E}8IMta)*9Ati$mi8Kk+P#<=1tK~4YL=pN~z=|zMGXu8tb<@*e+q#hjtMs; zivHXt^V)TheM%anq5zk7-ct+kJy}&8=75lYI4fXcHfccnMzcEshU}MfeYs4#wiakl zekE6Eeb}CI)!4%Gym%IlGqXKJkw=~BVNN3YqsS*NP=d;3WhiQ6HT0bwXkEF z$fybu={=j6{42Bqucw0qU+HPw=^+q_(z7}M6%(26y%#us3A~hX6?W`k>`;hzBby_0 z6^^_02YBjrsKo58n&40I)W%%dIod`zZUDJSLz0?h`A$??OqQgIo(6e-+HNCB4W+II zXPg>OG4sK5$=(%O|ID=Ub-;^smVJ&L-4m9j3TN*P?_|ov#0344K$6-J{q*P0cR;m(*f*y%v5G_& zp<@8|0ce)fccEKGq98K(as4PA`b@<6r^ut|dKNO9H5lh+eS@HZzPW8Ug@R5!c`#ll z`&^UnEVO2$yUv+l>rEDair1M*J*CLt{*cx`e;{6`PIf%dI7JGMYd)CfrCtx!1{o7N zQZ56v7ytfaheI6)^y9wg&pHms{@;DcUuy{D|J4xu0sk*X6kfdU@Wa}~DUPKt)N#S= M4j#po95|iucldf!YXATM literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_home.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_home.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7ec6376e3dd36875ea1ae65f24e9da77e381e9 GIT binary patch literal 3082 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_info.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_info.png new file mode 100644 index 0000000000000000000000000000000000000000..f914bb34da3133c3584d91e555c1e9471ce44e2b GIT binary patch literal 5804 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_lock.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..00321dc7b28829f88d3a0cf0e4f220152886f45e GIT binary patch literal 3188 zcma)9XIK;I7EVH0q)0L9>Vk%%AfT*p0V8CH3Id9Nf|MY|Mg##tx(u4t)uopek)9Bx zNr@0eLE5f?h^s~fq(s7!C_zcUNE^i9oy2?Z^SF9IA2V9Ty@*Q$;yrOYvuGT#QI^ra~37!VaIFqU!42S%R(+8QnK zF{?g!``NUdKWdsU05)>yOM%kgFJ-oJ{NOPLMhC(rgwyiaoj_b%O@q(^!3ZtT{>AMqPo9RHO`WEyOY z(NfnzQfofansKe>(;ZFkooXOKWl`<0H@1)yGYfP?sRt{3BDhzF4r8xc#A-Pgt5|+CmPQiEq^QOM(zf;1%alQa236Z z>Kd5M84qajQw_);z{>&TyER9vGiTQ`Prg< zJ`YsOuyd_}yGZxZu{&r%?DIoiL`Fx;)2X~Qm@an1bmFwxyePhYuJzqHU}(<`Efpn` zEHOKgUgB(WH|+a+kg`?&GIr9@OdFrZuNsJB5RVV^%!cw$&{Cmy{n(Lj8D*!Qw=dbT*DuzVzcc>vfEDC%x`Iqy%0>820U zj`3!84b(>wc{h&F-}_uE%D&UI6h0ryN_54SJHLxX_v?Tm=f`3Mif@B zCO^3_9%^cYVt5&E^C*YX9+gZQ8Up!=IQ>KS?4HOb9m5UI5=uq!XPsY%oS)OA71+G-pzGq%M;9Nx^+bxgr$S09*-g~NvfW&IJ3o#v)G{nkP_wISqqS0) zM&$!fi*K{Bt#!3o&6LRS2Vshl1XHwHCveJ;a`7TCO+o= zUJ|@9)2cZ2zFTt=Bv`;@A+kr|j=Rj@3+GFJWPkEwK6@p?K94lsdiqG%71<=~k~3mT z)*RRn4N^lQ8{1qs&!Y2Te1Nfk+9ui&I0KqavMmd=kvf^w+=I1B zcS3?9>uR{OOks%a96b}VfN;6pD9RF zfXfZ+yIZgcNnMlZIpXn%ZDbL(LHV9=W3;eai+riozIVj5c)(i_35YH2?HHTm3HO zhl0|>qtO)WGsfxbDJ>$b9v)@8jChmidzOJ{70Do*2O;I}CgkaQ_`dZN9ZtXB6-2)V zc~2{OMHb@V5z;mQc!)e_8AS?C&qSq$b1h-i==J7@s>Cvk;d* zw=uI_of4THT$D8^5*&H} zF*04o>&sUM5=h4)$SzoJWXrVc`n(4(os?XSxo#Pd=Cqa9$#OY^a1ulRtVAiO?;JoX z6Hc4KDH5YXS%lTbqtGUJu3Ijo0EeLqyh(=h<_aN_U0y*&6IKDRa~SL#BXRy+-T~w? z`8Qzz0|sEZy0CKw^hEW`bQ_h0E)MzYcJ7Cqk zPO=TenrNW zXZ8kRptF)BjOTAO$x6DjeiKm96q^Xgm^Uj2Gs96fX-Pk8lisEjr*(gO~u;L+qFTBOjWiu+aFT#_xA zBX)azNGO@QzzpsEtYINBj>({dHa&b=Oh%tW=ZNcSi+z6o*MW4l-T3%iaP6`%)jrT> z!%l#>bmhq%M5nUrYxAPi9jkx9&ZTIQS#k~}9r;RSrAMRNXQm1ketVIB!Ng7~h%LQr zBfsGItxs!Ci#ypRVu8`t)B9GDSxd0XZuv@U+Ou^vf~vZ=y&qQXkG|9Ac}ulu}h9yQFDnTD{`t?kZp#f zxPQVbo0XbWU|neg{_w-0QwjdNNqXcYmw0L306Z5S68z^?3xeR3V?@c)^4>;jkRj3H zJ~)NP;6Bil6hzS;e7x#QU>f8Gskoy4qWsC_5xCX3at`2QbqO+@Q6YUwDQd#R8zdGA zOl&Ik4S;!#MT>j?v&CZhh3oliC|>{eAs%POh_*O_^U>|6B_h1`w7RoG7Jfg2LPJ;$ z^-suWtDzhWkY8BNIROJo4rs9%`f*^<`4z5SBPvP^{czBb%7 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_mail.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_mail.png new file mode 100644 index 0000000000000000000000000000000000000000..48d1a8e43f32e520ca7943eedaddbef8e9f43a49 GIT binary patch literal 3884 zcma)9c|25m8=pbl&|)o#q#;X|gsdI9l_^UzQMN2MvM-4c4(2LlpL@|lIBu@o5ZSZ8 zm(gS$*(tncV#17R3}fu?8Mn{7eeS#bF`qN%d7j_*S$@xQo_OpP^gaPe0R#fE@A9P! zmIws$827hlHv)kWyI+DsAojB^UpRN|-WYv6EXZLn<1bTS;;YQ~`zEem)zlY{w~wjB zw~R_Hsz<2|HrgAn7d(x=RxMb6BBdKEN%(ED4fIw614X|u|%f8aU#b(oZWpw7hr*Nl8h zufAH5NwFWnU*gxun7iqAVRnggPs1$ud%wPP9!wqA2n}N2?Hr}OW^Z@;`E5_iHfFCw zrx{DD41lqJ(Rs9bOF!I?wCRx{?Y4zlnfPhz>_@!^j>d6~z z+&AAa!}rBtr8~M-h0D?)i)OvgZXePCWQ}?5PIC;azuX5(E2C5avgQj8jiH;_*t=u` z{m4`j{)NE1)S5BByG`N2%-U>odr9W$(B5qsV9UJIizy7rQdmy&=uuTo>jU8v8}#&t zG@_=B$9MYp^j%+W4QKc+(;{{$UX(q>i(lR7Ol@8L@yiszn0i;!h6Xzf%f7@KYT1M@ zbQRu6ZLGSBb_QeaXFqzhX^1R5*I7_{c&SGrX#%~rT0?SD2gqqRG!yQ3+?0!c!+M{O z$nJ>^Mf0RTLm!H?4e3(gbE|YlW!1Cn=bw_(JV9Vi_X$MR9HUx1i+M~IZ5XJ$h_lrE ziem+sm7dHtsPt+llGAL#3C~fznV|3%%VIGIqb8h7NZH;iRfS*inK&Do#*q_&s#rt# z_0>Kj;9Mc`$JD*pk<%JqH*!qDaq)geyVLDPML=5;dh@x??OmzzqQmMfW1N1e6C6{m zDAs&w_Ze+z5lAu-V;guq5MvXDyTXs1LrQk@`RWE+&A8)LJ}Cp*BGAuCBWTwEcu7RMY6v0KFug zu_htt@f_%(Xi4=A>X&6^$T9he5iaKW--G*u zj~*3+#ZDR9jM;_{f3mpR#5fxS2|+Q$0udDZ7emACGTF)1J=k(&-C_xQIg$OD;h?

ixUAX$jwY7CpDWg5d zTVD~_6_3eB)8u898_h~i5~(gYEar|yit)~MVN6L_*Svk}djs*+FAPE#(sDkm1hDyXEpR6oCUbMS;Bu&$qS(JnAnbZ?E?I55ZI>*Q0E?v6xCZZ3n>m5yE3SDF<%Qfbg3 zh8Xmo8CEje{T{{sK%`b8@+ESaj^-*!1FjpsJ~RGe&?RP=;#yp!FH<=80k2k0Vtj0x zpsUoOx!Rd(8ogSOZ1oF=mZlnzIxtTrykx!PpvZK_aL(7JC32G7a{6)>)5$r)?p0D zr?`r^K4bc@*_q>>EuFwEU&+B3Dg`a2D?Ey)fQL zo_)!?dZDPVxwWd_zq`5$G6T4gM;|U*nP|Ja{s7i#xxbh1Q=^N|$Jk=Gx#X)R%Oq`v z*%?3sO}p8yeU+)#A8ZM0?B$!(_gKz~P6|4)5aW@WNXkpbn1rdc#zp?sg4dNuE#}^| z@_5Zj+Dd{(Ve_4L*`sWBg|-Y_dkNYu(Pds{*LTw8H~STOc>eS~z`AsaF=#uP?PnMM zt2?FNz=e?jN6Q-Q2@%8wB9&V#cw6}&YM3k^IoMM$oc(eHFQRzN>DA);4oM!4Y)A zYq>aU(21kJ_n=}ENVN;1Jn1gDgnRX$1D*sWO|EW*MQ3R-!#pRrh{2=nC7Q8+?I0VVE(ws;}{#P*rfVxYu4Iyp> z!K&17lvvFx*`n2L6_u_;qGV^gAa#t+PN167^f)!@))(zgVS$& zgZrbN&}TWnl9~KwCDT7IbT5D3|KzeXB*>EYz51xl<4%a!6@bWuy@i|C&CQ-D}zTkhQmwNm4c5Rr>qRvgMesmCGWM9%-QCe z`5M-i#B^Ciz=V*EOz^fKs1kPU08+Z>?5B?lK`+Uj#86#@8|lM%|iv zt+)10L-N)G@*5rNKN@w9y>PhxMk%7v%|@-KvDW&DYAwv;N&f+78Hd?!bPUzmC?Vr1 z=?qd=+uH!!?XLsja0_Zj;xm#aJ`OHm7%z^k2zq@cb>H{J@-gjB4)ODCe;4G zwCnPVO^cSeNSlvMauinB%2lMPwy{!MfgEjlZ7Rw6&gM_S5GM<1ZTF=TpoF8I1XP#U`Q((|@jBnDKQJ(zn}MO6@6#|_UH=%SZ|~VG*wEqimy+9C>*f| z&v5|YK!G>{HE@M4V53$1{Ithj9iyyl{79PzXQ$jmpiVfq&E6*W9FQ~#Zcs>qIk%X# zipH;YUjiQ{l0KNRgQZCBL#jvFW!YhaWRRc+pzyHAhmSE2dx7EEov)v<`)Q@k(cQU3 zEl_3ShLRy!a}malfsKKOldX{twUl&UwD@^5V9-P><|JvrHU;7c9s^9J_B^ZOfNKh= zZK0K$rUW!7AOxxJQv4kekLQTV?IZ$BOn`|Ie2TR@RC$>CY{<|U{vvFP!}OwzXJJbT z1)0oMQ(WJ^pEz-tDhlg53F7tuE(*5-e&9kUh`{Nm&pkJo3_Eb-82lwTN2K~7O*Q@i zgNagHqBnO`>>vq~S-~VCPrCiz&jUN>6G=KdKA^$EBQWTh9pbmB2tzL1sU_H}3`4aL z3UrKz`Qc$FBEx)T4Q}-XU4o|z*Gg>)+*-clnm+dJUddJu{)n3lQ_1v?41n!N0h0n) z`?;4|aq!CtV3IA>H5Yvfo>9jEvQ;{V?^VP$)^Zu}=vOMg(h?JC&WeUr{R`Q41w4z2A*ckXr_=OD1PKN=M>LDe4-5ssie`z3A z)Z8#S2>a;?ri3)4`PqIA7{bvtIzbox#ozgWpIot3;T)fOTt1fWZ zW@Pd7IAuUnZP@WDYqBcBf*)SgcJ`fbkH4=yNO*Vqw@qk=1PlBJ&Og?sf7+h@tMH#H s_y-Jk`}($o{a2VBsc$-k2Df<+dp;F`mR;rGEf{h6;*|>}-~SNvH+VxEM*si- literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_medal.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_medal.png new file mode 100644 index 0000000000000000000000000000000000000000..15a011099ca97461019fcfbf9e4519fb830a0fac GIT binary patch literal 4573 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 Pz&~R{b5fDPFH!#jYZ=Cd literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_menu.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..36be86412d06e2a882f7b1647c818290277cc2ae GIT binary patch literal 2323 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_moon.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_moon.png new file mode 100644 index 0000000000000000000000000000000000000000..bb96598bca033c964526d5e87e81e29ec5825dff GIT binary patch literal 3117 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 Z?pszq^4n>N^fv(JaLm<~V{`V#{{Y;Il6wFE literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_more.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_more.png new file mode 100644 index 0000000000000000000000000000000000000000..40582f72c092aad8c0af69d235491bd618cd4a0c GIT binary patch literal 2148 zcmcgueLT~79RK|a=OKrXTS%u1wWtWSN{dO+ne&jxwVbk{Miv%7+TF@(xOJ40tI@rf zr=|zV@^oZdwzi3shv;UQMlyvR$*sFT?s~oQy8gO9zOUEk_4&L%5AV+(pZE8ikGF@e z_DXF40Ce~5Mfm~%xcbA>)Bpg$h{7TRfF^t&YPUbB=T%>KY=ArPTlj*GMP{*+`z>2_ zFI&t}_Pw=MmimS!aiDS1^R^nKQRYJmxOvZRwIqMfbtTBc4I$bk#}_VfAK5zIHM(2n zFjJkThvmDSyqv$i@fTvG=aRwU0X0qi)d09eO;crqOFrRRJn}L4 zKg#?C{$zuX%ltLQXY@ppA^i^%t9>8=sz@LK6^T!|7LWXszhuzuKQ}RJ5nXZ6s3#`( zVw&i}W=!f4w~>lq-{lKC{kWZBm}O^zGrV@CCaL2?LJ)I>Hyfe?yZRG%jA4{1Bd`dM zUL=WiJT&NpkQU`o+*6htmo#q}?j_(!d=yk2GrRZt)zy&Ecq!Izw(q4qi}S31m6Pa& z*>vLDGkzF~#Q#~6r1!gI#5C3U%Dpq&qXTCNIzB^X_u~mcj<{51i8QRMc7pCp;%1=5 z%`ci8zUz;%(DbTIx%oY>)4wl(CUWLjJSfaoNFB!J8tb|z!(T2Okk=3@F^=mI6e$T!rM3NU$y)(@oq*r246O6`));l^iKVi<+X76iqX=O zmATChkCkSyp}do(@aSf4Xt`d`E>pv6r|4pQy?K4%)|gwb8-R;1%oEUbZE+EYd2eDA zn;Y<3r_VBO?TtArb4IwVSya6dZt1EhlMSj%@`4}@4|d~w10s^lmpx|ZGq<=resAxA zFOznhI>=tLrBeYLLj+6?OpOZFL4IuO7&W^E*OKKZh};kH%?oSFE?T-U#kCzvqd|Us z#Wj1EIi1GSVg%JSV7L`wEQah>Fh=l-u%PX+Zqp@cek14=3w3zbZjj!;P&Dmz4*m9k zV0=SFS$W9$wJywB@AN`e&H=8PO?^$%ra)-c9;435qOb=H&EeN{6JSnoLf!9jYYcS# zhA>oU0D9JTZ^A*>cV1=Y(Bb28A{YaIWM10JOBjh2r?qo&B`HBu0mMhfpl8Hm$D|`! zXskpQS1>`m%pg$)cGVyJ+0un)|2&{J!G4f$!l2|4n&NrZQ?^}Qz|dKAl^C`s1 zlvq7?n%cJHLOd+ZeOiesy(E$DOJ_^pBnnuAf(aG3;B=FM)20Tds^kn&)1Z{bD;drd zD+YXmf)|1&kDISEYhB5BxCaG#%7=<)?r^M=3y*u{25ye$TJsg_x#e%L;+2eJ!q7*m zoiEr&vy>?Imn1rFtBi)0_f{HA1?b%7$d1k^+8jqCi70Y=Z`~nuu5z$u7M5z}@skqe zeE40CvtqrC2b5Ud5JS-PVJ&UFpTm<0L``E~WOJ4d`tfA!QEY44>flq7xOOE<$84_^ zavO)3@5hmqH=_%Gjf@KZ>2MaWxR@p$pB4+^zlqtwv_1kIc+wx^t?82%GknZ*IU}?( z6jQx9E354UU3`{AAkvf-F;Hume!*n$!I>wS=fqu_!VAi<9j-YUV)-mp2!iVyl_ned zV|O7+m319G`OpIiYK@WJc?J#Va&d~Pr6cK>Mq3#(C|6T%khFY;j`>0blA@bTBHmTe z-Peyb2;6C6sCS-DrDFKLDWXo+IjnA<=`14I%82np^RuEr+oMiK1=^>O^@yYR9)rZY zGjvnNS66FV(mL)6n8M2g+$K_{JTBAjeX{#=N!X>R*X{miE4}NUR;@D|8G|{yD59+i zo5IF--vPc2R6Lb)uM`<4WH=h%!z;FCm1GlcS;6g?yk59KzR2ACys5?f(_X$=!>|*gu>2doFNr$~tl*evfXe{nx7B1F+BC8^v-x^y8n!98@U) literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_mute.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_mute.png new file mode 100644 index 0000000000000000000000000000000000000000..24abd0aa925c5290ed483152cd4dfbbdb6ba1579 GIT binary patch literal 3685 zcmb_fdpMM78=o0OB;-`u!IDF!5)+DySxeZ;5JD_DtZ}GOhH-k!v`bEDLP}!Zv3=_p zmSKHP*=m?dc@YXZ%cvZhj4_PE_m17~kG-z_uJ8Nf`(v(o-{-!c-~HUb=Xvkvcc(fz z+Q~|*Nh1&lSqFQYGYAAyQ}mPChCm>ceyXG*5IYYz*nHy}GdMT=iR}H}k9~O~y?LhV zvYRmJ`vHf{gC{Y56@fntW*rI1_BrzcoxHDkCbG!EaR2$k?fC2OcGP8rbB9r4C$g%H z+fA>F+Yj>ioB5s0a<`~s+bVeZmPBZ!S!A3bVD0{~=~3%_KU($g?%5EB+dydquDo zJO-Tc5=JdZqHH*mn)RgQ3uw@X%uRVs@f2V}8!si_&}K)K*NjLf9Nq`N z#j-dz5MSe`lr@mn)Mp2As6<4j7tncQtw}Vh_~$55LJFx>C6JOw*^syjFx0z0p*XY8 z!o^`5C^#iD`uxR6{P_?Z;aHpAZWVaS@rlI~cO_<)=SOZ|@Dla~k|B@MjYlnEzv(VT zEt~j&2=GBFDj7&jqta@@1-pJ?QT}{Yu zHltj*R=OHl!wiqs{tjhRI_bhg437!}BPdgY-Z9f`VkqzFF<~gNak@<3`~58X=q+zA zCHkFDvI{1_rd)zP{QcJVu@#r*&_t5M_khDhOB{!^R>#q+5wX?JFK2&`o zkfz4C^!~LYuwiBGo^9oUb$W{dpMJ|8N`r*Vt4`N2Un9%T10x5{Q=eFZ?}6Dop9xBY zACFSgN@=`hM!qYo4!aEGRq8zWG_R=nLK)QB7R)YMs5*)}Xr+GCwd4)&)ablhn_kRs z;dc?vl>#Lrd`OtP1vg~HZ!|qA#!_ziDzT5-V04nI?*@!KOgQ&XL|Y2fc3mz@GOqRR zr?8cDSvlKuC?hLjhay9|y*L;tjX4Xi9tc=}+R%JwgWerjgG0j`Yx7~kr52HNpKUa$ z*lZG^Gte_0`{-CbJA;OBZWQEW#_WF0|0%VeviY3mhJ?OjjxnNO#X}cMh znze#}Jd%!NXtB95w19pKIsl!+@%^WRx3bdDpG!l7V_#+}ri#TRvEUFh1$tF|Z>oDl zPrPLBl~PW}a~Ch&pn`%$-Y#Mmar#p$vp^=F6l2;~I@Msy?+=nz1cRs>wU-i@?%Q_S z(Fh%_{JG~BNRR<;{9`dE+DzKXOwC(JeBOO=^Zr-Ed@J(RYF2_CdwOq(`N(HqnS75i ztG$jzs}~~-Y%?dwl^YIUizz*lMR!u#ZW20vY8lNqUT>A_2^{Lz%dW7DvNLM5z)xhW zfc4U9jQ)KZA~z_f`@Za`_oh>A!xe)cxM>RDSe5DVvBROBsC_t@NtY>v#Hh!ny)JkA zNU864zwvHV#*rXn+z+h_E~SW6s7Ih=iGM8CLO4N#a;l5u3v)Ub{hTebjO*EH5cz(z zTWJ3NC@M?O5;rW*81r5AxuFh@eSG_Bs;eti`PE`o(aX8&31;|b6I$TGa4M^K2&J?Z zICh>V@J2Uve`a12E2j?yv~k{k?(Q-4QQmn=@N$`=DxvTF%WPFanmTx=Sm@)yeW#AW z`EknznGB4QCfD;Tu>O-q^l9pkms)kdDo;U!_dMm6u5z%O>#e8m4F$9pOOxYm#rEMs zxF3E)NQ|Ek!CGIQ#A5kZzl}+3kKphr8buf%+op^59zh|1C%Pk#z=Q9jblqG0>-G-EY z(op%98?v3&E5-FZUeCTkQ0DMMx7h<{CST9N*6qu%)$+vB+(iyHo#4jdzkqFb+KYD} zrQP>ShUqy_7GSj8{?y{_2ejq*x4r!cx4+n`Yg=SCmGs4~uJZ|!f5c*!w{W~${n zCCDAZ>|s=;L+Au0Lt@QL!w^g=|MVWZX(&3edldr#c zEY#cDQm5gRdnR0x5OwOhqoo4iaK{cqJQ)V(iI!ZE{5;wm_xSy4tgnp{gNH~Ztcdl- zzJiQhlRYW*A(D|r$er(VoK_|AQ2!z=Es1yey)EcZi4qC8CnD9cJ7#0 zzE`%zu&74&Na(+uvrU8M=I&<8)%!ZqN7o*9xtjbz_m=Gjp<}Yef>o6F2hM&N2P7Tv zX@ke>P1h>MTrqfGMbLspY}|*0kFyzz^8m)Ww>tD352ehw8sR6HhjBkhIpq$~OsDx1 zY>`>bI?*(bQw|dab8jp@Q`i2Eej3oV>$HUn&xi4Er&r3vVM0Xbad04ah?xp;$F(!? ziN3Y)H{{!C9!xh(pk7yjeN-BU>yUB(Fsdgif+v@vIqJF^T9N(&d!FFP_opb~Bm41v zQnv&LZbC_iWSz()=nyU)x|Fm#iTQo?kqD6;>U?!n| zkpxXTTp#xffbk>0Zt$^kABcTq4Rc4@(G?~pG)^ZpwGOLyM#1%t&FtLS>hnDIkrr%T zIYe=wQuvmjCvc7&-?VwUN^U+w9i*}E?|gGr7yn*nD~q;nIcW`sT^#uA0B(`Prz8az zsNs|>agX&TRkJL;=qijaBH||C+xQ?{uGqvn+9}!PuqV}NZ@DXhK;!t(UJX@-@fNvo zL0wwzRXyNS4N=WG2{-Pccv!pu{~0(Hikq)gLc}R7aU_)CsepA zk$`!F(Q1&fK&XxCt(gC?hd@~d?J3~}3j&nkflC)U=}Lx0F{R_G;CS%U4lkN+a&nOj zygL%IU2AO^3Q)5;{yVzG;%9d8`zOz;dkh1j-R3Ieefr>sc=>YO6Fgclctteb=; zn24=n1;;EKPtBlhm*;BnK91SUb3?YxV3Oj(edZH%vIP$#N#SoEKL+h+P!+pa&HWpc zO>a2gRO@yCa42KMz?)i=0)Nl0IL%wRinXji@?z#Wen~WVm%X) zc_q^Z!EIO5-Ag0t`CbLwk z%;wl6PxC40%Js-L?tUTL5NU8ek>A%Ds19Ntn8~Oz`nL;mSeyt+jwo5hr;=xtz~Y4! zNjsxwSnB~+aS2>f=Z5+yfVpLTRUloC*ff|*7_f@l?li6)Y0eZJLDkMDk>~)BG8~Uo#+ka!4s@Y{RIe?F9H@#5xs z(w~kH|`9*44vt70#pwqkRbdZfASzVCYH7=ph zNN?5?z0jPnBI(}El|t_^*M&z`?CiHx{w3W5-XY6}4oqr?Y~7$U9qS_P^` zsg#nm8Uf{Tkpcn&79o1mRYokD)#UK}$X_W<$_IqTg1Zpv0cHy~8C3qRuuSR~tos z>{4!jp{ViT`9t=cQ(Q*tw|lmycRYHu+}y1%dcb9|%WI?fA1s%RE_2eA{&HRPUQF!H zQEBwqe_g6nj&@&_Sp~P@VKkcbDk*Ao@`0>Y{hw$DzmFztNNKAf zKb@~v<93*{S1%x6fmZuLS9DjPCddz%a65nr*n#Q4+y8zG=*r*Q|GM@6Jo2wwpsw(? z&otc*xovuMdbo;J)~PIjX>5vvm%O`F5$-Md)yuE1dc9JJ-3fa_?o6G){v| zK0dZiCqI_G7vWUUSxMDHcjA0!E%{2E89Q6w?m|Ept)wdDNA4aX3Bu)f&pecMv~X{$ zG86Uq%5HDGE9Q%-!!ks7)Qev8R~l3PU=Safq+9_u4c) zIKfyI?i0(La)u1aCiu>!FyCMk*Rq$!5g3r6!xgYnUOkDAB)XBy1Tu&Xb#5Zh^#{&0 z?P~TlqUdn(Ml??lfd!AHOgb|5r97jBw7on{gn-T3@SV0We?yVxJTWwxF3h;BeJe9L z7a*^@T!?)$VU=8Nz_e%MlBme-w2y$Hk*Q}*~Tp6EOn7~dztaMS_Vm@K|X9o1; zpVIu)qnB^a^gkV0UmM20g8I7)AB2Yw#D(@DjGcEub&l*JX%vR-N z6@82Ar672#10c&p{g^_8BX$^(AJjyb9sdM5!4JVwVMt!ply^dQQZ=Oy znENU4_&F4%v@a3u=oecP?;m|8_<(HB%y5Ebp}Lg2kTgr^+tp_SmUNv|Z3V>B06ybg z(|WRkzGVsUt%TPDPjiMjq_5X1?R(4L<(iR0LFg+WJ@rpjHNVWsig=-eV(ag& zqL5_Z4ardJoTPXpte4>5ALy?s1Ii#2r4E_ZtFM!cg&T8=RYJs&>k2n74bXrwJvyC} zTKil!a%muNM)V@JZDON_1XNPw`=07#Df=gD>h5NR{V2W9%YB1bQy4lF#qy{0+UQUp zduH|0$HD}Fi#raZ4kEL_K6q5-Wb_C2c)7!6+G1MDvtd0ySvtJFgl7!*dgRo5-qd~} z@+M4oI-ly5TAXk=A0WSAIbYC|%DYpQHB+0_@{|qCYPfW&;s)L|j=6hXE-GdF*kdJ~ zi8XOqbSGP-J^g(q@+yx;09m+-mQTXycv9YQ*6Hb63VFoMsU_<|t$6Zhg8u*` zMqg`nCCfKk);;&)pugW}(iQ@hRI=wxWy=0AA0KAxEYqfHy1>!E?hB0mFFkTX5=hdJ zHvoaiveZLwm#!y)LdyfxtiZL_ky&e0$LEHc>|lPRyDeh=GNJxvoV7(D-Vub?e zV`}oCGbJp-$DNrGKA??tVSD%M@6Tp2BI~PTLjX}siz4=KAp0?QJLf7ete*-3*45_B zI(UD#V<50D9O<3(4)3VFg|!dhfK(?a8F@8_rs;m#=f+~h(*X0~kX+hF4fXM3wyIKs z=cS2|yFYo2DkOq`xgl@3SF34B>?_S{B3tIZt4}jWtf*l=-iaYVDlie{Jd*k2hJq;s z?nr8B>ak}g^prVGjq{Z^^vF?qYe0o4g_6*fNv!9qm?Ff}6mu?kcHPLhBSUT3m^Yg%43WJXw1!%-=3q)0E1U{_K?}8=U5lmw`%dh{YxSoOIdtzMkF+W-4_8wo=CXqD9H_W2Ay^ne#s-*F;nQ8g=;h_)~9fU z!N9(LakE4@p8nhyZ6KYlfLt>=G4F;&nTSbsD04ytgU{e6T269F*4pVqAz#khn{-X^4W{JiRFjm-kfa7q zV5%7e7$#r~!Ay`Jk2Z2kL!PuN<`SN}k;=nnm~ZdAI9Tv%{79P@piZ z594EE_4b`dUysBxv9|;DMGnk}?&QZ>x&^KRmGtZj;ayZe-$$%U%y^>AO)sb>^XL{> z@S5(b`9x+!tsbE7G9XRTTcR-aRHOv?*#X1cDLtSK>>C~iKd2~U=vr>iJ%$U` z{>~}fOA`+-;Wp-Vor!i~M&QA4#`#J1+YTssm@u>$-6IK1xtA93j_OUKqbe4^K$jwy zJ9(ru%gU*_N|5F@5pv0dcQ0)Q9rbi5hTKwI&=y$zSqbvH4G4~is`+-q_WHIFZ1Lw9?YUre{Kt@6D|#so9u;<%t`vnwCFpn>~aa+3)2&B$Q?E zTRwo~MEoiZ)&09G&0p^qnp@8Qdv*Cox1t4PSoa@XqUJAMw~nbz8EfrE)>du%0bCX# Nziqp>7Jv9j+8=GwHl6?g literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_next.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_next.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9f3dfba4c5e99ee300e4f38b02ca46a26365e1 GIT binary patch literal 3403 zcma)9X;_n27QP=L5P~2|6eMgKwN$85P*(XSS^>c-5mXRSE1)cvH3mh425s;G1R6yg zi}e|Bke<-VHxLpO&*QjOGQJ^tX|}! z5o5IYiGwaPsdt@axYk%=;lh}&f?njYT=mY`?I^6SiU?qA&@-@mm9#y0-iB>AZ;$l` zG|jPf;C{{=9zfez!^~!B^`y>+ViERWZ*+6U@ek*U%srakxTl+I(a(aV9^kCHxrf^K zOM%CH&QfF}G(kHwfwRyA?a0PIvHu|i{QeK^{{#J}E`Ja4DU{#a@#qRn{2hi8WvPP6 zN>^%mLi1>9d(1sAVY&QDI(N7J&&RG^oq6#zbXbSKzSCwpS@!Oi6E#6?Y{TPm@mTgD zKo`gmJfIOM41uFHhk}hM#$`5hxB*U$-pto9+4p!(q&6UM7yE}M0 zCQWR-%gyNm{D3F2Z7v#AwMG`9n0~p6D%hotyUt<$T7^(F8C%)S0!zR!Wdn7-H&` zPVx=GNZNT_lGe>u2IzbEmmkNwyR>LxMD7wZRA4BZcWH*k(Y={e~5Ud38P2O z#C2@96jddI+y{8L>K1cR={u*pE#-e3V@*Gqwk2d5nE|9=HOzlew{GEies z=uLGY>`iA{Jn%|?tT+urDFJKDFmYF5j#ly5kaogu`(v1f%CE(Iet)+-a%gPo<7!Df zjdcnSKDR## zxjpH2XZm_?*B4|JpWHj+OE}k4g?=-G9s2NN1E31fgL6GYc&uzy?fa`P){+YA-hY^m z_-Vp~9jzyWCN&sV^g^z13{W!yiOxkT!}oXe*xt)OP-T+G zdb2S{8_STIj%`K?9Oy&o!n|r>ZQrxu!T4*o$P*6kL5mU6ZQFXVZG=3%+n%LMzlc|I z3GjcmRWYZ0|Fv^s@giZ|1BipiNulR_C-kFg=yJIcsJFC6ss|CY8K3poidvstzF21W zb@ua)tf)))#};J%mPgV6EbWjlHNB-mDG;@mSBh_`5l!RHwS#s>0;ZT5I*h!gK#80b za$TGxBjWrBYly3q9tky=c-EcFv(q)6qkU&2G@cXNE!V;w>akbWgQySEqPpjJ7VYZO9s&Fl=^;GciaaEXJTiHn+j_v(jYtG}2nTD{S z1QNPmHuYoBzMVw({s6o}TS0aHmx@87p`niv=aqRLF@-X{xlA9ZV@KF^<$--K&VO>L zK|<52Lnb%6*XFf%-7I)Nv7C^psbX6e28Y72dz0hQ`_H*SXk!>S%7eJNe`m@8CZ9(x?+0xKG8B|aud z9Me-?`m#j_4@Ov64evQ?tddqPIO(;AT{jc>HnpmF85Pfvg0~R~ZK@6VFcQ~!;hSsC zssXCUzMd%jwb=Kr^D(C3-N1G8Io>_64mg8&OW!!~v2Zc&EWNp7AX^RgiA*pb4LadA zezkhHxa~z&riO*)YxS^^z>8;NJ*QywJ3L(Lf>HJ+swKW zH$*jbDRkNA8D6$-eMjNg6KcWm7n&L|C{qoJ*?MY!sy(6w(MUt`_Wd`WL`|?9A^#QA9 zZ+b#Yze3cJNMpKy-d~^?R}dMNk{6Fvg{3IR;EkT3;37?x|E-{G1?twj3Qg zE8zMH)baotfm>AT%HcM3u!f2qepjC4-MmN2f1_sM zf|tgazDV|^jlDihmraEIpav(Am>19ERS2NcZ%mn0*h8gflA&8J_;l3-jqYr_-&7y4 zjANs83&t2<;gNoSX9oo`1F6qNQXWbxy6n$1E|{GUpK}6bQ#Ws|vg+T{pS5760h*8C zt4yFQzOi1kM3r%hT7d-`MZLIdA+GYv_nVabCMXOq?lMr}^1$Zw3|>VU@@Zj6hS8TF zuaG(7&8)V19xPTI;nRL#04o{k&UucnmkWk3YlF&1^`fL%UmBsTksqv^>P5Gp5~PhE z3L%|=oleuoY0T^k+E_92o0a{q?$!Ub;{VZJ{oB{TUw9=bA++eai~k?iUwByv{AP$H YE;F@DSUSb+{l3rhy-0Dk zmy=bK1pq+K(ShUw03Z&2P#XaNP`pq{0|0cjBgxh+X5j76%WTCS@S*?OCF|=BM^6}3 zIowYktGZn`(|%}7>S(duHusyzuIp!>A7CgGFE9A*xBVW=n=Gc`QHZArV|ZnyjQp0@ zHoI?XM)^OC^j|K>dz1H3v#~F4*0khYPeNSna_$_pW)JW!*LWj{!4YWy5{1D5AOeYk z&LH9oSAUKCC;5NKtdqZ(0E3$fa}*c)b01l7?>D3UgC<>G5Y8IZ6JiJ_eI&t?bACTE zFu32Bo5fdBm6znxhPZ3$;^BFLuAf(&bvrAvZr5I#!zk101eZB>Waw)`d|6}VK=o%sx5>xA5_0l`Cg7q9-vK1qLjkI}L={v5A8$=uH^x z<9pUwfmOb`Rnu?23ZqS=)@5DePkqHoFiUozZ9-jUtj%5XoIe9|aes}=zDn1@u?DwJzG%SB8m1z8` z4SCZ>C^o&a?ulM`u${E;BL7ELs=^qVJDQLvR|B_z0o>pWM4Argq#O%+MY<+*b%JW! z=oEP~VfU~VwiwUTi>R8)zU>I#O6xBq5@H*dD~p!7i=p&%1(r9|(r@uZnbjbbyK>PV z29*VBmVTuYM$e0GaXnOTqzt7v(X!-4?f^z<8zFEkvz%a*sIfXIrd~DsTVFjE=dw|s z_g2ZE#sJ;*QtGj+5=$m6)n*fSXh+9Z5TD{Ej_L_~S*ERK?Qs?AqkE&umdKnAEf7y2 z9zSJNF<~wkx@$6{V(ooZ60|?b<1(qb~||Z zJleeiHDxd#rG6RTRkm-iCO&RfZf+B^*O-vUTb0)(wn*zQLV)105ovBSb9*LVaP0!* z606QuGz=euxz85`8UNb$Nzj!_x?m-xB!G_qVBu>DS zVuhpTn?U?=no!`^^(63iZAe&5`24Hyc_Am()P*|4>vEKp@`wR{BM-i>`u>ekWHpwN zbuSf3e+?dZC#Z~4%br2$)$sz7bTq+YXP1U=pB=&zNz(dr@pX)C2$CBuz)$U%5f*m_ za-DIb^(zqXNpq<;>4#Vc50^#XQ+GnrHNYi&Tirm$XTG54)Mx&7g8c>*h!3X)jAl2K zJYA1Sm!L2RQV?z7u{{lg!y^=xwLm-CZ>ns`Ixq|HS|_do+Qipccmg6B$kHXo3L|b& z+o0f<4f^3!BqV4^+$F-|kn}+?J%j%f9Imr(9WWtc*MSuAcq6wj< zqA*rcidwL9x-8`&wH20y%Y+fmb^5w2iqa@yzTk^n00THQd}o^zo3WufQ_iDk&KV19dH>d~+AsqBxR0{YN6K5r<6@6osgIarr97~xIBumd=Oon&s& z*aRBO8gP2cHy%(6?wD+-DunRbGtJ>lK#3>Sr}05ikDyR;82VjO_l=@^4B%cTap53Ivl9^O7Lxd z_4xC)65o(Y%WwjYn9+Lx-T7gCI85$Y7{eoG_Ux#*Q0S__x(mOY8VXr9nQ9> zF^tf1c%az3ZF~+=8^42-^~8$2{(0;Yj7_wJq)Q4EaL7`^mZ%{Uf(4z=d15~- zsrvwmIJR)9W!WFhrfr0#v7cXN65a|;BiGNPh-%5ft*m#ja++k&lCVcQDsKmh656j$ z;)P5}f{JG1d#ScG7xgK>ZIC)Sc&wmj9F1_h0$k+(BI>ug{oKcvHl>Oa$( zROvXaZKu%Lb0IDqJ$Dfcf_(eiA^#S&+h(e$w|L@-d-Mt z?QCQG)UG;ulE@Xla~n3*+@1;iRG}2no2<7~gtm9myZkt$?_uZdQ-WW&ig3h1ABJXL zlR^E!TBeVv-==!!NxzlLlQ?3_;X(J!H~M!xs*P=uX_`wo=CWhr)=j^*{2y&q|Fkjw zKg;TW+cN(gkHJZS(Bex3pv4yhFTO~47yi=KUn2+KuEj3On6Nx01<)D~IPP;MRoWd* F`UkJ?3xogw literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_nvidia.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_nvidia.png new file mode 100644 index 0000000000000000000000000000000000000000..2cc4558db437a06303b8223d492b3c75bfc681d8 GIT binary patch literal 4099 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 cVZ4QFr3K0fsu(AF5|H#R?^={qeyI)m(*;Frg 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 C(%$j_ literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_plus.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_plus.png new file mode 100644 index 0000000000000000000000000000000000000000..d7ae3befb511079c0e4f8f751b7545b5a851a083 GIT binary patch literal 2793 zcmai0dpMNa9{xVYnA~M>l%nalR|=7_8_tu>L zpb~yg#O%Fm)W(dbVMe)QmY$23de)IEM+Vw`gThagh0|p!8t-wgKajm%NKMxukj>6M zjy&F4^-lEagn#Qld`vL$e>%%$2NOvEmZl*0Btu8SHaD*3U8p5V>!<05XJ9CPmq*U~C>~ZgOBKX`4vm z)$?8>zXVj{l=e$R5Y0$|!PYC3By1%c(J-vGoK2fGL(a2>omr!D^pBfE`ith$|4g6 zb*qpZxg_oZ4Yp#N8cHxGD+@D<7kr?i1YT8)mHASE?lFljnwT*G%!V%uHDtfq(PFj) zT9UP{Y!uI>nV;Bu57v#wAn@F-C;?-J1D-1E7sIB;z;v4wC=3qBtDvleWKgL9to|mF z#04ZpmHkkJpMuU*!_09MBcY|oTp<9Mse_8c`MOBy6G(>{SXlA(pyHMm1Td~v;$Cvm%%o(RK`v!=yoXCi1+l?$BlzxooGx)fXJ-O?m{9hrMyhwmS>9y}g~rWQj_H{=Pd# zYx+*Q(3|*aO@+72XzMn1wR0BRGm)wZt-+Il(Wf8lkcO#7JZj^sj^l6d7CSL|pL=qx zhS!r;ugv3gPH^h$Z{jF*rE~GgqT>PdQoow2d{;(q8;B{0S)2E-++4m?k-)Ed^%Zq3 zVb8b-zbDLk6IoynB%|WF&pVl)8sD5ps#0T!)d|U>SLQ;4h^kQ{rB8Yny(uss?3)mp ztS<0i)zrGtGi#GgA^<4}Gsg|E*zr_qiqqx;c^5-Fs@GP+;ABs+7+b z#dCjc3A{UfIM2UwqP55^RvlvgPMX+hO0o}`79ccYG)KiM4UC2c(ba;fL2T;FC{1%a zZ$Cxi=FNIQ*lF19hsk67NG)_$Yi*B7T7fhdc$ha3W@r&pb6?K>7VN?Zec#}sSkPKK z^;RawiT>W7=#ZnX$6yYLd_NAh_Sc7m+FGmMocj?+`lyANCm#c;yTu(okBTrq}3ix&`LBM_Hu( zC-dLqU`iN~&&6zm%{_@og=xe1=|Ne<`enJ(5to+b?)bVvz3t?(IIJ33>qzMkZIC|t2o(KAbkPomcLJA_lQ?<{ z7E%R7BGn6+%Ul7DphrlE3gEhk*fsM%7D1;NkUVfkJ^NrLLaX)+g}4?zYw6>7(E*Km zZBUNWe~l_wVqLu+c(Y%# zL7B}K%|lCGsLWEHSKkXedz3CCJ*O)^wYgCr6p~zjE{S;p3t~||bFM>#j|y!N$Mg({ zm<^zX0-xZ~YqhO4B-NF9!TGYI2{&9b4Zx)#wa>LuGcQBX+O`rU48FLuSV^(!j)2{D zy*Qt{L0LQV*`Svbb!SBn=%GwU$(+U`@knQ8dtL3*fdLQ0R?x4nKSn=MKnde%CB}l$ z)1;h%Gjx|ztg2jfT5j}XCUPT%wd8F!g60Islzqun0cQk#S4{|#>QWFi0n literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_power.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_power.png new file mode 100644 index 0000000000000000000000000000000000000000..f63a8624ce75f454997468163e0a51faf517a591 GIT binary patch literal 5019 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 TgKFHUfRCoSo?4~K)6o9{a*}^3 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_refresh.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..a01f5fee37ca1e1c2d20838cf155948a65073080 GIT binary patch literal 4328 zcmb7Hc{tSj_n%>8xXOrZk&!GVB+{1{(^c7xJ!+;+4B5g>mZ7PTElc)wy4Rj4lOao7 z8Dlp^2q81J$@)PV`|mT|f9~`9{_gYpe&>1SdCq+1ob!6W&v~8mIVZ}}!f-#oBtHZK z*>7xg!5RXAA~|39J_rON^0=G`fgoNPUpQ|YFuXA8e%W?Vnh1o(G|ZZq7JY_m2<+P@ z9?_XC(RJmifda-RVF3`n%Ro=>HS(-?aXIK=9ACm74b}ad>X0^TbnG zGuRk;OE$TFao52<#Ut%|LD`C4KzBd$|y*R=QW_N%phdvYPhYgxNF zH;_&7g&OgJ$MAVN+Xm$3L6y>X-PTv%n(^lX({_YQ2KSwVH?EcIb0w3S`1W>H+)mCV z|6qOY%2z`v$T6~6*9&+04aha~rh&UdhqNW~*=#J|Xv)qm6B`dx(m#0;-sZlj;I=N< zdA5l(nf3L7xqlRxG-ic_!T}k)D14qe{ao^;Be9IWl*sRdW|h7zRYRWslh#trY3x#adpziT3YoD)!V7 zlj}Rl9x5Y>Ej*#E)R{XXgQuXrE&-v!d>G8~gB6TTC~f8u5W;mXOlg#jKypoXm89aI zNR}xl4mx&{O(1u zBZyQ#746|e6sq{@sd?HpQ(OOFQ-9;>$!vOUKuEqZVO@To>$aMA>-cwsOee$dxQM!x z^?ie@b|5wtdS?(5xsJZ2y4zhHDLRf`UN15g|FT_;QRrUYBF!JUZN~#YmcB$A&FtNQy0V zxDt{D-(_t`Bc9KHW`8-)a7tn;r5UW}*VOB=_Uu9?Vp3aYg3=*E&rhmoc^}s|CU}UF z(o>^f9TY9vbEq5^i0=nD98d<_N+o4cT2C=loVMibS-E@-4xA84n_83?WOSvpL4DoR zKC4}^x_fPqtX5F=qV-Gr2R9&!2ajpFe1)lTi3mpkfx4)oxy1_>FO}T1;(IG@VO%IF zcRVLdr!RlIW7s^lnN<}>hwiy802059CpV@&=vjIUVd2-$kQN%eR_Dvja!2eI?LfB~IQUAst&{@6)d4o!N0P?bkyQgdI_DVLh;rUu(wS+bXakF`ayW1ke6ZM(n| z3drvYXyb%dkBZkXV}i~vzlko-j{I37Z!$i&*Vau3pW8S+@NMfPB_|?@sc{~}N|{3q zMPtgxzvtH;zEd*m>%l=Hn^pa|8#+4LmQ#d(EXM>(B*6*u%F?FXtf9u^{+-5Lza}5U z7DGV9RtTy3wP+o?{YlvX7@BExolE0;vvH7__$Secp&^tj;?#7Ii`ufab~?oMc{B!9 zzTV}Gn>BhqE(Fwo=pVMn{I8{bWLMh$5F%;HeVWj}xy7j_%~xUvGy?7Gq6L|`sL`w_ zMmE{Dr4APa-96@rGz)~wSBDRr9NSIDWf{}c?&}s?{l)uoq08W6z3G-Y7Uc( zIYxwa8${b@(}?<+q!A!PU>u2txh~$8bkIB;8 zhL;-d;6G~XGxFwD#|?;Y)BE})(myniFeuNG#3dkue>}lpR}L2W%VvA3DmE>#n<_rH z9mNT@+ZOfyuUlF#%-*diqY@#~3TW(SOz2v9F!u)bOLGQ0KaOr2@Cf9G;?+g3-q0W( zX7&TX>VPnkYwcL@PV*J|LPvO>UnKnt(@!HB;*(gE9m+y!CiwJ>b7GU+3%1X)R{3)P z)tcdiq@rH7LO{v{?mc_{j%-l7Z73Woo<^Z@YAyda z>WtZP;{1)BR^S9KqUNrYHwFK0duSy2Yu}2fHbY;;N?P6Ffr9K$@=R+F-U9D;m~gB# za7zM-#sqN{%Axp!QQR=4g27Q4_o(>yGhz^^iJM)!Kd9)gdy4?&N*>Z{H*INW|av8%m2+Lldpt)wyqbf=~9I^$I-B;q= zJwThO2e>)vI?!(vT~x>QKp`O{ngwh7##ZvQ)B6d#_4>E?DL_IqG=aPS@y{p0)%im! zZ0aeF6JzPDJUNt!`r&6#n9?DN=ZiSDfTUnS)v`QI9EpBoGvm*Sq$dED0|ELsW5FwD z#<7*og*=hCPJ|Q;OvsRRQ6}Cy<}@)Rx}<~~Ru+dbt0{e`z7PIk{?n5@9fn_1fRcCZ z+0!%#G!y4Jaaskaxj|5?bKnKfe1eA_K%pvL+S!WLKoeakjX_4H1n@05aEhayqjSm7 zkf16#-sx3%6FlhD2L7^Z6voWwA<1VS^cKS9I&beGQVflIEE+^h8hE&mLN$~qCfx=( zEFL!WZelE79yNaHo%PxgrT|yiWHkQ^N{gYkqhAJS{(kr@#SnR|7hC7ulqMtNO&SdHX|)&z%?fR zv{bDc$?iAx0VLXJ(V@GziY@S@L8D)+p$#;g@cGv5oC8?(z!cM?LDFv&NrZg28DN)ILXd$0mYxhoyC2kMZcpgB+L5V@Hv_mPP( zIQaQas}?tgnz$2G4W;=6UMuMdmS0aZ@?J2m@ggYOsXkVhMc1reFuP9(jkDAj$}}V_ zYGLDR6_lgLT|D5HUb;dyTN|@+^r;UxiT$G~2ln`AA#t^(bq5)KYA-4(6Tw>UDQdVy zzd*ReJW9>647!hc)1v4Szhtwzq<#(7_OYQ@Cnu3jm2%e6nsFO^cdWtvtwIPzF%leG zv`D40PC(7AS~)}R5XLmip|=RfqRrGrlot9hAF*-gY4H&4v|$rD8z4$T;9460m~duc z?%fhaoF6z?g!!CLRoRwf8WFQgmG5df0aoRg%GL-}VPksj+vP45)H?I!_j)?TjF_!+ z=ofIv5UMVq{Gp*X82)L~+;9qI%J6HPh%V``&YH`BXx}?gCC>z1gnM;{e?7w|s@k1Z zaX>BLCN0^07qB{_iA{Vs%sgo!jKmMm=%)Z|>XvTnQpB_I?+#)lULT=bKA8~hxJ{r` zFN7>4GZi$OiWRt)0?sdfULI#twK^!Ri$O2rG1Ou+$;Z8~zY1apVQqnP=ZB){mCGuu z(!{T+aW&e9}?Z^h%_qwKzQ&lwPYKuj=GuI?m z<Cw~uTNig3yhKaA@eLZv(HyqSG8I))PLjx0Zk-}$`*lK zJJA%zaJ**)nGLDse(hK+m*^B_HwQu*bB(`z>jrQ z#ZDkF2BQMEM3vqR?^@7|#JDgu4oQmaEwLFnkS1(4>Z`s5;j{=T>7j*a79YZ8^Ut~r zwrd=w?~kWgcNn~+@OCTrJ8CO~on4|wOOAoa;=Xm>V>p=;-pP9UqAn_{VMk9}E*-?Fwc$Fxw(mTs$G*$M~Yfh4No-Jo+D?Pr{V| literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_repeat.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..744161e1cc4ae0454861022d8f323617a341494d GIT binary patch literal 3731 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_repeatone.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_repeatone.png new file mode 100644 index 0000000000000000000000000000000000000000..ff66778d226ea0cb1917cc12c728b3f039a77f3b GIT binary patch literal 4185 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 I)_o`b33s_qfB*mh literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_rewind.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_rewind.png new file mode 100644 index 0000000000000000000000000000000000000000..9c41cad837047aa0a0f661a2d01b6cf5d079bb6e GIT binary patch literal 2856 zcma)8X;4#H8oe)zKopGzltm6a}=!fp!H{kWE1eBBDt*TX0NJwg8gQj4=0Mcl8X_Gv$v|rOvzW+;h(T?)Sda zJXc3unh^~EpzE}4iyHt4llW=R008JE7YPBN4LEK2#ywWn*XAAJ>u*vQ-hN`iY}fRU zm&B2If#Sf;B{9uk&q*_1v@V*)cWBz-oy)w@di2PVg@4Z|)=u&-aC3H+)Q$Ma+~^(6 zM_bQqSQ_HGVUJ|5SnQQEhXhqVD9hl*!b0a6Anq@jKjr<0s3RUvet9vv@t1T8^P+|}c;N{t={ zC`@X#!W=wLkyrv`Tk49*o#T-jz>mgUb#e7^kXI8aDXBYDo!<}QKep;iFDAY){GBLV zc(Kr$9d;u=VHZJT{g1>e>Sw1Vj_Dtym)B7E4+$||X#7TVsUUfQqB`K#Rq)`>yRhNM z3L7EFJECcsn~Qa<*+;w^wQhMI1usQfEZO;|Bypa=Er5|a*1eM@lyx_|4t^G13T##u zE9s_CCZdw=BMavzOAH{>*!E@fPf8|g^Rs90i$5p8%|>!A>|RFtytdE^b?729L11lo zk6cw~hC0Ysuf6#me|>xT*U`ZF#EDp+fUepT?+X<89M{}Z&tz&uj}=EKpe9X11xSGvBh^4x zC%JpTl_Z!+*2q1ZXl&?sv%k>oF(h}6?#L#w9ZP35y$uhfX?!RI!)!d1WE0nsO=B-` zbd7rroP&LG=CRvI79ND!yiwo6u9wzC0k!;*r1|p(>D3BwTkUHphv9v-aydsIznq9T zo8T@mf?h^ymP$v5C-BKx1w*1^BsqhYJ6dfPMbxNRI9ECLlmSG=7*9jLa;MyR_N2366d3@Dxr@Q1M!H;a$auvfI755 zk2r`dQ}MpO4o@8{Wd?thy+;MHXukM$C~Dz=*@Kp?1<>sxyRHXhi{m1<8bvHq=w;eF z5X+9k*f2)Fq8O)yI{|}OiAF@R2orRqI(1JO+uF7|cDWN)i^vv^upj-H#G7gjPK&dQ z*md78NG4~gf6KAWBo5j6YT5bYEISysj4B*5T_Ol*>wilGcJ6&y!y*n1XZVu%>qTxA z3K~3@MfPWxBy(+%AoG#Rw()b7iuxzvVMb`r$BGc{(nRiEq`vIu{O?Qx7rGL6&q8`} z&sd#OWl7Er7a1|MYto3bjr8_>IByL*?(BKMGZtS?ui8Oq_8^P5sqCcXJR>x2Q*Zpb zAgqX_jTW9yi2c+cd$2>kb1gdQXyH0lh|G~%*_=yNtQkU?cFnht(|wP~uYxr>)?xsH z;%`0bzONj-zy9d6U#Pt7+Uvn3b57P?s$?w{4n>djrO}|Uf}=Oy8#a#Kp<9{aZ$SNc zd`Ban@NAXV)YGi8(_f6nCG;hj)372$8}$e|(sS3Pjy2iSVt~9KtM8NcC&swc!R)R@ zc6i?@cE|jv1?f!!@<3J!p@ku;uVfv9($Z&7T(=1oM2^pUH4ZMU|Ga_YwR{l=Lo?(fW; zZ1}+))R)~@*Ezao3K{ zD)(In>pNp<)If>u33S6Cb2R-~4#%4d2a*zE&8%n<~GW*=>9J^UI8CU=6U zp};eD)DLd$#~ODTt9F~t*^w6n79*Vvf zesHhmhwFxDi0ECap{wwdX=cMMoaiHKPHk* zQQR|$-++xH_(>Sm=c zc-}Oc?OienRnRu0tDk;!9_){~G_M rZ#iAv7fg^-6!U}&?LTvsHYXrj(Md(#1|e7B1Pq)UT(=b2?@#(S?462t literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_search.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_search.png new file mode 100644 index 0000000000000000000000000000000000000000..4e12aeddf6af226c39ef31cdba22c934bd8e775d GIT binary patch literal 4513 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 e=kOO_Z$sfX(~fxkX`=uEf2M{O1~vK@Kl6yxk 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 Dl8`%t literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_steam.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_steam.png new file mode 100644 index 0000000000000000000000000000000000000000..5de222b2a6a35ef1efa85b0d92b5ff6c36f50867 GIT binary patch literal 6518 zcmc&(S6EX`x88t=QvF0wY7~^JAiW1ZMUf&Xy`xe>M=62824Y2u1VMUSz{ zfadC-@7!4c04}{QK>`4mnzrWO#sL#+Q!ZAQVBfxz_c@8})=I5&PkuO6oR?+sRd_OR z9jho6ZgIt)cTcUOR`M~n_ThZf7by{yc}B7Ml%#tPrIloSnlQm7^`Fab^iLRYjF_BW zK2`AP&(YI8&HY^vxK3m{C3iAk6G(Y~@;yvL6VUuq&S?B8|7PXim;7G?{>R<^54{|| zyxK0f*h7hINUgARGMIL+daBd7D&oR#9Ji`Bm@B#?4cindv`{L%{z>XCBQ9@q{37sJ zRkpOJvhQvA?G2{=hU|N+Ve38ZUF!G)yTXn)$3hR!yH+1`GF7$tsSXSJ-S|*`-7B#n zSqYK^yk~1+%W3>1JR&*P^Qu9OQ~t8RX)M#n(59FvN~LBv@C4Rv6iy-#er6X|;H?J0fpZ<~}H)g*KOa3wiE# zRzr5w7GpikhBh$x;mb~_a#f-0bO2)Rldaxpb#gd@GE4&JpW;Cw%Jzwd5x2RAAVovMJcss zAZvjms3Gn;ahZz6O%+Cs>4$bAQ7v@P^%i2_2pgS;$OL9X3_y4_3ZEn}fxp5Hir6zv zN8bWnDl2N_8tZ~6O!yBeM8ewpI4ywl zU&CK1L-DWEILd1(Tl^@<3&2Z*SPJhs+p0lqoYb$A{bkPc?Mn|V!rVy9UjuJWnV|kY zhx`t!qzs#dNJehL^R`zBtCgQ`VrHIx7)f#lzx}J(0gQeZxG;68Zi1`V1RJI#PH;!; zy_u)GL!J8WY!+$hS^1dyN=^BRlgIUR5zx~zSl9~|+_wP*>hO;bHRp}&_FqfRYM*(m zOF4Nn%O0t<4G>lmnblJo#*Jz$@pW=m7t9r|QJm91@{2Ay-UCwd*ErbUVxnW6y7idI z8y9NKgRcfmKL$N_^3Iic&>?xf1a{%eYY7s!56^S*Wm=|IST8b+HpkfRJ1ZOOodzAu zl=j;PfSX6^9xm}=-qR?HHKvSy_Jz=v{@lmV~0zurACZ(n}< zA6xxIJ8x#l8hoUtJja=Bh6V6G2~T9FELoxw)p5<+S@xT1=#Cz%=sETkzKkfEn7GIR zINm3Blc4}nH;N+-TW#$A+>4#t`Pvyhn`IOID`9?HtVtYjIMsvHlgBSN2+^~8UhpfA zh*G!}@avz(AD5t(1|xz6Y;xryEEKT`vFOhp|Fg(d z#Q2~mXv)FAOMvAIDn@^*3gSm+{B9D6%Oy|IT$QP@)lZ*XFab}9@q5KAIUy}tZY8S( zQ)Xn}RNzYt<#NiDtYPbUaNS((lN`Mjg_Y*fW{vGE9n`*E*z}W?6ri){0V8pprl4lX z*ntE)Lj4&He9+urc%F^z)b-yra%fG;_U@kNE^m_&AY1*G7{_6N7={k)#)r^B>C|G} zu%4XRG|t;2i=I`-EU?lhhx|CE7NQcgEa5D4p`KpDzV4vR%PY~W#;k3Is*n%3ZmJ%$ zVogso=o~ezpbc`ZPj9kY|rJ5mbbCnzaE-eNXB|< z)|)fYe$LDQ#}!(~d(r9oQnGIiJl4yzLpaqcdW$J-mYnAO{;Wvb)xyExN&QmNfyf9E z#~jxR%gv-aogO&&Sw(U7i01=|z!JjCL85$TiMKQ~M2KV&-#oR1kyY_85GU7p`58Dl zhMv&?hR3SsO($7dwh!uT0$uNwQ_@OnJ$t`(wLA$PqWGFjNkyaJssR^~K>h}{-lp@$ z;auAg;^mIEx+~fRXR-1zYFXQEpI2PPjTddM8q09iBBrLZx?d%$&%I<+~{*D97Q$1Nq8mTI-3Rq11GwF4xd;E@d#bs&$gA8ZQPZqMR_L*RW16+ z1>z?9J-H#pjpcmEqa$@&)OZ;kq}lq|`PST_wnr&tOMGMeU~5@QsarzP>QqHslB+$h zwB9h5pZ;p-Oh_{IKuhwmN{lz!2sSRee{n#=m(fzf{$($~${qStpsTsYZZ8T?brFq3 zG~5OlJtd}#d)&t5#5?>Q zwszx%^czHC%6y#+q^ajEKPg?^E;wIG6pTJ=aO$}l<^onOCvN~TX#VEZ4j4>3PTkJ& zT#;^I)bGh^kM<;|-YX;aEk^gr2xFZ13X=kDjNL&)Hg%mLjmJYjxNvb9bH5(F7)j{Q z4|@%ZogO*yd}Xr|$m4VovgR=U0@&2eC6n>EQi>jP%$Uo&jggwtJ=^ICoa8UGLpk){r@2Kgx=Owh4+xmk7wi$*^J`J4o zW$yMorOnhL3DqSxq;J~0f-E23m?Rz&mkaV}_lwPaGIko1!J=X7^>q63eX>jRQLBQ= zOqkA?*MxxohxEy+ddho3l)cDt%B$l0!d$EhrCP$=DQ#Mlv#oEJ)G0nR6TDE%Of8fJ zzb;SYE{~e*KQcptsgb*uk{4O`_QZ^JY264q+X;`sZSAq=p{1Va+u2$hp4No_pFn?juBm%t|N#}NU!U%kjBBtz-I>$SCDrY@~<>?^pmn=qG zv(^AHV>00=QzC9J^r9X8nrqDnHX{d<+84&S2B;W|l2!XfTl6s&)9)K^;I;@!jaZPgeTtH%;2#HMWto zZow}W*jEf43#CB*v0n)?j#@Nb5a33bfg8bW++^sS>I-`%-=cSD5?22#il>zr1Z*;C zbmQqXFr|TT4v2OgJrUcmtSW}=iRNi#K!P+eTp;kkfYTzu+n|2?7A&q6^9)G-&VW>9 zdlV-H9su8#4(}}*w`jo*lWG@q&cujgb zuU(68d~)PslNg%AGfwSB7{PUWF^PorncRy99a*9vo-s-3z>P=@n_Lah#YWYzlQw^N z5?JmSYMNTx#b@D|8SIJ)+3`BQL$b+n^=;hB)z?YO8oGzLJPZ9-GM6-jNHkX=fCD4C zdP$N>0jpt`lbe|{d>qVzf)V)lMr>2ou-f)3P=G*|e^{XK4mHYu+#VO%r{A|#cd^cq zFFo!z`p=ELd*cx3D(p{g=oW#lVbN;UU10xTpl{l5^RR(>$Y%n1zics~sK@HOMhMV# z25R{<@Pig-@){)Tt4x|*sAB>w1nnD`sZBK^zQ4!9@e-t1;4MR}nw>*61TD93*) z-B-DB@H%wj)vtYkF!ixWCTc#b5smLVwKs8U5Z$6%aSUBXxSXF!EX1M-mfM{#n@Vc0 zsYIZ(J=VQf-b8%lOg@GF)8#G+-N_ubb>Npsw{^aVhPZj^^k?Pd~eQ}bIzU_T&#M7hkDv^M(cyQNk102ec6q07VI zrZk(1-Ph-@AA^-o0?!~D(x@hp)RFwT=@XJvVV!bV>e~@v0L~a&*Kj6Pd5M)My+UQo zEyUkjoKv=e_lZDLW|~k`ClHX|c?CN0mL!NbQ#;hb^v0hdMR7pbVO1!4h?>TrZe*X} z2z#UJCG^VNePAc>z(p8{?@(+LU(2bwjLOK*PGum>VK$Y1*fVr z9oz87xl!Y&ty@soorf7V4*Vr-FbUE&}7D;nd1mXKyk9Pp42$Hb+0jvLmpB9DfK z6V-1=7!*}X*e@eaBR+}Y@U&7=V9X)ql(aC4j6cdIN$4m`a~woYg-hdmZWAufY7NQKO;?r=1U>BzqUIo6z}sgkJ9ytaH4~<%%bo( zj=H54%*Yt9d=nB!aW?y6Kxln@^M3vEV-?_oCwW{JYLNFEzgGni#(e4WUBJqUg{drt zE_z8We%j9;OU+v!c90RuRlQ?1c1;Xj++rpnI1y;@v4cn175HsSN`~7m+(UGNPP%m+ zJT1IM@x3QOIjPuD)9Bsw=kCtOB1?=RovpmGJyZwEYEOhsHsGbIr?%cJZF~1$7p+dsC1}lQh$agkT z>+;bCtJ-6aytFoMLgh0l&KnN>b2FjuYcke;vox(tSO6Cjj8ERsuZAde8W9GG;!8vH4b@><@tKMSH z-Fgzjd}MAieFKoaL*2WHS19P3>xW+t1H^MrEv&M~UVz(O4k!KWGl5edY^$jlC61b= zanAQGsoH)Nwe|PLFzm1h1ZfMmI-%+^;UCs1~`x))h?+82z~g8*xHXs_an`)1aEGQ(`1J0%9Xs=1;%!>l9$>5Ny;Zw@d1yfQ)!pGEoS z9q(~Z>b}#T&oXHI)5&V6CehEV-YAY)MNqBJP2W4{?Ua{dCw?pct4$9W(#Hyn|LQBM zi$*8H`B*dNT%89^Q0X#hVXef!cplO?3tZ0O zxF$?4`?~I?{p3R_WNhW~%s`gU{nu=f1AuJiayKXYOB6is;G^}2=}-O@$2DYQgPT<= zgWs{Ut-bF6Ldx_&ipn+0uYwT8M?Q{ul2;7_R+S5bZ&FBYOi1gnLCv|Wo!v1*g!Upq zVt2SWdD?ZE)<;!!mQF*K_KrRtXLbDK^9t5;zvxLMAvZpEdw#Ry2g?vo<0kEY%dm%I zrv9de5-}(v!dDS^70&pDX;W$4Ep_vkYydXtf;SV?zi^|su{N6Cz~V~Xa*v2YaoZiD z-uS=LY}9Ey-$3Df(6V)_skrJM__%GQE;VMneq;G@Cp2|vJ0FZuv!WtQjQHH*Ip{$K8)||^BnS7AJNR5354vgHQccgi)cUJ?d|V6OyWD+Ax%JkjO@DfA zU=jbR#2&s?mukdh4<6+i;dnCQQsE+E#&QaAO>(wX4+3mD1iqrD)bc>!Rdg|VLBcEc zZe}W!S|&*2!m~0iBv>wC?8ukM3|;@OD5ckLsWIRA~6)w;{a2lBoWSp6ybUgm7HLK+PA^H$nvu^SEUuozZj2l zx+m~pB}iPf=r9w$QQ8VtX*@Ln)0Hd!#qs6Hkm)!L^w>{JqU-k&hcy|vpp-m7R^nG( zwgLyfH}5J}>>sa=muEiDN)uC&NMz_Jm$Y;7hTJsn{?BKC|2$FO_W%BnP%v{! ZC*|F3-XDRhqrRsA+V}J|OYS^*^^z<|Mb4Jd5a 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_stop.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbf1bc72188a7fdac6b2f074886c594d35defba GIT binary patch literal 2151 zcmb7GeKeGL6#mT@FJq7IcJ~kGJm;R@eeQjpd*8X@eZ3d) z^e5;egm|7F3zi|o5YT^^4nl~(=d=_d%)xWPS1ZCBo;EHCTe*QRUH>YU6}&1)C%gWb z=xDk`TxwNe=(WzxZN_>x=F%;qpM{gL{j)DlOnGT_)#~Dt!8>goi<^&m%ve|_u5%0@ zy!6)^pQ6IPou-A|?Y@&e$4u{@?7=*2i#$!FwhWIXWUD7iVhcP`5`-Ym@PIgkkS&Bh z5`QlRynk2LHVU(E z4<0t>C}iUBE|;p8VI5(HC;zM^F20brRW99qecQILi)UB-5=s>KG(=lGqC~}cQ7^7X zZ^R?r$@3alg&9k8tGD%J^k#2YW!mE+apV_@I@a9u$46Gr4JnFpzn81DdGt`!*HE-r2XvB>^-dCm9!1=lvS>~}Zb8^Ca`0a=sbSCx9>R8ZeJO^~HX9U~u1 zl$&FW%0M$>QrE5~=fpsCwYSt9cT&%3biSPsK9iR@t-oOH>BV!lF!~7ljGdj-&e-pXsHZnm|i56i~NHRNh?08rTj?cxa06j8H)m zjjibTLKF7}98{p7c;Lz@WNVd-KX8NE) z_)s?-@H-xw;TytiwOdVKhkniS272YLT_IU7>#5?f&krxa8B3b z^8>kC;CF;FOt6mgnMoWvDGcdlBtPY|NqtJFLH7QBKXuA{#t``UyP<820t*^R|DUpUdiLtG`@anZO)z+TMFl*n)Yo vk>~35CH%ni|90{I-!c97i}&_UGhcEoH2wB&F`e1)4+QdD=)K^y+dA1lJSrCV literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_sun.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_sun.png new file mode 100644 index 0000000000000000000000000000000000000000..eb061c77060b30c0e9af8b9d715bf32b281b985b GIT binary patch literal 4753 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_tabs.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_tabs.png new file mode 100644 index 0000000000000000000000000000000000000000..7048b3e4281b520b3578b9623388ec45c6d0c9f6 GIT binary patch literal 2963 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_twitch.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_twitch.png new file mode 100644 index 0000000000000000000000000000000000000000..93b6cb74d05f73b12cb35b803530513d02474992 GIT binary patch literal 3305 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�dE= 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_vol.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_vol.png new file mode 100644 index 0000000000000000000000000000000000000000..012ccc8b88eafa6e80be80938c929a099059c655 GIT binary patch literal 4462 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 vj$pN{o+r+)f2|V&I)C)Bs literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_volup.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_volup.png new file mode 100644 index 0000000000000000000000000000000000000000..0907d22be455537ce42852235992bea474f4505b GIT binary patch literal 2688 zcmb7Gc~nzp7XMxXBt$~O5-2;2SU?TdB2E=}1Z1a5K(MkoRx213(MFbmNS`8DRFEp- zfJ*`u0Ua|sg378`A%aSR$^Zf-Yy;wwqy&8ojm-DdIj40zoz5S*Iq&!G_q+G}-o4+w zx!g7WbecI006-56@CgF|u_b;~9RPrFmKXzo<{#+e6`uC^`9N<{%ooVbq1UE+I9}o{ zi>gk3>=>_+$-|zGWK!Xi1k+r;x1dIwmm3ny?nZH zb+1$39A9Q7xh&x)4i>weadUZXI?Pb%-@?`7w7vhE*=`ixY% z`8*`xzGS>+Z}69u<4z-XplSv`d_-WFlm7A}BjQ!OU{nYUu|hgZShIIF^atWe8#N;S zSigE@G=B~hfV10`2(Z%k~G#11c6M5>b2-%UfPXx>cGAmpzQ7^t4IH}WZ-~PBw0w z4muR_sAGEe9uG7_hoAIh0aEcJ{9e(H{o~8`NE>uyKkYd;%OCQOc2Fe0&Ri1VYLMA* z{q@*vpzp|7rg`6by!U9n{{3n_ln&!EwnI0V zei4)>-TovUUygx7En7T%ge=;P$B>!WQK)X3;3s`<6x3O?66|AO>FxE89}bgkK^K)N zFiAx?RZ4`3B>*ZKtg7YWE?AfxzFeS1MR(!A(F*NGv_$rx*}+=aKrS>9J}ut{NL)G; zgCwk!@EKeUkz5;0j)j`S$CX5&ub{t)P(ZGBaYdo`CQQCIkAXcH;*&Wbh{O~Ot7_Nd zYsE;=AqEDj6IN}(va@)`~9Vpnm=l zSs*`oO}(5SuTH3CD3W(ce0mzcT!O7cZ1LM858Hun_kwQzW}bumiYy$SUW~1zKq<-U znId;*7P@xm`;0N9)Dj9>9_uXV{~Gw3YEJiMBIuzK=NP>sDbwW2J#RkIMXGFAxIq~? z(ZcowTsN|oFhLMyAeuSQ0kIbo;eT<80o-~L@nM`zqZ!2K;-{*EYWKb{0LeNWWv(*! zai=%%c;E_zTa>vAr%^=ol0rqN@P@wjx4MUd8aIwI^02hNrJk+LHHL!D^n_eWfnLEX zo-dZq5N3twp;xTEuem_NA1YW#dYu9YisVMq!$k^mWh~6p9lc29s_lmH5yj1T1GIBe za^PDlEv6vKR79~z<85?+&YusSNNkxf#-Jt{Y#R4bQxjR)ri<3Xt~`!cf658f47BXr zgl~6N)i!Ki{H#~$E7`T1Mu43$h+YBJ6!flq3dO?ao{^ZCA=EQS z0196hOQ&FI8NMqm&z(90&xBWT^s{7Io3u{WCz@t#}a{T9|3g9Yt zvjK=BLTE$bJn{V0oeB#NrqcyWUSrw;NV4+Q?TKV z!bh5*%nuY!ezFuGTU)N~{${!5q^E^`VswA;!42XGwMJi}4*L9WMH!p3*Bqanxw>{} zR5{DelCnTK+Q#I7gbQ$5(EKS5(IlvrrymPK!TU2^KPz5ATsG}va~q>mOYJCk6up_t2zM;{^5!i6FK&)&hWlrRkEHhfP(-D01pzV7vGGzYMS@Rwww?%(FQn$qL9)-wpV2+ z9>az{VRWjip$&x3>z4Wr8$}SKZj_qmswdCT=TxBUHuOFm#RI))fRX@4i74tYlqI0?9jmlZqI<=j@h6Ys-=e zOyApK5wp%(OyoahPy#EFR8W#Hv&jh|L*yluz~kQ8#AlD=7XOd!;g>tl8&_!F--SL% s@q2fk|8Jc_?r;KrS9rKu6(-J6*hLxXBgU>haI*w~zH5BM-W&J*8=pHPA^-pY literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_warning.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4003723f400b84e6221a337c8a56a9820670e1 GIT binary patch literal 4061 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 M@^CELw*U0M01`Ne0RR91 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_youtube.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/dark_youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..69e30c9cb1a6a959accc2d8cb9132f65ff171a11 GIT binary patch literal 3155 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_aniworld.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_aniworld.png new file mode 100644 index 0000000000000000000000000000000000000000..64e3982d54b349d90c0dd0f6581b150290732554 GIT binary patch literal 7918 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

}g7Lk(&_KLYKF23^CbJ^SGwhWL< zPbrwx_dh9i9#D(Z!89+1!;~5+m*9cQm zj3;U%s?rmNZa7s6=AR*#xhdMCnx8^%*&MK8uSNJ?cg-h@1TVu4Fi;K11)7=y&9ETN z_bn*cF`&=nNh%23ckR_W^|juOS@gEc6D6fS=yb^HsCmg6__ zNKWETb1SG-`9B<6?zGgteConJ8u`6ILXTW~QX)se=5qq3uYF`#YtFrg4b1Rf?#W>z z`RbazPW7lIrh=dSf;wu!b|g33EV>73Pi^{&`%~R==Bk8ygj2E~&9Sq0j^w2Ec z^w%FrLCxjtW0p?}3R>~wl&Yd=tEoyQbK7jG<4K4#__34Lpm?SDtoe>|$pn4eZ@ii! z5MN@asB4v3-%_vQjTLNu20z>~1+U<}o=p6|c?C~ioQ-e?QM{smBr)QHA4V0;kU7H7 x&A;H-Mk9%_a_U|u3IaooOh$e1lWE%4>Ja@?Q~OK7e+`f=|MYYzasKl7e*t--rk?-+ literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_arrow-right.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_arrow-right.png new file mode 100644 index 0000000000000000000000000000000000000000..fec9f6b0329bc566bb318c6a8fe99f0f1111930c GIT binary patch literal 4212 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 b7iR1|D=9rU7jFaqO`xpz3-m4ViAet+^}xoh literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_arrow-up.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_arrow-up.png new file mode 100644 index 0000000000000000000000000000000000000000..3bcfaee8f41bc424373aee5a7f17b147a92c4432 GIT binary patch literal 4770 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_bell.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_bell.png new file mode 100644 index 0000000000000000000000000000000000000000..5ce2a124f9e7a46fbd135c5cf07dcabe863703b9 GIT binary patch literal 5300 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_calendar.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c286df11e08d27806beaa9bdcad57ffdc6e007 GIT binary patch literal 5399 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 ZwENYIcg6W8!om~Tve9Wn=KB5T{tqnKjOG9U literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_check.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_check.png new file mode 100644 index 0000000000000000000000000000000000000000..1de66763344db1555384191b40efdfc19897a388 GIT binary patch literal 4691 zcma)A3p7-F7oRcSkK|p7AxcWzqKD$7u1Fr^q7@bOQ4M;ii-dzwD7U8hq{mm{C^Y1e zl8QXX>nmj{gpfhqxs=T08mC0x|ID0e+`GE>yKAx5tTX?!_x}I(Z}0uvlkD#1sG_K= zNFWeYoHpBg5C}vA>|b7%Kp<$ID54Pv>bg$$8@!Ia8tLr{)$Gus9hvfVdq1bp%aDJ? z!;i#1kCd!C?JB5WlN?bIvipZQ#?Q>-?F_ET7;6({jkGQ5@9oieGLUvg;2-TlAK-ZKl-$(UXRV1Y#VlJRcQ@z zE-#9`^kOu;qhNY>_|^%pVCUhXVzR@*cHi5dv)WC{*Ix+pnX=BQ{>|KHs(m=1wQoy# z?zFxjux)*qPQi3gxZi}!mTrAtvmu|}vUAgW*Y5uu;Y4kVW9grca*KF19GNfEt7KY< zcEZ6HLvB8m2i68foEQN>$ddbsOI1;6Gxp=htrQS zbfULK^bFhP2i%x&zT&>l<5k|e;PLo&wceuhN7qC8rA3`5%j*`7EZ18xvMk6YMl)Xl zu91Ulnq(kd10InK{&Y}jLcA(UQ$_zfSYn|t8~a3KXhM@O=??f8n+F02QrKBuN~0r5 z8sd;3&Y%<`ZHIjzK|iDK8RG97ObGHq503g|5^l>1n(UzGE)u)TmJ(SoilDm=!BJ`A1KIrNxUmN{ zlE4s>6K)`zXZ_4ZlZeNY%pl^i>ypL(lwf}`Is>7_@^}WLXzmHL3Ywl)oEQxHp z&^T#4U}H!YHyZ?7;h~%JoCx^MPqKH5PntnQ{QHmS95GD%xd%RYx{9)G&hwEG*+M=K zT6!ts9+V*k@r8KF;%HA(2;UHs@J)FoSsCYxS|in4OsJVDOxhv7(qE)7#Tbv$13hzh z{wXp2>YKz@nwbhoWOM1_liw$5*0Rc*-zr3sLCbyrG=tQF9Hu0LvlikEPGL1k;oMTk z>!M8#`7w>zHXv{g&YMUow;sFj;l1+AiM^$z2CAe#wDim!S$DGw?*H|kEaKevABmtRh2g%VRaX-TN<%7rv#2| zFgPy<&$=(J)Cja*O}A&wMI~5S2;`tXa@c(I!8s+I9-h6H$o2t^mQG5eC4(X*Ot_B{ z6yrOnWqa6s;#$~C{#?B1ckxW0^j>&)xe2c@m}PSHk%`+LUA!duatP~cj9}*t{@jqR zZPG#*zOa}-=-k`�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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chevron-left.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chevron-left.png new file mode 100644 index 0000000000000000000000000000000000000000..f1aacede266c103ba46836426232236db3ceedf2 GIT binary patch literal 5152 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chevron-up.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_chevron-up.png new file mode 100644 index 0000000000000000000000000000000000000000..f0d50d7b3d6b2e8a2be5c1a0d1209fffe34b717f GIT binary patch literal 5094 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 A-~a#s literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_clock.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_clock.png new file mode 100644 index 0000000000000000000000000000000000000000..4c74a04a3f8ba8f31260d62fc0cbbd45402fe5c6 GIT binary patch literal 7639 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_close.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_close.png new file mode 100644 index 0000000000000000000000000000000000000000..7bfc3a646b002dee9136a987af46998f91c8e02f GIT binary patch literal 4871 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 Lruu1me+T~$WMjf7 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_eye.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_eye.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1bb8e9114a64d8a780680156ab9266e7b8e805 GIT binary patch literal 6823 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 a+^H_QOfJ6=4}X9{oIP!#U!r^Y=Kla|T;{j{ literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_file.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_file.png new file mode 100644 index 0000000000000000000000000000000000000000..fc459bdb16cad1b1fa552196b566dab4ae9596f9 GIT binary patch literal 5364 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 XlAM-jqg6cIW@2_L?3W8{w;lN}q7FVz literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_folder.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_folder.png new file mode 100644 index 0000000000000000000000000000000000000000..c7baeca37e31bc4f4c95877cd9fa857d7fc95512 GIT binary patch literal 4541 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 LeMSD4-yHfE6Ybh8 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_forward.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..a53c52b2a48dde6ed7612d271f08d61faaaf2c31 GIT binary patch literal 5175 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_gear.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_gear.png new file mode 100644 index 0000000000000000000000000000000000000000..54f5c32e09469622b39eeb31e4a143ab2c421df7 GIT binary patch literal 6858 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

L#>=hKp5S6q|-XZDd1b` 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 N<44Sl%M34s{}*34{kH%B literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_lightbulb.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_lightbulb.png new file mode 100644 index 0000000000000000000000000000000000000000..9405d19e648d8a6dd4e6ab4b2354b244a08bf808 GIT binary patch literal 5952 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 E2NHNIZ~y=R literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_lock.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..0262d9c42bcda3664c04d3a41c7c0e36c39e638b GIT binary patch literal 5415 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 z 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 z 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 w9sNJNz@d>i=QafI!J){UZ%-@m0TFRp_WF#rGn literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_moon.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_moon.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d18b605367996044e663850ee3dc8ce3d8a393 GIT binary patch literal 5541 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_more.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_more.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3f9f09691d236cb16587f90b9a785f1803a505 GIT binary patch literal 4667 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_pause.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..6d61001df9b24be2fc2d0c36513689d913476e4a GIT binary patch literal 4974 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_pc-monitor.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_pc-monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..e09f11686e6841612ff150a11bdac63dfcc9b610 GIT binary patch literal 6672 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_play.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_play.png new file mode 100644 index 0000000000000000000000000000000000000000..08b649246b6db3ee8a84fe0893c47f014747e941 GIT binary patch literal 5337 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_power.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_power.png new file mode 100644 index 0000000000000000000000000000000000000000..c4e65b413ae6e6f220672ca4518d01d46ec838ef GIT binary patch literal 6927 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�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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_refresh.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..66d0b004cd2484fcde60b9b0b17a879aabe2d610 GIT binary patch literal 6360 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 W5oKg375v8nvv>D?i@cr3F8>d9JM;hm literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_repeat.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..e4afefde7c417c5c49a7a619635b43dcdc225f38 GIT binary patch literal 5840 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 UZ?ePSM+V5s!fsd2ufJXTAMc!fk^lez literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_rewind.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_rewind.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e007e5cbcab22007618f567c85763154d0e556 GIT binary patch literal 5137 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 tpNYM_ulIeV; literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_search.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_search.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f605e203a9ffd38f96351c9a1de9aafd51e41d GIT binary patch literal 6464 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 T#}E8x1gCe%P$y6O%$5HD&lm}~ literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_shuffle.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_shuffle.png new file mode 100644 index 0000000000000000000000000000000000000000..1c7f9a182fd35a5f183d038685c140e4af1e48f1 GIT binary patch literal 6539 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_steelseries.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_steelseries.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b497e94cab7f1e8d8c0e8f35e24416b531fd2a GIT binary patch literal 6519 zcma)B2{@GP*SGH>V;4ip^h&&zQ1XzJ7B!VUONEpyy$Gcz*;*(ji4vM5jlG5>gpp-P znJgho#+E%ZiXQuSKNIi!e%JNCzVClsa(TAZ4iadJ6Y@L9t02>?Ix&!-7 zkF&9{E297Sc-Yw3#KZGK*w|#C1E#wzFLh4#jK+ym6RFI((zhNiKB@_O7S3<(3*7pt zyntuX`+A4H(8N$-W$EiPnop|o&)&Ve<9VpesS&sDX{6!rJ06x^QP110$iH`RpIe|+ zpuZl6h*hH9=U!a@FJY&n>z9NQ-r8z8)nu8;yY>3wUZs_1 z`4jaZEb8VxxJL0}Fa zFN0rhh%@kBE>&ykA3hRnTep&7etB9DuVNK!r-Zwve=Na5bu@qR{l_;+E87|#B1SkP z)xmbvw8x9JaqHuIt?PJ=Wb+>OW(r-NPEFdaM{2kyHdFKEUV}_LJH9dKp5YlU0pJr2d41C6e<@apvYjyf*%Yr$j*WO!Du4T(vOFrk9pyX zeSV|y_S|b%{R13a5SD4txsKW>USbe#KQJg=skA2nE6y(j?JGEwOD{~MxuKM<~ z-)}qbY5;=aU2Csa50ABt?^yGHAZ;};nxXi$5dNh5eH2{%5Q3xDB6l0FuxfY-*|Pe* zIo;38|LYk2vp-V0`0B!r$SY4Tb+*+*!Tjq`{xN95@waPvQvb=fe}XbR z-{$f3?<}IR{XRb2CD{A^TEuyYV(3;LN7Ld1Rjj#VuP2PtwV$4HThObvt%^Elq^sOm0RiVN1Vj-_ZHV|? zK{C?ihjadDUPm3Q9F}L6c%k}YO9@A&PoNl_C5@)1B@Plx`GRnsE|Kj2WlAN>FfvVG zZ_lzvynJvL2eGz722(Fmpi!7BkX7D;91%)!5|eVmhvMVueiq=!W2t8Ew3{y4M5I4Y zYOB7kcbty#L5~{$li|)Mvn$=72IqtqXT)Yd?z^#l{mel<*BYrS zL6tZTeSuB4JGtjaET%vm&iITD|HKq@6EE6&i_Cqf#mUEdrY? z3OiTWV6_??h;zp+{IEvCot%rCcCIVsg^5ngxyMkGm0qrQ;doway$pjaiXMN*O@im9 z=YHculr)cvG2XYzdoHQwl{X1O34NH}HcMeqx)Q6(k$A+8KD@eug{;_BMkFHXopKx4r4(pG9M2 z59dsWb=;08&y@3kXFdQ-4HyUB8ex%yLotV6`#bo0Ozx-K=a-l8Gss*l|Fny?)_o>a z4>#Mpw9(FAfc});Vp5Z>$k1e=0hyhsXk&D`k~%uv0xL>vG4Yk)g1#|}9Z|>R9&BhG z!+9e5xjJE{`}4vm)Ll?fkt15(-x!hH$hYjt4$l#W&qj^=JXS>>yp_~HA$4QAi!e6v z$qBDJx;YV&SW-%@>mHT6XSJp5d9YO|>`>Lvx)L7b4G8S_8DaX&&vg^|zEyqb_$tiM zWTj1-9C3czAF=w9ANu?Xf_fB!Vb}h`O2w3%L*azoaHjxUDBuIvZ~Y?h%IU+~bIo|L z!z!f{z9WHW#K!3^qC^1KE&@bt`{SXDwBY5L)ct+RenZja#*ZbChgDQgQ3N3Jd}$!Z z$t6>C`@4J0_ED&!kXM)b5P+j4B>9V$;yzhxPRAuve(aZndtSFPN}tO~Rf2Z_k!gk# z%-e=v%T3?7V#)N$zi<0%CNX#OR5(G2m8d0*SY~PRbLV3az)nq( zwChF9x$*9ay0;#+6nKm~+(LAF~2YdvQafE8-);zp$(%0H%J6&1X zK6}0-=+2o+DjPJ}rTz^hOD>XZb%CM_FRix{gpMo*V|bu>=IBun&;Yp6`@p=w-HADi z!$_SIZrEo>oKAW&55 zwGfJ#9vY)20-nLPSC04u#ItPGc`m`DKbf(yWpM5IaFo{8X4;1jew?UzHNZGO>6i`1 zpF>5wEYm{q!?S{b$;_}&CCD^7MjdtlR~iu3YxI{q;2Gk}K9uv85cq9+Z~Iip;G!Dq zCdw-#@2D3-Tmg4StRvhZiQL%mO%GnCqub=4BJj5sfcML>7dSEH9vBVu% z|3q&=OJ=0XtaeK8w67cwSXUCoae@=FmM-0DvGO zTJlskQ&Ind0CAwQ&a=#cS`i`E_S74*mFO`gfO7hb!Zkq#PBz!eD7+BN&pQ5I$CC$5s=!&qc0BK?kWs_nj0VrQ-+HX zaS$S1`haWtN~&bUU_wrj_jI~7MBBQ<pb0dZlKgc=K8FErKzg~ypB?i#!o}f?W}Gf{+cHR{kZ() zy-J(-KDxzKM5184mP z-AKZRIm5COMb5OW1q`9u!P8D&Cs1C-iudD@u#D@r*4=7hfUP4@!A6yYldWa*bN3Y{ zL}bi-6lO$jftFBy(}j~Sem-oq%>=LaII4bLrs=H)JG8!v#0NGffh7@X<}Fzn--41a zZ!8hsT!}Mbm01_lolB|6O?G&1L%BX;%0h(*POPYEYgPTarhu1nut^MlWtR2>Brr(D z`MD1|xt4||)1K!>kS$1rH1Qdb5hm9O7}58iU6*u_2ys;BVie%yU`TmJkZ+SlTdfuy zV*=kZKxGBO@M*TtbFZOB&4QFTU5O@fUkxA=za`^?S966-4$(0iSpwuC)2H*CLwCz& z6}bfC3@#-GS&A468US1}B91#|@XWg~90WLqMv3tQLBTB|`em^C{rRuDyZhT| z8TJz*INcn?mh9hqm_Zgt)gmqm5hu-kRM7nVW^lZ1VqvF@?o`>fcUaO0X4G$ z8Iclxvs5wZ1iIo#S*=+1BpK;P; z->yrrW#1EztvpabUtDL?mh(WeI=P;E;`d1nXImHUhSTUWUY;+1^IH4q@*YFF%X$_p zFf=uF{+h7d`B%teSA}rGUPK60b95J9XLnj^Ii<)oje3(p75m*bbo{AaJaEe9317Vx zh;k?aZ4L;B3px#i19+l7bwq;WV5JJUiRdrEJ2_294$NvIwjnfaP~QylY3l_BGnQh# zyS}Q2?jlW0m0vf6wj&)Ogt+3`Vq>=VwUQ|NpJCmMAhgiVx=f!|A%q@8 zpWj(R2Yw|23-xI`0H_TiH*S^OI zoX71#>fD^QXX45^bOPNtz%*97OVbasHhLXRMzQ6W{%1yhH8fBSvh!gVRyIGTXKaoQEns4U1}lhjw#_ z-FW?i)ph*Qt$>kl(?()wXe*f8m3N9QOBfCV-PF$k?QbA!I%)7CZ$=QKSYit>BuLx< z1k@nq^0v#pMOa#q96nnBD`Ql_8Fbfy7ibvrCjC`X?TNVd4aXWE=Jz9Q}9gXYM;#Cl{riJT%DF1@reD#wl+B*0H9Zf91z)~Q1UMJf|>p)Dl z*C$2pdC*<>P&_dERnt6LySH~m??O-SdONsewrGC&Z9-!YnpMvP!S*8UCxfx3*}Jch z%{MV)>uV+9Yfip2Ia5$<+$>#lEMl@UxbT1U!SrPLihvK6jTQz?A(0!)CtS% zCnI!B>)5dOMnQ;&d0=YM60|vA+??|t;6*?CXBcTA&x8YcrtdsIvI(sXw9&m7p!K$- zXxm+EdsTh(e!4O)0eS>W*J+OhPYNK?)n}h>0EV0P`70%?8|2mP(#HnDlC+Op)1HG% z8mPDj?Uzf|O+T~A5WcJ%F@y+7;?GFSQ?xUKXD87L1~UfgMb0^DA})0ClWT8sOt@oe z6=`KM;!+9IOOZA>KH&l|ft7MqKcg&rY)`FpNr`e`e=%g>JFJ<*m3_lpg#x~!W4k)+ zW)S^sEJKq(t8T=<2Z-V4R~qKPy@PK?VXQ!sSXq@4+CPvJOrZ+HDu=-1AA2~%!Q<`0 zs$TL?3uzz6N?^lhfF>;EKz4C&&Q;87izVZDtarx0b~3ys&xt+6MEkh~K&inm z?T;pTHm?Nc(p@xBsYaFpgim;T^q|+b@I4H&44Sn7Pm=>=^Ba_A!iH^ZzEN;oh&gH+ zpx^wQS}2$l@S(?t;eqqe3n8>T_<5ltM#S_EvCa_u2s82PTxS6(FszX2ox zc=S)8uu6hU#+Y{cKr<`V49B1!V$cs;uW(w!Ip_M7t9~|lGx#;3y+8v-o(W znh1+I(YMprzZ-6BEI^lJb%k{SvVmiyjXt`YXhD*V&keH`7?C`XHYx#R;HU-U)fE1g z`K^=fFB}r3>WQyD)&Kbv83g|CM|D7s%QXjA=i8}aq?46`vtS!2-=)`)~P znGHs3jkT@{BeB=N1i%t&)GLpu-A4rpYFqGM!%{TISp(o`bYcah4muycyf*P1D6mDj z9T*{~!;*nlZC6KrX1L#i0W4R7b_^^pz;Ksq)!J1=4dm|ch5tR~1X%Ig;o7tA?Ng@f z)~3m-Yp!t;%>nVS{4Zh6T38PM=fUN`S|F66FOJy1C)s!KDB+{FS=_j454SMJ`_Jg| zUmJAb|0hBf^Y$A5t#x#G#R`lQYz-*)w;3ur&S2d=0$V#R9bWUK=U)Tf-&zB>XNcqk ztwn!zBno!>zlP{QIIvdZhpkU8`TsK(w%fY4cPU6~MZ~hERLi4m=>+%>6}AI=kC^6} HoC^CNXjnFN literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_stop.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..2c79560532652777124c82d871d74c1b830d5f6f GIT binary patch literal 4528 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_sun.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_sun.png new file mode 100644 index 0000000000000000000000000000000000000000..7c936748f10716d4e65002b4143137dbbf41ebd3 GIT binary patch literal 6691 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_twitch.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_twitch.png new file mode 100644 index 0000000000000000000000000000000000000000..39834c7f6796a3bf0aa6c1893853f22595f33189 GIT binary patch literal 5183 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 M+tv%#e*g3T0DGqbfB*mh literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_upload.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_upload.png new file mode 100644 index 0000000000000000000000000000000000000000..efc65a81edb3b78e24cc4406f49c659a4fd864a1 GIT binary patch literal 5815 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 QJV+zX>s;1mI_x|99|r7;MF0Q* literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_vol.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_vol.png new file mode 100644 index 0000000000000000000000000000000000000000..cca75b55cfcece88ba79eeba98eeacfdab05216a GIT binary patch literal 6701 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_voldown.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_voldown.png new file mode 100644 index 0000000000000000000000000000000000000000..76109d578c873fb20263e937dfad48df4afae7e5 GIT binary patch literal 4606 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_volup.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_volup.png new file mode 100644 index 0000000000000000000000000000000000000000..9641b6ba265a0070940d84d4ed7d3d64af7c90bd GIT binary patch literal 5068 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_warning.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..e6328cdeb2a675108e9fe96ccdb82116ac2d8aaa GIT binary patch literal 6079 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 M?ATiI&%i_f13KGsj{pDw literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_youtube.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..5174bc6b04f17ec9732ad0fd2798306c100baf6f GIT binary patch literal 5233 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 UcBgy=SBa4QHpi{$wudhK7wrgCIRF3v literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/manifest.json b/iconpack/com.fojadrachi.playtube.sdIconPack/manifest.json new file mode 100644 index 0000000..3833aba --- /dev/null +++ b/iconpack/com.fojadrachi.playtube.sdIconPack/manifest.json @@ -0,0 +1,7 @@ +{ + "Name": "Playtube Icons", + "Version": "1.0.0", + "Description": "Icons im Playtube-Look (Verlauf violett/pink): Ordner, Pfeile, Player-Symbole und mehr.", + "Author": "Playtube", + "Icon": "icon.png" +} diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/previews/preview1.png b/iconpack/com.fojadrachi.playtube.sdIconPack/previews/preview1.png new file mode 100644 index 0000000000000000000000000000000000000000..08b649246b6db3ee8a84fe0893c47f014747e941 GIT binary patch literal 5337 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 Beenden) und neu starten. + +$ErrorActionPreference = "Stop" + +$sdRoot = Join-Path $env:APPDATA "HotSpot\StreamDock" +if (-not (Test-Path $sdRoot)) { + throw "Stream Dock ist nicht installiert: $sdRoot nicht gefunden." +} + +function Install-Folder([string]$Source, [string]$TargetParent) { + if (-not (Test-Path $Source)) { throw "Nicht gefunden: $Source (im Repo-Ordner ausfuehren)" } + New-Item -ItemType Directory -Path $TargetParent -ErrorAction SilentlyContinue | Out-Null + $target = Join-Path $TargetParent (Split-Path $Source -Leaf) + # Nur den eigenen Ordner ersetzen, damit keine Reste alter Versionen bleiben. + if (Test-Path $target) { Remove-Item -Recurse -Path $target } + Copy-Item -Recurse -Path $Source -Destination $target + Write-Host "Installiert: $target" -ForegroundColor Green +} + +Install-Folder (Join-Path $PSScriptRoot "com.fojadrachi.playtube.sdPlugin") (Join-Path $sdRoot "plugins") + +$iconPack = Join-Path $PSScriptRoot "iconpack\com.fojadrachi.playtube.sdIconPack" +if (Test-Path $iconPack) { + Install-Folder $iconPack (Join-Path $sdRoot "icons") +} + +Write-Host "" +Write-Host "Fertig. Stream Dock jetzt beenden (Tray-Symbol) und neu starten." -ForegroundColor Cyan +Write-Host "Aktionen: Kategorie 'Playtube'. Playtube ab 4.5.1 muss laufen." -ForegroundColor Cyan diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ac66a48 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,527 @@ +{ + "name": "playtube-streamdock-plugin", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "playtube-streamdock-plugin", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ws": "^8.18.0" + }, + "devDependencies": { + "esbuild": "^0.25.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c8eb343 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "playtube-streamdock-plugin", + "version": "1.0.0", + "private": true, + "description": "Stream Dock plugin (Ajazz AKP153E and other Stream Dock devices) to control Playtube", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "scripts": { + "assets": "node tools/generate-assets.mjs", + "iconpack": "node tools/generate-iconpack.mjs", + "build": "node build.mjs", + "test": "node --test \"tests/*.test.js\"", + "package": "node build.mjs --zip" + }, + "dependencies": { + "ws": "^8.18.0" + }, + "devDependencies": { + "esbuild": "^0.25.0" + } +} diff --git a/src/actions.js b/src/actions.js new file mode 100644 index 0000000..34017cb --- /dev/null +++ b/src/actions.js @@ -0,0 +1,220 @@ +'use strict'; + +/** + * Alle Tastenaktionen des Plugins: was ein Tastendruck an Playtube schickt (request) und wie die + * Taste dazu aussieht (render). Reine Funktionen ohne Netzwerk - dadurch gut testbar. + * + * Zustaende (State) entsprechen den Bildern im manifest.json, Reihenfolge = Index. + */ + +const PREFIX = 'com.fojadrachi.playtube.'; + +const DEFAULTS = Object.freeze({ + target: 'auto', // "auto" | "youtube" | "music" + step: 5, // Lautstaerke-Schritt in Prozent + volume: 30, // Ziel-Lautstaerke der Aktion "Lautstaerke setzen" + seconds: 10, // Sprungweite beim Vor-/Zurueckspulen + tab: 'toggle', // Aktion "Tab wechseln": "toggle" | "youtube" | "music" + playlistId: '', + playlistTitle: '', +}); + +const TARGETS = ['auto', 'youtube', 'music']; +const TABS = ['toggle', 'youtube', 'music']; + +function clampInt(value, min, max, fallback) { + const number = Number.parseInt(value, 10); + if (!Number.isFinite(number)) return fallback; + return Math.max(min, Math.min(max, number)); +} + +/** Macht aus den (evtl. leeren/fehlerhaften) Einstellungen einer Taste gueltige Werte. */ +function normalizeSettings(raw, titleDefault = false) { + const settings = { ...DEFAULTS, ...(raw || {}) }; + if (!TARGETS.includes(settings.target)) settings.target = DEFAULTS.target; + if (!TABS.includes(settings.tab)) settings.tab = DEFAULTS.tab; + settings.step = clampInt(settings.step, 1, 25, DEFAULTS.step); + settings.volume = clampInt(settings.volume, 0, 100, DEFAULTS.volume); + settings.seconds = clampInt(settings.seconds, 1, 300, DEFAULTS.seconds); + const show = raw && raw.showTitle !== undefined ? raw.showTitle : titleDefault; + settings.showTitle = show === true || show === 'true'; + settings.playlistId = typeof settings.playlistId === 'string' ? settings.playlistId.trim() : ''; + settings.playlistTitle = typeof settings.playlistTitle === 'string' ? settings.playlistTitle : ''; + return settings; +} + +/** Welcher Tab ist gemeint? "auto" = der Tab, den Playtube als aktiv meldet. */ +function pickTab(state, target) { + if (!state || !state.tabs) return null; + const name = target === 'auto' ? state.activeTab : target; + const info = state.tabs[name]; + return info ? { name, info } : null; +} + +/** Bricht Text fuer die kleinen Tasten-Displays um (Woerter, dann harte Trennung). */ +function wrapTitle(text, perLine = 8, maxLines = 3) { + const words = String(text || '').trim().split(/\s+/).filter(Boolean); + const lines = []; + let current = ''; + let truncated = false; + const push = (line) => { + if (lines.length < maxLines) lines.push(line); + else truncated = true; + }; + for (let word of words) { + while (word.length > perLine) { + if (current) { + push(current); + current = ''; + } + push(word.slice(0, perLine)); + word = word.slice(perLine); + } + if (!word) continue; + if (!current) current = word; + else if (current.length + 1 + word.length <= perLine) current += ` ${word}`; + else { + push(current); + current = word; + } + } + if (current) push(current); + if (truncated && lines.length) lines[lines.length - 1] = `${lines[lines.length - 1].slice(0, perLine - 2)}..`; + return lines.join('\n'); +} + +function volumeTitle(tab) { + const volume = tab && tab.info.volume; + return typeof volume === 'number' ? `${Math.round(volume)}%` : ''; +} + +const OFFLINE_TITLE = 'Playtube\noffline'; + +/** + * Definition pro Aktion. `id` = letzter Teil der UUID (siehe manifest.json). + * - request(settings): {cmd, fields} oder null (Taste tut dann nichts, zeigt Alarm) + * - render(settings, state, connected): {state?, title?, coverUrl?} + * - press: "up" (Standard, beim Loslassen) oder "down" (sofort; mit repeat = Dauerdruck) + */ +const DEFINITIONS = { + playpause: { + titleDefault: false, + request: (s) => ({ cmd: 'play_pause', fields: { target: s.target } }), + render: (s, state, connected) => { + if (!connected) return { state: 0, title: s.showTitle ? OFFLINE_TITLE : '' }; + const tab = pickTab(state, s.target); + return { + state: tab && tab.info.playing ? 1 : 0, + title: s.showTitle && tab && tab.info.title ? wrapTitle(tab.info.title) : '', + }; + }, + }, + next: { request: (s) => ({ cmd: 'next', fields: { target: s.target } }) }, + previous: { request: (s) => ({ cmd: 'previous', fields: { target: s.target } }) }, + seekback: { + request: (s) => ({ cmd: 'seek', fields: { target: s.target, value: -s.seconds } }), + render: (s) => ({ title: `-${s.seconds}s` }), + }, + seekforward: { + request: (s) => ({ cmd: 'seek', fields: { target: s.target, value: s.seconds } }), + render: (s) => ({ title: `+${s.seconds}s` }), + }, + volumeup: { + press: 'down', + repeat: { delayMs: 450, intervalMs: 140 }, + request: (s) => ({ cmd: 'volume_change', fields: { target: s.target, value: s.step } }), + render: (s, state, connected) => ({ title: connected ? volumeTitle(pickTab(state, s.target)) : '' }), + }, + volumedown: { + press: 'down', + repeat: { delayMs: 450, intervalMs: 140 }, + request: (s) => ({ cmd: 'volume_change', fields: { target: s.target, value: -s.step } }), + render: (s, state, connected) => ({ title: connected ? volumeTitle(pickTab(state, s.target)) : '' }), + }, + volumeset: { + request: (s) => ({ cmd: 'set_volume', fields: { target: s.target, value: s.volume } }), + render: (s) => ({ title: `${s.volume}%` }), + }, + mute: { + request: (s) => ({ cmd: 'mute_toggle', fields: { target: s.target } }), + render: (s, state, connected) => { + const tab = connected ? pickTab(state, s.target) : null; + return { state: tab && tab.info.muted ? 1 : 0, title: tab && !tab.info.muted ? volumeTitle(tab) : '' }; + }, + }, + nowplaying: { + titleDefault: true, + request: (s) => ({ cmd: 'play_pause', fields: { target: s.target } }), + render: (s, state, connected) => { + if (!connected) return { coverUrl: null, title: s.showTitle ? OFFLINE_TITLE : '' }; + const tab = pickTab(state, s.target); + const info = tab && tab.info; + return { + coverUrl: info && info.hasVideo && info.thumbnail ? info.thumbnail : null, + title: s.showTitle && info && info.title ? wrapTitle(info.title) : '', + }; + }, + }, + like: { + request: (s) => ({ cmd: 'like', fields: { target: s.target } }), + render: (s, state, connected) => { + const tab = connected ? pickTab(state, s.target) : null; + return { state: tab && tab.info.likeStatus === 'like' ? 1 : 0 }; + }, + }, + shuffle: { request: (s) => ({ cmd: 'shuffle', fields: { target: s.target } }) }, + repeat: { + request: (s) => ({ cmd: 'repeat', fields: { target: s.target } }), + render: (s, state, connected) => { + const tab = connected ? pickTab(state, s.target) : null; + const mode = String((tab && tab.info.repeatMode) || '').toUpperCase(); + return { state: mode === 'ALL' ? 1 : mode === 'ONE' ? 2 : 0 }; + }, + }, + playlist: { + request: (s) => (s.playlistId ? { cmd: 'play_playlist', fields: { playlist: s.playlistId } } : null), + render: (s) => ({ title: s.playlistTitle ? wrapTitle(s.playlistTitle) : '' }), + }, + switchtab: { + request: (s) => ({ cmd: 'switch_tab', fields: { target: s.tab === 'toggle' ? 'auto' : s.tab } }), + render: (s, state, connected) => { + if (!connected || !state) return { title: '' }; + if (state.visibleTab === 'music') return { title: 'Music' }; + if (state.visibleTab === 'youtube') return { title: 'YouTube' }; + return { title: '' }; + }, + }, + show: { request: () => ({ cmd: 'show', fields: {} }) }, +}; + +function actionIdFromUuid(uuid) { + if (typeof uuid !== 'string' || !uuid.startsWith(PREFIX)) return null; + const id = uuid.slice(PREFIX.length); + return Object.prototype.hasOwnProperty.call(DEFINITIONS, id) ? id : null; +} + +/** Darstellung einer Taste; fehlende Felder heissen "nicht aendern". */ +function renderAction(id, rawSettings, state, connected) { + const definition = DEFINITIONS[id]; + const settings = normalizeSettings(rawSettings, definition.titleDefault); + return definition.render ? definition.render(settings, state, connected) : {}; +} + +/** {cmd, fields} fuer einen Tastendruck oder null. */ +function buildRequest(id, rawSettings) { + const definition = DEFINITIONS[id]; + const settings = normalizeSettings(rawSettings, definition.titleDefault); + return definition.request(settings); +} + +module.exports = { + PREFIX, + DEFAULTS, + DEFINITIONS, + normalizeSettings, + pickTab, + wrapTitle, + actionIdFromUuid, + renderAction, + buildRequest, +}; diff --git a/src/controller.js b/src/controller.js new file mode 100644 index 0000000..105ad95 --- /dev/null +++ b/src/controller.js @@ -0,0 +1,290 @@ +'use strict'; + +/** + * Verbindet Stream Dock (host), Playtube (client) und die Aktionsdefinitionen (actions): + * - haelt fuer jede sichtbare Taste Aktion + Einstellungen, + * - fuehrt Tastendruecke als Playtube-Befehle aus (Lautstaerke: Dauerdruck mit Wiederholung), + * - fragt den Status regelmaessig ab und aktualisiert Titel/Zustand/Cover der Tasten, + * - beantwortet die Playlist-Anfrage des Property Inspectors. + */ + +const { + DEFINITIONS, actionIdFromUuid, buildRequest, normalizeSettings, pickTab, renderAction, +} = require('./actions'); +const { buildInfoSvg, svgToDataUri } = require('./infoPanel'); + +const POLL_INTERVAL_MS = 1000; +const REFRESH_AFTER_COMMAND_MS = 350; +const COVER_CACHE_LIMIT = 24; +const COVER_TIMEOUT_MS = 4000; +const KEY_IMAGE_PX = 144; + +/** YouTube Music liefert Cover mit "=w60-h60-..." - fuer scharfe Tasten auf Tastengroesse ziehen. */ +function sharpCoverUrl(url) { + return String(url).replace(/=w\d+-h\d+/, `=w${KEY_IMAGE_PX}-h${KEY_IMAGE_PX}`); +} + +async function defaultFetchImage(url) { + const response = await fetch(url, { signal: AbortSignal.timeout(COVER_TIMEOUT_MS) }); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + const type = (response.headers.get('content-type') || 'image/jpeg').split(';')[0]; + const bytes = Buffer.from(await response.arrayBuffer()); + return `data:${type};base64,${bytes.toString('base64')}`; +} + +class Controller { + /** + * @param {object} deps + * @param {import('./host').StreamDockHost} deps.host + * @param {import('./playtubeClient').PlaytubeClient} deps.client + * @param {{info: Function, warn: Function, error: Function}} deps.logger + * @param {Function} [deps.fetchImage] - (url) => Promise + * @param {number} [deps.pollIntervalMs] + */ + constructor({ host, client, logger, fetchImage, pollIntervalMs }) { + this.host = host; + this.client = client; + this.logger = logger; + this.fetchImage = fetchImage || defaultFetchImage; + this.pollIntervalMs = pollIntervalMs ?? POLL_INTERVAL_MS; + + this.keys = new Map(); // context -> {actionId, settings, last (zuletzt gesendete Darstellung)} + this.state = null; + this.covers = new Map(); // url -> dataUri (Einfuegereihenfolge = Alter) + this.coverLoading = new Set(); + this.repeaters = new Map(); // context -> {delayTimer, intervalTimer} + this.pollTimer = null; + this.refreshTimer = null; + this.polling = false; + } + + start() { + this.host.on('event', (message) => this.handleEvent(message)); + this.client.on('connected', (name) => { + this.logger.info(`Mit Playtube verbunden (${name})`); + this.poll(); + }); + this.client.on('disconnected', () => { + this.logger.info('Verbindung zu Playtube getrennt'); + this.state = null; + this.renderAll(); + }); + this.client.start(); + this.pollTimer = setInterval(() => this.poll(), this.pollIntervalMs); + } + + stop() { + clearInterval(this.pollTimer); + clearTimeout(this.refreshTimer); + for (const context of [...this.repeaters.keys()]) this.stopRepeat(context); + this.client.stop(); + } + + // ------------------------------------------------------------ Ereignisse + + handleEvent(message) { + const { event, context } = message; + switch (event) { + case 'willAppear': + return this.onAppear(message); + case 'willDisappear': + this.stopRepeat(context); + this.keys.delete(context); + return undefined; + case 'didReceiveSettings': + return this.onSettings(message); + case 'keyDown': + return this.onKeyDown(context); + case 'keyUp': + return this.onKeyUp(context); + case 'sendToPlugin': + return this.onPropertyInspectorMessage(message); + default: + return undefined; + } + } + + onAppear(message) { + const actionId = actionIdFromUuid(message.action); + if (!actionId) return; + const payload = message.payload || {}; + const settings = payload.settings || {}; + const info = payload.controller === 'Information'; + this.logger.info(`willAppear ${actionId} controller=${payload.controller} info=${info}`); + this.keys.set(message.context, { actionId, settings, info, last: null }); + this.renderKey(message.context); + if (this.client.connected && !this.state) this.poll(); + } + + onSettings(message) { + const key = this.keys.get(message.context); + if (!key) return; + key.settings = (message.payload && message.payload.settings) || {}; + key.last = null; + this.renderKey(message.context); + } + + onKeyDown(context) { + const key = this.keys.get(context); + if (!key) return; + const definition = DEFINITIONS[key.actionId]; + if (definition.press !== 'down') return; + this.execute(context); + const { delayMs, intervalMs } = definition.repeat || {}; + if (!delayMs) return; + this.stopRepeat(context); + const timers = {}; + timers.delayTimer = setTimeout(() => { + timers.intervalTimer = setInterval(() => this.execute(context, { quiet: true }), intervalMs); + }, delayMs); + this.repeaters.set(context, timers); + } + + onKeyUp(context) { + const key = this.keys.get(context); + if (!key) return; + if (DEFINITIONS[key.actionId].press === 'down') { + this.stopRepeat(context); + return; + } + this.execute(context); + } + + stopRepeat(context) { + const timers = this.repeaters.get(context); + if (!timers) return; + clearTimeout(timers.delayTimer); + clearInterval(timers.intervalTimer); + this.repeaters.delete(context); + } + + // ------------------------------------------------------------ Befehle + + /** Fuehrt die Aktion einer Taste aus; `quiet` = kein Alarm bei Fehler (Dauerdruck). */ + async execute(context, { quiet = false } = {}) { + const key = this.keys.get(context); + if (!key) return; + const request = buildRequest(key.actionId, key.settings); + if (!request) { + this.host.showAlert(context); + return; + } + try { + await this.client.request(request.cmd, request.fields); + this.scheduleRefresh(); + } catch (error) { + this.logger.warn(`${request.cmd} fehlgeschlagen: ${error.message}`); + if (quiet) this.stopRepeat(context); + else this.host.showAlert(context); + } + } + + scheduleRefresh() { + clearTimeout(this.refreshTimer); + this.refreshTimer = setTimeout(() => this.poll(), REFRESH_AFTER_COMMAND_MS); + } + + // ------------------------------------------------------------ Status + + async poll() { + if (this.polling || !this.client.connected || this.keys.size === 0) return; + this.polling = true; + try { + this.state = await this.client.status(); + this.renderAll(); + } catch (error) { + this.logger.warn(`Status nicht lesbar: ${error.message}`); + } finally { + this.polling = false; + } + } + + renderAll() { + for (const context of this.keys.keys()) this.renderKey(context); + } + + renderKey(context) { + const key = this.keys.get(context); + if (!key) return; + if (key.info && key.actionId === 'nowplaying') { + this.renderInfo(context, key); + return; + } + const view = renderAction(key.actionId, key.settings, this.state, this.client.connected); + const coverUrl = view.coverUrl ? sharpCoverUrl(view.coverUrl) : null; + const cover = coverUrl ? this.covers.get(coverUrl) || null : null; + if (coverUrl && !cover) this.loadCover(coverUrl); + + const next = { state: view.state, title: view.title, cover: cover ? coverUrl : null }; + const previous = key.last || {}; + const changed = (name) => previous[name] !== next[name]; + key.last = next; + + if (view.state !== undefined && changed('state')) this.host.setState(context, view.state); + if (view.title !== undefined && changed('title')) this.host.setTitle(context, view.title); + // Cover anzeigen; ohne Cover (nichts laeuft) das Standardbild der Taste wiederherstellen. + if (view.coverUrl !== undefined && changed('cover')) this.host.setImage(context, cover); + } + + /** Hohes Info-Display: komplette "Aktueller Titel"-Karte als SVG-Bild. */ + renderInfo(context, key) { + let view = null; + if (this.client.connected) { + const tab = pickTab(this.state, normalizeSettings(key.settings).target); + const info = (tab && tab.info) || {}; + const coverUrl = info.thumbnail ? sharpCoverUrl(info.thumbnail) : null; + const coverDataUri = coverUrl ? this.covers.get(coverUrl) || null : null; + if (coverUrl && !coverDataUri) this.loadCover(coverUrl); + view = { + title: info.title || '', + subtitle: info.subtitle || '', + playing: Boolean(info.playing), + currentTime: info.currentTime, + duration: info.duration, + volume: info.volume, + coverDataUri, + }; + } + const svg = buildInfoSvg(view); + if (svg === key.lastSvg) return; + key.lastSvg = svg; + this.host.setTitle(context, ''); + this.host.setImage(context, svgToDataUri(svg)); + } + + async loadCover(url) { + if (this.coverLoading.has(url)) return; + this.coverLoading.add(url); + try { + const dataUri = await this.fetchImage(url); + this.covers.set(url, dataUri); + while (this.covers.size > COVER_CACHE_LIMIT) this.covers.delete(this.covers.keys().next().value); + this.renderAll(); + } catch (error) { + this.logger.warn(`Cover nicht ladbar: ${error.message}`); + } finally { + this.coverLoading.delete(url); + } + } + + // ------------------------------------------------------------ Property Inspector + + async onPropertyInspectorMessage(message) { + const payload = message.payload || {}; + if (payload.command !== 'requestPlaylists') return; + const reply = (body) => this.host.sendToPropertyInspector(message.action, message.context, body); + if (!this.client.connected) { + reply({ command: 'playlists', ok: false, error: 'offline', playlists: [] }); + return; + } + try { + const playlists = await this.client.listPlaylists(); + reply({ command: 'playlists', ok: true, playlists }); + } catch (error) { + this.logger.warn(`Playlists nicht lesbar: ${error.message}`); + reply({ command: 'playlists', ok: false, error: error.code || 'error', message: error.message, playlists: [] }); + } + } +} + +module.exports = { Controller, sharpCoverUrl }; diff --git a/src/host.js b/src/host.js new file mode 100644 index 0000000..b7a2370 --- /dev/null +++ b/src/host.js @@ -0,0 +1,125 @@ +'use strict'; + +/** + * Verbindung zur Stream-Dock-Software (Ajazz/Mirabox "Stream Dock"). + * + * Die Software startet das Plugin mit + * node plugin/index.js -port

-pluginUUID -registerEvent -info + * und erwartet, dass sich das Plugin per WebSocket auf ws://127.0.0.1:

mit + * {"uuid": , "event": } registriert. Danach kommen Ereignisse (willAppear, keyDown, + * keyUp, didReceiveSettings, sendToPlugin, ...) als JSON; Befehle (setTitle, setImage, + * setState, ...) gehen als JSON zurueck. Das Protokoll ist mit dem Elgato-Stream-Deck-SDK + * kompatibel. + */ + +const { EventEmitter } = require('events'); + +function parseArgs(argv) { + const found = {}; + for (let i = 0; i < argv.length - 1; i += 1) { + switch (argv[i]) { + case '-port': found.port = argv[i + 1]; break; + case '-pluginUUID': found.uuid = argv[i + 1]; break; + case '-registerEvent': found.registerEvent = argv[i + 1]; break; + case '-info': found.info = argv[i + 1]; break; + default: break; + } + } + let info = {}; + try { + info = JSON.parse(found.info || '{}'); + } catch { + info = {}; + } + return { port: found.port, uuid: found.uuid, registerEvent: found.registerEvent, info }; +} + +const WS_OPEN = 1; + +class StreamDockHost extends EventEmitter { + /** + * @param {{port: string|number, uuid: string, registerEvent: string, info?: object}} args + * @param {{WebSocket?: Function}} [deps] - Ersatz fuer das ws-Paket (Tests) + */ + constructor(args, deps = {}) { + super(); + this.port = args.port; + this.uuid = args.uuid; + this.registerEvent = args.registerEvent; + this.info = args.info || {}; + this.WebSocket = deps.WebSocket || require('ws'); + this.ws = null; + } + + get language() { + return (this.info.application && this.info.application.language) || 'en'; + } + + connect() { + this.ws = new this.WebSocket(`ws://127.0.0.1:${this.port}`); + this.ws.on('open', () => { + this._send({ uuid: this.uuid, event: this.registerEvent }); + this.emit('open'); + }); + this.ws.on('message', (raw) => { + let message; + try { + message = JSON.parse(raw.toString()); + } catch { + return; + } + this.emit('event', message); + }); + this.ws.on('close', () => this.emit('close')); + this.ws.on('error', (error) => this.emit('error', error)); + } + + close() { + if (this.ws) this.ws.close(); + } + + // ------------------------------------------------------------- Befehle + + setTitle(context, title) { + this._send({ event: 'setTitle', context, payload: { target: 0, title: String(title ?? '') } }); + } + + /** image = Data-URI (PNG/JPEG/SVG); ohne Wert wird das Standardbild des Zustands wiederhergestellt. */ + setImage(context, image) { + const payload = { target: 0 }; + if (image) payload.image = image; + this._send({ event: 'setImage', context, payload }); + } + + setState(context, state) { + this._send({ event: 'setState', context, payload: { state } }); + } + + setSettings(context, settings) { + this._send({ event: 'setSettings', context, payload: settings }); + } + + getSettings(context) { + this._send({ event: 'getSettings', context }); + } + + showAlert(context) { + this._send({ event: 'showAlert', context }); + } + + showOk(context) { + this._send({ event: 'showOk', context }); + } + + sendToPropertyInspector(action, context, payload) { + this._send({ event: 'sendToPropertyInspector', action, context, payload }); + } + + _send(message) { + if (this.ws && this.ws.readyState === WS_OPEN) { + this.ws.send(JSON.stringify(message)); + } + } +} + +module.exports = { StreamDockHost, parseArgs }; diff --git a/src/infoPanel.js b/src/infoPanel.js new file mode 100644 index 0000000..5bbd49e --- /dev/null +++ b/src/infoPanel.js @@ -0,0 +1,110 @@ +'use strict'; + +/** + * "Aktueller Titel" fuer die Info-Felder rechts am Geraet (Controller "Information"): ein + * einzelnes quadratisches Bild - Cover als Hintergrund, unten Titel, Interpret und Fortschritt. + */ + +const { wrapTitle } = require('./actions'); + +const SIZE = 144; +const BACKGROUND = '#171b24'; +const ACCENT = '#ff4d5e'; +const TRACK = '#3a4152'; +const MUTED_TEXT = '#c3c9d6'; +const BAR_X = 10; +const BAR_WIDTH = SIZE - 2 * BAR_X; +const BAR_Y = 132; +const BAR_HEIGHT = 6; +const TITLE_LINE_HEIGHT = 25; +const TITLE_BASELINE_OFFSET = 7; // Schrifthoehe/3: bringt die optische Mitte der Zeile auf die Blockmitte +const FONT = 'font-family="Segoe UI, Arial, sans-serif"'; +const XML_ESCAPES = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; + +function escapeXml(text) { + return String(text).replace(/[&<>"']/g, (char) => XML_ESCAPES[char]); +} + +function formatTime(seconds) { + if (!Number.isFinite(seconds) || seconds < 0) return '0:00'; + const whole = Math.floor(seconds); + return `${Math.floor(whole / 60)}:${String(whole % 60).padStart(2, '0')}`; +} + +function textLines(text, x, y, lineHeight, size, color, weight, anchor = 'middle') { + return String(text).split('\n').filter(Boolean).map((line, index) => ( + `${escapeXml(line)}`)).join(''); +} + +function noteMarkup(cx, cy, scale) { + const s = scale; + return `` + + `` + + ``; +} + +function backgroundMarkup(coverDataUri) { + if (!coverDataUri) return `${noteMarkup(72, 44, 1.1)}`; + return `` + + ``; +} + +/** Abdunklung unten, damit Text auf jedem Cover lesbar bleibt. */ +function shadeMarkup() { + return '' + + '' + + '' + + ``; +} + +function playStateMarkup(playing) { + const cx = 118; + const cy = 26; + const disc = ``; + if (playing) { + return `${disc}` + + ``; + } + return `${disc}`; +} + +/** + * @param {object|null} view - {title, subtitle, playing, currentTime, duration, coverDataUri} + * oder null, wenn Playtube nicht verbunden ist + * @returns {string} SVG-Text (144x144) + */ +function buildInfoSvg(view) { + const head = ``; + if (!view) { + return `${head}${noteMarkup(72, 44, 1.1)}` + + `${textLines('Playtube offline', 72, 120, 0, 14, '#ffffff', 'bold')}`; + } + const hasTrack = Boolean(view.title); + const ratio = view.duration > 0 ? Math.max(0, Math.min(1, view.currentTime / view.duration)) : 0; + const parts = [backgroundMarkup(view.coverDataUri), shadeMarkup()]; + if (hasTrack) { + // Titel (und darunter der Interpret) als Block genau in der Bildmitte, mittig ausgerichtet. + const title = wrapTitle(view.title, 10, 2); + const lineCount = title.split('\n').length; + const blockCenter = view.subtitle ? SIZE / 2 - 12 : SIZE / 2; + const firstBaseline = blockCenter - ((lineCount - 1) * TITLE_LINE_HEIGHT) / 2 + TITLE_BASELINE_OFFSET; + parts.push(textLines(title, SIZE / 2, firstBaseline, TITLE_LINE_HEIGHT, 22, '#ffffff', 'bold')); + if (view.subtitle) { + const subtitleY = firstBaseline + (lineCount - 1) * TITLE_LINE_HEIGHT + 27; + parts.push(textLines(wrapTitle(view.subtitle, 13, 1), SIZE / 2, subtitleY, 0, 16, MUTED_TEXT, 'normal')); + } + parts.push(playStateMarkup(view.playing)); + } else { + parts.push(textLines('Nichts spielt', 72, 120, 0, 14, '#ffffff', 'bold')); + } + parts.push(``); + parts.push(``); + return `${head}${parts.join('')}`; +} + +function svgToDataUri(svg) { + return `data:image/svg+xml;base64,${Buffer.from(svg, 'utf8').toString('base64')}`; +} + +module.exports = { buildInfoSvg, svgToDataUri, formatTime, SIZE }; diff --git a/src/logger.js b/src/logger.js new file mode 100644 index 0000000..7a23e2c --- /dev/null +++ b/src/logger.js @@ -0,0 +1,50 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +const MAX_BYTES = 512 * 1024; + +/** + * Sehr einfacher Datei-Logger (log/plugin.log neben dem Plugin). Wird beim Ueberschreiten von + * 512 KB rotiert (plugin.log -> plugin.old.log). Logging darf das Plugin nie stoeren, jeder + * Dateifehler wird geschluckt. + */ +function createLogger(directory) { + const file = path.join(directory, 'plugin.log'); + let ready = false; + + function ensure() { + if (ready) return true; + try { + fs.mkdirSync(directory, { recursive: true }); + ready = true; + } catch { + ready = false; + } + return ready; + } + + function write(level, message) { + if (!ensure()) return; + try { + try { + if (fs.statSync(file).size > MAX_BYTES) fs.renameSync(file, path.join(directory, 'plugin.old.log')); + } catch { + // Datei existiert noch nicht - nichts zu rotieren + } + fs.appendFileSync(file, `${new Date().toISOString()} ${level} ${message}\n`); + } catch { + // Logging ist optional + } + } + + const describe = (value) => (value instanceof Error ? value.stack || value.message : String(value)); + return { + info: (message) => write('INFO ', describe(message)), + warn: (message) => write('WARN ', describe(message)), + error: (message) => write('ERROR', describe(message)), + }; +} + +module.exports = { createLogger }; diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..0120e75 --- /dev/null +++ b/src/main.js @@ -0,0 +1,45 @@ +'use strict'; + +/** + * Einstiegspunkt des Plugins (wird von build.mjs zu plugin/index.js gebuendelt). + * Stream Dock startet: node plugin/index.js -port P -pluginUUID U -registerEvent E -info {...} + */ + +const path = require('path'); +const { StreamDockHost, parseArgs } = require('./host'); +const { PlaytubeClient } = require('./playtubeClient'); +const { Controller } = require('./controller'); +const { createLogger } = require('./logger'); + +const EXIT_GRACE_MS = 2000; + +function main() { + const args = parseArgs(process.argv.slice(2)); + const logger = createLogger(path.join(__dirname, '..', 'log')); + if (!args.port || !args.uuid || !args.registerEvent) { + logger.error(`Ungueltige Startparameter: ${process.argv.slice(2).join(' ')}`); + process.exit(1); + } + + process.on('uncaughtException', (error) => logger.error(error)); + process.on('unhandledRejection', (error) => logger.error(error)); + + const host = new StreamDockHost(args); + // Nur fuer Tests: PLAYTUBE_PIPE_NAMES="a,b" ersetzt die Standard-Pipe-Namen. + const pipeNames = process.env.PLAYTUBE_PIPE_NAMES ? process.env.PLAYTUBE_PIPE_NAMES.split(',') : undefined; + const client = new PlaytubeClient({ pipeNames }); + const controller = new Controller({ host, client, logger }); + controller.start(); + + host.on('open', () => logger.info(`Bei Stream Dock registriert (Port ${args.port})`)); + host.on('error', (error) => logger.warn(`WebSocket-Fehler: ${error.message}`)); + host.on('close', () => { + // Stream Dock beendet Plugins, indem es die Verbindung schliesst - dann sauber aufraeumen. + logger.info('Verbindung zu Stream Dock beendet'); + controller.stop(); + setTimeout(() => process.exit(0), EXIT_GRACE_MS).unref(); + }); + host.connect(); +} + +main(); diff --git a/src/playtubeClient.js b/src/playtubeClient.js new file mode 100644 index 0000000..7e50dea --- /dev/null +++ b/src/playtubeClient.js @@ -0,0 +1,233 @@ +'use strict'; + +/** + * Client fuer die lokale Fernsteuerung von Playtube (playtube/remote_control.py). + * + * Transport: Named Pipe \\.\pipe\Playtube.Remote. - "Playtube" (installierte + * Playtube.exe) bzw. "PlaytubeDev" (python main.py). Nur der angemeldete Benutzer darf + * verbinden. Protokoll: eine JSON-Nachricht pro Zeile (UTF-8, "\n"), Verbindung bleibt offen: + * + * -> {"id": 1, "cmd": "play_pause", "target": "auto"} + * <- {"id": 1, "ok": true} + * <- {"id": 2, "ok": false, "error": "..."} + * + * Der Client verbindet sich selbststaendig (auch wenn Playtube erst spaeter startet) und + * baut die Verbindung nach einem Playtube-Neustart wieder auf. + */ + +const net = require('net'); +const os = require('os'); +const path = require('path'); +const { EventEmitter } = require('events'); + +const PIPE_PREFIX = 'Playtube.Remote.'; +// Installierte Version zuerst, dann der Entwicklungsmodus; danach die Edge-Variante (WebView2). +const PIPE_NAMES = ['Playtube', 'PlaytubeDev', 'PlaytubeEdge', 'PlaytubeEdgeDev']; +const MAX_BUFFER_CHARS = 1 << 20; + +class PlaytubeError extends Error { + constructor(code, message) { + super(message); + this.name = 'PlaytubeError'; + this.code = code; + } +} + +function pipePath(name, platform = process.platform) { + const full = PIPE_PREFIX + name; + return platform === 'win32' ? `\\\\.\\pipe\\${full}` : path.join(os.tmpdir(), full); +} + +class PlaytubeClient extends EventEmitter { + /** + * @param {object} [options] + * @param {string[]} [options.pipeNames] + * @param {string} [options.platform] + * @param {Function} [options.connect] - Ersatz fuer net.connect (Tests) + * @param {number} [options.requestTimeoutMs] + * @param {number[]} [options.backoffMs] + */ + constructor(options = {}) { + super(); + this.pipeNames = options.pipeNames || PIPE_NAMES; + this.platform = options.platform || process.platform; + this.connectFn = options.connect || net.connect; + this.requestTimeoutMs = options.requestTimeoutMs ?? 3000; + this.backoffMs = options.backoffMs || [300, 600, 1200, 2500, 5000]; + + this.socket = null; + this.connected = false; + this.pipeName = null; + this.running = false; + + this._nextId = 1; + this._pending = new Map(); + this._buffer = ''; + this._failedRounds = 0; + this._retryTimer = null; + } + + start() { + if (this.running) return; + this.running = true; + this._attempt(0); + } + + stop() { + this.running = false; + clearTimeout(this._retryTimer); + this._retryTimer = null; + const socket = this.socket; + this.socket = null; + if (this.connected) { + this.connected = false; + this._rejectAll(new PlaytubeError('stopped', 'Client gestoppt')); + } + if (socket) socket.destroy(); + } + + /** + * Schickt einen Befehl und wartet auf die Antwort. + * @param {string} cmd + * @param {object} [fields] - target / value / playlist (undefined-Werte werden weggelassen) + * @returns {Promise} die komplette Antwort ({ok: true, ...}) + */ + request(cmd, fields = {}) { + if (!this.connected || !this.socket) { + return Promise.reject(new PlaytubeError('not_connected', 'Playtube ist nicht verbunden')); + } + const id = this._nextId++; + const payload = { id, cmd }; + for (const [key, value] of Object.entries(fields)) { + if (value !== undefined && value !== null) payload[key] = value; + } + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + this._pending.delete(id); + reject(new PlaytubeError('timeout', `Keine Antwort von Playtube auf "${cmd}"`)); + }, this.requestTimeoutMs); + this._pending.set(id, { resolve, reject, timer }); + this.socket.write(`${JSON.stringify(payload)}\n`, (error) => { + if (error && this._pending.delete(id)) { + clearTimeout(timer); + reject(new PlaytubeError('write_failed', error.message)); + } + }); + }); + } + + async status() { + const response = await this.request('status'); + if (!response.state) throw new PlaytubeError('bad_response', 'Status ohne "state"'); + return response.state; + } + + async listPlaylists() { + const response = await this.request('list_playlists'); + return Array.isArray(response.playlists) ? response.playlists : []; + } + + playPlaylist(playlistId) { + return this.request('play_playlist', { playlist: playlistId }); + } + + // ------------------------------------------------------------------ intern + + _attempt(index) { + if (!this.running) return; + if (index >= this.pipeNames.length) { + this._scheduleRetry(); + return; + } + const name = this.pipeNames[index]; + const socket = this.connectFn(pipePath(name, this.platform)); + let opened = false; + socket.setEncoding('utf8'); + socket.once('connect', () => { + if (!this.running) { + socket.destroy(); + return; + } + opened = true; + this.socket = socket; + this.connected = true; + this.pipeName = name; + this._failedRounds = 0; + this._buffer = ''; + this.emit('connected', name); + }); + socket.on('data', (chunk) => { + if (socket === this.socket) this._onData(chunk); + }); + socket.on('error', () => { + // Folgt immer ein 'close' - dort wird weitergemacht. + }); + socket.on('close', () => { + if (!opened) { + this._attempt(index + 1); + } else if (socket === this.socket) { + this._onLost(); + } + }); + } + + _onLost() { + this.socket = null; + this.connected = false; + this.pipeName = null; + this._rejectAll(new PlaytubeError('disconnected', 'Verbindung zu Playtube getrennt')); + this.emit('disconnected'); + this._failedRounds = 0; + this._scheduleRetry(); + } + + _scheduleRetry() { + if (!this.running) return; + const delay = this.backoffMs[Math.min(this._failedRounds, this.backoffMs.length - 1)]; + this._failedRounds += 1; + this._retryTimer = setTimeout(() => this._attempt(0), delay); + } + + _onData(chunk) { + this._buffer += chunk; + let newline; + while ((newline = this._buffer.indexOf('\n')) >= 0) { + const line = this._buffer.slice(0, newline).trim(); + this._buffer = this._buffer.slice(newline + 1); + if (line) this._onLine(line); + } + if (this._buffer.length > MAX_BUFFER_CHARS) { + // Kein Zeilenende in Sicht: Gegenstelle verhaelt sich falsch -> Verbindung neu aufbauen. + this._buffer = ''; + if (this.socket) this.socket.destroy(); + } + } + + _onLine(line) { + let message; + try { + message = JSON.parse(line); + } catch { + return; // kaputte Zeile ignorieren, naechste abwarten + } + const entry = this._pending.get(message.id); + if (!entry) return; + this._pending.delete(message.id); + clearTimeout(entry.timer); + if (message.ok) { + entry.resolve(message); + } else { + entry.reject(new PlaytubeError('remote', message.error || 'Fehler in Playtube')); + } + } + + _rejectAll(error) { + for (const entry of this._pending.values()) { + clearTimeout(entry.timer); + entry.reject(error); + } + this._pending.clear(); + } +} + +module.exports = { PlaytubeClient, PlaytubeError, pipePath, PIPE_NAMES, PIPE_PREFIX }; diff --git a/tests/actions.test.js b/tests/actions.test.js new file mode 100644 index 0000000..b807dc2 --- /dev/null +++ b/tests/actions.test.js @@ -0,0 +1,112 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const { + DEFINITIONS, PREFIX, actionIdFromUuid, buildRequest, normalizeSettings, renderAction, wrapTitle, +} = require('../src/actions'); + +const STATE = { + activeTab: 'music', + visibleTab: 'music', + tabs: { + music: { playing: true, title: 'Ein sehr langer Songtitel', volume: 42.4, muted: false, likeStatus: 'like', + repeatMode: 'ALL', hasVideo: true, thumbnail: 'https://example.test/c=w60-h60' }, + youtube: { playing: false, title: 'Video', volume: 80, muted: true, likeStatus: 'none', repeatMode: 'NONE' }, + }, +}; + +test('actionIdFromUuid erkennt nur bekannte Aktionen', () => { + assert.equal(actionIdFromUuid(`${PREFIX}volumeup`), 'volumeup'); + assert.equal(actionIdFromUuid(`${PREFIX}gibtesnicht`), null); + assert.equal(actionIdFromUuid('com.other.volumeup'), null); + assert.equal(actionIdFromUuid(undefined), null); +}); + +test('normalizeSettings begrenzt Werte und ersetzt ungueltige durch Standardwerte', () => { + const settings = normalizeSettings({ step: '999', volume: -5, seconds: 'abc', target: 'x', tab: 'y' }); + assert.equal(settings.step, 25); + assert.equal(settings.volume, 0); + assert.equal(settings.seconds, 10); + assert.equal(settings.target, 'auto'); + assert.equal(settings.tab, 'toggle'); +}); + +test('normalizeSettings: showTitle nutzt den Standard der Aktion, wenn nichts gespeichert ist', () => { + assert.equal(normalizeSettings({}, true).showTitle, true); + assert.equal(normalizeSettings({}, false).showTitle, false); + assert.equal(normalizeSettings({ showTitle: false }, true).showTitle, false); + assert.equal(normalizeSettings({ showTitle: 'true' }, false).showTitle, true); +}); + +test('Lauter/Leiser senden volume_change mit Vorzeichen und Schrittweite', () => { + assert.deepEqual(buildRequest('volumeup', { step: 7 }), { cmd: 'volume_change', fields: { target: 'auto', value: 7 } }); + assert.deepEqual(buildRequest('volumedown', { step: 7, target: 'music' }), + { cmd: 'volume_change', fields: { target: 'music', value: -7 } }); +}); + +test('Lautstaerke setzen und Spulen', () => { + assert.deepEqual(buildRequest('volumeset', { volume: 55 }), { cmd: 'set_volume', fields: { target: 'auto', value: 55 } }); + assert.deepEqual(buildRequest('seekback', { seconds: 15 }), { cmd: 'seek', fields: { target: 'auto', value: -15 } }); + assert.deepEqual(buildRequest('seekforward', {}), { cmd: 'seek', fields: { target: 'auto', value: 10 } }); +}); + +test('Playlist-Taste ohne ID sendet nichts, mit ID play_playlist', () => { + assert.equal(buildRequest('playlist', {}), null); + assert.deepEqual(buildRequest('playlist', { playlistId: ' PL123 ' }), + { cmd: 'play_playlist', fields: { playlist: 'PL123' } }); +}); + +test('Tab wechseln: "toggle" wird zu auto', () => { + assert.equal(buildRequest('switchtab', {}).fields.target, 'auto'); + assert.equal(buildRequest('switchtab', { tab: 'youtube' }).fields.target, 'youtube'); +}); + +test('jede Aktion hat request() und liefert gueltiges cmd', () => { + for (const id of Object.keys(DEFINITIONS)) { + const request = buildRequest(id, { playlistId: 'PLx' }); + assert.ok(request && typeof request.cmd === 'string', id); + } +}); + +test('Play/Pause-Zustand folgt dem aktiven Tab bzw. dem gewaehlten Ziel', () => { + assert.equal(renderAction('playpause', {}, STATE, true).state, 1); + assert.equal(renderAction('playpause', { target: 'youtube' }, STATE, true).state, 0); +}); + +test('Lautstaerke-Tasten zeigen die gerundete Lautstaerke', () => { + assert.equal(renderAction('volumeup', {}, STATE, true).title, '42%'); + assert.equal(renderAction('volumedown', { target: 'youtube' }, STATE, true).title, '80%'); +}); + +test('offline: Titel leer bzw. Offline-Hinweis, Zustand 0', () => { + assert.equal(renderAction('volumeup', {}, null, false).title, ''); + const view = renderAction('playpause', { showTitle: true }, null, false); + assert.equal(view.state, 0); + assert.match(view.title, /offline/); +}); + +test('Mute, Like und Repeat bilden den Playtube-Zustand auf State-Indizes ab', () => { + assert.equal(renderAction('mute', { target: 'youtube' }, STATE, true).state, 1); + assert.equal(renderAction('mute', {}, STATE, true).state, 0); + assert.equal(renderAction('like', {}, STATE, true).state, 1); + assert.equal(renderAction('repeat', {}, STATE, true).state, 1); + assert.equal(renderAction('repeat', { target: 'youtube' }, STATE, true).state, 0); + const one = { ...STATE, tabs: { ...STATE.tabs, music: { ...STATE.tabs.music, repeatMode: 'ONE' } } }; + assert.equal(renderAction('repeat', {}, one, true).state, 2); +}); + +test('Cover-Taste liefert die Thumbnail-URL nur bei vorhandenem Video/Titel', () => { + assert.equal(renderAction('nowplaying', {}, STATE, true).coverUrl, 'https://example.test/c=w60-h60'); + assert.equal(renderAction('nowplaying', { target: 'youtube' }, STATE, true).coverUrl, null); + assert.equal(renderAction('nowplaying', {}, null, false).coverUrl, null); +}); + +test('wrapTitle bricht um, trennt lange Woerter und kuerzt', () => { + assert.equal(wrapTitle('Hello World'), 'Hello\nWorld'); + assert.equal(wrapTitle('Supercalifragilistic'), 'Supercal\nifragili\nstic'); + const lines = wrapTitle('eins zwei drei vier fuenf sechs sieben acht neun zehn').split('\n'); + assert.equal(lines.length, 3); + assert.ok(lines[2].endsWith('..')); + assert.equal(wrapTitle(''), ''); +}); diff --git a/tests/controller.test.js b/tests/controller.test.js new file mode 100644 index 0000000..4df74f4 --- /dev/null +++ b/tests/controller.test.js @@ -0,0 +1,204 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const { EventEmitter } = require('node:events'); +const { Controller, sharpCoverUrl } = require('../src/controller'); +const { PlaytubeError } = require('../src/playtubeClient'); +const { PREFIX } = require('../src/actions'); + +const silentLogger = { info() {}, warn() {}, error() {} }; +const tick = (ms = 5) => new Promise((resolve) => setTimeout(resolve, ms)); + +const STATE = { + activeTab: 'music', + visibleTab: 'music', + tabs: { + music: { playing: true, title: 'Song', volume: 40, muted: false, likeStatus: 'none', repeatMode: 'NONE', + hasVideo: true, thumbnail: 'https://example.test/x=w60-h60-l90' }, + youtube: { playing: false, title: '', volume: 100, muted: false }, + }, +}; + +class FakeHost extends EventEmitter { + constructor() { + super(); + this.calls = []; + for (const name of ['setTitle', 'setImage', 'setState', 'showAlert', 'showOk', 'sendToPropertyInspector']) { + this[name] = (...args) => this.calls.push([name, ...args]); + } + } + + named(name) { return this.calls.filter((call) => call[0] === name); } +} + +class FakeClient extends EventEmitter { + constructor() { + super(); + this.connected = true; + this.requests = []; + this.state = STATE; + this.failWith = null; + this.playlists = [{ id: 'LM', title: 'Liked' }]; + } + + start() {} + stop() {} + async request(cmd, fields) { + if (this.failWith) throw this.failWith; + this.requests.push({ cmd, ...fields }); + return { ok: true }; + } + async status() { return this.state; } + async listPlaylists() { return this.playlists; } +} + +function setup() { + const host = new FakeHost(); + const client = new FakeClient(); + const covers = []; + const controller = new Controller({ + host, client, logger: silentLogger, pollIntervalMs: 100000, + fetchImage: async (url) => { covers.push(url); return `data:image/jpeg;base64,${Buffer.from(url).toString('base64')}`; }, + }); + return { host, client, controller, covers }; +} + +const appear = (controller, id, context = `ctx-${id}`, settings = {}) => controller.handleEvent({ + event: 'willAppear', action: `${PREFIX}${id}`, context, payload: { settings }, +}); + +test('sharpCoverUrl hebt die Aufloesung von Music-Covern auf Tastengroesse', () => { + assert.equal(sharpCoverUrl('https://x/a=w60-h60-l90-rj'), 'https://x/a=w144-h144-l90-rj'); + assert.equal(sharpCoverUrl('https://i.ytimg.com/vi/abc/hq.jpg'), 'https://i.ytimg.com/vi/abc/hq.jpg'); +}); + +test('Taste erscheint offline: Offline-Titel', () => { + const { host, client, controller } = setup(); + client.connected = false; + appear(controller, 'playpause', 'k1', { showTitle: true }); + assert.match(host.named('setTitle')[0][2], /offline/); +}); + +test('Lauter: sofort beim Druecken, Wiederholung beim Halten, Stopp beim Loslassen', async () => { + const { client, controller } = setup(); + appear(controller, 'volumeup', 'v1', { step: 3 }); + controller.handleEvent({ event: 'keyDown', context: 'v1' }); + await tick(); + assert.equal(client.requests.length, 1); + assert.deepEqual(client.requests[0], { cmd: 'volume_change', target: 'auto', value: 3 }); + assert.ok(controller.repeaters.has('v1')); + controller.handleEvent({ event: 'keyUp', context: 'v1' }); + assert.equal(controller.repeaters.size, 0); + await tick(); + assert.equal(client.requests.length, 1); +}); + +test('normale Aktionen laufen beim Loslassen, nicht beim Druecken', async () => { + const { client, controller } = setup(); + appear(controller, 'next', 'n1'); + controller.handleEvent({ event: 'keyDown', context: 'n1' }); + await tick(); + assert.equal(client.requests.length, 0); + controller.handleEvent({ event: 'keyUp', context: 'n1' }); + await tick(); + assert.deepEqual(client.requests, [{ cmd: 'next', target: 'auto' }]); +}); + +test('Fehler von Playtube loesen einen Alarm auf der Taste aus', async () => { + const { host, client, controller } = setup(); + client.failWith = new PlaytubeError('not_connected', 'offline'); + appear(controller, 'next', 'n1'); + controller.handleEvent({ event: 'keyUp', context: 'n1' }); + await tick(); + assert.equal(host.named('showAlert').length, 1); +}); + +test('Playlist-Taste ohne Auswahl zeigt Alarm und sendet nichts', async () => { + const { host, client, controller } = setup(); + appear(controller, 'playlist', 'p1'); + controller.handleEvent({ event: 'keyUp', context: 'p1' }); + await tick(); + assert.equal(client.requests.length, 0); + assert.equal(host.named('showAlert').length, 1); +}); + +test('Playlist-Taste startet die gewaehlte Playlist und zeigt ihren Namen', async () => { + const { host, client, controller } = setup(); + appear(controller, 'playlist', 'p1', { playlistId: 'PLabc', playlistTitle: 'Mein Mix' }); + assert.equal(host.named('setTitle').at(-1)[2], 'Mein Mix'); + controller.handleEvent({ event: 'keyUp', context: 'p1' }); + await tick(); + assert.deepEqual(client.requests, [{ cmd: 'play_playlist', playlist: 'PLabc' }]); +}); + +test('Status aktualisiert Zustand und Lautstaerke-Anzeige, nur bei Aenderung', async () => { + const { host, controller } = setup(); + appear(controller, 'playpause', 'pp'); + appear(controller, 'volumeup', 'vu'); + await controller.poll(); + assert.deepEqual(host.named('setState').filter((c) => c[1] === 'pp').at(-1), ['setState', 'pp', 1]); + assert.equal(host.named('setTitle').filter((c) => c[1] === 'vu').at(-1)[2], '40%'); + const before = host.calls.length; + await controller.poll(); + assert.equal(host.calls.length, before, 'unveraenderter Status sendet nichts erneut'); +}); + +test('Cover wird in hoher Aufloesung geladen und als Bild gesetzt', async () => { + const { host, controller, covers } = setup(); + appear(controller, 'nowplaying', 'np'); + await controller.poll(); + await tick(20); + assert.deepEqual(covers, ['https://example.test/x=w144-h144-l90']); + const image = host.named('setImage').at(-1); + assert.equal(image[1], 'np'); + assert.match(image[2], /^data:image\/jpeg;base64,/); +}); + +test('Verbindungsverlust stellt Offline-Anzeige her', async () => { + const { host, client, controller } = setup(); + controller.start(); + appear(controller, 'volumeup', 'vu'); + await controller.poll(); + assert.equal(host.named('setTitle').filter((c) => c[1] === 'vu').at(-1)[2], '40%'); + client.connected = false; + client.emit('disconnected'); + assert.equal(host.named('setTitle').filter((c) => c[1] === 'vu').at(-1)[2], ''); + controller.stop(); +}); + +test('Property Inspector bekommt die Playlists', async () => { + const { host, controller } = setup(); + controller.handleEvent({ event: 'sendToPlugin', action: `${PREFIX}playlist`, context: 'p1', + payload: { command: 'requestPlaylists' } }); + await tick(); + const [, action, context, payload] = host.named('sendToPropertyInspector')[0]; + assert.equal(action, `${PREFIX}playlist`); + assert.equal(context, 'p1'); + assert.deepEqual(payload, { command: 'playlists', ok: true, playlists: [{ id: 'LM', title: 'Liked' }] }); +}); + +test('Property Inspector: offline und Fehler werden gemeldet', async () => { + const { host, client, controller } = setup(); + client.connected = false; + controller.handleEvent({ event: 'sendToPlugin', action: 'a', context: 'c', payload: { command: 'requestPlaylists' } }); + await tick(); + assert.equal(host.named('sendToPropertyInspector')[0][3].error, 'offline'); + + client.connected = true; + client.listPlaylists = async () => { throw new PlaytubeError('remote', 'unbekannter Befehl'); }; + controller.handleEvent({ event: 'sendToPlugin', action: 'a', context: 'c', payload: { command: 'requestPlaylists' } }); + await tick(); + const payload = host.named('sendToPropertyInspector')[1][3]; + assert.equal(payload.ok, false); + assert.equal(payload.error, 'remote'); +}); + +test('willDisappear raeumt Taste und Wiederholung auf', () => { + const { controller } = setup(); + appear(controller, 'volumeup', 'v1'); + controller.handleEvent({ event: 'keyDown', context: 'v1' }); + controller.handleEvent({ event: 'willDisappear', context: 'v1' }); + assert.equal(controller.keys.size, 0); + assert.equal(controller.repeaters.size, 0); +}); diff --git a/tests/infoPanel.test.js b/tests/infoPanel.test.js new file mode 100644 index 0000000..6c4a81e --- /dev/null +++ b/tests/infoPanel.test.js @@ -0,0 +1,70 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const { EventEmitter } = require('node:events'); +const { buildInfoSvg, formatTime, svgToDataUri } = require('../src/infoPanel'); +const { Controller } = require('../src/controller'); +const { PREFIX } = require('../src/actions'); + +const VIEW = { title: 'Tom & ', subtitle: 'Interpret', playing: true, currentTime: 65, duration: 200, volume: 42.4 }; + +test('formatTime formatiert Sekunden als m:ss', () => { + assert.equal(formatTime(65), '1:05'); + assert.equal(formatTime(0), '0:00'); + assert.equal(formatTime(NaN), '0:00'); + assert.equal(formatTime(-3), '0:00'); +}); + +test('SVG enthaelt Titel (XML-escaped) und Interpret, quadratisch', () => { + const svg = buildInfoSvg(VIEW); + assert.match(svg, /^')); + assert.ok(svg.includes('width="144" height="144"')); +}); + +test('Cover wird eingebettet, sonst Platzhalter', () => { + assert.ok(buildInfoSvg({ ...VIEW, coverDataUri: 'data:image/jpeg;base64,AAAA' }).includes('href="data:image/jpeg;base64,AAAA"')); + assert.ok(!buildInfoSvg(VIEW).includes(' { + assert.ok(buildInfoSvg({ ...VIEW, currentTime: 999 }).includes('width="124.0"')); + assert.ok(buildInfoSvg({ ...VIEW, duration: 0 }).includes('width="0.0"')); +}); + +test('offline und "nichts spielt" haben eigene Darstellungen', () => { + assert.ok(buildInfoSvg(null).includes('offline')); + assert.ok(buildInfoSvg({ ...VIEW, title: '' }).includes('spielt')); +}); + +test('svgToDataUri erzeugt eine dekodierbare Data-URI', () => { + const uri = svgToDataUri(''); + assert.equal(Buffer.from(uri.split(',')[1], 'base64').toString(), ''); +}); + +test('Controller: nowplaying auf dem Info-Display sendet ein SVG-Bild', () => { + const calls = []; + const host = new EventEmitter(); + host.setTitle = (...a) => calls.push(['setTitle', ...a]); + host.setImage = (...a) => calls.push(['setImage', ...a]); + host.setState = () => {}; + const client = new EventEmitter(); + client.connected = true; + client.status = async () => ({ activeTab: 'music', tabs: { music: { ...VIEW } } }); + const controller = new Controller({ + host, client, logger: { info() {}, warn() {}, error() {} }, fetchImage: async () => 'data:image/jpeg;base64,AA', + }); + controller.handleEvent({ event: 'willAppear', action: `${PREFIX}nowplaying`, context: 'INFO', + payload: { controller: 'Information', settings: {} } }); + controller.state = { activeTab: 'music', tabs: { music: { ...VIEW } } }; + controller.renderAll(); + const image = calls.filter((c) => c[0] === 'setImage').at(-1); + assert.match(image[2], /^data:image\/svg\+xml;base64,/); + const before = calls.length; + controller.renderAll(); + assert.equal(calls.length, before, 'unveraendert sendet nichts erneut'); +}); diff --git a/tests/playtubeClient.test.js b/tests/playtubeClient.test.js new file mode 100644 index 0000000..ffc65b5 --- /dev/null +++ b/tests/playtubeClient.test.js @@ -0,0 +1,129 @@ +'use strict'; + +const test = require('node:test'); +const assert = require('node:assert/strict'); +const net = require('node:net'); +const { PlaytubeClient, PlaytubeError, pipePath } = require('../src/playtubeClient'); + +const uniqueName = () => `Test${process.pid}${Date.now()}${Math.floor(Math.random() * 1e6)}`; +const until = async (condition, timeoutMs = 3000) => { + const start = Date.now(); + while (!condition()) { + if (Date.now() - start > timeoutMs) throw new Error('Zeitueberschreitung im Test'); + await new Promise((resolve) => setTimeout(resolve, 10)); + } +}; + +/** Fake-Playtube: beantwortet zeilenweise JSON-Befehle wie playtube/remote_control.py. */ +function startServer(name, handler) { + const sockets = new Set(); + const server = net.createServer((socket) => { + sockets.add(socket); + socket.setEncoding('utf8'); + let buffer = ''; + socket.on('data', (chunk) => { + buffer += chunk; + let index; + while ((index = buffer.indexOf('\n')) >= 0) { + const line = buffer.slice(0, index); + buffer = buffer.slice(index + 1); + const request = JSON.parse(line); + const reply = handler(request); + if (reply) socket.write(`${JSON.stringify({ id: request.id, ...reply })}\n`); + } + }); + socket.on('close', () => sockets.delete(socket)); + socket.on('error', () => {}); + }); + return new Promise((resolve) => { + server.listen(pipePath(name), () => resolve({ + dropClients: () => sockets.forEach((socket) => socket.destroy()), + close: () => new Promise((done) => { sockets.forEach((s) => s.destroy()); server.close(done); }), + })); + }); +} + +test('pipePath bildet den Windows-Pipe-Namen', () => { + assert.equal(pipePath('Playtube', 'win32'), '\\\\.\\pipe\\Playtube.Remote.Playtube'); +}); + +test('verbindet sich, sendet Befehle und liefert Antworten', async () => { + const name = uniqueName(); + const fake = await startServer(name, (request) => { + if (request.cmd === 'status') return { ok: true, state: { activeTab: 'music' } }; + if (request.cmd === 'list_playlists') return { ok: true, playlists: [{ id: 'LM', title: 'Liked' }] }; + if (request.cmd === 'boom') return { ok: false, error: 'kaputt' }; + return { ok: true, echo: request }; + }); + const client = new PlaytubeClient({ pipeNames: [name] }); + client.start(); + try { + await until(() => client.connected); + assert.deepEqual(await client.status(), { activeTab: 'music' }); + assert.deepEqual(await client.listPlaylists(), [{ id: 'LM', title: 'Liked' }]); + const echoed = await client.request('volume_change', { target: 'auto', value: 5, skip: undefined }); + assert.deepEqual(echoed.echo, { id: echoed.id, cmd: 'volume_change', target: 'auto', value: 5 }); + await assert.rejects(client.request('boom'), + (error) => error instanceof PlaytubeError && error.code === 'remote' && /kaputt/.test(error.message)); + } finally { + client.stop(); + await fake.close(); + } +}); + +test('ohne Verbindung wird sofort abgelehnt', async () => { + const client = new PlaytubeClient({ pipeNames: [uniqueName()] }); + await assert.rejects(client.request('status'), (error) => error.code === 'not_connected'); +}); + +test('Timeout, wenn Playtube nicht antwortet', async () => { + const name = uniqueName(); + const fake = await startServer(name, () => null); + const client = new PlaytubeClient({ pipeNames: [name], requestTimeoutMs: 80 }); + client.start(); + try { + await until(() => client.connected); + await assert.rejects(client.request('status'), (error) => error.code === 'timeout'); + } finally { + client.stop(); + await fake.close(); + } +}); + +test('Verbindungsabbruch: offene Anfragen scheitern, danach automatische Wiederverbindung', async () => { + const name = uniqueName(); + const fake = await startServer(name, () => null); + const client = new PlaytubeClient({ pipeNames: [name], backoffMs: [20] }); + const events = []; + client.on('connected', () => events.push('connected')); + client.on('disconnected', () => events.push('disconnected')); + client.start(); + try { + await until(() => client.connected); + const pending = client.request('status'); + fake.dropClients(); + await assert.rejects(pending, (error) => error.code === 'disconnected'); + await until(() => events.filter((e) => e === 'connected').length === 2); + assert.deepEqual(events, ['connected', 'disconnected', 'connected']); + } finally { + client.stop(); + await fake.close(); + } +}); + +test('probiert mehrere Pipe-Namen der Reihe nach und verbindet Playtube spaeter', async () => { + const missing = uniqueName(); + const present = uniqueName(); + const client = new PlaytubeClient({ pipeNames: [missing, present], backoffMs: [20] }); + client.start(); + await new Promise((resolve) => setTimeout(resolve, 60)); + assert.equal(client.connected, false); + const fake = await startServer(present, () => ({ ok: true })); + try { + await until(() => client.connected); + assert.equal(client.pipeName, present); + } finally { + client.stop(); + await fake.close(); + } +}); diff --git a/tools/brand.mjs b/tools/brand.mjs new file mode 100644 index 0000000..7138e1d --- /dev/null +++ b/tools/brand.mjs @@ -0,0 +1,15 @@ +// Playtube-Marke (siehe Playtube tools/generate_icon.py): Verlauf violett -> pink, weisses Symbol. +export const BRAND_FROM = [124, 58, 237]; +export const BRAND_TO = [236, 72, 153]; +export const WHITE = '#ffffff'; +export const DIM_BG = '#2b2540'; +export const DIM_GLYPH = '#9b93b8'; +export const DARK_BG = '#171b24'; + +/** Diagonaler Verlauf ueber eine Leinwand der Kantenlaenge `size` (Farbfunktion fuer Canvas.fill). */ +export function brandGradient(size) { + return (x, y) => { + const t = Math.max(0, Math.min(1, (x + y) / (2 * size))); + return BRAND_FROM.map((from, i) => Math.round(from + (BRAND_TO[i] - from) * t)); + }; +} diff --git a/tools/generate-assets.mjs b/tools/generate-assets.mjs new file mode 100644 index 0000000..f27dfc8 --- /dev/null +++ b/tools/generate-assets.mjs @@ -0,0 +1,151 @@ +// Erzeugt manifest.json, Uebersetzungen (en/de) und alle PNG-Bilder des Plugins. +// Aufruf: npm run assets +import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { Canvas } from './raster.mjs'; +import { drawGlyph } from './glyphs.mjs'; +import { DIM_BG, DIM_GLYPH, WHITE, brandGradient } from './brand.mjs'; + +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const PLUGIN_DIR = path.join(ROOT, 'com.fojadrachi.playtube.sdPlugin'); +const PREFIX = 'com.fojadrachi.playtube.'; +const VERSION = JSON.parse(readFileSync(path.join(ROOT, 'package.json'), 'utf8')).version; + +const KEY_SIZE = 144; +const ICON_SIZE = 80; +const PLUGIN_ICON_SIZE = 256; + +/** + * states: Reihenfolge = State-Index im Plugin (siehe actions.js). + * on = Symbol weiss auf Akzentflaeche (aktiv), dim = gedaempfte Farbe (aus). + * titled: Taste zeigt Text (Lautstaerke, Name ...) -> Symbol rutscht nach oben. + */ +const ACTIONS = [ + { id: 'playpause', accent: 'playback', titled: true, states: [{ glyph: 'play' }, { glyph: 'pause' }], + en: ['Play/Pause', 'Toggle playback'], de: ['Wiedergabe/Pause', 'Wiedergabe starten oder pausieren'] }, + { id: 'previous', accent: 'playback', states: [{ glyph: 'previous' }], + en: ['Previous track', 'Go to the previous track'], de: ['Vorheriger Titel', 'Zum vorherigen Titel springen'] }, + { id: 'next', accent: 'playback', states: [{ glyph: 'next' }], + en: ['Next track', 'Skip to the next track'], de: ['Nächster Titel', 'Zum nächsten Titel springen'] }, + { id: 'seekback', accent: 'playback', titled: true, states: [{ glyph: 'rewind' }], + en: ['Rewind', 'Jump back a few seconds'], de: ['Zurückspulen', 'Ein paar Sekunden zurückspringen'] }, + { id: 'seekforward', accent: 'playback', titled: true, states: [{ glyph: 'forward' }], + en: ['Fast forward', 'Jump forward a few seconds'], de: ['Vorspulen', 'Ein paar Sekunden vorspringen'] }, + { id: 'volumeup', accent: 'volume', titled: true, states: [{ glyph: 'volup' }], + en: ['Volume up', 'Louder (hold to keep going)'], de: ['Lauter', 'Lauter (gedrückt halten für Dauer-Anpassung)'] }, + { id: 'volumedown', accent: 'volume', titled: true, states: [{ glyph: 'voldown' }], + en: ['Volume down', 'Quieter (hold to keep going)'], de: ['Leiser', 'Leiser (gedrückt halten für Dauer-Anpassung)'] }, + { id: 'volumeset', accent: 'volume', titled: true, states: [{ glyph: 'vol' }], + en: ['Set volume', 'Jump to a fixed volume'], de: ['Lautstärke setzen', 'Auf eine feste Lautstärke springen'] }, + { id: 'mute', accent: 'volume', titled: true, states: [{ glyph: 'vol' }, { glyph: 'mute', on: true }], + en: ['Mute', 'Mute or unmute'], de: ['Stummschalten', 'Ton aus- oder einschalten'] }, + { id: 'nowplaying', accent: 'playback', titled: true, states: [{ glyph: 'note' }], en: ['Now playing', 'Cover and title, press to play/pause'], + de: ['Aktueller Titel', 'Cover und Titel, Drücken = Wiedergabe/Pause'] }, + { id: 'like', accent: 'like', states: [{ glyph: 'heart' }, { glyph: 'heartfill', on: true }], + en: ['Like', 'Like the current track'], de: ['Gefällt mir', 'Aktuellen Titel mit „Gefällt mir“ markieren'] }, + { id: 'shuffle', accent: 'misc', states: [{ glyph: 'shuffle' }], + en: ['Shuffle', 'Toggle shuffle'], de: ['Zufallswiedergabe', 'Zufallswiedergabe umschalten'] }, + { id: 'repeat', accent: 'misc', + states: [{ glyph: 'repeat', dim: true }, { glyph: 'repeat', on: true }, { glyph: 'repeatone', on: true }], + en: ['Repeat', 'Cycle repeat mode'], de: ['Wiederholen', 'Wiederholungsmodus wechseln'] }, + { id: 'playlist', accent: 'playlist', titled: true, states: [{ glyph: 'playlist' }], + en: ['Play playlist', 'Start a playlist from YouTube Music'], + de: ['Playlist abspielen', 'Eine Playlist aus YouTube Music starten'] }, + { id: 'switchtab', accent: 'misc', titled: true, states: [{ glyph: 'tabs' }], + en: ['Switch tab', 'Switch between YouTube and YouTube Music'], + de: ['Tab wechseln', 'Zwischen YouTube und YouTube Musik wechseln'] }, + { id: 'show', accent: 'misc', states: [{ glyph: 'window' }], + en: ['Show Playtube', 'Bring the Playtube window to the front'], + de: ['Playtube anzeigen', 'Das Playtube-Fenster in den Vordergrund holen'] }, +]; + +function keyImage(action, state) { + const canvas = new Canvas(KEY_SIZE); + const background = state.dim ? DIM_BG : brandGradient(KEY_SIZE); + canvas.roundRect(0, 0, KEY_SIZE, KEY_SIZE, 0, background); + // Symbol immer exakt mittig; bei Tasten mit Text etwas kleiner, damit der Text darunter Platz hat. + const r = action.titled ? 34 : 44; + drawGlyph(canvas, state.glyph, KEY_SIZE / 2, KEY_SIZE / 2, r, state.dim ? DIM_GLYPH : WHITE, background); + return canvas.png(); +} + +function iconImage(action) { + const canvas = new Canvas(ICON_SIZE); + const background = brandGradient(ICON_SIZE); + canvas.roundRect(0, 0, ICON_SIZE, ICON_SIZE, 18, background); + drawGlyph(canvas, action.states[0].glyph, ICON_SIZE / 2, ICON_SIZE / 2, 26, WHITE, background); + return canvas.png(); +} + +function pluginIcon() { + const canvas = new Canvas(PLUGIN_ICON_SIZE); + const background = brandGradient(PLUGIN_ICON_SIZE); + canvas.roundRect(0, 0, PLUGIN_ICON_SIZE, PLUGIN_ICON_SIZE, 56, background); + drawGlyph(canvas, 'play', PLUGIN_ICON_SIZE / 2, PLUGIN_ICON_SIZE / 2, 84, WHITE, background); + return canvas.png(); +} + +function write(relative, content) { + const target = path.join(PLUGIN_DIR, relative); + mkdirSync(path.dirname(target), { recursive: true }); + writeFileSync(target, content); +} + +function manifest() { + return { + Actions: ACTIONS.map((action) => ({ + Icon: `static/icon/${action.id}@2x.png`, + Name: action.en[0], + DisableAutomaticStates: true, + States: action.states.map((_, index) => ({ + Image: `static/btn/${action.id}_${index}.png`, + TitleAlignment: 'bottom', + FontSize: '11', + FontStyle: 'Bold', + TitleColor: '#ffffff', + })), + Settings: {}, + Controllers: ['Keypad', 'Information'], + UserTitleEnabled: false, + SupportedInMultiActions: true, + Tooltip: action.en[1], + UUID: `${PREFIX}${action.id}`, + PropertyInspectorPath: 'propertyInspector/index.html', + })), + SDKVersion: 1, + Author: 'Playtube', + Name: 'Playtube', + Icon: 'static/icon/icon@2x.png', + CodePathWin: 'plugin/index.js', + Description: 'Control Playtube (YouTube / YouTube Music) from your Stream Dock', + Category: 'Playtube', + CategoryIcon: 'static/icon/icon@2x.png', + Version: VERSION, + OS: [{ Platform: 'windows', MinimumVersion: '10' }], + Software: { MinimumVersion: '3.10.188.226' }, + Nodejs: { Version: '20' }, + }; +} + +function locale(language, description) { + const entries = Object.fromEntries(ACTIONS.map((action) => { + const [name, tooltip] = action[language]; + return [`${PREFIX}${action.id}`, { Name: name, Tooltip: tooltip }]; + })); + return { Name: 'Playtube', Description: description, Category: 'Playtube', ...entries }; +} + +function main() { + write('manifest.json', `${JSON.stringify(manifest(), null, 2)}\n`); + write('en.json', `${JSON.stringify(locale('en', 'Control Playtube (YouTube / YouTube Music)'), null, 2)}\n`); + write('de.json', `${JSON.stringify(locale('de', 'Playtube (YouTube / YouTube Musik) steuern'), null, 2)}\n`); + write('static/icon/icon@2x.png', pluginIcon()); + for (const action of ACTIONS) { + write(`static/icon/${action.id}@2x.png`, iconImage(action)); + action.states.forEach((state, index) => write(`static/btn/${action.id}_${index}.png`, keyImage(action, state))); + } + process.stdout.write(`Assets fuer ${ACTIONS.length} Aktionen nach ${PLUGIN_DIR} geschrieben\n`); +} + +main(); diff --git a/tools/generate-iconpack.mjs b/tools/generate-iconpack.mjs new file mode 100644 index 0000000..95f039d --- /dev/null +++ b/tools/generate-iconpack.mjs @@ -0,0 +1,119 @@ +// Erzeugt das Playtube-Icon-Pack (PNG, 288x288) in zwei Varianten und packt es als Zip. +// Aufruf: npm run iconpack +import { execFileSync } from 'node:child_process'; +import { copyFileSync, mkdirSync, rmSync, writeFileSync } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { Canvas } from './raster.mjs'; +import { drawGlyph, GLYPHS } from './glyphs.mjs'; +import { drawExtra, EXTRA_GLYPHS } from './glyphs-extra.mjs'; +import { drawApp, APP_GLYPHS } from './glyphs-apps.mjs'; +import { DARK_BG, WHITE, brandGradient } from './brand.mjs'; + +const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const PACK_NAME = 'Playtube-Icons'; +const PACK_DIR = path.join(ROOT, 'iconpack', PACK_NAME); +const ZIP = path.join(ROOT, 'dist', `${PACK_NAME}.zip`); +const SIZE = 288; +const GLYPH_RADIUS = SIZE * 0.31; + +const README = `Playtube Icon Pack +================== + +Ordner: + gradient/ Playtube-Look: Verlauf violett -> pink, weisses Symbol + dark/ dunkler Hintergrund, Symbol im Playtube-Verlauf + +Alle Bilder: PNG, 288 x 288 Pixel (das Geraet nutzt 144 x 144, die doppelte Groesse bleibt beim +Verkleinern scharf). + +Benutzen in der Stream-Dock-Software: + Taste anklicken -> das Vorschaubild der Taste (oben links im Einstellungsbereich) anklicken -> + "Bild waehlen" / Ordner-Symbol -> eine PNG-Datei aus diesem Pack auswaehlen. +`; + +function render(variant, drawer, name) { + const canvas = new Canvas(SIZE); + const gradient = brandGradient(SIZE); + const background = variant === 'gradient' ? gradient : DARK_BG; + canvas.roundRect(0, 0, SIZE, SIZE, 0, background); + drawer(canvas, name, SIZE / 2, SIZE / 2, GLYPH_RADIUS, variant === 'gradient' ? WHITE : gradient, background); + return canvas.png(); +} + +const SD_PACK_DIR = path.join(ROOT, 'iconpack', 'com.fojadrachi.playtube.sdIconPack'); +// Deutsche Suchbegriffe zusaetzlich zu den englischen Symbolnamen. +const GERMAN_TAGS = { + folder: ['ordner'], file: ['datei'], home: ['start', 'zuhause'], gear: ['einstellungen', 'zahnrad'], + plus: ['hinzufuegen'], minus: ['entfernen'], close: ['schliessen'], check: ['haken', 'ok'], star: ['stern', 'favorit'], + search: ['suche', 'lupe'], power: ['ein', 'aus'], mic: ['mikrofon'], headphones: ['kopfhoerer'], lock: ['schloss'], + bell: ['glocke', 'benachrichtigung'], clock: ['uhr', 'zeit'], calendar: ['kalender'], mail: ['post', 'email'], + globe: ['welt', 'internet'], download: ['herunterladen'], upload: ['hochladen'], trash: ['papierkorb', 'loeschen'], + eye: ['auge', 'anzeigen'], stop: ['stopp'], refresh: ['aktualisieren', 'neu laden'], wifi: ['wlan'], grid: ['raster'], + menu: ['menue'], more: ['mehr'], info: ['information'], warning: ['warnung'], monitor: ['bildschirm'], + sun: ['sonne', 'hell'], moon: ['mond', 'dunkel'], play: ['abspielen'], pause: ['pause'], next: ['weiter', 'naechster'], + previous: ['zurueck', 'vorheriger'], volup: ['lauter'], voldown: ['leiser'], vol: ['lautstaerke'], mute: ['stumm'], + heart: ['herz', 'gefaellt mir'], shuffle: ['zufall'], repeat: ['wiederholen'], playlist: ['liste'], + 'eye-off': ['auge', 'ausblenden', 'verstecken'], lightbulb: ['gluehbirne', 'licht', 'lampe'], + 'pc-monitor': ['pc', 'computer', 'system', 'monitor', 'leistung'], chrome: ['browser', 'google'], + discord: ['chat', 'voice'], steam: ['spiele', 'games'], twitch: ['stream', 'live'], netflix: ['serien', 'filme'], + youtube: ['video'], medal: ['clips', 'aufnahme'], nvidia: ['grafikkarte', 'gpu'], steelseries: ['sonar', 'audio'], + aniworld: ['anime'], prismlens: ['filter', 'kamera'], +}; + +/** Stream-Dock-Icon-Pack (.sdIconPack): manifest.json, icons.json, icon.png und icons/*.png. */ +function buildStreamDockPack(jobs) { + rmSync(SD_PACK_DIR, { recursive: true, force: true }); + mkdirSync(path.join(SD_PACK_DIR, 'icons'), { recursive: true }); + mkdirSync(path.join(SD_PACK_DIR, 'previews'), { recursive: true }); + const entries = []; + for (const variant of ['gradient', 'dark']) { + for (const { name } of jobs) { + const file = `${variant}_${name}.png`; + copyFileSync(path.join(PACK_DIR, variant, `${name}.png`), path.join(SD_PACK_DIR, 'icons', file)); + const base = name.split('-')[0]; + entries.push({ + path: file, + name: `${name.replace(/-/g, ' ')} (${variant})`, + tags: ['playtube', variant, ...name.split('-'), ...(GERMAN_TAGS[name] || GERMAN_TAGS[base] || [])], + }); + } + } + writeFileSync(path.join(SD_PACK_DIR, 'icons.json'), `${JSON.stringify(entries, null, 2)}\n`); + writeFileSync(path.join(SD_PACK_DIR, 'manifest.json'), `${JSON.stringify({ + Name: 'Playtube Icons', + Version: '1.0.0', + Description: 'Icons im Playtube-Look (Verlauf violett/pink): Ordner, Pfeile, Player-Symbole und mehr.', + Author: 'Playtube', + Icon: 'icon.png', + }, null, 2)}\n`); + const logo = render('gradient', drawGlyph, 'play'); + writeFileSync(path.join(SD_PACK_DIR, 'icon.png'), logo); + writeFileSync(path.join(SD_PACK_DIR, 'previews', 'preview1.png'), logo); +} + +function main() { + rmSync(PACK_DIR, { recursive: true, force: true }); + const jobs = [ + ...GLYPHS.map((name) => ({ name, drawer: drawGlyph })), + ...EXTRA_GLYPHS.map((name) => ({ name, drawer: drawExtra })), + ...APP_GLYPHS.map((name) => ({ name, drawer: drawApp })), + ]; + for (const variant of ['gradient', 'dark']) { + mkdirSync(path.join(PACK_DIR, variant), { recursive: true }); + for (const { name, drawer } of jobs) { + writeFileSync(path.join(PACK_DIR, variant, `${name}.png`), render(variant, drawer, name)); + } + } + writeFileSync(path.join(PACK_DIR, 'LIESMICH.txt'), README); + buildStreamDockPack(jobs); + + mkdirSync(path.dirname(ZIP), { recursive: true }); + rmSync(ZIP, { force: true }); + // Unter Windows das mitgelieferte bsdtar (Git-Bash-GNU-tar liest "C:" als Netzwerk-Host). + const tar = process.platform === 'win32' ? path.join(process.env.SystemRoot || 'C:\\Windows', 'System32', 'tar.exe') : 'tar'; + execFileSync(tar, ['-a', '-c', '-f', ZIP, '-C', path.dirname(PACK_DIR), PACK_NAME], { stdio: 'inherit' }); + process.stdout.write(`${jobs.length} Symbole x 2 Varianten -> ${PACK_DIR}\nZip: ${ZIP}\n`); +} + +main(); diff --git a/tools/glyphs-apps.mjs b/tools/glyphs-apps.mjs new file mode 100644 index 0000000..35c1e6d --- /dev/null +++ b/tools/glyphs-apps.mjs @@ -0,0 +1,129 @@ +// Vereinfachte App-/Geraete-Symbole (eigene Zeichnungen, keine Original-Logos) in Einheitskoordinaten [-1, 1]. + +const TAU = Math.PI * 2; + +export const APP_GLYPHS = [ + 'eye-off', 'lightbulb', 'pc-monitor', + 'chrome', 'discord', 'steam', 'twitch', 'netflix', 'youtube', 'medal', 'nvidia', 'steelseries', 'aniworld', + 'prismlens', +]; + +/** + * @param {import('./raster.mjs').Canvas} canvas + * @param {string} name - Eintrag aus APP_GLYPHS + * @param {number} cx + * @param {number} cy + * @param {number} r - halbe Symbolgroesse in Pixeln + * @param {string|Function} color + * @param {string|Function} background - Farbe fuer "ausgeschnittene" Teile + */ +export function drawApp(canvas, name, cx, cy, r, color, background) { + const p = (x, y) => [cx + x * r, cy + y * r]; + const stroke = (x1, y1, x2, y2, w = 0.2, paint = color) => { + canvas.line(...p(x1, y1), ...p(x2, y2), w * r, paint); + }; + const path = (points, w = 0.2, paint = color) => { + points.slice(1).forEach((pt, i) => stroke(...points[i], ...pt, w, paint)); + }; + const poly = (points, paint = color) => canvas.polygon(points.map(([x, y]) => p(x, y)), paint); + const disc = (x, y, radius, paint = color) => canvas.circle(...p(x, y), radius * r, paint); + const ring = (x, y, outer, inner, from = 0, to = TAU) => canvas.ring(...p(x, y), outer * r, inner * r, color, from, to); + const box = (x, y, w, h, radius, paint = color) => canvas.roundRect(...p(x, y), w * r, h * r, radius * r, paint); + // Ellipse; thickness = Randstaerke relativ zum Radius, null = gefuellt. + const ellipse = (x, y, rx, ry, thickness, paint = color) => { + const [ex, ey] = p(x, y); + canvas.fill((px, py) => { + const d = Math.hypot((px - ex) / (rx * r), (py - ey) / (ry * r)); + return d <= 1 && (thickness === null || d >= 1 - thickness); + }, paint, [ex - rx * r, ey - ry * r, ex + rx * r, ey + ry * r]); + }; + + switch (name) { + case 'eye-off': + ellipse(0, 0, 0.98, 0.58, 0.22); + disc(0, 0, 0.3); + stroke(-0.75, 0.8, 0.75, -0.8, 0.42, background); + stroke(-0.75, 0.8, 0.75, -0.8, 0.2); + break; + case 'lightbulb': + disc(0, -0.25, 0.62); + poly([[-0.4, 0.1], [0.4, 0.1], [0.28, 0.45], [-0.28, 0.45]]); + box(-0.3, 0.5, 0.6, 0.16, 0.06); + box(-0.2, 0.72, 0.4, 0.14, 0.06); + path([[-0.2, 0.05], [0, -0.3], [0.2, 0.05]], 0.1, background); + break; + case 'pc-monitor': + box(-0.95, -0.8, 1.9, 1.35, 0.12); + box(-0.8, -0.65, 1.6, 1.05, 0.05, background); + path([[-0.6, -0.1], [-0.28, -0.1], [-0.12, -0.45], [0.08, 0.2], [0.24, -0.2], [0.6, -0.2]], 0.13); + stroke(0, 0.55, 0, 0.82, 0.2); + stroke(-0.5, 0.88, 0.5, 0.88, 0.2); + break; + case 'chrome': + ring(0, 0, 0.95, 0.72); + disc(0, 0, 0.36); + for (let i = 0; i < 3; i += 1) { + const a = (-90 + i * 120) * (Math.PI / 180); + stroke(Math.cos(a) * 0.3, Math.sin(a) * 0.3, Math.cos(a) * 0.85, Math.sin(a) * 0.85, 0.2); + } + disc(0, 0, 0.2, background); + break; + case 'discord': + ellipse(0, -0.05, 0.95, 0.7, null); + poly([[-0.5, 0.45], [-0.75, 0.9], [-0.15, 0.62]]); + poly([[0.5, 0.45], [0.75, 0.9], [0.15, 0.62]]); + disc(-0.36, -0.05, 0.19, background); + disc(0.36, -0.05, 0.19, background); + break; + case 'steam': + ring(0, 0, 0.95, 0.72); + disc(0.32, -0.28, 0.32); + disc(0.32, -0.28, 0.14, background); + disc(-0.36, 0.3, 0.2); + stroke(-0.36, 0.3, 0.2, -0.05, 0.16); + break; + case 'twitch': + poly([[-0.85, -0.85], [0.9, -0.85], [0.9, 0.4], [0.4, 0.4], [0.05, 0.8], [0.05, 0.4], [-0.85, 0.4]]); + stroke(0.02, -0.5, 0.02, 0, 0.16, background); + stroke(0.5, -0.5, 0.5, 0, 0.16, background); + break; + case 'netflix': + box(-0.55, -0.85, 0.28, 1.7, 0.02); + box(0.27, -0.85, 0.28, 1.7, 0.02); + poly([[-0.55, -0.85], [-0.27, -0.85], [0.55, 0.85], [0.27, 0.85]]); + break; + case 'youtube': + box(-0.95, -0.62, 1.9, 1.24, 0.34); + poly([[-0.2, -0.32], [0.34, 0], [-0.2, 0.32]], background); + break; + case 'medal': + poly([[0, -0.95], [0.85, -0.6], [0.85, 0.15], [0, 0.95], [-0.85, 0.15], [-0.85, -0.6]]); + path([[-0.45, 0.32], [-0.45, -0.32], [0, 0.1], [0.45, -0.32], [0.45, 0.32]], 0.16, background); + break; + case 'nvidia': + box(-0.95, -0.55, 1.9, 1.1, 0.12); + disc(0, 0, 0.42, background); + disc(0, 0, 0.17); + for (let i = 0; i < 4; i += 1) { + const a = i * (Math.PI / 2) + 0.4; + stroke(Math.cos(a) * 0.14, Math.sin(a) * 0.14, Math.cos(a) * 0.36, Math.sin(a) * 0.36, 0.12); + } + break; + case 'steelseries': + ring(0, -0.42, 0.56, 0.34, Math.PI / 2, TAU); + ring(0, 0.42, 0.56, 0.34, (3 * Math.PI) / 2, TAU); + ring(0, 0.42, 0.56, 0.34, 0, Math.PI); + break; + case 'aniworld': + ring(0, 0, 0.95, 0.72); + poly([[-0.22, -0.42], [0.5, 0], [-0.22, 0.42]]); + break; + case 'prismlens': + ring(0, 0, 0.95, 0.75); + ring(0, 0, 0.58, 0.4); + disc(0, 0, 0.2); + break; + default: + throw new Error(`Unbekanntes Symbol: ${name}`); + } +} diff --git a/tools/glyphs-extra.mjs b/tools/glyphs-extra.mjs new file mode 100644 index 0000000..fa2e4f2 --- /dev/null +++ b/tools/glyphs-extra.mjs @@ -0,0 +1,248 @@ +// Allgemeine Symbole (Ordner, Pfeile, Einstellungen ...) fuer das Icon-Pack, in Einheitskoordinaten [-1, 1]. + +const TAU = Math.PI * 2; + +export const EXTRA_GLYPHS = [ + 'folder', 'file', 'home', 'gear', 'plus', 'minus', 'close', 'check', 'star', 'search', 'power', 'mic', + 'headphones', 'lock', 'bell', 'clock', 'calendar', 'mail', 'globe', 'download', 'upload', 'trash', 'eye', + 'stop', 'refresh', 'wifi', 'grid', 'menu', 'more', 'info', 'warning', 'monitor', 'sun', 'moon', + 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right', 'chevron-up', 'chevron-down', 'chevron-left', + 'chevron-right', +]; + +const ARROW_ANGLES = { 'arrow-right': 0, 'arrow-down': 90, 'arrow-left': 180, 'arrow-up': 270 }; +const CHEVRON_ANGLES = { 'chevron-right': 0, 'chevron-down': 90, 'chevron-left': 180, 'chevron-up': 270 }; + +function starPoints() { + const points = []; + for (let i = 0; i < 10; i += 1) { + const angle = -Math.PI / 2 + (i * Math.PI) / 5; + const radius = i % 2 === 0 ? 0.98 : 0.42; + points.push([Math.cos(angle) * radius, Math.sin(angle) * radius + 0.05]); + } + return points; +} +const STAR = starPoints(); + +/** + * @param {import('./raster.mjs').Canvas} canvas + * @param {string} name - Eintrag aus EXTRA_GLYPHS + * @param {number} cx + * @param {number} cy + * @param {number} r - halbe Symbolgroesse in Pixeln + * @param {string|Function} color + * @param {string|Function} background - Farbe fuer "ausgeschnittene" Teile + */ +export function drawExtra(canvas, name, cx, cy, r, color, background) { + const p = (x, y) => [cx + x * r, cy + y * r]; + const rot = (x, y, degrees) => { + const a = (degrees * Math.PI) / 180; + return [x * Math.cos(a) - y * Math.sin(a), x * Math.sin(a) + y * Math.cos(a)]; + }; + const stroke = (x1, y1, x2, y2, w = 0.2, paint = color, degrees = 0) => { + const [ax, ay] = p(...rot(x1, y1, degrees)); + const [bx, by] = p(...rot(x2, y2, degrees)); + canvas.line(ax, ay, bx, by, w * r, paint); + }; + const path = (points, w = 0.2, degrees = 0) => { + points.slice(1).forEach((pt, i) => stroke(...points[i], ...pt, w, color, degrees)); + }; + const poly = (points, paint = color) => canvas.polygon(points.map(([x, y]) => p(x, y)), paint); + const disc = (x, y, radius, paint = color) => canvas.circle(...p(x, y), radius * r, paint); + const ring = (x, y, outer, inner, from = 0, to = TAU) => canvas.ring(...p(x, y), outer * r, inner * r, color, from, to); + const box = (x, y, w, h, radius, paint = color) => canvas.roundRect(...p(x, y), w * r, h * r, radius * r, paint); + // Ellipse; thickness = Randstaerke relativ zum Radius, null = gefuellt. + const ellipse = (rx, ry, thickness) => { + const [ex, ey] = p(0, 0); + canvas.fill((px, py) => { + const d = Math.hypot((px - ex) / (rx * r), (py - ey) / (ry * r)); + return d <= 1 && (thickness === null || d >= 1 - thickness); + }, color, [ex - rx * r, ey - ry * r, ex + rx * r, ey + ry * r]); + }; + + if (name in ARROW_ANGLES) { + const a = ARROW_ANGLES[name]; + stroke(-0.8, 0, 0.8, 0, 0.2, color, a); + stroke(0.8, 0, 0.2, -0.6, 0.2, color, a); + stroke(0.8, 0, 0.2, 0.6, 0.2, color, a); + return; + } + if (name in CHEVRON_ANGLES) { + path([[-0.3, -0.75], [0.35, 0], [-0.3, 0.75]], 0.24, CHEVRON_ANGLES[name]); + return; + } + + switch (name) { + case 'folder': + poly([[-0.92, -0.5], [-0.92, -0.78], [-0.15, -0.78], [0.1, -0.5]]); + box(-0.92, -0.5, 1.84, 1.3, 0.12); + break; + case 'file': + poly([[-0.62, -0.92], [0.18, -0.92], [0.68, -0.42], [0.68, 0.92], [-0.62, 0.92]]); + poly([[0.18, -0.92], [0.18, -0.42], [0.68, -0.42]], background); + stroke(-0.3, 0.05, 0.36, 0.05, 0.14, background); + stroke(-0.3, 0.45, 0.36, 0.45, 0.14, background); + break; + case 'home': + poly([[-1, 0], [0, -0.9], [1, 0]]); + box(-0.62, -0.05, 1.24, 0.9, 0.06); + box(-0.16, 0.25, 0.32, 0.6, 0.04, background); + break; + case 'gear': + ring(0, 0, 0.66, 0.3); + for (let i = 0; i < 8; i += 1) { + const a = (i * 45 * Math.PI) / 180; + stroke(Math.cos(a) * 0.6, Math.sin(a) * 0.6, Math.cos(a) * 0.9, Math.sin(a) * 0.9, 0.3); + } + break; + case 'plus': + stroke(-0.8, 0, 0.8, 0, 0.24); + stroke(0, -0.8, 0, 0.8, 0.24); + break; + case 'minus': + stroke(-0.8, 0, 0.8, 0, 0.24); + break; + case 'close': + stroke(-0.7, -0.7, 0.7, 0.7, 0.24); + stroke(-0.7, 0.7, 0.7, -0.7, 0.24); + break; + case 'check': + path([[-0.8, 0.05], [-0.25, 0.6], [0.85, -0.55]], 0.26); + break; + case 'star': + poly(STAR); + break; + case 'search': + ring(-0.2, -0.2, 0.68, 0.44); + stroke(0.3, 0.3, 0.82, 0.82, 0.28); + break; + case 'power': + ring(0, 0.08, 0.8, 0.58, (3 * Math.PI) / 2 + 0.65, TAU); + ring(0, 0.08, 0.8, 0.58, 0, (3 * Math.PI) / 2 - 0.65); + stroke(0, -0.9, 0, -0.1, 0.24); + break; + case 'mic': + box(-0.28, -0.9, 0.56, 1.1, 0.28); + ring(0, -0.05, 0.6, 0.42, 0, Math.PI); + stroke(0, 0.55, 0, 0.9, 0.16); + stroke(-0.35, 0.9, 0.35, 0.9, 0.16); + break; + case 'headphones': + ring(0, 0.05, 0.85, 0.62, Math.PI, TAU); + box(-0.95, 0.05, 0.4, 0.7, 0.12); + box(0.55, 0.05, 0.4, 0.7, 0.12); + break; + case 'lock': + ring(0, -0.15, 0.45, 0.25, Math.PI, TAU); + stroke(-0.35, -0.15, -0.35, 0.05, 0.2); + stroke(0.35, -0.15, 0.35, 0.05, 0.2); + box(-0.65, 0, 1.3, 0.9, 0.12); + disc(0, 0.4, 0.13, background); + break; + case 'bell': + disc(0, -0.15, 0.55); + poly([[-0.55, -0.15], [0.55, -0.15], [0.82, 0.5], [-0.82, 0.5]]); + disc(0, 0.72, 0.16); + stroke(0, -0.85, 0, -0.65, 0.16); + break; + case 'clock': + ring(0, 0, 0.92, 0.7); + stroke(0, 0, 0, -0.5, 0.15); + stroke(0, 0, 0.36, 0.22, 0.15); + break; + case 'calendar': + box(-0.88, -0.68, 1.76, 1.58, 0.12); + box(-0.72, -0.22, 1.44, 1.0, 0.05, background); + stroke(-0.4, -0.92, -0.4, -0.5, 0.18); + stroke(0.4, -0.92, 0.4, -0.5, 0.18); + break; + case 'mail': + box(-0.92, -0.62, 1.84, 1.24, 0.12); + stroke(-0.8, -0.5, 0, 0.12, 0.15, background); + stroke(0, 0.12, 0.8, -0.5, 0.15, background); + break; + case 'globe': + ring(0, 0, 0.92, 0.75); + ellipse(0.42, 0.92, 0.18); + stroke(-0.92, 0, 0.92, 0, 0.13); + break; + case 'download': + stroke(0, -0.9, 0, 0.3, 0.22); + path([[-0.5, -0.2], [0, 0.4], [0.5, -0.2]], 0.22); + path([[-0.85, 0.35], [-0.85, 0.85], [0.85, 0.85], [0.85, 0.35]], 0.2); + break; + case 'upload': + stroke(0, 0.3, 0, -0.9, 0.22); + path([[-0.5, -0.4], [0, -0.95], [0.5, -0.4]], 0.22); + path([[-0.85, 0.35], [-0.85, 0.85], [0.85, 0.85], [0.85, 0.35]], 0.2); + break; + case 'trash': + box(-0.6, -0.3, 1.2, 1.2, 0.1); + stroke(-0.85, -0.5, 0.85, -0.5, 0.2); + stroke(-0.25, -0.75, 0.25, -0.75, 0.16); + stroke(-0.2, -0.05, -0.2, 0.65, 0.13, background); + stroke(0.2, -0.05, 0.2, 0.65, 0.13, background); + break; + case 'eye': + ellipse(0.98, 0.58, 0.22); + disc(0, 0, 0.3); + break; + case 'stop': + box(-0.72, -0.72, 1.44, 1.44, 0.16); + break; + case 'refresh': { + const end = 5.5; + ring(0, 0, 0.85, 0.6, 0.7, end); + const bx = Math.cos(end) * 0.725; + const by = Math.sin(end) * 0.725; + poly([[bx - Math.sin(end) * 0.55, by + Math.cos(end) * 0.55], + [bx + Math.cos(end) * 0.5, by + Math.sin(end) * 0.5], + [bx - Math.cos(end) * 0.5, by - Math.sin(end) * 0.5]]); + break; + } + case 'wifi': + for (const radius of [0.45, 0.8, 1.15]) ring(0, 0.6, radius + 0.09, radius - 0.09, 1.25 * Math.PI, 1.75 * Math.PI); + disc(0, 0.6, 0.13); + break; + case 'grid': + for (const x of [-0.85, 0.08]) for (const y of [-0.85, 0.08]) box(x, y, 0.77, 0.77, 0.14); + break; + case 'menu': + stroke(-0.8, -0.5, 0.8, -0.5, 0.22); + stroke(-0.8, 0, 0.8, 0, 0.22); + stroke(-0.8, 0.5, 0.8, 0.5, 0.22); + break; + case 'more': + for (const x of [-0.6, 0, 0.6]) disc(x, 0, 0.17); + break; + case 'info': + ring(0, 0, 0.92, 0.72); + disc(0, -0.42, 0.11); + stroke(0, -0.12, 0, 0.5, 0.18); + break; + case 'warning': + poly([[0, -0.9], [0.98, 0.78], [-0.98, 0.78]]); + stroke(0, -0.3, 0, 0.25, 0.16, background); + disc(0, 0.52, 0.09, background); + break; + case 'monitor': + box(-0.92, -0.72, 1.84, 1.2, 0.12); + box(-0.78, -0.58, 1.56, 0.92, 0.05, background); + stroke(0, 0.5, 0, 0.8, 0.2); + stroke(-0.45, 0.85, 0.45, 0.85, 0.2); + break; + case 'sun': + disc(0, 0, 0.42); + for (let i = 0; i < 8; i += 1) { + const a = (i * 45 * Math.PI) / 180; + stroke(Math.cos(a) * 0.68, Math.sin(a) * 0.68, Math.cos(a) * 0.95, Math.sin(a) * 0.95, 0.17); + } + break; + case 'moon': + disc(0, 0, 0.8); + disc(0.38, -0.3, 0.68, background); + break; + default: + throw new Error(`Unbekanntes Symbol: ${name}`); + } +} diff --git a/tools/glyphs.mjs b/tools/glyphs.mjs new file mode 100644 index 0000000..ca5e45f --- /dev/null +++ b/tools/glyphs.mjs @@ -0,0 +1,141 @@ +// Symbole fuer die Tasten, gezeichnet in Einheitskoordinaten [-1, 1] um (cx, cy) mit Radius r. + +function heartPoints() { + const points = []; + for (let i = 0; i < 72; i += 1) { + const t = (i / 72) * Math.PI * 2; + points.push([ + (16 * Math.sin(t) ** 3) / 17, + -(13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t)) / 17, + ]); + } + return points; +} +const HEART = heartPoints(); + +export const GLYPHS = [ + 'play', 'pause', 'next', 'previous', 'rewind', 'forward', 'volup', 'voldown', 'vol', 'mute', + 'note', 'heart', 'heartfill', 'shuffle', 'repeat', 'repeatone', 'playlist', 'tabs', 'window', +]; + +/** + * @param {import('./raster.mjs').Canvas} canvas + * @param {string} name - Eintrag aus GLYPHS + * @param {number} cx + * @param {number} cy + * @param {number} r - halbe Symbolgroesse in Pixeln + * @param {string} color - Symbolfarbe + * @param {string} background - Farbe hinter dem Symbol (fuer "ausgeschnittene" Formen) + */ +export function drawGlyph(canvas, name, cx, cy, r, color, background) { + const p = (x, y) => [cx + x * r, cy + y * r]; + const poly = (points) => canvas.polygon(points.map(([x, y]) => p(x, y)), color); + const stroke = (x1, y1, x2, y2, w = 0.2) => { + const [ax, ay] = p(x1, y1); + const [bx, by] = p(x2, y2); + canvas.line(ax, ay, bx, by, w * r, color); + }; + const path = (points, w = 0.2) => points.slice(1).forEach((pt, i) => stroke(...points[i], ...pt, w)); + const speaker = (dx = 0) => poly([[-0.9 + dx, -0.3], [-0.5 + dx, -0.3], [-0.1 + dx, -0.7], + [-0.1 + dx, 0.7], [-0.5 + dx, 0.3], [-0.9 + dx, 0.3]]); + const arc = (dx, outer, inner) => { + const [ax, ay] = p(dx, 0); + canvas.ring(ax, ay, outer * r, inner * r, color, Math.PI * 2 - 0.75, Math.PI * 2); + canvas.ring(ax, ay, outer * r, inner * r, color, 0, 0.75); + }; + const heart = (scale, fill) => canvas.polygon( + HEART.map(([x, y]) => [cx + x * r * scale, cy + (y * scale + 0.05) * r]), fill); + + switch (name) { + case 'play': + poly([[-0.7, -0.85], [0.75, 0], [-0.7, 0.85]]); + break; + case 'pause': + poly([[-0.65, -0.8], [-0.2, -0.8], [-0.2, 0.8], [-0.65, 0.8]]); + poly([[0.2, -0.8], [0.65, -0.8], [0.65, 0.8], [0.2, 0.8]]); + break; + case 'next': + poly([[-0.8, -0.75], [0.4, 0], [-0.8, 0.75]]); + poly([[0.55, -0.75], [0.85, -0.75], [0.85, 0.75], [0.55, 0.75]]); + break; + case 'previous': + poly([[0.8, -0.75], [-0.4, 0], [0.8, 0.75]]); + poly([[-0.55, -0.75], [-0.85, -0.75], [-0.85, 0.75], [-0.55, 0.75]]); + break; + case 'rewind': + poly([[0.05, -0.65], [-0.55, 0], [0.05, 0.65]]); + poly([[0.85, -0.65], [0.25, 0], [0.85, 0.65]]); + break; + case 'forward': + poly([[-0.05, -0.65], [0.55, 0], [-0.05, 0.65]]); + poly([[-0.85, -0.65], [-0.25, 0], [-0.85, 0.65]]); + break; + case 'volup': + speaker(-0.1); + stroke(0.3, 0, 0.9, 0); + stroke(0.6, -0.3, 0.6, 0.3); + break; + case 'voldown': + speaker(-0.1); + stroke(0.3, 0, 0.9, 0); + break; + case 'vol': + speaker(-0.2); + arc(-0.3, 0.75, 0.55); + arc(-0.3, 1.1, 0.9); + break; + case 'mute': + speaker(-0.1); + stroke(0.3, -0.35, 0.9, 0.35); + stroke(0.3, 0.35, 0.9, -0.35); + break; + case 'note': { + const [nx, ny] = p(-0.35, 0.5); + canvas.circle(nx, ny, 0.38 * r, color); + stroke(0.0, 0.45, 0.0, -0.85, 0.2); + stroke(0.0, -0.85, 0.7, -0.5, 0.2); + break; + } + case 'heart': + heart(1, color); + heart(0.62, background); + break; + case 'heartfill': + heart(1, color); + break; + case 'shuffle': + path([[-0.9, 0.5], [-0.3, 0.5], [0.3, -0.5], [0.55, -0.5]], 0.18); + path([[-0.9, -0.5], [-0.3, -0.5], [0.3, 0.5], [0.55, 0.5]], 0.18); + poly([[0.5, -0.85], [0.95, -0.5], [0.5, -0.15]]); + poly([[0.5, 0.15], [0.95, 0.5], [0.5, 0.85]]); + break; + case 'repeat': + case 'repeatone': + path([[-0.8, 0.15], [-0.8, -0.4], [0.3, -0.4]], 0.18); + poly([[0.3, -0.8], [0.9, -0.4], [0.3, 0]]); + path([[0.8, -0.15], [0.8, 0.4], [-0.3, 0.4]], 0.18); + poly([[-0.3, 0.8], [-0.9, 0.4], [-0.3, 0]]); + if (name === 'repeatone') { + stroke(0.0, -0.18, 0.0, 0.2, 0.14); + stroke(-0.13, -0.1, 0.0, -0.18, 0.14); + } + break; + case 'playlist': + stroke(-0.85, -0.55, 0.15, -0.55, 0.18); + stroke(-0.85, -0.05, 0.15, -0.05, 0.18); + stroke(-0.85, 0.45, -0.25, 0.45, 0.18); + poly([[0.3, 0.05], [0.95, 0.45], [0.3, 0.85]]); + break; + case 'tabs': + canvas.roundRect(...p(-0.85, -0.7), 1.1 * r, 0.9 * r, 0.12 * r, color); + canvas.roundRect(...p(-0.75, -0.6), 0.9 * r, 0.7 * r, 0.06 * r, background); + canvas.roundRect(...p(-0.25, -0.15), 1.1 * r, 0.9 * r, 0.12 * r, color); + break; + case 'window': + canvas.roundRect(...p(-0.9, -0.7), 1.8 * r, 1.4 * r, 0.14 * r, color); + canvas.roundRect(...p(-0.75, -0.25), 1.5 * r, 0.85 * r, 0.05 * r, background); + break; + default: + throw new Error(`Unbekanntes Symbol: ${name}`); + } +} diff --git a/tools/raster.mjs b/tools/raster.mjs new file mode 100644 index 0000000..4d5d780 --- /dev/null +++ b/tools/raster.mjs @@ -0,0 +1,146 @@ +// Winziger Software-Rasterizer + PNG-Encoder (keine Abhaengigkeiten), fuer die Tasten-Icons. +import { deflateSync } from 'node:zlib'; + +const SUPERSAMPLE = 4; + +let crcTable = null; +function crc32(buffer) { + if (!crcTable) { + crcTable = new Uint32Array(256); + for (let n = 0; n < 256; n += 1) { + let c = n; + for (let k = 0; k < 8; k += 1) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1; + crcTable[n] = c >>> 0; + } + } + let crc = 0xffffffff; + for (const byte of buffer) crc = crcTable[(crc ^ byte) & 0xff] ^ (crc >>> 8); + return (crc ^ 0xffffffff) >>> 0; +} + +function chunk(type, data) { + const head = Buffer.alloc(8); + head.writeUInt32BE(data.length, 0); + head.write(type, 4, 'ascii'); + const tail = Buffer.alloc(4); + tail.writeUInt32BE(crc32(Buffer.concat([head.subarray(4), data])), 0); + return Buffer.concat([head, data, tail]); +} + +export function encodePng(width, height, rgba) { + const header = Buffer.alloc(13); + header.writeUInt32BE(width, 0); + header.writeUInt32BE(height, 4); + header[8] = 8; // Bit-Tiefe + header[9] = 6; // RGBA + const stride = width * 4 + 1; + const rows = Buffer.alloc(stride * height); + for (let y = 0; y < height; y += 1) { + Buffer.from(rgba.buffer, rgba.byteOffset + y * width * 4, width * 4).copy(rows, y * stride + 1); + } + return Buffer.concat([ + Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]), + chunk('IHDR', header), + chunk('IDAT', deflateSync(rows, { level: 9 })), + chunk('IEND', Buffer.alloc(0)), + ]); +} + +export function parseColor(hex) { + const value = hex.replace('#', ''); + return [0, 2, 4].map((i) => Number.parseInt(value.slice(i, i + 2), 16)); +} + +/** Leinwand mit Kantenglaettung; Formen werden per Punkt-in-Form-Test mit Supersampling gefuellt. */ +export class Canvas { + constructor(size) { + this.size = size; + this.data = new Uint8ClampedArray(size * size * 4); + } + + /** contains(x, y) -> boolean in Pixel-Koordinaten; bounds = [x0, y0, x1, y1] begrenzt die Suche. */ + fill(contains, color, bounds = [0, 0, this.size, this.size]) { + // color: "#rrggbb", [r, g, b] oder Funktion (x, y) => [r, g, b] (Farbverlaeufe) + const colorAt = typeof color === 'function' ? color + : ((fixed) => () => fixed)(typeof color === 'string' ? parseColor(color) : color); + const clamp = (v) => Math.max(0, Math.min(this.size, v)); + const x0 = clamp(Math.floor(bounds[0])); + const y0 = clamp(Math.floor(bounds[1])); + const x1 = clamp(Math.ceil(bounds[2])); + const y1 = clamp(Math.ceil(bounds[3])); + const total = SUPERSAMPLE * SUPERSAMPLE; + for (let y = y0; y < y1; y += 1) { + for (let x = x0; x < x1; x += 1) { + let hits = 0; + for (let sy = 0; sy < SUPERSAMPLE; sy += 1) { + for (let sx = 0; sx < SUPERSAMPLE; sx += 1) { + if (contains(x + (sx + 0.5) / SUPERSAMPLE, y + (sy + 0.5) / SUPERSAMPLE)) hits += 1; + } + } + if (hits) this.blend((y * this.size + x) * 4, colorAt(x + 0.5, y + 0.5), hits / total); + } + } + } + + blend(index, [r, g, b], alpha) { + const dstA = this.data[index + 3] / 255; + const outA = alpha + dstA * (1 - alpha); + [r, g, b].forEach((value, offset) => { + this.data[index + offset] = (value * alpha + this.data[index + offset] * dstA * (1 - alpha)) / outA; + }); + this.data[index + 3] = outA * 255; + } + + roundRect(x, y, w, h, radius, color) { + this.fill((px, py) => { + const cx = Math.max(x + radius, Math.min(x + w - radius, px)); + const cy = Math.max(y + radius, Math.min(y + h - radius, py)); + return px >= x && px <= x + w && py >= y && py <= y + h && (px - cx) ** 2 + (py - cy) ** 2 <= radius ** 2; + }, color, [x, y, x + w, y + h]); + } + + circle(cx, cy, radius, color) { + this.fill((px, py) => (px - cx) ** 2 + (py - cy) ** 2 <= radius ** 2, color, + [cx - radius, cy - radius, cx + radius, cy + radius]); + } + + /** Kreisring bzw. Bogen (Winkel in Radiant, 0 = rechts, im Uhrzeigersinn). */ + ring(cx, cy, outer, inner, color, from = 0, to = Math.PI * 2) { + this.fill((px, py) => { + const d = (px - cx) ** 2 + (py - cy) ** 2; + if (d > outer ** 2 || d < inner ** 2) return false; + let angle = Math.atan2(py - cy, px - cx); + if (angle < 0) angle += Math.PI * 2; + return angle >= from && angle <= to; + }, color, [cx - outer, cy - outer, cx + outer, cy + outer]); + } + + polygon(points, color) { + const xs = points.map((p) => p[0]); + const ys = points.map((p) => p[1]); + this.fill((px, py) => { + let inside = false; + for (let i = 0, j = points.length - 1; i < points.length; j = i, i += 1) { + const [xi, yi] = points[i]; + const [xj, yj] = points[j]; + if (yi > py !== yj > py && px < ((xj - xi) * (py - yi)) / (yj - yi) + xi) inside = !inside; + } + return inside; + }, color, [Math.min(...xs), Math.min(...ys), Math.max(...xs), Math.max(...ys)]); + } + + /** Strecke mit Breite `width` und runden Enden. */ + line(x1, y1, x2, y2, width, color) { + const half = width / 2; + const dx = x2 - x1; + const dy = y2 - y1; + this.fill((px, py) => { + const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / (dx * dx + dy * dy || 1))); + return (px - (x1 + t * dx)) ** 2 + (py - (y1 + t * dy)) ** 2 <= half * half; + }, color, [Math.min(x1, x2) - half, Math.min(y1, y2) - half, Math.max(x1, x2) + half, Math.max(y1, y2) + half]); + } + + png() { + return encodePng(this.size, this.size, this.data); + } +}

?}P`Q)m3!9C6Rk;&DU@sHk7wPxq|(GRm2K|Y4IUX~S|EFNknJ$XYr_WK~Nf30oofHaXmylyLB;-ET)wj>JE>O!a-WZV12N z7(5%hrO0F6_sw)eaNSr?eQvV9R>+N4lsA;C_)_(f%+ad%i*}u%$#=zP&W41ybaHt7 zsJ>SaL-tbIZ$+f_1m{lP;>%i5Meb|_(vx7-SnlPZ;g!$oFgX96SA!h|7ca2U+K=_HI!pJ&(a?bsV7 z%Et%J8bZCU6MM&-X544wSgbgtQ7$%N<_@%Sq@Q_UOIu*CK$n z2$ipq7^`-9@bdeP0aISkJCF_n%Bewr0`_hLC9uw4s>l*McAByG0{YYA&eAR9$|B9d?jnj&FAt=*qe6G@mT7KYqfG4#mu;N4yvrm#b~azsuM0x&%${jzz#4 z3s0`yRxgm`em>m!Pc+^b0s0sbC}gxt!~M(;ZE_6$Fw6v}l}D<`Cbubjvi()>0r-z% z_^&GDo$6Cm3_$Ud*K$1HKJfPj9{{Z zPx)iO6u<_sn=?ijr$Eog^C3{L^)Lu~8}7Xjf^uJBkS}T?2!Mfw!dt)fNx_?767 zR^igq$bft1O+`0Y7C#nuuqCZIO{g~N@B=V|^TB58_=RGyJd9WDZOywp5P zSfREesH`w1z%%|xW|W^eY)-_5_o@LXuG3C~eXB2KIcqBr7LBHKOeyeL)#XoH3=1cH zbl2ti+29c<^8pOJ0*tgWRoHWvlW$a+jYaldNpjDwV&0tTJ><4GkB)R#R$B&z5i388 z%iRj-3yMYK5=a#qV43CNVnPPY4Pk&9>wXcr1RTO#t8uU z?2gD{-%~8mNW?i)>yFd63TwZ_LYcbL9pw3QYgx1r~f-`>Jkk z@L=Hc@|~j5V46#~zC;UUrh3u)qzEJB_++-ym&K{cL5run80$C{ET7gj5u8rF43Y_4*rL7gWchj{VR@(tbsvp> z5veqLZj1wDAaY}FC6TZ6Yjisf*f5+ba=~5LTd*P5^Ca8M?J3vmf66S49-^yr5i-Hp zjk^TDtm+R_w9<^TAQm4Mbm5t&6Gd4gcas}Hs`Z|3#*+chQ5O~qqf|<+rDUveQx0$27bKkME ze|)%|8n|fzb^S>vhMh&u1mZjr%KGS=miV|du^Xw5{(H6nX!o|+ zLlio|;mHZjrz2HRQ=g3688mVgTfG@XJm4nTwV!q{0QZ6-Lko7c^gTL#v`KX}D6(2?a*?K?GgUzi;zNK4EE8CIyu| zQUgMVR;aq0P8pwHR9hOR;I=W#?3ceD2fkE>zXc+U-Nk7if|0gTyNt`N2r!J*GZCL2|6-<`h2ofd~#>Tg{NVIx?iy-;mB>pa7*9aT_Guf}2HkK2we zyXqOaTxjKlktF^Ws(S`uW;IXQ8?a0T5g>=~%~-&pAp9Z1Zu1d%{_osu^AC}vHKsR) z?9OfsKuaAP)v(q5cd{I*-yj)?7-Q%cC_rq=y88;b;Y-y2qt5^P!oOJd9ixbQ0oUD~ zywU*yKN*RTOlukR2!|I1-b8^Z3bQ2(50k=2K@)EOdsXaKH(*z?N&=db_p t%Qi>pL3u4oO7S^y3gx*WT>yn!6v{4gTXko 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 NT()LuuEWoV{s$S_rrH1i literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_headphones.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_headphones.png new file mode 100644 index 0000000000000000000000000000000000000000..5f67a77b7246c86ad79fe263707739a0001da7f3 GIT binary patch literal 6043 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 Ulhe6?bjR)9abSDq){`Os1z<=hBme*a literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_heart.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_heart.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0aa1f356b10a469af34a4029c9e1e7b606213b GIT binary patch literal 6756 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 literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_heartfill.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_heartfill.png new file mode 100644 index 0000000000000000000000000000000000000000..a15598bab9c6a3b710edfe41367e6f680d47ddbb GIT binary patch literal 5596 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 ROfa>@IXO7nKd?Ix{eR3!L3RKD literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_home.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_home.png new file mode 100644 index 0000000000000000000000000000000000000000..92a29945ab11a07ecad58cce2a156a2f8a52965e GIT binary patch literal 5010 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 I^QS%k2EWzNXaE2J literal 0 HcmV?d00001 diff --git a/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_info.png b/iconpack/com.fojadrachi.playtube.sdIconPack/icons/gradient_info.png new file mode 100644 index 0000000000000000000000000000000000000000..8e87b780eba4d3d6da39eb1a32ab24dce45e9328 GIT binary patch literal 7546 zcmb7pc{o(z+y4w9>r{4Pv{|xcFUuiRDj7v&i9%TtiYCh;``AYbDH%f6lw_xrWwK5g zDI~*Sl5NJ;i1MCM)3^7!-rx0m-#=W}appPCb3ga}xwp?9Yi@RomrINb27~b)H!(f~ zgTbX3e_PpMFql9@Sttx9arn6LVN3tP+2H|S0qZn&pP%RTi0B6&!lJq?#EIS!7r)$Z z^>*%>sk(sPvut{^{_q8#p{)tsk9Ta{Hu%nA-`=ywi+hz`><-&&pnh=7EYmK-CN+PD zNq&l!+Wb$i7U5Ahj;pLw$eTJ8A&IrthHOx2@lz_ftgC%JIBUIG`Lfz-iRrJ?m)lZr zU00nQ$5~%Gv3@dZy`(Eo-mzxEWU{j%V_QD@mv#!jD!DAv?~>`{h}9*_^`NYEOjnHj z##G0%lnvX|U9=H&NJjg{Tb{awRC&1!i-0pLo#VxKJ9$bw<};UcR!7cG@o%_N9-4+I zr}#`D%33b{x+mlKiuge5)}5(q6E9M{WL&K#athz})K6umPFD&nf7+6f!Flpk2G=6VMr301K1%&Vg*AHR2nOi`_JQPEFsZ86nX~-nvMwq zT3<>!VOtn$;J|*`H5d!9`SAz3$)7cN1bChK_6GfP7jv-(t(^IKnSKxkM>0;rdVpRp zZ#oM6`434SXWPmUg%z|US)_7rV;sssFMNY%V?MUv;mj4}J@7xL>r=0>{*j4`7TaKb z1^(y1INEXM4*-eG!u)cKf53^kq?mS_DGZW+j`=>DOrT_M+ z3v)vcT5T%(pOgB?{~YRjrE^%_;J2=G#gLqTu0#(*Niy}z3ses?MbHMHGZj|(uV8!s zYyp|8y85#XFHAE-9;S>t zkQ~en6R}(VTxq>Y=I>h!VfgQ2p??tb&yke5w4q0TKXv70q9h2Md-7LHq?ErhHp~2# zJRbYk>iB;o_x0{n{JSOr^@Jf9j)hvgaQbOYu&kWXEnYB`aFlk9aX~`mPu8(7uFbpA zmu*|*U0eP9Y$gZ#99xcZ{JfX(^|`6zM5(|3FC|!9qL4`=VNDM<8_rg%)@3Ld8dtw8S&ur%X?|@1_r1TFK^3K=)51s2adao!p2W1Ij+v2icLCoS_!@1agtLDwO?)37 zb((|vehY5Ru0#z6$5F>DmWOuTF16kEIN^5jq0>PJ;h