1#![allow(deprecated)]
5
6use serde::{Deserialize, Serialize};
7use serde_plain::derive_display_from_serialize;
8use tracing::trace_span;
9
10#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
11#[allow(clippy::enum_variant_names)]
12#[rustfmt::skip]
13pub enum Feature {
14 #[serde(
15 rename = "ad-countdown-timer",
16 alias = "3ae06d3a-a76b-435e-8cef-2d2008610ba2"
17 )]
18 AdCountdownTimer,
19 #[serde(
20 rename = "adaptive_bitrate",
21 alias = "abd37b14-706c-461f-8255-fa9563882af3"
22 )]
23 AdaptiveBitrate,
24 #[serde(
25 rename = "album-types",
26 alias = "1df3cd16-faf2-4d37-8349-1fcf3713bf1d"
27 )]
28 AlbumTypes,
29 #[serde(
30 rename = "allow_dvr",
31 alias = "d8810b38-ec9b-494c-8555-3df6e365dfbd"
32 )]
33 AllowDvr,
34 #[serde(
35 rename = "amazon-loop-debug",
36 alias = "d1477307-4dac-4e57-9258-252e5b908693"
37 )]
38 AmazonLoopDebug,
39 #[serde(
40 rename = "Android - Dolby Vision",
41 alias = "b227c158-e062-4ff1-95d8-8ed11cecafb1"
42 )]
43 AndroidDolbyVision,
44 #[serde(
45 rename = "Android - PiP",
46 alias = "86da2200-58db-4d78-ba46-f146ba25906b"
47 )]
48 AndroidPiP,
49 #[serde(
50 rename = "artist-tv",
51 alias = "2797e341-b062-46ed-862f-0acbba5dd522"
52 )]
53 ArtistTv,
54 #[serde(
55 rename = "auto-sub-offsets",
56 alias = "d4b4e08a-9201-4c99-9a52-8f2de8ff25cd"
57 )]
58 AutoSubOffsets,
59 #[serde(
60 rename = "avod-ad-analysis",
61 alias = "c987122a-a796-432f-af00-953821c127bb"
62 )]
63 AvodAdAnalysis,
64 #[serde(
65 rename = "avod-ad-loudness",
66 alias = "05826f20-284b-4bcb-b45c-2367e5c0ea72"
67 )]
68 AvodAdLoudness,
69 #[serde(
70 rename = "avod-new-media",
71 alias = "e703655b-ee05-4e24-97e3-a138da62c425"
72 )]
73 AvodNewMedia,
74 #[serde(
75 rename = "blacklist_get_signin",
76 alias = "bec2ba97-4b25-472b-9cfc-674f5c68c2ae"
77 )]
78 BlacklistGetSignin,
79 #[serde(
80 rename = "blacklist-subnets",
81 alias = "b3b87f19-5ccd-4b14-bb62-b9d7b982392e"
82 )]
83 BlacklistSubnets,
84 #[serde(
85 rename = "boost-voices",
86 alias = "c2409baa-d044-45c7-b1f4-e9e7ccd2d128"
87 )]
88 BoostVoices,
89 #[serde(
90 rename = "bypass-web-navbar-upsell-modal",
91 alias = "6aaaf4fc-c55f-4042-92c8-b35f7886d249"
92 )]
93 BypassWebNavbarUpsellModal,
94 #[serde(
95 rename = "camera_upload",
96 alias = "fb34e64d-cd89-47b8-8bae-a6d20c542bae"
97 )]
98 CameraUpload,
99 #[serde(
100 rename = "chromecast-music-mp",
101 alias = "58829fc9-26b8-41f4-a6c0-90ea7a11ae24"
102 )]
103 ChromecastMusicMp,
104 #[serde(
105 rename = "client-non-destructive-comskip",
106 alias = "6ab6677b-ad9b-444f-9ca1-b8027d05b3e1"
107 )]
108 ClientNonDestructiveComskip,
109 #[serde(
110 rename = "client-radio-stations",
111 alias = "5b6190a9-77a4-477e-9fbc-c8118e35a4c1"
112 )]
113 ClientRadioStations,
114 #[serde(
115 rename = "cloud-livetv",
116 alias = "dbab9396-78ff-48f5-a5ce-c76539ed1b6e"
117 )]
118 #[deprecated]
119 CloudLivetv,
120 #[serde(
121 rename = "cloudflare-turnstile-required",
122 alias = "b25b878c-4f60-4337-9f6b-2d97ef41d036"
123 )]
124 CloudflareTurnstileRequired,
125 #[serde(
126 rename = "cloudsync",
127 alias = "65152b75-13a9-408a-bd30-dbd23a259183"
128 )]
129 Cloudsync,
130 #[serde(
131 rename = "collections",
132 alias = "1417df52-986e-4e4b-8dcd-3997fbc5c976"
133 )]
134 Collections,
135 #[serde(
136 rename = "comments_and_replies_push_notifications",
137 alias = "7f46bf17-fabf-4f96-99a2-cf374f6eed71"
138 )]
139 CommentsAndRepliesPushNotifications,
140 #[serde(
141 rename = "common-sense-media-ratings-premium",
142 alias = "f702522e-2445-461e-a83f-fc16c1259035"
143 )]
144 CommonSenseMediaRatingsPremium,
145 #[serde(
146 rename = "community_access_plex_tv",
147 alias = "3f6baa76-7488-479a-9e4f-49ff2c0d3711"
148 )]
149 CommunityAccessPlexTv,
150 #[serde(
151 rename = "community_friends_and_followers_new_followers_push",
152 alias = "359796ce-d614-427f-8165-19ff62ca053a"
153 )]
154 CommunityFriendsAndFollowersNewFollowersPush,
155 #[serde(
156 rename = "community_friends_group_notifications",
157 alias = "dd69b465-7eb3-4c18-a1c0-7bc0015969e8"
158 )]
159 CommunityFriendsGroupNotifications,
160 #[serde(
161 rename = "community-friendships-management",
162 alias = "7bb1ed71-a0a3-4362-aa08-7c3fa7241578"
163 )]
164 CommunityFriendshipsManagement,
165 #[serde(
166 rename = "community-new-user-onboarding",
167 alias = "c4704b28-4e26-460a-bf2e-2576d0c2cb77"
168 )]
169 CommunityNewUserOnboarding,
170 #[serde(
171 rename = "community-p1",
172 alias = "6272ad55-9fc0-43c6-8e1a-3f0df7a3630e"
173 )]
174 CommunityP1,
175 #[serde(
176 rename = "community-p2-r1",
177 alias = "31fcbe1f-0459-42cb-a15f-5084f62374d9"
178 )]
179 CommunityP2R1,
180 #[serde(
181 rename = "community-p2-r2",
182 alias = "06798ab7-4fa5-4416-9db3-f313c4292f01"
183 )]
184 CommunityP2R2,
185 #[serde(
186 rename = "community-p2-r3",
187 alias = "626004b8-a8b8-4fb1-9adc-8a6277f98597"
188 )]
189 CommunityP2R3,
190 #[serde(
191 rename = "community-p2-r4",
192 alias = "8f47a689-aa84-408f-bf6b-00015e9413e1"
193 )]
194 CommunityP2R4,
195 #[serde(
196 rename = "community-p2-r5",
197 alias = "36fdfb7c-f0c7-4da8-a167-4775e23cab7e"
198 )]
199 CommunityP2R5,
200 #[serde(
201 rename = "community-p2r5-onboarding",
202 alias = "92c11c50-efed-4eb1-b3fb-0b249fbfc845"
203 )]
204 CommunityP2r5Onboarding,
205 #[serde(
206 rename = "community-p3r1-profiles",
207 alias = "52a31c3c-c8d4-49c8-9f47-18158e5528d8"
208 )]
209 CommunityP3r1Profiles,
210 #[serde(
211 rename = "community-p3r1-reactions",
212 alias = "ad57040a-0b38-4862-bfcf-3fe116e9767b"
213 )]
214 CommunityP3r1Reactions,
215 #[serde(
216 rename = "community-p3r1-reviews",
217 alias = "e73456a8-8962-4151-8e57-3e61c78ed9d3"
218 )]
219 CommunityP3r1Reviews,
220 #[serde(
221 rename = "community-p3r1-reviews-comments",
222 alias = "47c8dede-c75d-4015-8631-8fe5665638c8"
223 )]
224 CommunityP3r1ReviewsComments,
225 #[serde(
226 rename = "community-p3r1-reviews-comments-final",
227 alias = "81f9b923-039c-4828-8455-14de4ffa2059"
228 )]
229 CommunityP3r1ReviewsCommentsFinal,
230 #[serde(
231 rename = "community-p3r1-reviews-creation",
232 alias = "6f4f6325-7d66-405f-96f7-b89b9685473e"
233 )]
234 CommunityP3r1ReviewsCreation,
235 #[serde(
236 rename = "community-phase0",
237 alias = "fc3e8322-5e6e-4f4a-9d71-728c6d5656bd"
238 )]
239 CommunityPhase0,
240 #[serde(
241 rename = "community-phase0-web",
242 alias = "a852775a-2b74-4624-aaa3-3d624471a537"
243 )]
244 CommunityPhase0Web,
245 #[serde(
246 rename = "companions_sonos",
247 alias = "24b4cf36-b296-4002-86b7-f1adb657e76a"
248 )]
249 CompanionsSonos,
250 #[serde(
251 rename = "conan_redirect_alpha",
252 alias = "78643fe5-d192-40c7-8e93-5ccf04c0b767"
253 )]
254 #[deprecated]
255 ConanRedirectAlpha,
256 #[serde(
257 rename = "conan_redirect_beta",
258 alias = "bfeaee4e-965a-4d24-b163-020c3c57d936"
259 )]
260 #[deprecated]
261 ConanRedirectBeta,
262 #[serde(
263 rename = "conan_redirect_nightlies",
264 alias = "98872b06-2ff3-4b71-96bc-039e2ebe7adc"
265 )]
266 #[deprecated]
267 ConanRedirectNightlies,
268 #[serde(
269 rename = "conan_redirect_nightly",
270 alias = "7e7596aa-6e2c-41d1-a460-1e13cf0b62f2"
271 )]
272 #[deprecated]
273 ConanRedirectNightly,
274 #[serde(
275 rename = "conan_redirect_public",
276 alias = "b20d91ca-1b2f-45a2-a115-c1ad24c66ac5"
277 )]
278 #[deprecated]
279 ConanRedirectPublic,
280 #[serde(
281 rename = "conan_redirect_qa",
282 alias = "16d69c53-4c40-4821-b9f3-57ca690b2d4d"
283 )]
284 #[deprecated]
285 ConanRedirectQa,
286 #[serde(
287 rename = "content_filter",
288 alias = "32cc8bf5-b425-4582-a52d-71b4f1cf436b"
289 )]
290 ContentFilter,
291 #[serde(
292 rename = "create_anonymous_users",
293 alias = "f6a0e423-1a83-418c-8448-a1c7105fd71a"
294 )]
295 CreateAnonymousUsers,
296 #[serde(
297 rename = "credits-markers",
298 alias = "926bc176-58ca-47da-b8e3-080ed14ea6ba"
299 )]
300 CreditsMarkers,
301 #[serde(
302 rename = "CU Sunset",
303 alias = "567033ef-ffee-44fb-8f90-f678077445f9"
304 )]
305 CuSunset,
306 #[serde(
307 rename = "custom-home-removal",
308 alias = "849433b0-ef60-4a71-9dd9-939bc01f5362"
309 )]
310 CustomHomeRemoval,
311 #[serde(
312 rename = "disable-facebook-auth",
313 alias = "00077925-6031-401b-8679-f6617ed0cec6"
314 )]
315 DisableFacebookAuth,
316 #[serde(
317 rename = "disable_home_user_friendships",
318 alias = "d29f0ee0-3d3a-46c3-b582-4bc69bc17c29"
319 )]
320 DisableHomeUserFriendships,
321 #[serde(
322 rename = "disable_sharing_friendships",
323 alias = "ce8f644e-87ce-4ba5-b165-fadd69778019"
324 )]
325 DisableSharingFriendships,
326 #[serde(
327 rename = "disco-director-cast-crew-updates",
328 alias = "d865f64a-ca06-472d-ae01-7a444aba6251"
329 )]
330 DiscoDirectorCastCrewUpdates,
331 #[serde(
332 rename = "disco-epg-airings-on-detail-pages",
333 alias = "e9cc7ec1-be5a-4727-af7b-0f107af1a07c"
334 )]
335 DiscoEpgAiringsOnDetailPages,
336 #[serde(
337 rename = "disco-native-ads-support",
338 alias = "61ace69e-8397-432e-9d46-352a00263a7a"
339 )]
340 DiscoNativeAdsSupport,
341 #[serde(
342 rename = "disco-reported-issues",
343 alias = "6225c337-cd26-4ff0-b864-6c6dd84c9e0d"
344 )]
345 DiscoReportedIssues,
346 #[serde(
347 rename = "discover",
348 alias = "4a933f24-464d-4a6b-b372-9e4497abd361"
349 )]
350 Discover,
351 #[serde(
352 rename = "discover-genre-browsing",
353 alias = "2131d3dc-56c8-45d0-acec-c4683fd9a027"
354 )]
355 DiscoverGenreBrowsing,
356 #[serde(
357 rename = "discover-managed-related-vod",
358 alias = "cb0e4c75-b1cb-43e9-97ea-6b9bc66c717b"
359 )]
360 DiscoverManagedRelatedVod,
361 #[serde(
362 rename = "discover-managed-user-test",
363 alias = "807d9881-a846-40c3-8d54-84fc490b7ba9"
364 )]
365 DiscoverManagedUserTest,
366 #[serde(
367 rename = "discover-services-hub",
368 alias = "ba7c4a4f-a13b-4ec0-8eb2-cd0ba2fe77f8"
369 )]
370 DiscoverServicesHub,
371 #[serde(rename = "download_certificates")]
372 DownloadCertificates,
373 #[serde(
374 rename = "downloads-gating",
375 alias = "3bfd3ccf-8c63-4dbb-8f87-9b21b402c82b"
376 )]
377 DownloadsGating,
378 #[serde(
379 rename = "drm_support",
380 alias = "34e182bd-2f62-4678-a9e9-d13b3e25019d"
381 )]
382 DrmSupport,
383 #[serde(
384 rename = "dvr",
385 alias = "e8230c74-0940-4b91-9e20-6571eb068086"
386 )]
387 Dvr,
388 #[serde(
389 rename = "dvr-block-unsupported-countries",
390 alias = "c92d4903-bc06-4715-8ce4-4a22674abac8"
391 )]
392 DvrBlockUnsupportedCountries,
393 #[serde(
394 rename = "epg-recent-channels",
395 alias = "9c982beb-c676-4d6f-a777-ff5d37ec3081"
396 )]
397 EpgRecentChannels,
398 #[serde(
399 rename = "exclude restrictions",
400 alias = "6d7be725-9a96-42c7-8af4-01e735138822"
401 )]
402 ExcludeRestrictions,
403 #[serde(
404 rename = "federated-auth",
405 alias = "5d819d02-5d04-4116-8eec-f49def4e2d6f"
406 )]
407 FederatedAuth,
408 #[serde(
409 rename = "friend_request_push_notifications",
410 alias = "c36a6985-eee3-4400-a394-c5787fad15b5"
411 )]
412 FriendRequestPushNotifications,
413 #[serde(
414 rename = "global-continue-watching",
415 alias = "4742780c-af9d-4b44-bf5b-7b27e3369aa8"
416 )]
417 GlobalContinueWatching,
418 #[serde(
419 rename = "grandfather-sync",
420 alias = "7ee1495c-2798-4288-94e2-9cd98e67d441"
421 )]
422 GrandfatherSync,
423 #[serde(
424 rename = "guided-upgrade",
425 alias = "c9d9b7ee-fdd9-474e-b143-5039c04e9b9b"
426 )]
427 GuidedUpgrade,
428 #[serde(
429 rename = "hardware_transcoding",
430 alias = "bc8d1fca-deb0-4d0a-a6f4-12cfd681002d"
431 )]
432 HardwareTranscoding,
433 #[serde(
434 rename = "home",
435 alias = "b2403ac6-4885-4971-8b96-59353fd87c72"
436 )]
437 Home,
438 #[serde(
439 rename = "HRK_enable_EUR",
440 alias = "f1ac7a53-c524-4311-9a27-713562fc24fa"
441 )]
442 HrkEnableEur,
443 #[serde(
444 rename = "hwtranscode",
445 alias = "84a754b0-d1ca-4433-af2d-c949bf4b4936"
446 )]
447 Hwtranscode,
448 #[serde(
449 rename = "hybrid-guide",
450 alias = "c6ce2260-a19d-4fea-9f74-a52231f03924"
451 )]
452 HybridGuide,
453 #[serde(
454 rename = "imagga-v2",
455 alias = "55b9f6ed-5d26-4d2d-a436-68882a9901b5"
456 )]
457 ImaggaV2,
458 #[serde(
459 rename = "increase-password-complexity",
460 alias = "9e93f8a8-7ccd-4d15-99fa-76a158027660"
461 )]
462 IncreasePasswordComplexity,
463 #[serde(
464 rename = "intro-markers",
465 alias = "b83c8dc9-5a01-4b7a-a7c9-5870c8a6e21b"
466 )]
467 IntroMarkers,
468 #[serde(
469 rename = "ios14-privacy-banner",
470 alias = "39dbdd84-8339-4736-96a1-0eb105cc2e08"
471 )]
472 Ios14PrivacyBanner,
473 #[serde(
474 rename = "item_clusters",
475 alias = "b58d7f28-7b4a-49bb-97a7-152645505f28"
476 )]
477 ItemClusters,
478 #[serde(
479 rename = "iterable-notification-tokens",
480 alias = "81c8d5fa-8d90-4833-aa10-a31a51310e2f"
481 )]
482 IterableNotificationTokens,
483 #[serde(
484 rename = "join-discover-together",
485 alias = "f8f68869-07a5-4fc3-9359-d0b5ba9c487c"
486 )]
487 #[deprecated]
488 JoinDiscoverTogether,
489 #[serde(
490 rename = "join-discover-together-as-friend",
491 alias = "af866200-1116-4502-be15-f71457ce9d27"
492 )]
493 #[deprecated]
494 JoinDiscoverTogetherAsFriend,
495 #[serde(
496 rename = "keep-payment-method",
497 alias = "e4a9fd6f-4105-476b-bc57-adccd009323b"
498 )]
499 KeepPaymentMethod,
500 #[serde(
501 rename = "kevin-bacon",
502 alias = "c7ae6f8f-05e6-48bb-9024-c05c1dc3c43e"
503 )]
504 KevinBacon,
505 #[serde(
506 rename = "korea-consent",
507 alias = "cb151c05-1943-408a-b37c-06f7d409d6bb"
508 )]
509 #[deprecated]
510 KoreaConsent,
511 #[serde(
512 rename = "le_isrg_root_x1",
513 alias = "af291e9e-813f-4467-8779-5d215abc3b5f"
514 )]
515 LeIsrgRootX1,
516 #[serde(
517 rename = "lets_encrypt",
518 alias = "8536058d-e1dd-4ae7-b30f-e8b059b7cc17"
519 )]
520 LetsEncrypt,
521 #[serde(
522 rename = "lightning-dvr-pivot",
523 alias = "6b85840c-d79d-40c2-8d8f-dfc0b7d26776"
524 )]
525 LightningDvrPivot,
526 #[serde(
527 rename = "live-tv-channels-grid",
528 alias = "9eaa5152-320b-48e6-9d47-9492ba5e5b54"
529 )]
530 LiveTvChannelsGrid,
531 #[serde(
532 rename = "live-tv-grid-pagination",
533 alias = "d1b1e233-a891-45e5-935c-6114e905dbe8"
534 )]
535 LiveTvGridPagination,
536 #[serde(
537 rename = "live-tv-on-plex-subtitles",
538 alias = "0b8bf267-1acf-4f89-99eb-4afbb9d250e5"
539 )]
540 LiveTvOnPlexSubtitles,
541 #[serde(
542 rename = "live-tv-support-incomplete-segments",
543 alias = "dab501df-5d99-48ef-afc2-3e839e4ddc9a"
544 )]
545 LiveTvSupportIncompleteSegments,
546 #[serde(
547 rename = "livetv",
548 alias = "65685ff8-4375-4e4c-a806-ec1f0b4a8b7f"
549 )]
550 Livetv,
551 #[serde(
552 rename = "livetv-platform-specific",
553 alias = "de789b83-9c5e-4472-bccf-791c69e67500"
554 )]
555 LivetvPlatformSpecific,
556 #[serde(rename = "loudness")]
557 Loudness,
558 #[serde(
559 rename = "lyrics",
560 alias = "002c9f1a-2fc0-4812-b85b-0e6140f21a0f"
561 )]
562 Lyrics,
563 #[serde(
564 rename = "media-access-split-2",
565 alias = "7ab197ee-1bd6-4335-8f55-db827f0110ba"
566 )]
567 MediaAccessSplit2,
568 #[serde(
569 rename = "metadata",
570 alias = "f8ea4f37-c554-476a-8852-1cbd2912f3f6"
571 )]
572 Metadata,
573 #[serde(
574 rename = "metadata_search",
575 alias = "22b27e12-472e-4383-92ea-2ec3976d8e72"
576 )]
577 MetadataSearch,
578 #[serde(
579 rename = "music",
580 alias = "e7cea823-02e5-48c4-a501-d37b82bf132f"
581 )]
582 #[deprecated]
583 Music,
584 #[serde(
585 rename = "music-analysis",
586 alias = "8fd37970-6e4e-4f00-a64a-e70b52f18e94"
587 )]
588 MusicAnalysis,
589 #[serde(
590 rename = "music_preview",
591 alias = "8e8dd5c8-14a4-4208-97d4-623e09191774"
592 )]
593 #[deprecated]
594 MusicPreview,
595 #[serde(
596 rename = "music_videos",
597 alias = "1844737f-1a87-45c3-ab20-01435959e63c"
598 )]
599 MusicVideos,
600 #[serde(
601 rename = "new_plex_pass_prices",
602 alias = "de65add8-2782-4bb8-b156-e0b57a844479"
603 )]
604 NewPlexPassPrices,
605 #[serde(
606 rename = "news-provider-sunset-modal",
607 alias = "b77e6744-c18d-415a-8e7c-7aac5d7a7750"
608 )]
609 NewsProviderSunsetModal,
610 #[serde(
611 rename = "nominatim",
612 alias = "0de6151c-e0dd-47c8-a81e-1acb977c7f0f"
613 )]
614 Nominatim,
615 #[serde(
616 rename = "nonAnonymousAccount",
617 alias = "3dd35df0-3e4a-4e74-9ba8-2baeda83a733"
618 )]
619 NonAnonymousAccount,
620 #[serde(
621 rename = "onboarding-community",
622 alias = "5dc82bc9-6038-4c21-b752-bc3454773eda"
623 )]
624 OnboardingCommunity,
625 #[serde(
626 rename = "onboarding-promo-modal",
627 alias = "c0179bb9-b542-4afc-914e-63163f378485"
628 )]
629 #[deprecated]
630 OnboardingPromoModal,
631 #[serde(
632 rename = "optimize-server-users-endpoint",
633 alias = "ddd730e1-a0a0-429f-a7d3-7c5001d24497"
634 )]
635 #[deprecated]
636 OptimizeServerUsersEndpoint,
637 #[serde(
638 rename = "parental-controls",
639 alias = "73d0bba4-a6ba-4114-bac3-3039c12e08fb"
640 )]
641 ParentalControls,
642 #[serde(
643 rename = "pass",
644 alias = "82999dd3-a2be-482e-9f44-357879b4f603"
645 )]
646 Pass,
647 #[serde(
648 rename = "people-pages",
649 alias = "f4fe27db-7292-4e13-98b6-f3ff9b5ed5fe"
650 )]
651 PeoplePages,
652 #[serde(
653 rename = "people-pages-pms",
654 alias = "652968f4-d474-4e04-a1cf-2dd1eaeb488a"
655 )]
656 PeoplePagesPms,
657 #[serde(rename = "photo_autotags")]
658 PhotoAutotags,
659 #[serde(
660 rename = "photos-favorites",
661 alias = "96cac76e-c5bc-4596-87eb-4fdfef9aaa11"
662 )]
663 PhotosFavorites,
664 #[serde(
665 rename = "photos-metadata-edition",
666 alias = "2ea0e464-ea4f-4be2-97c1-ce6ed4b377dd"
667 )]
668 PhotosMetadataEdition,
669 #[serde(
670 rename = "photos-v5",
671 alias = "0a348865-4f87-46dc-8bb2-f37637975724"
672 )]
673 #[deprecated]
674 PhotosV5,
675 #[serde(
676 rename = "photosV6-edit",
677 alias = "850f3d1e-3f38-44c1-9c0c-e3c9127b8b5a"
678 )]
679 PhotosV6Edit,
680 #[serde(
681 rename = "photosV6-tv-albums",
682 alias = "3a2b0cb6-1519-4431-98e2-823c248c70eb"
683 )]
684 PhotosV6TvAlbums,
685 #[serde(
686 rename = "playback-speed",
687 alias = "068f4adf-43e5-4cc6-b5a1-1243e1be4c53"
688 )]
689 PlaybackSpeed,
690 #[serde(
691 rename = "played_badges",
692 alias = "02da2909-ddfd-46be-9e42-65008a79fc05"
693 )]
694 PlayedBadges,
695 #[serde(
696 rename = "plexpass_from_billing_context",
697 alias = "007fb90d-2224-4d24-bd42-e87ffde13558"
698 )]
699 PlexpassFromBillingContext,
700 #[serde(
701 rename = "pms_health",
702 alias = "9aea4ca5-2095-4619-9339-88c1e662fde6"
703 )]
704 PmsHealth,
705 #[serde(
706 rename = "PMS HEVC Encoding",
707 alias = "0e2acda2-d70d-4df6-96e0-f63cf264d217"
708 )]
709 PmsHevcEncoding,
710 #[serde(
711 rename = "podcasts",
712 alias = "1841971c-6be5-40e6-a211-7e189d767a78"
713 )]
714 Podcasts,
715 #[serde(
716 rename = "premium-dashboard",
717 alias = "222020fb-1504-492d-af33-a0b80a49558a"
718 )]
719 PremiumDashboard,
720 #[serde(
721 rename = "premium_music_metadata",
722 alias = "d413fb56-de7b-40e4-acd0-f3dbb7c9e104"
723 )]
724 PremiumMusicMetadata,
725 #[serde(
726 rename = "promoted-grid-channel-filters",
727 alias = "a0a78867-6b26-446f-9c3f-df4edf831259"
728 )]
729 PromotedGridChannelFilters,
730 #[serde(
731 rename = "radio",
732 alias = "300231e0-69aa-4dce-97f4-52d8c00e3e8c"
733 )]
734 Radio,
735 #[serde(
736 rename = "rate-limit-client-token",
737 alias = "3eb2789b-200c-4a15-91d2-dedfe560953c"
738 )]
739 RateLimitClientToken,
740 #[serde(
741 rename = "reactions_push_notifications_settings",
742 alias = "34ddfac9-3a76-459a-974d-591520b809dd"
743 )]
744 ReactionsPushNotificationsSettings,
745 #[serde(
746 rename = "redirect-subscription-to-account-page",
747 alias = "b8298a04-46a0-4f9c-ba1b-3b85a7d9f3b9"
748 )]
749 RedirectSubscriptionToAccountPage,
750 #[serde(
751 rename = "remote-watch-pass",
752 alias = "76ddd91e-8321-4916-94b6-ded8e3727a64"
753 )]
754 RemoteWatchPass,
755 #[serde(
756 rename = "remote-watch-pass-iap",
757 alias = "c9adefb7-30ea-4004-977d-ad2d1bc0a8ae"
758 )]
759 RemoteWatchPassIap,
760 #[serde(
761 rename = "require-plex-nonce",
762 alias = "0cce52a7-0778-4781-9a07-712370fb6b8a"
763 )]
764 #[deprecated]
765 RequirePlexNonce,
766 #[serde(
767 rename = "retro-games",
768 alias = "4e27cf82-9fb6-4ebe-8e10-c48bfe6fbbb6"
769 )]
770 #[deprecated]
771 RetroGames,
772 #[serde(
773 rename = "retro-games-plex-tv",
774 alias = "a4bc568b-477f-4f36-894b-49e19f34353f"
775 )]
776 #[deprecated]
777 RetroGamesPlexTv,
778 #[serde(
779 rename = "save-to-library",
780 alias = "644c4466-05fa-45e0-a478-c594cf81778f"
781 )]
782 SaveToLibrary,
783 #[serde(
784 rename = "scrobbling-service",
785 alias = "ccef9d3a-537a-43d9-8161-4c7113c6e2bb"
786 )]
787 ScrobblingService,
788 #[serde(
789 rename = "scrobbling-service-plex-tv",
790 alias = "7b392594-6949-4736-9894-e57a9dfe4037"
791 )]
792 ScrobblingServicePlexTv,
793 #[serde(rename = "server-manager")]
794 ServerManager,
795 #[serde(
796 rename = "session_bandwidth_restrictions",
797 alias = "05690239-443e-43fb-bc1a-95b5d916ca63"
798 )]
799 SessionBandwidthRestrictions,
800 #[serde(
801 rename = "session_kick",
802 alias = "4ca03b04-54c1-4f9f-aea2-f813ae48f317"
803 )]
804 SessionKick,
805 #[serde(rename = "shared-radio")]
806 SharedRadio,
807 #[serde(
808 rename = "shared_server_notification",
809 alias = "64adaa4e-aa7e-457d-b385-51438216d7fe"
810 )]
811 SharedServerNotification,
812 #[serde(
813 rename = "shared_source_notification",
814 alias = "6c4d66d9-729d-49dc-b70d-ab2652abf15a"
815 )]
816 SharedSourceNotification,
817 #[serde(
818 rename = "signin_notification",
819 alias = "1b3a63e4-c2f4-4011-a181-2343d3a97ef7"
820 )]
821 SigninNotification,
822 #[serde(
823 rename = "signin_with_apple",
824 alias = "b5874ecb-6610-47b2-8906-1b5a897acb02"
825 )]
826 SigninWithApple,
827 #[serde(
828 rename = "silence-removal",
829 alias = "a6e0a154-4735-4cbb-a6ec-7a0a146c8216"
830 )]
831 SilenceRemoval,
832 #[serde(
833 rename = "singleitemsharing",
834 alias = "62b1e357-5450-41d8-9b60-c7705f750849"
835 )]
836 Singleitemsharing,
837 #[serde(
838 rename = "skip-data-licensing-consent",
839 alias = "e5fe743c-af51-468a-b7e2-aabf0e79030c"
840 )]
841 SkipDataLicensingConsent,
842 #[serde(
843 rename = "sleep-timer",
844 alias = "c5adf9dc-af13-4a85-a24b-98de6fa2f595"
845 )]
846 SleepTimer,
847 #[serde(
848 rename = "sonos-client-feature",
849 alias = "8a9471c4-13bd-435a-b5b8-4ca6e423f355"
850 )]
851 SonosClientFeature,
852 #[serde(
853 rename = "spotlight-style-hub",
854 alias = "579156cf-0664-45b4-8b7b-dda400ac3e26"
855 )]
856 SpotlightStyleHub,
857 #[serde(
858 rename = "spring_serve_ad_provider",
859 alias = "fec722a0-a6d4-4fbd-96dc-4ffb02b072c5"
860 )]
861 SpringServeAdProvider,
862 #[serde(
863 rename = "Subtitles on Demand",
864 alias = "bb50c92f-b412-44fe-8d8a-b1684f212a44"
865 )]
866 SubtitlesOnDemand,
867 #[serde(
868 rename = "sweet-fades",
869 alias = "95149521-f64b-46ea-825c-9114e56afd2c"
870 )]
871 SweetFades,
872 #[serde(
873 rename = "sync",
874 alias = "9dc1df45-fb45-4be1-9ab2-eb23eb57f082"
875 )]
876 Sync,
877 #[serde(
878 rename = "Sync v3",
879 alias = "67c80530-eae3-4500-a9fa-9b6947d0f6d1"
880 )]
881 SyncV3,
882 #[serde(
883 rename = "trailers",
884 alias = "6380e085-02fe-43b5-8bff-380fa4f2423c"
885 )]
886 Trailers,
887 #[serde(
888 rename = "transcoder_cache",
889 alias = "a3d2d5c4-46a0-436e-a2d6-80d26f32b369"
890 )]
891 TranscoderCache,
892 #[serde(
893 rename = "TREBLE-show-features",
894 alias = "85ebfb7b-77fb-4afd-bb1a-2fe2fefdddbe"
895 )]
896 TrebleShowFeatures,
897 #[serde(
898 rename = "tunefind-clients",
899 alias = "07f804e6-28e6-4beb-b5c3-f2aefc88b938"
900 )]
901 #[deprecated]
902 TunefindClients,
903 #[serde(
904 rename = "tunefind-vod",
905 alias = "50a1cfe9-dac1-4722-aee8-cc22e9758dd6"
906 )]
907 TunefindVod,
908 #[serde(
909 rename = "tuner-sharing",
910 alias = "4b522f91-ae89-4f62-af9c-76f44d8ef61c"
911 )]
912 TunerSharing,
913 #[serde(
914 rename = "tvod",
915 alias = "9b5a4bea-3bbe-45d2-b226-00a6ef4d8e65"
916 )]
917 #[deprecated]
918 Tvod,
919 #[serde(
920 rename = "tvod_playback",
921 alias = "5d80b92d-4ecf-4b0b-935f-5efc907bb2c1"
922 )]
923 TvodPlayback,
924 #[serde(
925 rename = "tvod-rentals",
926 alias = "362c5ba7-41e8-400d-8354-18d53868e2d3"
927 )]
928 TvodRentals,
929 #[serde(
930 rename = "tvod-wtw",
931 alias = "e25d0e25-109e-4d6d-9a54-db0931af31c3"
932 )]
933 TvodWtw,
934 #[serde(
935 rename = "two-factor-authentication",
936 alias = "06d14b9e-2af8-4c2b-a4a1-ea9d5c515824"
937 )]
938 TwoFactorAuthentication,
939 #[serde(
940 rename = "two-factor-authentication-clients",
941 alias = "20824f5c-6dd9-4655-9970-e7701a73c02a"
942 )]
943 TwoFactorAuthenticationClients,
944 #[serde(
945 rename = "type-first",
946 alias = "d14556be-ae6d-4407-89d0-b83953f4789a"
947 )]
948 TypeFirst,
949 #[serde(
950 rename = "ultrablur",
951 alias = "cec2152f-321a-4c24-8c6d-c2b35a624389"
952 )]
953 Ultrablur,
954 #[serde(
955 rename = "universal-search",
956 alias = "8b46de05-1f96-4278-87b3-010ba5b1e386"
957 )]
958 UniversalSearch,
959 #[serde(
960 rename = "universal-search-live-tv",
961 alias = "cce9af5d-7b44-4119-a6b1-108fd0db725c"
962 )]
963 UniversalSearchLiveTv,
964 #[serde(
965 rename = "universal-search-new-quick-search",
966 alias = "b6b68f84-5127-4dc9-8a7e-3a04419b5cd4"
967 )]
968 UniversalSearchNewQuickSearch,
969 #[serde(
970 rename = "universal-watchlist",
971 alias = "d9528436-ee7c-42e3-ab7b-814f85ef74b4"
972 )]
973 UniversalWatchlist,
974 #[serde(
975 rename = "unsupportedtuners",
976 alias = "b46d16ae-cbd6-4226-8ee9-ab2b27e5dd42"
977 )]
978 Unsupportedtuners,
979 #[serde(
980 rename = "upgrade-3ds2",
981 alias = "547514ab-3284-46e5-af77-bbaff247e3fc"
982 )]
983 Upgrade3ds2,
984 #[serde(
985 rename = "user-profile-whats-new",
986 alias = "90138784-37a0-4a6b-87f6-1146d6c628e6"
987 )]
988 #[deprecated]
989 UserProfileWhatsNew,
990 #[serde(
991 rename = "users-and-sharing",
992 alias = "096ab4b8-04d2-41f4-9602-f1d5b9e8c7cc"
993 )]
994 UsersAndSharing,
995 #[serde(
996 rename = "visualizers",
997 alias = "1dd846ed-7cde-4dc5-8ef6-53d3ce8c4e9d"
998 )]
999 Visualizers,
1000 #[serde(
1001 rename = "vod",
1002 alias = "cc9bea3b-11ab-4402-a222-4958bb129cab"
1003 )]
1004 Vod,
1005 #[serde(
1006 rename = "vod_channels",
1007 alias = "5050545e-95c6-4a25-b94e-1fe5a5a603d0"
1008 )]
1009 #[deprecated]
1010 VodChannels,
1011 #[serde(
1012 rename = "vod_cloudflare",
1013 alias = "68747f3a-ce13-46ce-9274-1e0544c9f500"
1014 )]
1015 VodCloudflare,
1016 #[serde(
1017 rename = "vod-schema",
1018 alias = "1b870b8e-f1a7-497c-80b2-857d45f3123f"
1019 )]
1020 VodSchema,
1021 #[serde(
1022 rename = "vod_subtitles",
1023 alias = "ed374ad1-1d36-4396-8794-f710011e4fed"
1024 )]
1025 VodSubtitles,
1026 #[serde(
1027 rename = "volume-leveling",
1028 alias = "bbf73498-4912-4d80-9560-47c4fe212cec"
1029 )]
1030 VolumeLeveling,
1031 #[serde(
1032 rename = "watch-together-20200520",
1033 alias = "65faa2d0-f57e-4c63-a6b6-f1baa48951b1"
1034 )]
1035 WatchTogether20200520,
1036 #[serde(
1037 rename = "watch-together-invite",
1038 alias = "f83450e2-759a-4de4-8b31-e4a163896d43"
1039 )]
1040 WatchTogetherInvite,
1041 #[serde(
1042 rename = "watched-badges-v3",
1043 alias = "236de47b-a757-4ed7-9003-507b296057b5"
1044 )]
1045 WatchedBadgesV3,
1046 #[serde(
1047 rename = "watchlist",
1048 alias = "f0c452ce-11e7-465f-be04-5fb0bf4bec48"
1049 )]
1050 Watchlist,
1051 #[serde(
1052 rename = "watchlist-rss",
1053 alias = "f0f40559-a43a-4b8f-85ef-bdb1de1a912a"
1054 )]
1055 WatchlistRss,
1056 #[serde(
1057 rename = "watchlist-source",
1058 alias = "edd6039a-137c-4ace-b5d5-4e111ce9690b"
1059 )]
1060 WatchlistSource,
1061 #[serde(
1062 rename = "web-desktop-gracenote-banner",
1063 alias = "13056a62-9bd2-47cf-aba9-bab00095fd08"
1064 )]
1065 WebDesktopGracenoteBanner,
1066 #[serde(
1067 rename = "web-desktop-live-tv-chromecast-remote-player",
1068 alias = "b737075d-a6c5-4e8a-8ee9-7dc72d984062"
1069 )]
1070 WebDesktopLiveTvChromecastRemotePlayer,
1071 #[serde(
1072 rename = "web-desktop-v4-dvr-setup",
1073 alias = "f8484f94-92a8-4ca4-9f43-e83ab3f586c7"
1074 )]
1075 WebDesktopV4DvrSetup,
1076 #[serde(
1077 rename = "web-desktop-v4-home",
1078 alias = "29bca3b8-e40b-4c69-b71c-f88047240f9b"
1079 )]
1080 WebDesktopV4Home,
1081 #[serde(
1082 rename = "web-desktop-v4-pre-plays",
1083 alias = "591895c1-8c60-4eab-8096-3594bb190257"
1084 )]
1085 WebDesktopV4PrePlays,
1086 #[serde(
1087 rename = "web-log-viewer",
1088 alias = "740a75d2-6dba-4317-ba68-ed3d619d4c7a"
1089 )]
1090 WebLogViewer,
1091 #[serde(
1092 rename = "web_server_dashboard",
1093 alias = "5e2a89ec-fb26-4234-b66e-14d37f35dff2"
1094 )]
1095 WebServerDashboard,
1096 #[serde(
1097 rename = "web-share-v2",
1098 alias = "73c73f05-7131-41cd-86d7-b91301684bfe"
1099 )]
1100 WebShareV2,
1101 #[serde(
1102 rename = "webhooks",
1103 alias = "6f82ca43-6117-4e55-ae0e-5ea3b3e99a96"
1104 )]
1105 Webhooks,
1106 #[serde(
1107 rename = "webshows",
1108 alias = "55e1398c-930f-41c1-bead-f5c2e471bb25"
1109 )]
1110 Webshows,
1111 #[serde(
1112 rename = "where-to-watch-clients",
1113 alias = "e4f02866-841f-4ceb-a30c-0a0e68fb874d"
1114 )]
1115 WhereToWatchClients,
1116 UnknownUuid(String),
1117 #[cfg(not(feature = "tests_deny_unknown_fields"))]
1118 #[serde(other)]
1119 UnknownValue,
1120}
1121
1122impl ::std::str::FromStr for Feature {
1123 type Err = serde_plain::Error;
1124 fn from_str(s: &str) -> ::std::result::Result<Feature, Self::Err> {
1125 let span = trace_span!("Feature::deserialize");
1126 let _span_enter = span.enter();
1127
1128 let result = serde_plain::from_str(s);
1129
1130 #[cfg(not(feature = "tests_deny_unknown_fields"))]
1131 let is_unknown_value = matches!(result, Ok(Feature::UnknownValue));
1132 #[cfg(feature = "tests_deny_unknown_fields")]
1133 let is_unknown_value = result.is_err();
1134
1135 if is_unknown_value
1136 && s.len() == 36
1137 && s.as_bytes()[8] == b'-'
1138 && s.as_bytes()[13] == b'-'
1139 && s.as_bytes()[18] == b'-'
1140 && s.as_bytes()[23] == b'-'
1141 {
1142 return Ok(Feature::UnknownUuid(s.to_string()));
1143 }
1144
1145 result
1146 }
1147}
1148derive_display_from_serialize!(Feature);
1149
1150#[cfg(test)]
1151mod test {
1152 use crate::media_container::server::Feature;
1153 use std::str::FromStr;
1154
1155 #[cfg(not(feature = "tests_deny_unknown_fields"))]
1156 #[plex_api_test_helper::offline_test]
1157 fn test_unknown_feature() {
1158 let f = Feature::from_str("unknown_value").unwrap();
1159 assert_eq!(f, Feature::UnknownValue);
1160 }
1161
1162 #[plex_api_test_helper::offline_test]
1163 fn test_unknown_feature_uuid() {
1164 let f = Feature::from_str("cc9bea3b-aaaa-bbbb-cccc-4958bb129caa").unwrap();
1165 assert_eq!(
1166 f,
1167 Feature::UnknownUuid("cc9bea3b-aaaa-bbbb-cccc-4958bb129caa".to_owned())
1168 );
1169 }
1170
1171 #[plex_api_test_helper::offline_test]
1172 fn test_known_feature() {
1173 let f = Feature::from_str("webhooks").unwrap();
1174 assert_eq!(f, Feature::Webhooks);
1175
1176 let f = Feature::from_str("6f82ca43-6117-4e55-ae0e-5ea3b3e99a96").unwrap();
1177 assert_eq!(f, Feature::Webhooks);
1178 }
1179
1180 #[plex_api_test_helper::offline_test]
1181 fn test_known_deprecated_feature() {
1182 let f = Feature::from_str("optimize-server-users-endpoint").unwrap();
1183 assert_eq!(f, Feature::OptimizeServerUsersEndpoint);
1184
1185 let f = Feature::from_str("ddd730e1-a0a0-429f-a7d3-7c5001d24497").unwrap();
1186 assert_eq!(f, Feature::OptimizeServerUsersEndpoint);
1187 }
1188}