diff --git a/const.py b/const.py index 5015f70..9930e24 100644 --- a/const.py +++ b/const.py @@ -3,194 +3,194 @@ from datetime import datetime, timezone, timedelta OFFICIAL_API = "https://clients.plex.tv" FEATURES_DICT = [{"id": "guided-upgrade", "uuid": "c9d9b7ee-fdd9-474e-b143-5039c04e9b9b"}, - {"id": "increase-password-complexity", "uuid": "9e93f8a8-7ccd-4d15-99fa-76a158027660"}, - {"id": "upgrade-3ds2", "uuid": "547514ab-3284-46e5-af77-bbaff247e3fc"}, - {"id": "ad-countdown-timer", "uuid": "3ae06d3a-a76b-435e-8cef-2d2008610ba2"}, - {"id": "adaptive_bitrate", "uuid": "abd37b14-706c-461f-8255-fa9563882af3"}, - {"id": "amazon-loop-debug", "uuid": "d1477307-4dac-4e57-9258-252e5b908693"}, - {"id": "Android - Dolby Vision", "uuid": "b227c158-e062-4ff1-95d8-8ed11cecafb1"}, - {"id": "Android - PiP", "uuid": "86da2200-58db-4d78-ba46-f146ba25906b"}, - {"id": "artist-tv", "uuid": "2797e341-b062-46ed-862f-0acbba5dd522"}, - {"id": "auto-sub-offsets", "uuid": "d4b4e08a-9201-4c99-9a52-8f2de8ff25cd"}, - {"id": "avod-ad-analysis", "uuid": "c987122a-a796-432f-af00-953821c127bb"}, - {"id": "avod-new-media", "uuid": "e703655b-ee05-4e24-97e3-a138da62c425"}, - {"id": "blacklist_get_signin", "uuid": "bec2ba97-4b25-472b-9cfc-674f5c68c2ae"}, - {"id": "blacklist-subnets", "uuid": "b3b87f19-5ccd-4b14-bb62-b9d7b982392e"}, - {"id": "bypass-web-navbar-upsell-modal", "uuid": "6aaaf4fc-c55f-4042-92c8-b35f7886d249"}, - {"id": "camera_upload", "uuid": "fb34e64d-cd89-47b8-8bae-a6d20c542bae"}, - {"id": "CU Sunset", "uuid": "567033ef-ffee-44fb-8f90-f678077445f9"}, - {"id": "chromecast-music-mp", "uuid": "58829fc9-26b8-41f4-a6c0-90ea7a11ae24"}, - {"id": "client-non-destructive-comskip", "uuid": "6ab6677b-ad9b-444f-9ca1-b8027d05b3e1"}, - {"id": "client-radio-stations", "uuid": "5b6190a9-77a4-477e-9fbc-c8118e35a4c1"}, - {"id": "cloudsync", "uuid": "65152b75-13a9-408a-bd30-dbd23a259183"}, - {"id": "cloudflare-turnstile-required", "uuid": "b25b878c-4f60-4337-9f6b-2d97ef41d036"}, - {"id": "common-sense-media-ratings-premium", "uuid": "f702522e-2445-461e-a83f-fc16c1259035"}, - {"id": "community-new-user-onboarding", "uuid": "c4704b28-4e26-460a-bf2e-2576d0c2cb77"}, - {"id": "community-friendships-management", "uuid": "7bb1ed71-a0a3-4362-aa08-7c3fa7241578"}, - {"id": "community-p2r5-onboarding", "uuid": "92c11c50-efed-4eb1-b3fb-0b249fbfc845"}, - {"id": "community-phase0", "uuid": "fc3e8322-5e6e-4f4a-9d71-728c6d5656bd"}, - {"id": "community-phase0-web", "uuid": "a852775a-2b74-4624-aaa3-3d624471a537"}, - {"id": "community-p1", "uuid": "6272ad55-9fc0-43c6-8e1a-3f0df7a3630e"}, - {"id": "community-p2-r1", "uuid": "31fcbe1f-0459-42cb-a15f-5084f62374d9"}, - {"id": "community-p2-r2", "uuid": "06798ab7-4fa5-4416-9db3-f313c4292f01"}, - {"id": "community-p2-r3", "uuid": "626004b8-a8b8-4fb1-9adc-8a6277f98597"}, - {"id": "community-p2-r4", "uuid": "8f47a689-aa84-408f-bf6b-00015e9413e1"}, - {"id": "community-p2-r5", "uuid": "36fdfb7c-f0c7-4da8-a167-4775e23cab7e"}, - {"id": "community-p3r1-profiles", "uuid": "52a31c3c-c8d4-49c8-9f47-18158e5528d8"}, - {"id": "community-p3r1-reactions", "uuid": "ad57040a-0b38-4862-bfcf-3fe116e9767b"}, - {"id": "community-p3r1-reviews-comments-final", "uuid": "81f9b923-039c-4828-8455-14de4ffa2059"}, - {"id": "community-p3r1-reviews-creation", "uuid": "6f4f6325-7d66-405f-96f7-b89b9685473e"}, - {"id": "community-p3r1-reviews", "uuid": "e73456a8-8962-4151-8e57-3e61c78ed9d3"}, - {"id": "comments_and_replies_push_notifications", "uuid": "7f46bf17-fabf-4f96-99a2-cf374f6eed71"}, - {"id": "friend_request_push_notifications", "uuid": "c36a6985-eee3-4400-a394-c5787fad15b5"}, - {"id": "community_access_plex_tv", "uuid": "3f6baa76-7488-479a-9e4f-49ff2c0d3711"}, - {"id": "community_friends_group_notifications", "uuid": "dd69b465-7eb3-4c18-a1c0-7bc0015969e8"}, - {"id": "companions_sonos", "uuid": "24b4cf36-b296-4002-86b7-f1adb657e76a"}, - {"id": "content_filter", "uuid": "32cc8bf5-b425-4582-a52d-71b4f1cf436b"}, - {"id": "create_anonymous_users", "uuid": "f6a0e423-1a83-418c-8448-a1c7105fd71a"}, - {"id": "credits-markers", "uuid": "926bc176-58ca-47da-b8e3-080ed14ea6ba"}, - {"id": "custom-home-removal", "uuid": "849433b0-ef60-4a71-9dd9-939bc01f5362"}, - {"id": "grandfather-sync", "uuid": "7ee1495c-2798-4288-94e2-9cd98e67d441"}, - {"id": "community-p3r1-reviews-comments", "uuid": "47c8dede-c75d-4015-8631-8fe5665638c8"}, - {"id": "disable-facebook-auth", "uuid": "00077925-6031-401b-8679-f6617ed0cec6"}, - {"id": "disable_home_user_friendships", "uuid": "d29f0ee0-3d3a-46c3-b582-4bc69bc17c29"}, - {"id": "disable_sharing_friendships", "uuid": "ce8f644e-87ce-4ba5-b165-fadd69778019"}, - {"id": "disco-native-ads-support", "uuid": "61ace69e-8397-432e-9d46-352a00263a7a"}, - {"id": "disco-reported-issues", "uuid": "6225c337-cd26-4ff0-b864-6c6dd84c9e0d"}, - {"id": "disco-director-cast-crew-updates", "uuid": "d865f64a-ca06-472d-ae01-7a444aba6251"}, - {"id": "disco-epg-airings-on-detail-pages", "uuid": "e9cc7ec1-be5a-4727-af7b-0f107af1a07c"}, - {"id": "discover-genre-browsing", "uuid": "2131d3dc-56c8-45d0-acec-c4683fd9a027"}, - {"id": "discover-managed-related-vod", "uuid": "cb0e4c75-b1cb-43e9-97ea-6b9bc66c717b"}, - {"id": "discover-managed-user-test", "uuid": "807d9881-a846-40c3-8d54-84fc490b7ba9"}, - {"id": "discover-services-hub", "uuid": "ba7c4a4f-a13b-4ec0-8eb2-cd0ba2fe77f8"}, - {"id": "Sync v3", "uuid": "67c80530-eae3-4500-a9fa-9b6947d0f6d1"}, - {"id": "downloads-gating", "uuid": "3bfd3ccf-8c63-4dbb-8f87-9b21b402c82b"}, - {"id": "drm_support", "uuid": "34e182bd-2f62-4678-a9e9-d13b3e25019d"}, - {"id": "dvr", "uuid": "e8230c74-0940-4b91-9e20-6571eb068086"}, - {"id": "dvr-block-unsupported-countries", "uuid": "c92d4903-bc06-4715-8ce4-4a22674abac8"}, - {"id": "le_isrg_root_x1", "uuid": "af291e9e-813f-4467-8779-5d215abc3b5f"}, - {"id": "epg-recent-channels", "uuid": "9c982beb-c676-4d6f-a777-ff5d37ec3081"}, - {"id": "federated-auth", "uuid": "5d819d02-5d04-4116-8eec-f49def4e2d6f"}, - {"id": "global-continue-watching", "uuid": "4742780c-af9d-4b44-bf5b-7b27e3369aa8"}, - {"id": "hwtranscode", "uuid": "84a754b0-d1ca-4433-af2d-c949bf4b4936"}, - {"id": "hardware_transcoding", "uuid": "bc8d1fca-deb0-4d0a-a6f4-12cfd681002d"}, - {"id": "home", "uuid": "b2403ac6-4885-4971-8b96-59353fd87c72"}, - {"id": "HRK_enable_EUR", "uuid": "f1ac7a53-c524-4311-9a27-713562fc24fa"}, - {"id": "hybrid-guide", "uuid": "c6ce2260-a19d-4fea-9f74-a52231f03924"}, - {"id": "imagga-v2", "uuid": "55b9f6ed-5d26-4d2d-a436-68882a9901b5"}, - {"id": "intro-markers", "uuid": "b83c8dc9-5a01-4b7a-a7c9-5870c8a6e21b"}, - {"id": "ios14-privacy-banner", "uuid": "39dbdd84-8339-4736-96a1-0eb105cc2e08"}, - {"id": "item_clusters", "uuid": "b58d7f28-7b4a-49bb-97a7-152645505f28"}, - {"id": "iterable-notification-tokens", "uuid": "81c8d5fa-8d90-4833-aa10-a31a51310e2f"}, - {"id": "keep-payment-method", "uuid": "e4a9fd6f-4105-476b-bc57-adccd009323b"}, - {"id": "kevin-bacon", "uuid": "c7ae6f8f-05e6-48bb-9024-c05c1dc3c43e"}, - {"id": "lets_encrypt", "uuid": "8536058d-e1dd-4ae7-b30f-e8b059b7cc17"}, - {"id": "lightning-dvr-pivot", "uuid": "6b85840c-d79d-40c2-8d8f-dfc0b7d26776"}, - {"id": "livetv", "uuid": "65685ff8-4375-4e4c-a806-ec1f0b4a8b7f"}, - {"id": "livetv-platform-specific", "uuid": "de789b83-9c5e-4472-bccf-791c69e67500"}, - {"id": "allow_dvr", "uuid": "d8810b38-ec9b-494c-8555-3df6e365dfbd"}, - {"id": "live-tv-channels-grid", "uuid": "9eaa5152-320b-48e6-9d47-9492ba5e5b54"}, - {"id": "live-tv-grid-pagination", "uuid": "d1b1e233-a891-45e5-935c-6114e905dbe8"}, - {"id": "live-tv-support-incomplete-segments", "uuid": "dab501df-5d99-48ef-afc2-3e839e4ddc9a"}, - {"id": "tuner-sharing", "uuid": "4b522f91-ae89-4f62-af9c-76f44d8ef61c"}, - {"id": "live-tv-on-plex-subtitles", "uuid": "0b8bf267-1acf-4f89-99eb-4afbb9d250e5"}, - {"id": "lyrics", "uuid": "002c9f1a-2fc0-4812-b85b-0e6140f21a0f"}, - {"id": "media-access-split-2", "uuid": "7ab197ee-1bd6-4335-8f55-db827f0110ba"}, - {"id": "discover", "uuid": "4a933f24-464d-4a6b-b372-9e4497abd361"}, - {"id": "metadata_search", "uuid": "22b27e12-472e-4383-92ea-2ec3976d8e72"}, - {"id": "metadata", "uuid": "f8ea4f37-c554-476a-8852-1cbd2912f3f6"}, - {"id": "podcasts", "uuid": "1841971c-6be5-40e6-a211-7e189d767a78"}, - {"id": "vod_cloudflare", "uuid": "68747f3a-ce13-46ce-9274-1e0544c9f500"}, - {"id": "vod_subtitles", "uuid": "ed374ad1-1d36-4396-8794-f710011e4fed"}, - {"id": "tunefind-vod", "uuid": "50a1cfe9-dac1-4722-aee8-cc22e9758dd6"}, - {"id": "vod", "uuid": "cc9bea3b-11ab-4402-a222-4958bb129cab"}, - {"id": "webshows", "uuid": "55e1398c-930f-41c1-bead-f5c2e471bb25"}, - {"id": "music_videos", "uuid": "1844737f-1a87-45c3-ab20-01435959e63c"}, - {"id": "new_plex_pass_prices", "uuid": "de65add8-2782-4bb8-b156-e0b57a844479"}, - {"id": "news-provider-sunset-modal", "uuid": "b77e6744-c18d-415a-8e7c-7aac5d7a7750"}, - {"id": "nominatim", "uuid": "0de6151c-e0dd-47c8-a81e-1acb977c7f0f"}, - {"id": "nonAnonymousAccount", "uuid": "3dd35df0-3e4a-4e74-9ba8-2baeda83a733"}, - {"id": "onboarding-community", "uuid": "5dc82bc9-6038-4c21-b752-bc3454773eda"}, - {"id": "parental-controls", "uuid": "73d0bba4-a6ba-4114-bac3-3039c12e08fb"}, - {"id": "pass", "uuid": "82999dd3-a2be-482e-9f44-357879b4f603"}, - {"id": "people-pages", "uuid": "f4fe27db-7292-4e13-98b6-f3ff9b5ed5fe"}, - {"id": "people-pages-pms", "uuid": "652968f4-d474-4e04-a1cf-2dd1eaeb488a"}, - {"id": "photos-favorites", "uuid": "96cac76e-c5bc-4596-87eb-4fdfef9aaa11"}, - {"id": "photos-metadata-edition", "uuid": "2ea0e464-ea4f-4be2-97c1-ce6ed4b377dd"}, - {"id": "photosV6-edit", "uuid": "850f3d1e-3f38-44c1-9c0c-e3c9127b8b5a"}, - {"id": "photosV6-tv-albums", "uuid": "3a2b0cb6-1519-4431-98e2-823c248c70eb"}, - {"id": "playback-speed", "uuid": "068f4adf-43e5-4cc6-b5a1-1243e1be4c53"}, - {"id": "played_badges", "uuid": "02da2909-ddfd-46be-9e42-65008a79fc05"}, - {"id": "PMS HEVC Encoding", "uuid": "0e2acda2-d70d-4df6-96e0-f63cf264d217"}, - {"id": "pms_health", "uuid": "9aea4ca5-2095-4619-9339-88c1e662fde6"}, - {"id": "premium-dashboard", "uuid": "222020fb-1504-492d-af33-a0b80a49558a"}, - {"id": "premium_music_metadata", "uuid": "d413fb56-de7b-40e4-acd0-f3dbb7c9e104"}, - {"id": "promoted-grid-channel-filters", "uuid": "a0a78867-6b26-446f-9c3f-df4edf831259"}, - {"id": "rate-limit-client-token", "uuid": "3eb2789b-200c-4a15-91d2-dedfe560953c"}, - {"id": "reactions_push_notifications_settings", "uuid": "34ddfac9-3a76-459a-974d-591520b809dd"}, - {"id": "shared_server_notification", "uuid": "64adaa4e-aa7e-457d-b385-51438216d7fe"}, - {"id": "shared_source_notification", "uuid": "6c4d66d9-729d-49dc-b70d-ab2652abf15a"}, - {"id": "redirect-subscription-to-account-page", "uuid": "b8298a04-46a0-4f9c-ba1b-3b85a7d9f3b9"}, - {"id": "remote-watch-pass", "uuid": "76ddd91e-8321-4916-94b6-ded8e3727a64"}, - {"id": "save-to-library", "uuid": "644c4466-05fa-45e0-a478-c594cf81778f"}, - {"id": "scrobbling-service", "uuid": "ccef9d3a-537a-43d9-8161-4c7113c6e2bb"}, - {"id": "scrobbling-service-plex-tv", "uuid": "7b392594-6949-4736-9894-e57a9dfe4037"}, - {"id": "album-types", "uuid": "1df3cd16-faf2-4d37-8349-1fcf3713bf1d"}, - {"id": "collections", "uuid": "1417df52-986e-4e4b-8dcd-3997fbc5c976"}, - {"id": "music-analysis", "uuid": "8fd37970-6e4e-4f00-a64a-e70b52f18e94"}, - {"id": "radio", "uuid": "300231e0-69aa-4dce-97f4-52d8c00e3e8c"}, - {"id": "session_bandwidth_restrictions", "uuid": "05690239-443e-43fb-bc1a-95b5d916ca63"}, - {"id": "session_kick", "uuid": "4ca03b04-54c1-4f9f-aea2-f813ae48f317"}, - {"id": "exclude restrictions", "uuid": "6d7be725-9a96-42c7-8af4-01e735138822"}, - {"id": "signin_notification", "uuid": "1b3a63e4-c2f4-4011-a181-2343d3a97ef7"}, - {"id": "signin_with_apple", "uuid": "b5874ecb-6610-47b2-8906-1b5a897acb02"}, - {"id": "singleitemsharing", "uuid": "62b1e357-5450-41d8-9b60-c7705f750849"}, - {"id": "skip-data-licensing-consent", "uuid": "e5fe743c-af51-468a-b7e2-aabf0e79030c"}, - {"id": "sleep-timer", "uuid": "c5adf9dc-af13-4a85-a24b-98de6fa2f595"}, - {"id": "sonos-client-feature", "uuid": "8a9471c4-13bd-435a-b5b8-4ca6e423f355"}, - {"id": "spotlight-style-hub", "uuid": "579156cf-0664-45b4-8b7b-dda400ac3e26"}, - {"id": "spring_serve_ad_provider", "uuid": "fec722a0-a6d4-4fbd-96dc-4ffb02b072c5"}, - {"id": "Subtitles on Demand", "uuid": "bb50c92f-b412-44fe-8d8a-b1684f212a44"}, - {"id": "sync", "uuid": "9dc1df45-fb45-4be1-9ab2-eb23eb57f082"}, - {"id": "trailers", "uuid": "6380e085-02fe-43b5-8bff-380fa4f2423c"}, - {"id": "transcoder_cache", "uuid": "a3d2d5c4-46a0-436e-a2d6-80d26f32b369"}, - {"id": "boost-voices", "uuid": "c2409baa-d044-45c7-b1f4-e9e7ccd2d128"}, - {"id": "TREBLE-show-features", "uuid": "85ebfb7b-77fb-4afd-bb1a-2fe2fefdddbe"}, - {"id": "silence-removal", "uuid": "a6e0a154-4735-4cbb-a6ec-7a0a146c8216"}, - {"id": "sweet-fades", "uuid": "95149521-f64b-46ea-825c-9114e56afd2c"}, - {"id": "visualizers", "uuid": "1dd846ed-7cde-4dc5-8ef6-53d3ce8c4e9d"}, - {"id": "volume-leveling", "uuid": "bbf73498-4912-4d80-9560-47c4fe212cec"}, - {"id": "tvod_playback", "uuid": "5d80b92d-4ecf-4b0b-935f-5efc907bb2c1"}, - {"id": "tvod-rentals", "uuid": "362c5ba7-41e8-400d-8354-18d53868e2d3"}, - {"id": "tvod-wtw", "uuid": "e25d0e25-109e-4d6d-9a54-db0931af31c3"}, - {"id": "two-factor-authentication", "uuid": "06d14b9e-2af8-4c2b-a4a1-ea9d5c515824"}, - {"id": "two-factor-authentication-clients", "uuid": "20824f5c-6dd9-4655-9970-e7701a73c02a"}, - {"id": "type-first", "uuid": "d14556be-ae6d-4407-89d0-b83953f4789a"}, - {"id": "ultrablur", "uuid": "cec2152f-321a-4c24-8c6d-c2b35a624389"}, - {"id": "universal-search", "uuid": "8b46de05-1f96-4278-87b3-010ba5b1e386"}, - {"id": "universal-search-live-tv", "uuid": "cce9af5d-7b44-4119-a6b1-108fd0db725c"}, - {"id": "universal-search-new-quick-search", "uuid": "b6b68f84-5127-4dc9-8a7e-3a04419b5cd4"}, - {"id": "universal-watchlist", "uuid": "d9528436-ee7c-42e3-ab7b-814f85ef74b4"}, - {"id": "unsupportedtuners", "uuid": "b46d16ae-cbd6-4226-8ee9-ab2b27e5dd42"}, - {"id": "plexpass_from_billing_context", "uuid": "007fb90d-2224-4d24-bd42-e87ffde13558"}, - {"id": "users-and-sharing", "uuid": "096ab4b8-04d2-41f4-9602-f1d5b9e8c7cc"}, - {"id": "vod-schema", "uuid": "1b870b8e-f1a7-497c-80b2-857d45f3123f"}, - {"id": "watch-together-20200520", "uuid": "65faa2d0-f57e-4c63-a6b6-f1baa48951b1"}, - {"id": "watch-together-invite", "uuid": "f83450e2-759a-4de4-8b31-e4a163896d43"}, - {"id": "watched-badges-v3", "uuid": "236de47b-a757-4ed7-9003-507b296057b5"}, - {"id": "watchlist", "uuid": "f0c452ce-11e7-465f-be04-5fb0bf4bec48"}, - {"id": "watchlist-source", "uuid": "edd6039a-137c-4ace-b5d5-4e111ce9690b"}, - {"id": "watchlist-rss", "uuid": "f0f40559-a43a-4b8f-85ef-bdb1de1a912a"}, - {"id": "web-desktop-live-tv-chromecast-remote-player", "uuid": "b737075d-a6c5-4e8a-8ee9-7dc72d984062"}, - {"id": "web-desktop-gracenote-banner", "uuid": "13056a62-9bd2-47cf-aba9-bab00095fd08"}, - {"id": "web-desktop-v4-dvr-setup", "uuid": "f8484f94-92a8-4ca4-9f43-e83ab3f586c7"}, - {"id": "web-desktop-v4-home", "uuid": "29bca3b8-e40b-4c69-b71c-f88047240f9b"}, - {"id": "web-desktop-v4-pre-plays", "uuid": "591895c1-8c60-4eab-8096-3594bb190257"}, - {"id": "web-log-viewer", "uuid": "740a75d2-6dba-4317-ba68-ed3d619d4c7a"}, - {"id": "web_server_dashboard", "uuid": "5e2a89ec-fb26-4234-b66e-14d37f35dff2"}, - {"id": "web-share-v2", "uuid": "73c73f05-7131-41cd-86d7-b91301684bfe"}, - {"id": "webhooks", "uuid": "6f82ca43-6117-4e55-ae0e-5ea3b3e99a96"}, - {"id": "where-to-watch-clients", "uuid": "e4f02866-841f-4ceb-a30c-0a0e68fb874d"}] + {"id": "increase-password-complexity", "uuid": "9e93f8a8-7ccd-4d15-99fa-76a158027660"}, + {"id": "upgrade-3ds2", "uuid": "547514ab-3284-46e5-af77-bbaff247e3fc"}, + {"id": "ad-countdown-timer", "uuid": "3ae06d3a-a76b-435e-8cef-2d2008610ba2"}, + {"id": "adaptive_bitrate", "uuid": "abd37b14-706c-461f-8255-fa9563882af3"}, + {"id": "amazon-loop-debug", "uuid": "d1477307-4dac-4e57-9258-252e5b908693"}, + {"id": "Android - Dolby Vision", "uuid": "b227c158-e062-4ff1-95d8-8ed11cecafb1"}, + {"id": "Android - PiP", "uuid": "86da2200-58db-4d78-ba46-f146ba25906b"}, + {"id": "artist-tv", "uuid": "2797e341-b062-46ed-862f-0acbba5dd522"}, + {"id": "auto-sub-offsets", "uuid": "d4b4e08a-9201-4c99-9a52-8f2de8ff25cd"}, + {"id": "avod-ad-analysis", "uuid": "c987122a-a796-432f-af00-953821c127bb"}, + {"id": "avod-new-media", "uuid": "e703655b-ee05-4e24-97e3-a138da62c425"}, + {"id": "blacklist_get_signin", "uuid": "bec2ba97-4b25-472b-9cfc-674f5c68c2ae"}, + {"id": "blacklist-subnets", "uuid": "b3b87f19-5ccd-4b14-bb62-b9d7b982392e"}, + {"id": "bypass-web-navbar-upsell-modal", "uuid": "6aaaf4fc-c55f-4042-92c8-b35f7886d249"}, + {"id": "camera_upload", "uuid": "fb34e64d-cd89-47b8-8bae-a6d20c542bae"}, + {"id": "CU Sunset", "uuid": "567033ef-ffee-44fb-8f90-f678077445f9"}, + {"id": "chromecast-music-mp", "uuid": "58829fc9-26b8-41f4-a6c0-90ea7a11ae24"}, + {"id": "client-non-destructive-comskip", "uuid": "6ab6677b-ad9b-444f-9ca1-b8027d05b3e1"}, + {"id": "client-radio-stations", "uuid": "5b6190a9-77a4-477e-9fbc-c8118e35a4c1"}, + {"id": "cloudsync", "uuid": "65152b75-13a9-408a-bd30-dbd23a259183"}, + {"id": "cloudflare-turnstile-required", "uuid": "b25b878c-4f60-4337-9f6b-2d97ef41d036"}, + {"id": "common-sense-media-ratings-premium", "uuid": "f702522e-2445-461e-a83f-fc16c1259035"}, + {"id": "community-new-user-onboarding", "uuid": "c4704b28-4e26-460a-bf2e-2576d0c2cb77"}, + {"id": "community-friendships-management", "uuid": "7bb1ed71-a0a3-4362-aa08-7c3fa7241578"}, + {"id": "community-p2r5-onboarding", "uuid": "92c11c50-efed-4eb1-b3fb-0b249fbfc845"}, + {"id": "community-phase0", "uuid": "fc3e8322-5e6e-4f4a-9d71-728c6d5656bd"}, + {"id": "community-phase0-web", "uuid": "a852775a-2b74-4624-aaa3-3d624471a537"}, + {"id": "community-p1", "uuid": "6272ad55-9fc0-43c6-8e1a-3f0df7a3630e"}, + {"id": "community-p2-r1", "uuid": "31fcbe1f-0459-42cb-a15f-5084f62374d9"}, + {"id": "community-p2-r2", "uuid": "06798ab7-4fa5-4416-9db3-f313c4292f01"}, + {"id": "community-p2-r3", "uuid": "626004b8-a8b8-4fb1-9adc-8a6277f98597"}, + {"id": "community-p2-r4", "uuid": "8f47a689-aa84-408f-bf6b-00015e9413e1"}, + {"id": "community-p2-r5", "uuid": "36fdfb7c-f0c7-4da8-a167-4775e23cab7e"}, + {"id": "community-p3r1-profiles", "uuid": "52a31c3c-c8d4-49c8-9f47-18158e5528d8"}, + {"id": "community-p3r1-reactions", "uuid": "ad57040a-0b38-4862-bfcf-3fe116e9767b"}, + {"id": "community-p3r1-reviews-comments-final", "uuid": "81f9b923-039c-4828-8455-14de4ffa2059"}, + {"id": "community-p3r1-reviews-creation", "uuid": "6f4f6325-7d66-405f-96f7-b89b9685473e"}, + {"id": "community-p3r1-reviews", "uuid": "e73456a8-8962-4151-8e57-3e61c78ed9d3"}, + {"id": "comments_and_replies_push_notifications", "uuid": "7f46bf17-fabf-4f96-99a2-cf374f6eed71"}, + {"id": "friend_request_push_notifications", "uuid": "c36a6985-eee3-4400-a394-c5787fad15b5"}, + {"id": "community_access_plex_tv", "uuid": "3f6baa76-7488-479a-9e4f-49ff2c0d3711"}, + {"id": "community_friends_group_notifications", "uuid": "dd69b465-7eb3-4c18-a1c0-7bc0015969e8"}, + {"id": "companions_sonos", "uuid": "24b4cf36-b296-4002-86b7-f1adb657e76a"}, + {"id": "content_filter", "uuid": "32cc8bf5-b425-4582-a52d-71b4f1cf436b"}, + {"id": "create_anonymous_users", "uuid": "f6a0e423-1a83-418c-8448-a1c7105fd71a"}, + {"id": "credits-markers", "uuid": "926bc176-58ca-47da-b8e3-080ed14ea6ba"}, + {"id": "custom-home-removal", "uuid": "849433b0-ef60-4a71-9dd9-939bc01f5362"}, + {"id": "grandfather-sync", "uuid": "7ee1495c-2798-4288-94e2-9cd98e67d441"}, + {"id": "community-p3r1-reviews-comments", "uuid": "47c8dede-c75d-4015-8631-8fe5665638c8"}, + {"id": "disable-facebook-auth", "uuid": "00077925-6031-401b-8679-f6617ed0cec6"}, + {"id": "disable_home_user_friendships", "uuid": "d29f0ee0-3d3a-46c3-b582-4bc69bc17c29"}, + {"id": "disable_sharing_friendships", "uuid": "ce8f644e-87ce-4ba5-b165-fadd69778019"}, + {"id": "disco-native-ads-support", "uuid": "61ace69e-8397-432e-9d46-352a00263a7a"}, + {"id": "disco-reported-issues", "uuid": "6225c337-cd26-4ff0-b864-6c6dd84c9e0d"}, + {"id": "disco-director-cast-crew-updates", "uuid": "d865f64a-ca06-472d-ae01-7a444aba6251"}, + {"id": "disco-epg-airings-on-detail-pages", "uuid": "e9cc7ec1-be5a-4727-af7b-0f107af1a07c"}, + {"id": "discover-genre-browsing", "uuid": "2131d3dc-56c8-45d0-acec-c4683fd9a027"}, + {"id": "discover-managed-related-vod", "uuid": "cb0e4c75-b1cb-43e9-97ea-6b9bc66c717b"}, + {"id": "discover-managed-user-test", "uuid": "807d9881-a846-40c3-8d54-84fc490b7ba9"}, + {"id": "discover-services-hub", "uuid": "ba7c4a4f-a13b-4ec0-8eb2-cd0ba2fe77f8"}, + {"id": "Sync v3", "uuid": "67c80530-eae3-4500-a9fa-9b6947d0f6d1"}, + {"id": "downloads-gating", "uuid": "3bfd3ccf-8c63-4dbb-8f87-9b21b402c82b"}, + {"id": "drm_support", "uuid": "34e182bd-2f62-4678-a9e9-d13b3e25019d"}, + {"id": "dvr", "uuid": "e8230c74-0940-4b91-9e20-6571eb068086"}, + {"id": "dvr-block-unsupported-countries", "uuid": "c92d4903-bc06-4715-8ce4-4a22674abac8"}, + {"id": "le_isrg_root_x1", "uuid": "af291e9e-813f-4467-8779-5d215abc3b5f"}, + {"id": "epg-recent-channels", "uuid": "9c982beb-c676-4d6f-a777-ff5d37ec3081"}, + {"id": "federated-auth", "uuid": "5d819d02-5d04-4116-8eec-f49def4e2d6f"}, + {"id": "global-continue-watching", "uuid": "4742780c-af9d-4b44-bf5b-7b27e3369aa8"}, + {"id": "hwtranscode", "uuid": "84a754b0-d1ca-4433-af2d-c949bf4b4936"}, + {"id": "hardware_transcoding", "uuid": "bc8d1fca-deb0-4d0a-a6f4-12cfd681002d"}, + {"id": "home", "uuid": "b2403ac6-4885-4971-8b96-59353fd87c72"}, + {"id": "HRK_enable_EUR", "uuid": "f1ac7a53-c524-4311-9a27-713562fc24fa"}, + {"id": "hybrid-guide", "uuid": "c6ce2260-a19d-4fea-9f74-a52231f03924"}, + {"id": "imagga-v2", "uuid": "55b9f6ed-5d26-4d2d-a436-68882a9901b5"}, + {"id": "intro-markers", "uuid": "b83c8dc9-5a01-4b7a-a7c9-5870c8a6e21b"}, + {"id": "ios14-privacy-banner", "uuid": "39dbdd84-8339-4736-96a1-0eb105cc2e08"}, + {"id": "item_clusters", "uuid": "b58d7f28-7b4a-49bb-97a7-152645505f28"}, + {"id": "iterable-notification-tokens", "uuid": "81c8d5fa-8d90-4833-aa10-a31a51310e2f"}, + {"id": "keep-payment-method", "uuid": "e4a9fd6f-4105-476b-bc57-adccd009323b"}, + {"id": "kevin-bacon", "uuid": "c7ae6f8f-05e6-48bb-9024-c05c1dc3c43e"}, + {"id": "lets_encrypt", "uuid": "8536058d-e1dd-4ae7-b30f-e8b059b7cc17"}, + {"id": "lightning-dvr-pivot", "uuid": "6b85840c-d79d-40c2-8d8f-dfc0b7d26776"}, + {"id": "livetv", "uuid": "65685ff8-4375-4e4c-a806-ec1f0b4a8b7f"}, + {"id": "livetv-platform-specific", "uuid": "de789b83-9c5e-4472-bccf-791c69e67500"}, + {"id": "allow_dvr", "uuid": "d8810b38-ec9b-494c-8555-3df6e365dfbd"}, + {"id": "live-tv-channels-grid", "uuid": "9eaa5152-320b-48e6-9d47-9492ba5e5b54"}, + {"id": "live-tv-grid-pagination", "uuid": "d1b1e233-a891-45e5-935c-6114e905dbe8"}, + {"id": "live-tv-support-incomplete-segments", "uuid": "dab501df-5d99-48ef-afc2-3e839e4ddc9a"}, + {"id": "tuner-sharing", "uuid": "4b522f91-ae89-4f62-af9c-76f44d8ef61c"}, + {"id": "live-tv-on-plex-subtitles", "uuid": "0b8bf267-1acf-4f89-99eb-4afbb9d250e5"}, + {"id": "lyrics", "uuid": "002c9f1a-2fc0-4812-b85b-0e6140f21a0f"}, + {"id": "media-access-split-2", "uuid": "7ab197ee-1bd6-4335-8f55-db827f0110ba"}, + {"id": "discover", "uuid": "4a933f24-464d-4a6b-b372-9e4497abd361"}, + {"id": "metadata_search", "uuid": "22b27e12-472e-4383-92ea-2ec3976d8e72"}, + {"id": "metadata", "uuid": "f8ea4f37-c554-476a-8852-1cbd2912f3f6"}, + {"id": "podcasts", "uuid": "1841971c-6be5-40e6-a211-7e189d767a78"}, + {"id": "vod_cloudflare", "uuid": "68747f3a-ce13-46ce-9274-1e0544c9f500"}, + {"id": "vod_subtitles", "uuid": "ed374ad1-1d36-4396-8794-f710011e4fed"}, + {"id": "tunefind-vod", "uuid": "50a1cfe9-dac1-4722-aee8-cc22e9758dd6"}, + {"id": "vod", "uuid": "cc9bea3b-11ab-4402-a222-4958bb129cab"}, + {"id": "webshows", "uuid": "55e1398c-930f-41c1-bead-f5c2e471bb25"}, + {"id": "music_videos", "uuid": "1844737f-1a87-45c3-ab20-01435959e63c"}, + {"id": "new_plex_pass_prices", "uuid": "de65add8-2782-4bb8-b156-e0b57a844479"}, + {"id": "news-provider-sunset-modal", "uuid": "b77e6744-c18d-415a-8e7c-7aac5d7a7750"}, + {"id": "nominatim", "uuid": "0de6151c-e0dd-47c8-a81e-1acb977c7f0f"}, + {"id": "nonAnonymousAccount", "uuid": "3dd35df0-3e4a-4e74-9ba8-2baeda83a733"}, + {"id": "onboarding-community", "uuid": "5dc82bc9-6038-4c21-b752-bc3454773eda"}, + {"id": "parental-controls", "uuid": "73d0bba4-a6ba-4114-bac3-3039c12e08fb"}, + {"id": "pass", "uuid": "82999dd3-a2be-482e-9f44-357879b4f603"}, + {"id": "people-pages", "uuid": "f4fe27db-7292-4e13-98b6-f3ff9b5ed5fe"}, + {"id": "people-pages-pms", "uuid": "652968f4-d474-4e04-a1cf-2dd1eaeb488a"}, + {"id": "photos-favorites", "uuid": "96cac76e-c5bc-4596-87eb-4fdfef9aaa11"}, + {"id": "photos-metadata-edition", "uuid": "2ea0e464-ea4f-4be2-97c1-ce6ed4b377dd"}, + {"id": "photosV6-edit", "uuid": "850f3d1e-3f38-44c1-9c0c-e3c9127b8b5a"}, + {"id": "photosV6-tv-albums", "uuid": "3a2b0cb6-1519-4431-98e2-823c248c70eb"}, + {"id": "playback-speed", "uuid": "068f4adf-43e5-4cc6-b5a1-1243e1be4c53"}, + {"id": "played_badges", "uuid": "02da2909-ddfd-46be-9e42-65008a79fc05"}, + {"id": "PMS HEVC Encoding", "uuid": "0e2acda2-d70d-4df6-96e0-f63cf264d217"}, + {"id": "pms_health", "uuid": "9aea4ca5-2095-4619-9339-88c1e662fde6"}, + {"id": "premium-dashboard", "uuid": "222020fb-1504-492d-af33-a0b80a49558a"}, + {"id": "premium_music_metadata", "uuid": "d413fb56-de7b-40e4-acd0-f3dbb7c9e104"}, + {"id": "promoted-grid-channel-filters", "uuid": "a0a78867-6b26-446f-9c3f-df4edf831259"}, + {"id": "rate-limit-client-token", "uuid": "3eb2789b-200c-4a15-91d2-dedfe560953c"}, + {"id": "reactions_push_notifications_settings", "uuid": "34ddfac9-3a76-459a-974d-591520b809dd"}, + {"id": "shared_server_notification", "uuid": "64adaa4e-aa7e-457d-b385-51438216d7fe"}, + {"id": "shared_source_notification", "uuid": "6c4d66d9-729d-49dc-b70d-ab2652abf15a"}, + {"id": "redirect-subscription-to-account-page", "uuid": "b8298a04-46a0-4f9c-ba1b-3b85a7d9f3b9"}, + {"id": "remote-watch-pass", "uuid": "76ddd91e-8321-4916-94b6-ded8e3727a64"}, + {"id": "save-to-library", "uuid": "644c4466-05fa-45e0-a478-c594cf81778f"}, + {"id": "scrobbling-service", "uuid": "ccef9d3a-537a-43d9-8161-4c7113c6e2bb"}, + {"id": "scrobbling-service-plex-tv", "uuid": "7b392594-6949-4736-9894-e57a9dfe4037"}, + {"id": "album-types", "uuid": "1df3cd16-faf2-4d37-8349-1fcf3713bf1d"}, + {"id": "collections", "uuid": "1417df52-986e-4e4b-8dcd-3997fbc5c976"}, + {"id": "music-analysis", "uuid": "8fd37970-6e4e-4f00-a64a-e70b52f18e94"}, + {"id": "radio", "uuid": "300231e0-69aa-4dce-97f4-52d8c00e3e8c"}, + {"id": "session_bandwidth_restrictions", "uuid": "05690239-443e-43fb-bc1a-95b5d916ca63"}, + {"id": "session_kick", "uuid": "4ca03b04-54c1-4f9f-aea2-f813ae48f317"}, + {"id": "exclude restrictions", "uuid": "6d7be725-9a96-42c7-8af4-01e735138822"}, + {"id": "signin_notification", "uuid": "1b3a63e4-c2f4-4011-a181-2343d3a97ef7"}, + {"id": "signin_with_apple", "uuid": "b5874ecb-6610-47b2-8906-1b5a897acb02"}, + {"id": "singleitemsharing", "uuid": "62b1e357-5450-41d8-9b60-c7705f750849"}, + {"id": "skip-data-licensing-consent", "uuid": "e5fe743c-af51-468a-b7e2-aabf0e79030c"}, + {"id": "sleep-timer", "uuid": "c5adf9dc-af13-4a85-a24b-98de6fa2f595"}, + {"id": "sonos-client-feature", "uuid": "8a9471c4-13bd-435a-b5b8-4ca6e423f355"}, + {"id": "spotlight-style-hub", "uuid": "579156cf-0664-45b4-8b7b-dda400ac3e26"}, + {"id": "spring_serve_ad_provider", "uuid": "fec722a0-a6d4-4fbd-96dc-4ffb02b072c5"}, + {"id": "Subtitles on Demand", "uuid": "bb50c92f-b412-44fe-8d8a-b1684f212a44"}, + {"id": "sync", "uuid": "9dc1df45-fb45-4be1-9ab2-eb23eb57f082"}, + {"id": "trailers", "uuid": "6380e085-02fe-43b5-8bff-380fa4f2423c"}, + {"id": "transcoder_cache", "uuid": "a3d2d5c4-46a0-436e-a2d6-80d26f32b369"}, + {"id": "boost-voices", "uuid": "c2409baa-d044-45c7-b1f4-e9e7ccd2d128"}, + {"id": "TREBLE-show-features", "uuid": "85ebfb7b-77fb-4afd-bb1a-2fe2fefdddbe"}, + {"id": "silence-removal", "uuid": "a6e0a154-4735-4cbb-a6ec-7a0a146c8216"}, + {"id": "sweet-fades", "uuid": "95149521-f64b-46ea-825c-9114e56afd2c"}, + {"id": "visualizers", "uuid": "1dd846ed-7cde-4dc5-8ef6-53d3ce8c4e9d"}, + {"id": "volume-leveling", "uuid": "bbf73498-4912-4d80-9560-47c4fe212cec"}, + {"id": "tvod_playback", "uuid": "5d80b92d-4ecf-4b0b-935f-5efc907bb2c1"}, + {"id": "tvod-rentals", "uuid": "362c5ba7-41e8-400d-8354-18d53868e2d3"}, + {"id": "tvod-wtw", "uuid": "e25d0e25-109e-4d6d-9a54-db0931af31c3"}, + {"id": "two-factor-authentication", "uuid": "06d14b9e-2af8-4c2b-a4a1-ea9d5c515824"}, + {"id": "two-factor-authentication-clients", "uuid": "20824f5c-6dd9-4655-9970-e7701a73c02a"}, + {"id": "type-first", "uuid": "d14556be-ae6d-4407-89d0-b83953f4789a"}, + {"id": "ultrablur", "uuid": "cec2152f-321a-4c24-8c6d-c2b35a624389"}, + {"id": "universal-search", "uuid": "8b46de05-1f96-4278-87b3-010ba5b1e386"}, + {"id": "universal-search-live-tv", "uuid": "cce9af5d-7b44-4119-a6b1-108fd0db725c"}, + {"id": "universal-search-new-quick-search", "uuid": "b6b68f84-5127-4dc9-8a7e-3a04419b5cd4"}, + {"id": "universal-watchlist", "uuid": "d9528436-ee7c-42e3-ab7b-814f85ef74b4"}, + {"id": "unsupportedtuners", "uuid": "b46d16ae-cbd6-4226-8ee9-ab2b27e5dd42"}, + {"id": "plexpass_from_billing_context", "uuid": "007fb90d-2224-4d24-bd42-e87ffde13558"}, + {"id": "users-and-sharing", "uuid": "096ab4b8-04d2-41f4-9602-f1d5b9e8c7cc"}, + {"id": "vod-schema", "uuid": "1b870b8e-f1a7-497c-80b2-857d45f3123f"}, + {"id": "watch-together-20200520", "uuid": "65faa2d0-f57e-4c63-a6b6-f1baa48951b1"}, + {"id": "watch-together-invite", "uuid": "f83450e2-759a-4de4-8b31-e4a163896d43"}, + {"id": "watched-badges-v3", "uuid": "236de47b-a757-4ed7-9003-507b296057b5"}, + {"id": "watchlist", "uuid": "f0c452ce-11e7-465f-be04-5fb0bf4bec48"}, + {"id": "watchlist-source", "uuid": "edd6039a-137c-4ace-b5d5-4e111ce9690b"}, + {"id": "watchlist-rss", "uuid": "f0f40559-a43a-4b8f-85ef-bdb1de1a912a"}, + {"id": "web-desktop-live-tv-chromecast-remote-player", "uuid": "b737075d-a6c5-4e8a-8ee9-7dc72d984062"}, + {"id": "web-desktop-gracenote-banner", "uuid": "13056a62-9bd2-47cf-aba9-bab00095fd08"}, + {"id": "web-desktop-v4-dvr-setup", "uuid": "f8484f94-92a8-4ca4-9f43-e83ab3f586c7"}, + {"id": "web-desktop-v4-home", "uuid": "29bca3b8-e40b-4c69-b71c-f88047240f9b"}, + {"id": "web-desktop-v4-pre-plays", "uuid": "591895c1-8c60-4eab-8096-3594bb190257"}, + {"id": "web-log-viewer", "uuid": "740a75d2-6dba-4317-ba68-ed3d619d4c7a"}, + {"id": "web_server_dashboard", "uuid": "5e2a89ec-fb26-4234-b66e-14d37f35dff2"}, + {"id": "web-share-v2", "uuid": "73c73f05-7131-41cd-86d7-b91301684bfe"}, + {"id": "webhooks", "uuid": "6f82ca43-6117-4e55-ae0e-5ea3b3e99a96"}, + {"id": "where-to-watch-clients", "uuid": "e4f02866-841f-4ceb-a30c-0a0e68fb874d"}] FEATURES = [feature["id"] for feature in FEATURES_DICT] @@ -199,2805 +199,6 @@ ENTITLEMENTS = ["deprecated_google_iap_activation", "all", "roku", "android", "x CURRENT_DATE_MINUS_ONE_DAY = (datetime.now(timezone.utc) - timedelta(days=1)).strftime("%Y-%m-%d %H:%M:%S UTC") CURRENT_DATE_MINUS_ONE_DAY_Z = (datetime.now(timezone.utc) - timedelta(days=1)).strftime("%Y-%m-%dT%H:%M:%SZ") +NEXT_MONTH_DATE_Z = (datetime.now(timezone.utc) + timedelta(days=30)).strftime("%Y-%m-%dT%H:%M:%SZ") CURRENT_DATE_Z = (datetime.now(timezone.utc)).strftime("%Y-%m-%dT%H:%M:%SZ") CURRENT_DATE_PLUS_30MIN_Z = (datetime.now(timezone.utc) + timedelta(minutes=30)).strftime("%Y-%m-%dT%H:%M:%SZ") - - -# From https://clients.plex.tv/api/v2/user/consent -VENDORS = [ - { - "id": 1, - "consent": False, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 2, - "consent": False, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 5, - "consent": False, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 6, - "consent": False, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 7, - "consent": False, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 8, - "consent": False, - "tcfId": 293, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 9, - "consent": False, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 10, - "consent": False, - "tcfId": 36, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 11, - "consent": False, - "tcfId": 25, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 12, - "consent": False, - "tcfId": 165, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 13, - "consent": False, - "tcfId": 755, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 14, - "consent": False, - "tcfId": 11, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 15, - "consent": False, - "tcfId": 793, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 16, - "consent": False, - "regions": [ - "US" - ] - }, - { - "id": 17, - "consent": False, - "regions": [ - "US" - ] - }, - { - "id": 18, - "consent": False, - "regions": [ - "US", - "EU" - ] - }, - { - "id": 19, - "consent": False, - "tcfId": 1, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 20, - "consent": False, - "tcfId": 2, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 21, - "consent": False, - "tcfId": 6, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 22, - "consent": False, - "tcfId": 7, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 23, - "consent": False, - "tcfId": 8, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 24, - "consent": False, - "tcfId": 10, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 26, - "consent": False, - "tcfId": 12, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 27, - "consent": False, - "tcfId": 13, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 28, - "consent": False, - "tcfId": 16, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 29, - "consent": False, - "tcfId": 21, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 30, - "consent": False, - "tcfId": 22, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 31, - "consent": False, - "tcfId": 23, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 33, - "consent": False, - "tcfId": 28, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 34, - "consent": False, - "tcfId": 30, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 35, - "consent": False, - "tcfId": 31, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 36, - "consent": False, - "tcfId": 32, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 37, - "consent": False, - "tcfId": 39, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 38, - "consent": False, - "tcfId": 40, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 39, - "consent": False, - "tcfId": 42, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 40, - "consent": False, - "tcfId": 44, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 41, - "consent": False, - "tcfId": 45, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 42, - "consent": False, - "tcfId": 49, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 43, - "consent": False, - "tcfId": 50, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 44, - "consent": False, - "tcfId": 52, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 45, - "consent": False, - "tcfId": 53, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 46, - "consent": False, - "tcfId": 56, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 47, - "consent": False, - "tcfId": 60, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 48, - "consent": False, - "tcfId": 61, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 49, - "consent": False, - "tcfId": 62, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 50, - "consent": False, - "tcfId": 66, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 51, - "consent": False, - "tcfId": 68, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 52, - "consent": False, - "tcfId": 69, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 53, - "consent": False, - "tcfId": 70, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 54, - "consent": False, - "tcfId": 71, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 55, - "consent": False, - "tcfId": 73, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 56, - "consent": False, - "tcfId": 76, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 57, - "consent": False, - "tcfId": 77, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 58, - "consent": False, - "tcfId": 78, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 59, - "consent": False, - "tcfId": 79, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 60, - "consent": False, - "tcfId": 84, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 61, - "consent": False, - "tcfId": 91, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 62, - "consent": False, - "tcfId": 92, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 63, - "consent": False, - "tcfId": 93, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 64, - "consent": False, - "tcfId": 94, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 65, - "consent": False, - "tcfId": 95, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 66, - "consent": False, - "tcfId": 97, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 67, - "consent": False, - "tcfId": 98, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 68, - "consent": False, - "tcfId": 109, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 69, - "consent": False, - "tcfId": 110, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 70, - "consent": False, - "tcfId": 111, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 71, - "consent": False, - "tcfId": 114, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 72, - "consent": False, - "tcfId": 115, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 73, - "consent": False, - "tcfId": 120, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 74, - "consent": False, - "tcfId": 126, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 75, - "consent": False, - "tcfId": 128, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 76, - "consent": False, - "tcfId": 129, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 77, - "consent": False, - "tcfId": 130, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 78, - "consent": False, - "tcfId": 132, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 79, - "consent": False, - "tcfId": 134, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 80, - "consent": False, - "tcfId": 140, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 81, - "consent": False, - "tcfId": 149, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 82, - "consent": False, - "tcfId": 150, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 83, - "consent": False, - "tcfId": 155, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 84, - "consent": False, - "tcfId": 161, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 85, - "consent": False, - "tcfId": 164, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 87, - "consent": False, - "tcfId": 177, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 88, - "consent": False, - "tcfId": 183, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 89, - "consent": False, - "tcfId": 190, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 90, - "consent": False, - "tcfId": 195, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 91, - "consent": False, - "tcfId": 205, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 92, - "consent": False, - "tcfId": 209, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 93, - "consent": False, - "tcfId": 211, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 94, - "consent": False, - "tcfId": 213, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 95, - "consent": False, - "tcfId": 226, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 96, - "consent": False, - "tcfId": 231, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 97, - "consent": False, - "tcfId": 248, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 98, - "consent": False, - "tcfId": 253, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 99, - "consent": False, - "tcfId": 254, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 100, - "consent": False, - "tcfId": 261, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 101, - "consent": False, - "tcfId": 262, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 102, - "consent": False, - "tcfId": 264, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 103, - "consent": False, - "tcfId": 275, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 104, - "consent": False, - "tcfId": 278, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 105, - "consent": False, - "tcfId": 281, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 106, - "consent": False, - "tcfId": 285, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 108, - "consent": False, - "tcfId": 301, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 109, - "consent": False, - "tcfId": 302, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 110, - "consent": False, - "tcfId": 312, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 111, - "consent": False, - "tcfId": 315, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 112, - "consent": False, - "tcfId": 345, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 113, - "consent": False, - "tcfId": 361, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 114, - "consent": False, - "tcfId": 373, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 115, - "consent": False, - "tcfId": 382, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 116, - "consent": False, - "tcfId": 385, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 117, - "consent": False, - "tcfId": 388, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 118, - "consent": False, - "tcfId": 394, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 119, - "consent": False, - "tcfId": 402, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 120, - "consent": False, - "tcfId": 416, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 121, - "consent": False, - "tcfId": 423, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 122, - "consent": False, - "tcfId": 431, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 123, - "consent": False, - "tcfId": 434, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 124, - "consent": False, - "tcfId": 440, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 125, - "consent": False, - "tcfId": 452, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 126, - "consent": False, - "tcfId": 506, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 127, - "consent": False, - "tcfId": 509, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 128, - "consent": False, - "tcfId": 511, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 129, - "consent": False, - "tcfId": 517, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 130, - "consent": False, - "tcfId": 531, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 131, - "consent": False, - "tcfId": 539, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 132, - "consent": False, - "tcfId": 544, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 133, - "consent": False, - "tcfId": 559, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 134, - "consent": False, - "tcfId": 565, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 135, - "consent": False, - "tcfId": 580, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 136, - "consent": False, - "tcfId": 598, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 137, - "consent": False, - "tcfId": 602, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 138, - "consent": False, - "tcfId": 610, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 139, - "consent": False, - "tcfId": 639, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 140, - "consent": False, - "tcfId": 649, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 141, - "consent": False, - "tcfId": 657, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 142, - "consent": False, - "tcfId": 703, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 143, - "consent": False, - "tcfId": 726, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 144, - "consent": False, - "tcfId": 728, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 145, - "consent": False, - "tcfId": 730, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 147, - "consent": False, - "tcfId": 758, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 148, - "consent": False, - "tcfId": 772, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 149, - "consent": False, - "tcfId": 785, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 150, - "consent": False, - "tcfId": 788, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 151, - "consent": False, - "tcfId": 790, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 153, - "consent": False, - "tcfId": 795, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 154, - "consent": False, - "tcfId": 800, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 155, - "consent": False, - "tcfId": 812, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 156, - "consent": False, - "tcfId": 830, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 157, - "consent": False, - "tcfId": 846, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 158, - "consent": False, - "tcfId": 853, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 159, - "consent": False, - "tcfId": 860, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 160, - "consent": False, - "tcfId": 875, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 161, - "consent": False, - "tcfId": 983, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 162, - "consent": False, - "tcfId": 1015, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 163, - "consent": False, - "tcfId": 238, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 164, - "consent": False, - "tcfId": 85, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 165, - "consent": False, - "tcfId": 193, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 166, - "consent": False, - "tcfId": 156, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 167, - "consent": False, - "tcfId": 210, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 168, - "consent": False, - "tcfId": 224, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 169, - "consent": False, - "tcfId": 1041, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 170, - "consent": False, - "tcfId": 469, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 171, - "consent": False, - "tcfId": 1151, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 172, - "consent": False, - "tcfId": 628, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 173, - "consent": False, - "tcfId": 202, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 174, - "consent": False, - "tcfId": 1195, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 175, - "consent": False, - "tcfId": 1366, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 176, - "consent": False, - "tcfId": 136, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 177, - "consent": False, - "tcfId": 1339, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 178, - "consent": False, - "tcfId": 1019, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 179, - "consent": False, - "tcfId": 1154, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 180, - "consent": False, - "tcfId": 1318, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 181, - "consent": False, - "tcfId": 1029, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 182, - "consent": False, - "tcfId": 707, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 183, - "consent": False, - "tcfId": 122, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 184, - "consent": False, - "tcfId": 413, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 185, - "consent": False, - "tcfId": 328, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 186, - "consent": False, - "tcfId": 967, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 187, - "consent": False, - "tcfId": 550, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 188, - "consent": False, - "tcfId": 1031, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 189, - "consent": False, - "tcfId": 699, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 190, - "consent": False, - "tcfId": 131, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 191, - "consent": False, - "tcfId": 508, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 192, - "consent": False, - "tcfId": 1122, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 193, - "consent": False, - "tcfId": 1301, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 194, - "consent": False, - "tcfId": 1126, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 195, - "consent": False, - "tcfId": 1246, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 196, - "consent": False, - "tcfId": 468, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 197, - "consent": False, - "tcfId": 137, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 198, - "consent": False, - "tcfId": 952, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 199, - "consent": False, - "tcfId": 108, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 200, - "consent": False, - "tcfId": 82, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 201, - "consent": False, - "tcfId": 937, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 202, - "consent": False, - "tcfId": 857, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 203, - "consent": False, - "tcfId": 104, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 204, - "consent": False, - "tcfId": 1270, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 205, - "consent": False, - "tcfId": 985, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 206, - "consent": False, - "tcfId": 237, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 207, - "consent": False, - "tcfId": 1004, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 208, - "consent": False, - "tcfId": 1127, - "regions": [ - "EU", - "KR", - "US" - ] - }, - { - "id": 209, - "consent": False, - "tcfId": 58, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 210, - "consent": False, - "tcfId": 272, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 211, - "consent": False, - "tcfId": 1316, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 212, - "consent": False, - "tcfId": 1317, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 213, - "consent": False, - "tcfId": 612, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 214, - "consent": False, - "tcfId": 799, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 215, - "consent": False, - "tcfId": 430, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 216, - "consent": False, - "tcfId": 941, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 217, - "consent": False, - "tcfId": 410, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 218, - "consent": False, - "tcfId": 827, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 219, - "consent": False, - "tcfId": 1022, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 220, - "consent": False, - "tcfId": 1176, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 221, - "consent": False, - "tcfId": 1254, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 222, - "consent": False, - "tcfId": 780, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 223, - "consent": False, - "tcfId": 354, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 224, - "consent": False, - "tcfId": 496, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 225, - "consent": False, - "tcfId": 907, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 226, - "consent": False, - "tcfId": 920, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 227, - "consent": False, - "tcfId": 1312, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 228, - "consent": False, - "tcfId": 185, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 229, - "consent": False, - "tcfId": 163, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 230, - "consent": False, - "tcfId": 1081, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 231, - "consent": False, - "tcfId": 767, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 232, - "consent": False, - "tcfId": 1310, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 233, - "consent": False, - "tcfId": 143, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 234, - "consent": False, - "tcfId": 138, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 235, - "consent": False, - "tcfId": 1311, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 236, - "consent": False, - "tcfId": 938, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 237, - "consent": False, - "tcfId": 922, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 238, - "consent": False, - "tcfId": 929, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 239, - "consent": False, - "tcfId": 24, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 240, - "consent": False, - "tcfId": 877, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 241, - "consent": False, - "tcfId": 1016, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 242, - "consent": False, - "tcfId": 845, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 243, - "consent": False, - "tcfId": 1314, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 244, - "consent": False, - "tcfId": 333, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 245, - "consent": False, - "tcfId": 677, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 246, - "consent": False, - "tcfId": 972, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 247, - "consent": False, - "tcfId": 1315, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 248, - "consent": False, - "tcfId": 804, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 249, - "consent": False, - "tcfId": 148, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 250, - "consent": False, - "tcfId": 228, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 251, - "consent": False, - "tcfId": 493, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 252, - "consent": False, - "tcfId": 776, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 253, - "consent": False, - "tcfId": 142, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 254, - "consent": False, - "tcfId": 987, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 255, - "consent": False, - "tcfId": 184, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 256, - "consent": False, - "tcfId": 101, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 257, - "consent": False, - "tcfId": 898, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 258, - "consent": False, - "tcfId": 709, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 259, - "consent": False, - "tcfId": 34, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 260, - "consent": False, - "tcfId": 502, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 261, - "consent": False, - "tcfId": 816, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 262, - "consent": False, - "tcfId": 1006, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 263, - "consent": False, - "tcfId": 241, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 264, - "consent": False, - "tcfId": 280, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 265, - "consent": False, - "tcfId": 1135, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 266, - "consent": False, - "tcfId": 1064, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 267, - "consent": False, - "tcfId": 1148, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 268, - "consent": False, - "tcfId": 384, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 269, - "consent": False, - "tcfId": 762, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 270, - "consent": False, - "tcfId": 81, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 271, - "consent": False, - "tcfId": 808, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 272, - "consent": False, - "tcfId": 835, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 273, - "consent": False, - "tcfId": 1025, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 274, - "consent": False, - "tcfId": 1319, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 275, - "consent": False, - "tcfId": 759, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 276, - "consent": False, - "tcfId": 351, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 277, - "consent": False, - "tcfId": 350, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 278, - "consent": False, - "tcfId": 1051, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 279, - "consent": False, - "tcfId": 157, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 280, - "consent": False, - "tcfId": 33, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 281, - "consent": False, - "tcfId": 80, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 282, - "consent": False, - "tcfId": 276, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 283, - "consent": False, - "tcfId": 59, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 284, - "consent": False, - "tcfId": 653, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 285, - "consent": False, - "tcfId": 969, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 286, - "consent": False, - "tcfId": 534, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 287, - "consent": False, - "tcfId": 662, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 288, - "consent": False, - "tcfId": 1057, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 289, - "consent": False, - "tcfId": 786, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 290, - "consent": False, - "tcfId": 90, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 291, - "consent": False, - "tcfId": 686, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 292, - "consent": False, - "tcfId": 931, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 293, - "consent": False, - "tcfId": 512, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 294, - "consent": False, - "tcfId": 744, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 295, - "consent": False, - "tcfId": 1009, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 296, - "consent": False, - "tcfId": 1001, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 297, - "consent": False, - "tcfId": 173, - "regions": [ - "EU", - "US" - ] - }, - { - "id": 298, - "consent": False, - "tcfId": 154, - "regions": [ - "EU", - "US" - ] - } -] diff --git a/main_app.py b/main_app.py index a86699a..3585431 100644 --- a/main_app.py +++ b/main_app.py @@ -1,10 +1,13 @@ +import xml.etree.ElementTree as ET + import httpx from fastapi import FastAPI, Request from fastapi.responses import Response from starlette.responses import JSONResponse from client import AsyncCustomHost, NameSolver -from const import OFFICIAL_API +from const import OFFICIAL_API, FEATURES_DICT, ENTITLEMENTS, CURRENT_DATE_MINUS_ONE_DAY, FEATURES, \ + CURRENT_DATE_MINUS_ONE_DAY_Z, NEXT_MONTH_DATE_Z app = FastAPI() @@ -31,8 +34,9 @@ HOP_BY_HOP_HEADERS = { } -@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"]) -async def catch_all(request: Request, path: str): +async def call_official(request: Request, path: str) -> httpx.Response: + """Forward the incoming request to the official API and return the response.""" + # Copy request body body = await request.body() @@ -56,28 +60,213 @@ async def catch_all(request: Request, path: str): cookies=request.cookies, ) - # Copy response headers, filtering hop-by-hop + # Filter response headers hop-by-hop resp_headers = { k: v for k, v in upstream_response.headers.items() if k.lower() not in HOP_BY_HOP_HEADERS } + upstream_response.headers = resp_headers - content_type = upstream_response.headers.get("content-type", "") + return upstream_response + + +async def return_edited_response( + response: httpx.Response, + new_content: dict | bytes | None = None +) -> Response: + """ + Return possibly modified response. + + If new_content is a dict and the response is JSON, it will merge/override keys. + If new_content and response data are lists, new_content will replace the entire response data. + If new_content is bytes or str, it will replace the response body entirely. + """ + + content_type = response.headers.get("content-type", "") + response.headers.pop("content-encoding", None) # body is already decoded - resp_headers.pop("content-encoding", None) # remove, since body is decoded if content_type.startswith("application/json"): - response = JSONResponse( - content=upstream_response.json(), - status_code=upstream_response.status_code, - headers=resp_headers + data = response.json() + + if isinstance(new_content, dict): # allow overrides + data = {**data, **new_content} + if isinstance(data, list) and isinstance(new_content, list): + data = new_content # replace entire list + + return JSONResponse( + content=data, + status_code=response.status_code, + headers=response.headers ) else: - response = Response( - content=upstream_response.content, - status_code=upstream_response.status_code, - headers=resp_headers, + content = new_content if isinstance(new_content, (bytes, str)) else response.content + return Response( + content=content, + status_code=response.status_code, + headers=response.headers, media_type=content_type ) - return response + +@app.get("/api/v2/home") +async def fake_get_home(request: Request): + upstream_response = await call_official(request, request.url.path.lstrip("/")) + + data_override = { + "subscription": True, + } + + return await return_edited_response(upstream_response, data_override) + + +@app.get("/api/v2/features") +async def fake_get_features(request: Request): + upstream_response = await call_official(request, request.url.path.lstrip("/")) + + data_override = FEATURES_DICT + + return await return_edited_response(upstream_response, data_override) + + +@app.get("/api/v2/user") +async def fake_get_user(request: Request): + upstream_response = await call_official(request, request.url.path.lstrip("/")) + + data_override = None + + content_type = upstream_response.headers.get("content-type", "") + if content_type.startswith("application/json"): + data_override = { + "subscriptionDescription": "Monthly Plex Pass", + "roles": ["plexpass"], + "entitlements": ENTITLEMENTS, + "subscription": { + "active": True, + "subscribedAt": CURRENT_DATE_MINUS_ONE_DAY, + "status": "Active", + "paymentService": "braintree", + "plan": "monthly", + "paymentNotificationId": "1234567", + "features": FEATURES_DICT + } + } + elif content_type.startswith("application/xml"): + data = ET.fromstring(upstream_response.content) + data.attrib["subscriptionDescription"] = "Monthly Plex Pass" + + subscription = data.find("subscription") + if subscription is not None: + subscription.set("active", "1") + subscription.set("subscribedAt", CURRENT_DATE_MINUS_ONE_DAY) + subscription.set("status", "Active") + subscription.set("paymentService", "braintree") + subscription.set("plan", "monthly") + subscription.set("paymentNotificationId", "3421431") + + features = subscription.find("features") + if features is not None: + features.clear() + for feature in FEATURES: + ET.SubElement(features, "feature", {"id": feature}) + + subscriptions = data.find("subscriptions") + if subscriptions is not None: + subscriptions.clear() + sub = ET.SubElement(subscriptions, "subscription", { + "id": "1234567", + "mode": "monthly", + "startsAt": CURRENT_DATE_MINUS_ONE_DAY_Z, + "renewsAt": NEXT_MONTH_DATE_Z, + "endsAt": "", + "canceled": "0", + "gracePeriod": "0", + "onHold": "0", + "canReactivate": "0", + "canUpgrade": "0", + "canDowngrade": "0", + "canConvert": "0", + "type": "plexpass", + "braintreeId": "xyzxyz", + "state": "active" + }) + billing = ET.SubElement(sub, "billing") + ET.SubElement(billing, "paymentMethod", {"id": "1234567"}) + ET.SubElement(billing, "internalPaymentMethod") + + # --- Replace --- + for ents in data.findall("entitlements"): + data.remove(ents) + entitlements = ET.SubElement(data, "entitlements") + for entitlement in ENTITLEMENTS: + ET.SubElement(entitlements, "entitlement", {"id": entitlement}) + + # --- Replace --- + for roles in data.findall("roles"): + data.remove(roles) + roles = ET.SubElement(data, "roles") + ET.SubElement(roles, "role", {"id": "plexpass"}) + + # Pretty print XML + ET.indent(data) + + data_override = ET.tostring(data, encoding="utf-8", method="xml") + + return await return_edited_response(upstream_response, data_override) + + +@app.post("/api/v2/users/signin") +async def fake_user_signin(request: Request): + upstream_response = await call_official(request, request.url.path.lstrip("/")) + + data_override = None + + content_type = upstream_response.headers.get("content-type", "") + if content_type.startswith("application/json"): + data_override = { + "subscriptionDescription": "Monthly Plex Pass", + "roles": ["plexpass"], + "entitlements": ENTITLEMENTS, + "subscription": { + "active": True, + "subscribedAt": CURRENT_DATE_MINUS_ONE_DAY_Z, + "status": "Active", + "paymentService": "braintree", + "plan": "monthly", + "paymentNotificationId": "1234567", + "canUpgrade": True, + "features": FEATURES_DICT + }, + "subscriptions": [ + { + "id": 1234567, + "mode": "monthly", + "startsAt": 1755963427, + "renewsAt": 1758585600, + "endsAt": None, + "billing": { + "paymentMethodId": 1234567, + "internalPaymentMethod": {} + }, + "canceled": False, + "gracePeriod": False, + "onHold": False, + "canReactivate": False, + "canUpgrade": False, + "canDowngrade": False, + "canConvert": False, + "type": "plexpass", + "braintreeId": "xyzxyz", + "state": "active" + } + ] + } + + return await return_edited_response(upstream_response, data_override) + + +@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"]) +async def catch_all(request: Request, path: str): + upstream_response = await call_official(request, path) + + return await return_edited_response(upstream_response)