From 6f0f51384a41ea815895017ace6a3916a678b353 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 10 Aug 2026 21:26:25 +0200 Subject: [PATCH] feat(design): Warm Cinema redesign + fast-start players Full visual overhaul from Cyber-Cinematic Glass to "Warm Cinema": warm charcoal (#0B0908), cream (#F3E9DF), ember (#D9541F). Fraunces (editorial serif) for display, Karla for body/UI. Design - app_colors: new palette, all existing token names preserved, plus posterScrim/heroScrim gradients and lift()/emberFocus() shadows - app_theme: new type scale, tighter radii, 20+ component themes - mobile_theme aligned on the same tokens - glass_container: opaque layered surfaces replace glassmorphism; adds GlassCard (hover + remote-focus states) and CinemaBackdrop - players and boot splash restyled (film-leader motif, no web fonts) Performance - remove every BackdropFilter (33 call sites): backdrop blur forced a full framebuffer read per frame per card, the main scroll jank source - bundle Fraunces/Karla as assets: google_fonts no longer fetches from fonts.gstatic.com at startup - drop the blocking hls.js CDN script from index.html; no Dart code ever used it, only the player iframes need it - self-host hls.js/mpegts.js and load them on demand, so ~213 KB of mpegts is never downloaded for HLS streams - bound image decode size on 10 sites: a 40-poster grid drops from ~240 MB to a few tens of MB of GPU memory Players (new shared engine: web/xf-player-core.js) - event-driven start instead of a 200 ms buffer poll plus a 1.5 s wait - initialLiveManifestSize 3 -> 1, liveSyncDurationCount 10 -> 2, startFragPrefetch on, testBandwidth off - MPEG-TS initial stash 512 KB -> 64 KB - adaptive escalation fast -> balanced -> safe on repeated stalls (60 s rolling window), applied live for HLS so there is no visible cut Pre-existing build breakage fixed along the way - undefined AppColors.shimmer, AppTheme.durationXs and spacing8/12/16/32 - broken relative imports in channel_card and quality_selector_widget - missing GlassCard widget and hasBorder/showShadow parameters Also resolves a leftover unmerged .claude/settings.local.json by keeping the remote version. Still broken (pre-existing, dead code, not reachable from main.dart): recommendations_provider.dart and continue_watching_widget.dart import a models/playlist.dart that no longer exists. Co-Authored-By: Claude Opus 5 --- .claude/settings.local.json | 13 + assets/google_fonts/Fraunces-Bold.ttf | Bin 0 -> 71808 bytes assets/google_fonts/Fraunces-Regular.ttf | Bin 0 -> 71812 bytes assets/google_fonts/Fraunces-SemiBold.ttf | Bin 0 -> 71884 bytes assets/google_fonts/Karla-Bold.ttf | Bin 0 -> 41788 bytes assets/google_fonts/Karla-Medium.ttf | Bin 0 -> 41796 bytes assets/google_fonts/Karla-Regular.ttf | Bin 0 -> 41740 bytes assets/google_fonts/Karla-SemiBold.ttf | Bin 0 -> 41856 bytes lib/core/theme/app_colors.dart | 269 +++++--- lib/core/theme/app_theme.dart | 575 ++++++++++++------ .../widgets/components/hero_carousel.dart | 6 +- .../widgets/components/ui_components.dart | 12 +- lib/core/widgets/digital_clock.dart | 6 +- lib/core/widgets/glass_container.dart | 359 ++++++++--- lib/core/widgets/hero_carousel.dart | 13 +- lib/core/widgets/themed_loading_screen.dart | 51 +- lib/core/widgets/tv_modern_card.dart | 15 +- lib/core/widgets/tv_nav_widgets.dart | 10 +- lib/features/admin/screens/admin_panel.dart | 14 +- lib/features/auth/screens/login_screen.dart | 12 +- lib/features/iptv/screens/player_screen.dart | 62 +- .../screens/playlist_selection_screen.dart | 36 +- .../iptv/screens/series_detail_screen.dart | 21 +- .../iptv/widgets/category_carousel.dart | 4 +- lib/features/iptv/widgets/channel_card.dart | 12 +- lib/features/iptv/widgets/epg_overlay.dart | 2 +- lib/features/iptv/widgets/epg_widget.dart | 6 +- lib/features/iptv/widgets/live_tv_tab.dart | 68 ++- lib/features/iptv/widgets/movies_tab.dart | 17 +- .../iptv/widgets/quality_selector_widget.dart | 39 +- .../iptv/widgets/recording_modal.dart | 28 +- lib/features/iptv/widgets/recordings_tab.dart | 154 ++--- lib/features/iptv/widgets/series_tab.dart | 12 +- lib/features/iptv/widgets/settings_tab.dart | 36 +- .../iptv/widgets/simple_recording_widget.dart | 18 +- .../iptv/widgets/streaming_settings_tab.dart | 52 +- .../auth/screens/mobile_login_screen.dart | 16 +- .../mobile_playlist_selection_screen.dart | 8 +- .../screens/mobile_series_detail_screen.dart | 17 +- .../iptv/widgets/mobile_live_tv_tab.dart | 50 +- .../iptv/widgets/mobile_movies_tab.dart | 12 +- .../iptv/widgets/mobile_series_tab.dart | 10 +- .../iptv/widgets/mobile_settings_tab.dart | 2 +- lib/mobile/theme/mobile_theme.dart | 65 +- lib/mobile/widgets/mobile_scaffold.dart | 4 +- pubspec.yaml | 5 + web/index.html | 130 ++-- web/player.html | 410 +++---------- web/player_lite.html | 396 +++--------- web/player_mobile.html | 386 ++++-------- web/vendor/hls.min.js | 2 + web/vendor/mpegts.min.js | 15 + web/xf-player-core.js | 495 +++++++++++++++ web/xf-player.css | 255 ++++++++ 54 files changed, 2425 insertions(+), 1775 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 assets/google_fonts/Fraunces-Bold.ttf create mode 100644 assets/google_fonts/Fraunces-Regular.ttf create mode 100644 assets/google_fonts/Fraunces-SemiBold.ttf create mode 100644 assets/google_fonts/Karla-Bold.ttf create mode 100644 assets/google_fonts/Karla-Medium.ttf create mode 100644 assets/google_fonts/Karla-Regular.ttf create mode 100644 assets/google_fonts/Karla-SemiBold.ttf create mode 100644 web/vendor/hls.min.js create mode 100644 web/vendor/mpegts.min.js create mode 100644 web/xf-player-core.js create mode 100644 web/xf-player.css diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..9afa025 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,13 @@ +{ + "permissions": { + "allow": [ + "Bash(dart analyze:*)", + "Bash(git checkout:*)", + "Bash(git commit -m 'fix: restore RecordingsTab to working version without tab complexity:*)", + "Bash(git push:*)", + "Bash(git add:*)", + "Bash(git commit -m 'fix: simplify RecordingsTab to fix null check operator error:*)", + "Bash(rtk git *)" + ] + } +} diff --git a/assets/google_fonts/Fraunces-Bold.ttf b/assets/google_fonts/Fraunces-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..952b5d1341a9fad274000f2b0520664d595b82c8 GIT binary patch literal 71808 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 z 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 Bc)9=p literal 0 HcmV?d00001 diff --git a/assets/google_fonts/Fraunces-SemiBold.ttf b/assets/google_fonts/Fraunces-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..74650f7cc19cfca7a7b56eaf55c7717b0fea77e5 GIT binary patch literal 71884 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 B?@Isx literal 0 HcmV?d00001 diff --git a/assets/google_fonts/Karla-Bold.ttf b/assets/google_fonts/Karla-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..52eeb708aeeb06cd917dbc14e56692f64498f97a GIT binary patch literal 41788 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 CK8=w8 literal 0 HcmV?d00001 diff --git a/assets/google_fonts/Karla-Medium.ttf b/assets/google_fonts/Karla-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ce061fe73939ad8139df9a090c9c61c43f51a233 GIT binary patch literal 41796 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 Pyg}-+p%6jynPvSy8uFjt literal 0 HcmV?d00001 diff --git a/assets/google_fonts/Karla-Regular.ttf b/assets/google_fonts/Karla-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d5602862c501ad66dca8f2a49568f9f113bb7c03 GIT binary patch literal 41740 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
d zuGNZkKQ_<1?BlRC7iu<>D=`Bf!RT4Hwc$CPutiC&YHjD?<9-I zxJlDyV?s*!*m3etzx*U?JVzJ#C%{_Y>>wN4H`~kl_FM}~z7>~Nr#YzIjG(gEMtE)c#+cYd;GJ3;pHRXWd}?FBh-K0%o&oKmn@g1kRM z>-#8FO5v2Ez`Nji&BldMI`(QXE(-h%g_8o{e7A*{=vGaUxBiBBRDKsA_VvC-=H`AJ>JUz-uo^xo%d2-p2o^U zFBSM%a**rp`f~6?@H6B#hb!v^COMV$!U<}~%TeHrOB8q?mnd+?B?_E#3EFcEk{SC+ zI`}zS$0f6ppUtvL{*!bD@kD;UBc$gKI4l;73WOHw+Xq+wqJtl&@6ho&c!LgpP@puZ z53U!YgC750c{?4@x=APNcvO zlRF&VhVor``JvkKn|S#g&c{W8cOfo-QJ(^5Go1oIM7MLeqFpTkT+yyhAhv-~w*oiP z!qxQjI~)ouj}qV2~p%D5tp?fBxqr7`T~Q_A?2M2KMG!2t2odmA6)i^JR@;ca!x~l zjRhQNlQQFqW2+`)?k#KjV$-J27XQIDGc7A;%_QIs5>#yGt6I$BeC)^QY;WzVcYq}Z zSJSTf45uY>F7t`iLiOlb#E>91Nn1*W4t|J+@sWXltBR-!03XInKPEy01Fiv=sW zzGq{&LG-ASS-5TzU@Y1-J5HwH%6s(&aT;=QFN?o4`SKWA5P6nz9s)Ef7ZI`+kF|* z++u1`ti|O{j(Nqp*HyqV&uq3ThGE5~a)<(Ny4;NRmE5O~Gf7z@&k~uBuPLlhMDc54 z3p77-*uVMywV&gELacLwSBDhN^Pink9A6n2=jm2BQGWH`djrd-?VU0ceadEzclJn% zcOExplTt#=Lc!S~wz>gt zLC4j34P&+WCw{|>m;T^8EMFCZf9H$J9BMhsV3vOu*stM!f?NlGw}W{Aq9q_Xx|P%B z_h^Bd9*Sc$m<;GYRYqu0Kb`&E4*7GYv$Ho7)F_dE_q~McskK_#^kKbS(F@AjMuJ~l+_47Q|X}6N%Z;TR|h6I0OV9lJBNY7AM z`vBjFCQsJe3AhD^Gn@aDEI;6_T!Ja^V~C<-`CH{U+RDpea5X&xb`;pk@PQr97%KsI z%^HT8(mN({XNT}%d2)Hrd)!4?DOu824@QlOP2dP(0|)fMRiEkLU5FDL!r*ARK9{{p z{xdj9fsJ=JRsja!^`Y<=fVBYp@en?Y`}~`A)0pCgEPM(?4Ge&bc24_#{pAlikvE&^ zFehx$lwI6Mzx^FqC@#uq6`Mb9s-8k?M{v9yrGs^H>86UwB?iZwe2uj=9de(dt;|{n zTkoG(>a?5u%

mnz!|QL4zOZ-7G%W6Y=LB&hVwejPAuTGm=F9PRc8u|NUxuFbDkk z>@5skaH*>5(t^h4tE!$~oUtHu)ym8TA*)2+dFN-%IzMmbrcC<*no423t7tSnGdit4 z(0^`5daXhGkm8O%YiG+}Nk&i<_tJ*WYfBupJ?Q5t#dbIQxtF6)jNbmzNxS1Oe6-aU ze+y@{4Vo8KTql4(0n-V{Ev^$h4!9AYnHU^8!FZlqPGWx47-=Q<8N`?}+ZOkX=B12M zN};28DGHov77UJ3s#qzF&@2#hq=hog;x5-L8s+$h;AiM)NFrtpy(3M-J`&cS6w|V) ziM7bw8z8{7)Q_Qc6WIofvWH@dRf5(YEWY9&?;oC@AD+1-%fEGkIHA!mY^q~OPEJT* zLg3u0hPfTtr&c!XnksouDvSwnb_t%CFgqn@Lz1mkvx|$@G`GkZu@Omrz6mkYgA>X( zAL=O`OR^Ue| zv|p5?z!?WKI5>DDheE5a6ff#>pA($5YZv&CtC&`;lyZ`W_o`6}cEVLlITgTW%xH;z z!KpxjvwcYgew=#nHI@QrdqE2PAkF2i;c&huqreYSP$TwVxED7sAN;{-^>bFf7S76N zaO{Sq35pYJLeq|>qgbm|V`|3owT>Ym^UTQ)lp_F3Nxf7r5`4)qoEkV8FD4=Zh;mqyn;oS&ja^4{-Yb#>Exj`ehMNpj~Q!nA>hAsU+th6OSBJ^{#Sl)D#(6QThsRFWof_W6*M=@eO&*D zy7tP7#!FSPD>8dYUas)rpEbLZrM3({xdaLB+Q=Gu(jsR|IqUd?oLuDJl_nME(;oQ#_kTc>)85WpVZk_ zPq@`;{p~ka+gvqCLQ5#z^93hYc)@M6XmF4Z(Nu>9;k>@aWsDPgv=u!Xf*BLD3!@O` zS*&<_A+Ug%i~2jm#m~DuPuQ_*Zga;|+vQ^u;0$+}Im0dVxcbir&T#V<{J|TJVa*6w z``>uOm1@1=4wVc#z`WsJlqBX2H~Tbm&zk-C$4!q%{6ksJ6Elxs`75zGcA)3k93RGdBx61+!ElQ6cd}NS1Lu#ONyHl zF(Y|ka@gcK-|QM;aMIN3d7PX?IxOqcsit^j&k&FKYEARg3DP2(+~E0 z`+L^0Enn`8O(^7KMOHu>Ui>FNv$TG|u@>ucg&5@xoSz9e8R3%QCmOL?V z(xm8#zLPvc%ChUS0;ijs=EUbOR^~RLL+Aw_F!w-!2sJT&;5 zvQ|wxu&H?Iz>a@t1q|~s;X>6=P>4LZLQ$JtVOgc-R1-Izk!V{TkngZmhLhIf@>tHq3(IMk( z#ngi_b9Uy=QXo&}1I%<}wyn;G5P7swiS)^phnk8EZHzOk=cN@?_38Dm5-+4x4k~%PO3B2!lF`QkDQ+f zuij9b){?MsM`U((WMpQhMQ}w_bn=;P7Ndt34eJP z^?oN7sG^|r5EVA^ z>N10-o15gu=P&wqayEVW@*K$7b=Y0EdW4+a_Mgewme~3jnp+S(HRsu@wsg0A(0I7P z$oP?poGprr!T}$T(dtxN$XT_zs-nM~{q?_mCUJUL)YSh*&b}%9`hS(PJ60ZEUTA0w zIa{C38$>3$KhAzq`sjT475Ia}kGJ2ARk zrLv9-P~@ypqRsU9j9SJmik$6_K^;Z?J2@LsASB1>B>06mkuWmV=nR&Wp_0ySP+Q;|pdmKy)o~1w003~LqpKio>HguFzjP&jA zbR*g$Jjr!LSYOzd$6v<`jZN^`5&*V^dIYxR>e1LFKhC$brzSitz>KkOKs;BGz`6lx z!R8aqgS9#my({cTU06HO|7Pt(Tm8$EJ@TkehF?mKb8@7jDFtQ?%NrP59XY8!lIcp3 zi|E}^!P!AxF^RYPp;KARz9TuaT69A)OY5CptX}?R^vN#Tuz!Yk$8+QgkWa z4=5{r+7we+oVYnwr%RSk;y5nYCdA9d*N8KIK$e%^j3D=<@nC)1Kxd}_ zTN@u+m+|2K)VRQGZ^r%T!3j?N&>MLl6z*rObN+qA5Ke09A2CGNOseA|ASPq9APor2 z4v44-39XwPRyB28$nsg^V#j1hKyRgYCsss7B~RO0V&O78EOqR}S&=cN0X~ImQx}~r zq#Il!$3#tKxQ7-JgmWc&aaxuW!#nmS)O0SJ*@;^CfY0oEdcVaPRkxt!3}x#coB+XN z)S#b&bFVKp*_Vv-sXTE`l~~iWQ2II4!!0t>%_9{34C;Li(LT4Z#)sbzWy8QCdz76` z7F(n25&FUS>(jqXp}-+c8||}v*gk{nEZV1RPJ}MnCq`WJP_)luPb1o=bnQeQ?L*U9 zv`?g)J3rkk2&Y532(#fEi@woakW)c4ivC0Rj74i2_bmm{kf4U_tffn{vKxe9sS6gQ zrp~PgW@2$RSQWX1cUAgKU&C*a;F%&(^l%O9!tQ=u3%156aDfeKfz4A=Dy@ACR7Redy< zE|6EwrR@*O=cfxz7k0xADl&VQv7fCTRkrhd{fv2ZgyPGE5f(WC57DEto+j35WWWfU zaCcRj-qfX&U8awAX1~MO?`cb>xTLVdqVA7eIG7zBC4Jfd94X5gjRDL+M{0T{@ma_O ztu+zc!j>RdE*grkCbIto%WK!KU!%+9kK!7im``uNdGh32Yc$Oo8`bT5RxAOtyL;D5 z2C5O*dt*{V;ipFgu=kz(VlT2~neG>tyUOMzTcvTobT45^NNI3d>iPLgUp;snr^4vX zO|2|H$WMi-&t&JrG%n9Pv3&8_0%5DLuDoJJTIw?kmR#LWkGjOT`veaUa#)o$cl~1( zVWH`Mx#L5f=4DJ;mPFsp^3U}QacanjZ%RsBmzkNJ9_br0JkY5*XZ|{d4UgU*RbJ9B zu)jGgHX^oSWcXK37jgDv8!5~)g738mehP;%DcCnYU_UcvXv0Be!pW6)P81cLxU+J_ z*Ih+LU0<)L>)xK0w!OP<&eis`wDzktGq)tAZ_Qo!_{dU=vY3gbA)dukvMb6C>KAq0 zS=smQ$~#>}$!XiK&Z+BWFR_=mr*+IcH@~SXYhjUTTx#^%lI+Kl3zHUYz%uEf9*iZv z%m;~EH26|0~1vLjEFGOJSRjLMaT*Cq-LF9FT2vWG&fOhy!fmzLv`&x(8s37 zHO9s^#>LH#jh!DCmX#G2mXjks3rKuJY-~e3o>u0Bg=J?0j&dJFDCnWRU=zkJ-5nhr z!WGf1=bN5r_80k*!CzazU)(EJ#o|$X995<&der!|nLL8-qPyf7J&cQ_fki`y77b%m z*#8~O3H{#sVKb9eP7Y-d-Xo!+Zdfmi!MA|U#0~eI!<7Fzcq@&wMpX5j1Z*Fc5 z|MS!Q-oAZXTKdW>Jpq4ys-GJBa9xN54F%>$L8dulj)I2hsH>S9VVI$)zs`WO=lsl7 zNEC4~jz~g!&AF2i|B?P9`3dIf*vfP{+)x2m3* zU45>y@?7=oXR6ww=f%a&jf$EZ8wXR@`J@*UE?!8wAO~ESb}=dGBCJXx@rEUpMax=4 zZaFbN(Vc_x2yW&_NwFgxgq^$ZE?fWImY09PDL)6RX6!A&afYqO4lVpxBMC<|DZ-II zJ?)3yD=6qLD1ezC=Lr+>XHFM-@XWMPXr67}@Ng7At*xF#l_-d^w?8Ka_q@nbtMXw#jQvCGqN?39)eF`Do& z6Mq3^sBw-wYfUC7B?YbdZ{oMxc>MPIQ#^hG#J^PV zSF|ap<=FGIz=f9J)E3a@K24^u?~%0GXE7AiG!_~k#o6Ii;^Sfy(?+3vA$Snl8r7r! zte{r%?Ft-VZ&fAVqSjUN?W!vLvcwk#`cl4CMXk`bF0xK67nkB2-z8=9l2$|FvnAxH zVz9-`iE~Ee&ar`kW5)#sj?;d!gGc070$fH1299sddvircbOE3sbUMh z@whT}9*#3Bouwe^Q6*pdQaPBUKy>Q4-qPGm7vm5U0q2hsafVo5KOd1+~{}y%haWq%?s90U19}By5(OkyM+3dZ0_4gV- zoba~1kiWMLwKd`11?9ZV{->`%L!_@YQE&ORCiyjde9J_iWGSC6mrv8l<(fkcY*t@F zb|EJ7K76}iV}4|W8B?az+Rey^W6$`Lx0CHkhmqq% z%Rhfae{ij+upDVM+&jpttZ0Olk-5H?T&aV3mlaxC8CmFifkMtwN3l?7WV$@}%s00^ zD;%kH!trN~@?kn~9ODUZa#3X}T4Dw7!St#AbC`L*BUrG^f&E~JfH}=iIS-hv?adJL z&^N{DArydCCbVW{wI&2Ds<0bnSFt!Sabs52#>BwIv+%QWkyGl%apN|o`sPiXm?zBl z%?}F7_vN6Aq0Oab%^{p7iy7!0q_vLW0JXChAI8j!1qN1X!tgNddaalsbvc$xugoLJy zFtI$m=T6y)S<0hXC(23^ni6$6fKP9Ey0{$c80}_#&8yF5>d<0iHK-|!?e-i!Y!Gp5lBr&6>maZ1AuUzTf^L@|vUMp9k zS2ztys!+GFok>R#3JL;-!Lam$OTO}F4s>6y|OHHTSk=QvQKu@UMNX|3g3P|JcQv*&a%Iztvj-DbJ*u5-&UnH$gnys^8fw z*$&J@t^VEfM^Ki|)~RlKL?rROrvEa^_|Xx@AcFrk_!xVIm~$e<_u0IF{Z+QwMNE#5 ztuUyAohb#+T-qVN-|tMRa(Y0D7Tmx|%)7w09OsNV2yV?7$A1sN z^Y0O?C9v(A)&KlVrGXxET5Ff8O9n5|Pht|f%)`t2|n&gjocSdd&6PFYfEe;A= zTvW7VB4XWVq@~S3ta}vzg-e2hmK5S)c^{a~gC)Q!;lJ#~WnS@hRIZ2RdTg4NiG6UUC5I8k27 zv=Dre=J<~p6BIONjK9B&Ye0aji$AbkA}yd(R2hu=;Ww_+U_Kll7B+r-WTdnp#LYcC z+}$k%c?)p5&M2I&1Ip+6(_8Xml{85zrcoI(v-kC#w!=6B^ULW3np7zjhtL@rN~@!A zX7y8e8>?jMYz!|Zqyy8f=F9J;4O<{Z8PI4m`RX7VI}Bx=lm=5~17lJewAKGU0y-qy zJ7SQd_jnhN&^T!@j{+F$VCxy@HE|wqh4#!C-U_Pc>~%SpPNcy(J-$*@JoS@bjqhdD zi@Voww#++hwnuMZYBk56+)KIle0y@FWa=9)|48-YdA_AWn`#O7zW|1`&Qq}I(1lAL zZ<-nrnbh>Sw6wK4Iw2vtx|R1-H_OkD|L^4G<>ct)rE=0i z@U+IuQGuf+Za67s4?KJ=Sok9UcaCaI{0@X9jfAoA~G265ED?+yOX`mT8vS|<`b5&2rPO2;g_e$apNq5-4M=U z@6N(GSlx(L7jQo!i*#W6gRh@2lq#H);S7KDA%auMi1_*#Q4Gu;ACnQ`kl7d{Nf|5F z$sOU&gI(tpnjY2u)>0Mi(*9PcM~w&`CPPcK zw4tUawa;6H4}g0;db)R#0@3zb4UcdBhPKs+0D}&)V;>W8wr>1ulVdj%dFlk_dM(DR4F5>Duo@U?;RwzGDrjkF_7qLs?|MwoKe? zqz~;!fe&PQ5bhkPCY87ktP1xJ)Zw!NH#!wUizvn?yXmQpr#js9F$eX!k@HZ1>vmA3t0kBqxoRz@ZOng@3Zv{#!!M7@oU3Z*H(Ral!yw@;~@PEA> zJZfM0(eE$rgaw080b|bAx`wccjYPEKN!*DgA!>x(CKf|tG1Bqq!(=iAtM)|nU@Ar^ z8NHj13xm@@PZ_WuWZ^Eb9C*At!lveoUW`U;<5r6&f^T}fJDzNY-d5ye-9k=%ptMwu9P>Vb3mXg2W#DUkzThM6!4m+4VZarhy7cayO zWCe)zc!Q4`8-aS!O5NdsAg`@>2Q^Q)q2 zs)x~N#qD6dqzLCo48*-(U(>@Q)c0C4L!~f7x)P~wpJ93-chjxI|OQ;hzs9fl1+_N{9y3%n7cXg*8bUgV7^(4k!(_yQ<&NE!%R0;WOo8x5hMG>m*e!*NzhB=+c{X$)=% zilg!5bKKuH8FvXL&_tSqyVFjPySV>r8cn7txQDHWPA98zf?OI+rx`eFBa7VvhkO2J z&^(%t+k?KPh2%UfqQ&GZT0$<77jP5X4muNej+K!oaKbLTg{%_y#8uN8Ivd9p&7pNT zJ)s`=$u;o1$rj+gxka!&Ex{>C%V-ns9a}+H(q_7fTp&NzR2YnJJ&OL=2-ge{Wx0i6!-DUDJIgMM~4kAMO zB6%L?YP8@EytTL&ZynagcW}4di@00vIl2=&ms@Ek-Hn_3_R@WHKRtj`xxRyqb|YdS zHsgl8{kTuA4br~@Ug_J(UYrTI4Y#`;!B*cf+{f01+t^O>TiKpQB;8qh4mY-)C(rP^ z+n&SSdC${J^ac7NeTiPCFXL$Gzu{KES7|r-nB2f^cOQ{Y$aV55xhX_U)0^U0JZn%yQFUE@VPSDqojS5GA5ZX6 zTb*C0j^e-mzsAl6$cpO9pST{@m$KH!Syjm7nwseACq(>t%Nz3E z{42uwCDHkVMQf)83mO_b+B3ld>5diD&IzuJxmOP2PMMmh&#kJss;MKlsv+Oel5OZ{ z53h=~1`A{Pg@fd$P7AIPS4wLpPq*Xb`Wf~9B1{Sv4HBJJQ<9k-Tq~bcTsx$cYfH9Y z8{3||Hs73E66g0$fXegD^P>Mt2Nr@FQHpu7@WlmfOGo?J4!CtMYjaHoy@te5YbaNHo63;GL z_>Hi+l%qM$;We+0@4dE8$H}#IK{j?~c94f^FAH)pH#dkoWm+ObNY)H-)|$A0ARo); z2gy&Z3);jjxqF7+ZlP!&B*N!`tftmXo)dJ$q39T*y`yA)M=2B?3dLG!En9oi+v&9@ zLa{au#k!LhgLQEz)+<}I{)DqscI}KQ@p1Ny_&DdXaD67frmB5qKm)Nu`&v6owKwH6 zb{_JkEU#m8r>?g(-)7g_XkIxZGR>=++D#zWECp%lTajDSk}{1VOs5f1tkuZ0^v0BF zmYnI9T&!JWtY3mEL6pkKb+qJFh6pReh*B9w#%08ml_5DRLvnE$BI7b7s4_%hz4%S# zvO1>Q%2uMOM3+lN>BRh5Q$4-9bevo|s`^aK+9H*A9Pb(c&Md7O{b5wk4s_Ue$ zx_V9=uj)B*bFQ9K(pOi~S69+kSJGEk(pOi~S2x42@5rx-3!6PXv@VdKl{I$c^O;=Z zI_UI@HQ8)~Vr`;uBHhyL=_c6Lp2=tF8lZ!9ihRY~=FaA}<~6x%vJGubsZ2|2`?|JF zyA^@GQ^VG5M;p?qmgby@vX+i)dvj|xE{nV?tUjeOw{|pSt%Tf~_5nItmCrO#AnY)k zX)`sal~@BJ<;Fj8Vr31KGpwPtHNWPzfol~FZH>*%?af&gH%w=7b3tp=n#q@3A-ij< z<*(}6>bkVrQRAAHt_Eirskw~!?CtC>ekIan0g6lFG*#zFjuYb9GXZ2s41kd>%oBv>& zW4}ei7}X=cU30kh6UK{nH$4A2I?RwRVr=Zqy?ntUXIQqOJ;$B<@NIU-yAtV1+>*)X zobfFU`CFXxT5f5%h0(5!)Dx2QN@bb0&Al}H{|v6;i%+h*A^BtQZvR2>kN8SAKJo3l zkiYTYg`VlZ27M&C7`oGcfD)Vv7IiA}Ko;PgR>d-a6~hW%byi#nu2 z&w%B2_ZN})Dgj#U7mWhS;M;d_J~?jdRZjVHKriR9N0ahcit|m%aXFr{YlQCqF2C$=s@(-=;^2j`jO}%@ZM-Q_+DMz8SRL^6K#%oF;c>v5if_M z)zJ#@P0{t>h0%iO^61iNCiIl33VcyC7JOcG7I=8XOg-|`$J3vuKTUt^IO+G&ec)Hq zhrutV_otstKbd|E`r-7C!4F0crMuF1r@s$7mQ+hqPJ)HwLrI&-3ru)*1(^sdj zfS#M41)iR+0Z)>AWqPz^&Pkt{9+u{9a@tFM;W(*dsiWWzQ}2LZPaOdtGB2eLnrBka z*`20(&Cb*lW>xA@yRXzf$#hF*k7Vu_f0rchlH@kCIkiQ2quG|aO?YD(8=wv6r6(&r zE2U?d^emB{MbdMnG|W@pdCE0Mxh__&Y06ctToaXRymDQjTqBihq;ie0n5N2w17XK- z_k#qZS?z=cg96@M*>Fy^z`xJ|fOTiens2 z;c%~6748{u7|4onUMtHsMVxjPY@bd7|aAr6qtO_r(8WN6GJ((V!2Yr^+mT6VYsJBxYReY{*c@y+*{*5XwC-TN)sUcFIA=I+ z??IEb^kBL0(our*UgbxZoC){g2Px1-jM}_wZcUxbS+#`Iy;n>fywaHz{yC`d0 zatksWledBM$t*JJMUyL&%iu_cCs`|fuIt@OPwqM&BpwId9& zTJ3uOn)m}(zc{|yaN@ss%DkrM*=u^{z2?6G=Oug2xrcbdx$evUGos;pFB{)GY<%y( zjSp@7R`0N3dzyOd?Rg1p&(X(^-wyuA;|t)NeS94_ar_GKFe?j8UiZlHZ-ZY}=`Ty$ zIO+MS^zeV3NUrtmIXzPJ6vOTqJ-Nr2<=)g1wkP^jE7$X+!4uz8S))YzDt%PUQCXF; zyi)R&%6n_D84b543x;_}xgH;i08dCh4<4U1Pfjp?qCGepyf%qX5}nCE7#*C;)$Kk{ zKyQ2S3U(ek-U5F5_$=^e(z(E%>E4Z^Ze6V{r7?>81*%Ki&8zN6`L;&5 zUbt0tY@DzsTq%5~`QJTTQJ5?|S9pzT<5*!=c!KbD`C*$y5D%Dt{zB2L5x-uzHLi8S zUR*1LTV&y1N`8*;Xydp=@y7{Yt%%&Jh)fVYLG)(Pn~hE|ZnC=JTcm2muN6O~m~JdZ;LgEPv3}s`>jnkah1`DtBiIT)qvlW%reRF z&;M|Cik>05+Vr^maw!_@{{q0G>3N{H7@hdG%Ho*?r$$#}4Le2i6o7w+=$z=B(SD>{ zjEJ~eZyfhEqutl6r*aR8K4dhVuE{u}Wi!7WWHP^#%S`q%kGK3b<8ubh_)?njov#_+WXjd&gES?Uy(0TMfJ`cAQNBBVcBm4)ZL> zX#$o5=8eU`)!fq+fc<~G^?N&u{9==9D=y4sgkO>$t}*O3C;k&$#2NOSs zGty}1H;HGVzb5*Ku6BY4&oz6Pd3ZL5PJRb3dS127L;RKAC(Lx%-Fxa^abIzN@t|>w zg;TGcJTLa0r2m*IUWtxff6PD0Ddvm4MQiHLAv3;S= zmlr#WtBtb1;_Bk8;)}(_MIu6}z2fy^p{UZ?zJY7x+-i4M+*n)>K-nME#$vbO_G*l%)jGZ$CG$pVC!)+S%tgg#46s+TI*`m%2<{)ubg9Rx$9^Tx3l`SiB@3Wyn4}YIF`;qgp^J~_~vJfT@iabvg}e9#-Y&!6Z;|(HJY9~jKfqTX;_J})ACm8U?tJ0+_}%CK?gBUE3}*$i z+^KL!xM#8N>ukI}jNDat&-`v4Pt(twPEPZ0LjEn6exz^-sD}$&B<(%?{E6A`;YpI`K_sQd_VD4qQIWN zhxskxtXJcWc8|F|VRdjU$^N^6BiElhNe`w>iXDRI3?y{Li5yDVgpxNpPOM5QVW$$d z#_1R~ldv>ScVVsBtAxEucxEgfv8Utdv@iQc`q_AH6fG#t`u;@T=32~0Ddx7@dnz@f zj&z>Z_s?g2{}O7*4YZwcM7V)`)kOBK(#iswAy`6{~;ERu^<+pkv)mnwS8G!|H)xZT2?jG*T~qqx!;#qk{A zJm7p_bg{=7TkLkm^SqltA72Tts(6(Dth>pnk0jfv13{foFhT;B{o)0Q!J8fwzFSfp>s+f%ky-fqviv;6vae;A7y|#a<>D zy{-o&03Qg7eQpS(fHdb3PzIDEUxuf4;md`@tdp48S6Mpo*lOa%dvszofp}IH@0OpF z&Lxa`egPZ-ehIt^7`G2@AKX5;eQ^7z-4}B&vlOqfJVz%Gg=*fOUraqnQDV2^G8P-g zbH%P!B6TsXVHUYfX91lBbQaKAKxaXb@5i#klE0WdkuwwiCDexl9G?dc0xtl+fOiD= zCGaY6Hf0_q{{7rZfm}PtwcoxgL7e-EX+JUSCvN@3te=?m6SIC|)=$j((Y^!iJJ7xZ z?K{xEAMN|mz8~$e9sAJOh2%aY_aV6t$$dz6A=!mw7m{7{Zq;xHtSNA|3v0HLw;O8; zSX0270@f6;rhqjCtSMkk0c#3aQ=p8kl(CgEwo=Ac%IKzyZp!GUjBa_w?$4|_)$XCz zn4f#d-$VW$^7oM6)?`L-PZNqqh}M20c?J1?~Xu0qzHW0CWKl0K0*=fp>s+f%nuB3$(-nEwMmLJhS9`Ygq@Np9c;CF94^uG|SmTyRr8@5j%y(me$BNl-9@?XU$$xKiZjl*}_HO zZ_Hi-{^nH+Mmtptulgo<(QMb7PU@I*@SJQ~VP4&pLTF3HA{_T)Bc zb|(+vM~#gwt1V1H#`enF3(EC z<-&n*QrJp#85^-7T(ERzZff5!H&2_K#~!}X+AH;gQ+JcOHS8qY%)YDL?gQ+8 z+RH8|+l^&=v9@YwRTuwcto>1FNwE`f5jq!>hA~I}Tb`wNl1^t2+xIB%?@4Dcv;MYo zCVRJbFeVsc!Jpbei1Y?$k?jL>7L$*ihPLa=neT2x`__TIU+DcF8)Le5p01mR2CmI=zb;wVoi|8p zz&L|9F64~W>{qij+birh--qxmpYQzKImk?A_>e2FbLJ8$y)jWdna|UH zEoxqAb#nyg9-P5a7WrYy`x)0hb$g%(qHG#Ib$(|W$ioQ!#FadwtedDiR>#JxjJP(M z4VK>{4agfEb7Rc|GHO3s^>(%D?b?1f<%~;n*|TRh#dnmD1)s@+xDGmu9_`wA$6L#8 i8&lrg-jHS1;cDJy@$y{SFn@MY?ZHjBcVXU>j`P199FGbB literal 0 HcmV?d00001 diff --git a/assets/google_fonts/Karla-SemiBold.ttf b/assets/google_fonts/Karla-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1cf3aeb36b85125905083ca157597292bd8b6f6f GIT binary patch literal 41856 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 EA6n{hK>z>% literal 0 HcmV?d00001 diff --git a/lib/core/theme/app_colors.dart b/lib/core/theme/app_colors.dart index 2547835..ec2f156 100644 --- a/lib/core/theme/app_colors.dart +++ b/lib/core/theme/app_colors.dart @@ -1,133 +1,202 @@ import 'package:flutter/material.dart'; -/// Cyber-Cinematic Glass Design System — Material 3 Token Palette +/// XtremFlow — "Warm Cinema" Design System /// -/// Extracted from the Stitch design system for XtremFlow. -/// Optimized for OLED displays and low-light environments. -/// Primary accent: Neon blue (#4b8eff / #adc6ff) +/// Palette: charbon chaud + crème + orange brûlé (ember). +/// Inspiration: salle de projection, pellicule, affiches 70s. +/// +/// Règle de perf : AUCUNE couleur de surface n'est translucide. +/// Les anciennes "glass" surfaces sont désormais opaques et pré-teintées, +/// ce qui supprime tout besoin de `BackdropFilter` (killer de perf sur +/// Flutter Web). La profondeur vient des ombres et du contraste, pas du flou. class AppColors { AppColors._(); - // ============ COMPATIBILITY ALIASES (transition) ============ + // ============ COMPATIBILITY ALIASES ============ static Color get focusColor => primaryContainer; static Color get border => outlineVariant; // ============ SURFACE / ON SURFACE ============ - static const Color onSurface = Color(0xFFe3e2e7); - static const Color onSurfaceVariant = Color(0xFFc1c6d7); + static const Color onSurface = Color(0xFFF3E9DF); // crème + static const Color onSurfaceVariant = Color(0xFFC5B3A5); // crème atténué // ============ BASE LEVEL 0 ============ - static const Color baseLevel0 = Color(0xFF0F1014); + /// Noir chaud — le "noir de salle", jamais un noir pur bleuté. + static const Color baseLevel0 = Color(0xFF0B0908); // ============ BACKGROUNDS ============ - static const Color background = Color(0xFF121317); - static const Color onBackground = Color(0xFFe3e2e7); + static const Color background = Color(0xFF100C0A); + static const Color onBackground = Color(0xFFF3E9DF); - static const Color surface = Color(0xFF121317); - static const Color surfaceDim = Color(0xFF121317); - static const Color surfaceBright = Color(0xFF38393d); + static const Color surface = Color(0xFF100C0A); + static const Color surfaceDim = Color(0xFF0B0908); + static const Color surfaceBright = Color(0xFF3C322C); - // Surface Containers (Material 3 hierarchy) - static const Color surfaceContainerLowest = Color(0xFF0d0e12); - static const Color surfaceContainerLow = Color(0xFF1a1b20); - static const Color surfaceContainer = Color(0xFF1f1f24); - static const Color surfaceContainerHigh = Color(0xFF292a2e); - static const Color surfaceContainerHighest = Color(0xFF343439); - static const Color surfaceVariant = Color(0xFF343439); + // Surface Containers (hiérarchie Material 3, toutes opaques) + static const Color surfaceContainerLowest = Color(0xFF070505); + static const Color surfaceContainerLow = Color(0xFF181310); + static const Color surfaceContainer = Color(0xFF1F1815); + static const Color surfaceContainerHigh = Color(0xFF2A211C); + static const Color surfaceContainerHighest = Color(0xFF352A24); + static const Color surfaceVariant = Color(0xFF352A24); - // ============ PRIMARY (Neon Blue) ============ - static const Color primary = Color(0xFFadc6ff); - static const Color onPrimary = Color(0xFF002e69); - static const Color primaryContainer = Color(0xFF4b8eff); - static const Color onPrimaryContainer = Color(0xFF00285c); - static const Color inversePrimary = Color(0xFF005bc1); - static const Color primaryFixed = Color(0xFFd8e2ff); - static const Color primaryFixedDim = Color(0xFFadc6ff); - static const Color onPrimaryFixed = Color(0xFF001a41); - static const Color onPrimaryFixedVariant = Color(0xFF004493); + // ============ PRIMARY (Ember / orange brûlé) ============ + static const Color primary = Color(0xFFFFB68C); // texte & icônes sur sombre + static const Color onPrimary = Color(0xFF521B00); + static const Color primaryContainer = Color(0xFFD9541F); // remplissage ember + static const Color onPrimaryContainer = Color(0xFF2B0A00); + static const Color inversePrimary = Color(0xFFA63B10); - // ============ SECONDARY ============ - static const Color secondary = Color(0xFFc6c5cf); - static const Color onSecondary = Color(0xFF2f3037); - static const Color secondaryContainer = Color(0xFF4a4b53); - static const Color onSecondaryContainer = Color(0xFFbcbbc4); - static const Color secondaryFixed = Color(0xFFe3e1eb); - static const Color secondaryFixedDim = Color(0xFFc6c5cf); - static const Color onSecondaryFixed = Color(0xFF1a1b22); - static const Color onSecondaryFixedVariant = Color(0xFF46464e); + /// Braise profonde — réservée aux **remplissages portant du texte**. + /// `primaryContainer` (#D9541F) est trop lumineux : blanc dessus plafonne + /// vers 3,9:1, sous le seuil AA de 4,5:1 pour du corps de texte. Cette + /// variante passe le seuil tout en restant la même couleur perçue. + static const Color primaryFill = Color(0xFFA8360C); + static const Color primaryFixed = Color(0xFFFFDBC8); + static const Color primaryFixedDim = Color(0xFFFFB68C); + static const Color onPrimaryFixed = Color(0xFF360F00); + static const Color onPrimaryFixedVariant = Color(0xFF7A2C08); - // ============ TERTIARY ============ - static const Color tertiary = Color(0xFFc6c6c7); - static const Color onTertiary = Color(0xFF2f3131); - static const Color tertiaryContainer = Color(0xFF909191); - static const Color onTertiaryContainer = Color(0xFF282a2a); - static const Color tertiaryFixed = Color(0xFFe2e2e2); - static const Color tertiaryFixedDim = Color(0xFFc6c6c7); - static const Color onTertiaryFixed = Color(0xFF1a1c1c); - static const Color onTertiaryFixedVariant = Color(0xFF454747); + // ============ SECONDARY (Terre cuite / argile) ============ + static const Color secondary = Color(0xFFE7C3AC); + static const Color onSecondary = Color(0xFF442A1B); + static const Color secondaryContainer = Color(0xFF5D4030); + static const Color onSecondaryContainer = Color(0xFFFFDCC8); + static const Color secondaryFixed = Color(0xFFFFDCC8); + static const Color secondaryFixedDim = Color(0xFFE7C3AC); + static const Color onSecondaryFixed = Color(0xFF2B160A); + static const Color onSecondaryFixedVariant = Color(0xFF5D4030); + + // ============ TERTIARY (Laiton / doré patiné) ============ + static const Color tertiary = Color(0xFFD9C88C); + static const Color onTertiary = Color(0xFF3A3016); + static const Color tertiaryContainer = Color(0xFF52472A); + static const Color onTertiaryContainer = Color(0xFFF6E4A6); + static const Color tertiaryFixed = Color(0xFFF6E4A6); + static const Color tertiaryFixedDim = Color(0xFFD9C88C); + static const Color onTertiaryFixed = Color(0xFF231B04); + static const Color onTertiaryFixedVariant = Color(0xFF52472A); // ============ ERROR ============ - static const Color error = Color(0xFFffb4ab); - static const Color onError = Color(0xFF690005); - static const Color errorContainer = Color(0xFF93000a); - static const Color onErrorContainer = Color(0xFFffdad6); + static const Color error = Color(0xFFFFB4A6); + static const Color onError = Color(0xFF5F1409); + static const Color errorContainer = Color(0xFF8C2416); + static const Color onErrorContainer = Color(0xFFFFDAD4); // ============ OUTLINE ============ - static const Color outline = Color(0xFF8b90a0); - static const Color outlineVariant = Color(0xFF414755); + static const Color outline = Color(0xFF9C8878); + static const Color outlineVariant = Color(0xFF4A3C33); // ============ INVERSE SURFACE ============ - static const Color inverseSurface = Color(0xFFe3e2e7); - static const Color inverseOnSurface = Color(0xFF2f3035); + static const Color inverseSurface = Color(0xFFF3E9DF); + static const Color inverseOnSurface = Color(0xFF2A211C); // ============ SURFACE TINT ============ - static const Color surfaceTint = Color(0xFFadc6ff); + static const Color surfaceTint = Color(0xFFFFB68C); - // ============ TEXT / CONTENT COLORS ============ - static const Color textPrimary = Color(0xFFe3e2e7); - static const Color textSecondary = Color(0xFFc1c6d7); - static const Color textTertiary = Color(0xFF8b90a0); + // ============ TEXT / CONTENT ============ + static const Color textPrimary = Color(0xFFF3E9DF); + static const Color textSecondary = Color(0xFFC5B3A5); + static const Color textTertiary = Color(0xFF9C8878); - // ============ STATUS COLORS ============ - static const Color success = Color(0xFF00E676); - static const Color warning = Color(0xFFFFAB00); - static const Color info = Color(0xFF2979FF); + // ============ CRÈME À OPACITÉ (remplace les Colors.whiteNN) ============ + // Déclarés `const` pour rester utilisables dans les widgets constants. + // Un blanc pur sur fond chaud tire vers le bleu : on décline la crème. + static const Color onSurface06 = Color(0x0FF3E9DF); + static const Color onSurface12 = Color(0x1FF3E9DF); + static const Color onSurface24 = Color(0x3DF3E9DF); + static const Color onSurface38 = Color(0x61F3E9DF); + static const Color onSurface54 = Color(0x8AF3E9DF); - // ============ CATEGORY COLORS (kept for semantic meaning) ============ - static const Color live = Color(0xFFFF5252); - static const Color movies = Color(0xFF448AFF); - static const Color series = Color(0xFF69F0AE); + // ============ STATUS ============ + static const Color success = Color(0xFF9BC46A); // olive lumineux + static const Color warning = Color(0xFFE9B23C); // ambre + static const Color info = Color(0xFFA3B8C4); // bleu-gris fumé + + // ============ CATÉGORIES ============ + static const Color live = Color(0xFFE5484D); // rouge enseigne + static const Color movies = Color(0xFFD9541F); // ember + static const Color series = Color(0xFFD9C88C); // laiton // ============ RATING / PREMIUM ============ - static const Color ratingGold = Color(0xFFFFD700); - static const Color premiumGold = Color(0xFFFFA000); + static const Color ratingGold = Color(0xFFE9B23C); + static const Color premiumGold = Color(0xFFC9922A); - // ============ GLASSMORPHISM LEVELS ============ - static const Color glassLevel1Bg = Color(0x66121317); // 40% opacity - static const Color glassLevel1Border = Color(0x1AFFFFFF); // 10% white + // ============ SHIMMER (placeholders de chargement) ============ + static const Color shimmer = Color(0xFF2A211C); + static const Color shimmerHighlight = Color(0xFF3C302A); - static const Color glassLevel2Bg = Color(0x99121317); // 60% opacity - static const Color glassLevel2Border = Color(0x1AFFFFFF); // 10% white - static const Color glassLevel2InnerGlow = Color(0x33adc6ff); // 20% primary top-left + // ============ SURFACES "GLASS" — désormais OPAQUES ============ + // Noms conservés pour compatibilité avec les 33 sites d'appel existants. + // Plus aucune transparence : zéro BackdropFilter, zéro repaint coûteux. + static const Color glassLevel1Bg = Color(0xFF181310); + static const Color glassLevel1Border = Color(0x14F3E9DF); // crème 8 % + + static const Color glassLevel2Bg = Color(0xFF1F1815); + static const Color glassLevel2Border = Color(0x1FF3E9DF); // crème 12 % + static const Color glassLevel2InnerGlow = Color(0x3DD9541F); // ember 24 % // ============ GRADIENTS ============ + /// Braise : orange brûlé vers rouge profond. static const LinearGradient primaryGradient = LinearGradient( - colors: [Color(0xFF007AFF), Color(0xFF00C6FF)], - begin: Alignment.centerLeft, - end: Alignment.centerRight, + colors: [Color(0xFFE9701F), Color(0xFFC13A1C)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, ); + /// Fond de salle : projecteur chaud en haut, obscurité en bas. static const LinearGradient backgroundGradient = LinearGradient( - colors: [Color(0xFF0F1014), Color(0xFF121317)], + colors: [Color(0xFF1A1310), Color(0xFF0B0908)], begin: Alignment.topCenter, end: Alignment.bottomCenter, ); - // ============ GLOW / SHADOWS ============ + /// Voile d'affiche : lecture du texte par-dessus une jaquette. + static const LinearGradient posterScrim = LinearGradient( + colors: [Color(0x000B0908), Color(0xCC0B0908), Color(0xFF0B0908)], + stops: [0.0, 0.55, 1.0], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ); + + /// Voile latéral pour les héros pleine largeur. + static const LinearGradient heroScrim = LinearGradient( + colors: [Color(0xF20B0908), Color(0x990B0908), Color(0x000B0908)], + stops: [0.0, 0.45, 1.0], + begin: Alignment.centerLeft, + end: Alignment.centerRight, + ); + + // ============ GLOW / OMBRES ============ static Color glowPrimary(double opacity) => - const Color(0xFF007AFF).withOpacity(opacity); + const Color(0xFFD9541F).withValues(alpha: opacity); static Color glowPrimaryDim(double opacity) => - const Color(0xFFadc6ff).withOpacity(opacity); + const Color(0xFFFFB68C).withValues(alpha: opacity); + + /// Ombre portée « projecteur » : profonde, chaude, jamais grise. + static List lift({double intensity = 1.0}) => [ + BoxShadow( + color: const Color(0xFF000000).withValues(alpha: 0.55 * intensity), + blurRadius: 28 * intensity, + spreadRadius: -8, + offset: Offset(0, 12 * intensity), + ), + ]; + + /// Halo ember pour l'élément focalisé (navigation TV / télécommande). + static List emberFocus({double intensity = 1.0}) => [ + BoxShadow( + color: const Color(0xFFD9541F).withValues(alpha: 0.45 * intensity), + blurRadius: 32 * intensity, + spreadRadius: -4, + ), + BoxShadow( + color: const Color(0xFF000000).withValues(alpha: 0.6), + blurRadius: 24, + spreadRadius: -10, + offset: const Offset(0, 14), + ), + ]; // ============ COLOR SCHEMES ============ static ColorScheme get darkColorScheme => const ColorScheme.dark( @@ -149,6 +218,7 @@ class AppColors { onErrorContainer: onErrorContainer, surface: surface, onSurface: onSurface, + onSurfaceVariant: onSurfaceVariant, surfaceContainerLowest: surfaceContainerLowest, surfaceContainerLow: surfaceContainerLow, surfaceContainer: surfaceContainer, @@ -162,24 +232,27 @@ class AppColors { brightness: Brightness.dark, ); - // Light scheme is minimal — Stitch is dark-only + /// Thème clair : « papier kraft » — même famille chaude, inversée. static ColorScheme get lightColorScheme => const ColorScheme.light( - primary: Color(0xFF005bc1), + primary: Color(0xFFA63B10), onPrimary: Colors.white, - primaryContainer: Color(0xFFd8e2ff), - onPrimaryContainer: Color(0xFF001a41), - secondary: Color(0xFF5e5c68), + primaryContainer: Color(0xFFFFDBC8), + onPrimaryContainer: Color(0xFF360F00), + secondary: Color(0xFF765847), onSecondary: Colors.white, - secondaryContainer: Color(0xFFe3e1eb), - onSecondaryContainer: Color(0xFF1a1b22), - error: Color(0xFFba1a1a), + secondaryContainer: Color(0xFFFFDCC8), + onSecondaryContainer: Color(0xFF2B160A), + tertiary: Color(0xFF6A5F3F), + onTertiary: Colors.white, + error: Color(0xFFB3261E), onError: Colors.white, - errorContainer: Color(0xFFFFdad6), - onErrorContainer: Color(0xFF410002), - surface: Color(0xFFF9F9FF), - onSurface: Color(0xFF1a1b22), - outline: Color(0xFF757680), - outlineVariant: Color(0xFFc5c6d0), + errorContainer: Color(0xFFFFDAD4), + onErrorContainer: Color(0xFF410E05), + surface: Color(0xFFFBF3EC), + onSurface: Color(0xFF201A16), + onSurfaceVariant: Color(0xFF52443B), + outline: Color(0xFF847369), + outlineVariant: Color(0xFFD6C3B7), brightness: Brightness.light, ); } diff --git a/lib/core/theme/app_theme.dart b/lib/core/theme/app_theme.dart index 737af08..e349326 100644 --- a/lib/core/theme/app_theme.dart +++ b/lib/core/theme/app_theme.dart @@ -2,15 +2,15 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'app_colors.dart'; -/// XtremFlow Cyber-Cinematic Glass Theme +/// XtremFlow — Thème « Warm Cinema » /// -/// Design system extracted from Google Stitch. -/// Fonts: Space Grotesk (headlines) + Inter (body/labels) -/// Style: Dark-only glassmorphism with neon blue accents. +/// Typo : Fraunces (display, serif éditorial) + Karla (corps / UI). +/// Style : charbon chaud, crème, orange brûlé. Profondeur par l'ombre, +/// jamais par le flou — aucun `BackdropFilter` dans tout le thème. class AppTheme { AppTheme._(); - // ============ SPACING (8px rhythmic system) ============ + // ============ ESPACEMENT (rythme 4 / 8) ============ static const double spacingXs = 4.0; static const double spacingSm = 8.0; static const double spacingBase = 8.0; @@ -20,33 +20,69 @@ class AppTheme { static const double spacing2xl = 48.0; static const double spacing3xl = 80.0; - // ============ RADIUS ============ + // Alias numériques (utilisés dans plusieurs écrans) + static const double spacing4 = 4.0; + static const double spacing8 = 8.0; + static const double spacing12 = 12.0; + static const double spacing16 = 16.0; + static const double spacing24 = 24.0; + static const double spacing32 = 32.0; + static const double spacing48 = 48.0; + + // ============ RAYONS ============ + // Cinéma : angles doux mais assumés, jamais des bulles. static const double radiusNone = 0.0; - static const double radiusSm = 8.0; - static const double radiusMd = 12.0; - static const double radiusLg = 16.0; - static const double radiusXl = 24.0; + static const double radiusSm = 6.0; + static const double radiusMd = 10.0; + static const double radiusLg = 14.0; + static const double radiusXl = 20.0; static const double radiusFull = 9999.0; // ============ ANIMATION ============ - static const Duration durationFast = Duration(milliseconds: 200); - static const Duration durationNormal = Duration(milliseconds: 300); - static const Duration durationSm = Duration(milliseconds: 200); - static const Duration durationMd = Duration(milliseconds: 300); - static const Duration durationLg = Duration(milliseconds: 400); - static const Duration durationXl = Duration(milliseconds: 500); - static const Curve curveDefault = Curves.fastOutSlowIn; - static const Curve curveSmooth = Curves.fastOutSlowIn; + // Rythme lent, « fondu de projection ». + static const Duration durationXs = Duration(milliseconds: 120); + static const Duration durationFast = Duration(milliseconds: 180); + static const Duration durationNormal = Duration(milliseconds: 260); + static const Duration durationSm = Duration(milliseconds: 180); + static const Duration durationMd = Duration(milliseconds: 260); + static const Duration durationLg = Duration(milliseconds: 380); + static const Duration durationXl = Duration(milliseconds: 520); - // ============ TYPOGRAPHY HELPERS ============ - static TextStyle _spaceGrotesk({ + static const Curve curveDefault = Curves.easeOutCubic; + static const Curve curveSmooth = Curves.easeOutCubic; + + /// Courbe « entrée cinéma » : démarre vite, s'installe lentement. + static const Curve curveCinema = Cubic(0.16, 1.0, 0.3, 1.0); + + // ============ TYPOGRAPHIE ============ + /// Display serif éditorial — titres, héros, chiffres marquants. + static TextStyle display({ + required double fontSize, + required FontWeight fontWeight, + double? letterSpacing, + double? height, + Color color = AppColors.onSurface, + FontStyle? fontStyle, + }) { + return GoogleFonts.fraunces( + fontSize: fontSize, + fontWeight: fontWeight, + letterSpacing: letterSpacing, + height: height, + color: color, + fontStyle: fontStyle, + ); + } + + /// Corps / UI — humaniste chaud, très lisible à distance TV. + static TextStyle body({ required double fontSize, required FontWeight fontWeight, double? letterSpacing, double? height, Color color = AppColors.onSurface, }) { - return GoogleFonts.spaceGrotesk( + return GoogleFonts.karla( fontSize: fontSize, fontWeight: fontWeight, letterSpacing: letterSpacing, @@ -55,137 +91,178 @@ class AppTheme { ); } - static TextStyle _inter({ + /// Micro-label capitales espacées — « GÉNÉRIQUE DE FILM ». + static TextStyle eyebrow({ + double fontSize = 11, + Color color = AppColors.textTertiary, + FontWeight fontWeight = FontWeight.w700, + }) { + return GoogleFonts.karla( + fontSize: fontSize, + fontWeight: fontWeight, + letterSpacing: 1.6, + height: 1.1, + color: color, + ); + } + + // Alias internes historiques + static TextStyle _display({ required double fontSize, required FontWeight fontWeight, double? letterSpacing, double? height, Color color = AppColors.onSurface, - }) { - return GoogleFonts.inter( - fontSize: fontSize, - fontWeight: fontWeight, - letterSpacing: letterSpacing, - height: height, - color: color, - ); - } + }) => + display( + fontSize: fontSize, + fontWeight: fontWeight, + letterSpacing: letterSpacing, + height: height, + color: color, + ); - // ============ DARK THEME (Main) ============ + static TextStyle _body({ + required double fontSize, + required FontWeight fontWeight, + double? letterSpacing, + double? height, + Color color = AppColors.onSurface, + }) => + body( + fontSize: fontSize, + fontWeight: fontWeight, + letterSpacing: letterSpacing, + height: height, + color: color, + ); + + // ============ THÈME SOMBRE (principal) ============ static ThemeData get darkTheme { final baseTheme = ThemeData.dark(useMaterial3: true); return baseTheme.copyWith( colorScheme: AppColors.darkColorScheme, scaffoldBackgroundColor: AppColors.background, + canvasColor: AppColors.background, + splashColor: AppColors.primaryContainer.withValues(alpha: 0.12), + highlightColor: AppColors.primaryContainer.withValues(alpha: 0.08), - // Typography textTheme: TextTheme( - // Display / Headline (Space Grotesk) - displayLarge: _spaceGrotesk( - fontSize: 48, + // Display — Fraunces, serrée, autoritaire + displayLarge: _display( + fontSize: 56, fontWeight: FontWeight.w700, - letterSpacing: -0.02, - height: 1.1, + letterSpacing: -1.4, + height: 1.02, ), - displayMedium: _spaceGrotesk( + displayMedium: _display( + fontSize: 40, + fontWeight: FontWeight.w600, + letterSpacing: -0.9, + height: 1.08, + ), + displaySmall: _display( + fontSize: 30, + fontWeight: FontWeight.w600, + letterSpacing: -0.5, + height: 1.15, + ), + headlineLarge: _display( fontSize: 32, fontWeight: FontWeight.w600, - letterSpacing: -0.01, - height: 1.2, + letterSpacing: -0.6, + height: 1.12, ), - displaySmall: _spaceGrotesk( + headlineMedium: _display( fontSize: 24, - fontWeight: FontWeight.w500, - height: 1.3, - ), - headlineLarge: _spaceGrotesk( - fontSize: 32, fontWeight: FontWeight.w600, - letterSpacing: -0.01, + letterSpacing: -0.3, height: 1.2, ), - headlineMedium: _spaceGrotesk( - fontSize: 24, - fontWeight: FontWeight.w500, - height: 1.3, - ), - headlineSmall: _spaceGrotesk( - fontSize: 20, - fontWeight: FontWeight.w500, - height: 1.3, - ), - titleLarge: _spaceGrotesk( + headlineSmall: _display( fontSize: 20, fontWeight: FontWeight.w600, + letterSpacing: -0.2, + height: 1.25, ), - titleMedium: _inter( + titleLarge: _display( + fontSize: 19, + fontWeight: FontWeight.w600, + letterSpacing: -0.1, + ), + titleMedium: _body( fontSize: 16, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w700, + letterSpacing: 0.1, ), - titleSmall: _inter( + titleSmall: _body( fontSize: 14, - fontWeight: FontWeight.w600, + fontWeight: FontWeight.w700, + letterSpacing: 0.2, ), - // Body (Inter) - bodyLarge: _inter( - fontSize: 18, + // Corps — Karla + bodyLarge: _body( + fontSize: 17, fontWeight: FontWeight.w400, - height: 1.6, + height: 1.62, color: AppColors.onSurfaceVariant, ), - bodyMedium: _inter( - fontSize: 16, + bodyMedium: _body( + fontSize: 15, fontWeight: FontWeight.w400, - height: 1.5, + height: 1.55, color: AppColors.onSurfaceVariant, ), - bodySmall: _inter( - fontSize: 14, + bodySmall: _body( + fontSize: 13, fontWeight: FontWeight.w400, - height: 1.4, + height: 1.45, color: AppColors.onSurfaceVariant, ), - // Labels (Inter with tracking) - labelLarge: _inter( - fontSize: 14, - fontWeight: FontWeight.w600, - letterSpacing: 0.05, + // Labels — capitales espacées, esprit générique de film + labelLarge: _body( + fontSize: 13, + fontWeight: FontWeight.w700, + letterSpacing: 1.1, height: 1.2, ), - labelMedium: _inter( + labelMedium: _body( fontSize: 12, - fontWeight: FontWeight.w500, - letterSpacing: 0.02, + fontWeight: FontWeight.w600, + letterSpacing: 0.9, height: 1.2, ), - labelSmall: _inter( + labelSmall: _body( fontSize: 11, - fontWeight: FontWeight.w500, - letterSpacing: 0.02, + fontWeight: FontWeight.w600, + letterSpacing: 1.4, height: 1.2, + color: AppColors.textTertiary, ), ), - // AppBar: Transparent glass + // AppBar : plate, sans élévation, le fond fait le travail appBarTheme: AppBarTheme( backgroundColor: Colors.transparent, + surfaceTintColor: Colors.transparent, foregroundColor: AppColors.onSurface, elevation: 0, - centerTitle: true, + centerTitle: false, scrolledUnderElevation: 0, - titleTextStyle: _spaceGrotesk( - fontSize: 20, + titleTextStyle: _display( + fontSize: 22, fontWeight: FontWeight.w600, + letterSpacing: -0.3, ), ), - // Inputs: Dark filled with blue glow on focus + // Champs : creusés dans la surface, liseré ember au focus inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: AppColors.surfaceContainerLow, contentPadding: const EdgeInsets.symmetric( - horizontal: spacingLg, + horizontal: spacingMd, vertical: spacingMd, ), border: OutlineInputBorder( @@ -198,84 +275,116 @@ class AppTheme { ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(radiusMd), - borderSide: const BorderSide(color: AppColors.primaryContainer, width: 2), + borderSide: + const BorderSide(color: AppColors.primaryContainer, width: 2), ), errorBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(radiusMd), borderSide: const BorderSide(color: AppColors.error, width: 1), ), - hintStyle: _inter( - fontSize: 16, + focusedErrorBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(radiusMd), + borderSide: const BorderSide(color: AppColors.error, width: 2), + ), + hintStyle: _body( + fontSize: 15, fontWeight: FontWeight.w400, - color: AppColors.outline, - ), - labelStyle: _inter( - fontSize: 14, - fontWeight: FontWeight.w500, - color: AppColors.onSurfaceVariant, + color: AppColors.textTertiary, ), + labelStyle: eyebrow(color: AppColors.onSurfaceVariant), + floatingLabelStyle: eyebrow(color: AppColors.primary), ), - // Buttons: Gradient primary, ghost secondary + // Boutons pleins : ember franc, coins nets filledButtonTheme: FilledButtonThemeData( style: FilledButton.styleFrom( - backgroundColor: AppColors.primaryContainer, - foregroundColor: AppColors.onPrimaryContainer, + backgroundColor: AppColors.primaryFill, + foregroundColor: Colors.white, + disabledBackgroundColor: AppColors.surfaceContainerHigh, + disabledForegroundColor: AppColors.textTertiary, elevation: 0, - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14), + padding: const EdgeInsets.symmetric(horizontal: 26, vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusMd), ), - textStyle: _inter( - fontSize: 14, - fontWeight: FontWeight.w600, - letterSpacing: 0.05, + textStyle: _body( + fontSize: 13, + fontWeight: FontWeight.w700, + letterSpacing: 1.1, ), ).copyWith( overlayColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.hovered)) { - return Colors.white.withOpacity(0.1); - } if (states.contains(WidgetState.pressed)) { - return Colors.white.withOpacity(0.2); + return Colors.black.withValues(alpha: 0.18); + } + if (states.contains(WidgetState.hovered) || + states.contains(WidgetState.focused)) { + return AppColors.onSurface.withValues(alpha: 0.12); } return null; }), ), ), - // Outlined buttons: ghost style + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: AppColors.surfaceContainerHigh, + foregroundColor: AppColors.onSurface, + elevation: 0, + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 15), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(radiusMd), + ), + textStyle: _body( + fontSize: 13, + fontWeight: FontWeight.w700, + letterSpacing: 1.1, + ), + ), + ), + + // Boutons contour : liseré crème discret outlinedButtonTheme: OutlinedButtonThemeData( style: OutlinedButton.styleFrom( foregroundColor: AppColors.onSurface, side: const BorderSide(color: AppColors.outlineVariant, width: 1), - padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 14), + padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 15), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusMd), ), - textStyle: _inter( - fontSize: 14, - fontWeight: FontWeight.w600, - letterSpacing: 0.05, + textStyle: _body( + fontSize: 13, + fontWeight: FontWeight.w700, + letterSpacing: 1.1, ), ), ), - // Text buttons textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom( foregroundColor: AppColors.primary, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10), - textStyle: _inter( - fontSize: 14, - fontWeight: FontWeight.w600, + padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 10), + textStyle: _body( + fontSize: 13, + fontWeight: FontWeight.w700, + letterSpacing: 0.8, ), ), ), - // Cards: Glass style + iconButtonTheme: IconButtonThemeData( + style: IconButton.styleFrom( + foregroundColor: AppColors.onSurfaceVariant, + hoverColor: AppColors.primaryContainer.withValues(alpha: 0.14), + highlightColor: AppColors.primaryContainer.withValues(alpha: 0.2), + ), + ), + + // Cartes : surface opaque + ombre profonde (zéro blur) cardTheme: CardThemeData( - color: AppColors.glassLevel1Bg, + color: AppColors.surfaceContainerLow, + surfaceTintColor: Colors.transparent, + shadowColor: Colors.black, elevation: 0, margin: EdgeInsets.zero, shape: RoundedRectangleBorder( @@ -284,115 +393,239 @@ class AppTheme { ), ), - // Dialogs: Floating glass + // Dialogues : bloc opaque flottant dialogTheme: DialogThemeData( - backgroundColor: AppColors.glassLevel2Bg, - elevation: 24, + backgroundColor: AppColors.surfaceContainer, + surfaceTintColor: Colors.transparent, + elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusXl), side: const BorderSide(color: AppColors.glassLevel2Border, width: 1), ), - titleTextStyle: _spaceGrotesk( - fontSize: 20, + titleTextStyle: _display( + fontSize: 22, fontWeight: FontWeight.w600, + letterSpacing: -0.3, ), - contentTextStyle: _inter( - fontSize: 16, + contentTextStyle: _body( + fontSize: 15, fontWeight: FontWeight.w400, + height: 1.55, color: AppColors.onSurfaceVariant, ), ), - // Bottom sheets bottomSheetTheme: const BottomSheetThemeData( - backgroundColor: AppColors.surfaceContainerLow, + backgroundColor: AppColors.surfaceContainer, + surfaceTintColor: Colors.transparent, + elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(radiusXl)), ), ), - // Snackbars snackBarTheme: SnackBarThemeData( - backgroundColor: AppColors.surfaceContainerHigh, - contentTextStyle: _inter( + backgroundColor: AppColors.surfaceContainerHighest, + contentTextStyle: _body( fontSize: 14, fontWeight: FontWeight.w500, color: AppColors.onSurface, ), + actionTextColor: AppColors.primary, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusMd), ), behavior: SnackBarBehavior.floating, + elevation: 0, ), - // Chips: Pill shaped + // Chips : étiquettes de bobine chipTheme: ChipThemeData( - backgroundColor: AppColors.primary.withOpacity(0.1), - deleteIconColor: AppColors.onSurface, - disabledColor: AppColors.surfaceContainerHighest, - selectedColor: AppColors.primaryContainer, - secondarySelectedColor: AppColors.primaryContainer, - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - shape: StadiumBorder( - side: BorderSide(color: AppColors.primary.withOpacity(0.3)), + backgroundColor: AppColors.surfaceContainerHigh, + deleteIconColor: AppColors.onSurfaceVariant, + disabledColor: AppColors.surfaceContainer, + selectedColor: AppColors.primaryFill, + secondarySelectedColor: AppColors.primaryFill, + checkmarkColor: Colors.white, + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + side: const BorderSide(color: AppColors.outlineVariant, width: 1), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(radiusSm), ), - labelStyle: _inter( - fontSize: 12, - fontWeight: FontWeight.w500, - color: AppColors.onSurface, - ), - secondaryLabelStyle: _inter( + labelStyle: _body( fontSize: 12, fontWeight: FontWeight.w600, - color: AppColors.onPrimaryContainer, + letterSpacing: 0.6, + color: AppColors.onSurfaceVariant, + ), + secondaryLabelStyle: _body( + fontSize: 12, + fontWeight: FontWeight.w700, + letterSpacing: 0.6, + color: Colors.white, ), ), - // Tabs + // Onglets : soulignement ember épais tabBarTheme: TabBarThemeData( labelColor: AppColors.onSurface, - unselectedLabelColor: AppColors.outline, + unselectedLabelColor: AppColors.textTertiary, indicatorColor: AppColors.primaryContainer, - labelStyle: _inter(fontSize: 14, fontWeight: FontWeight.w600), - unselectedLabelStyle: _inter(fontSize: 14, fontWeight: FontWeight.w500), + indicatorSize: TabBarIndicatorSize.label, + dividerColor: Colors.transparent, + labelStyle: _body( + fontSize: 14, + fontWeight: FontWeight.w700, + letterSpacing: 0.8, + ), + unselectedLabelStyle: _body( + fontSize: 14, + fontWeight: FontWeight.w500, + letterSpacing: 0.8, + ), + ), + + navigationRailTheme: NavigationRailThemeData( + backgroundColor: AppColors.surfaceContainerLowest, + indicatorColor: AppColors.primaryContainer.withValues(alpha: 0.22), + selectedIconTheme: const IconThemeData(color: AppColors.primary), + unselectedIconTheme: const IconThemeData(color: AppColors.textTertiary), + selectedLabelTextStyle: eyebrow(color: AppColors.primary), + unselectedLabelTextStyle: eyebrow(color: AppColors.textTertiary), + ), + + navigationBarTheme: NavigationBarThemeData( + backgroundColor: AppColors.surfaceContainerLowest, + surfaceTintColor: Colors.transparent, + indicatorColor: AppColors.primaryContainer.withValues(alpha: 0.22), + elevation: 0, + labelTextStyle: WidgetStateProperty.resolveWith( + (states) => eyebrow( + color: states.contains(WidgetState.selected) + ? AppColors.primary + : AppColors.textTertiary, + ), + ), + iconTheme: WidgetStateProperty.resolveWith( + (states) => IconThemeData( + color: states.contains(WidgetState.selected) + ? AppColors.primary + : AppColors.textTertiary, + size: 24, + ), + ), ), - // Divider dividerTheme: const DividerThemeData( color: AppColors.outlineVariant, thickness: 1, + space: 1, ), - // Scrollbar scrollbarTheme: ScrollbarThemeData( thumbColor: WidgetStateProperty.all(AppColors.outlineVariant), trackColor: WidgetStateProperty.all(Colors.transparent), - radius: const Radius.circular(4), - thickness: WidgetStateProperty.all(6), + radius: const Radius.circular(2), + thickness: WidgetStateProperty.all(5), + ), + + progressIndicatorTheme: const ProgressIndicatorThemeData( + color: AppColors.primaryContainer, + linearTrackColor: AppColors.surfaceContainerHigh, + circularTrackColor: Colors.transparent, + ), + + sliderTheme: SliderThemeData( + activeTrackColor: AppColors.primaryContainer, + inactiveTrackColor: AppColors.surfaceContainerHigh, + thumbColor: AppColors.primary, + overlayColor: AppColors.primaryContainer.withValues(alpha: 0.18), + trackHeight: 4, ), - // Switch switchTheme: SwitchThemeData( thumbColor: WidgetStateProperty.resolveWith((states) { - if (states.contains(WidgetState.selected)) { - return AppColors.onPrimary; - } + if (states.contains(WidgetState.selected)) return AppColors.onSurface; return AppColors.outline; }), trackColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.selected)) { return AppColors.primaryContainer; } - return AppColors.surfaceContainerHighest; + return AppColors.surfaceContainerHigh; }), + trackOutlineColor: + WidgetStateProperty.all(AppColors.outlineVariant), + ), + + checkboxTheme: CheckboxThemeData( + fillColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.selected)) { + return AppColors.primaryContainer; + } + return Colors.transparent; + }), + checkColor: WidgetStateProperty.all(AppColors.onSurface), + side: const BorderSide(color: AppColors.outline, width: 1.5), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(4), + ), + ), + + tooltipTheme: TooltipThemeData( + decoration: BoxDecoration( + color: AppColors.surfaceContainerHighest, + borderRadius: BorderRadius.circular(radiusSm), + border: Border.all(color: AppColors.outlineVariant), + ), + textStyle: _body( + fontSize: 12, + fontWeight: FontWeight.w500, + color: AppColors.onSurface, + ), + ), + + listTileTheme: ListTileThemeData( + iconColor: AppColors.onSurfaceVariant, + textColor: AppColors.onSurface, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(radiusMd), + ), + ), + + popupMenuTheme: PopupMenuThemeData( + color: AppColors.surfaceContainerHigh, + surfaceTintColor: Colors.transparent, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(radiusMd), + side: const BorderSide(color: AppColors.outlineVariant), + ), + textStyle: _body(fontSize: 14, fontWeight: FontWeight.w500), ), ); } - // Light theme is minimal — Stitch is dark-only - static ThemeData get lightTheme => ThemeData.light(useMaterial3: true).copyWith( - colorScheme: AppColors.lightColorScheme, - scaffoldBackgroundColor: AppColors.lightColorScheme.surface, - textTheme: GoogleFonts.interTextTheme(ThemeData.light().textTheme), - ); + // ============ THÈME CLAIR (« papier kraft ») ============ + static ThemeData get lightTheme { + final scheme = AppColors.lightColorScheme; + return ThemeData.light(useMaterial3: true).copyWith( + colorScheme: scheme, + scaffoldBackgroundColor: scheme.surface, + textTheme: GoogleFonts.karlaTextTheme(ThemeData.light().textTheme), + appBarTheme: AppBarTheme( + backgroundColor: Colors.transparent, + surfaceTintColor: Colors.transparent, + foregroundColor: scheme.onSurface, + elevation: 0, + centerTitle: false, + titleTextStyle: GoogleFonts.fraunces( + fontSize: 22, + fontWeight: FontWeight.w600, + letterSpacing: -0.3, + color: scheme.onSurface, + ), + ), + ); + } } diff --git a/lib/core/widgets/components/hero_carousel.dart b/lib/core/widgets/components/hero_carousel.dart index 4523dea..f102b95 100644 --- a/lib/core/widgets/components/hero_carousel.dart +++ b/lib/core/widgets/components/hero_carousel.dart @@ -140,7 +140,7 @@ class _HeroCarouselState extends State { children: [ Text( item.title, - style: GoogleFonts.spaceGrotesk( + style: GoogleFonts.fraunces( fontSize: 32, fontWeight: FontWeight.bold, color: AppColors.onSurface, @@ -152,7 +152,7 @@ class _HeroCarouselState extends State { const SizedBox(height: 8), Text( item.subtitle!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, color: AppColors.onSurface, ), @@ -245,7 +245,7 @@ class _HeroButtonState extends State<_HeroButton> { const SizedBox(width: 8), Text( widget.label, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontWeight: FontWeight.w600, ), diff --git a/lib/core/widgets/components/ui_components.dart b/lib/core/widgets/components/ui_components.dart index a08e3c9..d14348f 100644 --- a/lib/core/widgets/components/ui_components.dart +++ b/lib/core/widgets/components/ui_components.dart @@ -149,7 +149,7 @@ class _GradientButtonState extends State ], Text( widget.label, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontWeight: FontWeight.w600, fontSize: 14, @@ -253,7 +253,7 @@ class LiveBadge extends StatelessWidget { const SizedBox(width: 4), Text( 'LIVE', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontSize: 10, fontWeight: FontWeight.w700, @@ -302,7 +302,7 @@ class CategoryChip extends StatelessWidget { ), child: Text( label, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 13, fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500, color: isSelected ? AppColors.primary : AppColors.onSurfaceVariant, @@ -458,7 +458,7 @@ class _MediaCardState extends State const SizedBox(width: 4), Text( widget.rating!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontSize: 10, fontWeight: FontWeight.w700, @@ -502,7 +502,7 @@ class _MediaCardState extends State textAlign: TextAlign.center, maxLines: 1, overflow: TextOverflow.ellipsis, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: _isHovered ? AppColors.primary : AppColors.onSurface, @@ -518,7 +518,7 @@ class _MediaCardState extends State textAlign: TextAlign.center, maxLines: 1, overflow: TextOverflow.ellipsis, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurfaceVariant, fontSize: 11, ), diff --git a/lib/core/widgets/digital_clock.dart b/lib/core/widgets/digital_clock.dart index 002ad2e..12d6b44 100644 --- a/lib/core/widgets/digital_clock.dart +++ b/lib/core/widgets/digital_clock.dart @@ -32,13 +32,13 @@ class _DigitalClockState extends State { return Container( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: AppColors.onSurface.withOpacity(0.1), borderRadius: BorderRadius.circular(20), - border: Border.all(color: Colors.white.withOpacity(0.05)), + border: Border.all(color: AppColors.onSurface.withOpacity(0.05)), ), child: Text( timeString, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontWeight: FontWeight.w600, fontSize: 16, color: AppColors.onSurface, diff --git a/lib/core/widgets/glass_container.dart b/lib/core/widgets/glass_container.dart index 294d041..be4985e 100644 --- a/lib/core/widgets/glass_container.dart +++ b/lib/core/widgets/glass_container.dart @@ -1,12 +1,19 @@ -import 'dart:ui'; import 'package:flutter/material.dart'; import '../theme/app_colors.dart'; -/// Glassmorphism container with 3 depth levels (Stitch Design System) +/// Conteneur de surface « Warm Cinema » — 3 niveaux de profondeur. /// -/// Level 0: Pure base background (#0F1014), no blur. -/// Level 1: Translucent layer with backdrop blur 20px, 1px border 10% white. -/// Level 2: High-blur floating container with subtle inner glow in primary accent. +/// Level 0 : socle brut (#0B0908), aucune ombre. +/// Level 1 : plaque opaque légèrement éclaircie, liseré crème 8 %, ombre douce. +/// Level 2 : bloc flottant, liseré ember sur l'arête haute, ombre profonde. +/// +/// PERF : cette version n'utilise **aucun** `BackdropFilter`. Le flou de fond +/// forçait Flutter Web à relire le framebuffer à chaque frame pour chaque +/// carte à l'écran (33 sites d'appel ici) — cause principale du jank au +/// scroll. La profondeur est désormais rendue par des surfaces opaques +/// pré-teintées et des ombres, ce qui coûte quasiment rien au GPU. +/// +/// L'API publique est inchangée : aucun site d'appel n'a besoin d'être modifié. enum GlassLevel { level0, level1, level2 } class GlassContainer extends StatelessWidget { @@ -21,6 +28,14 @@ class GlassContainer extends StatelessWidget { final bool border; final List? boxShadow; + /// Alias de [border] (nom utilisé par les widgets de navigation TV). + /// Prioritaire sur [border] lorsqu'il est fourni. + final bool? hasBorder; + + /// Passer `false` supprime toute ombre portée — utile pour les barres + /// collées à un bord, où l'ombre créerait une couture visible. + final bool showShadow; + const GlassContainer({ super.key, required this.child, @@ -28,14 +43,18 @@ class GlassContainer extends StatelessWidget { this.height, this.padding = const EdgeInsets.all(16), this.margin, - this.borderRadius = 16.0, + this.borderRadius = 14.0, this.level = GlassLevel.level1, this.borderColor, this.border = true, this.boxShadow, + this.hasBorder, + this.showShadow = true, }); - /// Convenience constructor for Level 0 (pure base) + bool get _showBorder => hasBorder ?? border; + + /// Niveau 0 — socle brut. const GlassContainer.base({ super.key, required this.child, @@ -43,13 +62,15 @@ class GlassContainer extends StatelessWidget { this.height, this.padding = const EdgeInsets.all(16), this.margin, - this.borderRadius = 16.0, + this.borderRadius = 14.0, this.borderColor, this.border = false, this.boxShadow, + this.hasBorder, + this.showShadow = true, }) : level = GlassLevel.level0; - /// Convenience constructor for Level 1 (standard glass) + /// Niveau 1 — plaque standard. const GlassContainer.glass({ super.key, required this.child, @@ -57,13 +78,15 @@ class GlassContainer extends StatelessWidget { this.height, this.padding = const EdgeInsets.all(16), this.margin, - this.borderRadius = 16.0, + this.borderRadius = 14.0, this.borderColor, this.border = true, this.boxShadow, + this.hasBorder, + this.showShadow = true, }) : level = GlassLevel.level1; - /// Convenience constructor for Level 2 (floating with inner glow) + /// Niveau 2 — bloc flottant (modales, panneaux, overlays). const GlassContainer.floating({ super.key, required this.child, @@ -71,10 +94,12 @@ class GlassContainer extends StatelessWidget { this.height, this.padding = const EdgeInsets.all(16), this.margin, - this.borderRadius = 24.0, + this.borderRadius = 20.0, this.borderColor, this.border = true, this.boxShadow, + this.hasBorder, + this.showShadow = true, }) : level = GlassLevel.level2; @override @@ -98,12 +123,13 @@ class GlassContainer extends StatelessWidget { decoration: BoxDecoration( color: AppColors.baseLevel0, borderRadius: BorderRadius.circular(borderRadius), - border: border + border: _showBorder ? Border.all( color: borderColor ?? Colors.transparent, width: 1, ) : null, + boxShadow: showShadow ? boxShadow : null, ), child: child, ); @@ -114,34 +140,29 @@ class GlassContainer extends StatelessWidget { width: width, height: height, margin: margin, - child: ClipRRect( + padding: padding, + decoration: BoxDecoration( + color: AppColors.glassLevel1Bg, borderRadius: BorderRadius.circular(borderRadius), - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 20, sigmaY: 20), - child: Container( - padding: padding, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(borderRadius), - color: AppColors.glassLevel1Bg, - border: border - ? Border.all( - color: borderColor ?? AppColors.glassLevel1Border, - width: 1, - ) - : null, - boxShadow: boxShadow ?? - [ - BoxShadow( - color: Colors.black.withOpacity(0.2), - blurRadius: 20, - spreadRadius: -5, - ), - ], - ), - child: child, - ), - ), + border: _showBorder + ? Border.all( + color: borderColor ?? AppColors.glassLevel1Border, + width: 1, + ) + : null, + boxShadow: !showShadow + ? null + : boxShadow ?? + const [ + BoxShadow( + color: Color(0x59000000), // noir 35 % + blurRadius: 18, + spreadRadius: -6, + offset: Offset(0, 8), + ), + ], ), + child: child, ); } @@ -150,54 +171,222 @@ class GlassContainer extends StatelessWidget { width: width, height: height, margin: margin, - child: ClipRRect( - borderRadius: BorderRadius.circular(borderRadius), - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: 40, sigmaY: 40), - child: Container( - padding: padding, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(borderRadius), - color: AppColors.glassLevel2Bg, - border: border - ? Border( - top: BorderSide( - color: borderColor ?? AppColors.glassLevel2InnerGlow, - width: 1, - ), - left: BorderSide( - color: borderColor ?? AppColors.glassLevel2InnerGlow, - width: 1, - ), - right: BorderSide( - color: borderColor ?? AppColors.glassLevel2Border, - width: 1, - ), - bottom: BorderSide( - color: borderColor ?? AppColors.glassLevel2Border, - width: 1, - ), - ) - : null, - boxShadow: boxShadow ?? - [ - BoxShadow( - color: Colors.black.withOpacity(0.5), - blurRadius: 30, - spreadRadius: -10, - offset: const Offset(0, 10), - ), - BoxShadow( - color: AppColors.primary.withOpacity(0.1), - blurRadius: 40, - spreadRadius: -10, - ), - ], - ), - child: child, - ), + padding: padding, + decoration: BoxDecoration( + // Dégradé très court : arête haute captant la « lumière du projecteur ». + gradient: const LinearGradient( + colors: [Color(0xFF262019), Color(0xFF1F1815)], + stops: [0.0, 0.45], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, ), + borderRadius: BorderRadius.circular(borderRadius), + border: _showBorder + ? Border( + top: BorderSide( + color: borderColor ?? AppColors.glassLevel2InnerGlow, + width: 1, + ), + left: BorderSide( + color: borderColor ?? AppColors.glassLevel2Border, + width: 1, + ), + right: BorderSide( + color: borderColor ?? AppColors.glassLevel2Border, + width: 1, + ), + bottom: BorderSide( + color: borderColor ?? AppColors.glassLevel2Border, + width: 1, + ), + ) + : null, + boxShadow: !showShadow + ? null + : boxShadow ?? + const [ + BoxShadow( + color: Color(0xA6000000), // noir 65 % + blurRadius: 40, + spreadRadius: -12, + offset: Offset(0, 20), + ), + BoxShadow( + color: Color(0x1FD9541F), // halo ember 12 % + blurRadius: 48, + spreadRadius: -18, + ), + ], + ), + child: child, + ); + } +} + +/// Carte de surface interactive — variante cliquable de [GlassContainer]. +/// +/// Survol : la carte se soulève et son liseré passe à la braise. +/// Focus clavier / télécommande : halo ember net, indispensable en usage TV. +class GlassCard extends StatefulWidget { + final Widget child; + final double? width; + final double? height; + final EdgeInsetsGeometry padding; + final EdgeInsetsGeometry? margin; + final double borderRadius; + final GlassLevel level; + + /// Active les réactions au survol et au focus. + final bool interactive; + final VoidCallback? onTap; + + const GlassCard({ + super.key, + required this.child, + this.width, + this.height, + this.padding = const EdgeInsets.all(16), + this.margin, + this.borderRadius = 14.0, + this.level = GlassLevel.level1, + this.interactive = false, + this.onTap, + }); + + @override + State createState() => _GlassCardState(); +} + +class _GlassCardState extends State { + bool _hovered = false; + bool _focused = false; + + bool get _active => widget.interactive && (_hovered || _focused); + + @override + Widget build(BuildContext context) { + final surface = AnimatedContainer( + duration: const Duration(milliseconds: 180), + curve: Curves.easeOutCubic, + width: widget.width, + height: widget.height, + margin: widget.margin, + padding: widget.padding, + decoration: BoxDecoration( + color: widget.level == GlassLevel.level0 + ? AppColors.baseLevel0 + : (_active + ? AppColors.surfaceContainerHigh + : AppColors.glassLevel1Bg), + borderRadius: BorderRadius.circular(widget.borderRadius), + border: Border.all( + color: _active + ? AppColors.primaryContainer + : AppColors.glassLevel1Border, + width: _active ? 2 : 1, + ), + boxShadow: _active + ? AppColors.emberFocus() + : const [ + BoxShadow( + color: Color(0x59000000), + blurRadius: 18, + spreadRadius: -6, + offset: Offset(0, 8), + ), + ], + ), + // Le contenu est rogné pour que les affiches épousent le rayon. + child: ClipRRect( + borderRadius: BorderRadius.circular( + (widget.borderRadius - 1).clamp(0.0, widget.borderRadius), + ), + child: widget.child, + ), + ); + + if (!widget.interactive && widget.onTap == null) return surface; + + return FocusableActionDetector( + onShowFocusHighlight: (v) => setState(() => _focused = v), + onShowHoverHighlight: (v) => setState(() => _hovered = v), + mouseCursor: SystemMouseCursors.click, + actions: >{ + ActivateIntent: CallbackAction( + onInvoke: (_) { + widget.onTap?.call(); + return null; + }, + ), + }, + child: GestureDetector( + onTap: widget.onTap, + behavior: HitTestBehavior.opaque, + child: surface, ), ); } } + +/// Fond de scène « Warm Cinema ». +/// +/// Dégradé chaud + vignettage, sans image ni flou. Sert de toile de fond aux +/// écrans principaux pour éviter les aplats plats et sans atmosphère. +class CinemaBackdrop extends StatelessWidget { + final Widget child; + + /// Halo ember diffus en haut à gauche (lueur de projection). + final bool projectorGlow; + + const CinemaBackdrop({ + super.key, + required this.child, + this.projectorGlow = true, + }); + + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: const BoxDecoration( + gradient: AppColors.backgroundGradient, + ), + child: projectorGlow + ? Stack( + children: [ + Positioned.fill( + child: DecoratedBox( + decoration: BoxDecoration( + gradient: RadialGradient( + center: const Alignment(-0.75, -0.95), + radius: 1.25, + colors: [ + AppColors.primaryContainer.withValues(alpha: 0.10), + Colors.transparent, + ], + stops: const [0.0, 1.0], + ), + ), + ), + ), + // Vignettage bas : ancre le contenu, style projection. + Positioned.fill( + child: DecoratedBox( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomCenter, + end: Alignment.center, + colors: [ + Colors.black.withValues(alpha: 0.35), + Colors.transparent, + ], + ), + ), + ), + ), + child, + ], + ) + : child, + ); + } +} diff --git a/lib/core/widgets/hero_carousel.dart b/lib/core/widgets/hero_carousel.dart index 775d938..9209566 100644 --- a/lib/core/widgets/hero_carousel.dart +++ b/lib/core/widgets/hero_carousel.dart @@ -179,6 +179,9 @@ class _HeroCarouselState extends State Image.network( item.imageUrl!, fit: BoxFit.cover, + // Le heros est plein ecran : plafond a 1280 px, au-dela le gain + // visuel est nul et le cout de decodage explose. + cacheWidth: 1280, errorBuilder: (context, error, stackTrace) { return Container( color: AppColors.surface, @@ -220,7 +223,7 @@ class _HeroCarouselState extends State ), child: Text( item.badge!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, fontWeight: FontWeight.w700, color: AppColors.primary, @@ -233,7 +236,7 @@ class _HeroCarouselState extends State item.title, maxLines: 2, overflow: TextOverflow.ellipsis, - style: GoogleFonts.outfit( + style: GoogleFonts.karla( fontSize: 48, fontWeight: FontWeight.w800, color: AppColors.textPrimary, @@ -247,7 +250,7 @@ class _HeroCarouselState extends State item.subtitle!, maxLines: 2, overflow: TextOverflow.ellipsis, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w400, color: AppColors.textSecondary, @@ -292,7 +295,7 @@ class _HeroCarouselState extends State const SizedBox(width: 8), Text( 'Play', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w700, color: AppColors.primary, @@ -330,7 +333,7 @@ class _HeroCarouselState extends State const SizedBox(width: 8), Text( 'More Info', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w700, color: AppColors.textPrimary, diff --git a/lib/core/widgets/themed_loading_screen.dart b/lib/core/widgets/themed_loading_screen.dart index 79e3789..cb19148 100644 --- a/lib/core/widgets/themed_loading_screen.dart +++ b/lib/core/widgets/themed_loading_screen.dart @@ -2,43 +2,48 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import '../theme/app_colors.dart'; -/// Stitch-themed loading screen with dark gradient and blue accent. +/// Écran de chargement « Warm Cinema » — salle qui s'éteint avant projection. class ThemedLoading extends StatelessWidget { const ThemedLoading({super.key}); @override Widget build(BuildContext context) { - return Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment.bottomRight, - colors: [ - Color(0xFF0F1014), // Deep Space Dark - Color(0xFF121317), // Stitch background - ], - ), - ), + return const DecoratedBox( + decoration: BoxDecoration(gradient: AppColors.backgroundGradient), child: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ - const CircularProgressIndicator( - color: Color(0xFF4b8eff), // AppColors.primaryContainer - strokeWidth: 3, - ), - const SizedBox(height: 16), - Text( - 'Loading...', - style: GoogleFonts.inter( - color: AppColors.onSurfaceVariant, - fontSize: 14, - fontWeight: FontWeight.w500, + SizedBox( + width: 34, + height: 34, + child: CircularProgressIndicator( + color: AppColors.primaryContainer, + strokeWidth: 2, ), ), + SizedBox(height: 20), + _LoadingLabel(), ], ), ), ); } } + +class _LoadingLabel extends StatelessWidget { + const _LoadingLabel(); + + @override + Widget build(BuildContext context) { + return Text( + 'PROJECTION', + style: GoogleFonts.karla( + color: AppColors.textTertiary, + fontSize: 11, + fontWeight: FontWeight.w700, + letterSpacing: 3.2, + ), + ); + } +} diff --git a/lib/core/widgets/tv_modern_card.dart b/lib/core/widgets/tv_modern_card.dart index 72229a6..db78dc3 100644 --- a/lib/core/widgets/tv_modern_card.dart +++ b/lib/core/widgets/tv_modern_card.dart @@ -131,7 +131,7 @@ class _TvModernCardState extends State ), child: Text( widget.badge!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 10, fontWeight: FontWeight.w700, color: Colors.black, @@ -208,7 +208,7 @@ class _TvModernCardState extends State widget.title, maxLines: 2, overflow: TextOverflow.ellipsis, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -229,7 +229,7 @@ class _TvModernCardState extends State const SizedBox(width: 4), Text( widget.rating!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, fontWeight: FontWeight.w600, color: AppColors.textSecondary, @@ -241,7 +241,7 @@ class _TvModernCardState extends State if (widget.year != null) Text( widget.year!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, fontWeight: FontWeight.w400, color: AppColors.textTertiary, @@ -273,6 +273,11 @@ class _TvModernCardState extends State return CachedNetworkImage( imageUrl: widget.imageUrl!, fit: BoxFit.cover, + // Decodage borne a la taille d'affichage : une grille de 40 affiches + // passe de ~240 Mo a quelques dizaines de Mo en memoire GPU. + memCacheWidth: 400, + fadeInDuration: const Duration(milliseconds: 180), + fadeOutDuration: Duration.zero, placeholder: (context, url) => Container( color: AppColors.shimmer, child: const Center( @@ -326,7 +331,7 @@ class _TvModernCardState extends State const SizedBox(width: 6), Text( label, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, fontWeight: FontWeight.w700, color: Colors.black, diff --git a/lib/core/widgets/tv_nav_widgets.dart b/lib/core/widgets/tv_nav_widgets.dart index ea067b4..d7f195b 100644 --- a/lib/core/widgets/tv_nav_widgets.dart +++ b/lib/core/widgets/tv_nav_widgets.dart @@ -62,7 +62,7 @@ class _TvTopNavBarState extends State { const SizedBox(width: AppTheme.spacing16), Text( widget.title, - style: GoogleFonts.outfit( + style: GoogleFonts.karla( fontSize: 24, fontWeight: FontWeight.w700, color: AppColors.textPrimary, @@ -152,10 +152,10 @@ class _TvTopNavBarState extends State { ), child: Text( badge, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 10, fontWeight: FontWeight.w700, - color: Colors.white, + color: AppColors.onSurface, ), ), ), @@ -256,7 +256,7 @@ class _TvSideNavState extends State { Expanded( child: Text( item.label, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, fontWeight: FontWeight.w600, color: isSelected ? Colors.black : AppColors.textPrimary, @@ -364,7 +364,7 @@ class _TvFloatingMenuState extends State const SizedBox(width: AppTheme.spacing12), Text( widget.actions[index].label, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, fontWeight: FontWeight.w500, color: AppColors.textPrimary, diff --git a/lib/features/admin/screens/admin_panel.dart b/lib/features/admin/screens/admin_panel.dart index 182e3d9..15c1813 100644 --- a/lib/features/admin/screens/admin_panel.dart +++ b/lib/features/admin/screens/admin_panel.dart @@ -152,7 +152,7 @@ class _AdminContentState extends ConsumerState const SizedBox(width: 8), Text( label, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontWeight: FontWeight.w600, fontSize: 14, color: isSelected ? AppColors.textPrimary : AppColors.textSecondary, @@ -265,7 +265,7 @@ class _PlaylistsTab extends ConsumerWidget { style: Theme.of(context) .textTheme .titleMedium - ?.copyWith(color: Colors.white), + ?.copyWith(color: AppColors.onSurface), ), const SizedBox(height: 4), Text( @@ -273,7 +273,7 @@ class _PlaylistsTab extends ConsumerWidget { style: Theme.of(context) .textTheme .bodyMedium - ?.copyWith(color: Colors.white60), + ?.copyWith(color: AppColors.onSurface54), ), ], ), @@ -282,7 +282,7 @@ class _PlaylistsTab extends ConsumerWidget { children: [ IconButton( icon: const Icon(Icons.edit_outlined, size: 20), - color: Colors.white70, + color: AppColors.onSurfaceVariant, onPressed: () => _showPlaylistDialog(context, ref, playlist), tooltip: 'Edit', @@ -544,7 +544,7 @@ class _UsersTab extends ConsumerWidget { style: Theme.of(context) .textTheme .titleMedium - ?.copyWith(color: Colors.white), + ?.copyWith(color: AppColors.onSurface), ), if (user.isAdmin) ...[ const SizedBox(width: 8), @@ -576,7 +576,7 @@ class _UsersTab extends ConsumerWidget { style: Theme.of(context) .textTheme .bodyMedium - ?.copyWith(color: Colors.white60), + ?.copyWith(color: AppColors.onSurface54), ), ], ), @@ -584,7 +584,7 @@ class _UsersTab extends ConsumerWidget { PopupMenuButton( icon: const Icon( Icons.more_vert, - color: Colors.white70, + color: AppColors.onSurfaceVariant, ), color: AppColors.surface, shape: RoundedRectangleBorder( diff --git a/lib/features/auth/screens/login_screen.dart b/lib/features/auth/screens/login_screen.dart index 4aaad94..acbf671 100644 --- a/lib/features/auth/screens/login_screen.dart +++ b/lib/features/auth/screens/login_screen.dart @@ -144,7 +144,7 @@ class _LoginScreenState extends ConsumerState { // Title Text( 'XtremFlow', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 42, fontWeight: FontWeight.w700, color: AppColors.textPrimary, @@ -154,7 +154,7 @@ class _LoginScreenState extends ConsumerState { const SizedBox(height: 8), Text( 'Sign in to sync your playlists', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 18, color: AppColors.textSecondary, fontWeight: FontWeight.w400, @@ -266,7 +266,7 @@ class _LoginScreenState extends ConsumerState { ) : Text( 'Sign In', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.primary, fontSize: 18, fontWeight: FontWeight.w600, @@ -282,7 +282,7 @@ class _LoginScreenState extends ConsumerState { const SizedBox(height: 32), Text( 'Default: admin / admin', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, color: AppColors.textTertiary, ), @@ -310,13 +310,13 @@ class _LoginScreenState extends ConsumerState { return TextFormField( controller: controller, obscureText: obscureText, - style: GoogleFonts.inter(fontSize: 18, color: AppColors.textPrimary), + style: GoogleFonts.karla(fontSize: 18, color: AppColors.textPrimary), autofocus: autofocus, textInputAction: nextFocus ? TextInputAction.next : TextInputAction.done, onFieldSubmitted: isLast ? (_) => onSubmitted?.call() : null, decoration: InputDecoration( labelText: label, - labelStyle: GoogleFonts.inter(color: AppColors.textSecondary), + labelStyle: GoogleFonts.karla(color: AppColors.textSecondary), prefixIcon: Icon(icon, color: AppColors.textSecondary), suffixIcon: suffix, filled: true, diff --git a/lib/features/iptv/screens/player_screen.dart b/lib/features/iptv/screens/player_screen.dart index 9562b42..a62f0f1 100644 --- a/lib/features/iptv/screens/player_screen.dart +++ b/lib/features/iptv/screens/player_screen.dart @@ -446,7 +446,7 @@ class _PlayerScreenState extends ConsumerState { 'Unknown') .toString() : widget.title, - style: GoogleFonts.outfit( + style: GoogleFonts.karla( color: AppColors.textPrimary, fontSize: 18, fontWeight: FontWeight.w600, @@ -455,7 +455,7 @@ class _PlayerScreenState extends ConsumerState { ), Text( 'Live TV', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.primary, fontSize: 12, fontWeight: FontWeight.bold, @@ -512,7 +512,7 @@ class _PlayerScreenState extends ConsumerState { _buildInlineEpg(), const SizedBox(height: 12), const Divider( - color: Colors.white10, + color: AppColors.onSurface06, ), const SizedBox(height: 8), // Control Buttons @@ -612,10 +612,10 @@ class _PlayerScreenState extends ConsumerState { Expanded( child: Text( widget.title, - style: GoogleFonts.outfit( + style: GoogleFonts.karla( fontSize: 20, fontWeight: FontWeight.w600, - color: Colors.white, + color: AppColors.onSurface, ), ), ), @@ -639,7 +639,7 @@ class _PlayerScreenState extends ConsumerState { right: 40, child: GlassContainer.glass( borderRadius: 24, - borderColor: Colors.white.withOpacity(0.1), + borderColor: AppColors.onSurface.withOpacity(0.1), padding: const EdgeInsets.all(24), child: Column( mainAxisSize: MainAxisSize.min, @@ -653,8 +653,8 @@ class _PlayerScreenState extends ConsumerState { seconds: _currentPosition.toInt(), ), ), - style: GoogleFonts.inter( - color: Colors.white70, + style: GoogleFonts.karla( + color: AppColors.onSurfaceVariant, ), ), const SizedBox(width: 16), @@ -664,8 +664,8 @@ class _PlayerScreenState extends ConsumerState { trackHeight: 4, activeTrackColor: AppColors.primary, inactiveTrackColor: - Colors.white.withOpacity(0.2), - thumbColor: Colors.white, + AppColors.onSurface.withOpacity(0.2), + thumbColor: AppColors.onSurface, thumbShape: const RoundSliderThumbShape( enabledThumbRadius: 8, ), @@ -705,8 +705,8 @@ class _PlayerScreenState extends ConsumerState { seconds: _totalDuration.toInt(), ), ), - style: GoogleFonts.inter( - color: Colors.white70, + style: GoogleFonts.karla( + color: AppColors.onSurfaceVariant, ), ), ], @@ -784,7 +784,7 @@ class _PlayerScreenState extends ConsumerState { }) { // Button with direct Material/InkWell - PointerInterceptor is on outer container return Material( - color: transparent ? Colors.transparent : Colors.white.withOpacity(0.1), + color: transparent ? Colors.transparent : AppColors.onSurface.withOpacity(0.1), shape: const CircleBorder(), child: InkWell( onTap: () { @@ -800,9 +800,9 @@ class _PlayerScreenState extends ConsumerState { shape: BoxShape.circle, border: transparent ? null - : Border.all(color: Colors.white.withOpacity(0.1)), + : Border.all(color: AppColors.onSurface.withOpacity(0.1)), ), - child: Icon(icon, color: Colors.white, size: iconSize), + child: Icon(icon, color: AppColors.onSurface, size: iconSize), ), ), ); @@ -867,7 +867,7 @@ class _PlayerScreenState extends ConsumerState { return Material( color: highlighted ? AppColors.primary.withOpacity(0.2) - : Colors.white.withOpacity(0.1), + : AppColors.onSurface.withOpacity(0.1), shape: const CircleBorder(), child: InkWell( onTap: () { @@ -886,13 +886,13 @@ class _PlayerScreenState extends ConsumerState { border: Border.all( color: highlighted ? AppColors.primary.withOpacity(0.5) - : Colors.white.withOpacity(0.2), + : AppColors.onSurface.withOpacity(0.2), width: highlighted ? 2 : 1, ), ), child: Icon( icon, - color: highlighted ? AppColors.primary : Colors.white, + color: highlighted ? AppColors.primary : AppColors.onSurface, size: iconSize, ), ), @@ -930,7 +930,7 @@ class _PlayerScreenState extends ConsumerState { child: const Text( 'LIVE', style: TextStyle( - color: Colors.white, + color: AppColors.onSurface, fontSize: 11, fontWeight: FontWeight.bold, ), @@ -942,8 +942,8 @@ class _PlayerScreenState extends ConsumerState { widget.channels != null ? widget.channels![_currentIndex].name : widget.title, - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontSize: 16, fontWeight: FontWeight.w600, ), @@ -978,7 +978,7 @@ class _PlayerScreenState extends ConsumerState { child: const Text( 'LIVE', style: TextStyle( - color: Colors.white, + color: AppColors.onSurface, fontSize: 11, fontWeight: FontWeight.bold, ), @@ -992,8 +992,8 @@ class _PlayerScreenState extends ConsumerState { children: [ Text( currentProgram.title, - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontSize: 15, fontWeight: FontWeight.w600, ), @@ -1003,8 +1003,8 @@ class _PlayerScreenState extends ConsumerState { if (currentProgram.description.isNotEmpty) Text( currentProgram.description, - style: GoogleFonts.inter( - color: Colors.white60, + style: GoogleFonts.karla( + color: AppColors.onSurface54, fontSize: 12, ), maxLines: 1, @@ -1027,7 +1027,7 @@ class _PlayerScreenState extends ConsumerState { child: const Text( 'LIVE', style: TextStyle( - color: Colors.white, + color: AppColors.onSurface, fontSize: 11, fontWeight: FontWeight.bold, ), @@ -1038,8 +1038,8 @@ class _PlayerScreenState extends ConsumerState { widget.channels != null ? widget.channels![_currentIndex].name : widget.title, - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontSize: 16, fontWeight: FontWeight.w600, ), @@ -1050,8 +1050,8 @@ class _PlayerScreenState extends ConsumerState { widget.channels != null ? widget.channels![_currentIndex].name : widget.title, - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontSize: 16, fontWeight: FontWeight.w600, ), diff --git a/lib/features/iptv/screens/playlist_selection_screen.dart b/lib/features/iptv/screens/playlist_selection_screen.dart index f0b9f98..3b8e588 100644 --- a/lib/features/iptv/screens/playlist_selection_screen.dart +++ b/lib/features/iptv/screens/playlist_selection_screen.dart @@ -27,7 +27,7 @@ class PlaylistSelectionScreen extends ConsumerWidget { appBar: AppBar( title: Text( 'Select Playlist', - style: GoogleFonts.roboto( + style: GoogleFonts.karla( fontWeight: FontWeight.w600, color: AppColors.textPrimary, ), @@ -97,7 +97,7 @@ class PlaylistSelectionScreen extends ConsumerWidget { const SizedBox(height: 16), Text( 'Error loading playlists', - style: GoogleFonts.outfit( + style: GoogleFonts.karla( fontSize: 18, color: AppColors.textSecondary, ), @@ -109,7 +109,7 @@ class PlaylistSelectionScreen extends ConsumerWidget { backgroundColor: AppColors.primary, foregroundColor: AppColors.textPrimary, ), - child: Text('Retry', style: GoogleFonts.inter()), + child: Text('Retry', style: GoogleFonts.karla()), ), ], ), @@ -123,14 +123,14 @@ class PlaylistSelectionScreen extends ConsumerWidget { const Icon( Icons.playlist_remove, size: 64, - color: Colors.white24, + color: AppColors.onSurface24, ), const SizedBox(height: 16), Text( 'No playlists available', - style: GoogleFonts.outfit( + style: GoogleFonts.karla( fontSize: 18, - color: Colors.white60, + color: AppColors.onSurface54, ), ), const SizedBox(height: 8), @@ -138,9 +138,9 @@ class PlaylistSelectionScreen extends ConsumerWidget { currentUser?.isAdmin ?? false ? 'Add playlists in Admin Panel' : 'Contact administrator', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, - color: Colors.white38, + color: AppColors.onSurface38, ), ), ], @@ -209,13 +209,13 @@ class _PlaylistCardState extends State<_PlaylistCard> { duration: const Duration(milliseconds: 200), decoration: BoxDecoration( color: _isHovered - ? Colors.white.withOpacity(0.1) - : Colors.white.withOpacity(0.03), + ? AppColors.onSurface.withOpacity(0.1) + : AppColors.onSurface.withOpacity(0.03), borderRadius: BorderRadius.circular(24), border: Border.all( color: _isHovered ? AppColors.primary.withOpacity(0.5) - : Colors.white.withOpacity(0.08), + : AppColors.onSurface.withOpacity(0.08), width: 1.5, ), boxShadow: _isHovered @@ -245,8 +245,8 @@ class _PlaylistCardState extends State<_PlaylistCard> { begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ - Colors.white.withOpacity(0.1), - Colors.white.withOpacity(0.05), + AppColors.onSurface.withOpacity(0.1), + AppColors.onSurface.withOpacity(0.05), ], ), shape: BoxShape.circle, @@ -263,16 +263,16 @@ class _PlaylistCardState extends State<_PlaylistCard> { child: Icon( Icons.playlist_play_rounded, size: 32, - color: _isHovered ? Colors.white : Colors.white70, + color: _isHovered ? AppColors.onSurface : AppColors.onSurfaceVariant, ), ), const SizedBox(height: 20), Text( widget.playlist.name, - style: GoogleFonts.outfit( + style: GoogleFonts.karla( fontSize: 22, fontWeight: FontWeight.bold, - color: Colors.white, + color: AppColors.onSurface, height: 1.2, ), maxLines: 2, @@ -281,9 +281,9 @@ class _PlaylistCardState extends State<_PlaylistCard> { const SizedBox(height: 8), Text( Uri.tryParse(widget.playlist.dns)?.host ?? widget.playlist.dns, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 13, - color: Colors.white38, + color: AppColors.onSurface38, letterSpacing: 0.5, ), maxLines: 1, diff --git a/lib/features/iptv/screens/series_detail_screen.dart b/lib/features/iptv/screens/series_detail_screen.dart index ad1521c..91e64ca 100644 --- a/lib/features/iptv/screens/series_detail_screen.dart +++ b/lib/features/iptv/screens/series_detail_screen.dart @@ -130,6 +130,7 @@ class _SeriesDetailScreenState extends ConsumerState { width: 248, height: 350, fit: BoxFit.cover, + memCacheWidth: 500, errorWidget: (_, __, ___) => Container( width: 248, height: 350, @@ -143,7 +144,7 @@ class _SeriesDetailScreenState extends ConsumerState { // Title Text( _seriesInfo!.name, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 18, fontWeight: FontWeight.bold, color: AppColors.onSurface, @@ -159,7 +160,7 @@ class _SeriesDetailScreenState extends ConsumerState { const SizedBox(width: 4), Text( _formatRating(_seriesInfo!.rating!)!, - style: GoogleFonts.roboto(fontSize: 13, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 13, color: AppColors.onSurfaceVariant), ), ], ), @@ -169,7 +170,7 @@ class _SeriesDetailScreenState extends ConsumerState { if (_seriesInfo!.plot != null && _seriesInfo!.plot!.isNotEmpty) Text( _seriesInfo!.plot!, - style: GoogleFonts.roboto(fontSize: 12, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant), maxLines: 5, overflow: TextOverflow.ellipsis, ), @@ -178,7 +179,7 @@ class _SeriesDetailScreenState extends ConsumerState { // Season selector Text( 'Seasons', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.onSurface, @@ -200,7 +201,7 @@ class _SeriesDetailScreenState extends ConsumerState { }, selectedColor: AppColors.primaryContainer, backgroundColor: AppColors.surfaceContainer, - labelStyle: GoogleFonts.inter( + labelStyle: GoogleFonts.karla( color: isSelected ? AppColors.onPrimary : AppColors.onSurfaceVariant, fontSize: 12, ), @@ -224,7 +225,7 @@ class _SeriesDetailScreenState extends ConsumerState { padding: const EdgeInsets.all(16), child: Text( 'Season $_selectedSeason - ${currentEpisodes.length} Episodes', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.onSurface, @@ -236,7 +237,7 @@ class _SeriesDetailScreenState extends ConsumerState { ? Center( child: Text( 'No episodes found', - style: GoogleFonts.roboto(color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(color: AppColors.onSurfaceVariant), ), ) : ListView.builder( @@ -323,7 +324,7 @@ class _SeriesDetailScreenState extends ConsumerState { ? const Icon(Icons.check, color: AppColors.onSurface, size: 20) : Text( '${episode.episodeNum}', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.bold, color: AppColors.onSurface, @@ -340,7 +341,7 @@ class _SeriesDetailScreenState extends ConsumerState { children: [ Text( episode.title, - style: GoogleFonts.roboto( + style: GoogleFonts.karla( fontSize: 14, fontWeight: FontWeight.w500, color: isWatched ? AppColors.onSurfaceVariant : AppColors.onSurface, @@ -351,7 +352,7 @@ class _SeriesDetailScreenState extends ConsumerState { if (episode.durationSecs != null && episode.durationSecs! > 0) Text( _formatDuration(episode.durationSecs!), - style: GoogleFonts.roboto( + style: GoogleFonts.karla( fontSize: 12, color: AppColors.onSurfaceVariant, ), diff --git a/lib/features/iptv/widgets/category_carousel.dart b/lib/features/iptv/widgets/category_carousel.dart index fd159c2..c7a0650 100644 --- a/lib/features/iptv/widgets/category_carousel.dart +++ b/lib/features/iptv/widgets/category_carousel.dart @@ -123,8 +123,8 @@ class CategoryCarousel extends StatelessWidget { end: Alignment.centerRight, colors: [ Colors.transparent, - Colors.white, - Colors.white, + AppColors.onSurface, + AppColors.onSurface, Colors.transparent, ], stops: [0.0, 0.02, 0.98, 1.0], diff --git a/lib/features/iptv/widgets/channel_card.dart b/lib/features/iptv/widgets/channel_card.dart index ff3e7cb..acbabf7 100644 --- a/lib/features/iptv/widgets/channel_card.dart +++ b/lib/features/iptv/widgets/channel_card.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -import '../theme/app_colors.dart'; -import '../theme/app_theme.dart'; +import '../../../core/theme/app_colors.dart'; +import '../../../core/theme/app_theme.dart'; class ChannelCard extends StatefulWidget { final String channelNumber; @@ -127,7 +127,7 @@ class _ChannelCardState extends State children: [ Text( widget.channelNumber, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, fontWeight: FontWeight.w600, color: AppColors.textSecondary, @@ -139,7 +139,7 @@ class _ChannelCardState extends State widget.channelName, maxLines: 1, overflow: TextOverflow.ellipsis, - style: GoogleFonts.outfit( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w700, color: AppColors.textPrimary, @@ -175,7 +175,7 @@ class _ChannelCardState extends State widget.currentProgram!, maxLines: 1, overflow: TextOverflow.ellipsis, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 13, fontWeight: FontWeight.w500, color: AppColors.textSecondary, @@ -185,7 +185,7 @@ class _ChannelCardState extends State SizedBox(height: AppTheme.spacingXs), Text( widget.programTime!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 11, fontWeight: FontWeight.w400, color: AppColors.textTertiary, diff --git a/lib/features/iptv/widgets/epg_overlay.dart b/lib/features/iptv/widgets/epg_overlay.dart index 513ed66..2516850 100644 --- a/lib/features/iptv/widgets/epg_overlay.dart +++ b/lib/features/iptv/widgets/epg_overlay.dart @@ -52,7 +52,7 @@ class EpgOverlay extends ConsumerWidget { color: const Color(0xFF1A1A2E) .withOpacity(0.85), // Match Native player controls borderRadius: BorderRadius.circular(24), - border: Border.all(color: Colors.white.withOpacity(0.1)), + border: Border.all(color: AppColors.onSurface.withOpacity(0.1)), ), child: Row( mainAxisSize: MainAxisSize.min, diff --git a/lib/features/iptv/widgets/epg_widget.dart b/lib/features/iptv/widgets/epg_widget.dart index ec66757..a62f09f 100644 --- a/lib/features/iptv/widgets/epg_widget.dart +++ b/lib/features/iptv/widgets/epg_widget.dart @@ -99,7 +99,7 @@ class _EPGWidgetState extends ConsumerState { ), child: Text( 'LIVE', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 9, fontWeight: FontWeight.bold, color: AppColors.onSurface, @@ -110,7 +110,7 @@ class _EPGWidgetState extends ConsumerState { Expanded( child: Text( _epg!.nowPlaying!, - style: GoogleFonts.roboto( + style: GoogleFonts.karla( fontSize: 11, fontWeight: FontWeight.w600, color: AppColors.onSurface, @@ -151,7 +151,7 @@ class _EPGWidgetState extends ConsumerState { Expanded( child: Text( 'Next: ${_epg!.nextPlaying}', - style: GoogleFonts.roboto( + style: GoogleFonts.karla( fontSize: 10, color: AppColors.outline, ), diff --git a/lib/features/iptv/widgets/live_tv_tab.dart b/lib/features/iptv/widgets/live_tv_tab.dart index f5ee70e..ab39eab 100644 --- a/lib/features/iptv/widgets/live_tv_tab.dart +++ b/lib/features/iptv/widgets/live_tv_tab.dart @@ -64,7 +64,7 @@ class _LiveTVTabState extends ConsumerState body: channelsAsync.when( loading: () => const ThemedLoading(), error: (e, s) => Center( - child: Text('Error: $e', style: const TextStyle(color: Colors.white)), + child: Text('Error: $e', style: const TextStyle(color: AppColors.onSurface)), ), data: (groupedChannels) { var categories = groupedChannels.keys.toList(); @@ -119,12 +119,12 @@ class _LiveTVTabState extends ConsumerState child: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: AppColors.onSurface.withOpacity(0.1), shape: BoxShape.circle, ), child: const Icon( Icons.arrow_back, - color: Colors.white, + color: AppColors.onSurface, ), ), ), @@ -138,10 +138,10 @@ class _LiveTVTabState extends ConsumerState : _showFavoritesOnly ? 'Favorites' : _selectedCategory ?? 'Live TV', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 24, fontWeight: FontWeight.w700, - color: Colors.white, + color: AppColors.onSurface, ), maxLines: 1, overflow: TextOverflow.ellipsis, @@ -153,17 +153,17 @@ class _LiveTVTabState extends ConsumerState width: 250, height: 44, decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: AppColors.onSurface.withOpacity(0.1), borderRadius: BorderRadius.circular(12), ), child: TextField( controller: _searchController, - style: GoogleFonts.inter(color: Colors.white), + style: GoogleFonts.karla(color: AppColors.onSurface), decoration: InputDecoration( hintText: 'Search channels...', - hintStyle: GoogleFonts.inter(color: Colors.white54), + hintStyle: GoogleFonts.karla(color: AppColors.onSurface54), prefixIcon: - const Icon(Icons.search, color: Colors.white54), + const Icon(Icons.search, color: AppColors.onSurface54), border: InputBorder.none, contentPadding: const EdgeInsets.symmetric( horizontal: 16, @@ -173,7 +173,7 @@ class _LiveTVTabState extends ConsumerState ? IconButton( icon: const Icon( Icons.clear, - color: Colors.white, + color: AppColors.onSurface, ), onPressed: _searchController.clear, ) @@ -198,7 +198,7 @@ class _LiveTVTabState extends ConsumerState decoration: BoxDecoration( color: _showFavoritesOnly ? AppColors.live.withOpacity(0.2) - : Colors.white.withOpacity(0.1), + : AppColors.onSurface.withOpacity(0.1), borderRadius: BorderRadius.circular(12), border: _showFavoritesOnly ? Border.all(color: AppColors.live) @@ -210,7 +210,7 @@ class _LiveTVTabState extends ConsumerState : Icons.favorite_border, color: _showFavoritesOnly ? AppColors.live - : Colors.white, + : AppColors.onSurface, ), ), ), @@ -231,13 +231,13 @@ class _LiveTVTabState extends ConsumerState Icon( Icons.tv_off, size: 64, - color: Colors.white.withOpacity(0.3), + color: AppColors.onSurface.withOpacity(0.3), ), const SizedBox(height: 16), Text( 'No channels found', - style: GoogleFonts.inter( - color: Colors.white54, + style: GoogleFonts.karla( + color: AppColors.onSurface54, fontSize: 18, ), ), @@ -311,7 +311,7 @@ class _LiveTVTabState extends ConsumerState children: [ Icon( Icons.folder_copy_outlined, - color: Colors.white.withOpacity(0.9), + color: AppColors.onSurface.withOpacity(0.9), size: 32, ), const SizedBox(height: 12), @@ -320,10 +320,10 @@ class _LiveTVTabState extends ConsumerState child: Text( category, textAlign: TextAlign.center, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w600, - color: Colors.white, + color: AppColors.onSurface, ), maxLines: 2, overflow: TextOverflow.ellipsis, @@ -332,9 +332,9 @@ class _LiveTVTabState extends ConsumerState const SizedBox(height: 4), Text( '$count Channels', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 13, - color: Colors.white54, + color: AppColors.onSurface54, ), ), ], @@ -386,7 +386,7 @@ class _LiveTVTabState extends ConsumerState Expanded( child: Container( decoration: BoxDecoration( - color: Colors.white.withOpacity( + color: AppColors.onSurface.withOpacity( 0.05, ), // Subtle transparent background borderRadius: const BorderRadius.vertical( @@ -398,18 +398,22 @@ class _LiveTVTabState extends ConsumerState child: channel.streamIcon.isNotEmpty ? Image.network( _getProxiedIconUrl(channel.streamIcon)!, + // Logos de chaines : 160 px suffisent + // largement, meme en HiDPI. + cacheWidth: 160, + filterQuality: FilterQuality.low, errorBuilder: (_, __, ___) => Icon( Icons.tv, - color: Colors.white.withOpacity(0.3), + color: AppColors.onSurface.withOpacity(0.3), size: 40, ), ) : Text( channel.name.characters.first.toUpperCase(), - style: GoogleFonts.outfit( + style: GoogleFonts.karla( fontSize: 40, fontWeight: FontWeight.bold, - color: Colors.white24, + color: AppColors.onSurface24, ), ), ), @@ -427,8 +431,8 @@ class _LiveTVTabState extends ConsumerState children: [ Text( channel.name, - style: GoogleFonts.inter( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontSize: 13, fontWeight: FontWeight.w500, ), @@ -452,8 +456,8 @@ class _LiveTVTabState extends ConsumerState if (epgList.isEmpty) { return Text( 'No Info', - style: GoogleFonts.inter( - color: Colors.white54, + style: GoogleFonts.karla( + color: AppColors.onSurface54, fontSize: 10, ), ); @@ -480,7 +484,7 @@ class _LiveTVTabState extends ConsumerState return Text( currentProgram.title, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: const Color(0xFFFFD700), fontSize: 10, fontWeight: FontWeight.w600, @@ -491,14 +495,14 @@ class _LiveTVTabState extends ConsumerState }, loading: () => Text( '...', - style: GoogleFonts.inter( - color: Colors.white24, + style: GoogleFonts.karla( + color: AppColors.onSurface24, fontSize: 10, ), ), error: (_, __) => Text( 'Err', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: Colors.red, fontSize: 10, ), diff --git a/lib/features/iptv/widgets/movies_tab.dart b/lib/features/iptv/widgets/movies_tab.dart index 7b8ba1f..f670b9e 100644 --- a/lib/features/iptv/widgets/movies_tab.dart +++ b/lib/features/iptv/widgets/movies_tab.dart @@ -219,7 +219,7 @@ class _MoviesTabState extends ConsumerState { children: [ Text( 'Movies', - style: GoogleFonts.spaceGrotesk( + style: GoogleFonts.fraunces( fontSize: 24, fontWeight: FontWeight.w700, color: AppColors.onSurface, @@ -251,14 +251,14 @@ class _MoviesTabState extends ConsumerState { Expanded( child: TextField( controller: _searchController, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, color: AppColors.onSurface, ), decoration: InputDecoration( hintText: 'Search movies...', hintStyle: - GoogleFonts.inter(color: AppColors.outline), + GoogleFonts.karla(color: AppColors.outline), border: InputBorder.none, isDense: true, contentPadding: @@ -352,6 +352,11 @@ class _MoviesTabState extends ConsumerState { ? Image.network( _getProxiedImageUrl(movie.streamIcon), fit: BoxFit.cover, + // Borne le decodage a la taille reelle de la + // tuile (x2 pour les ecrans HiDPI). Sans ca, + // chaque jaquette est decodee en 1000x1500. + cacheWidth: 400, + filterQuality: FilterQuality.low, errorBuilder: (ctx, err, stack) => Container( color: AppColors.surfaceContainerLow, child: Center( @@ -425,7 +430,7 @@ class _MoviesTabState extends ConsumerState { const SizedBox(width: 4), Text( _formatRating(movie.rating)!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 10, fontWeight: FontWeight.bold, color: AppColors.onSurface, @@ -447,7 +452,7 @@ class _MoviesTabState extends ConsumerState { children: [ Text( movie.name, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontSize: 13, fontWeight: FontWeight.w600, @@ -466,7 +471,7 @@ class _MoviesTabState extends ConsumerState { padding: const EdgeInsets.only(top: 4), child: Text( 'WATCHED', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.primary, fontSize: 10, fontWeight: FontWeight.bold, diff --git a/lib/features/iptv/widgets/quality_selector_widget.dart b/lib/features/iptv/widgets/quality_selector_widget.dart index 2207dcf..eaa74d3 100644 --- a/lib/features/iptv/widgets/quality_selector_widget.dart +++ b/lib/features/iptv/widgets/quality_selector_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import '../../core/services/adaptive_bitrate_service.dart'; +import '../../../core/services/adaptive_bitrate_service.dart'; +import '../../../core/theme/app_colors.dart'; /// Widget for displaying and selecting video quality during playback class QualitySelectorWidget extends ConsumerStatefulWidget { @@ -35,7 +36,7 @@ class _QualitySelectorWidgetState extends ConsumerState { final bandwidthMbps = widget.qualitySelector.getEstimatedBandwidthMbps(); return Dialog( - backgroundColor: Colors.black87, + backgroundColor: AppColors.surfaceContainer, insetPadding: const EdgeInsets.all(16), child: Column( mainAxisSize: MainAxisSize.min, @@ -45,7 +46,7 @@ class _QualitySelectorWidgetState extends ConsumerState { padding: const EdgeInsets.all(16), decoration: const BoxDecoration( border: Border( - bottom: BorderSide(color: Colors.white24), + bottom: BorderSide(color: AppColors.onSurface24), ), ), child: Row( @@ -54,13 +55,13 @@ class _QualitySelectorWidgetState extends ConsumerState { const Text( 'Video Quality', style: TextStyle( - color: Colors.white, + color: AppColors.onSurface, fontSize: 18, fontWeight: FontWeight.bold, ), ), IconButton( - icon: const Icon(Icons.close, color: Colors.white), + icon: const Icon(Icons.close, color: AppColors.onSurface), onPressed: widget.onClose, ), ], @@ -73,7 +74,7 @@ class _QualitySelectorWidgetState extends ConsumerState { child: Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: Colors.white10, + color: AppColors.onSurface06, borderRadius: BorderRadius.circular(8), ), child: Row( @@ -81,12 +82,12 @@ class _QualitySelectorWidgetState extends ConsumerState { children: [ const Text( 'Current Bandwidth:', - style: TextStyle(color: Colors.white70, fontSize: 14), + style: TextStyle(color: AppColors.onSurfaceVariant, fontSize: 14), ), Text( '${bandwidthMbps.toStringAsFixed(1)} Mbps', style: const TextStyle( - color: Colors.white, + color: AppColors.onSurface, fontSize: 14, fontWeight: FontWeight.bold, ), @@ -108,22 +109,22 @@ class _QualitySelectorWidgetState extends ConsumerState { contentPadding: const EdgeInsets.symmetric(horizontal: 24, vertical: 8), leading: isSelected - ? const Icon(Icons.check_circle, color: Colors.blue) + ? const Icon(Icons.check_circle, color: AppColors.primary) : const Icon( Icons.radio_button_unchecked, - color: Colors.white30, + color: AppColors.onSurface24, ), title: Text( quality.label, style: TextStyle( - color: isSelected ? Colors.blue : Colors.white, + color: isSelected ? AppColors.primary : AppColors.onSurface, fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, ), ), subtitle: Text( '${quality.bitrateBps ~/ 1000000} Mbps', - style: const TextStyle(color: Colors.white70, fontSize: 12), + style: const TextStyle(color: AppColors.onSurfaceVariant, fontSize: 12), ), onTap: () { widget.qualitySelector.setQuality(quality); @@ -141,7 +142,7 @@ class _QualitySelectorWidgetState extends ConsumerState { child: Container( decoration: const BoxDecoration( border: Border( - top: BorderSide(color: Colors.white24), + top: BorderSide(color: AppColors.onSurface24), ), ), child: ListTile( @@ -157,7 +158,7 @@ class _QualitySelectorWidgetState extends ConsumerState { ), subtitle: const Text( 'Adjusts based on network speed', - style: TextStyle(color: Colors.white70, fontSize: 12), + style: TextStyle(color: AppColors.onSurfaceVariant, fontSize: 12), ), onTap: () { // Auto mode would be handled by the player @@ -194,18 +195,18 @@ class QualityIndicator extends ConsumerWidget { child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( - color: Colors.black54, + color: AppColors.baseLevel0, borderRadius: BorderRadius.circular(4), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon(Icons.high_quality, color: Colors.white, size: 16), + const Icon(Icons.high_quality, color: AppColors.onSurface, size: 16), const SizedBox(width: 4), Text( quality.resolution.split('x')[1], // Show just the height style: const TextStyle( - color: Colors.white, + color: AppColors.onSurface, fontSize: 12, fontWeight: FontWeight.bold, ), @@ -231,7 +232,7 @@ class BandwidthMonitor extends ConsumerWidget { return Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( - color: Colors.black54, + color: AppColors.baseLevel0, borderRadius: BorderRadius.circular(4), ), child: Row( @@ -242,7 +243,7 @@ class BandwidthMonitor extends ConsumerWidget { Text( '${qualitySelector.getEstimatedBandwidthMbps().toStringAsFixed(1)} Mbps', style: const TextStyle( - color: Colors.white, + color: AppColors.onSurface, fontSize: 11, ), ), diff --git a/lib/features/iptv/widgets/recording_modal.dart b/lib/features/iptv/widgets/recording_modal.dart index 1596813..b15096a 100644 --- a/lib/features/iptv/widgets/recording_modal.dart +++ b/lib/features/iptv/widgets/recording_modal.dart @@ -106,7 +106,7 @@ class _RecordingModalState extends State { Expanded( child: Text( 'Programmer un enregistrement', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 20, fontWeight: FontWeight.bold, color: AppColors.onSurface, @@ -120,12 +120,12 @@ class _RecordingModalState extends State { // Informations Chaine Text( 'Chaîne ciblée :', - style: GoogleFonts.inter(color: AppColors.onSurfaceVariant, fontSize: 14), + style: GoogleFonts.karla(color: AppColors.onSurfaceVariant, fontSize: 14), ), const SizedBox(height: 8), Text( widget.channel.name, - style: GoogleFonts.inter(color: AppColors.onSurface, fontSize: 18), + style: GoogleFonts.karla(color: AppColors.onSurface, fontSize: 18), ), const SizedBox(height: 24), @@ -139,7 +139,7 @@ class _RecordingModalState extends State { children: [ Text( 'Date :', - style: GoogleFonts.inter(color: AppColors.onSurfaceVariant, fontSize: 14), + style: GoogleFonts.karla(color: AppColors.onSurfaceVariant, fontSize: 14), ), const SizedBox(height: 8), TvFocusableCard( @@ -163,7 +163,7 @@ class _RecordingModalState extends State { child: Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: AppColors.onSurface.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), child: Row( @@ -173,7 +173,7 @@ class _RecordingModalState extends State { Expanded( child: Text( '${_startTime.day.toString().padLeft(2, '0')}/${_startTime.month.toString().padLeft(2, '0')}/${_startTime.year}', - style: GoogleFonts.inter(color: AppColors.onSurface), + style: GoogleFonts.karla(color: AppColors.onSurface), overflow: TextOverflow.ellipsis, ), ), @@ -193,7 +193,7 @@ class _RecordingModalState extends State { children: [ Text( 'Heure :', - style: GoogleFonts.inter(color: AppColors.onSurfaceVariant, fontSize: 14), + style: GoogleFonts.karla(color: AppColors.onSurfaceVariant, fontSize: 14), ), const SizedBox(height: 8), TvFocusableCard( @@ -226,7 +226,7 @@ class _RecordingModalState extends State { child: Container( padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: AppColors.onSurface.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), child: Row( @@ -236,7 +236,7 @@ class _RecordingModalState extends State { Expanded( child: Text( '${_startTime.hour.toString().padLeft(2, '0')}:${_startTime.minute.toString().padLeft(2, '0')}', - style: GoogleFonts.inter(color: AppColors.onSurface), + style: GoogleFonts.karla(color: AppColors.onSurface), ), ), ], @@ -255,7 +255,7 @@ class _RecordingModalState extends State { children: [ Text( 'Durée (min) :', - style: GoogleFonts.inter(color: AppColors.onSurfaceVariant, fontSize: 14), + style: GoogleFonts.karla(color: AppColors.onSurfaceVariant, fontSize: 14), ), const SizedBox(height: 8), GlassContainer.glass( @@ -277,7 +277,7 @@ class _RecordingModalState extends State { child: Text( '$_durationMinutes', textAlign: TextAlign.center, - style: GoogleFonts.inter(color: AppColors.onSurface), + style: GoogleFonts.karla(color: AppColors.onSurface), ), ), IconButton( @@ -308,7 +308,7 @@ class _RecordingModalState extends State { onPressed: _isLoading ? null : () => Navigator.of(context).pop(), child: Text( 'Annuler', - style: GoogleFonts.inter(color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(color: AppColors.onSurfaceVariant), ), ), const SizedBox(width: 16), @@ -328,7 +328,7 @@ class _RecordingModalState extends State { ) : Text( 'Enregistrer de suite', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontWeight: FontWeight.bold, ), @@ -352,7 +352,7 @@ class _RecordingModalState extends State { ) : Text( 'Programmer', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontWeight: FontWeight.bold, ), diff --git a/lib/features/iptv/widgets/recordings_tab.dart b/lib/features/iptv/widgets/recordings_tab.dart index 070b377..0afef23 100644 --- a/lib/features/iptv/widgets/recordings_tab.dart +++ b/lib/features/iptv/widgets/recordings_tab.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:http/http.dart' as http; +import '../../../core/theme/app_colors.dart'; import '../../../core/models/iptv_models.dart'; import '../../../core/models/playlist_config.dart'; import '../providers/xtream_provider.dart'; @@ -25,22 +26,22 @@ class _RecordingsTabState extends State { @override Widget build(BuildContext context) { return Container( - color: Colors.black, + color: AppColors.background, child: Column( children: [ Container( padding: const EdgeInsets.fromLTRB(24, 24, 24, 16), - color: Colors.grey[900], + color: AppColors.surfaceContainerLow, child: const Row( children: [ - Icon(Icons.videocam, color: Colors.white, size: 28), + Icon(Icons.videocam, color: AppColors.onSurface, size: 28), SizedBox(width: 12), Text( 'Enregistrements', style: TextStyle( fontSize: 26, fontWeight: FontWeight.bold, - color: Colors.white, + color: AppColors.onSurface, ), ), ], @@ -182,8 +183,8 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> children: [ Text( 'GROUPES', - style: GoogleFonts.outfit( - color: Colors.white38, + style: GoogleFonts.karla( + color: AppColors.onSurface38, fontSize: 10, fontWeight: FontWeight.bold, letterSpacing: 1.2, @@ -210,16 +211,16 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> margin: const EdgeInsets.only(bottom: 4), decoration: BoxDecoration( color: isSelected - ? Colors.white.withOpacity(0.1) + ? AppColors.onSurface.withOpacity(0.1) : Colors.transparent, borderRadius: BorderRadius.circular(8), ), child: Text( cat, - style: GoogleFonts.outfit( + style: GoogleFonts.karla( color: isSelected - ? Colors.white - : Colors.white60, + ? AppColors.onSurface + : AppColors.onSurface54, fontSize: 12, fontWeight: isSelected ? FontWeight.bold @@ -237,7 +238,7 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> ), ), - const VerticalDivider(width: 32, color: Colors.white10), + const VerticalDivider(width: 32, color: AppColors.onSurface06), // ── Colonne 2 : CHAÎNES ── SizedBox( @@ -247,20 +248,20 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> // Barre de recherche TextField( controller: _searchCtrl, - style: const TextStyle(color: Colors.white, fontSize: 13), + style: const TextStyle(color: AppColors.onSurface, fontSize: 13), decoration: InputDecoration( hintText: 'Rechercher...', hintStyle: const TextStyle( - color: Colors.white38, + color: AppColors.onSurface38, fontSize: 13, ), prefixIcon: const Icon( Icons.search, - color: Colors.white38, + color: AppColors.onSurface38, size: 18, ), filled: true, - fillColor: Colors.white.withOpacity(0.07), + fillColor: AppColors.onSurface.withOpacity(0.07), contentPadding: const EdgeInsets.symmetric(vertical: 8), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), @@ -275,7 +276,7 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> child: Text( 'Aucune chaîne', style: TextStyle( - color: Colors.white24, + color: AppColors.onSurface24, fontSize: 12, ), ), @@ -298,7 +299,7 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> decoration: BoxDecoration( color: isSelected ? Colors.redAccent.withOpacity(0.2) - : Colors.white.withOpacity(0.05), + : AppColors.onSurface.withOpacity(0.05), borderRadius: BorderRadius.circular(8), border: Border.all( color: isSelected @@ -314,26 +315,27 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> width: 24, height: 16, fit: BoxFit.contain, + cacheWidth: 64, errorBuilder: (_, __, ___) => const Icon( Icons.tv, - color: Colors.white24, + color: AppColors.onSurface24, size: 16, ), ) : const Icon( Icons.tv, - color: Colors.white24, + color: AppColors.onSurface24, size: 16, ), const SizedBox(width: 10), Expanded( child: Text( ch.name, - style: GoogleFonts.outfit( + style: GoogleFonts.karla( color: isSelected - ? Colors.white - : Colors.white70, + ? AppColors.onSurface + : AppColors.onSurfaceVariant, fontSize: 12, ), maxLines: 1, @@ -351,7 +353,7 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> ), ), - const VerticalDivider(width: 32, color: Colors.white10), + const VerticalDivider(width: 32, color: AppColors.onSurface06), // ── Colonne droite : programmes EPG ── Expanded( @@ -369,8 +371,8 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> Text( 'Sélectionnez une chaîne\npour voir son guide des programmes', textAlign: TextAlign.center, - style: GoogleFonts.outfit( - color: Colors.white38, + style: GoogleFonts.karla( + color: AppColors.onSurface38, fontSize: 15, ), ), @@ -384,8 +386,8 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> children: [ Text( _selectedChannel!.name, - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontWeight: FontWeight.bold, fontSize: 16, ), @@ -394,7 +396,7 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> IconButton( icon: const Icon( Icons.refresh, - color: Colors.white54, + color: AppColors.onSurface54, size: 18, ), tooltip: 'Recharger l\'EPG', @@ -402,7 +404,7 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> ), ], ), - const Divider(color: Colors.white12), + const Divider(color: AppColors.onSurface12), Expanded( child: _loadingEpg ? const Center( @@ -424,8 +426,8 @@ class _EpgGuideViewState extends ConsumerState<_EpgGuideView> child: Text( 'Aucun programme EPG disponible\npour cette chaîne', textAlign: TextAlign.center, - style: GoogleFonts.outfit( - color: Colors.white38, + style: GoogleFonts.karla( + color: AppColors.onSurface38, ), ), ) @@ -524,7 +526,7 @@ class _ProgrammeCard extends StatelessWidget { Expanded( child: Text( 'Enregistrer', - style: GoogleFonts.outfit(color: Colors.white), + style: GoogleFonts.karla(color: AppColors.onSurface), ), ), ], @@ -535,8 +537,8 @@ class _ProgrammeCard extends StatelessWidget { children: [ Text( title.isEmpty ? channel.name : title, - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontWeight: FontWeight.bold, fontSize: 16, ), @@ -544,7 +546,7 @@ class _ProgrammeCard extends StatelessWidget { const SizedBox(height: 8), Text( '${_fmt(_start)} → ${_fmt(_end)}', - style: const TextStyle(color: Colors.white70), + style: const TextStyle(color: AppColors.onSurfaceVariant), ), if (_description.isNotEmpty) ...[ const SizedBox(height: 8), @@ -552,7 +554,7 @@ class _ProgrammeCard extends StatelessWidget { _description, maxLines: 3, overflow: TextOverflow.ellipsis, - style: const TextStyle(color: Colors.white38, fontSize: 12), + style: const TextStyle(color: AppColors.onSurface38, fontSize: 12), ), ], ], @@ -631,13 +633,13 @@ class _ProgrammeCard extends StatelessWidget { color: isNow ? Colors.red.withOpacity(0.15) : isPast - ? Colors.white.withOpacity(0.03) - : Colors.white.withOpacity(0.06), + ? AppColors.onSurface.withOpacity(0.03) + : AppColors.onSurface.withOpacity(0.06), borderRadius: BorderRadius.circular(10), border: Border.all( color: isNow ? Colors.redAccent.withOpacity(0.4) - : Colors.white.withOpacity(0.07), + : AppColors.onSurface.withOpacity(0.07), ), ), child: ListTile( @@ -657,8 +659,8 @@ class _ProgrammeCard extends StatelessWidget { ), child: Text( 'LIVE', - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontSize: 8, fontWeight: FontWeight.bold, ), @@ -667,8 +669,8 @@ class _ProgrammeCard extends StatelessWidget { else Text( _fmt(_start), - style: GoogleFonts.outfit( - color: isPast ? Colors.white24 : Colors.white70, + style: GoogleFonts.karla( + color: isPast ? AppColors.onSurface24 : AppColors.onSurfaceVariant, fontSize: 13, fontWeight: FontWeight.w600, ), @@ -677,15 +679,15 @@ class _ProgrammeCard extends StatelessWidget { Text( _fmt(_end), style: - GoogleFonts.outfit(color: Colors.white24, fontSize: 10), + GoogleFonts.karla(color: AppColors.onSurface24, fontSize: 10), ), ], ), ), title: Text( _title.isEmpty ? '—' : _title, - style: GoogleFonts.outfit( - color: isPast ? Colors.white38 : Colors.white, + style: GoogleFonts.karla( + color: isPast ? AppColors.onSurface38 : AppColors.onSurface, fontWeight: isNow ? FontWeight.bold : FontWeight.normal, ), maxLines: 2, @@ -696,7 +698,7 @@ class _ProgrammeCard extends StatelessWidget { _description, maxLines: 1, overflow: TextOverflow.ellipsis, - style: const TextStyle(color: Colors.white38, fontSize: 11), + style: const TextStyle(color: AppColors.onSurface38, fontSize: 11), ) : null, trailing: !isPast @@ -826,7 +828,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> { backgroundColor: const Color(0xFF1E1E2E), title: Text( title, - style: GoogleFonts.outfit(color: Colors.white, fontSize: 14), + style: GoogleFonts.karla(color: AppColors.onSurface, fontSize: 14), ), content: SizedBox( width: 500, @@ -835,7 +837,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> { child: Text( content, style: const TextStyle( - color: Colors.white70, + color: AppColors.onSurfaceVariant, fontSize: 11, fontFamily: 'monospace', ), @@ -862,7 +864,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> { 'recording' => Colors.redAccent, 'completed' => Colors.green, 'failed' => Colors.orangeAccent, - _ => Colors.blueAccent, + _ => AppColors.primary, }; String _statusLabel(String status) => switch (status) { @@ -894,7 +896,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> { mainAxisAlignment: MainAxisAlignment.end, children: [ IconButton( - icon: const Icon(Icons.refresh, color: Colors.white70), + icon: const Icon(Icons.refresh, color: AppColors.onSurfaceVariant), onPressed: _fetchRecordings, tooltip: 'Rafraîchir', ), @@ -923,8 +925,8 @@ class _RecordingsListViewState extends State<_RecordingsListView> { const SizedBox(height: 16), Text( 'Aucun enregistrement', - style: GoogleFonts.outfit( - color: Colors.white38, + style: GoogleFonts.karla( + color: AppColors.onSurface38, fontSize: 16, ), ), @@ -941,10 +943,10 @@ class _RecordingsListViewState extends State<_RecordingsListView> { return Container( margin: const EdgeInsets.only(bottom: 8), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.05), + color: AppColors.onSurface.withOpacity(0.05), borderRadius: BorderRadius.circular(12), border: Border.all( - color: Colors.white.withOpacity(0.1), + color: AppColors.onSurface.withOpacity(0.1), ), ), child: ListTile( @@ -961,8 +963,8 @@ class _RecordingsListViewState extends State<_RecordingsListView> { ), title: Text( rec['title'] ?? '—', - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontWeight: FontWeight.w600, ), ), @@ -973,7 +975,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> { Text( '${_fmtDate(rec['start_time'])} → ${_fmtDate(rec['end_time'])}', style: const TextStyle( - color: Colors.white54, + color: AppColors.onSurface54, fontSize: 12, ), ), @@ -1038,7 +1040,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> { IconButton( icon: const Icon( Icons.description_outlined, - color: Colors.blueAccent, + color: AppColors.primary, size: 20, ), tooltip: 'Logs', @@ -1050,7 +1052,7 @@ class _RecordingsListViewState extends State<_RecordingsListView> { IconButton( icon: const Icon( Icons.delete_outline, - color: Colors.white38, + color: AppColors.onSurface38, size: 20, ), tooltip: 'Supprimer', @@ -1131,7 +1133,7 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { const SizedBox(width: 8), Text( 'Nouveau Season Pass', - style: GoogleFonts.outfit(color: Colors.white), + style: GoogleFonts.karla(color: AppColors.onSurface), ), ], ), @@ -1142,7 +1144,7 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { children: [ Text( 'Enregistre automatiquement toutes les nouvelles diffusions d\'une émission.', - style: GoogleFonts.outfit(color: Colors.white54, fontSize: 13), + style: GoogleFonts.karla(color: AppColors.onSurface54, fontSize: 13), ), const SizedBox(height: 16), _buildField( @@ -1205,12 +1207,12 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { Widget _buildField(TextEditingController c, String label) { return TextField( controller: c, - style: const TextStyle(color: Colors.white), + style: const TextStyle(color: AppColors.onSurface), decoration: InputDecoration( labelText: label, - labelStyle: const TextStyle(color: Colors.white54, fontSize: 12), + labelStyle: const TextStyle(color: AppColors.onSurface54, fontSize: 12), enabledBorder: const UnderlineInputBorder( - borderSide: BorderSide(color: Colors.white24), + borderSide: BorderSide(color: AppColors.onSurface24), ), focusedBorder: const UnderlineInputBorder( borderSide: BorderSide(color: Colors.purpleAccent), @@ -1230,7 +1232,7 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { children: [ Text( 'Enregistrements automatiques', - style: GoogleFonts.outfit(color: Colors.white54, fontSize: 13), + style: GoogleFonts.karla(color: AppColors.onSurface54, fontSize: 13), ), ElevatedButton.icon( style: ElevatedButton.styleFrom( @@ -1261,7 +1263,7 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { Expanded( child: Text( 'Scanne l\'EPG toutes les 4h et programme automatiquement les nouvelles diffusions. Seuls les nouveaux épisodes sont enregistrés.', - style: GoogleFonts.outfit( + style: GoogleFonts.karla( color: Colors.purpleAccent.shade100, fontSize: 12, ), @@ -1287,16 +1289,16 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { const SizedBox(height: 16), Text( 'Aucun Season Pass actif', - style: GoogleFonts.outfit( - color: Colors.white38, + style: GoogleFonts.karla( + color: AppColors.onSurface38, fontSize: 16, ), ), const SizedBox(height: 8), Text( 'Créez-en un pour enregistrer automatiquement vos émissions préférées', - style: GoogleFonts.outfit( - color: Colors.white24, + style: GoogleFonts.karla( + color: AppColors.onSurface24, fontSize: 12, ), textAlign: TextAlign.center, @@ -1324,8 +1326,8 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { ), title: Text( p['show_title'] ?? '—', - style: GoogleFonts.outfit( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontWeight: FontWeight.w600, ), ), @@ -1335,14 +1337,14 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { Text( 'Chaîne : ${p['channel_id']}', style: const TextStyle( - color: Colors.white54, + color: AppColors.onSurface54, fontSize: 11, ), ), Text( 'Flux : ${p['stream_url']}', style: const TextStyle( - color: Colors.white38, + color: AppColors.onSurface38, fontSize: 10, ), ), @@ -1351,7 +1353,7 @@ class _SeasonPassesViewState extends State<_SeasonPassesView> { trailing: IconButton( icon: const Icon( Icons.delete_outline, - color: Colors.white38, + color: AppColors.onSurface38, ), tooltip: 'Supprimer', onPressed: () => diff --git a/lib/features/iptv/widgets/series_tab.dart b/lib/features/iptv/widgets/series_tab.dart index 522ffb2..2c67656 100644 --- a/lib/features/iptv/widgets/series_tab.dart +++ b/lib/features/iptv/widgets/series_tab.dart @@ -199,7 +199,7 @@ class _SeriesTabState extends ConsumerState { children: [ Text( 'TV Series', - style: GoogleFonts.spaceGrotesk( + style: GoogleFonts.fraunces( fontSize: 24, fontWeight: FontWeight.w700, color: AppColors.onSurface, @@ -229,14 +229,14 @@ class _SeriesTabState extends ConsumerState { Expanded( child: TextField( controller: _searchController, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, color: AppColors.onSurface, ), decoration: InputDecoration( hintText: 'Search series...', hintStyle: - GoogleFonts.inter(color: AppColors.outline), + GoogleFonts.karla(color: AppColors.outline), border: InputBorder.none, isDense: true, contentPadding: @@ -343,6 +343,8 @@ class _SeriesTabState extends ConsumerState { ? Image.network( _getProxiedImageUrl(serie.cover), fit: BoxFit.cover, + cacheWidth: 400, + filterQuality: FilterQuality.low, errorBuilder: (ctx, err, stack) => Container( color: AppColors.surfaceContainerLow, child: Center( @@ -396,7 +398,7 @@ class _SeriesTabState extends ConsumerState { bottom: 12, child: Text( serie.name, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontSize: 13, fontWeight: FontWeight.w600, @@ -439,7 +441,7 @@ class _SeriesTabState extends ConsumerState { const SizedBox(width: 4), Text( _formatRating(serie.rating)!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 10, fontWeight: FontWeight.bold, color: AppColors.onSurface, diff --git a/lib/features/iptv/widgets/settings_tab.dart b/lib/features/iptv/widgets/settings_tab.dart index 9c45c1b..1098bbb 100644 --- a/lib/features/iptv/widgets/settings_tab.dart +++ b/lib/features/iptv/widgets/settings_tab.dart @@ -155,7 +155,7 @@ class _SettingsTabState extends ConsumerState const SizedBox(width: 12), Text( 'Thème', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 18, fontWeight: FontWeight.w600, color: AppColors.onSurface, @@ -212,7 +212,7 @@ class _SettingsTabState extends ConsumerState ), title: Text( 'Mode actuel', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontWeight: FontWeight.w500, color: AppColors.onSurface, ), @@ -279,7 +279,7 @@ class _SettingsTabState extends ConsumerState children: [ Text( title, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontWeight: FontWeight.w600, color: isSelected ? colorScheme.primary @@ -288,7 +288,7 @@ class _SettingsTabState extends ConsumerState ), Text( subtitle, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, color: colorScheme.onSurfaceVariant, ), @@ -327,11 +327,11 @@ class _SettingsTabState extends ConsumerState leading: const Icon(Icons.person, color: AppColors.onSurface), title: Text( 'Connecté en tant que', - style: GoogleFonts.inter(fontSize: 12, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant), ), subtitle: Text( currentUser?.username ?? 'Unknown', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontWeight: FontWeight.w600, color: AppColors.onSurface, ), @@ -340,7 +340,7 @@ class _SettingsTabState extends ConsumerState ? Chip( label: Text( 'Admin', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 11, color: AppColors.onPrimaryContainer, ), @@ -355,7 +355,7 @@ class _SettingsTabState extends ConsumerState // Category filters section Text( 'Filtres de Catégories', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontWeight: FontWeight.bold, fontSize: 16, color: AppColors.onSurface, @@ -364,7 +364,7 @@ class _SettingsTabState extends ConsumerState const SizedBox(height: 4), Text( 'Seules les catégories contenant un de ces mots-clés seront affichées. Séparez par des virgules.', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, color: AppColors.onSurfaceVariant, ), @@ -430,7 +430,7 @@ class _SettingsTabState extends ConsumerState leading: const Icon(Icons.playlist_play, color: AppColors.onSurface), title: Text( 'Changer de Playlist', - style: GoogleFonts.inter(color: AppColors.onSurface), + style: GoogleFonts.karla(color: AppColors.onSurface), ), trailing: const Icon(Icons.chevron_right, color: AppColors.onSurfaceVariant), onTap: () => context.go('/playlists'), @@ -449,11 +449,11 @@ class _SettingsTabState extends ConsumerState leading: const Icon(Icons.info_outline, color: AppColors.onSurface), title: Text( 'À propos', - style: GoogleFonts.inter(color: AppColors.onSurface), + style: GoogleFonts.karla(color: AppColors.onSurface), ), subtitle: Text( 'XtremFlow IPTV v1.0.0', - style: GoogleFonts.inter(fontSize: 12, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant), ), ), ), @@ -470,11 +470,11 @@ class _SettingsTabState extends ConsumerState leading: const Icon(Icons.cleaning_services, color: AppColors.warning), title: Text( 'Maintenance', - style: GoogleFonts.inter(color: AppColors.onSurface), + style: GoogleFonts.karla(color: AppColors.onSurface), ), subtitle: Text( 'En cas de problèmes d\'affichage ou de mise à jour', - style: GoogleFonts.inter(fontSize: 12, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant), ), trailing: FilledButton.icon( onPressed: () { @@ -573,7 +573,7 @@ class _SettingsTabState extends ConsumerState const SizedBox(width: 8), Text( title, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontWeight: FontWeight.w600, fontSize: 13, color: AppColors.onSurface, @@ -587,7 +587,7 @@ class _SettingsTabState extends ConsumerState decoration: InputDecoration( hintText: 'Ex: FR,FRANCE,HD,SPORT', hintStyle: - GoogleFonts.inter(fontSize: 12, color: AppColors.outline), + GoogleFonts.karla(fontSize: 12, color: AppColors.outline), filled: true, fillColor: AppColors.surfaceContainerHigh, border: OutlineInputBorder( @@ -612,7 +612,7 @@ class _SettingsTabState extends ConsumerState ) : null, ), - style: GoogleFonts.inter(fontSize: 12, color: AppColors.onSurface), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurface), onChanged: onChanged, ), if (keywords.isNotEmpty) ...[ @@ -633,7 +633,7 @@ class _SettingsTabState extends ConsumerState child: Text( keyword, style: - GoogleFonts.inter(fontSize: 11, color: AppColors.onSurface), + GoogleFonts.karla(fontSize: 11, color: AppColors.onSurface), ), ); }).toList(), diff --git a/lib/features/iptv/widgets/simple_recording_widget.dart b/lib/features/iptv/widgets/simple_recording_widget.dart index 9808465..de6f664 100644 --- a/lib/features/iptv/widgets/simple_recording_widget.dart +++ b/lib/features/iptv/widgets/simple_recording_widget.dart @@ -132,10 +132,10 @@ class _SimpleRecordingWidgetState extends State { // Title Text( '🎬 Record "${widget.channel.name}"', - style: GoogleFonts.poppins( + style: GoogleFonts.fraunces( fontSize: 24, fontWeight: FontWeight.bold, - color: Colors.white, + color: AppColors.onSurface, ), ), const SizedBox(height: 24), @@ -150,9 +150,9 @@ class _SimpleRecordingWidgetState extends State { ), child: Text( _status, - style: GoogleFonts.poppins( + style: GoogleFonts.fraunces( fontSize: 14, - color: Colors.white70, + color: AppColors.onSurfaceVariant, ), ), ), @@ -162,10 +162,10 @@ class _SimpleRecordingWidgetState extends State { if (!_isRecording) ...[ Text( '⚡ Quick Record', - style: GoogleFonts.poppins( + style: GoogleFonts.fraunces( fontSize: 16, fontWeight: FontWeight.w600, - color: Colors.white, + color: AppColors.onSurface, ), ), const SizedBox(height: 12), @@ -202,7 +202,7 @@ class _SimpleRecordingWidgetState extends State { label: const Text('STOP RECORDING'), style: ElevatedButton.styleFrom( backgroundColor: Colors.red, - foregroundColor: Colors.white, + foregroundColor: AppColors.onSurface, padding: const EdgeInsets.symmetric(vertical: 16), ), ), @@ -212,10 +212,10 @@ class _SimpleRecordingWidgetState extends State { ExpansionTile( title: Text( '🔵 Schedule for Later', - style: GoogleFonts.poppins( + style: GoogleFonts.fraunces( fontSize: 14, fontWeight: FontWeight.w600, - color: Colors.white, + color: AppColors.onSurface, ), ), children: [ diff --git a/lib/features/iptv/widgets/streaming_settings_tab.dart b/lib/features/iptv/widgets/streaming_settings_tab.dart index 4cfa2e9..9b37bfc 100644 --- a/lib/features/iptv/widgets/streaming_settings_tab.dart +++ b/lib/features/iptv/widgets/streaming_settings_tab.dart @@ -19,7 +19,7 @@ class StreamingSettingsTab extends ConsumerWidget { // Header Text( 'Paramètres Streaming Live TV', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 18, fontWeight: FontWeight.bold, color: AppColors.onSurface, @@ -28,7 +28,7 @@ class StreamingSettingsTab extends ConsumerWidget { const SizedBox(height: 8), Text( 'Ces paramètres s\'appliquent uniquement aux flux TV en direct.', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, color: AppColors.onSurfaceVariant, ), @@ -101,18 +101,18 @@ class StreamingSettingsTab extends ConsumerWidget { ConnectionTimeout.long => 'Long (60s)', }, ), - Divider(height: 1, color: Colors.white.withOpacity(0.1)), + Divider(height: 1, color: AppColors.onSurface.withOpacity(0.1)), SwitchListTile( title: Text( 'Reconnexion automatique', - style: GoogleFonts.inter(fontSize: 14, color: AppColors.onSurface), + style: GoogleFonts.karla(fontSize: 14, color: AppColors.onSurface), ), subtitle: Text( 'Se reconnecter en cas de coupure', - style: GoogleFonts.inter(fontSize: 12, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant), ), value: settings.autoReconnect, - activeThumbColor: Colors.blueAccent, + activeThumbColor: AppColors.primary, onChanged: (v) => notifier.setAutoReconnect(v), ), ], @@ -137,18 +137,18 @@ class StreamingSettingsTab extends ConsumerWidget { TranscodingMode.disabled => 'Désactivé (direct)', }, ), - Divider(height: 1, color: Colors.white.withOpacity(0.1)), + Divider(height: 1, color: AppColors.onSurface.withOpacity(0.1)), SwitchListTile( title: Text( 'Préférer lecture directe', - style: GoogleFonts.inter(fontSize: 14, color: AppColors.onSurface), + style: GoogleFonts.karla(fontSize: 14, color: AppColors.onSurface), ), subtitle: Text( 'Utiliser le flux original si compatible', - style: GoogleFonts.inter(fontSize: 12, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant), ), value: settings.preferDirectPlay, - activeThumbColor: Colors.blueAccent, + activeThumbColor: AppColors.primary, onChanged: (v) => notifier.setPreferDirectPlay(v), ), ], @@ -186,11 +186,11 @@ class StreamingSettingsTab extends ConsumerWidget { SwitchListTile( title: Text( 'Accélération NVIDIA GPU', - style: GoogleFonts.inter(fontSize: 14, color: AppColors.onSurface), + style: GoogleFonts.karla(fontSize: 14, color: AppColors.onSurface), ), subtitle: Text( 'Utiliser NVENC/NVDEC pour le transcodage (requiert GPU NVIDIA)', - style: GoogleFonts.inter(fontSize: 12, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant), ), value: settings.enableNvidiaGpu, activeThumbColor: Colors.green, @@ -204,20 +204,20 @@ class StreamingSettingsTab extends ConsumerWidget { Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: Colors.blue.withOpacity(0.1), + color: AppColors.primaryContainer.withValues(alpha: 0.10), borderRadius: BorderRadius.circular(12), - border: Border.all(color: Colors.blue.withOpacity(0.3)), + border: Border.all(color: AppColors.primaryContainer.withValues(alpha: 0.32)), ), child: Row( children: [ - const Icon(Icons.info_outline, color: Colors.blue), + const Icon(Icons.info_outline, color: AppColors.primary), const SizedBox(width: 12), Expanded( child: Text( 'Les changements prennent effet immédiatement pour les nouveaux flux.', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 12, - color: Colors.blue.shade700, + color: AppColors.primary, ), ), ), @@ -236,9 +236,9 @@ class StreamingSettingsTab extends ConsumerWidget { }) { return Container( decoration: BoxDecoration( - color: Colors.white.withOpacity(0.05), + color: AppColors.onSurface.withOpacity(0.05), borderRadius: BorderRadius.circular(16), - border: Border.all(color: Colors.white.withOpacity(0.1)), + border: Border.all(color: AppColors.onSurface.withOpacity(0.1)), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -247,11 +247,11 @@ class StreamingSettingsTab extends ConsumerWidget { padding: const EdgeInsets.all(16), child: Row( children: [ - Icon(icon, size: 20, color: Colors.blueAccent), + Icon(icon, size: 20, color: AppColors.primary), const SizedBox(width: 8), Text( title, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.onSurface, @@ -260,7 +260,7 @@ class StreamingSettingsTab extends ConsumerWidget { ], ), ), - Divider(height: 1, color: Colors.white.withOpacity(0.1)), + Divider(height: 1, color: AppColors.onSurface.withOpacity(0.1)), ...children, ], ), @@ -278,11 +278,11 @@ class StreamingSettingsTab extends ConsumerWidget { return ListTile( title: Text( title, - style: GoogleFonts.inter(fontSize: 14, color: AppColors.onSurface), + style: GoogleFonts.karla(fontSize: 14, color: AppColors.onSurface), ), subtitle: Text( subtitle, - style: GoogleFonts.inter(fontSize: 12, color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(fontSize: 12, color: AppColors.onSurfaceVariant), ), trailing: DropdownButton( value: value, @@ -293,12 +293,12 @@ class StreamingSettingsTab extends ConsumerWidget { value: item, child: Text( labelBuilder(item), - style: GoogleFonts.inter(fontSize: 13, color: AppColors.onSurface), + style: GoogleFonts.karla(fontSize: 13, color: AppColors.onSurface), ), ); }).toList(), onChanged: onChanged, - style: GoogleFonts.inter(color: AppColors.onSurface), + style: GoogleFonts.karla(color: AppColors.onSurface), iconEnabledColor: AppColors.onSurfaceVariant, ), ); diff --git a/lib/mobile/features/auth/screens/mobile_login_screen.dart b/lib/mobile/features/auth/screens/mobile_login_screen.dart index 059281f..c3083d0 100644 --- a/lib/mobile/features/auth/screens/mobile_login_screen.dart +++ b/lib/mobile/features/auth/screens/mobile_login_screen.dart @@ -124,7 +124,7 @@ class _MobileLoginScreenState extends ConsumerState { const SizedBox(height: 24), Text( 'XtremFlow', - style: GoogleFonts.spaceGrotesk( + style: GoogleFonts.fraunces( fontSize: 32, fontWeight: FontWeight.w700, color: AppColors.onSurface, @@ -133,7 +133,7 @@ class _MobileLoginScreenState extends ConsumerState { ), Text( 'Mobile Edition', - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, color: AppColors.onSurfaceVariant, letterSpacing: 0.5, @@ -173,7 +173,7 @@ class _MobileLoginScreenState extends ConsumerState { ), child: Text( authState.errorMessage!, - style: GoogleFonts.inter(color: AppColors.error, fontSize: 13), + style: GoogleFonts.karla(color: AppColors.error, fontSize: 13), textAlign: TextAlign.center, ), ), @@ -199,7 +199,7 @@ class _MobileLoginScreenState extends ConsumerState { onPressed: authState.isLoading ? null : _handleLogin, style: FilledButton.styleFrom( backgroundColor: Colors.transparent, - foregroundColor: Colors.white, + foregroundColor: AppColors.onSurface, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)), elevation: 0, ).copyWith( @@ -209,11 +209,11 @@ class _MobileLoginScreenState extends ConsumerState { ? const SizedBox( width: 24, height: 24, - child: CircularProgressIndicator(strokeWidth: 2, color: Colors.white), + child: CircularProgressIndicator(strokeWidth: 2, color: AppColors.onSurface), ) : Text( 'Sign In', - style: GoogleFonts.inter(fontWeight: FontWeight.w600, fontSize: 16, color: Colors.white), + style: GoogleFonts.karla(fontWeight: FontWeight.w600, fontSize: 16, color: AppColors.onSurface), ), ), ), @@ -243,10 +243,10 @@ class _MobileLoginScreenState extends ConsumerState { return TextFormField( controller: controller, obscureText: obscureText, - style: GoogleFonts.inter(color: AppColors.onSurface), + style: GoogleFonts.karla(color: AppColors.onSurface), decoration: InputDecoration( labelText: label, - labelStyle: GoogleFonts.inter(color: AppColors.onSurfaceVariant), + labelStyle: GoogleFonts.karla(color: AppColors.onSurfaceVariant), prefixIcon: Icon(icon, color: AppColors.onSurfaceVariant), suffixIcon: isPassword ? IconButton( diff --git a/lib/mobile/features/iptv/screens/mobile_playlist_selection_screen.dart b/lib/mobile/features/iptv/screens/mobile_playlist_selection_screen.dart index 8bbe723..e41a3f1 100644 --- a/lib/mobile/features/iptv/screens/mobile_playlist_selection_screen.dart +++ b/lib/mobile/features/iptv/screens/mobile_playlist_selection_screen.dart @@ -71,7 +71,7 @@ class MobilePlaylistSelectionScreen extends ConsumerWidget { color: AppColors.error, ), const SizedBox(height: 16), - Text('Error loading playlists', style: GoogleFonts.inter()), + Text('Error loading playlists', style: GoogleFonts.karla()), TextButton( onPressed: () => ref.refresh(playlistsProvider), child: const Text('Retry'), @@ -93,7 +93,7 @@ class MobilePlaylistSelectionScreen extends ConsumerWidget { const SizedBox(height: 16), Text( 'No playlists available', - style: GoogleFonts.inter(color: AppColors.textSecondary), + style: GoogleFonts.karla(color: AppColors.textSecondary), ), ], ), @@ -178,7 +178,7 @@ class _MobilePlaylistCard extends StatelessWidget { children: [ Text( playlist.name, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.textPrimary, @@ -189,7 +189,7 @@ class _MobilePlaylistCard extends StatelessWidget { const SizedBox(height: 4), Text( Uri.tryParse(playlist.dns)?.host ?? playlist.dns, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 13, color: AppColors.textSecondary, ), diff --git a/lib/mobile/features/iptv/screens/mobile_series_detail_screen.dart b/lib/mobile/features/iptv/screens/mobile_series_detail_screen.dart index 3c5ed3e..a37ad2d 100644 --- a/lib/mobile/features/iptv/screens/mobile_series_detail_screen.dart +++ b/lib/mobile/features/iptv/screens/mobile_series_detail_screen.dart @@ -110,7 +110,7 @@ class _MobileSeriesDetailScreenState const SizedBox(height: 16), Text( 'Error: $_error', - style: GoogleFonts.inter(color: AppColors.onSurfaceVariant), + style: GoogleFonts.karla(color: AppColors.onSurfaceVariant), ), TextButton( onPressed: _loadSeriesInfo, @@ -157,6 +157,7 @@ class _MobileSeriesDetailScreenState CachedNetworkImage( imageUrl: _seriesInfo!.cover!, fit: BoxFit.cover, + memCacheWidth: 800, errorWidget: (_, __, ___) => Container(color: AppColors.surfaceContainerLow), ), @@ -186,7 +187,7 @@ class _MobileSeriesDetailScreenState children: [ Text( _seriesInfo!.name, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 24, fontWeight: FontWeight.bold, color: AppColors.onSurface, @@ -204,7 +205,7 @@ class _MobileSeriesDetailScreenState const SizedBox(width: 4), Text( _formatRating(_seriesInfo!.rating!)!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurfaceVariant, fontSize: 13, ), @@ -213,7 +214,7 @@ class _MobileSeriesDetailScreenState ], Text( '${_seriesInfo!.episodes.keys.length} Seasons', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurfaceVariant, fontSize: 13, ), @@ -235,7 +236,7 @@ class _MobileSeriesDetailScreenState padding: const EdgeInsets.all(16.0), child: Text( _seriesInfo!.plot!, - style: GoogleFonts.inter(color: AppColors.onSurfaceVariant, height: 1.4), + style: GoogleFonts.karla(color: AppColors.onSurfaceVariant, height: 1.4), maxLines: 4, overflow: TextOverflow.ellipsis, ), @@ -262,7 +263,7 @@ class _MobileSeriesDetailScreenState }, backgroundColor: AppColors.surfaceContainer, selectedColor: AppColors.primary, - labelStyle: GoogleFonts.inter( + labelStyle: GoogleFonts.karla( color: isSelected ? AppColors.onPrimary : AppColors.onSurfaceVariant, fontWeight: isSelected ? FontWeight.w600 : FontWeight.w400, ), @@ -357,7 +358,7 @@ class _MobileSeriesDetailScreenState children: [ Text( 'E${episode.episodeNum} - ${episode.title}', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontWeight: FontWeight.w600, fontSize: 14, @@ -369,7 +370,7 @@ class _MobileSeriesDetailScreenState episode.durationSecs! > 0) Text( _formatDuration(episode.durationSecs!), - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurfaceVariant, fontSize: 12, ), diff --git a/lib/mobile/features/iptv/widgets/mobile_live_tv_tab.dart b/lib/mobile/features/iptv/widgets/mobile_live_tv_tab.dart index 3fa5d45..38578ff 100644 --- a/lib/mobile/features/iptv/widgets/mobile_live_tv_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_live_tv_tab.dart @@ -50,7 +50,7 @@ class _MobileLiveTVTabState extends ConsumerState { const SizedBox(height: 16), const Text( 'Loading channels...', - style: TextStyle(color: Colors.white70), + style: TextStyle(color: AppColors.onSurfaceVariant), ), const SizedBox(height: 24), FutureBuilder( @@ -80,8 +80,8 @@ class _MobileLiveTVTabState extends ConsumerState { const SizedBox(height: 16), Text( 'Failed to load channels', - style: GoogleFonts.inter( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontSize: 18, fontWeight: FontWeight.bold, ), @@ -89,7 +89,7 @@ class _MobileLiveTVTabState extends ConsumerState { const SizedBox(height: 8), Text( '$e', - style: const TextStyle(color: Colors.white54), + style: const TextStyle(color: AppColors.onSurface54), textAlign: TextAlign.center, ), const SizedBox(height: 24), @@ -153,15 +153,15 @@ class _MobileLiveTVTabState extends ConsumerState { Expanded( child: TextField( controller: _searchController, - style: GoogleFonts.inter(color: Colors.white), + style: GoogleFonts.karla(color: AppColors.onSurface), decoration: InputDecoration( hintText: 'Search channels...', hintStyle: - GoogleFonts.inter(color: Colors.white54), + GoogleFonts.karla(color: AppColors.onSurface54), border: InputBorder.none, prefixIcon: const Icon( Icons.search, - color: Colors.white54, + color: AppColors.onSurface54, ), isDense: true, ), @@ -171,7 +171,7 @@ class _MobileLiveTVTabState extends ConsumerState { GestureDetector( onTap: () => _searchController.clear(), child: - const Icon(Icons.close, color: Colors.white54), + const Icon(Icons.close, color: AppColors.onSurface54), ), ], ), @@ -201,15 +201,15 @@ class _MobileLiveTVTabState extends ConsumerState { ), decoration: BoxDecoration( color: isSelected - ? Colors.white + ? AppColors.onSurface : Colors.black.withOpacity(0.4), borderRadius: BorderRadius.circular(20), ), child: Text( category, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: - isSelected ? Colors.black : Colors.white70, + isSelected ? Colors.black : AppColors.onSurfaceVariant, fontWeight: isSelected ? FontWeight.w600 : FontWeight.w500, @@ -233,8 +233,8 @@ class _MobileLiveTVTabState extends ConsumerState { : _showFavoritesOnly ? 'Favorites' : _selectedCategory ?? 'Channels', - style: GoogleFonts.inter( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontWeight: FontWeight.bold, fontSize: 18, ), @@ -249,7 +249,7 @@ class _MobileLiveTVTabState extends ConsumerState { decoration: BoxDecoration( color: _showFavoritesOnly ? AppColors.live.withOpacity(0.2) - : Colors.white.withOpacity(0.1), + : AppColors.onSurface.withOpacity(0.1), borderRadius: BorderRadius.circular(8), border: _showFavoritesOnly ? Border.all(color: AppColors.live) @@ -261,7 +261,7 @@ class _MobileLiveTVTabState extends ConsumerState { : Icons.favorite_border, color: _showFavoritesOnly ? AppColors.live - : Colors.white, + : AppColors.onSurface, size: 20, ), ), @@ -279,13 +279,13 @@ class _MobileLiveTVTabState extends ConsumerState { children: [ const Icon( Icons.tv_off, - color: Colors.white24, + color: AppColors.onSurface24, size: 48, ), const SizedBox(height: 16), Text( 'No channels found', - style: GoogleFonts.inter(color: Colors.white38), + style: GoogleFonts.karla(color: AppColors.onSurface38), ), ], ), @@ -365,7 +365,7 @@ class _MobileChannelTile extends StatelessWidget { width: 48, height: 48, decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: AppColors.onSurface.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), padding: const EdgeInsets.all(4), @@ -373,17 +373,19 @@ class _MobileChannelTile extends StatelessWidget { ? Image.network( iconUrl, fit: BoxFit.contain, + cacheWidth: 120, + filterQuality: FilterQuality.low, errorBuilder: (_, __, ___) => - const Icon(Icons.tv, color: Colors.white24), + const Icon(Icons.tv, color: AppColors.onSurface24), ) - : const Icon(Icons.tv, color: Colors.white24), + : const Icon(Icons.tv, color: AppColors.onSurface24), ), const SizedBox(width: 16), Expanded( child: Text( channel.name, - style: GoogleFonts.inter( - color: Colors.white, + style: GoogleFonts.karla( + color: AppColors.onSurface, fontWeight: FontWeight.w500, fontSize: 14, ), @@ -394,12 +396,12 @@ class _MobileChannelTile extends StatelessWidget { Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( - color: Colors.white.withOpacity(0.1), + color: AppColors.onSurface.withOpacity(0.1), shape: BoxShape.circle, ), child: const Icon( Icons.play_arrow_rounded, - color: Colors.white, + color: AppColors.onSurface, size: 16, ), ), diff --git a/lib/mobile/features/iptv/widgets/mobile_movies_tab.dart b/lib/mobile/features/iptv/widgets/mobile_movies_tab.dart index 21f03c3..1b51d89 100644 --- a/lib/mobile/features/iptv/widgets/mobile_movies_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_movies_tab.dart @@ -206,13 +206,13 @@ class _MobileMoviesTabState extends ConsumerState { Expanded( child: TextField( controller: _searchController, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, color: AppColors.onSurface, ), decoration: InputDecoration( hintText: 'Search Movies...', - hintStyle: GoogleFonts.inter(color: AppColors.onSurfaceVariant), + hintStyle: GoogleFonts.karla(color: AppColors.onSurfaceVariant), border: InputBorder.none, isDense: true, contentPadding: const EdgeInsets.only(bottom: 11), @@ -300,6 +300,8 @@ class _MobileMoviesTabState extends ConsumerState { ? Image.network( _getProxiedImageUrl(movie.streamIcon, ref), fit: BoxFit.cover, + cacheWidth: 360, + filterQuality: FilterQuality.low, errorBuilder: (_, __, ___) => Container(color: AppColors.surfaceContainerLow), ) @@ -346,7 +348,7 @@ class _MobileMoviesTabState extends ConsumerState { children: [ Text( movie.name, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontSize: 13, fontWeight: FontWeight.w600, @@ -357,7 +359,7 @@ class _MobileMoviesTabState extends ConsumerState { if (isWatched) Text( 'WATCHED', - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.primary, fontSize: 10, fontWeight: FontWeight.bold, @@ -389,7 +391,7 @@ class _MobileMoviesTabState extends ConsumerState { const SizedBox(width: 4), Text( _formatRating(movie.rating)!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 10, fontWeight: FontWeight.bold, color: AppColors.onSurface, diff --git a/lib/mobile/features/iptv/widgets/mobile_series_tab.dart b/lib/mobile/features/iptv/widgets/mobile_series_tab.dart index 009c8b7..a689efd 100644 --- a/lib/mobile/features/iptv/widgets/mobile_series_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_series_tab.dart @@ -197,13 +197,13 @@ class _MobileSeriesTabState extends ConsumerState { Expanded( child: TextField( controller: _searchController, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, color: AppColors.onSurface, ), decoration: InputDecoration( hintText: 'Search Series...', - hintStyle: GoogleFonts.inter(color: AppColors.onSurfaceVariant), + hintStyle: GoogleFonts.karla(color: AppColors.onSurfaceVariant), border: InputBorder.none, isDense: true, contentPadding: const EdgeInsets.only(bottom: 11), @@ -290,6 +290,8 @@ class _MobileSeriesTabState extends ConsumerState { ? Image.network( _getProxiedImageUrl(series.cover, ref), fit: BoxFit.cover, + cacheWidth: 360, + filterQuality: FilterQuality.low, errorBuilder: (_, __, ___) => Container(color: AppColors.surfaceContainerLow), ) @@ -332,7 +334,7 @@ class _MobileSeriesTabState extends ConsumerState { right: 12, child: Text( series.name, - style: GoogleFonts.inter( + style: GoogleFonts.karla( color: AppColors.onSurface, fontSize: 13, fontWeight: FontWeight.w600, @@ -364,7 +366,7 @@ class _MobileSeriesTabState extends ConsumerState { const SizedBox(width: 4), Text( _formatRating(series.rating)!, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 10, fontWeight: FontWeight.bold, color: AppColors.onSurface, diff --git a/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart b/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart index 5840c78..e19c3e7 100644 --- a/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart +++ b/lib/mobile/features/iptv/widgets/mobile_settings_tab.dart @@ -399,7 +399,7 @@ class _SectionHeader extends StatelessWidget { padding: const EdgeInsets.only(left: 8, bottom: 8), child: Text( title, - style: GoogleFonts.inter( + style: GoogleFonts.karla( fontSize: 14, fontWeight: FontWeight.w600, color: AppColors.onSurfaceVariant, diff --git a/lib/mobile/theme/mobile_theme.dart b/lib/mobile/theme/mobile_theme.dart index 2fb09af..01bd99c 100644 --- a/lib/mobile/theme/mobile_theme.dart +++ b/lib/mobile/theme/mobile_theme.dart @@ -2,24 +2,24 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../core/theme/app_colors.dart'; -/// XtremFlow Mobile Theme +/// Thème mobile XtremFlow — déclinaison tactile de « Warm Cinema ». /// -/// Adapted from AppTheme for touch-first screens. -/// Uses the same Cyber-Cinematic Glass design system. +/// Mêmes tokens que [AppTheme] (charbon chaud / crème / braise), échelles +/// typographiques réduites et cibles tactiles élargies. class MobileTheme { MobileTheme._(); - // ============ SPACING (8px rhythmic system) ============ + // ============ ESPACEMENT ============ static const double spacingXs = 4.0; static const double spacingSm = 8.0; static const double spacingMd = 16.0; static const double spacingLg = 24.0; static const double spacingXl = 32.0; - // ============ RADIUS ============ - static const double radiusSm = 8.0; - static const double radiusMd = 12.0; - static const double radiusLg = 16.0; + // ============ RAYONS (alignés sur AppTheme) ============ + static const double radiusSm = 6.0; + static const double radiusMd = 10.0; + static const double radiusLg = 14.0; static const double radiusXl = 20.0; // ============ DARK THEME (Mobile Main) ============ @@ -32,69 +32,69 @@ class MobileTheme { // Typography: Scaled down for mobile textTheme: TextTheme( - displayLarge: GoogleFonts.spaceGrotesk( + displayLarge: GoogleFonts.fraunces( fontSize: 32, fontWeight: FontWeight.w700, letterSpacing: -0.02, height: 1.1, color: AppColors.onSurface, ), - displayMedium: GoogleFonts.spaceGrotesk( + displayMedium: GoogleFonts.fraunces( fontSize: 28, fontWeight: FontWeight.w600, letterSpacing: -0.01, height: 1.2, color: AppColors.onSurface, ), - displaySmall: GoogleFonts.spaceGrotesk( + displaySmall: GoogleFonts.fraunces( fontSize: 22, fontWeight: FontWeight.w500, height: 1.3, color: AppColors.onSurface, ), - headlineMedium: GoogleFonts.spaceGrotesk( + headlineMedium: GoogleFonts.fraunces( fontSize: 20, fontWeight: FontWeight.w500, height: 1.3, color: AppColors.onSurface, ), - titleLarge: GoogleFonts.spaceGrotesk( + titleLarge: GoogleFonts.fraunces( fontSize: 18, fontWeight: FontWeight.w600, color: AppColors.onSurface, ), - titleMedium: GoogleFonts.inter( + titleMedium: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.onSurface, ), - bodyLarge: GoogleFonts.inter( + bodyLarge: GoogleFonts.karla( fontSize: 16, fontWeight: FontWeight.w400, height: 1.5, color: AppColors.onSurfaceVariant, ), - bodyMedium: GoogleFonts.inter( + bodyMedium: GoogleFonts.karla( fontSize: 14, fontWeight: FontWeight.w400, height: 1.5, color: AppColors.onSurfaceVariant, ), - labelLarge: GoogleFonts.inter( + labelLarge: GoogleFonts.karla( fontSize: 14, fontWeight: FontWeight.w600, letterSpacing: 0.05, height: 1.2, color: AppColors.onSurface, ), - labelMedium: GoogleFonts.inter( + labelMedium: GoogleFonts.karla( fontSize: 12, fontWeight: FontWeight.w500, letterSpacing: 0.02, height: 1.2, color: AppColors.onSurface, ), - labelSmall: GoogleFonts.inter( + labelSmall: GoogleFonts.karla( fontSize: 11, fontWeight: FontWeight.w500, letterSpacing: 0.02, @@ -110,7 +110,7 @@ class MobileTheme { elevation: 0, centerTitle: true, scrolledUnderElevation: 0, - titleTextStyle: GoogleFonts.spaceGrotesk( + titleTextStyle: GoogleFonts.fraunces( fontSize: 18, fontWeight: FontWeight.w600, color: AppColors.onSurface, @@ -119,14 +119,16 @@ class MobileTheme { // Bottom Navigation Bar bottomNavigationBarTheme: BottomNavigationBarThemeData( - backgroundColor: AppColors.surfaceContainerLow.withOpacity(0.9), - selectedItemColor: AppColors.onSurface, + // Opaque : une barre translucide impose une couche de composition + // supplementaire sur toute la largeur, a chaque frame. + backgroundColor: AppColors.surfaceContainerLowest, + selectedItemColor: AppColors.primary, unselectedItemColor: AppColors.outline, - selectedLabelStyle: GoogleFonts.inter( + selectedLabelStyle: GoogleFonts.karla( fontSize: 11, fontWeight: FontWeight.w600, ), - unselectedLabelStyle: GoogleFonts.inter( + unselectedLabelStyle: GoogleFonts.karla( fontSize: 11, fontWeight: FontWeight.w500, ), @@ -157,7 +159,7 @@ class MobileTheme { width: 2, ), ), - hintStyle: GoogleFonts.inter( + hintStyle: GoogleFonts.karla( color: AppColors.outline, fontSize: 14, ), @@ -166,14 +168,16 @@ class MobileTheme { // Buttons filledButtonTheme: FilledButtonThemeData( style: FilledButton.styleFrom( - backgroundColor: AppColors.primaryContainer, - foregroundColor: AppColors.onPrimaryContainer, + // Braise profonde : seule variante qui tient le contraste AA + // (4,5:1) avec du texte blanc. + backgroundColor: AppColors.primaryFill, + foregroundColor: Colors.white, elevation: 0, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 15), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusMd), ), - textStyle: GoogleFonts.inter( + textStyle: GoogleFonts.karla( fontWeight: FontWeight.w600, fontSize: 14, ), @@ -182,7 +186,8 @@ class MobileTheme { // Cards cardTheme: CardThemeData( - color: AppColors.glassLevel1Bg, + color: AppColors.surfaceContainerLow, + surfaceTintColor: Colors.transparent, elevation: 0, margin: EdgeInsets.zero, shape: RoundedRectangleBorder( diff --git a/lib/mobile/widgets/mobile_scaffold.dart b/lib/mobile/widgets/mobile_scaffold.dart index 393fa69..1121ca6 100644 --- a/lib/mobile/widgets/mobile_scaffold.dart +++ b/lib/mobile/widgets/mobile_scaffold.dart @@ -60,9 +60,9 @@ class MobileScaffold extends ConsumerWidget { selectedItemColor: AppColors.primary, unselectedItemColor: AppColors.textSecondary, selectedLabelStyle: - GoogleFonts.inter(fontWeight: FontWeight.w600, fontSize: 11), + GoogleFonts.karla(fontWeight: FontWeight.w600, fontSize: 11), unselectedLabelStyle: - GoogleFonts.inter(fontWeight: FontWeight.w500, fontSize: 11), + GoogleFonts.karla(fontWeight: FontWeight.w500, fontSize: 11), items: const [ BottomNavigationBarItem( icon: Icon(Icons.live_tv_rounded), diff --git a/pubspec.yaml b/pubspec.yaml index 62cd7a8..603747b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -63,3 +63,8 @@ dev_dependencies: flutter: uses-material-design: true + + # Polices embarquees : google_fonts detecte ces fichiers via l'AssetManifest + # et n'effectue AUCUNE requete reseau vers fonts.gstatic.com au demarrage. + assets: + - assets/google_fonts/ diff --git a/web/index.html b/web/index.html index 951d7cd..2e5a63e 100644 --- a/web/index.html +++ b/web/index.html @@ -1,25 +1,29 @@ - + - + - - - XtremFlow IPTV + + + XtremFlow - -

- -
-
Loading...
+
+
XtremFlow
+
+
Projection
- - + + - \ No newline at end of file + diff --git a/web/player.html b/web/player.html index d985313..2da6540 100644 --- a/web/player.html +++ b/web/player.html @@ -1,127 +1,21 @@ - + XtremFlow Player - - - - + + +
-
@@ -130,243 +24,81 @@
-
-
-
Chargement du flux...
+
+
+
+
+
Ouverture du flux
+
-
-
⚠
-
Erreur de chargement
+ +
+
!
+
Erreur de chargement
+
Vérifiez le lien ou votre connexion
+ - \ No newline at end of file + diff --git a/web/player_lite.html b/web/player_lite.html index 81eea0f..e32e07b 100644 --- a/web/player_lite.html +++ b/web/player_lite.html @@ -1,120 +1,15 @@ - + - IPTV Player Lite - - - - + XtremFlow Player Lite + +
-
@@ -123,238 +18,87 @@
-
-
-
Chargement du flux...
+
+
+
+
+
Ouverture du flux
+
-
-
⚠
-
Erreur de chargement
+ +
+
!
+
Erreur de chargement
+
Vérifiez le lien ou votre connexion
+ - \ No newline at end of file + diff --git a/web/player_mobile.html b/web/player_mobile.html index 13bf62c..b780168 100644 --- a/web/player_mobile.html +++ b/web/player_mobile.html @@ -1,316 +1,134 @@ - + - - Mobile IPTV Player - - - + + + XtremFlow Player Mobile + +
- + - - - -
-
-
Chargement...
+
+
+
+
+
Ouverture du flux
+
-
-
⚠️
-
Erreur de lecture
-
Vérifiez votre connexion
+ + +
+
!
+
Erreur de lecture
+
Vérifiez votre connexion
+ diff --git a/web/vendor/hls.min.js b/web/vendor/hls.min.js new file mode 100644 index 0000000..a8dbeb2 --- /dev/null +++ b/web/vendor/hls.min.js @@ -0,0 +1,2 @@ +!function t(e){var r,i;r=this,i=function(){"use strict";function r(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,i)}return r}function i(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,i=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function m(t){var e=function(t,e){if("object"!=typeof t||null===t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var i=r.call(t,e||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"==typeof e?e:String(e)}function p(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var y={exports:{}};!function(t,e){var r,i,n,a,s;r=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,i=/^(?=([^\/?#]*))\1([^]*)$/,n=/(?:\/|^)\.(?=\/)/g,a=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,s={buildAbsoluteURL:function(t,e,r){if(r=r||{},t=t.trim(),!(e=e.trim())){if(!r.alwaysNormalize)return t;var n=s.parseURL(t);if(!n)throw new Error("Error trying to parse base URL.");return n.path=s.normalizePath(n.path),s.buildURLFromParts(n)}var a=s.parseURL(e);if(!a)throw new Error("Error trying to parse relative URL.");if(a.scheme)return r.alwaysNormalize?(a.path=s.normalizePath(a.path),s.buildURLFromParts(a)):e;var o=s.parseURL(t);if(!o)throw new Error("Error trying to parse base URL.");if(!o.netLoc&&o.path&&"/"!==o.path[0]){var l=i.exec(o.path);o.netLoc=l[1],o.path=l[2]}o.netLoc&&!o.path&&(o.path="/");var u={scheme:o.scheme,netLoc:a.netLoc,path:null,params:a.params,query:a.query,fragment:a.fragment};if(!a.netLoc&&(u.netLoc=o.netLoc,"/"!==a.path[0]))if(a.path){var h=o.path,d=h.substring(0,h.lastIndexOf("/")+1)+a.path;u.path=s.normalizePath(d)}else u.path=o.path,a.params||(u.params=o.params,a.query||(u.query=o.query));return null===u.path&&(u.path=r.alwaysNormalize?s.normalizePath(a.path):a.path),s.buildURLFromParts(u)},parseURL:function(t){var e=r.exec(t);return e?{scheme:e[1]||"",netLoc:e[2]||"",path:e[3]||"",params:e[4]||"",query:e[5]||"",fragment:e[6]||""}:null},normalizePath:function(t){for(t=t.split("").reverse().join("").replace(n,"");t.length!==(t=t.replace(a,"")).length;);return t.split("").reverse().join("")},buildURLFromParts:function(t){return t.scheme+t.netLoc+t.path+t.params+t.query+t.fragment}},t.exports=s}(y);var T=y.exports,E=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},S=function(t){return t.MEDIA_ATTACHING="hlsMediaAttaching",t.MEDIA_ATTACHED="hlsMediaAttached",t.MEDIA_DETACHING="hlsMediaDetaching",t.MEDIA_DETACHED="hlsMediaDetached",t.BUFFER_RESET="hlsBufferReset",t.BUFFER_CODECS="hlsBufferCodecs",t.BUFFER_CREATED="hlsBufferCreated",t.BUFFER_APPENDING="hlsBufferAppending",t.BUFFER_APPENDED="hlsBufferAppended",t.BUFFER_EOS="hlsBufferEos",t.BUFFER_FLUSHING="hlsBufferFlushing",t.BUFFER_FLUSHED="hlsBufferFlushed",t.MANIFEST_LOADING="hlsManifestLoading",t.MANIFEST_LOADED="hlsManifestLoaded",t.MANIFEST_PARSED="hlsManifestParsed",t.LEVEL_SWITCHING="hlsLevelSwitching",t.LEVEL_SWITCHED="hlsLevelSwitched",t.LEVEL_LOADING="hlsLevelLoading",t.LEVEL_LOADED="hlsLevelLoaded",t.LEVEL_UPDATED="hlsLevelUpdated",t.LEVEL_PTS_UPDATED="hlsLevelPtsUpdated",t.LEVELS_UPDATED="hlsLevelsUpdated",t.AUDIO_TRACKS_UPDATED="hlsAudioTracksUpdated",t.AUDIO_TRACK_SWITCHING="hlsAudioTrackSwitching",t.AUDIO_TRACK_SWITCHED="hlsAudioTrackSwitched",t.AUDIO_TRACK_LOADING="hlsAudioTrackLoading",t.AUDIO_TRACK_LOADED="hlsAudioTrackLoaded",t.SUBTITLE_TRACKS_UPDATED="hlsSubtitleTracksUpdated",t.SUBTITLE_TRACKS_CLEARED="hlsSubtitleTracksCleared",t.SUBTITLE_TRACK_SWITCH="hlsSubtitleTrackSwitch",t.SUBTITLE_TRACK_LOADING="hlsSubtitleTrackLoading",t.SUBTITLE_TRACK_LOADED="hlsSubtitleTrackLoaded",t.SUBTITLE_FRAG_PROCESSED="hlsSubtitleFragProcessed",t.CUES_PARSED="hlsCuesParsed",t.NON_NATIVE_TEXT_TRACKS_FOUND="hlsNonNativeTextTracksFound",t.INIT_PTS_FOUND="hlsInitPtsFound",t.FRAG_LOADING="hlsFragLoading",t.FRAG_LOAD_EMERGENCY_ABORTED="hlsFragLoadEmergencyAborted",t.FRAG_LOADED="hlsFragLoaded",t.FRAG_DECRYPTED="hlsFragDecrypted",t.FRAG_PARSING_INIT_SEGMENT="hlsFragParsingInitSegment",t.FRAG_PARSING_USERDATA="hlsFragParsingUserdata",t.FRAG_PARSING_METADATA="hlsFragParsingMetadata",t.FRAG_PARSED="hlsFragParsed",t.FRAG_BUFFERED="hlsFragBuffered",t.FRAG_CHANGED="hlsFragChanged",t.FPS_DROP="hlsFpsDrop",t.FPS_DROP_LEVEL_CAPPING="hlsFpsDropLevelCapping",t.ERROR="hlsError",t.DESTROYING="hlsDestroying",t.KEY_LOADING="hlsKeyLoading",t.KEY_LOADED="hlsKeyLoaded",t.LIVE_BACK_BUFFER_REACHED="hlsLiveBackBufferReached",t.BACK_BUFFER_REACHED="hlsBackBufferReached",t}({}),L=function(t){return t.NETWORK_ERROR="networkError",t.MEDIA_ERROR="mediaError",t.KEY_SYSTEM_ERROR="keySystemError",t.MUX_ERROR="muxError",t.OTHER_ERROR="otherError",t}({}),R=function(t){return t.KEY_SYSTEM_NO_KEYS="keySystemNoKeys",t.KEY_SYSTEM_NO_ACCESS="keySystemNoAccess",t.KEY_SYSTEM_NO_SESSION="keySystemNoSession",t.KEY_SYSTEM_NO_CONFIGURED_LICENSE="keySystemNoConfiguredLicense",t.KEY_SYSTEM_LICENSE_REQUEST_FAILED="keySystemLicenseRequestFailed",t.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED="keySystemServerCertificateRequestFailed",t.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED="keySystemServerCertificateUpdateFailed",t.KEY_SYSTEM_SESSION_UPDATE_FAILED="keySystemSessionUpdateFailed",t.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED="keySystemStatusOutputRestricted",t.KEY_SYSTEM_STATUS_INTERNAL_ERROR="keySystemStatusInternalError",t.MANIFEST_LOAD_ERROR="manifestLoadError",t.MANIFEST_LOAD_TIMEOUT="manifestLoadTimeOut",t.MANIFEST_PARSING_ERROR="manifestParsingError",t.MANIFEST_INCOMPATIBLE_CODECS_ERROR="manifestIncompatibleCodecsError",t.LEVEL_EMPTY_ERROR="levelEmptyError",t.LEVEL_LOAD_ERROR="levelLoadError",t.LEVEL_LOAD_TIMEOUT="levelLoadTimeOut",t.LEVEL_PARSING_ERROR="levelParsingError",t.LEVEL_SWITCH_ERROR="levelSwitchError",t.AUDIO_TRACK_LOAD_ERROR="audioTrackLoadError",t.AUDIO_TRACK_LOAD_TIMEOUT="audioTrackLoadTimeOut",t.SUBTITLE_LOAD_ERROR="subtitleTrackLoadError",t.SUBTITLE_TRACK_LOAD_TIMEOUT="subtitleTrackLoadTimeOut",t.FRAG_LOAD_ERROR="fragLoadError",t.FRAG_LOAD_TIMEOUT="fragLoadTimeOut",t.FRAG_DECRYPT_ERROR="fragDecryptError",t.FRAG_PARSING_ERROR="fragParsingError",t.FRAG_GAP="fragGap",t.REMUX_ALLOC_ERROR="remuxAllocError",t.KEY_LOAD_ERROR="keyLoadError",t.KEY_LOAD_TIMEOUT="keyLoadTimeOut",t.BUFFER_ADD_CODEC_ERROR="bufferAddCodecError",t.BUFFER_INCOMPATIBLE_CODECS_ERROR="bufferIncompatibleCodecsError",t.BUFFER_APPEND_ERROR="bufferAppendError",t.BUFFER_APPENDING_ERROR="bufferAppendingError",t.BUFFER_STALLED_ERROR="bufferStalledError",t.BUFFER_FULL_ERROR="bufferFullError",t.BUFFER_SEEK_OVER_HOLE="bufferSeekOverHole",t.BUFFER_NUDGE_ON_STALL="bufferNudgeOnStall",t.INTERNAL_EXCEPTION="internalException",t.INTERNAL_ABORTED="aborted",t.UNKNOWN="unknown",t}({}),A=function(){},k={trace:A,debug:A,log:A,warn:A,info:A,error:A},b=k;function D(t){var e=self.console[t];return e?e.bind(self.console,"["+t+"] >"):A}function I(t,e){if(self.console&&!0===t||"object"==typeof t){!function(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;iNumber.MAX_SAFE_INTEGER?1/0:e},e.hexadecimalInteger=function(t){if(this[t]){var e=(this[t]||"0x").slice(2);e=(1&e.length?"0":"")+e;for(var r=new Uint8Array(e.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:e},e.decimalFloatingPoint=function(t){return parseFloat(this[t])},e.optionalFloat=function(t,e){var r=this[t];return r?parseFloat(r):e},e.enumeratedString=function(t){return this[t]},e.bool=function(t){return"YES"===this[t]},e.decimalResolution=function(t){var e=C.exec(this[t]);if(null!==e)return{width:parseInt(e[1],10),height:parseInt(e[2],10)}},t.parseAttrList=function(t){var e,r={};for(_.lastIndex=0;null!==(e=_.exec(t));){var i=e[2];0===i.indexOf('"')&&i.lastIndexOf('"')===i.length-1&&(i=i.slice(1,-1)),r[e[1].trim()]=i}return r},t}();function x(t){return"SCTE35-OUT"===t||"SCTE35-IN"===t}var F=function(){function t(t,e){if(this.attr=void 0,this._startDate=void 0,this._endDate=void 0,this._badValueForSameId=void 0,e){var r=e.attr;for(var i in r)if(Object.prototype.hasOwnProperty.call(t,i)&&t[i]!==r[i]){w.warn('DATERANGE tag attribute: "'+i+'" does not match for tags with ID: "'+t.ID+'"'),this._badValueForSameId=i;break}t=o(new P({}),r,t)}if(this.attr=t,this._startDate=new Date(t["START-DATE"]),"END-DATE"in this.attr){var n=new Date(this.attr["END-DATE"]);E(n.getTime())&&(this._endDate=n)}}return a(t,[{key:"id",get:function(){return this.attr.ID}},{key:"class",get:function(){return this.attr.CLASS}},{key:"startDate",get:function(){return this._startDate}},{key:"endDate",get:function(){if(this._endDate)return this._endDate;var t=this.duration;return null!==t?new Date(this._startDate.getTime()+1e3*t):null}},{key:"duration",get:function(){if("DURATION"in this.attr){var t=this.attr.decimalFloatingPoint("DURATION");if(E(t))return t}else if(this._endDate)return(this._endDate.getTime()-this._startDate.getTime())/1e3;return null}},{key:"plannedDuration",get:function(){return"PLANNED-DURATION"in this.attr?this.attr.decimalFloatingPoint("PLANNED-DURATION"):null}},{key:"endOnNext",get:function(){return this.attr.bool("END-ON-NEXT")}},{key:"isValid",get:function(){return!!this.id&&!this._badValueForSameId&&E(this.startDate.getTime())&&(null===this.duration||this.duration>=0)&&(!this.endOnNext||!!this.class)}}]),t}(),M=function(){this.aborted=!1,this.loaded=0,this.retry=0,this.total=0,this.chunkCount=0,this.bwEstimate=0,this.loading={start:0,first:0,end:0},this.parsing={start:0,end:0},this.buffering={start:0,first:0,end:0}},O="audio",N="video",U="audiovideo",B=function(){function t(t){var e;this._byteRange=null,this._url=null,this.baseurl=void 0,this.relurl=void 0,this.elementaryStreams=((e={})[O]=null,e[N]=null,e[U]=null,e),this.baseurl=t}return t.prototype.setByteRange=function(t,e){var r=t.split("@",2),i=[];1===r.length?i[0]=e?e.byteRangeEndOffset:0:i[0]=parseInt(r[1]),i[1]=parseInt(r[0])+i[0],this._byteRange=i},a(t,[{key:"byteRange",get:function(){return this._byteRange?this._byteRange:[]}},{key:"byteRangeStartOffset",get:function(){return this.byteRange[0]}},{key:"byteRangeEndOffset",get:function(){return this.byteRange[1]}},{key:"url",get:function(){return!this._url&&this.baseurl&&this.relurl&&(this._url=T.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url||""},set:function(t){this._url=t}}]),t}(),G=function(t){function e(e,r){var i;return(i=t.call(this,r)||this)._decryptdata=null,i.rawProgramDateTime=null,i.programDateTime=null,i.tagList=[],i.duration=0,i.sn=0,i.levelkeys=void 0,i.type=void 0,i.loader=null,i.keyLoader=null,i.level=-1,i.cc=0,i.startPTS=void 0,i.endPTS=void 0,i.startDTS=void 0,i.endDTS=void 0,i.start=0,i.deltaPTS=void 0,i.maxStartPTS=void 0,i.minEndPTS=void 0,i.stats=new M,i.urlId=0,i.data=void 0,i.bitrateTest=!1,i.title=null,i.initSegment=null,i.endList=void 0,i.gap=void 0,i.type=e,i}l(e,t);var r=e.prototype;return r.setKeyFormat=function(t){if(this.levelkeys){var e=this.levelkeys[t];e&&!this._decryptdata&&(this._decryptdata=e.getDecryptData(this.sn))}},r.abortRequests=function(){var t,e;null==(t=this.loader)||t.abort(),null==(e=this.keyLoader)||e.abort()},r.setElementaryStreamInfo=function(t,e,r,i,n,a){void 0===a&&(a=!1);var s=this.elementaryStreams,o=s[t];o?(o.startPTS=Math.min(o.startPTS,e),o.endPTS=Math.max(o.endPTS,r),o.startDTS=Math.min(o.startDTS,i),o.endDTS=Math.max(o.endDTS,n)):s[t]={startPTS:e,endPTS:r,startDTS:i,endDTS:n,partial:a}},r.clearElementaryStreamInfo=function(){var t=this.elementaryStreams;t[O]=null,t[N]=null,t[U]=null},a(e,[{key:"decryptdata",get:function(){if(!this.levelkeys&&!this._decryptdata)return null;if(!this._decryptdata&&this.levelkeys&&!this.levelkeys.NONE){var t=this.levelkeys.identity;if(t)this._decryptdata=t.getDecryptData(this.sn);else{var e=Object.keys(this.levelkeys);if(1===e.length)return this._decryptdata=this.levelkeys[e[0]].getDecryptData(this.sn)}}return this._decryptdata}},{key:"end",get:function(){return this.start+this.duration}},{key:"endProgramDateTime",get:function(){if(null===this.programDateTime)return null;if(!E(this.programDateTime))return null;var t=E(this.duration)?this.duration:0;return this.programDateTime+1e3*t}},{key:"encrypted",get:function(){var t;if(null!=(t=this._decryptdata)&&t.encrypted)return!0;if(this.levelkeys){var e=Object.keys(this.levelkeys),r=e.length;if(r>1||1===r&&this.levelkeys[e[0]].encrypted)return!0}return!1}}]),e}(B),K=function(t){function e(e,r,i,n,a){var s;(s=t.call(this,i)||this).fragOffset=0,s.duration=0,s.gap=!1,s.independent=!1,s.relurl=void 0,s.fragment=void 0,s.index=void 0,s.stats=new M,s.duration=e.decimalFloatingPoint("DURATION"),s.gap=e.bool("GAP"),s.independent=e.bool("INDEPENDENT"),s.relurl=e.enumeratedString("URI"),s.fragment=r,s.index=n;var o=e.enumeratedString("BYTERANGE");return o&&s.setByteRange(o,a),a&&(s.fragOffset=a.fragOffset+a.duration),s}return l(e,t),a(e,[{key:"start",get:function(){return this.fragment.start+this.fragOffset}},{key:"end",get:function(){return this.start+this.duration}},{key:"loaded",get:function(){var t=this.elementaryStreams;return!!(t.audio||t.video||t.audiovideo)}}]),e}(B),H=function(){function t(t){this.PTSKnown=!1,this.alignedSliding=!1,this.averagetargetduration=void 0,this.endCC=0,this.endSN=0,this.fragments=void 0,this.fragmentHint=void 0,this.partList=null,this.dateRanges=void 0,this.live=!0,this.ageHeader=0,this.advancedDateTime=void 0,this.updated=!0,this.advanced=!0,this.availabilityDelay=void 0,this.misses=0,this.startCC=0,this.startSN=0,this.startTimeOffset=null,this.targetduration=0,this.totalduration=0,this.type=null,this.url=void 0,this.m3u8="",this.version=null,this.canBlockReload=!1,this.canSkipUntil=0,this.canSkipDateRanges=!1,this.skippedSegments=0,this.recentlyRemovedDateranges=void 0,this.partHoldBack=0,this.holdBack=0,this.partTarget=0,this.preloadHint=void 0,this.renditionReports=void 0,this.tuneInGoal=0,this.deltaUpdateFailed=void 0,this.driftStartTime=0,this.driftEndTime=0,this.driftStart=0,this.driftEnd=0,this.encryptedFragments=void 0,this.playlistParsingError=null,this.variableList=null,this.hasVariableRefs=!1,this.fragments=[],this.encryptedFragments=[],this.dateRanges={},this.url=t}return t.prototype.reloaded=function(t){if(!t)return this.advanced=!0,void(this.updated=!0);var e=this.lastPartSn-t.lastPartSn,r=this.lastPartIndex-t.lastPartIndex;this.updated=this.endSN!==t.endSN||!!r||!!e||!this.live,this.advanced=this.endSN>t.endSN||e>0||0===e&&r>0,this.updated||this.advanced?this.misses=Math.floor(.6*t.misses):this.misses=t.misses+1,this.availabilityDelay=t.availabilityDelay},a(t,[{key:"hasProgramDateTime",get:function(){return!!this.fragments.length&&E(this.fragments[this.fragments.length-1].programDateTime)}},{key:"levelTargetDuration",get:function(){return this.averagetargetduration||this.targetduration||10}},{key:"drift",get:function(){var t=this.driftEndTime-this.driftStartTime;return t>0?1e3*(this.driftEnd-this.driftStart)/t:1}},{key:"edge",get:function(){return this.partEnd||this.fragmentEnd}},{key:"partEnd",get:function(){var t;return null!=(t=this.partList)&&t.length?this.partList[this.partList.length-1].end:this.fragmentEnd}},{key:"fragmentEnd",get:function(){var t;return null!=(t=this.fragments)&&t.length?this.fragments[this.fragments.length-1].end:0}},{key:"age",get:function(){return this.advancedDateTime?Math.max(Date.now()-this.advancedDateTime,0)/1e3:0}},{key:"lastPartIndex",get:function(){var t;return null!=(t=this.partList)&&t.length?this.partList[this.partList.length-1].index:-1}},{key:"lastPartSn",get:function(){var t;return null!=(t=this.partList)&&t.length?this.partList[this.partList.length-1].fragment.sn:this.endSN}}]),t}();function V(t){return Uint8Array.from(atob(t),(function(t){return t.charCodeAt(0)}))}function Y(t){var e,r,i=t.split(":"),n=null;if("data"===i[0]&&2===i.length){var a=i[1].split(";"),s=a[a.length-1].split(",");if(2===s.length){var o="base64"===s[0],l=s[1];o?(a.splice(-1,1),n=V(l)):(e=W(l).subarray(0,16),(r=new Uint8Array(16)).set(e,16-e.length),n=r)}}return n}function W(t){return Uint8Array.from(unescape(encodeURIComponent(t)),(function(t){return t.charCodeAt(0)}))}var j={CLEARKEY:"org.w3.clearkey",FAIRPLAY:"com.apple.fps",PLAYREADY:"com.microsoft.playready",WIDEVINE:"com.widevine.alpha"},q="org.w3.clearkey",X="com.apple.streamingkeydelivery",z="com.microsoft.playready",Q="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed";function $(t){switch(t){case X:return j.FAIRPLAY;case z:return j.PLAYREADY;case Q:return j.WIDEVINE;case q:return j.CLEARKEY}}var J="edef8ba979d64acea3c827dcd51d21ed";function Z(t){switch(t){case j.FAIRPLAY:return X;case j.PLAYREADY:return z;case j.WIDEVINE:return Q;case j.CLEARKEY:return q}}function tt(t){var e=t.drmSystems,r=t.widevineLicenseUrl,i=e?[j.FAIRPLAY,j.WIDEVINE,j.PLAYREADY,j.CLEARKEY].filter((function(t){return!!e[t]})):[];return!i[j.WIDEVINE]&&r&&i.push(j.WIDEVINE),i}var et="undefined"!=typeof self&&self.navigator&&self.navigator.requestMediaKeySystemAccess?self.navigator.requestMediaKeySystemAccess.bind(self.navigator):null;function rt(t,e,r){return Uint8Array.prototype.slice?t.slice(e,r):new Uint8Array(Array.prototype.slice.call(t,e,r))}var it,nt=function(t,e){return e+10<=t.length&&73===t[e]&&68===t[e+1]&&51===t[e+2]&&t[e+3]<255&&t[e+4]<255&&t[e+6]<128&&t[e+7]<128&&t[e+8]<128&&t[e+9]<128},at=function(t,e){return e+10<=t.length&&51===t[e]&&68===t[e+1]&&73===t[e+2]&&t[e+3]<255&&t[e+4]<255&&t[e+6]<128&&t[e+7]<128&&t[e+8]<128&&t[e+9]<128},st=function(t,e){for(var r=e,i=0;nt(t,e);)i+=10,i+=ot(t,e+6),at(t,e+10)&&(i+=10),e+=i;if(i>0)return t.subarray(r,r+i)},ot=function(t,e){var r=0;return r=(127&t[e])<<21,r|=(127&t[e+1])<<14,r|=(127&t[e+2])<<7,r|=127&t[e+3]},lt=function(t,e){return nt(t,e)&&ot(t,e+6)+10<=t.length-e},ut=function(t){return t&&"PRIV"===t.key&&"com.apple.streaming.transportStreamTimestamp"===t.info},ht=function(t){var e=String.fromCharCode(t[0],t[1],t[2],t[3]),r=ot(t,4);return{type:e,size:r,data:t.subarray(10,10+r)}},dt=function(t){for(var e=0,r=[];nt(t,e);){for(var i=ot(t,e+6),n=(e+=10)+i;e+8>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:u+=String.fromCharCode(a);break;case 12:case 13:s=t[h++],u+=String.fromCharCode((31&a)<<6|63&s);break;case 14:s=t[h++],o=t[h++],u+=String.fromCharCode((15&a)<<12|(63&s)<<6|(63&o)<<0)}}return u};function yt(){return it||void 0===self.TextDecoder||(it=new self.TextDecoder("utf-8")),it}var Tt=function(t){for(var e="",r=0;r>24,t[e+1]=r>>16&255,t[e+2]=r>>8&255,t[e+3]=255&r}function It(t,e){var r=[];if(!e.length)return r;for(var i=t.byteLength,n=0;n1?n+a:i;if(Rt(t.subarray(n+4,n+8))===e[0])if(1===e.length)r.push(t.subarray(n+8,s));else{var o=It(t.subarray(n+8,s),e.slice(1));o.length&&St.apply(r,o)}n=s}return r}function wt(t){var e=[],r=t[0],i=8,n=kt(t,i);i+=4,i+=0===r?8:16,i+=2;var a=t.length+0,s=At(t,i);i+=2;for(var o=0;o>>31)return w.warn("SIDX has hierarchical references (not supported)"),null;var d=kt(t,l);l+=4,e.push({referenceSize:h,subsegmentDuration:d,info:{duration:d/n,start:a,end:a+h-1}}),a+=h,i=l+=4}return{earliestPresentationTime:0,timescale:n,version:r,referencesCount:s,references:e}}function Ct(t){for(var e=[],r=It(t,["moov","trak"]),i=0;i>1&63;return 39===r||40===r}return 6==(31&e)}function Ot(t,e,r,i){var n=Nt(t),a=0;a+=e;for(var s=0,o=0,l=!1,u=0;a=n.length)break;s+=u=n[a++]}while(255===u);o=0;do{if(a>=n.length)break;o+=u=n[a++]}while(255===u);var h=n.length-a;if(!l&&4===s&&a16){for(var T=[],E=0;E<16;E++){var S=n[a++].toString(16);T.push(1==S.length?"0"+S:S),3!==E&&5!==E&&7!==E&&9!==E||T.push("-")}for(var L=o-16,R=new Uint8Array(L),A=0;Ah)break}}function Nt(t){for(var e=t.byteLength,r=[],i=1;i0?(a=new Uint8Array(4),e.length>0&&new DataView(a.buffer).setUint32(0,e.length,!1)):a=new Uint8Array;var l=new Uint8Array(4);return r&&r.byteLength>0&&new DataView(l.buffer).setUint32(0,r.byteLength,!1),function(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;i>24&255,o[1]=a>>16&255,o[2]=a>>8&255,o[3]=255&a,o.set(t,4),s=0,a=8;s>8*(15-r)&255;return e}(e);return new t(this.method,this.uri,"identity",this.keyFormatVersions,r)}var i=Y(this.uri);if(i)switch(this.keyFormat){case Q:this.pssh=i,i.length>=22&&(this.keyId=i.subarray(i.length-22,i.length-6));break;case z:var n=new Uint8Array([154,4,240,121,152,64,66,134,171,146,230,91,224,136,95,149]);this.pssh=Ut(n,null,i);var a=new Uint16Array(i.buffer,i.byteOffset,i.byteLength/2),s=String.fromCharCode.apply(null,Array.from(a)),o=s.substring(s.indexOf("<"),s.length),l=(new DOMParser).parseFromString(o,"text/xml").getElementsByTagName("KID")[0];if(l){var u=l.childNodes[0]?l.childNodes[0].nodeValue:l.getAttribute("VALUE");if(u){var h=V(u).subarray(0,16);!function(t){var e=function(t,e,r){var i=t[e];t[e]=t[r],t[r]=i};e(t,0,3),e(t,1,2),e(t,4,5),e(t,6,7)}(h),this.keyId=h}}break;default:var d=i.subarray(0,16);if(16!==d.length){var c=new Uint8Array(16);c.set(d,16-d.length),d=c}this.keyId=d}if(!this.keyId||16!==this.keyId.byteLength){var f=Bt[this.uri];if(!f){var g=Object.keys(Bt).length%Number.MAX_SAFE_INTEGER;f=new Uint8Array(16),new DataView(f.buffer,12,4).setUint32(0,g),Bt[this.uri]=f}this.keyId=f}return this},t}(),Kt=/\{\$([a-zA-Z0-9-_]+)\}/g;function Ht(t){return Kt.test(t)}function Vt(t,e,r){if(null!==t.variableList||t.hasVariableRefs)for(var i=r.length;i--;){var n=r[i],a=e[n];a&&(e[n]=Yt(t,a))}}function Yt(t,e){if(null!==t.variableList||t.hasVariableRefs){var r=t.variableList;return e.replace(Kt,(function(e){var i=e.substring(2,e.length-1),n=null==r?void 0:r[i];return void 0===n?(t.playlistParsingError||(t.playlistParsingError=new Error('Missing preceding EXT-X-DEFINE tag for Variable Reference: "'+i+'"')),e):n}))}return e}function Wt(t,e,r){var i,n,a=t.variableList;if(a||(t.variableList=a={}),"QUERYPARAM"in e){i=e.QUERYPARAM;try{var s=new self.URL(r).searchParams;if(!s.has(i))throw new Error('"'+i+'" does not match any query parameter in URI: "'+r+'"');n=s.get(i)}catch(e){t.playlistParsingError||(t.playlistParsingError=new Error("EXT-X-DEFINE QUERYPARAM: "+e.message))}}else i=e.NAME,n=e.VALUE;i in a?t.playlistParsingError||(t.playlistParsingError=new Error('EXT-X-DEFINE duplicate Variable Name declarations: "'+i+'"')):a[i]=n||""}function jt(t,e,r){var i=e.IMPORT;if(r&&i in r){var n=t.variableList;n||(t.variableList=n={}),n[i]=r[i]}else t.playlistParsingError||(t.playlistParsingError=new Error('EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: "'+i+'"'))}function qt(){if("undefined"!=typeof self)return self.MediaSource||self.WebKitMediaSource}var Xt={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,av01:!0,drac:!0,dva1:!0,dvav:!0,dvh1:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0},text:{stpp:!0,wvtt:!0}},zt=qt();function Qt(t,e){var r;return null!=(r=null==zt?void 0:zt.isTypeSupported((e||"video")+'/mp4;codecs="'+t+'"'))&&r}var $t=/#EXT-X-STREAM-INF:([^\r\n]*)(?:[\r\n](?:#[^\r\n]*)?)*([^\r\n]+)|#EXT-X-(SESSION-DATA|SESSION-KEY|DEFINE|CONTENT-STEERING|START):([^\r\n]*)[\r\n]+/g,Jt=/#EXT-X-MEDIA:(.*)/g,Zt=/^#EXT(?:INF|-X-TARGETDURATION):/m,te=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/(?!#) *(\S[\S ]*)/.source,/#EXT-X-BYTERANGE:*(.+)/.source,/#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/#.*/.source].join("|"),"g"),ee=new RegExp([/#(EXTM3U)/.source,/#EXT-X-(DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source,/#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\d+)/.source,/#EXT-X-(DISCONTINUITY|ENDLIST|GAP)/.source,/(#)([^:]*):(.*)/.source,/(#)(.*)(?:.*)\r?\n?/.source].join("|")),re=function(){function t(){}return t.findGroup=function(t,e){for(var r=0;r2){var r=e.shift()+".";return r+=parseInt(e.shift()).toString(16),r+=("000"+parseInt(e.shift()).toString(16)).slice(-4)}return t},t.resolve=function(t,e){return T.buildAbsoluteURL(e,t,{alwaysNormalize:!0})},t.isMediaPlaylist=function(t){return Zt.test(t)},t.parseMasterPlaylist=function(e,r){var i,n={contentSteering:null,levels:[],playlistParsingError:null,sessionData:null,sessionKeys:null,startTimeOffset:null,variableList:null,hasVariableRefs:Ht(e)},a=[];for($t.lastIndex=0;null!=(i=$t.exec(e));)if(i[1]){var s,o=new P(i[1]);Vt(n,o,["CODECS","SUPPLEMENTAL-CODECS","ALLOWED-CPC","PATHWAY-ID","STABLE-VARIANT-ID","AUDIO","VIDEO","SUBTITLES","CLOSED-CAPTIONS","NAME"]);var l=Yt(n,i[2]),u={attrs:o,bitrate:o.decimalInteger("AVERAGE-BANDWIDTH")||o.decimalInteger("BANDWIDTH"),name:o.NAME,url:t.resolve(l,r)},h=o.decimalResolution("RESOLUTION");h&&(u.width=h.width,u.height=h.height),ae((o.CODECS||"").split(/[ ,]+/).filter((function(t){return t})),u),u.videoCodec&&-1!==u.videoCodec.indexOf("avc1")&&(u.videoCodec=t.convertAVC1ToAVCOTI(u.videoCodec)),null!=(s=u.unknownCodecs)&&s.length||a.push(u),n.levels.push(u)}else if(i[3]){var d=i[3],c=i[4];switch(d){case"SESSION-DATA":var f=new P(c);Vt(n,f,["DATA-ID","LANGUAGE","VALUE","URI"]);var g=f["DATA-ID"];g&&(null===n.sessionData&&(n.sessionData={}),n.sessionData[g]=f);break;case"SESSION-KEY":var v=ie(c,r,n);v.encrypted&&v.isSupported()?(null===n.sessionKeys&&(n.sessionKeys=[]),n.sessionKeys.push(v)):w.warn('[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: "'+c+'"');break;case"DEFINE":var m=new P(c);Vt(n,m,["NAME","VALUE","QUERYPARAM"]),Wt(n,m,r);break;case"CONTENT-STEERING":var p=new P(c);Vt(n,p,["SERVER-URI","PATHWAY-ID"]),n.contentSteering={uri:t.resolve(p["SERVER-URI"],r),pathwayId:p["PATHWAY-ID"]||"."};break;case"START":n.startTimeOffset=ne(c)}}var y=a.length>0&&a.length0&&W.bool("CAN-SKIP-DATERANGES"),h.partHoldBack=W.optionalFloat("PART-HOLD-BACK",0),h.holdBack=W.optionalFloat("HOLD-BACK",0);break;case"PART-INF":var j=new P(D);h.partTarget=j.decimalFloatingPoint("PART-TARGET");break;case"PART":var q=h.partList;q||(q=h.partList=[]);var X=g>0?q[q.length-1]:void 0,z=g++,Q=new P(D);Vt(h,Q,["BYTERANGE","URI"]);var $=new K(Q,y,e,z,X);q.push($),y.duration+=$.duration;break;case"PRELOAD-HINT":var J=new P(D);Vt(h,J,["URI"]),h.preloadHint=J;break;case"RENDITION-REPORT":var Z=new P(D);Vt(h,Z,["URI"]),h.renditionReports=h.renditionReports||[],h.renditionReports.push(Z);break;default:w.warn("line parsed but not handled: "+s)}}}p&&!p.relurl?(d.pop(),v-=p.duration,h.partList&&(h.fragmentHint=p)):h.partList&&(oe(y,p),y.cc=m,h.fragmentHint=y,u&&ue(y,u,h));var tt=d.length,et=d[0],rt=d[tt-1];if((v+=h.skippedSegments*h.targetduration)>0&&tt&&rt){h.averagetargetduration=v/tt;var it=rt.sn;h.endSN="initSegment"!==it?it:0,h.live||(rt.endList=!0),et&&(h.startCC=et.cc)}else h.endSN=0,h.startCC=0;return h.fragmentHint&&(v+=h.fragmentHint.duration),h.totalduration=v,h.endCC=m,T>0&&function(t,e){for(var r=t[e],i=e;i--;){var n=t[i];if(!n)return;n.programDateTime=r.programDateTime-1e3*n.duration,r=n}}(d,T),h},t}();function ie(t,e,r){var i,n,a=new P(t);Vt(r,a,["KEYFORMAT","KEYFORMATVERSIONS","URI","IV","URI"]);var s=null!=(i=a.METHOD)?i:"",o=a.URI,l=a.hexadecimalInteger("IV"),u=a.KEYFORMATVERSIONS,h=null!=(n=a.KEYFORMAT)?n:"identity";o&&a.IV&&!l&&w.error("Invalid IV: "+a.IV);var d=o?re.resolve(o,e):"",c=(u||"1").split("/").map(Number).filter(Number.isFinite);return new Gt(s,d,h,c,l)}function ne(t){var e=new P(t).decimalFloatingPoint("TIME-OFFSET");return E(e)?e:null}function ae(t,e){["video","audio","text"].forEach((function(r){var i=t.filter((function(t){return function(t,e){var r=Xt[e];return!!r&&!0===r[t.slice(0,4)]}(t,r)}));if(i.length){var n=i.filter((function(t){return 0===t.lastIndexOf("avc1",0)||0===t.lastIndexOf("mp4a",0)}));e[r+"Codec"]=n.length>0?n[0]:i[0],t=t.filter((function(t){return-1===i.indexOf(t)}))}})),e.unknownCodecs=t}function se(t,e,r){var i=e[r];i&&(t[r]=i)}function oe(t,e){t.rawProgramDateTime?t.programDateTime=Date.parse(t.rawProgramDateTime):null!=e&&e.programDateTime&&(t.programDateTime=e.endProgramDateTime),E(t.programDateTime)||(t.programDateTime=null,t.rawProgramDateTime=null)}function le(t,e,r,i){t.relurl=e.URI,e.BYTERANGE&&t.setByteRange(e.BYTERANGE),t.level=r,t.sn="initSegment",i&&(t.levelkeys=i),t.initSegment=null}function ue(t,e,r){t.levelkeys=e;var i=r.encryptedFragments;i.length&&i[i.length-1].levelkeys===e||!Object.keys(e).some((function(t){return e[t].isCommonEncryption}))||i.push(t)}var he="manifest",de="level",ce="audioTrack",fe="subtitleTrack",ge="main",ve="audio",me="subtitle";function pe(t){switch(t.type){case ce:return ve;case fe:return me;default:return ge}}function ye(t,e){var r=t.url;return void 0!==r&&0!==r.indexOf("data:")||(r=e.url),r}var Te=function(){function t(t){this.hls=void 0,this.loaders=Object.create(null),this.variableList=null,this.hls=t,this.registerListeners()}var e=t.prototype;return e.startLoad=function(t){},e.stopLoad=function(){this.destroyInternalLoaders()},e.registerListeners=function(){var t=this.hls;t.on(S.MANIFEST_LOADING,this.onManifestLoading,this),t.on(S.LEVEL_LOADING,this.onLevelLoading,this),t.on(S.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),t.on(S.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this)},e.unregisterListeners=function(){var t=this.hls;t.off(S.MANIFEST_LOADING,this.onManifestLoading,this),t.off(S.LEVEL_LOADING,this.onLevelLoading,this),t.off(S.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),t.off(S.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this)},e.createInternalLoader=function(t){var e=this.hls.config,r=e.pLoader,i=e.loader,n=new(r||i)(e);return this.loaders[t.type]=n,n},e.getInternalLoader=function(t){return this.loaders[t.type]},e.resetInternalLoader=function(t){this.loaders[t]&&delete this.loaders[t]},e.destroyInternalLoaders=function(){for(var t in this.loaders){var e=this.loaders[t];e&&e.destroy(),this.resetInternalLoader(t)}},e.destroy=function(){this.variableList=null,this.unregisterListeners(),this.destroyInternalLoaders()},e.onManifestLoading=function(t,e){var r=e.url;this.variableList=null,this.load({id:null,level:0,responseType:"text",type:he,url:r,deliveryDirectives:null})},e.onLevelLoading=function(t,e){var r=e.id,i=e.level,n=e.url,a=e.deliveryDirectives;this.load({id:r,level:i,responseType:"text",type:de,url:n,deliveryDirectives:a})},e.onAudioTrackLoading=function(t,e){var r=e.id,i=e.groupId,n=e.url,a=e.deliveryDirectives;this.load({id:r,groupId:i,level:null,responseType:"text",type:ce,url:n,deliveryDirectives:a})},e.onSubtitleTrackLoading=function(t,e){var r=e.id,i=e.groupId,n=e.url,a=e.deliveryDirectives;this.load({id:r,groupId:i,level:null,responseType:"text",type:fe,url:n,deliveryDirectives:a})},e.load=function(t){var e,r,i,n=this,a=this.hls.config,s=this.getInternalLoader(t);if(s){var l=s.context;if(l&&l.url===t.url)return void w.trace("[playlist-loader]: playlist request ongoing");w.log("[playlist-loader]: aborting previous loader for type: "+t.type),s.abort()}if(r=t.type===he?a.manifestLoadPolicy.default:o({},a.playlistLoadPolicy.default,{timeoutRetry:null,errorRetry:null}),s=this.createInternalLoader(t),null!=(e=t.deliveryDirectives)&&e.part&&(t.type===de&&null!==t.level?i=this.hls.levels[t.level].details:t.type===ce&&null!==t.id?i=this.hls.audioTracks[t.id].details:t.type===fe&&null!==t.id&&(i=this.hls.subtitleTracks[t.id].details),i)){var u=i.partTarget,h=i.targetduration;if(u&&h){var d=1e3*Math.max(3*u,.8*h);r=o({},r,{maxTimeToFirstByteMs:Math.min(d,r.maxTimeToFirstByteMs),maxLoadTimeMs:Math.min(d,r.maxTimeToFirstByteMs)})}}var c=r.errorRetry||r.timeoutRetry||{},f={loadPolicy:r,timeout:r.maxLoadTimeMs,maxRetry:c.maxNumRetry||0,retryDelay:c.retryDelayMs||0,maxRetryDelay:c.maxRetryDelayMs||0},g={onSuccess:function(t,e,r,i){var a=n.getInternalLoader(r);n.resetInternalLoader(r.type);var s=t.data;0===s.indexOf("#EXTM3U")?(e.parsing.start=performance.now(),re.isMediaPlaylist(s)?n.handleTrackOrLevelPlaylist(t,e,r,i||null,a):n.handleMasterPlaylist(t,e,r,i)):n.handleManifestParsingError(t,r,new Error("no EXTM3U delimiter"),i||null,e)},onError:function(t,e,r,i){n.handleNetworkError(e,r,!1,t,i)},onTimeout:function(t,e,r){n.handleNetworkError(e,r,!0,void 0,t)}};s.load(t,f,g)},e.handleMasterPlaylist=function(t,e,r,i){var n=this.hls,a=t.data,s=ye(t,r),o=re.parseMasterPlaylist(a,s);if(o.playlistParsingError)this.handleManifestParsingError(t,r,o.playlistParsingError,i,e);else{var l=o.contentSteering,u=o.levels,h=o.sessionData,d=o.sessionKeys,c=o.startTimeOffset,f=o.variableList;this.variableList=f;var g=re.parseMasterPlaylistMedia(a,s,o),v=g.AUDIO,m=void 0===v?[]:v,p=g.SUBTITLES,y=g["CLOSED-CAPTIONS"];m.length&&(m.some((function(t){return!t.url}))||!u[0].audioCodec||u[0].attrs.AUDIO||(w.log("[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one"),m.unshift({type:"main",name:"main",groupId:"main",default:!1,autoselect:!1,forced:!1,id:-1,attrs:new P({}),bitrate:0,url:""}))),n.trigger(S.MANIFEST_LOADED,{levels:u,audioTracks:m,subtitles:p,captions:y,contentSteering:l,url:s,stats:e,networkDetails:i,sessionData:h,sessionKeys:d,startTimeOffset:c,variableList:f})}},e.handleTrackOrLevelPlaylist=function(t,e,r,i,n){var a=this.hls,s=r.id,o=r.level,l=r.type,u=ye(t,r),h=E(s)?s:0,d=E(o)?o:h,c=pe(r),f=re.parseLevelPlaylist(t.data,u,d,c,h,this.variableList);if(l===he){var g={attrs:new P({}),bitrate:0,details:f,name:"",url:u};a.trigger(S.MANIFEST_LOADED,{levels:[g],audioTracks:[],url:u,stats:e,networkDetails:i,sessionData:null,sessionKeys:null,contentSteering:null,startTimeOffset:null,variableList:null})}e.parsing.end=performance.now(),r.levelDetails=f,this.handlePlaylistLoaded(f,t,e,r,i,n)},e.handleManifestParsingError=function(t,e,r,i,n){this.hls.trigger(S.ERROR,{type:L.NETWORK_ERROR,details:R.MANIFEST_PARSING_ERROR,fatal:e.type===he,url:t.url,err:r,error:r,reason:r.message,response:t,context:e,networkDetails:i,stats:n})},e.handleNetworkError=function(t,e,r,n,a){void 0===r&&(r=!1);var s="A network "+(r?"timeout":"error"+(n?" (status "+n.code+")":""))+" occurred while loading "+t.type;t.type===de?s+=": "+t.level+" id: "+t.id:t.type!==ce&&t.type!==fe||(s+=" id: "+t.id+' group-id: "'+t.groupId+'"');var o=new Error(s);w.warn("[playlist-loader]: "+s);var l=R.UNKNOWN,u=!1,h=this.getInternalLoader(t);switch(t.type){case he:l=r?R.MANIFEST_LOAD_TIMEOUT:R.MANIFEST_LOAD_ERROR,u=!0;break;case de:l=r?R.LEVEL_LOAD_TIMEOUT:R.LEVEL_LOAD_ERROR,u=!1;break;case ce:l=r?R.AUDIO_TRACK_LOAD_TIMEOUT:R.AUDIO_TRACK_LOAD_ERROR,u=!1;break;case fe:l=r?R.SUBTITLE_TRACK_LOAD_TIMEOUT:R.SUBTITLE_LOAD_ERROR,u=!1}h&&this.resetInternalLoader(t.type);var d={type:L.NETWORK_ERROR,details:l,fatal:u,url:t.url,loader:h,context:t,error:o,networkDetails:e,stats:a};if(n){var c=(null==e?void 0:e.url)||t.url;d.response=i({url:c,data:void 0},n)}this.hls.trigger(S.ERROR,d)},e.handlePlaylistLoaded=function(t,e,r,i,n,a){var s=this.hls,o=i.type,l=i.level,u=i.id,h=i.groupId,d=i.deliveryDirectives,c=ye(e,i),f=pe(i),g="number"==typeof i.level&&f===ge?l:void 0;if(t.fragments.length){t.targetduration||(t.playlistParsingError=new Error("Missing Target Duration"));var v=t.playlistParsingError;if(v)s.trigger(S.ERROR,{type:L.NETWORK_ERROR,details:R.LEVEL_PARSING_ERROR,fatal:!1,url:c,error:v,reason:v.message,response:e,context:i,level:g,parent:f,networkDetails:n,stats:r});else switch(t.live&&a&&(a.getCacheAge&&(t.ageHeader=a.getCacheAge()||0),a.getCacheAge&&!isNaN(t.ageHeader)||(t.ageHeader=0)),o){case he:case de:s.trigger(S.LEVEL_LOADED,{details:t,level:g||0,id:u||0,stats:r,networkDetails:n,deliveryDirectives:d});break;case ce:s.trigger(S.AUDIO_TRACK_LOADED,{details:t,id:u||0,groupId:h||"",stats:r,networkDetails:n,deliveryDirectives:d});break;case fe:s.trigger(S.SUBTITLE_TRACK_LOADED,{details:t,id:u||0,groupId:h||"",stats:r,networkDetails:n,deliveryDirectives:d})}}else{var m=new Error("No Segments found in Playlist");s.trigger(S.ERROR,{type:L.NETWORK_ERROR,details:R.LEVEL_EMPTY_ERROR,fatal:!1,url:c,error:m,reason:m.message,response:e,context:i,level:g,parent:f,networkDetails:n,stats:r})}},t}();function Ee(t,e){var r;try{r=new Event("addtrack")}catch(t){(r=document.createEvent("Event")).initEvent("addtrack",!1,!1)}r.track=t,e.dispatchEvent(r)}function Se(t,e){var r=t.mode;if("disabled"===r&&(t.mode="hidden"),t.cues&&!t.cues.getCueById(e.id))try{if(t.addCue(e),!t.cues.getCueById(e.id))throw new Error("addCue is failed for: "+e)}catch(r){w.debug("[texttrack-utils]: "+r);try{var i=new self.TextTrackCue(e.startTime,e.endTime,e.text);i.id=e.id,t.addCue(i)}catch(t){w.debug("[texttrack-utils]: Legacy TextTrackCue fallback failed: "+t)}}"disabled"===r&&(t.mode=r)}function Le(t){var e=t.mode;if("disabled"===e&&(t.mode="hidden"),t.cues)for(var r=t.cues.length;r--;)t.removeCue(t.cues[r]);"disabled"===e&&(t.mode=e)}function Re(t,e,r,i){var n=t.mode;if("disabled"===n&&(t.mode="hidden"),t.cues&&t.cues.length>0)for(var a=function(t,e,r){var i=[],n=function(t,e){if(et[r].endTime)return-1;for(var i=0,n=r;i<=n;){var a=Math.floor((n+i)/2);if(et[a].startTime&&i-1)for(var a=n,s=t.length;a=e&&o.endTime<=r)i.push(o);else if(o.startTime>r)return i}return i}(t.cues,e,r),s=0;sIe&&(d=Ie),d-h<=0&&(d=h+.25);for(var c=0;ce.startDate&&t.push(i),t}),[]).sort((function(t,e){return t.startDate.getTime()-e.startDate.getTime()}))[0];g&&(h=we(g.startDate,c),l=!0)}for(var m,p,y=Object.keys(e.attr),T=0;T.05&&this.forwardBufferLength>1){var u=Math.min(2,Math.max(1,a)),h=Math.round(2/(1+Math.exp(-.75*o-this.edgeStalled))*20)/20;t.playbackRate=Math.min(u,Math.max(1,h))}else 1!==t.playbackRate&&0!==t.playbackRate&&(t.playbackRate=1)}}}}},e.estimateLiveEdge=function(){var t=this.levelDetails;return null===t?null:t.edge+t.age},e.computeLatency=function(){var t=this.estimateLiveEdge();return null===t?null:t-this.currentTime},a(t,[{key:"latency",get:function(){return this._latency||0}},{key:"maxLatency",get:function(){var t=this.config,e=this.levelDetails;return void 0!==t.liveMaxLatencyDuration?t.liveMaxLatencyDuration:e?t.liveMaxLatencyDurationCount*e.targetduration:0}},{key:"targetLatency",get:function(){var t=this.levelDetails;if(null===t)return null;var e=t.holdBack,r=t.partHoldBack,i=t.targetduration,n=this.config,a=n.liveSyncDuration,s=n.liveSyncDurationCount,o=n.lowLatencyMode,l=this.hls.userConfig,u=o&&r||e;(l.liveSyncDuration||l.liveSyncDurationCount||0===u)&&(u=void 0!==a?a:s*i);var h=i;return u+Math.min(1*this.stallCount,h)}},{key:"liveSyncPosition",get:function(){var t=this.estimateLiveEdge(),e=this.targetLatency,r=this.levelDetails;if(null===t||null===e||null===r)return null;var i=r.edge,n=t-e-this.edgeStalled,a=i-r.totalduration,s=i-(this.config.lowLatencyMode&&r.partTarget||r.targetduration);return Math.min(Math.max(a,n),s)}},{key:"drift",get:function(){var t=this.levelDetails;return null===t?1:t.drift}},{key:"edgeStalled",get:function(){var t=this.levelDetails;if(null===t)return 0;var e=3*(this.config.lowLatencyMode&&t.partTarget||t.targetduration);return Math.max(t.age-e,0)}},{key:"forwardBufferLength",get:function(){var t=this.media,e=this.levelDetails;if(!t||!e)return 0;var r=t.buffered.length;return(r?t.buffered.end(r-1):e.edge)-this.currentTime}}]),t}(),Pe=["NONE","TYPE-0","TYPE-1",null],xe="",Fe="YES",Me="v2",Oe=function(){function t(t,e,r){this.msn=void 0,this.part=void 0,this.skip=void 0,this.msn=t,this.part=e,this.skip=r}return t.prototype.addDirectives=function(t){var e=new self.URL(t);return void 0!==this.msn&&e.searchParams.set("_HLS_msn",this.msn.toString()),void 0!==this.part&&e.searchParams.set("_HLS_part",this.part.toString()),this.skip&&e.searchParams.set("_HLS_skip",this.skip),e.href},t}(),Ne=function(){function t(t){this._attrs=void 0,this.audioCodec=void 0,this.bitrate=void 0,this.codecSet=void 0,this.height=void 0,this.id=void 0,this.name=void 0,this.videoCodec=void 0,this.width=void 0,this.unknownCodecs=void 0,this.audioGroupIds=void 0,this.details=void 0,this.fragmentError=0,this.loadError=0,this.loaded=void 0,this.realBitrate=0,this.textGroupIds=void 0,this.url=void 0,this._urlId=0,this.url=[t.url],this._attrs=[t.attrs],this.bitrate=t.bitrate,t.details&&(this.details=t.details),this.id=t.id||0,this.name=t.name,this.width=t.width||0,this.height=t.height||0,this.audioCodec=t.audioCodec,this.videoCodec=t.videoCodec,this.unknownCodecs=t.unknownCodecs,this.codecSet=[t.videoCodec,t.audioCodec].filter((function(t){return t})).join(",").replace(/\.[^.,]+/g,"")}return t.prototype.addFallback=function(t){this.url.push(t.url),this._attrs.push(t.attrs)},a(t,[{key:"maxBitrate",get:function(){return Math.max(this.realBitrate,this.bitrate)}},{key:"attrs",get:function(){return this._attrs[this._urlId]}},{key:"pathwayId",get:function(){return this.attrs["PATHWAY-ID"]||"."}},{key:"uri",get:function(){return this.url[this._urlId]||""}},{key:"urlId",get:function(){return this._urlId},set:function(t){var e=t%this.url.length;this._urlId!==e&&(this.fragmentError=0,this.loadError=0,this.details=void 0,this._urlId=e)}},{key:"audioGroupId",get:function(){var t;return null==(t=this.audioGroupIds)?void 0:t[this.urlId]}},{key:"textGroupId",get:function(){var t;return null==(t=this.textGroupIds)?void 0:t[this.urlId]}}]),t}();function Ue(t,e){var r=e.startPTS;if(E(r)){var i,n=0;e.sn>t.sn?(n=r-t.start,i=t):(n=t.start-r,i=e),i.duration!==n&&(i.duration=n)}else e.sn>t.sn?t.cc===e.cc&&t.minEndPTS?e.start=t.start+(t.minEndPTS-t.start):e.start=t.start+t.duration:e.start=Math.max(t.start-e.duration,0)}function Be(t,e,r,i,n,a){i-r<=0&&(w.warn("Fragment should have a positive duration",e),i=r+e.duration,a=n+e.duration);var s=r,o=i,l=e.startPTS,u=e.endPTS;if(E(l)){var h=Math.abs(l-r);E(e.deltaPTS)?e.deltaPTS=Math.max(h,e.deltaPTS):e.deltaPTS=h,s=Math.max(r,l),r=Math.min(r,l),n=Math.min(n,e.startDTS),o=Math.min(i,u),i=Math.max(i,u),a=Math.max(a,e.endDTS)}var d=r-e.start;0!==e.start&&(e.start=r),e.duration=i-e.start,e.startPTS=r,e.maxStartPTS=s,e.startDTS=n,e.endPTS=i,e.minEndPTS=o,e.endDTS=a;var c,f=e.sn;if(!t||ft.endSN)return 0;var g=f-t.startSN,v=t.fragments;for(v[g]=e,c=g;c>0;c--)Ue(v[c],v[c-1]);for(c=g;c=0;n--){var a=i[n].initSegment;if(a){r=a;break}}t.fragmentHint&&delete t.fragmentHint.endPTS;var s,l,u,h,d,c=0;if(function(t,e,r){for(var i=e.skippedSegments,n=Math.max(t.startSN,e.startSN)-e.startSN,a=(t.fragmentHint?1:0)+(i?e.endSN:Math.min(t.endSN,e.endSN))-e.startSN,s=e.startSN-t.startSN,o=e.fragmentHint?e.fragments.concat(e.fragmentHint):e.fragments,l=t.fragmentHint?t.fragments.concat(t.fragmentHint):t.fragments,u=n;u<=a;u++){var h=l[s+u],d=o[u];i&&!d&&u=i.length||He(e,i[r].start)}function He(t,e){if(e){for(var r=t.fragments,i=t.skippedSegments;i499)}(i)||!!r)}var Qe=function(t,e){for(var r=0,i=t.length-1,n=null,a=null;r<=i;){var s=e(a=t[n=(r+i)/2|0]);if(s>0)r=n+1;else{if(!(s<0))return a;i=n-1}}return null};function $e(t,e,r,i){void 0===r&&(r=0),void 0===i&&(i=0);var n=null;if(t?n=e[t.sn-e[0].sn+1]||null:0===r&&0===e[0].start&&(n=e[0]),n&&0===Je(r,i,n))return n;var a=Qe(e,Je.bind(null,r,i));return!a||a===t&&n?n:a}function Je(t,e,r){if(void 0===t&&(t=0),void 0===e&&(e=0),r.start<=t&&r.start+r.duration>t)return 0;var i=Math.min(e,r.duration+(r.deltaPTS?r.deltaPTS:0));return r.start+r.duration-i<=t?1:r.start-i>t&&r.start?-1:0}function Ze(t,e,r){var i=1e3*Math.min(e,r.duration+(r.deltaPTS?r.deltaPTS:0));return(r.endProgramDateTime||0)-i>t}var tr,er=3e5,rr=0,ir=2,nr=5,ar=0,sr=1,or=2,lr=function(){function t(t){this.hls=void 0,this.playlistError=0,this.penalizedRenditions={},this.log=void 0,this.warn=void 0,this.error=void 0,this.hls=t,this.log=w.log.bind(w,"[info]:"),this.warn=w.warn.bind(w,"[warning]:"),this.error=w.error.bind(w,"[error]:"),this.registerListeners()}var e=t.prototype;return e.registerListeners=function(){var t=this.hls;t.on(S.ERROR,this.onError,this),t.on(S.MANIFEST_LOADING,this.onManifestLoading,this),t.on(S.LEVEL_UPDATED,this.onLevelUpdated,this)},e.unregisterListeners=function(){var t=this.hls;t&&(t.off(S.ERROR,this.onError,this),t.off(S.ERROR,this.onErrorOut,this),t.off(S.MANIFEST_LOADING,this.onManifestLoading,this),t.off(S.LEVEL_UPDATED,this.onLevelUpdated,this))},e.destroy=function(){this.unregisterListeners(),this.hls=null,this.penalizedRenditions={}},e.startLoad=function(t){this.playlistError=0},e.stopLoad=function(){},e.getVariantLevelIndex=function(t){return(null==t?void 0:t.type)===ge?t.level:this.hls.loadLevel},e.onManifestLoading=function(){this.playlistError=0,this.penalizedRenditions={}},e.onLevelUpdated=function(){this.playlistError=0},e.onError=function(t,e){var r,i;if(!e.fatal){var n=this.hls,a=e.context;switch(e.details){case R.FRAG_LOAD_ERROR:case R.FRAG_LOAD_TIMEOUT:case R.KEY_LOAD_ERROR:case R.KEY_LOAD_TIMEOUT:return void(e.errorAction=this.getFragRetryOrSwitchAction(e));case R.FRAG_PARSING_ERROR:if(null!=(r=e.frag)&&r.gap)return void(e.errorAction={action:rr,flags:ar});case R.FRAG_GAP:case R.FRAG_DECRYPT_ERROR:return e.errorAction=this.getFragRetryOrSwitchAction(e),void(e.errorAction.action=ir);case R.LEVEL_EMPTY_ERROR:case R.LEVEL_PARSING_ERROR:var s,o,l=e.parent===ge?e.level:n.loadLevel;return void(e.details===R.LEVEL_EMPTY_ERROR&&null!=(s=e.context)&&null!=(o=s.levelDetails)&&o.live?e.errorAction=this.getPlaylistRetryOrSwitchAction(e,l):(e.levelRetry=!1,e.errorAction=this.getLevelSwitchAction(e,l)));case R.LEVEL_LOAD_ERROR:case R.LEVEL_LOAD_TIMEOUT:return void("number"==typeof(null==a?void 0:a.level)&&(e.errorAction=this.getPlaylistRetryOrSwitchAction(e,a.level)));case R.AUDIO_TRACK_LOAD_ERROR:case R.AUDIO_TRACK_LOAD_TIMEOUT:case R.SUBTITLE_LOAD_ERROR:case R.SUBTITLE_TRACK_LOAD_TIMEOUT:if(a){var u=n.levels[n.loadLevel];if(u&&(a.type===ce&&a.groupId===u.audioGroupId||a.type===fe&&a.groupId===u.textGroupId))return e.errorAction=this.getPlaylistRetryOrSwitchAction(e,n.loadLevel),e.errorAction.action=ir,void(e.errorAction.flags=sr)}return;case R.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:var h=n.levels[n.loadLevel],d=null==h?void 0:h.attrs["HDCP-LEVEL"];return void(d&&(e.errorAction={action:ir,flags:or,hdcpLevel:d}));case R.BUFFER_ADD_CODEC_ERROR:case R.REMUX_ALLOC_ERROR:return void(e.errorAction=this.getLevelSwitchAction(e,null!=(i=e.level)?i:n.loadLevel));case R.INTERNAL_EXCEPTION:case R.BUFFER_APPENDING_ERROR:case R.BUFFER_APPEND_ERROR:case R.BUFFER_FULL_ERROR:case R.LEVEL_SWITCH_ERROR:case R.BUFFER_STALLED_ERROR:case R.BUFFER_SEEK_OVER_HOLE:case R.BUFFER_NUDGE_ON_STALL:return void(e.errorAction={action:rr,flags:ar})}if(e.type===L.KEY_SYSTEM_ERROR){var c=this.getVariantLevelIndex(e.frag);return e.levelRetry=!1,void(e.errorAction=this.getLevelSwitchAction(e,c))}}},e.getPlaylistRetryOrSwitchAction=function(t,e){var r,i=je(this.hls.config.playlistLoadPolicy,t),n=this.playlistError++,a=null==(r=t.response)?void 0:r.code;if(ze(i,n,We(t),a))return{action:nr,flags:ar,retryConfig:i,retryCount:n};var s=this.getLevelSwitchAction(t,e);return i&&(s.retryConfig=i,s.retryCount=n),s},e.getFragRetryOrSwitchAction=function(t){var e=this.hls,r=this.getVariantLevelIndex(t.frag),i=e.levels[r],n=e.config,a=n.fragLoadPolicy,s=n.keyLoadPolicy,o=je(t.details.startsWith("key")?s:a,t),l=e.levels.reduce((function(t,e){return t+e.fragmentError}),0);if(i){var u;t.details!==R.FRAG_GAP&&i.fragmentError++;var h=null==(u=t.response)?void 0:u.code;if(ze(o,l,We(t),h))return{action:nr,flags:ar,retryConfig:o,retryCount:l}}var d=this.getLevelSwitchAction(t,r);return o&&(d.retryConfig=o,d.retryCount=l),d},e.getLevelSwitchAction=function(t,e){var r=this.hls;null==e&&(e=r.loadLevel);var i=this.hls.levels[e];if(i&&(i.loadError++,r.autoLevelEnabled)){for(var n,a,s=-1,o=r.levels,l=r.loadLevel,u=r.minAutoLevel,h=r.maxAutoLevel,d=null==(n=t.frag)?void 0:n.type,c=null!=(a=t.context)?a:{},f=c.type,g=c.groupId,v=o.length;v--;){var m=(v+l)%o.length;if(m!==l&&m>=u&&m<=h&&0===o[m].loadError){var p=o[m];if(t.details===R.FRAG_GAP&&t.frag){var y=o[m].details;if(y){var T=$e(t.frag,y.fragments,t.frag.start);if(null!=T&&T.gap)continue}}else{if(f===ce&&g===p.audioGroupId||f===fe&&g===p.textGroupId)continue;if(d===ve&&i.audioGroupId===p.audioGroupId||d===me&&i.textGroupId===p.textGroupId)continue}s=m;break}}if(s>-1&&r.loadLevel!==s)return t.levelRetry=!0,this.playlistError=0,{action:ir,flags:ar,nextAutoLevel:s}}return{action:ir,flags:sr}},e.onErrorOut=function(t,e){var r;switch(null==(r=e.errorAction)?void 0:r.action){case rr:break;case ir:this.sendAlternateToPenaltyBox(e),e.errorAction.resolved||e.details===R.FRAG_GAP||(e.fatal=!0)}e.fatal&&this.hls.stopLoad()},e.sendAlternateToPenaltyBox=function(t){var e=this.hls,r=t.errorAction;if(r){var i=r.flags,n=r.hdcpLevel,a=r.nextAutoLevel;switch(i){case ar:this.switchLevel(t,a);break;case sr:r.resolved||(r.resolved=this.redundantFailover(t));break;case or:n&&(e.maxHdcpLevel=Pe[Pe.indexOf(n)-1],r.resolved=!0),this.warn('Restricting playback to HDCP-LEVEL of "'+e.maxHdcpLevel+'" or lower')}r.resolved||this.switchLevel(t,a)}},e.switchLevel=function(t,e){void 0!==e&&t.errorAction&&(this.warn("switching to level "+e+" after "+t.details),this.hls.nextAutoLevel=e,t.errorAction.resolved=!0,this.hls.nextLoadLevel=this.hls.nextAutoLevel)},e.redundantFailover=function(t){var e=this,r=this.hls,i=this.penalizedRenditions,n=t.parent===ge?t.level:r.loadLevel,a=r.levels[n],s=a.url.length,o=t.frag?t.frag.urlId:a.urlId;a.urlId!==o||t.frag&&!a.details||this.penalizeRendition(a,t);for(var l=function(){var l=(o+u)%s,h=i[l];if(!h||function(t,e,r){if(performance.now()-t.lastErrorPerfMs>er)return!0;var i=t.details;if(e.details===R.FRAG_GAP&&i&&e.frag){var n=e.frag.start,a=$e(null,i.fragments,n);if(a&&!a.gap)return!0}if(r&&t.errors.length3*i.targetduration)return!0}return!1}(h,t,i[o]))return e.warn("Switching to Redundant Stream "+(l+1)+"/"+s+': "'+a.url[l]+'" after '+t.details),e.playlistError=0,r.levels.forEach((function(t){t.urlId=l})),r.nextLoadLevel=n,{v:!0}},u=1;u=0&&h>e.partTarget&&(u+=1)}return new Oe(l,u>=0?u:void 0,xe)}}},e.loadPlaylist=function(t){-1===this.requestScheduled&&(this.requestScheduled=self.performance.now())},e.shouldLoadPlaylist=function(t){return this.canLoad&&!!t&&!!t.url&&(!t.details||t.details.live)},e.shouldReloadPlaylist=function(t){return-1===this.timer&&-1===this.requestScheduled&&this.shouldLoadPlaylist(t)},e.playlistLoaded=function(t,e,r){var i=this,n=e.details,a=e.stats,s=self.performance.now(),o=a.loading.first?Math.max(0,s-a.loading.first):0;if(n.advancedDateTime=Date.now()-o,n.live||null!=r&&r.live){if(n.reloaded(r),r&&this.log("live playlist "+t+" "+(n.advanced?"REFRESHED "+n.lastPartSn+"-"+n.lastPartIndex:n.updated?"UPDATED":"MISSED")),r&&n.fragments.length>0&&Ge(r,n),!this.canLoad||!n.live)return;var l,u=void 0,h=void 0;if(n.canBlockReload&&n.endSN&&n.advanced){var d=this.hls.config.lowLatencyMode,c=n.lastPartSn,f=n.endSN,g=n.lastPartIndex,v=c===f;-1!==g?(u=v?f+1:c,h=v?d?0:g:g+1):u=f+1;var m=n.age,p=m+n.ageHeader,y=Math.min(p-n.partTarget,1.5*n.targetduration);if(y>0){if(r&&y>r.tuneInGoal)this.warn("CDN Tune-in goal increased from: "+r.tuneInGoal+" to: "+y+" with playlist age: "+n.age),y=0;else{var T=Math.floor(y/n.targetduration);u+=T,void 0!==h&&(h+=Math.round(y%n.targetduration/n.partTarget)),this.log("CDN Tune-in age: "+n.ageHeader+"s last advanced "+m.toFixed(2)+"s goal: "+y+" skip sn "+T+" to part "+h)}n.tuneInGoal=y}if(l=this.getDeliveryDirectives(n,e.deliveryDirectives,u,h),d||!v)return void this.loadPlaylist(l)}else(n.canBlockReload||n.canSkipUntil)&&(l=this.getDeliveryDirectives(n,e.deliveryDirectives,u,h));var E=this.hls.mainForwardBufferInfo,S=E?E.end-E.len:0,L=function(t,e){void 0===e&&(e=1/0);var r=1e3*t.targetduration;if(t.updated){var i=t.fragments;if(i.length&&4*r>e){var n=1e3*i[i.length-1].duration;nthis.requestScheduled+L&&(this.requestScheduled=a.loading.start),void 0!==u&&n.canBlockReload?this.requestScheduled=a.loading.first+L-(1e3*n.partTarget||1e3):-1===this.requestScheduled||this.requestScheduled+L=u.maxNumRetry)return!1;if(i&&null!=(d=t.context)&&d.deliveryDirectives)this.warn("Retrying playlist loading "+(l+1)+"/"+u.maxNumRetry+' after "'+r+'" without delivery-directives'),this.loadPlaylist();else{var c=qe(u,l);this.timer=self.setTimeout((function(){return e.loadPlaylist()}),c),this.warn("Retrying playlist loading "+(l+1)+"/"+u.maxNumRetry+' after "'+r+'" in '+c+"ms")}t.levelRetry=!0,n.resolved=!0}return h},t}(),hr=function(t){function e(e,r){var i;return(i=t.call(this,e,"[level-controller]")||this)._levels=[],i._firstLevel=-1,i._startLevel=void 0,i.currentLevel=null,i.currentLevelIndex=-1,i.manualLevelIndex=-1,i.steering=void 0,i.onParsedComplete=void 0,i.steering=r,i._registerListeners(),i}l(e,t);var r=e.prototype;return r._registerListeners=function(){var t=this.hls;t.on(S.MANIFEST_LOADING,this.onManifestLoading,this),t.on(S.MANIFEST_LOADED,this.onManifestLoaded,this),t.on(S.LEVEL_LOADED,this.onLevelLoaded,this),t.on(S.LEVELS_UPDATED,this.onLevelsUpdated,this),t.on(S.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),t.on(S.FRAG_LOADED,this.onFragLoaded,this),t.on(S.ERROR,this.onError,this)},r._unregisterListeners=function(){var t=this.hls;t.off(S.MANIFEST_LOADING,this.onManifestLoading,this),t.off(S.MANIFEST_LOADED,this.onManifestLoaded,this),t.off(S.LEVEL_LOADED,this.onLevelLoaded,this),t.off(S.LEVELS_UPDATED,this.onLevelsUpdated,this),t.off(S.AUDIO_TRACK_SWITCHED,this.onAudioTrackSwitched,this),t.off(S.FRAG_LOADED,this.onFragLoaded,this),t.off(S.ERROR,this.onError,this)},r.destroy=function(){this._unregisterListeners(),this.steering=null,this.resetLevels(),t.prototype.destroy.call(this)},r.startLoad=function(){this._levels.forEach((function(t){t.loadError=0,t.fragmentError=0})),t.prototype.startLoad.call(this)},r.resetLevels=function(){this._startLevel=void 0,this.manualLevelIndex=-1,this.currentLevelIndex=-1,this.currentLevel=null,this._levels=[]},r.onManifestLoading=function(t,e){this.resetLevels()},r.onManifestLoaded=function(t,e){var r,i=[],n={};e.levels.forEach((function(t){var e,a=t.attrs;-1!==(null==(e=t.audioCodec)?void 0:e.indexOf("mp4a.40.34"))&&(tr||(tr=/chrome|firefox/i.test(navigator.userAgent)),tr&&(t.audioCodec=void 0));var s=a.AUDIO,o=a.CODECS,l=a["FRAME-RATE"],u=a["PATHWAY-ID"],h=a.RESOLUTION,d=a.SUBTITLES,c=(u||".")+"-"+t.bitrate+"-"+h+"-"+l+"-"+o;(r=n[c])?r.addFallback(t):(r=new Ne(t),n[c]=r,i.push(r)),dr(r,"audio",s),dr(r,"text",d)})),this.filterAndSortMediaOptions(i,e)},r.filterAndSortMediaOptions=function(t,e){var r=this,i=[],n=[],a=!1,s=!1,o=!1,l=t.filter((function(t){var e=t.audioCodec,r=t.videoCodec,i=t.width,n=t.height,l=t.unknownCodecs;return a||(a=!(!i||!n)),s||(s=!!r),o||(o=!!e),!(null!=l&&l.length)&&(!e||Qt(e,"audio"))&&(!r||Qt(r,"video"))}));if((a||s)&&o&&(l=l.filter((function(t){var e=t.videoCodec,r=t.width,i=t.height;return!!e||!(!r||!i)}))),0!==l.length){e.audioTracks&&cr(i=e.audioTracks.filter((function(t){return!t.audioCodec||Qt(t.audioCodec,"audio")}))),e.subtitles&&cr(n=e.subtitles);var u=l.slice(0);l.sort((function(t,e){return t.attrs["HDCP-LEVEL"]!==e.attrs["HDCP-LEVEL"]?(t.attrs["HDCP-LEVEL"]||"")>(e.attrs["HDCP-LEVEL"]||"")?1:-1:t.bitrate!==e.bitrate?t.bitrate-e.bitrate:t.attrs["FRAME-RATE"]!==e.attrs["FRAME-RATE"]?t.attrs.decimalFloatingPoint("FRAME-RATE")-e.attrs.decimalFloatingPoint("FRAME-RATE"):t.attrs.SCORE!==e.attrs.SCORE?t.attrs.decimalFloatingPoint("SCORE")-e.attrs.decimalFloatingPoint("SCORE"):a&&t.height!==e.height?t.height-e.height:0}));var h=u[0];if(this.steering&&(l=this.steering.filterParsedLevels(l)).length!==u.length)for(var d=0;d1&&void 0!==e?(n.url=n.url.filter(i),n.audioGroupIds&&(n.audioGroupIds=n.audioGroupIds.filter(i)),n.textGroupIds&&(n.textGroupIds=n.textGroupIds.filter(i)),n.urlId=0,!0):(r.steering&&r.steering.removeLevel(n),!1))}));this.hls.trigger(S.LEVELS_UPDATED,{levels:n})},r.onLevelsUpdated=function(t,e){var r=e.levels;r.forEach((function(t,e){var r=t.details;null!=r&&r.fragments&&r.fragments.forEach((function(t){t.level=e}))})),this._levels=r},a(e,[{key:"levels",get:function(){return 0===this._levels.length?null:this._levels}},{key:"level",get:function(){return this.currentLevelIndex},set:function(t){var e=this._levels;if(0!==e.length){if(t<0||t>=e.length){var r=new Error("invalid level idx"),i=t<0;if(this.hls.trigger(S.ERROR,{type:L.OTHER_ERROR,details:R.LEVEL_SWITCH_ERROR,level:t,fatal:i,error:r,reason:r.message}),i)return;t=Math.min(t,e.length-1)}var n=this.currentLevelIndex,a=this.currentLevel,s=a?a.attrs["PATHWAY-ID"]:void 0,l=e[t],u=l.attrs["PATHWAY-ID"];if(this.currentLevelIndex=t,this.currentLevel=l,n!==t||!l.details||!a||s!==u){this.log("Switching to level "+t+(u?" with Pathway "+u:"")+" from level "+n+(s?" with Pathway "+s:""));var h=o({},l,{level:t,maxBitrate:l.maxBitrate,attrs:l.attrs,uri:l.uri,urlId:l.urlId});delete h._attrs,delete h._urlId,this.hls.trigger(S.LEVEL_SWITCHING,h);var d=l.details;if(!d||d.live){var c=this.switchParams(l.uri,null==a?void 0:a.details);this.loadPlaylist(c)}}}}},{key:"manualLevel",get:function(){return this.manualLevelIndex},set:function(t){this.manualLevelIndex=t,void 0===this._startLevel&&(this._startLevel=t),-1!==t&&(this.level=t)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(t){this._firstLevel=t}},{key:"startLevel",get:function(){if(void 0===this._startLevel){var t=this.hls.config.startLevel;return void 0!==t?t:this._firstLevel}return this._startLevel},set:function(t){this._startLevel=t}},{key:"nextLoadLevel",get:function(){return-1!==this.manualLevelIndex?this.manualLevelIndex:this.hls.nextAutoLevel},set:function(t){this.level=t,-1===this.manualLevelIndex&&(this.hls.nextAutoLevel=t)}}]),e}(ur);function dr(t,e,r){r&&("audio"===e?(t.audioGroupIds||(t.audioGroupIds=[]),t.audioGroupIds[t.url.length-1]=r):"text"===e&&(t.textGroupIds||(t.textGroupIds=[]),t.textGroupIds[t.url.length-1]=r))}function cr(t){var e={};t.forEach((function(t){var r=t.groupId||"";t.id=e[r]=e[r]||0,e[r]++}))}var fr="NOT_LOADED",gr="APPENDING",vr="PARTIAL",mr="OK",pr=function(){function t(t){this.activePartLists=Object.create(null),this.endListFragments=Object.create(null),this.fragments=Object.create(null),this.timeRanges=Object.create(null),this.bufferPadding=.2,this.hls=void 0,this.hasGaps=!1,this.hls=t,this._registerListeners()}var e=t.prototype;return e._registerListeners=function(){var t=this.hls;t.on(S.BUFFER_APPENDED,this.onBufferAppended,this),t.on(S.FRAG_BUFFERED,this.onFragBuffered,this),t.on(S.FRAG_LOADED,this.onFragLoaded,this)},e._unregisterListeners=function(){var t=this.hls;t.off(S.BUFFER_APPENDED,this.onBufferAppended,this),t.off(S.FRAG_BUFFERED,this.onFragBuffered,this),t.off(S.FRAG_LOADED,this.onFragLoaded,this)},e.destroy=function(){this._unregisterListeners(),this.fragments=this.activePartLists=this.endListFragments=this.timeRanges=null},e.getAppendedFrag=function(t,e){var r=this.activePartLists[e];if(r)for(var i=r.length;i--;){var n=r[i];if(!n)break;var a=n.end;if(n.start<=t&&null!==a&&t<=a)return n}return this.getBufferedFrag(t,e)},e.getBufferedFrag=function(t,e){for(var r=this.fragments,i=Object.keys(r),n=i.length;n--;){var a=r[i[n]];if((null==a?void 0:a.body.type)===e&&a.buffered){var s=a.body;if(s.start<=t&&t<=s.end)return s}}return null},e.detectEvictedFragments=function(t,e,r,i){var n=this;this.timeRanges&&(this.timeRanges[t]=e);var a=(null==i?void 0:i.fragment.sn)||-1;Object.keys(this.fragments).forEach((function(i){var s=n.fragments[i];if(s&&!(a>=s.body.sn))if(s.buffered||s.loaded){var o=s.range[t];o&&o.time.some((function(t){var r=!n.isTimeBuffered(t.startPTS,t.endPTS,e);return r&&n.removeFragment(s.body),r}))}else s.body.type===r&&n.removeFragment(s.body)}))},e.detectPartialFragments=function(t){var e=this,r=this.timeRanges,i=t.frag,n=t.part;if(r&&"initSegment"!==i.sn){var a=Tr(i),s=this.fragments[a];if(!(!s||s.buffered&&i.gap)){var o=!i.relurl;Object.keys(r).forEach((function(t){var a=i.elementaryStreams[t];if(a){var l=r[t],u=o||!0===a.partial;s.range[t]=e.getBufferedTimes(i,n,u,l)}})),s.loaded=null,Object.keys(s.range).length?(s.buffered=!0,(s.body.endList=i.endList||s.body.endList)&&(this.endListFragments[s.body.type]=s),yr(s)||this.removeParts(i.sn-1,i.type)):this.removeFragment(s.body)}}},e.removeParts=function(t,e){var r=this.activePartLists[e];r&&(this.activePartLists[e]=r.filter((function(e){return e.fragment.sn>=t})))},e.fragBuffered=function(t,e){var r=Tr(t),i=this.fragments[r];!i&&e&&(i=this.fragments[r]={body:t,appendedPTS:null,loaded:null,buffered:!1,range:Object.create(null)},t.gap&&(this.hasGaps=!0)),i&&(i.loaded=null,i.buffered=!0)},e.getBufferedTimes=function(t,e,r,i){for(var n={time:[],partial:r},a=t.start,s=t.end,o=t.minEndPTS||s,l=t.maxStartPTS||a,u=0;u=h&&o<=d){n.time.push({startPTS:Math.max(a,i.start(u)),endPTS:Math.min(s,i.end(u))});break}if(ah)n.partial=!0,n.time.push({startPTS:Math.max(a,i.start(u)),endPTS:Math.min(s,i.end(u))});else if(s<=h)break}return n},e.getPartialFragment=function(t){var e,r,i,n=null,a=0,s=this.bufferPadding,o=this.fragments;return Object.keys(o).forEach((function(l){var u=o[l];u&&yr(u)&&(r=u.body.start-s,i=u.body.end+s,t>=r&&t<=i&&(e=Math.min(t-r,i-t),a<=e&&(n=u.body,a=e)))})),n},e.isEndListAppended=function(t){var e=this.endListFragments[t];return void 0!==e&&(e.buffered||yr(e))},e.getState=function(t){var e=Tr(t),r=this.fragments[e];return r?r.buffered?yr(r)?vr:mr:gr:fr},e.isTimeBuffered=function(t,e,r){for(var i,n,a=0;a=i&&e<=n)return!0;if(e<=i)return!1}return!1},e.onFragLoaded=function(t,e){var r=e.frag,i=e.part;if("initSegment"!==r.sn&&!r.bitrateTest){var n=i?null:e,a=Tr(r);this.fragments[a]={body:r,appendedPTS:null,loaded:n,buffered:!1,range:Object.create(null)}}},e.onBufferAppended=function(t,e){var r=this,i=e.frag,n=e.part,a=e.timeRanges;if("initSegment"!==i.sn){var s=i.type;if(n){var o=this.activePartLists[s];o||(this.activePartLists[s]=o=[]),o.push(n)}this.timeRanges=a,Object.keys(a).forEach((function(t){var e=a[t];r.detectEvictedFragments(t,e,s,n)}))}},e.onFragBuffered=function(t,e){this.detectPartialFragments(e)},e.hasFragment=function(t){var e=Tr(t);return!!this.fragments[e]},e.hasParts=function(t){var e;return!(null==(e=this.activePartLists[t])||!e.length)},e.removeFragmentsInRange=function(t,e,r,i,n){var a=this;i&&!this.hasGaps||Object.keys(this.fragments).forEach((function(s){var o=a.fragments[s];if(o){var l=o.body;l.type!==r||i&&!l.gap||l.startt&&(o.buffered||n)&&a.removeFragment(l)}}))},e.removeFragment=function(t){var e=Tr(t);t.stats.loaded=0,t.clearElementaryStreamInfo();var r=this.activePartLists[t.type];if(r){var i=t.sn;this.activePartLists[t.type]=r.filter((function(t){return t.fragment.sn!==i}))}delete this.fragments[e],t.endList&&delete this.endListFragments[t.type]},e.removeAllFragments=function(){this.fragments=Object.create(null),this.endListFragments=Object.create(null),this.activePartLists=Object.create(null),this.hasGaps=!1},t}();function yr(t){var e,r,i;return t.buffered&&(t.body.gap||(null==(e=t.range.video)?void 0:e.partial)||(null==(r=t.range.audio)?void 0:r.partial)||(null==(i=t.range.audiovideo)?void 0:i.partial))}function Tr(t){return t.type+"_"+t.level+"_"+t.urlId+"_"+t.sn}var Er=Math.pow(2,17),Sr=function(){function t(t){this.config=void 0,this.loader=null,this.partLoadTimeout=-1,this.config=t}var e=t.prototype;return e.destroy=function(){this.loader&&(this.loader.destroy(),this.loader=null)},e.abort=function(){this.loader&&this.loader.abort()},e.load=function(t,e){var r=this,n=t.url;if(!n)return Promise.reject(new Ar({type:L.NETWORK_ERROR,details:R.FRAG_LOAD_ERROR,fatal:!1,frag:t,error:new Error("Fragment does not have a "+(n?"part list":"url")),networkDetails:null}));this.abort();var a=this.config,s=a.fLoader,o=a.loader;return new Promise((function(l,u){if(r.loader&&r.loader.destroy(),t.gap){if(t.tagList.some((function(t){return"GAP"===t[0]})))return void u(Rr(t));t.gap=!1}var h=r.loader=t.loader=s?new s(a):new o(a),d=Lr(t),c=Xe(a.fragLoadPolicy.default),f={loadPolicy:c,timeout:c.maxLoadTimeMs,maxRetry:0,retryDelay:0,maxRetryDelay:0,highWaterMark:"initSegment"===t.sn?1/0:Er};t.stats=h.stats,h.load(d,f,{onSuccess:function(e,i,n,a){r.resetLoader(t,h);var s=e.data;n.resetIV&&t.decryptdata&&(t.decryptdata.iv=new Uint8Array(s.slice(0,16)),s=s.slice(16)),l({frag:t,part:null,payload:s,networkDetails:a})},onError:function(e,a,s,o){r.resetLoader(t,h),u(new Ar({type:L.NETWORK_ERROR,details:R.FRAG_LOAD_ERROR,fatal:!1,frag:t,response:i({url:n,data:void 0},e),error:new Error("HTTP Error "+e.code+" "+e.text),networkDetails:s,stats:o}))},onAbort:function(e,i,n){r.resetLoader(t,h),u(new Ar({type:L.NETWORK_ERROR,details:R.INTERNAL_ABORTED,fatal:!1,frag:t,error:new Error("Aborted"),networkDetails:n,stats:e}))},onTimeout:function(e,i,n){r.resetLoader(t,h),u(new Ar({type:L.NETWORK_ERROR,details:R.FRAG_LOAD_TIMEOUT,fatal:!1,frag:t,error:new Error("Timeout after "+f.timeout+"ms"),networkDetails:n,stats:e}))},onProgress:function(r,i,n,a){e&&e({frag:t,part:null,payload:n,networkDetails:a})}})}))},e.loadPart=function(t,e,r){var n=this;this.abort();var a=this.config,s=a.fLoader,o=a.loader;return new Promise((function(l,u){if(n.loader&&n.loader.destroy(),t.gap||e.gap)u(Rr(t,e));else{var h=n.loader=t.loader=s?new s(a):new o(a),d=Lr(t,e),c=Xe(a.fragLoadPolicy.default),f={loadPolicy:c,timeout:c.maxLoadTimeMs,maxRetry:0,retryDelay:0,maxRetryDelay:0,highWaterMark:Er};e.stats=h.stats,h.load(d,f,{onSuccess:function(i,a,s,o){n.resetLoader(t,h),n.updateStatsFromPart(t,e);var u={frag:t,part:e,payload:i.data,networkDetails:o};r(u),l(u)},onError:function(r,a,s,o){n.resetLoader(t,h),u(new Ar({type:L.NETWORK_ERROR,details:R.FRAG_LOAD_ERROR,fatal:!1,frag:t,part:e,response:i({url:d.url,data:void 0},r),error:new Error("HTTP Error "+r.code+" "+r.text),networkDetails:s,stats:o}))},onAbort:function(r,i,a){t.stats.aborted=e.stats.aborted,n.resetLoader(t,h),u(new Ar({type:L.NETWORK_ERROR,details:R.INTERNAL_ABORTED,fatal:!1,frag:t,part:e,error:new Error("Aborted"),networkDetails:a,stats:r}))},onTimeout:function(r,i,a){n.resetLoader(t,h),u(new Ar({type:L.NETWORK_ERROR,details:R.FRAG_LOAD_TIMEOUT,fatal:!1,frag:t,part:e,error:new Error("Timeout after "+f.timeout+"ms"),networkDetails:a,stats:r}))}})}}))},e.updateStatsFromPart=function(t,e){var r=t.stats,i=e.stats,n=i.total;if(r.loaded+=i.loaded,n){var a=Math.round(t.duration/e.duration),s=Math.min(Math.round(r.loaded/n),a),o=(a-s)*Math.round(r.loaded/s);r.total=r.loaded+o}else r.total=Math.max(r.loaded,r.total);var l=r.loading,u=i.loading;l.start?l.first+=u.first-u.start:(l.start=u.start,l.first=u.first),l.end=u.end},e.resetLoader=function(t,e){t.loader=null,this.loader===e&&(self.clearTimeout(this.partLoadTimeout),this.loader=null),e.destroy()},t}();function Lr(t,e){void 0===e&&(e=null);var r=e||t,i={frag:t,part:e,responseType:"arraybuffer",url:r.url,headers:{},rangeStart:0,rangeEnd:0},n=r.byteRangeStartOffset,a=r.byteRangeEndOffset;if(E(n)&&E(a)){var s,o=n,l=a;if("initSegment"===t.sn&&"AES-128"===(null==(s=t.decryptdata)?void 0:s.method)){var u=a-n;u%16&&(l=a+(16-u%16)),0!==n&&(i.resetIV=!0,o=n-16)}i.rangeStart=o,i.rangeEnd=l}return i}function Rr(t,e){var r=new Error("GAP "+(t.gap?"tag":"attribute")+" found"),i={type:L.MEDIA_ERROR,details:R.FRAG_GAP,fatal:!1,frag:t,error:r,networkDetails:null};return e&&(i.part=e),(e||t).stats.aborted=!0,new Ar(i)}var Ar=function(t){function e(e){var r;return(r=t.call(this,e.error.message)||this).data=void 0,r.data=e,r}return l(e,t),e}(f(Error)),kr=function(){function t(t){this.config=void 0,this.keyUriToKeyInfo={},this.emeController=null,this.config=t}var e=t.prototype;return e.abort=function(t){for(var e in this.keyUriToKeyInfo){var r=this.keyUriToKeyInfo[e].loader;if(r){if(t&&t!==r.context.frag.type)return;r.abort()}}},e.detach=function(){for(var t in this.keyUriToKeyInfo){var e=this.keyUriToKeyInfo[t];(e.mediaKeySessionContext||e.decryptdata.isCommonEncryption)&&delete this.keyUriToKeyInfo[t]}},e.destroy=function(){for(var t in this.detach(),this.keyUriToKeyInfo){var e=this.keyUriToKeyInfo[t].loader;e&&e.destroy()}this.keyUriToKeyInfo={}},e.createKeyLoadError=function(t,e,r,i,n){return void 0===e&&(e=R.KEY_LOAD_ERROR),new Ar({type:L.NETWORK_ERROR,details:e,fatal:!1,frag:t,response:n,error:r,networkDetails:i})},e.loadClear=function(t,e){var r=this;if(this.emeController&&this.config.emeEnabled)for(var i=t.sn,n=t.cc,a=function(){var t=e[s];if(n<=t.cc&&("initSegment"===i||"initSegment"===t.sn||i1&&this.tickImmediate(),this._tickCallCount=0)},e.tickImmediate=function(){this.clearNextTick(),this._tickTimer=self.setTimeout(this._boundTick,0)},e.doTick=function(){},t}(),Dr={length:0,start:function(){return 0},end:function(){return 0}},Ir=function(){function t(){}return t.isBuffered=function(e,r){try{if(e)for(var i=t.getBuffered(e),n=0;n=i.start(n)&&r<=i.end(n))return!0}catch(t){}return!1},t.bufferInfo=function(e,r,i){try{if(e){var n,a=t.getBuffered(e),s=[];for(n=0;ns&&(i[a-1].end=t[n].end):i.push(t[n])}else i.push(t[n])}else i=t;for(var o,l=0,u=e,h=e,d=0;d=c&&er.startCC||t&&t.cc>>8^255&m^99,t[f]=m,e[m]=f;var p=c[f],y=c[p],T=c[y],E=257*c[m]^16843008*m;i[f]=E<<24|E>>>8,n[f]=E<<16|E>>>16,a[f]=E<<8|E>>>24,s[f]=E,E=16843009*T^65537*y^257*p^16843008*f,l[m]=E<<24|E>>>8,u[m]=E<<16|E>>>16,h[m]=E<<8|E>>>24,d[m]=E,f?(f=p^c[c[c[T^p]]],g^=c[c[g]]):f=g=1}},e.expandKey=function(t){for(var e=this.uint8ArrayToUint32Array_(t),r=!0,i=0;is.end){var h=a>u;(a0&&a&&a.key&&a.iv&&"AES-128"===a.method){var s=self.performance.now();return r.decrypter.decrypt(new Uint8Array(n),a.key.buffer,a.iv.buffer).catch((function(e){throw i.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.FRAG_DECRYPT_ERROR,fatal:!1,error:e,reason:e.message,frag:t}),e})).then((function(r){var n=self.performance.now();return i.trigger(S.FRAG_DECRYPTED,{frag:t,payload:r,stats:{tstart:s,tdecrypt:n}}),e.payload=r,e}))}return e})).then((function(i){var n=r.fragCurrent,a=r.hls;if(!r.levels)throw new Error("init load aborted, missing levels");var s=t.stats;r.state=Kr,e.fragmentError=0,t.data=new Uint8Array(i.payload),s.parsing.start=s.buffering.start=self.performance.now(),s.parsing.end=s.buffering.end=self.performance.now(),i.frag===n&&a.trigger(S.FRAG_BUFFERED,{stats:s,frag:n,part:null,id:t.type}),r.tick()})).catch((function(e){r.state!==Gr&&r.state!==zr&&(r.warn(e),r.resetFragmentLoading(t))}))},r.fragContextChanged=function(t){var e=this.fragCurrent;return!t||!e||t.level!==e.level||t.sn!==e.sn||t.urlId!==e.urlId},r.fragBufferedComplete=function(t,e){var r,i,n,a,s=this.mediaBuffer?this.mediaBuffer:this.media;this.log("Buffered "+t.type+" sn: "+t.sn+(e?" part: "+e.index:"")+" of "+(this.playlistType===ge?"level":"track")+" "+t.level+" (frag:["+(null!=(r=t.startPTS)?r:NaN).toFixed(3)+"-"+(null!=(i=t.endPTS)?i:NaN).toFixed(3)+"] > buffer:"+(s?Br(Ir.getBuffered(s)):"(detached)")+")"),this.state=Kr,s&&(!this.loadedmetadata&&t.type==ge&&s.buffered.length&&(null==(n=this.fragCurrent)?void 0:n.sn)===(null==(a=this.fragPrevious)?void 0:a.sn)&&(this.loadedmetadata=!0,this.seekToStartPos()),this.tick())},r.seekToStartPos=function(){},r._handleFragmentLoadComplete=function(t){var e=this.transmuxer;if(e){var r=t.frag,i=t.part,n=t.partsLoaded,a=!n||0===n.length||n.some((function(t){return!t})),s=new wr(r.level,r.sn,r.stats.chunkCount+1,0,i?i.index:-1,!a);e.flush(s)}},r._handleFragmentLoadProgress=function(t){},r._doFragLoad=function(t,e,r,i){var n,a=this;void 0===r&&(r=null);var s=null==e?void 0:e.details;if(!this.levels||!s)throw new Error("frag load aborted, missing level"+(s?"":" detail")+"s");var o=null;if(!t.encrypted||null!=(n=t.decryptdata)&&n.key?!t.encrypted&&s.encryptedFragments.length&&this.keyLoader.loadClear(t,s.encryptedFragments):(this.log("Loading key for "+t.sn+" of ["+s.startSN+"-"+s.endSN+"], "+("[stream-controller]"===this.logPrefix?"level":"track")+" "+t.level),this.state=Hr,this.fragCurrent=t,o=this.keyLoader.load(t).then((function(t){if(!a.fragContextChanged(t.frag))return a.hls.trigger(S.KEY_LOADED,t),a.state===Hr&&(a.state=Kr),t})),this.hls.trigger(S.KEY_LOADING,{frag:t}),null===this.fragCurrent&&(o=Promise.reject(new Error("frag load aborted, context changed in KEY_LOADING")))),r=Math.max(t.start,r||0),this.config.lowLatencyMode&&"initSegment"!==t.sn){var l=s.partList;if(l&&i){r>t.end&&s.fragmentHint&&(t=s.fragmentHint);var u=this.getNextPart(l,t,r);if(u>-1){var h,d=l[u];return this.log("Loading part sn: "+t.sn+" p: "+d.index+" cc: "+t.cc+" of playlist ["+s.startSN+"-"+s.endSN+"] parts [0-"+u+"-"+(l.length-1)+"] "+("[stream-controller]"===this.logPrefix?"level":"track")+": "+t.level+", target: "+parseFloat(r.toFixed(3))),this.nextLoadPosition=d.start+d.duration,this.state=Vr,h=o?o.then((function(r){return!r||a.fragContextChanged(r.frag)?null:a.doFragPartsLoad(t,d,e,i)})).catch((function(t){return a.handleFragLoadError(t)})):this.doFragPartsLoad(t,d,e,i).catch((function(t){return a.handleFragLoadError(t)})),this.hls.trigger(S.FRAG_LOADING,{frag:t,part:d,targetBufferTime:r}),null===this.fragCurrent?Promise.reject(new Error("frag load aborted, context changed in FRAG_LOADING parts")):h}if(!t.url||this.loadedEndOfParts(l,r))return Promise.resolve(null)}}this.log("Loading fragment "+t.sn+" cc: "+t.cc+" "+(s?"of ["+s.startSN+"-"+s.endSN+"] ":"")+("[stream-controller]"===this.logPrefix?"level":"track")+": "+t.level+", target: "+parseFloat(r.toFixed(3))),E(t.sn)&&!this.bitrateTest&&(this.nextLoadPosition=t.start+t.duration),this.state=Vr;var c,f=this.config.progressive;return c=f&&o?o.then((function(e){return!e||a.fragContextChanged(null==e?void 0:e.frag)?null:a.fragmentLoader.load(t,i)})).catch((function(t){return a.handleFragLoadError(t)})):Promise.all([this.fragmentLoader.load(t,f?i:void 0),o]).then((function(t){var e=t[0];return!f&&e&&i&&i(e),e})).catch((function(t){return a.handleFragLoadError(t)})),this.hls.trigger(S.FRAG_LOADING,{frag:t,targetBufferTime:r}),null===this.fragCurrent?Promise.reject(new Error("frag load aborted, context changed in FRAG_LOADING")):c},r.doFragPartsLoad=function(t,e,r,i){var n=this;return new Promise((function(a,s){var o,l=[],u=null==(o=r.details)?void 0:o.partList;!function e(o){n.fragmentLoader.loadPart(t,o,i).then((function(i){l[o.index]=i;var s=i.part;n.hls.trigger(S.FRAG_LOADED,i);var h=Ve(r,t.sn,o.index+1)||Ye(u,t.sn,o.index+1);if(!h)return a({frag:t,part:s,partsLoaded:l});e(h)})).catch(s)}(e)}))},r.handleFragLoadError=function(t){if("data"in t){var e=t.data;t.data&&e.details===R.INTERNAL_ABORTED?this.handleFragLoadAborted(e.frag,e.part):this.hls.trigger(S.ERROR,e)}else this.hls.trigger(S.ERROR,{type:L.OTHER_ERROR,details:R.INTERNAL_EXCEPTION,err:t,error:t,fatal:!0});return null},r._handleTransmuxerFlush=function(t){var e=this.getCurrentContext(t);if(e&&this.state===jr){var r=e.frag,i=e.part,n=e.level,a=self.performance.now();r.stats.parsing.end=a,i&&(i.stats.parsing.end=a),this.updateLevelTiming(r,i,n,t.partial)}else this.fragCurrent||this.state===Gr||this.state===zr||(this.state=Kr)},r.getCurrentContext=function(t){var e=this.levels,r=this.fragCurrent,i=t.level,n=t.sn,a=t.part;if(null==e||!e[i])return this.warn("Levels object was unset while buffering fragment "+n+" of level "+i+". The current chunk will not be buffered."),null;var s=e[i],o=a>-1?Ve(s,n,a):null,l=o?o.fragment:function(t,e,r){if(null==t||!t.details)return null;var i=t.details,n=i.fragments[e-i.startSN];return n||((n=i.fragmentHint)&&n.sn===e?n:ea&&this.flushMainBuffer(s,t.start)}else this.flushMainBuffer(0,t.start)},r.getFwdBufferInfo=function(t,e){var r=this.getLoadPosition();return E(r)?this.getFwdBufferInfoAtPos(t,r,e):null},r.getFwdBufferInfoAtPos=function(t,e,r){var i=this.config.maxBufferHole,n=Ir.bufferInfo(t,e,i);if(0===n.len&&void 0!==n.nextStart){var a=this.fragmentTracker.getBufferedFrag(e,r);if(a&&n.nextStart=r&&(e.maxMaxBufferLength/=2,this.warn("Reduce max buffer length to "+e.maxMaxBufferLength+"s"),!0)},r.getAppendedFrag=function(t,e){var r=this.fragmentTracker.getAppendedFrag(t,ge);return r&&"fragment"in r?r.fragment:r},r.getNextFragment=function(t,e){var r=e.fragments,i=r.length;if(!i)return null;var n,a=this.config,s=r[0].start;if(e.live){var o=a.initialLiveManifestSize;if(ie},r.getNextFragmentLoopLoading=function(t,e,r,i,n){var a=t.gap,s=this.getNextFragment(this.nextLoadPosition,e);if(null===s)return s;if(t=s,a&&t&&!t.gap&&r.nextStart){var o=this.getFwdBufferInfoAtPos(this.mediaBuffer?this.mediaBuffer:this.media,r.nextStart,i);if(null!==o&&r.len+o.len>=n)return this.log('buffer full after gaps in "'+i+'" playlist starting at sn: '+t.sn),null}return t},r.mapToInitFragWhenRequired=function(t){return null==t||!t.initSegment||null!=t&&t.initSegment.data||this.bitrateTest?t:t.initSegment},r.getNextPart=function(t,e,r){for(var i=-1,n=!1,a=!0,s=0,o=t.length;s-1&&rr.start&&r.loaded},r.getInitialLiveFragment=function(t,e){var r=this.fragPrevious,i=null;if(r){if(t.hasProgramDateTime&&(this.log("Live playlist, switching playlist, load frag with same PDT: "+r.programDateTime),i=function(t,e,r){if(null===e||!Array.isArray(t)||!t.length||!E(e))return null;if(e<(t[0].programDateTime||0))return null;if(e>=(t[t.length-1].endProgramDateTime||0))return null;r=r||0;for(var i=0;i=t.startSN&&n<=t.endSN){var a=e[n-t.startSN];r.cc===a.cc&&(i=a,this.log("Live playlist, switching playlist, load frag with next SN: "+i.sn))}i||(i=function(t,e){return Qe(t,(function(t){return t.cce?-1:0}))}(e,r.cc),i&&this.log("Live playlist, switching playlist, load frag with same CC: "+i.sn))}}else{var s=this.hls.liveSyncPosition;null!==s&&(i=this.getFragmentAtPosition(s,this.bitrateTest?t.fragmentEnd:t.edge,t))}return i},r.getFragmentAtPosition=function(t,e,r){var i,n=this.config,a=this.fragPrevious,s=r.fragments,o=r.endSN,l=r.fragmentHint,u=n.maxFragLookUpTolerance,h=r.partList,d=!!(n.lowLatencyMode&&null!=h&&h.length&&l);if(d&&l&&!this.bitrateTest&&(s=s.concat(l),o=l.sn),i=te-u?0:u):s[s.length-1]){var c=i.sn-r.startSN,f=this.fragmentTracker.getState(i);if((f===mr||f===vr&&i.gap)&&(a=i),a&&i.sn===a.sn&&(!d||h[0].fragment.sn>i.sn)&&a&&i.level===a.level){var g=s[c+1];i=i.sn=a-e.maxFragLookUpTolerance&&n<=s;if(null!==i&&r.duration>i&&(n"+t.startSN+" prev-sn: "+(n?n.sn:"na")+" fragments: "+s),h}return o},r.waitForCdnTuneIn=function(t){return t.live&&t.canBlockReload&&t.partTarget&&t.tuneInGoal>Math.max(t.partHoldBack,3*t.partTarget)},r.setStartPosition=function(t,e){var r=this.startPosition;if(r "+(null==(n=this.fragCurrent)?void 0:n.url))}else{var a=e.details===R.FRAG_GAP;a&&this.fragmentTracker.fragBuffered(i,!0);var s=e.errorAction,o=s||{},l=o.action,u=o.retryCount,h=void 0===u?0:u,d=o.retryConfig;if(s&&l===nr&&d){var c;this.resetStartWhenNotLoaded(null!=(c=this.levelLastLoaded)?c:i.level);var f=qe(d,h);this.warn("Fragment "+i.sn+" of "+t+" "+i.level+" errored with "+e.details+", retrying loading "+(h+1)+"/"+d.maxNumRetry+" in "+f+"ms"),s.resolved=!0,this.retryDate=self.performance.now()+f,this.state=Yr}else d&&s?(this.resetFragmentErrors(t),h.5;i&&this.reduceMaxBufferLength(r.len);var n=!i;return n&&this.warn("Buffer full error while media.currentTime is not buffered, flush "+e+" buffer"),t.frag&&(this.fragmentTracker.removeFragment(t.frag),this.nextLoadPosition=t.frag.start),this.resetLoadingState(),n}return!1},r.resetFragmentErrors=function(t){t===ve&&(this.fragCurrent=null),this.loadedmetadata||(this.startFragRequested=!1),this.state!==Gr&&(this.state=Kr)},r.afterBufferFlushed=function(t,e,r){if(t){var i=Ir.getBuffered(t);this.fragmentTracker.detectEvictedFragments(e,i,r),this.state===Xr&&this.resetLoadingState()}},r.resetLoadingState=function(){this.log("Reset loading state"),this.fragCurrent=null,this.fragPrevious=null,this.state=Kr},r.resetStartWhenNotLoaded=function(t){if(!this.loadedmetadata){this.startFragRequested=!1;var e=this.levels?this.levels[t].details:null;null!=e&&e.live?(this.startPosition=-1,this.setStartPosition(e,0),this.resetLoadingState()):this.nextLoadPosition=this.startPosition}},r.resetWhenMissingContext=function(t){var e;this.warn("The loading context changed while buffering fragment "+t.sn+" of level "+t.level+". This chunk will not be buffered."),this.removeUnbufferedFrags(),this.resetStartWhenNotLoaded(null!=(e=this.levelLastLoaded)?e:t.level),this.resetLoadingState()},r.removeUnbufferedFrags=function(t){void 0===t&&(t=0),this.fragmentTracker.removeFragmentsInRange(t,1/0,this.playlistType,!1,!0)},r.updateLevelTiming=function(t,e,r,i){var n,a=this,s=r.details;if(s){if(Object.keys(t.elementaryStreams).reduce((function(e,n){var o=t.elementaryStreams[n];if(o){var l=o.endPTS-o.startPTS;if(l<=0)return a.warn("Could not parse fragment "+t.sn+" "+n+" duration reliably ("+l+")"),e||!1;var u=i?0:Be(s,t,o.startPTS,o.endPTS,o.startDTS,o.endDTS);return a.hls.trigger(S.LEVEL_PTS_UPDATED,{details:s,level:r,drift:u,type:n,frag:t,start:o.startPTS,end:o.endPTS}),!0}return e}),!1))r.fragmentError=0;else if(null===(null==(n=this.transmuxer)?void 0:n.error)){var o=new Error("Found no media in fragment "+t.sn+" of level "+t.level+" resetting transmuxer to fallback to playlist timing");if(0===r.fragmentError&&(r.fragmentError++,t.gap=!0,this.fragmentTracker.removeFragment(t),this.fragmentTracker.fragBuffered(t,!0)),this.warn(o.message),this.hls.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.FRAG_PARSING_ERROR,fatal:!1,error:o,frag:t,reason:"Found no media in msn "+t.sn+' of level "'+r.url+'"'}),!this.hls)return;this.resetTransmuxer()}this.state=qr,this.hls.trigger(S.FRAG_PARSED,{frag:t,part:e})}else this.warn("level.details undefined")},r.resetTransmuxer=function(){this.transmuxer&&(this.transmuxer.destroy(),this.transmuxer=null)},r.recoverWorkerError=function(t){var e,r,i;"demuxerWorker"===t.event&&(this.fragmentTracker.removeAllFragments(),this.resetTransmuxer(),this.resetStartWhenNotLoaded(null!=(e=null!=(r=this.levelLastLoaded)?r:null==(i=this.fragCurrent)?void 0:i.level)?e:0),this.resetLoadingState())},a(e,[{key:"state",get:function(){return this._state},set:function(t){var e=this._state;e!==t&&(this._state=t,this.log(e+"->"+t))}}]),e}(br);function Zr(){return self.SourceBuffer||self.WebKitSourceBuffer}function ti(t,e){return void 0===t&&(t=""),void 0===e&&(e=9e4),{type:t,id:-1,pid:-1,inputTimeScale:e,sequenceNumber:-1,samples:[],dropped:0}}var ei=function(){function t(){this._audioTrack=void 0,this._id3Track=void 0,this.frameIndex=0,this.cachedData=null,this.basePTS=null,this.initPTS=null,this.lastPTS=null}var e=t.prototype;return e.resetInitSegment=function(t,e,r,i){this._id3Track={type:"id3",id:3,pid:-1,inputTimeScale:9e4,sequenceNumber:0,samples:[],dropped:0}},e.resetTimeStamp=function(t){this.initPTS=t,this.resetContiguity()},e.resetContiguity=function(){this.basePTS=null,this.lastPTS=null,this.frameIndex=0},e.canParse=function(t,e){return!1},e.appendFrame=function(t,e,r){},e.demux=function(t,e){this.cachedData&&(t=xt(this.cachedData,t),this.cachedData=null);var r,i=st(t,0),n=i?i.length:0,a=this._audioTrack,s=this._id3Track,o=i?function(t){for(var e=dt(t),r=0;r0&&s.samples.push({pts:this.lastPTS,dts:this.lastPTS,data:i,type:Ae,duration:Number.POSITIVE_INFINITY});n>>5}function si(t,e){return e+1=t.length)return!1;var i=ai(t,e);if(i<=r)return!1;var n=e+i;return n===t.length||si(t,n)}return!1}function li(t,e,r,i,n){if(!t.samplerate){var a=function(t,e,r,i){var n,a,s,o,l=navigator.userAgent.toLowerCase(),u=i,h=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350];n=1+((192&e[r+2])>>>6);var d=(60&e[r+2])>>>2;if(!(d>h.length-1))return s=(1&e[r+2])<<2,s|=(192&e[r+3])>>>6,w.log("manifest codec:"+i+", ADTS type:"+n+", samplingIndex:"+d),/firefox/i.test(l)?d>=6?(n=5,o=new Array(4),a=d-3):(n=2,o=new Array(2),a=d):-1!==l.indexOf("android")?(n=2,o=new Array(2),a=d):(n=5,o=new Array(4),i&&(-1!==i.indexOf("mp4a.40.29")||-1!==i.indexOf("mp4a.40.5"))||!i&&d>=6?a=d-3:((i&&-1!==i.indexOf("mp4a.40.2")&&(d>=6&&1===s||/vivaldi/i.test(l))||!i&&1===s)&&(n=2,o=new Array(2)),a=d)),o[0]=n<<3,o[0]|=(14&d)>>1,o[1]|=(1&d)<<7,o[1]|=s<<3,5===n&&(o[1]|=(14&a)>>1,o[2]=(1&a)<<7,o[2]|=8,o[3]=0),{config:o,samplerate:h[d],channelCount:s,codec:"mp4a.40."+n,manifestCodec:u};t.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+d})}(e,r,i,n);if(!a)return;t.config=a.config,t.samplerate=a.samplerate,t.channelCount=a.channelCount,t.codec=a.codec,t.manifestCodec=a.manifestCodec,w.log("parsed codec:"+t.codec+", rate:"+a.samplerate+", channels:"+a.channelCount)}}function ui(t){return 9216e4/t}function hi(t,e,r,i,n){var a,s=i+n*ui(t.samplerate),o=function(t,e){var r=ni(t,e);if(e+r<=t.length){var i=ai(t,e)-r;if(i>0)return{headerLength:r,frameLength:i}}}(e,r);if(o){var l=o.frameLength,u=o.headerLength,h=u+l,d=Math.max(0,r+h-e.length);d?(a=new Uint8Array(h-u)).set(e.subarray(r+u,e.length),0):a=e.subarray(r+u,r+h);var c={unit:a,pts:s};return d||t.samples.push(c),{sample:c,length:h,missing:d}}var f=e.length-r;return(a=new Uint8Array(f)).set(e.subarray(r,e.length),0),{sample:{unit:a,pts:s},length:f,missing:-1}}var di=function(t){function e(e,r){var i;return(i=t.call(this)||this).observer=void 0,i.config=void 0,i.observer=e,i.config=r,i}l(e,t);var r=e.prototype;return r.resetInitSegment=function(e,r,i,n){t.prototype.resetInitSegment.call(this,e,r,i,n),this._audioTrack={container:"audio/adts",type:"audio",id:2,pid:-1,sequenceNumber:0,segmentCodec:"aac",samples:[],manifestCodec:r,duration:n,inputTimeScale:9e4,dropped:0}},e.probe=function(t){if(!t)return!1;for(var e=(st(t,0)||[]).length,r=t.length;e16384?t.subarray(0,16384):t,["moof"]).length>0},e.demux=function(t,e){this.timeOffset=e;var r=t,i=this.videoTrack,n=this.txtTrack;if(this.config.progressive){this.remainderData&&(r=xt(this.remainderData,t));var a=function(t){var e={valid:null,remainder:null},r=It(t,["moof"]);if(!r)return e;if(r.length<2)return e.remainder=t,e;var i=r[r.length-1];return e.valid=rt(t,0,i.byteOffset-8),e.remainder=rt(t,i.byteOffset-8),e}(r);this.remainderData=a.remainder,i.samples=a.valid||new Uint8Array}else i.samples=r;var s=this.extractID3Track(i,e);return n.samples=Ft(e,i),{videoTrack:i,audioTrack:this.audioTrack,id3Track:s,textTrack:this.txtTrack}},e.flush=function(){var t=this.timeOffset,e=this.videoTrack,r=this.txtTrack;e.samples=this.remainderData||new Uint8Array,this.remainderData=null;var i=this.extractID3Track(e,this.timeOffset);return r.samples=Ft(t,e),{videoTrack:e,audioTrack:ti(),id3Track:i,textTrack:ti()}},e.extractID3Track=function(t,e){var r=this.id3Track;if(t.samples.length){var i=It(t.samples,["emsg"]);i&&i.forEach((function(t){var i=function(t){var e=t[0],r="",i="",n=0,a=0,s=0,o=0,l=0,u=0;if(0===e){for(;"\0"!==Rt(t.subarray(u,u+1));)r+=Rt(t.subarray(u,u+1)),u+=1;for(r+=Rt(t.subarray(u,u+1)),u+=1;"\0"!==Rt(t.subarray(u,u+1));)i+=Rt(t.subarray(u,u+1)),u+=1;i+=Rt(t.subarray(u,u+1)),u+=1,n=kt(t,12),a=kt(t,16),o=kt(t,20),l=kt(t,24),u=28}else if(1===e){n=kt(t,u+=4);var h=kt(t,u+=4),d=kt(t,u+=4);for(u+=4,s=Math.pow(2,32)*h+d,Number.isSafeInteger(s)||(s=Number.MAX_SAFE_INTEGER,w.warn("Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box")),o=kt(t,u),l=kt(t,u+=4),u+=4;"\0"!==Rt(t.subarray(u,u+1));)r+=Rt(t.subarray(u,u+1)),u+=1;for(r+=Rt(t.subarray(u,u+1)),u+=1;"\0"!==Rt(t.subarray(u,u+1));)i+=Rt(t.subarray(u,u+1)),u+=1;i+=Rt(t.subarray(u,u+1)),u+=1}return{schemeIdUri:r,value:i,timeScale:n,presentationTime:s,presentationTimeDelta:a,eventDuration:o,id:l,payload:t.subarray(u,t.byteLength)}}(t);if(ci.test(i.schemeIdUri)){var n=E(i.presentationTime)?i.presentationTime/i.timeScale:e+i.presentationTimeDelta/i.timeScale,a=4294967295===i.eventDuration?Number.POSITIVE_INFINITY:i.eventDuration/i.timeScale;a<=.001&&(a=Number.POSITIVE_INFINITY);var s=i.payload;r.samples.push({data:s,len:s.byteLength,dts:n,pts:n,type:be,duration:a})}}))}return r},e.demuxSampleAes=function(t,e,r){return Promise.reject(new Error("The MP4 demuxer does not support SAMPLE-AES decryption"))},e.destroy=function(){},t}(),gi=null,vi=[32,64,96,128,160,192,224,256,288,320,352,384,416,448,32,48,56,64,80,96,112,128,160,192,224,256,320,384,32,40,48,56,64,80,96,112,128,160,192,224,256,320,32,48,56,64,80,96,112,128,144,160,176,192,224,256,8,16,24,32,40,48,56,64,80,96,112,128,144,160],mi=[44100,48e3,32e3,22050,24e3,16e3,11025,12e3,8e3],pi=[[0,72,144,12],[0,0,0,0],[0,72,144,12],[0,144,144,12]],yi=[0,1,1,4];function Ti(t,e,r,i,n){if(!(r+24>e.length)){var a=Ei(e,r);if(a&&r+a.frameLength<=e.length){var s=i+n*(9e4*a.samplesPerFrame/a.sampleRate),o={unit:e.subarray(r,r+a.frameLength),pts:s,dts:s};return t.config=[],t.channelCount=a.channelCount,t.samplerate=a.sampleRate,t.samples.push(o),{sample:o,length:a.frameLength,missing:0}}}}function Ei(t,e){var r=t[e+1]>>3&3,i=t[e+1]>>1&3,n=t[e+2]>>4&15,a=t[e+2]>>2&3;if(1!==r&&0!==n&&15!==n&&3!==a){var s=t[e+2]>>1&1,o=t[e+3]>>6,l=1e3*vi[14*(3===r?3-i:3===i?3:4)+n-1],u=mi[3*(3===r?0:2===r?1:2)+a],h=3===o?1:2,d=pi[r][i],c=yi[i],f=8*d*c,g=Math.floor(d*l/u+s)*c;if(null===gi){var v=(navigator.userAgent||"").match(/Chrome\/(\d+)/i);gi=v?parseInt(v[1]):0}return!!gi&&gi<=87&&2===i&&l>=224e3&&0===o&&(t[e+3]=128|t[e+3]),{sampleRate:u,channelCount:h,frameLength:g,samplesPerFrame:f}}}function Si(t,e){return 255===t[e]&&224==(224&t[e+1])&&0!=(6&t[e+1])}function Li(t,e){return e+1t?(this.word<<=t,this.bitsAvailable-=t):(t-=this.bitsAvailable,t-=(e=t>>3)<<3,this.bytesAvailable-=e,this.loadWord(),this.word<<=t,this.bitsAvailable-=t)},e.readBits=function(t){var e=Math.min(this.bitsAvailable,t),r=this.word>>>32-e;if(t>32&&w.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=e,this.bitsAvailable>0)this.word<<=e;else{if(!(this.bytesAvailable>0))throw new Error("no bits available");this.loadWord()}return(e=t-e)>0&&this.bitsAvailable?r<>>t))return this.word<<=t,this.bitsAvailable-=t,t;return this.loadWord(),t+this.skipLZ()},e.skipUEG=function(){this.skipBits(1+this.skipLZ())},e.skipEG=function(){this.skipBits(1+this.skipLZ())},e.readUEG=function(){var t=this.skipLZ();return this.readBits(t+1)-1},e.readEG=function(){var t=this.readUEG();return 1&t?1+t>>>1:-1*(t>>>1)},e.readBoolean=function(){return 1===this.readBits(1)},e.readUByte=function(){return this.readBits(8)},e.readUShort=function(){return this.readBits(16)},e.readUInt=function(){return this.readBits(32)},e.skipScalingList=function(t){for(var e=8,r=8,i=0;i=t.length)return void r();if(!(t[e].unit.length<32||(this.decryptAacSample(t,e,r),this.decrypter.isSync())))return}},e.getAvcEncryptedData=function(t){for(var e=16*Math.floor((t.length-48)/160)+16,r=new Int8Array(e),i=0,n=32;n=t.length)return void i();for(var n=t[e].units;!(r>=n.length);r++){var a=n[r];if(!(a.data.length<=48||1!==a.type&&5!==a.type||(this.decryptAvcSample(t,e,r,i,a),this.decrypter.isSync())))return}}},t}(),bi=188,Di=function(){function t(t,e,r){this.observer=void 0,this.config=void 0,this.typeSupported=void 0,this.sampleAes=null,this.pmtParsed=!1,this.audioCodec=void 0,this.videoCodec=void 0,this._duration=0,this._pmtId=-1,this._avcTrack=void 0,this._audioTrack=void 0,this._id3Track=void 0,this._txtTrack=void 0,this.aacOverFlow=null,this.avcSample=null,this.remainderData=null,this.observer=t,this.config=e,this.typeSupported=r}t.probe=function(e){var r=t.syncOffset(e);return r>0&&w.warn("MPEG2-TS detected but first sync word found @ offset "+r),-1!==r},t.syncOffset=function(t){for(var e=t.length,r=Math.min(940,t.length-bi)+1,i=0;i1&&(0===a&&s>2||o+bi>r))return a}i++}return-1},t.createTrack=function(t,e){return{container:"video"===t||"audio"===t?"video/mp2t":void 0,type:t,id:Lt[t],pid:-1,inputTimeScale:9e4,sequenceNumber:0,samples:[],dropped:0,duration:"audio"===t?e:void 0}};var e=t.prototype;return e.resetInitSegment=function(e,r,i,n){this.pmtParsed=!1,this._pmtId=-1,this._avcTrack=t.createTrack("video"),this._audioTrack=t.createTrack("audio",n),this._id3Track=t.createTrack("id3"),this._txtTrack=t.createTrack("text"),this._audioTrack.segmentCodec="aac",this.aacOverFlow=null,this.avcSample=null,this.remainderData=null,this.audioCodec=r,this.videoCodec=i,this._duration=n},e.resetTimeStamp=function(){},e.resetContiguity=function(){var t=this._audioTrack,e=this._avcTrack,r=this._id3Track;t&&(t.pesData=null),e&&(e.pesData=null),r&&(r.pesData=null),this.aacOverFlow=null,this.avcSample=null,this.remainderData=null},e.demux=function(e,r,i,n){var a;void 0===i&&(i=!1),void 0===n&&(n=!1),i||(this.sampleAes=null);var s=this._avcTrack,o=this._audioTrack,l=this._id3Track,u=this._txtTrack,h=s.pid,d=s.pesData,c=o.pid,f=l.pid,g=o.pesData,v=l.pesData,m=null,p=this.pmtParsed,y=this._pmtId,T=e.length;if(this.remainderData&&(T=(e=xt(this.remainderData,e)).length,this.remainderData=null),T>4>1){if((I=k+5+e[k+4])===k+bi)continue}else I=k+4;switch(D){case h:b&&(d&&(a=Pi(d))&&this.parseAVCPES(s,u,a,!1),d={data:[],size:0}),d&&(d.data.push(e.subarray(I,k+bi)),d.size+=k+bi-I);break;case c:if(b){if(g&&(a=Pi(g)))switch(o.segmentCodec){case"aac":this.parseAACPES(o,a);break;case"mp3":this.parseMPEGPES(o,a)}g={data:[],size:0}}g&&(g.data.push(e.subarray(I,k+bi)),g.size+=k+bi-I);break;case f:b&&(v&&(a=Pi(v))&&this.parseID3PES(l,a),v={data:[],size:0}),v&&(v.data.push(e.subarray(I,k+bi)),v.size+=k+bi-I);break;case 0:b&&(I+=e[I]+1),y=this._pmtId=Ci(e,I);break;case y:b&&(I+=e[I]+1);var C=_i(e,I,this.typeSupported,i);(h=C.avc)>0&&(s.pid=h),(c=C.audio)>0&&(o.pid=c,o.segmentCodec=C.segmentCodec),(f=C.id3)>0&&(l.pid=f),null===m||p||(w.warn("MPEG-TS PMT found at "+k+" after unknown PID '"+m+"'. Backtracking to sync byte @"+E+" to parse all TS packets."),m=null,k=E-188),p=this.pmtParsed=!0;break;case 17:case 8191:break;default:m=D}}else A++;if(A>0){var _=new Error("Found "+A+" TS packet/s that do not start with 0x47");this.observer.emit(S.ERROR,S.ERROR,{type:L.MEDIA_ERROR,details:R.FRAG_PARSING_ERROR,fatal:!1,error:_,reason:_.message})}s.pesData=d,o.pesData=g,l.pesData=v;var P={audioTrack:o,videoTrack:s,id3Track:l,textTrack:u};return n&&this.extractRemainingSamples(P),P},e.flush=function(){var t,e=this.remainderData;return this.remainderData=null,t=e?this.demux(e,-1,!1,!0):{videoTrack:this._avcTrack,audioTrack:this._audioTrack,id3Track:this._id3Track,textTrack:this._txtTrack},this.extractRemainingSamples(t),this.sampleAes?this.decrypt(t,this.sampleAes):t},e.extractRemainingSamples=function(t){var e,r=t.audioTrack,i=t.videoTrack,n=t.id3Track,a=t.textTrack,s=i.pesData,o=r.pesData,l=n.pesData;if(s&&(e=Pi(s))?(this.parseAVCPES(i,a,e,!0),i.pesData=null):i.pesData=s,o&&(e=Pi(o))){switch(r.segmentCodec){case"aac":this.parseAACPES(r,e);break;case"mp3":this.parseMPEGPES(r,e)}r.pesData=null}else null!=o&&o.size&&w.log("last AAC PES packet truncated,might overlap between fragments"),r.pesData=o;l&&(e=Pi(l))?(this.parseID3PES(n,e),n.pesData=null):n.pesData=l},e.demuxSampleAes=function(t,e,r){var i=this.demux(t,r,!0,!this.config.progressive),n=this.sampleAes=new ki(this.observer,this.config,e);return this.decrypt(i,n)},e.decrypt=function(t,e){return new Promise((function(r){var i=t.audioTrack,n=t.videoTrack;i.samples&&"aac"===i.segmentCodec?e.decryptAacSamples(i.samples,0,(function(){n.samples?e.decryptAvcSamples(n.samples,0,0,(function(){r(t)})):r(t)})):n.samples&&e.decryptAvcSamples(n.samples,0,0,(function(){r(t)}))}))},e.destroy=function(){this._duration=0},e.parseAVCPES=function(t,e,r,i){var n,a=this,s=this.parseAVCNALu(t,r.data),o=this.avcSample,l=!1;r.data=null,o&&s.length&&!t.audFound&&(xi(o,t),o=this.avcSample=Ii(!1,r.pts,r.dts,"")),s.forEach((function(i){var s;switch(i.type){case 1:var u=!1;n=!0;var h,d=i.data;if(l&&d.length>4){var c=new Ai(d).readSliceType();2!==c&&4!==c&&7!==c&&9!==c||(u=!0)}u&&null!=(h=o)&&h.frame&&!o.key&&(xi(o,t),o=a.avcSample=null),o||(o=a.avcSample=Ii(!0,r.pts,r.dts,"")),o.frame=!0,o.key=u;break;case 5:n=!0,null!=(s=o)&&s.frame&&!o.key&&(xi(o,t),o=a.avcSample=null),o||(o=a.avcSample=Ii(!0,r.pts,r.dts,"")),o.key=!0,o.frame=!0;break;case 6:n=!0,Ot(i.data,1,r.pts,e.samples);break;case 7:if(n=!0,l=!0,!t.sps){var f=i.data,g=new Ai(f).readSPS();t.width=g.width,t.height=g.height,t.pixelRatio=g.pixelRatio,t.sps=[f],t.duration=a._duration;for(var v=f.subarray(1,4),m="avc1.",p=0;p<3;p++){var y=v[p].toString(16);y.length<2&&(y="0"+y),m+=y}t.codec=m}break;case 8:n=!0,t.pps||(t.pps=[i.data]);break;case 9:n=!1,t.audFound=!0,o&&xi(o,t),o=a.avcSample=Ii(!1,r.pts,r.dts,"");break;case 12:n=!0;break;default:n=!1,o&&(o.debug+="unknown NAL "+i.type+" ")}o&&n&&o.units.push(i)})),i&&o&&(xi(o,t),this.avcSample=null)},e.getLastNalUnit=function(t){var e,r,i=this.avcSample;if(i&&0!==i.units.length||(i=t[t.length-1]),null!=(e=i)&&e.units){var n=i.units;r=n[n.length-1]}return r},e.parseAVCNALu=function(t,e){var r,i,n=e.byteLength,a=t.naluState||0,s=a,o=[],l=0,u=-1,h=0;for(-1===a&&(u=0,h=31&e[0],a=0,l=1);l=0){var d={data:e.subarray(u,l-a-1),type:h};o.push(d)}else{var c=this.getLastNalUnit(t.samples);if(c&&(s&&l<=4-s&&c.state&&(c.data=c.data.subarray(0,c.data.byteLength-s)),(i=l-a-1)>0)){var f=new Uint8Array(c.data.byteLength+i);f.set(c.data,0),f.set(e.subarray(0,i),c.data.byteLength),c.data=f,c.state=0}}l=0&&a>=0){var g={data:e.subarray(u,n),type:h,state:a};o.push(g)}if(0===o.length){var v=this.getLastNalUnit(t.samples);if(v){var m=new Uint8Array(v.data.byteLength+e.byteLength);m.set(v.data,0),m.set(e,v.data.byteLength),v.data=m}}return t.naluState=a,o},e.parseAACPES=function(t,e){var r,i,n,a=0,s=this.aacOverFlow,o=e.data;if(s){this.aacOverFlow=null;var l=s.missing,u=s.sample.unit.byteLength;if(-1===l){var h=new Uint8Array(u+o.byteLength);h.set(s.sample.unit,0),h.set(o,u),o=h}else{var d=u-l;s.sample.unit.set(o.subarray(0,l),d),t.samples.push(s.sample),a=s.missing}}for(r=a,i=o.length;r1;){var l=new Uint8Array(o[0].length+o[1].length);l.set(o[0]),l.set(o[1],o[0].length),o[0]=l,o.splice(1,1)}if(1===((e=o[0])[0]<<16)+(e[1]<<8)+e[2]){if((r=(e[4]<<8)+e[5])&&r>t.size-6)return null;var u=e[7];192&u&&(n=536870912*(14&e[9])+4194304*(255&e[10])+16384*(254&e[11])+128*(255&e[12])+(254&e[13])/2,64&u?n-(a=536870912*(14&e[14])+4194304*(255&e[15])+16384*(254&e[16])+128*(255&e[17])+(254&e[18])/2)>54e5&&(w.warn(Math.round((n-a)/9e4)+"s delta between PTS and DTS, align them"),n=a):a=n);var h=(i=e[8])+9;if(t.size<=h)return null;t.size-=h;for(var d=new Uint8Array(t.size),c=0,f=o.length;cg){h-=g;continue}e=e.subarray(h),g-=h,h=0}d.set(e,s),s+=g}return r&&(r-=i+3),{data:d,pts:n,dts:a,len:r}}return null}function xi(t,e){if(t.units.length&&t.frame){if(void 0===t.pts){var r=e.samples,i=r.length;if(!i)return void e.dropped++;var n=r[i-1];t.pts=n.pts,t.dts=n.dts}e.samples.push(t)}t.debug.length&&w.log(t.pts+"/"+t.dts+":"+t.debug)}var Fi=function(t){function e(){return t.apply(this,arguments)||this}l(e,t);var r=e.prototype;return r.resetInitSegment=function(e,r,i,n){t.prototype.resetInitSegment.call(this,e,r,i,n),this._audioTrack={container:"audio/mpeg",type:"audio",id:2,pid:-1,sequenceNumber:0,segmentCodec:"mp3",samples:[],manifestCodec:r,duration:n,inputTimeScale:9e4,dropped:0}},e.probe=function(t){if(!t)return!1;for(var e=(st(t,0)||[]).length,r=t.length;e1?r-1:0),n=1;n>24&255,o[1]=e>>16&255,o[2]=e>>8&255,o[3]=255&e,o.set(t,4),a=0,e=8;a>24&255,e>>16&255,e>>8&255,255&e,i>>24,i>>16&255,i>>8&255,255&i,n>>24,n>>16&255,n>>8&255,255&n,85,196,0,0]))},t.mdia=function(e){return t.box(t.types.mdia,t.mdhd(e.timescale,e.duration),t.hdlr(e.type),t.minf(e))},t.mfhd=function(e){return t.box(t.types.mfhd,new Uint8Array([0,0,0,0,e>>24,e>>16&255,e>>8&255,255&e]))},t.minf=function(e){return"audio"===e.type?t.box(t.types.minf,t.box(t.types.smhd,t.SMHD),t.DINF,t.stbl(e)):t.box(t.types.minf,t.box(t.types.vmhd,t.VMHD),t.DINF,t.stbl(e))},t.moof=function(e,r,i){return t.box(t.types.moof,t.mfhd(e),t.traf(i,r))},t.moov=function(e){for(var r=e.length,i=[];r--;)i[r]=t.trak(e[r]);return t.box.apply(null,[t.types.moov,t.mvhd(e[0].timescale,e[0].duration)].concat(i).concat(t.mvex(e)))},t.mvex=function(e){for(var r=e.length,i=[];r--;)i[r]=t.trex(e[r]);return t.box.apply(null,[t.types.mvex].concat(i))},t.mvhd=function(e,r){r*=e;var i=Math.floor(r/(Oi+1)),n=Math.floor(r%(Oi+1)),a=new Uint8Array([1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,e>>24&255,e>>16&255,e>>8&255,255&e,i>>24,i>>16&255,i>>8&255,255&i,n>>24,n>>16&255,n>>8&255,255&n,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return t.box(t.types.mvhd,a)},t.sdtp=function(e){var r,i,n=e.samples||[],a=new Uint8Array(4+n.length);for(r=0;r>>8&255),a.push(255&n),a=a.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&n),s=s.concat(Array.prototype.slice.call(i));var o=t.box(t.types.avcC,new Uint8Array([1,a[3],a[4],a[5],255,224|e.sps.length].concat(a).concat([e.pps.length]).concat(s))),l=e.width,u=e.height,h=e.pixelRatio[0],d=e.pixelRatio[1];return t.box(t.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,l>>8&255,255&l,u>>8&255,255&u,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),o,t.box(t.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])),t.box(t.types.pasp,new Uint8Array([h>>24,h>>16&255,h>>8&255,255&h,d>>24,d>>16&255,d>>8&255,255&d])))},t.esds=function(t){var e=t.config.length;return new Uint8Array([0,0,0,0,3,23+e,0,1,0,4,15+e,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([e]).concat(t.config).concat([6,1,2]))},t.mp4a=function(e){var r=e.samplerate;return t.box(t.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,e.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),t.box(t.types.esds,t.esds(e)))},t.mp3=function(e){var r=e.samplerate;return t.box(t.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,e.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]))},t.stsd=function(e){return"audio"===e.type?"mp3"===e.segmentCodec&&"mp3"===e.codec?t.box(t.types.stsd,t.STSD,t.mp3(e)):t.box(t.types.stsd,t.STSD,t.mp4a(e)):t.box(t.types.stsd,t.STSD,t.avc1(e))},t.tkhd=function(e){var r=e.id,i=e.duration*e.timescale,n=e.width,a=e.height,s=Math.floor(i/(Oi+1)),o=Math.floor(i%(Oi+1));return t.box(t.types.tkhd,new Uint8Array([1,0,0,7,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,s>>24,s>>16&255,s>>8&255,255&s,o>>24,o>>16&255,o>>8&255,255&o,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,n>>8&255,255&n,0,0,a>>8&255,255&a,0,0]))},t.traf=function(e,r){var i=t.sdtp(e),n=e.id,a=Math.floor(r/(Oi+1)),s=Math.floor(r%(Oi+1));return t.box(t.types.traf,t.box(t.types.tfhd,new Uint8Array([0,0,0,0,n>>24,n>>16&255,n>>8&255,255&n])),t.box(t.types.tfdt,new Uint8Array([1,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,s>>24,s>>16&255,s>>8&255,255&s])),t.trun(e,i.length+16+20+8+16+8+8),i)},t.trak=function(e){return e.duration=e.duration||4294967295,t.box(t.types.trak,t.tkhd(e),t.mdia(e))},t.trex=function(e){var r=e.id;return t.box(t.types.trex,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))},t.trun=function(e,r){var i,n,a,s,o,l,u=e.samples||[],h=u.length,d=12+16*h,c=new Uint8Array(d);for(r+=8+d,c.set(["video"===e.type?1:0,0,15,1,h>>>24&255,h>>>16&255,h>>>8&255,255&h,r>>>24&255,r>>>16&255,r>>>8&255,255&r],0),i=0;i>>24&255,a>>>16&255,a>>>8&255,255&a,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o.isLeading<<2|o.dependsOn,o.isDependedOn<<6|o.hasRedundancy<<4|o.paddingValue<<1|o.isNonSync,61440&o.degradPrio,15&o.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*i);return t.box(t.types.trun,c)},t.initSegment=function(e){t.types||t.init();var r=t.moov(e),i=new Uint8Array(t.FTYP.byteLength+r.byteLength);return i.set(t.FTYP),i.set(r,t.FTYP.byteLength),i},t}();function Ui(t,e,r,i){void 0===r&&(r=1),void 0===i&&(i=!1);var n=t*e*r;return i?Math.round(n):n}function Bi(t,e){return void 0===e&&(e=!1),Ui(t,1e3,1/9e4,e)}Ni.types=void 0,Ni.HDLR_TYPES=void 0,Ni.STTS=void 0,Ni.STSC=void 0,Ni.STCO=void 0,Ni.STSZ=void 0,Ni.VMHD=void 0,Ni.SMHD=void 0,Ni.STSD=void 0,Ni.FTYP=void 0,Ni.DINF=void 0;var Gi=null,Ki=null,Hi=function(){function t(t,e,r,i){if(this.observer=void 0,this.config=void 0,this.typeSupported=void 0,this.ISGenerated=!1,this._initPTS=null,this._initDTS=null,this.nextAvcDts=null,this.nextAudioPts=null,this.videoSampleDuration=null,this.isAudioContiguous=!1,this.isVideoContiguous=!1,this.observer=t,this.config=e,this.typeSupported=r,this.ISGenerated=!1,null===Gi){var n=(navigator.userAgent||"").match(/Chrome\/(\d+)/i);Gi=n?parseInt(n[1]):0}if(null===Ki){var a=navigator.userAgent.match(/Safari\/(\d+)/i);Ki=a?parseInt(a[1]):0}}var e=t.prototype;return e.destroy=function(){},e.resetTimeStamp=function(t){w.log("[mp4-remuxer]: initPTS & initDTS reset"),this._initPTS=this._initDTS=t},e.resetNextTimestamp=function(){w.log("[mp4-remuxer]: reset next timestamp"),this.isVideoContiguous=!1,this.isAudioContiguous=!1},e.resetInitSegment=function(){w.log("[mp4-remuxer]: ISGenerated flag reset"),this.ISGenerated=!1},e.getVideoStartPts=function(t){var e=!1,r=t.reduce((function(t,r){var i=r.pts-t;return i<-4294967296?(e=!0,Vi(t,r.pts)):i>0?t:r.pts}),t[0].pts);return e&&w.debug("PTS rollover detected"),r},e.remux=function(t,e,r,i,n,a,s,o){var l,u,h,d,c,f,g=n,v=n,m=t.pid>-1,p=e.pid>-1,y=e.samples.length,T=t.samples.length>0,E=s&&y>0||y>1;if((!m||T)&&(!p||E)||this.ISGenerated||s){this.ISGenerated||(h=this.generateIS(t,e,n,a));var S,L=this.isVideoContiguous,R=-1;if(E&&(R=function(t){for(var e=0;e0){w.warn("[mp4-remuxer]: Dropped "+R+" out of "+y+" video samples due to a missing keyframe");var A=this.getVideoStartPts(e.samples);e.samples=e.samples.slice(R),e.dropped+=R,S=v+=(e.samples[0].pts-A)/e.inputTimeScale}else-1===R&&(w.warn("[mp4-remuxer]: No keyframe found out of "+y+" video samples"),f=!1);if(this.ISGenerated){if(T&&E){var k=this.getVideoStartPts(e.samples),b=(Vi(t.samples[0].pts,k)-k)/e.inputTimeScale;g+=Math.max(0,b),v+=Math.max(0,-b)}if(T){if(t.samplerate||(w.warn("[mp4-remuxer]: regenerate InitSegment as audio detected"),h=this.generateIS(t,e,n,a)),u=this.remuxAudio(t,g,this.isAudioContiguous,a,p||E||o===ve?v:void 0),E){var D=u?u.endPTS-u.startPTS:0;e.inputTimeScale||(w.warn("[mp4-remuxer]: regenerate InitSegment as video detected"),h=this.generateIS(t,e,n,a)),l=this.remuxVideo(e,v,L,D)}}else E&&(l=this.remuxVideo(e,v,L,0));l&&(l.firstKeyFrame=R,l.independent=-1!==R,l.firstKeyFramePTS=S)}}return this.ISGenerated&&this._initPTS&&this._initDTS&&(r.samples.length&&(c=Yi(r,n,this._initPTS,this._initDTS)),i.samples.length&&(d=Wi(i,n,this._initPTS))),{audio:u,video:l,initSegment:h,independent:f,text:d,id3:c}},e.generateIS=function(t,e,r,i){var n,a,s,o=t.samples,l=e.samples,u=this.typeSupported,h={},d=this._initPTS,c=!d||i,f="audio/mp4";if(c&&(n=a=1/0),t.config&&o.length&&(t.timescale=t.samplerate,"mp3"===t.segmentCodec&&(u.mpeg?(f="audio/mpeg",t.codec=""):u.mp3&&(t.codec="mp3")),h.audio={id:"audio",container:f,codec:t.codec,initSegment:"mp3"===t.segmentCodec&&u.mpeg?new Uint8Array(0):Ni.initSegment([t]),metadata:{channelCount:t.channelCount}},c&&(s=t.inputTimeScale,d&&s===d.timescale?c=!1:n=a=o[0].pts-Math.round(s*r))),e.sps&&e.pps&&l.length&&(e.timescale=e.inputTimeScale,h.video={id:"main",container:"video/mp4",codec:e.codec,initSegment:Ni.initSegment([e]),metadata:{width:e.width,height:e.height}},c))if(s=e.inputTimeScale,d&&s===d.timescale)c=!1;else{var g=this.getVideoStartPts(l),v=Math.round(s*r);a=Math.min(a,Vi(l[0].dts,g)-v),n=Math.min(n,g-v)}if(Object.keys(h).length)return this.ISGenerated=!0,c?(this._initPTS={baseTime:n,timescale:s},this._initDTS={baseTime:a,timescale:s}):n=s=void 0,{tracks:h,initPTS:n,timescale:s}},e.remuxVideo=function(t,e,r,i){var n,a,s=t.inputTimeScale,l=t.samples,u=[],h=l.length,d=this._initPTS,c=this.nextAvcDts,f=8,g=this.videoSampleDuration,v=Number.POSITIVE_INFINITY,m=Number.NEGATIVE_INFINITY,p=!1;r&&null!==c||(c=e*s-(l[0].pts-Vi(l[0].dts,l[0].pts)));for(var y=d.baseTime*s/d.timescale,T=0;T0?T-1:T].dts&&(p=!0)}p&&l.sort((function(t,e){var r=t.dts-e.dts,i=t.pts-e.pts;return r||i})),n=l[0].dts;var A=(a=l[l.length-1].dts)-n,k=A?Math.round(A/(h-1)):g||t.inputTimeScale/30;if(r){var b=n-c,D=b>k,I=b<-1;if((D||I)&&(D?w.warn("AVC: "+Bi(b,!0)+" ms ("+b+"dts) hole between fragments detected, filling it"):w.warn("AVC: "+Bi(-b,!0)+" ms ("+b+"dts) overlapping between fragments detected"),!I||c>=l[0].pts)){n=c;var C=l[0].pts-b;l[0].dts=n,l[0].pts=C,w.log("Video: First PTS/DTS adjusted: "+Bi(C,!0)+"/"+Bi(n,!0)+", delta: "+Bi(b,!0)+" ms")}}n=Math.max(0,n);for(var _=0,P=0,x=0;x0?X.dts-l[q-1].dts:k;if(rt=q>0?X.pts-l[q-1].pts:k,it.stretchShortVideoTrack&&null!==this.nextAudioPts){var at=Math.floor(it.maxBufferHole*s),st=(i?v+i*s:this.nextAudioPts)-X.pts;st>at?((g=st-nt)<0?g=nt:H=!0,w.log("[mp4-remuxer]: It is approximately "+st/90+" ms to the next segment; using duration "+g/90+" ms for the last video frame.")):g=nt}else g=nt}var ot=Math.round(X.pts-X.dts);V=Math.min(V,g),W=Math.max(W,g),Y=Math.min(Y,rt),j=Math.max(j,rt),u.push(new qi(X.key,g,Q,ot))}if(u.length)if(Gi){if(Gi<70){var lt=u[0].flags;lt.dependsOn=2,lt.isNonSync=0}}else if(Ki&&j-Y0&&(i&&Math.abs(p-m)<9e3||Math.abs(Vi(g[0].pts-y,p)-m)<20*u),g.forEach((function(t){t.pts=Vi(t.pts-y,p)})),!r||m<0){if(g=g.filter((function(t){return t.pts>=0})),!g.length)return;m=0===n?0:i&&!f?Math.max(0,p):g[0].pts}if("aac"===t.segmentCodec)for(var T=this.config.maxAudioFramesDrift,E=0,A=m;E=T*u&&I<1e4&&f){var C=Math.round(D/u);(A=b-C*u)<0&&(C--,A+=u),0===E&&(this.nextAudioPts=m=A),w.warn("[mp4-remuxer]: Injecting "+C+" audio frame @ "+(A/a).toFixed(3)+"s due to "+Math.round(1e3*D/a)+" ms gap.");for(var _=0;_0))return;N+=v;try{F=new Uint8Array(N)}catch(t){return void this.observer.emit(S.ERROR,S.ERROR,{type:L.MUX_ERROR,details:R.REMUX_ALLOC_ERROR,fatal:!1,error:t,bytes:N,reason:"fail allocating audio mdat "+N})}d||(new DataView(F.buffer).setUint32(0,N),F.set(Ni.types.mdat,4))}F.set(H,v);var Y=H.byteLength;v+=Y,c.push(new qi(!0,l,Y,0)),O=V}var W=c.length;if(W){var j=c[c.length-1];this.nextAudioPts=m=O+s*j.duration;var q=d?new Uint8Array(0):Ni.moof(t.sequenceNumber++,M/s,o({},t,{samples:c}));t.samples=[];var X=M/a,z=m/a,Q={data1:q,data2:F,startPTS:X,endPTS:z,startDTS:X,endDTS:z,type:"audio",hasAudio:!0,hasVideo:!1,nb:W};return this.isAudioContiguous=!0,Q}},e.remuxEmptyAudio=function(t,e,r,i){var n=t.inputTimeScale,a=n/(t.samplerate?t.samplerate:n),s=this.nextAudioPts,o=this._initDTS,l=9e4*o.baseTime/o.timescale,u=(null!==s?s:i.startDTS*n)+l,h=i.endDTS*n+l,d=1024*a,c=Math.ceil((h-u)/d),f=Mi.getSilentFrame(t.manifestCodec||t.codec,t.channelCount);if(w.warn("[mp4-remuxer]: remux empty Audio"),f){for(var g=[],v=0;v4294967296;)t+=r;return t}function Yi(t,e,r,i){var n=t.samples.length;if(n){for(var a=t.inputTimeScale,s=0;s0;n||(i=It(e,["encv"])),i.forEach((function(t){It(n?t.subarray(28):t.subarray(78),["sinf"]).forEach((function(t){var e=_t(t);if(e){var i=e.subarray(8,24);i.some((function(t){return 0!==t}))||(w.log("[eme] Patching keyId in 'enc"+(n?"a":"v")+">sinf>>tenc' box: "+Tt(i)+" -> "+Tt(r)),e.set(r,8))}}))}))})),t}(t,i)),this.emitInitSegment=!0},e.generateInitSegment=function(t){var e=this.audioCodec,r=this.videoCodec;if(null==t||!t.byteLength)return this.initTracks=void 0,void(this.initData=void 0);var i=this.initData=Ct(t);e||(e=Qi(i.audio,O)),r||(r=Qi(i.video,N));var n={};i.audio&&i.video?n.audiovideo={container:"video/mp4",codec:e+","+r,initSegment:t,id:"main"}:i.audio?n.audio={container:"audio/mp4",codec:e,initSegment:t,id:"audio"}:i.video?n.video={container:"video/mp4",codec:r,initSegment:t,id:"main"}:w.warn("[passthrough-remuxer.ts]: initSegment does not contain moov or trak boxes."),this.initTracks=n},e.remux=function(t,e,r,i,n,a){var s,o,l=this.initPTS,u=this.lastEndTime,h={audio:void 0,video:void 0,text:i,id3:r,initSegment:void 0};E(u)||(u=this.lastEndTime=n||0);var d=e.samples;if(null==d||!d.length)return h;var c={initPTS:void 0,timescale:1},f=this.initData;if(null!=(s=f)&&s.length||(this.generateInitSegment(d),f=this.initData),null==(o=f)||!o.length)return w.warn("[passthrough-remuxer.ts]: Failed to generate initSegment."),h;this.emitInitSegment&&(c.tracks=this.initTracks,this.emitInitSegment=!1);var g=function(t,e){for(var r=0,i=0,n=0,a=It(t,["moof","traf"]),s=0;sn}(l,m,n,g)||c.timescale!==l.timescale&&a)&&(c.initPTS=m-n,l&&1===l.timescale&&w.warn("Adjusting initPTS by "+(c.initPTS-l.baseTime)),this.initPTS=l={baseTime:c.initPTS,timescale:1});var p=t?m-l.baseTime/l.timescale:u,y=p+g;!function(t,e,r){It(e,["moof","traf"]).forEach((function(e){It(e,["tfhd"]).forEach((function(i){var n=kt(i,4),a=t[n];if(a){var s=a.timescale||9e4;It(e,["tfdt"]).forEach((function(t){var e=t[0],i=kt(t,4);if(0===e)i-=r*s,Dt(t,4,i=Math.max(i,0));else{i*=Math.pow(2,32),i+=kt(t,8),i-=r*s,i=Math.max(i,0);var n=Math.floor(i/(Et+1)),a=Math.floor(i%(Et+1));Dt(t,4,n),Dt(t,8,a)}}))}}))}))}(f,d,l.baseTime/l.timescale),g>0?this.lastEndTime=y:(w.warn("Duration parsed from mp4 should be greater than zero"),this.resetNextTimestamp());var T=!!f.audio,S=!!f.video,L="";T&&(L+="audio"),S&&(L+="video");var R={data1:d,startPTS:p,startDTS:p,endPTS:y,endDTS:y,type:L,hasAudio:T,hasVideo:S,nb:1,dropped:0};return h.audio="audio"===R.type?R:void 0,h.video="audio"!==R.type?R:void 0,h.initSegment=c,h.id3=Yi(r,n,l,l),i.samples.length&&(h.text=Wi(i,n,l)),h},t}();function Qi(t,e){var r=null==t?void 0:t.codec;return r&&r.length>4?r:"hvc1"===r||"hev1"===r?"hvc1.1.6.L120.90":"av01"===r?"av01.0.04M.08":"avc1"===r||e===N?"avc1.42e01e":"mp4a.40.5"}try{ji=self.performance.now.bind(self.performance)}catch(t){w.debug("Unable to use Performance API on this environment"),ji="undefined"!=typeof self&&self.Date.now}var $i=[{demux:fi,remux:zi},{demux:Di,remux:Hi},{demux:di,remux:Hi},{demux:Fi,remux:Hi}],Ji=function(){function t(t,e,r,i,n){this.async=!1,this.observer=void 0,this.typeSupported=void 0,this.config=void 0,this.vendor=void 0,this.id=void 0,this.demuxer=void 0,this.remuxer=void 0,this.decrypter=void 0,this.probe=void 0,this.decryptionPromise=null,this.transmuxConfig=void 0,this.currentTransmuxState=void 0,this.observer=t,this.typeSupported=e,this.config=r,this.vendor=i,this.id=n}var e=t.prototype;return e.configure=function(t){this.transmuxConfig=t,this.decrypter&&this.decrypter.reset()},e.push=function(t,e,r,i){var n=this,a=r.transmuxing;a.executeStart=ji();var s=new Uint8Array(t),o=this.currentTransmuxState,l=this.transmuxConfig;i&&(this.currentTransmuxState=i);var u=i||o,h=u.contiguous,d=u.discontinuity,c=u.trackSwitch,f=u.accurateTimeOffset,g=u.timeOffset,v=u.initSegmentChange,m=l.audioCodec,p=l.videoCodec,y=l.defaultInitPts,T=l.duration,E=l.initSegmentData,A=function(t,e){var r=null;return t.byteLength>0&&null!=e&&null!=e.key&&null!==e.iv&&null!=e.method&&(r=e),r}(s,e);if(A&&"AES-128"===A.method){var k=this.getDecrypter();if(!k.isSync())return this.decryptionPromise=k.webCryptoDecrypt(s,A.key.buffer,A.iv.buffer).then((function(t){var e=n.push(t,null,r);return n.decryptionPromise=null,e})),this.decryptionPromise;var b=k.softwareDecrypt(s,A.key.buffer,A.iv.buffer);if(r.part>-1&&(b=k.flush()),!b)return a.executeEnd=ji(),Zi(r);s=new Uint8Array(b)}var D=this.needsProbing(d,c);if(D){var I=this.configureTransmuxer(s);if(I)return w.warn("[transmuxer] "+I.message),this.observer.emit(S.ERROR,S.ERROR,{type:L.MEDIA_ERROR,details:R.FRAG_PARSING_ERROR,fatal:!1,error:I,reason:I.message}),a.executeEnd=ji(),Zi(r)}(d||c||v||D)&&this.resetInitSegment(E,m,p,T,e),(d||v||D)&&this.resetInitialTimestamp(y),h||this.resetContiguity();var C=this.transmux(s,A,g,f,r),_=this.currentTransmuxState;return _.contiguous=!0,_.discontinuity=!1,_.trackSwitch=!1,a.executeEnd=ji(),C},e.flush=function(t){var e=this,r=t.transmuxing;r.executeStart=ji();var i=this.decrypter,n=this.currentTransmuxState,a=this.decryptionPromise;if(a)return a.then((function(){return e.flush(t)}));var s=[],o=n.timeOffset;if(i){var l=i.flush();l&&s.push(this.push(l,null,t))}var u=this.demuxer,h=this.remuxer;if(!u||!h)return r.executeEnd=ji(),[Zi(t)];var d=u.flush(o);return tn(d)?d.then((function(r){return e.flushRemux(s,r,t),s})):(this.flushRemux(s,d,t),s)},e.flushRemux=function(t,e,r){var i=e.audioTrack,n=e.videoTrack,a=e.id3Track,s=e.textTrack,o=this.currentTransmuxState,l=o.accurateTimeOffset,u=o.timeOffset;w.log("[transmuxer.ts]: Flushed fragment "+r.sn+(r.part>-1?" p: "+r.part:"")+" of level "+r.level);var h=this.remuxer.remux(i,n,a,s,u,l,!0,this.id);t.push({remuxResult:h,chunkMeta:r}),r.transmuxing.executeEnd=ji()},e.resetInitialTimestamp=function(t){var e=this.demuxer,r=this.remuxer;e&&r&&(e.resetTimeStamp(t),r.resetTimeStamp(t))},e.resetContiguity=function(){var t=this.demuxer,e=this.remuxer;t&&e&&(t.resetContiguity(),e.resetNextTimestamp())},e.resetInitSegment=function(t,e,r,i,n){var a=this.demuxer,s=this.remuxer;a&&s&&(a.resetInitSegment(t,e,r,i),s.resetInitSegment(t,e,r,n))},e.destroy=function(){this.demuxer&&(this.demuxer.destroy(),this.demuxer=void 0),this.remuxer&&(this.remuxer.destroy(),this.remuxer=void 0)},e.transmux=function(t,e,r,i,n){return e&&"SAMPLE-AES"===e.method?this.transmuxSampleAes(t,e,r,i,n):this.transmuxUnencrypted(t,r,i,n)},e.transmuxUnencrypted=function(t,e,r,i){var n=this.demuxer.demux(t,e,!1,!this.config.progressive),a=n.audioTrack,s=n.videoTrack,o=n.id3Track,l=n.textTrack;return{remuxResult:this.remuxer.remux(a,s,o,l,e,r,!1,this.id),chunkMeta:i}},e.transmuxSampleAes=function(t,e,r,i,n){var a=this;return this.demuxer.demuxSampleAes(t,e,r).then((function(t){return{remuxResult:a.remuxer.remux(t.audioTrack,t.videoTrack,t.id3Track,t.textTrack,r,i,!1,a.id),chunkMeta:n}}))},e.configureTransmuxer=function(t){for(var e,r=this.config,i=this.observer,n=this.typeSupported,a=this.vendor,s=0,o=$i.length;s1&&l.id===(null==m?void 0:m.stats.chunkCount),L=!y&&(1===T||0===T&&(1===E||S&&E<=0)),R=self.performance.now();(y||T||0===n.stats.parsing.start)&&(n.stats.parsing.start=R),!a||!E&&L||(a.stats.parsing.start=R);var A=!(m&&(null==(h=n.initSegment)?void 0:h.url)===(null==(d=m.initSegment)?void 0:d.url)),k=new rn(p,L,o,y,g,A);if(!L||p||A){w.log("[transmuxer-interface, "+n.type+"]: Starting new transmux session for sn: "+l.sn+" p: "+l.part+" level: "+l.level+" id: "+l.id+"\n discontinuity: "+p+"\n trackSwitch: "+y+"\n contiguous: "+L+"\n accurateTimeOffset: "+o+"\n timeOffset: "+g+"\n initSegmentChange: "+A);var b=new en(r,i,e,s,u);this.configureTransmuxer(b)}if(this.frag=n,this.part=a,this.workerContext)this.workerContext.worker.postMessage({cmd:"demux",data:t,decryptdata:v,chunkMeta:l,state:k},t instanceof ArrayBuffer?[t]:[]);else if(f){var D=f.push(t,v,l,k);tn(D)?(f.async=!0,D.then((function(t){c.handleTransmuxComplete(t)})).catch((function(t){c.transmuxerError(t,l,"transmuxer-interface push error")}))):(f.async=!1,this.handleTransmuxComplete(D))}},r.flush=function(t){var e=this;t.transmuxing.start=self.performance.now();var r=this.transmuxer;if(this.workerContext)this.workerContext.worker.postMessage({cmd:"flush",chunkMeta:t});else if(r){var i=r.flush(t);tn(i)||r.async?(tn(i)||(i=Promise.resolve(i)),i.then((function(r){e.handleFlushResult(r,t)})).catch((function(r){e.transmuxerError(r,t,"transmuxer-interface flush error")}))):this.handleFlushResult(i,t)}},r.transmuxerError=function(t,e,r){this.hls&&(this.error=t,this.hls.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.FRAG_PARSING_ERROR,chunkMeta:e,fatal:!1,error:t,err:t,reason:r}))},r.handleFlushResult=function(t,e){var r=this;t.forEach((function(t){r.handleTransmuxComplete(t)})),this.onFlush(e)},r.onWorkerMessage=function(t){var e=t.data,r=this.hls;switch(e.event){case"init":var i,n=null==(i=this.workerContext)?void 0:i.objectURL;n&&self.URL.revokeObjectURL(n);break;case"transmuxComplete":this.handleTransmuxComplete(e.data);break;case"flush":this.onFlush(e.data);break;case"workerLog":w[e.data.logType]&&w[e.data.logType](e.data.message);break;default:e.data=e.data||{},e.data.frag=this.frag,e.data.id=this.id,r.trigger(e.event,e.data)}},r.configureTransmuxer=function(t){var e=this.transmuxer;this.workerContext?this.workerContext.worker.postMessage({cmd:"configure",config:t}):e&&e.configure(t)},r.handleTransmuxComplete=function(t){t.chunkMeta.transmuxing.end=self.performance.now(),this.onTransmuxComplete(t)},e}(),dn=function(){function t(t,e,r,i){this.config=void 0,this.media=null,this.fragmentTracker=void 0,this.hls=void 0,this.nudgeRetry=0,this.stallReported=!1,this.stalled=null,this.moved=!1,this.seeking=!1,this.config=t,this.media=e,this.fragmentTracker=r,this.hls=i}var e=t.prototype;return e.destroy=function(){this.media=null,this.hls=this.fragmentTracker=null},e.poll=function(t,e){var r=this.config,i=this.media,n=this.stalled;if(null!==i){var a=i.currentTime,s=i.seeking,o=this.seeking&&!s,l=!this.seeking&&s;if(this.seeking=s,a===t){if(l||o)this.stalled=null;else if(!(i.paused&&!s||i.ended||0===i.playbackRate)&&Ir.getBuffered(i).length){var u=Ir.bufferInfo(i,a,0),h=u.len>0,d=u.nextStart||0;if(h||d){if(s){var c=u.len>2,f=!d||e&&e.start<=a||d-a>2&&!this.fragmentTracker.getPartialFragment(a);if(c||f)return;this.moved=!1}if(!this.moved&&null!==this.stalled){var g,v=Math.max(d,u.start||0)-a,m=this.hls.levels?this.hls.levels[this.hls.currentLevel]:null,p=(null==m||null==(g=m.details)?void 0:g.live)?2*m.details.targetduration:2,y=this.fragmentTracker.getPartialFragment(a);if(v>0&&(v<=p||y))return void this._trySkipBufferHole(y)}var T=self.performance.now();if(null!==n){var E=T-n;if(s||!(E>=250)||(this._reportStall(u),this.media)){var S=Ir.bufferInfo(i,a,r.maxBufferHole);this._tryFixBufferStall(S,E)}}else this.stalled=T}}}else if(this.moved=!0,null!==n){if(this.stallReported){var L=self.performance.now()-n;w.warn("playback not stuck anymore @"+a+", after "+Math.round(L)+"ms"),this.stallReported=!1}this.stalled=null,this.nudgeRetry=0}}},e._tryFixBufferStall=function(t,e){var r=this.config,i=this.fragmentTracker,n=this.media;if(null!==n){var a=n.currentTime,s=i.getPartialFragment(a);if(s&&(this._trySkipBufferHole(s)||!this.media))return;(t.len>r.maxBufferHole||t.nextStart&&t.nextStart-a1e3*r.highBufferWatchdogPeriod&&(w.warn("Trying to nudge playhead over buffer-hole"),this.stalled=null,this._tryNudgeBuffer())}},e._reportStall=function(t){var e=this.hls,r=this.media;if(!this.stallReported&&r){this.stallReported=!0;var i=new Error("Playback stalling at @"+r.currentTime+" due to low buffer ("+JSON.stringify(t)+")");w.warn(i.message),e.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.BUFFER_STALLED_ERROR,fatal:!1,error:i,buffer:t.len})}},e._trySkipBufferHole=function(t){var e=this.config,r=this.hls,i=this.media;if(null===i)return 0;var n=i.currentTime,a=Ir.bufferInfo(i,n,0),s=n0&&a.len<1&&i.readyState<3,u=s-n;if(u>0&&(o||l)){if(u>e.maxBufferHole){var h=this.fragmentTracker,d=!1;if(0===n){var c=h.getAppendedFrag(0,ge);c&&s1?(i=0,this.bitrateTest=!0):i=r.nextAutoLevel),this.level=r.nextLoadLevel=i,this.loadedmetadata=!1}e>0&&-1===t&&(this.log("Override startPosition with lastCurrentTime @"+e.toFixed(3)),t=e),this.state=Kr,this.nextLoadPosition=this.startPosition=this.lastCurrentTime=t,this.tick()}else this._forceStartLoad=!0,this.state=Gr},r.stopLoad=function(){this._forceStartLoad=!1,t.prototype.stopLoad.call(this)},r.doTick=function(){switch(this.state){case $r:var t,e=this.levels,r=this.level,i=null==e||null==(t=e[r])?void 0:t.details;if(i&&(!i.live||this.levelLastLoaded===this.level)){if(this.waitForCdnTuneIn(i))break;this.state=Kr;break}if(this.hls.nextLoadLevel!==this.level){this.state=Kr;break}break;case Yr:var n,a=self.performance.now(),s=this.retryDate;(!s||a>=s||null!=(n=this.media)&&n.seeking)&&(this.resetStartWhenNotLoaded(this.level),this.state=Kr)}this.state===Kr&&this.doTickIdle(),this.onTickEnd()},r.onTickEnd=function(){t.prototype.onTickEnd.call(this),this.checkBuffer(),this.checkFragmentChanged()},r.doTickIdle=function(){var t=this.hls,e=this.levelLastLoaded,r=this.levels,i=this.media,n=t.config,a=t.nextLoadLevel;if(null!==e&&(i||!this.startFragRequested&&n.startFragPrefetch)&&(!this.altAudio||!this.audioOnly)&&null!=r&&r[a]){var s=r[a],o=this.getMainFwdBufferInfo();if(null!==o){var l=this.getLevelDetails();if(l&&this._streamEnded(o,l)){var u={};return this.altAudio&&(u.type="video"),this.hls.trigger(S.BUFFER_EOS,u),void(this.state=Xr)}t.loadLevel!==a&&-1===t.manualLevel&&this.log("Adapting to level "+a+" from level "+this.level),this.level=t.nextLoadLevel=a;var h=s.details;if(!h||this.state===$r||h.live&&this.levelLastLoaded!==a)return this.level=a,void(this.state=$r);var d=o.len,c=this.getMaxBufferLength(s.maxBitrate);if(!(d>=c)){this.backtrackFragment&&this.backtrackFragment.start>o.end&&(this.backtrackFragment=null);var f=this.backtrackFragment?this.backtrackFragment.start:o.end,g=this.getNextFragment(f,h);if(this.couldBacktrack&&!this.fragPrevious&&g&&"initSegment"!==g.sn&&this.fragmentTracker.getState(g)!==mr){var v,m=(null!=(v=this.backtrackFragment)?v:g).sn-h.startSN,p=h.fragments[m-1];p&&g.cc===p.cc&&(g=p,this.fragmentTracker.removeFragment(p))}else this.backtrackFragment&&o.len&&(this.backtrackFragment=null);if(g&&this.isLoopLoading(g,f)){if(!g.gap){var y=this.audioOnly&&!this.altAudio?O:N,T=(y===N?this.videoBuffer:this.mediaBuffer)||this.media;T&&this.afterBufferFlushed(T,y,ge)}g=this.getNextFragmentLoopLoading(g,h,o,ge,c)}g&&(!g.initSegment||g.initSegment.data||this.bitrateTest||(g=g.initSegment),this.loadFragment(g,s,f))}}}},r.loadFragment=function(e,r,i){var n=this.fragmentTracker.getState(e);this.fragCurrent=e,n===fr||n===vr?"initSegment"===e.sn?this._loadInitSegment(e,r):this.bitrateTest?(this.log("Fragment "+e.sn+" of level "+e.level+" is being downloaded to test bitrate and will not be buffered"),this._loadBitrateTestFrag(e,r)):(this.startFragRequested=!0,t.prototype.loadFragment.call(this,e,r,i)):this.clearTrackerIfNeeded(e)},r.getBufferedFrag=function(t){return this.fragmentTracker.getBufferedFrag(t,ge)},r.followingBufferedFrag=function(t){return t?this.getBufferedFrag(t.end+.5):null},r.immediateLevelSwitch=function(){this.abortCurrentFrag(),this.flushMainBuffer(0,Number.POSITIVE_INFINITY)},r.nextLevelSwitch=function(){var t=this.levels,e=this.media;if(null!=e&&e.readyState){var r,i=this.getAppendedFrag(e.currentTime);i&&i.start>1&&this.flushMainBuffer(0,i.start-1);var n=this.getLevelDetails();if(null!=n&&n.live){var a=this.getMainFwdBufferInfo();if(!a||a.len<2*n.targetduration)return}if(!e.paused&&t){var s=t[this.hls.nextLoadLevel],o=this.fragLastKbps;r=o&&this.fragCurrent?this.fragCurrent.duration*s.maxBitrate/(1e3*o)+1:0}else r=0;var l=this.getBufferedFrag(e.currentTime+r);if(l){var u=this.followingBufferedFrag(l);if(u){this.abortCurrentFrag();var h=u.maxStartPTS?u.maxStartPTS:u.start,d=u.duration,c=Math.max(l.end,h+Math.min(Math.max(d-this.config.maxFragLookUpTolerance,.5*d),.75*d));this.flushMainBuffer(c,Number.POSITIVE_INFINITY)}}}},r.abortCurrentFrag=function(){var t=this.fragCurrent;switch(this.fragCurrent=null,this.backtrackFragment=null,t&&(t.abortRequests(),this.fragmentTracker.removeFragment(t)),this.state){case Hr:case Vr:case Yr:case jr:case qr:this.state=Kr}this.nextLoadPosition=this.getLoadPosition()},r.flushMainBuffer=function(e,r){t.prototype.flushMainBuffer.call(this,e,r,this.altAudio?"video":null)},r.onMediaAttached=function(e,r){t.prototype.onMediaAttached.call(this,e,r);var i=r.media;this.onvplaying=this.onMediaPlaying.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),i.addEventListener("playing",this.onvplaying),i.addEventListener("seeked",this.onvseeked),this.gapController=new dn(this.config,i,this.fragmentTracker,this.hls)},r.onMediaDetaching=function(){var e=this.media;e&&this.onvplaying&&this.onvseeked&&(e.removeEventListener("playing",this.onvplaying),e.removeEventListener("seeked",this.onvseeked),this.onvplaying=this.onvseeked=null,this.videoBuffer=null),this.fragPlaying=null,this.gapController&&(this.gapController.destroy(),this.gapController=null),t.prototype.onMediaDetaching.call(this)},r.onMediaPlaying=function(){this.tick()},r.onMediaSeeked=function(){var t=this.media,e=t?t.currentTime:null;E(e)&&this.log("Media seeked to "+e.toFixed(3));var r=this.getMainFwdBufferInfo();null!==r&&0!==r.len?this.tick():this.warn('Main forward buffer length on "seeked" event '+(r?r.len:"empty")+")")},r.onManifestLoading=function(){this.log("Trigger BUFFER_RESET"),this.hls.trigger(S.BUFFER_RESET,void 0),this.fragmentTracker.removeAllFragments(),this.couldBacktrack=!1,this.startPosition=this.lastCurrentTime=0,this.levels=this.fragPlaying=this.backtrackFragment=null,this.altAudio=this.audioOnly=!1},r.onManifestParsed=function(t,e){var r,i,n,a=!1,s=!1;e.levels.forEach((function(t){(r=t.audioCodec)&&(-1!==r.indexOf("mp4a.40.2")&&(a=!0),-1!==r.indexOf("mp4a.40.5")&&(s=!0))})),this.audioCodecSwitch=a&&s&&!("function"==typeof(null==(n=Zr())||null==(i=n.prototype)?void 0:i.changeType)),this.audioCodecSwitch&&this.log("Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=e.levels,this.startFragRequested=!1},r.onLevelLoading=function(t,e){var r=this.levels;if(r&&this.state===Kr){var i=r[e.level];(!i.details||i.details.live&&this.levelLastLoaded!==e.level||this.waitForCdnTuneIn(i.details))&&(this.state=$r)}},r.onLevelLoaded=function(t,e){var r,i=this.levels,n=e.level,a=e.details,s=a.totalduration;if(i){this.log("Level "+n+" loaded ["+a.startSN+","+a.endSN+"]"+(a.lastPartSn?"[part-"+a.lastPartSn+"-"+a.lastPartIndex+"]":"")+", cc ["+a.startCC+", "+a.endCC+"] duration:"+s);var o=i[n],l=this.fragCurrent;!l||this.state!==Vr&&this.state!==Yr||l.level===e.level&&l.urlId===o.urlId||!l.loader||this.abortCurrentFrag();var u=0;if(a.live||null!=(r=o.details)&&r.live){if(this.checkLiveUpdate(a),a.deltaUpdateFailed)return;u=this.alignPlaylists(a,o.details)}if(o.details=a,this.levelLastLoaded=n,this.hls.trigger(S.LEVEL_UPDATED,{details:a,level:n}),this.state===$r){if(this.waitForCdnTuneIn(a))return;this.state=Kr}this.startFragRequested?a.live&&this.synchronizeToLiveEdge(a):this.setStartPosition(a,u),this.tick()}else this.warn("Levels were reset while loading level "+n)},r._handleFragmentLoadProgress=function(t){var e,r=t.frag,i=t.part,n=t.payload,a=this.levels;if(a){var s=a[r.level],o=s.details;if(!o)return this.warn("Dropping fragment "+r.sn+" of level "+r.level+" after level details were reset"),void this.fragmentTracker.removeFragment(r);var l=s.videoCodec,u=o.PTSKnown||!o.live,h=null==(e=r.initSegment)?void 0:e.data,d=this._getAudioCodec(s),c=this.transmuxer=this.transmuxer||new hn(this.hls,ge,this._handleTransmuxComplete.bind(this),this._handleTransmuxerFlush.bind(this)),f=i?i.index:-1,g=-1!==f,v=new wr(r.level,r.sn,r.stats.chunkCount,n.byteLength,f,g),m=this.initPTS[r.cc];c.push(n,h,d,l,r,i,o.totalduration,u,v,m)}else this.warn("Levels were reset while fragment load was in progress. Fragment "+r.sn+" of level "+r.level+" will not be buffered")},r.onAudioTrackSwitching=function(t,e){var r=this.altAudio;if(!e.url){if(this.mediaBuffer!==this.media){this.log("Switching on main audio, use media.buffered to schedule main fragment loading"),this.mediaBuffer=this.media;var i=this.fragCurrent;i&&(this.log("Switching to main audio track, cancel main fragment load"),i.abortRequests(),this.fragmentTracker.removeFragment(i)),this.resetTransmuxer(),this.resetLoadingState()}else this.audioOnly&&this.resetTransmuxer();var n=this.hls;r&&(n.trigger(S.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY,type:null}),this.fragmentTracker.removeAllFragments()),n.trigger(S.AUDIO_TRACK_SWITCHED,e)}},r.onAudioTrackSwitched=function(t,e){var r=e.id,i=!!this.hls.audioTracks[r].url;if(i){var n=this.videoBuffer;n&&this.mediaBuffer!==n&&(this.log("Switching on alternate audio, use video.buffered to schedule main fragment loading"),this.mediaBuffer=n)}this.altAudio=i,this.tick()},r.onBufferCreated=function(t,e){var r,i,n=e.tracks,a=!1;for(var s in n){var o=n[s];if("main"===o.id){if(i=s,r=o,"video"===s){var l=n[s];l&&(this.videoBuffer=l.buffer)}}else a=!0}a&&r?(this.log("Alternate track found, use "+i+".buffered to schedule main fragment loading"),this.mediaBuffer=r.buffer):this.mediaBuffer=this.media},r.onFragBuffered=function(t,e){var r=e.frag,i=e.part;if(!r||r.type===ge){if(this.fragContextChanged(r))return this.warn("Fragment "+r.sn+(i?" p: "+i.index:"")+" of level "+r.level+" finished buffering, but was aborted. state: "+this.state),void(this.state===qr&&(this.state=Kr));var n=i?i.stats:r.stats;this.fragLastKbps=Math.round(8*n.total/(n.buffering.end-n.loading.first)),"initSegment"!==r.sn&&(this.fragPrevious=r),this.fragBufferedComplete(r,i)}},r.onError=function(t,e){var r;if(e.fatal)this.state=zr;else switch(e.details){case R.FRAG_GAP:case R.FRAG_PARSING_ERROR:case R.FRAG_DECRYPT_ERROR:case R.FRAG_LOAD_ERROR:case R.FRAG_LOAD_TIMEOUT:case R.KEY_LOAD_ERROR:case R.KEY_LOAD_TIMEOUT:this.onFragmentOrKeyLoadError(ge,e);break;case R.LEVEL_LOAD_ERROR:case R.LEVEL_LOAD_TIMEOUT:case R.LEVEL_PARSING_ERROR:e.levelRetry||this.state!==$r||(null==(r=e.context)?void 0:r.type)!==de||(this.state=Kr);break;case R.BUFFER_FULL_ERROR:if(!e.parent||"main"!==e.parent)return;this.reduceLengthAndFlushBuffer(e)&&this.flushMainBuffer(0,Number.POSITIVE_INFINITY);break;case R.INTERNAL_EXCEPTION:this.recoverWorkerError(e)}},r.checkBuffer=function(){var t=this.media,e=this.gapController;if(t&&e&&t.readyState){if(this.loadedmetadata||!Ir.getBuffered(t).length){var r=this.state!==Kr?this.fragCurrent:null;e.poll(this.lastCurrentTime,r)}this.lastCurrentTime=t.currentTime}},r.onFragLoadEmergencyAborted=function(){this.state=Kr,this.loadedmetadata||(this.startFragRequested=!1,this.nextLoadPosition=this.startPosition),this.tickImmediate()},r.onBufferFlushed=function(t,e){var r=e.type;if(r!==O||this.audioOnly&&!this.altAudio){var i=(r===N?this.videoBuffer:this.mediaBuffer)||this.media;this.afterBufferFlushed(i,r,ge)}},r.onLevelsUpdated=function(t,e){this.levels=e.levels},r.swapAudioCodec=function(){this.audioCodecSwap=!this.audioCodecSwap},r.seekToStartPos=function(){var t=this.media;if(t){var e=t.currentTime,r=this.startPosition;if(r>=0&&e0&&(nT.cc;if(!1!==n.independent){var A=h.startPTS,k=h.endPTS,b=h.startDTS,D=h.endDTS;if(l)l.elementaryStreams[h.type]={startPTS:A,endPTS:k,startDTS:b,endDTS:D};else if(h.firstKeyFrame&&h.independent&&1===a.id&&!R&&(this.couldBacktrack=!0),h.dropped&&h.independent){var I=this.getMainFwdBufferInfo(),w=(I?I.end:this.getLoadPosition())+this.config.maxBufferHole,C=h.firstKeyFramePTS?h.firstKeyFramePTS:A;if(!L&&w1&&!1===t.seeking){var r=t.currentTime;if(Ir.isBuffered(t,r)?e=this.getAppendedFrag(r):Ir.isBuffered(t,r+.1)&&(e=this.getAppendedFrag(r+.1)),e){this.backtrackFragment=null;var i=this.fragPlaying,n=e.level;i&&e.sn===i.sn&&i.level===n&&e.urlId===i.urlId||(this.fragPlaying=e,this.hls.trigger(S.FRAG_CHANGED,{frag:e}),i&&i.level===n||this.hls.trigger(S.LEVEL_SWITCHED,{level:n}))}}},a(e,[{key:"nextLevel",get:function(){var t=this.nextBufferedFrag;return t?t.level:-1}},{key:"currentFrag",get:function(){var t=this.media;return t?this.fragPlaying||this.getAppendedFrag(t.currentTime):null}},{key:"currentProgramDateTime",get:function(){var t=this.media;if(t){var e=t.currentTime,r=this.currentFrag;if(r&&E(e)&&E(r.programDateTime)){var i=r.programDateTime+1e3*(e-r.start);return new Date(i)}}return null}},{key:"currentLevel",get:function(){var t=this.currentFrag;return t?t.level:-1}},{key:"nextBufferedFrag",get:function(){var t=this.currentFrag;return t?this.followingBufferedFrag(t):null}},{key:"forceStartLoad",get:function(){return this._forceStartLoad}}]),e}(Jr),fn=function(){function t(t,e,r){void 0===e&&(e=0),void 0===r&&(r=0),this.halfLife=void 0,this.alpha_=void 0,this.estimate_=void 0,this.totalWeight_=void 0,this.halfLife=t,this.alpha_=t?Math.exp(Math.log(.5)/t):0,this.estimate_=e,this.totalWeight_=r}var e=t.prototype;return e.sample=function(t,e){var r=Math.pow(this.alpha_,t);this.estimate_=e*(1-r)+r*this.estimate_,this.totalWeight_+=t},e.getTotalWeight=function(){return this.totalWeight_},e.getEstimate=function(){if(this.alpha_){var t=1-Math.pow(this.alpha_,this.totalWeight_);if(t)return this.estimate_/t}return this.estimate_},t}(),gn=function(){function t(t,e,r,i){void 0===i&&(i=100),this.defaultEstimate_=void 0,this.minWeight_=void 0,this.minDelayMs_=void 0,this.slow_=void 0,this.fast_=void 0,this.defaultTTFB_=void 0,this.ttfb_=void 0,this.defaultEstimate_=r,this.minWeight_=.001,this.minDelayMs_=50,this.slow_=new fn(t),this.fast_=new fn(e),this.defaultTTFB_=i,this.ttfb_=new fn(t)}var e=t.prototype;return e.update=function(t,e){var r=this.slow_,i=this.fast_,n=this.ttfb_;r.halfLife!==t&&(this.slow_=new fn(t,r.getEstimate(),r.getTotalWeight())),i.halfLife!==e&&(this.fast_=new fn(e,i.getEstimate(),i.getTotalWeight())),n.halfLife!==t&&(this.ttfb_=new fn(t,n.getEstimate(),n.getTotalWeight()))},e.sample=function(t,e){var r=(t=Math.max(t,this.minDelayMs_))/1e3,i=8*e/r;this.fast_.sample(r,i),this.slow_.sample(r,i)},e.sampleTTFB=function(t){var e=t/1e3,r=Math.sqrt(2)*Math.exp(-Math.pow(e,2)/2);this.ttfb_.sample(r,Math.max(t,5))},e.canEstimate=function(){return this.fast_.getTotalWeight()>=this.minWeight_},e.getEstimate=function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_},e.getEstimateTTFB=function(){return this.ttfb_.getTotalWeight()>=this.minWeight_?this.ttfb_.getEstimate():this.defaultTTFB_},e.destroy=function(){},t}(),vn=function(){function t(t){this.hls=void 0,this.lastLevelLoadSec=0,this.lastLoadedFragLevel=0,this._nextAutoLevel=-1,this.timer=-1,this.onCheck=this._abandonRulesCheck.bind(this),this.fragCurrent=null,this.partCurrent=null,this.bitrateTestDelay=0,this.bwEstimator=void 0,this.hls=t;var e=t.config;this.bwEstimator=new gn(e.abrEwmaSlowVoD,e.abrEwmaFastVoD,e.abrEwmaDefaultEstimate),this.registerListeners()}var e=t.prototype;return e.registerListeners=function(){var t=this.hls;t.on(S.FRAG_LOADING,this.onFragLoading,this),t.on(S.FRAG_LOADED,this.onFragLoaded,this),t.on(S.FRAG_BUFFERED,this.onFragBuffered,this),t.on(S.LEVEL_SWITCHING,this.onLevelSwitching,this),t.on(S.LEVEL_LOADED,this.onLevelLoaded,this)},e.unregisterListeners=function(){var t=this.hls;t.off(S.FRAG_LOADING,this.onFragLoading,this),t.off(S.FRAG_LOADED,this.onFragLoaded,this),t.off(S.FRAG_BUFFERED,this.onFragBuffered,this),t.off(S.LEVEL_SWITCHING,this.onLevelSwitching,this),t.off(S.LEVEL_LOADED,this.onLevelLoaded,this)},e.destroy=function(){this.unregisterListeners(),this.clearTimer(),this.hls=this.onCheck=null,this.fragCurrent=this.partCurrent=null},e.onFragLoading=function(t,e){var r,i=e.frag;this.ignoreFragment(i)||(this.fragCurrent=i,this.partCurrent=null!=(r=e.part)?r:null,this.clearTimer(),this.timer=self.setInterval(this.onCheck,100))},e.onLevelSwitching=function(t,e){this.clearTimer()},e.getTimeToLoadFrag=function(t,e,r,i){return t+r/e+(i?this.lastLevelLoadSec:0)},e.onLevelLoaded=function(t,e){var r=this.hls.config,i=e.stats,n=i.total,a=i.bwEstimate;E(n)&&E(a)&&(this.lastLevelLoadSec=8*n/a),e.details.live?this.bwEstimator.update(r.abrEwmaSlowLive,r.abrEwmaFastLive):this.bwEstimator.update(r.abrEwmaSlowVoD,r.abrEwmaFastVoD)},e._abandonRulesCheck=function(){var t=this.fragCurrent,e=this.partCurrent,r=this.hls,i=r.autoLevelEnabled,n=r.media;if(t&&n){var a=performance.now(),s=e?e.stats:t.stats,o=e?e.duration:t.duration,l=a-s.loading.start;if(s.aborted||s.loaded&&s.loaded===s.total||0===t.level)return this.clearTimer(),void(this._nextAutoLevel=-1);if(i&&!n.paused&&n.playbackRate&&n.readyState){var u=r.mainForwardBufferInfo;if(null!==u){var h=this.bwEstimator.getEstimateTTFB(),d=Math.abs(n.playbackRate);if(!(l<=Math.max(h,o/(2*d)*1e3))){var c=u.len/d;if(!(c>=2*o/d)){var f=s.loading.first?s.loading.first-s.loading.start:-1,g=s.loaded&&f>-1,v=this.bwEstimator.getEstimate(),m=r.levels,p=r.minAutoLevel,y=m[t.level],T=s.total||Math.max(s.loaded,Math.round(o*y.maxBitrate/8)),L=l-f;L<1&&g&&(L=Math.min(l,8*s.loaded/v));var R=g?1e3*s.loaded/L:0,A=R?(T-s.loaded)/R:8*T/v+h/1e3;if(!(A<=c)){var k,b=R?8*R:v,D=Number.POSITIVE_INFINITY;for(k=t.level-1;k>p;k--){var I=m[k].maxBitrate;if((D=this.getTimeToLoadFrag(h/1e3,b,o*I,!m[k].details))=A||D>10*o||(r.nextLoadLevel=k,g?this.bwEstimator.sample(l-Math.min(h,f),s.loaded):this.bwEstimator.sampleTTFB(l),this.clearTimer(),w.warn("[abr] Fragment "+t.sn+(e?" part "+e.index:"")+" of level "+t.level+" is loading too slowly;\n Time to underbuffer: "+c.toFixed(3)+" s\n Estimated load time for current fragment: "+A.toFixed(3)+" s\n Estimated load time for down switch fragment: "+D.toFixed(3)+" s\n TTFB estimate: "+f+"\n Current BW estimate: "+(E(v)?(v/1024).toFixed(3):"Unknown")+" Kb/s\n New BW estimate: "+(this.bwEstimator.getEstimate()/1024).toFixed(3)+" Kb/s\n Aborting and switching to level "+k),t.loader&&(this.fragCurrent=this.partCurrent=null,t.abortRequests()),r.trigger(S.FRAG_LOAD_EMERGENCY_ABORTED,{frag:t,part:e,stats:s}))}}}}}}},e.onFragLoaded=function(t,e){var r=e.frag,i=e.part,n=i?i.stats:r.stats;if(r.type===ge&&this.bwEstimator.sampleTTFB(n.loading.first-n.loading.start),!this.ignoreFragment(r)){if(this.clearTimer(),this.lastLoadedFragLevel=r.level,this._nextAutoLevel=-1,this.hls.config.abrMaxWithRealBitrate){var a=i?i.duration:r.duration,s=this.hls.levels[r.level],o=(s.loaded?s.loaded.bytes:0)+n.loaded,l=(s.loaded?s.loaded.duration:0)+a;s.loaded={bytes:o,duration:l},s.realBitrate=Math.round(8*o/l)}if(r.bitrateTest){var u={stats:n,frag:r,part:i,id:r.type};this.onFragBuffered(S.FRAG_BUFFERED,u),r.bitrateTest=!1}}},e.onFragBuffered=function(t,e){var r=e.frag,i=e.part,n=null!=i&&i.stats.loaded?i.stats:r.stats;if(!n.aborted&&!this.ignoreFragment(r)){var a=n.parsing.end-n.loading.start-Math.min(n.loading.first-n.loading.start,this.bwEstimator.getEstimateTTFB());this.bwEstimator.sample(a,n.loaded),n.bwEstimate=this.bwEstimator.getEstimate(),r.bitrateTest?this.bitrateTestDelay=a/1e3:this.bitrateTestDelay=0}},e.ignoreFragment=function(t){return t.type!==ge||"initSegment"===t.sn},e.clearTimer=function(){self.clearInterval(this.timer)},e.getNextABRAutoLevel=function(){var t=this.fragCurrent,e=this.partCurrent,r=this.hls,i=r.maxAutoLevel,n=r.config,a=r.minAutoLevel,s=r.media,o=e?e.duration:t?t.duration:0,l=s&&0!==s.playbackRate?Math.abs(s.playbackRate):1,u=this.bwEstimator?this.bwEstimator.getEstimate():n.abrEwmaDefaultEstimate,h=r.mainForwardBufferInfo,d=(h?h.len:0)/l,c=this.findBestLevel(u,a,i,d,n.abrBandWidthFactor,n.abrBandWidthUpFactor);if(c>=0)return c;w.trace("[abr] "+(d?"rebuffering expected":"buffer is empty")+", finding optimal quality level");var f=o?Math.min(o,n.maxStarvationDelay):n.maxStarvationDelay,g=n.abrBandWidthFactor,v=n.abrBandWidthUpFactor;if(!d){var m=this.bitrateTestDelay;m&&(f=(o?Math.min(o,n.maxLoadingDelay):n.maxLoadingDelay)-m,w.trace("[abr] bitrate test took "+Math.round(1e3*m)+"ms, set first fragment max fetchDuration to "+Math.round(1e3*f)+" ms"),g=v=1)}return c=this.findBestLevel(u,a,i,d+f,g,v),Math.max(c,0)},e.findBestLevel=function(t,e,r,i,n,a){for(var s,o=this.fragCurrent,l=this.partCurrent,u=this.lastLoadedFragLevel,h=this.hls.levels,d=h[u],c=!(null==d||null==(s=d.details)||!s.live),f=null==d?void 0:d.codecSet,g=l?l.duration:o?o.duration:0,v=this.bwEstimator.getEstimateTTFB()/1e3,m=e,p=-1,y=r;y>=e;y--){var T=h[y];if(!T||f&&T.codecSet!==f)T&&(m=Math.min(y,m),p=Math.max(y,p));else{-1!==p&&w.trace("[abr] Skipped level(s) "+m+"-"+p+' with CODECS:"'+h[p].attrs.CODECS+'"; not compatible with "'+d.attrs.CODECS+'"');var S=T.details,L=(l?null==S?void 0:S.partTarget:null==S?void 0:S.averagetargetduration)||g,R=void 0;R=y<=u?n*t:a*t;var A=h[y].maxBitrate,k=this.getTimeToLoadFrag(v,R,A*L,void 0===S);if(w.trace("[abr] level:"+y+" adjustedbw-bitrate:"+Math.round(R-A)+" avgDuration:"+L.toFixed(1)+" maxFetchDuration:"+i.toFixed(1)+" fetchDuration:"+k.toFixed(1)),R>A&&(0===k||!E(k)||c&&!this.bitrateTestDelay||kMath.max(t,r)&&i[t].loadError<=i[r].loadError)return t}return-1!==t&&(r=Math.min(t,r)),r},set:function(t){this._nextAutoLevel=t}}]),t}(),mn=function(){function t(){this.chunks=[],this.dataLength=0}var e=t.prototype;return e.push=function(t){this.chunks.push(t),this.dataLength+=t.length},e.flush=function(){var t,e=this.chunks,r=this.dataLength;return e.length?(t=1===e.length?e[0]:function(t,e){for(var r=new Uint8Array(e),i=0,n=0;n0&&-1===t?(this.log("Override startPosition with lastCurrentTime @"+e.toFixed(3)),t=e,this.state=Kr):(this.loadedmetadata=!1,this.state=Wr),this.nextLoadPosition=this.startPosition=this.lastCurrentTime=t,this.tick()},r.doTick=function(){switch(this.state){case Kr:this.doTickIdle();break;case Wr:var e,r=this.levels,i=this.trackId,n=null==r||null==(e=r[i])?void 0:e.details;if(n){if(this.waitForCdnTuneIn(n))break;this.state=Qr}break;case Yr:var a,s=performance.now(),o=this.retryDate;(!o||s>=o||null!=(a=this.media)&&a.seeking)&&(this.log("RetryDate reached, switch back to IDLE state"),this.resetStartWhenNotLoaded(this.trackId),this.state=Kr);break;case Qr:var l=this.waitingData;if(l){var u=l.frag,h=l.part,d=l.cache,c=l.complete;if(void 0!==this.initPTS[u.cc]){this.waitingData=null,this.waitingVideoCC=-1,this.state=Vr;var f={frag:u,part:h,payload:d.flush(),networkDetails:null};this._handleFragmentLoadProgress(f),c&&t.prototype._handleFragmentLoadComplete.call(this,f)}else if(this.videoTrackCC!==this.waitingVideoCC)this.log("Waiting fragment cc ("+u.cc+") cancelled because video is at cc "+this.videoTrackCC),this.clearWaitingFragment();else{var g=this.getLoadPosition(),v=Ir.bufferInfo(this.mediaBuffer,g,this.config.maxBufferHole);Je(v.end,this.config.maxFragLookUpTolerance,u)<0&&(this.log("Waiting fragment cc ("+u.cc+") @ "+u.start+" cancelled because another fragment at "+v.end+" is needed"),this.clearWaitingFragment())}}else this.state=Kr}this.onTickEnd()},r.clearWaitingFragment=function(){var t=this.waitingData;t&&(this.fragmentTracker.removeFragment(t.frag),this.waitingData=null,this.waitingVideoCC=-1,this.state=Kr)},r.resetLoadingState=function(){this.clearWaitingFragment(),t.prototype.resetLoadingState.call(this)},r.onTickEnd=function(){var t=this.media;null!=t&&t.readyState&&(this.lastCurrentTime=t.currentTime)},r.doTickIdle=function(){var t=this.hls,e=this.levels,r=this.media,i=this.trackId,n=t.config;if(null!=e&&e[i]&&(r||!this.startFragRequested&&n.startFragPrefetch)){var a=e[i],s=a.details;if(!s||s.live&&this.levelLastLoaded!==i||this.waitForCdnTuneIn(s))this.state=Wr;else{var o=this.mediaBuffer?this.mediaBuffer:this.media;this.bufferFlushed&&o&&(this.bufferFlushed=!1,this.afterBufferFlushed(o,O,ve));var l=this.getFwdBufferInfo(o,ve);if(null!==l){var u=this.bufferedTrack,h=this.switchingTrack;if(!h&&this._streamEnded(l,s))return t.trigger(S.BUFFER_EOS,{type:"audio"}),void(this.state=Xr);var d=this.getFwdBufferInfo(this.videoBuffer?this.videoBuffer:this.media,ge),c=l.len,f=this.getMaxBufferLength(null==d?void 0:d.len);if(!(c>=f)||h){var g=s.fragments[0].start,v=l.end;if(h&&r){var m=this.getLoadPosition();u&&h.attrs!==u.attrs&&(v=m),s.PTSKnown&&mg||l.nextStart)&&(this.log("Alt audio track ahead of main track, seek to start of alt audio track"),r.currentTime=g+.05)}var p=this.getNextFragment(v,s),y=!1;if(p&&this.isLoopLoading(p,v)&&(y=!!p.gap,p=this.getNextFragmentLoopLoading(p,s,l,ge,f)),p){var T=d&&p.start>d.end+s.targetduration;if(T||(null==d||!d.len)&&l.len){var E=this.getAppendedFrag(p.start,ge);if(null===E)return;if(y||(y=!!E.gap||!!T&&0===d.len),T&&!y||y&&l.nextStart&&l.nextStart=e.length)this.warn("Invalid id passed to audio-track controller");else{this.clearTimer();var r=this.currentTrack;e[this.trackId];var n=e[t],a=n.groupId,s=n.name;if(this.log("Switching to audio-track "+t+' "'+s+'" lang:'+n.lang+" group:"+a),this.trackId=t,this.currentTrack=n,this.selectDefaultTrack=!1,this.hls.trigger(S.AUDIO_TRACK_SWITCHING,i({},n)),!n.details||n.details.live){var o=this.switchParams(n.url,null==r?void 0:r.details);this.loadPlaylist(o)}}},r.selectInitialTrack=function(){var t=this.tracksInGroup,e=this.findTrackId(this.currentTrack)|this.findTrackId(null);if(-1!==e)this.setAudioTrack(e);else{var r=new Error("No track found for running audio group-ID: "+this.groupId+" track count: "+t.length);this.warn(r.message),this.hls.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.AUDIO_TRACK_LOAD_ERROR,fatal:!0,error:r})}},r.findTrackId=function(t){for(var e=this.tracksInGroup,r=0;r=n[o].start&&s<=n[o].end){a=n[o];break}var l=r.start+r.duration;a?a.end=l:(a={start:s,end:l},n.push(a)),this.fragmentTracker.fragBuffered(r)}}},r.onBufferFlushing=function(t,e){var r=e.startOffset,i=e.endOffset;if(0===r&&i!==Number.POSITIVE_INFINITY){var n=i-1;if(n<=0)return;e.endOffsetSubtitles=Math.max(0,n),this.tracksBuffered.forEach((function(t){for(var e=0;e=s.length||n!==a)&&o){this.mediaBuffer=this.mediaBufferTimeRanges;var l=0;if(i.live||null!=(r=o.details)&&r.live){var u=this.mainDetails;if(i.deltaUpdateFailed||!u)return;var h=u.fragments[0];o.details?0===(l=this.alignPlaylists(i,o.details))&&h&&He(i,l=h.start):i.hasProgramDateTime&&u.hasProgramDateTime?(Fr(i,u),l=i.fragments[0].start):h&&He(i,l=h.start)}o.details=i,this.levelLastLoaded=n,this.startFragRequested||!this.mainDetails&&i.live||this.setStartPosition(o.details,l),this.tick(),i.live&&!this.fragCurrent&&this.media&&this.state===Kr&&($e(null,i.fragments,this.media.currentTime,0)||(this.warn("Subtitle playlist not aligned with playback"),o.details=void 0))}}},r._handleFragmentLoadComplete=function(t){var e=this,r=t.frag,i=t.payload,n=r.decryptdata,a=this.hls;if(!this.fragContextChanged(r)&&i&&i.byteLength>0&&n&&n.key&&n.iv&&"AES-128"===n.method){var s=performance.now();this.decrypter.decrypt(new Uint8Array(i),n.key.buffer,n.iv.buffer).catch((function(t){throw a.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.FRAG_DECRYPT_ERROR,fatal:!1,error:t,reason:t.message,frag:r}),t})).then((function(t){var e=performance.now();a.trigger(S.FRAG_DECRYPTED,{frag:r,payload:t,stats:{tstart:s,tdecrypt:e}})})).catch((function(t){e.warn(t.name+": "+t.message),e.state=Kr}))}},r.doTick=function(){if(this.media){if(this.state===Kr){var t=this.currentTrackId,e=this.levels,r=e[t];if(!e.length||!r||!r.details)return;var i=this.config,n=this.getLoadPosition(),a=Ir.bufferedInfo(this.tracksBuffered[this.currentTrackId]||[],n,i.maxBufferHole),s=a.end,o=a.len,l=this.getFwdBufferInfo(this.media,ge),u=r.details;if(o>this.getMaxBufferLength(null==l?void 0:l.len)+u.levelTargetDuration)return;var h=u.fragments,d=h.length,c=u.edge,f=null,g=this.fragPrevious;if(sc-v?0:v;!(f=$e(g,h,Math.max(h[0].start,s),m))&&g&&g.start>>=0)>i-1)throw new DOMException("Failed to execute '"+e+"' on 'TimeRanges': The index provided ("+r+") is greater than the maximum bound ("+i+")");return t[r][e]};this.buffered={get length(){return t.length},end:function(r){return e("end",r,t.length)},start:function(r){return e("start",r,t.length)}}},Rn=function(t){function e(e){var r;return(r=t.call(this,e,"[subtitle-track-controller]")||this).media=null,r.tracks=[],r.groupId=null,r.tracksInGroup=[],r.trackId=-1,r.selectDefaultTrack=!0,r.queuedDefaultTrack=-1,r.trackChangeListener=function(){return r.onTextTracksChanged()},r.asyncPollTrackChange=function(){return r.pollTrackChange(0)},r.useTextTrackPolling=!1,r.subtitlePollingInterval=-1,r._subtitleDisplay=!0,r.registerListeners(),r}l(e,t);var r=e.prototype;return r.destroy=function(){this.unregisterListeners(),this.tracks.length=0,this.tracksInGroup.length=0,this.trackChangeListener=this.asyncPollTrackChange=null,t.prototype.destroy.call(this)},r.registerListeners=function(){var t=this.hls;t.on(S.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(S.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(S.MANIFEST_LOADING,this.onManifestLoading,this),t.on(S.MANIFEST_PARSED,this.onManifestParsed,this),t.on(S.LEVEL_LOADING,this.onLevelLoading,this),t.on(S.LEVEL_SWITCHING,this.onLevelSwitching,this),t.on(S.SUBTITLE_TRACK_LOADED,this.onSubtitleTrackLoaded,this),t.on(S.ERROR,this.onError,this)},r.unregisterListeners=function(){var t=this.hls;t.off(S.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(S.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(S.MANIFEST_LOADING,this.onManifestLoading,this),t.off(S.MANIFEST_PARSED,this.onManifestParsed,this),t.off(S.LEVEL_LOADING,this.onLevelLoading,this),t.off(S.LEVEL_SWITCHING,this.onLevelSwitching,this),t.off(S.SUBTITLE_TRACK_LOADED,this.onSubtitleTrackLoaded,this),t.off(S.ERROR,this.onError,this)},r.onMediaAttached=function(t,e){this.media=e.media,this.media&&(this.queuedDefaultTrack>-1&&(this.subtitleTrack=this.queuedDefaultTrack,this.queuedDefaultTrack=-1),this.useTextTrackPolling=!(this.media.textTracks&&"onchange"in this.media.textTracks),this.useTextTrackPolling?this.pollTrackChange(500):this.media.textTracks.addEventListener("change",this.asyncPollTrackChange))},r.pollTrackChange=function(t){self.clearInterval(this.subtitlePollingInterval),this.subtitlePollingInterval=self.setInterval(this.trackChangeListener,t)},r.onMediaDetaching=function(){this.media&&(self.clearInterval(this.subtitlePollingInterval),this.useTextTrackPolling||this.media.textTracks.removeEventListener("change",this.asyncPollTrackChange),this.trackId>-1&&(this.queuedDefaultTrack=this.trackId),An(this.media.textTracks).forEach((function(t){Le(t)})),this.subtitleTrack=-1,this.media=null)},r.onManifestLoading=function(){this.tracks=[],this.groupId=null,this.tracksInGroup=[],this.trackId=-1,this.selectDefaultTrack=!0},r.onManifestParsed=function(t,e){this.tracks=e.subtitleTracks},r.onSubtitleTrackLoaded=function(t,e){var r=e.id,i=e.details,n=this.trackId,a=this.tracksInGroup[n];if(a){var s=a.details;a.details=e.details,this.log("subtitle track "+r+" loaded ["+i.startSN+"-"+i.endSN+"]"),r===this.trackId&&this.playlistLoaded(r,e,s)}else this.warn("Invalid subtitle track id "+r)},r.onLevelLoading=function(t,e){this.switchLevel(e.level)},r.onLevelSwitching=function(t,e){this.switchLevel(e.level)},r.switchLevel=function(t){var e=this.hls.levels[t];if(null!=e&&e.textGroupIds){var r=e.textGroupIds[e.urlId],i=this.tracksInGroup?this.tracksInGroup[this.trackId]:void 0;if(this.groupId!==r){var n=this.tracks.filter((function(t){return!r||t.groupId===r}));this.tracksInGroup=n;var a=this.findTrackId(null==i?void 0:i.name)||this.findTrackId();this.groupId=r||null;var s={subtitleTracks:n};this.log("Updating subtitle tracks, "+n.length+' track(s) found in "'+r+'" group-id'),this.hls.trigger(S.SUBTITLE_TRACKS_UPDATED,s),-1!==a&&this.setSubtitleTrack(a,i)}else this.shouldReloadPlaylist(i)&&this.setSubtitleTrack(this.trackId,i)}},r.findTrackId=function(t){for(var e=this.tracksInGroup,r=0;r=i.length)){this.clearTimer();var n=i[t];if(this.log("Switching to subtitle-track "+t+(n?' "'+n.name+'" lang:'+n.lang+" group:"+n.groupId:"")),this.trackId=t,n){var a=n.id,s=n.groupId,o=void 0===s?"":s,l=n.name,u=n.type,h=n.url;this.hls.trigger(S.SUBTITLE_TRACK_SWITCH,{id:a,groupId:o,name:l,type:u,url:h});var d=this.switchParams(n.url,null==e?void 0:e.details);this.loadPlaylist(d)}else this.hls.trigger(S.SUBTITLE_TRACK_SWITCH,{id:t})}}else this.queuedDefaultTrack=t},r.onTextTracksChanged=function(){if(this.useTextTrackPolling||self.clearInterval(this.subtitlePollingInterval),this.media&&this.hls.config.renderTextTracksNatively){for(var t=-1,e=An(this.media.textTracks),r=0;r-1&&this.toggleTrackModes(this.trackId)}},{key:"subtitleTracks",get:function(){return this.tracksInGroup}},{key:"subtitleTrack",get:function(){return this.trackId},set:function(t){this.selectDefaultTrack=!1;var e=this.tracksInGroup?this.tracksInGroup[this.trackId]:void 0;this.setSubtitleTrack(t,e)}}]),e}(ur);function An(t){for(var e=[],r=0;r "+t.src+")")},this.hls=t,this._initSourceBuffer(),this.registerListeners()}var e=t.prototype;return e.hasSourceTypes=function(){return this.getSourceBufferTypes().length>0||Object.keys(this.pendingTracks).length>0},e.destroy=function(){this.unregisterListeners(),this.details=null,this.lastMpegAudioChunk=null},e.registerListeners=function(){var t=this.hls;t.on(S.MEDIA_ATTACHING,this.onMediaAttaching,this),t.on(S.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(S.MANIFEST_LOADING,this.onManifestLoading,this),t.on(S.MANIFEST_PARSED,this.onManifestParsed,this),t.on(S.BUFFER_RESET,this.onBufferReset,this),t.on(S.BUFFER_APPENDING,this.onBufferAppending,this),t.on(S.BUFFER_CODECS,this.onBufferCodecs,this),t.on(S.BUFFER_EOS,this.onBufferEos,this),t.on(S.BUFFER_FLUSHING,this.onBufferFlushing,this),t.on(S.LEVEL_UPDATED,this.onLevelUpdated,this),t.on(S.FRAG_PARSED,this.onFragParsed,this),t.on(S.FRAG_CHANGED,this.onFragChanged,this)},e.unregisterListeners=function(){var t=this.hls;t.off(S.MEDIA_ATTACHING,this.onMediaAttaching,this),t.off(S.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(S.MANIFEST_LOADING,this.onManifestLoading,this),t.off(S.MANIFEST_PARSED,this.onManifestParsed,this),t.off(S.BUFFER_RESET,this.onBufferReset,this),t.off(S.BUFFER_APPENDING,this.onBufferAppending,this),t.off(S.BUFFER_CODECS,this.onBufferCodecs,this),t.off(S.BUFFER_EOS,this.onBufferEos,this),t.off(S.BUFFER_FLUSHING,this.onBufferFlushing,this),t.off(S.LEVEL_UPDATED,this.onLevelUpdated,this),t.off(S.FRAG_PARSED,this.onFragParsed,this),t.off(S.FRAG_CHANGED,this.onFragChanged,this)},e._initSourceBuffer=function(){this.sourceBuffer={},this.operationQueue=new kn(this.sourceBuffer),this.listeners={audio:[],video:[],audiovideo:[]},this.lastMpegAudioChunk=null},e.onManifestLoading=function(){this.bufferCodecEventsExpected=this._bufferCodecEventsTotal=0,this.details=null},e.onManifestParsed=function(t,e){var r=2;(e.audio&&!e.video||!e.altAudio)&&(r=1),this.bufferCodecEventsExpected=this._bufferCodecEventsTotal=r,w.log(this.bufferCodecEventsExpected+" bufferCodec event(s) expected")},e.onMediaAttaching=function(t,e){var r=this.media=e.media;if(r&&bn){var i=this.mediaSource=new bn;i.addEventListener("sourceopen",this._onMediaSourceOpen),i.addEventListener("sourceended",this._onMediaSourceEnded),i.addEventListener("sourceclose",this._onMediaSourceClose),r.src=self.URL.createObjectURL(i),this._objectUrl=r.src,r.addEventListener("emptied",this._onMediaEmptied)}},e.onMediaDetaching=function(){var t=this.media,e=this.mediaSource,r=this._objectUrl;if(e){if(w.log("[buffer-controller]: media source detaching"),"open"===e.readyState)try{e.endOfStream()}catch(t){w.warn("[buffer-controller]: onMediaDetaching: "+t.message+" while calling endOfStream")}this.onBufferReset(),e.removeEventListener("sourceopen",this._onMediaSourceOpen),e.removeEventListener("sourceended",this._onMediaSourceEnded),e.removeEventListener("sourceclose",this._onMediaSourceClose),t&&(t.removeEventListener("emptied",this._onMediaEmptied),r&&self.URL.revokeObjectURL(r),t.src===r?(t.removeAttribute("src"),t.load()):w.warn("[buffer-controller]: media.src was changed by a third party - skip cleanup")),this.mediaSource=null,this.media=null,this._objectUrl=null,this.bufferCodecEventsExpected=this._bufferCodecEventsTotal,this.pendingTracks={},this.tracks={}}this.hls.trigger(S.MEDIA_DETACHED,void 0)},e.onBufferReset=function(){var t=this;this.getSourceBufferTypes().forEach((function(e){var r=t.sourceBuffer[e];try{r&&(t.removeBufferListeners(e),t.mediaSource&&t.mediaSource.removeSourceBuffer(r),t.sourceBuffer[e]=void 0)}catch(t){w.warn("[buffer-controller]: Failed to reset the "+e+" buffer",t)}})),this._initSourceBuffer()},e.onBufferCodecs=function(t,e){var r=this,i=this.getSourceBufferTypes().length;Object.keys(e).forEach((function(t){if(i){var n=r.tracks[t];if(n&&"function"==typeof n.buffer.changeType){var a=e[t],s=a.id,o=a.codec,l=a.levelCodec,u=a.container,h=a.metadata,d=(n.levelCodec||n.codec).replace(Dn,"$1"),c=(l||o).replace(Dn,"$1");if(d!==c){var f=u+";codecs="+(l||o);r.appendChangeType(t,f),w.log("[buffer-controller]: switching codec "+d+" to "+c),r.tracks[t]={buffer:n.buffer,codec:o,container:u,levelCodec:l,metadata:h,id:s}}}}else r.pendingTracks[t]=e[t]})),i||(this.bufferCodecEventsExpected=Math.max(this.bufferCodecEventsExpected-1,0),this.mediaSource&&"open"===this.mediaSource.readyState&&this.checkPendingTracks())},e.appendChangeType=function(t,e){var r=this,i=this.operationQueue,n={execute:function(){var n=r.sourceBuffer[t];n&&(w.log("[buffer-controller]: changing "+t+" sourceBuffer type to "+e),n.changeType(e)),i.shiftAndExecuteNext(t)},onStart:function(){},onComplete:function(){},onError:function(e){w.warn("[buffer-controller]: Failed to change "+t+" SourceBuffer type",e)}};i.append(n,t)},e.onBufferAppending=function(t,e){var r=this,i=this.hls,n=this.operationQueue,a=this.tracks,s=e.data,o=e.type,l=e.frag,u=e.part,h=e.chunkMeta,d=h.buffering[o],c=self.performance.now();d.start=c;var f=l.stats.buffering,g=u?u.stats.buffering:null;0===f.start&&(f.start=c),g&&0===g.start&&(g.start=c);var v=a.audio,m=!1;"audio"===o&&"audio/mpeg"===(null==v?void 0:v.container)&&(m=!this.lastMpegAudioChunk||1===h.id||this.lastMpegAudioChunk.sn!==h.sn,this.lastMpegAudioChunk=h);var p=l.start,y={execute:function(){if(d.executeStart=self.performance.now(),m){var t=r.sourceBuffer[o];if(t){var e=p-t.timestampOffset;Math.abs(e)>=.1&&(w.log("[buffer-controller]: Updating audio SourceBuffer timestampOffset to "+p+" (delta: "+e+") sn: "+l.sn+")"),t.timestampOffset=p)}}r.appendExecutor(s,o)},onStart:function(){},onComplete:function(){var t=self.performance.now();d.executeEnd=d.end=t,0===f.first&&(f.first=t),g&&0===g.first&&(g.first=t);var e=r.sourceBuffer,i={};for(var n in e)i[n]=Ir.getBuffered(e[n]);r.appendError=0,r.hls.trigger(S.BUFFER_APPENDED,{type:o,frag:l,part:u,chunkMeta:h,parent:l.type,timeRanges:i})},onError:function(t){w.error("[buffer-controller]: Error encountered while trying to append to the "+o+" SourceBuffer",t);var e={type:L.MEDIA_ERROR,parent:l.type,details:R.BUFFER_APPEND_ERROR,frag:l,part:u,chunkMeta:h,error:t,err:t,fatal:!1};t.code===DOMException.QUOTA_EXCEEDED_ERR?e.details=R.BUFFER_FULL_ERROR:(r.appendError++,e.details=R.BUFFER_APPEND_ERROR,r.appendError>i.config.appendErrorMaxRetry&&(w.error("[buffer-controller]: Failed "+i.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),e.fatal=!0)),i.trigger(S.ERROR,e)}};n.append(y,o)},e.onBufferFlushing=function(t,e){var r=this,i=this.operationQueue,n=function(t){return{execute:r.removeExecutor.bind(r,t,e.startOffset,e.endOffset),onStart:function(){},onComplete:function(){r.hls.trigger(S.BUFFER_FLUSHED,{type:t})},onError:function(e){w.warn("[buffer-controller]: Failed to remove from "+t+" SourceBuffer",e)}}};e.type?i.append(n(e.type),e.type):this.getSourceBufferTypes().forEach((function(t){i.append(n(t),t)}))},e.onFragParsed=function(t,e){var r=this,i=e.frag,n=e.part,a=[],s=n?n.elementaryStreams:i.elementaryStreams;s[U]?a.push("audiovideo"):(s[O]&&a.push("audio"),s[N]&&a.push("video")),0===a.length&&w.warn("Fragments must have at least one ElementaryStreamType set. type: "+i.type+" level: "+i.level+" sn: "+i.sn),this.blockBuffers((function(){var t=self.performance.now();i.stats.buffering.end=t,n&&(n.stats.buffering.end=t);var e=n?n.stats:i.stats;r.hls.trigger(S.FRAG_BUFFERED,{frag:i,part:n,stats:e,id:i.type})}),a)},e.onFragChanged=function(t,e){this.flushBackBuffer()},e.onBufferEos=function(t,e){var r=this;this.getSourceBufferTypes().reduce((function(t,i){var n=r.sourceBuffer[i];return!n||e.type&&e.type!==i||(n.ending=!0,n.ended||(n.ended=!0,w.log("[buffer-controller]: "+i+" sourceBuffer now EOS"))),t&&!(n&&!n.ended)}),!0)&&(w.log("[buffer-controller]: Queueing mediaSource.endOfStream()"),this.blockBuffers((function(){r.getSourceBufferTypes().forEach((function(t){var e=r.sourceBuffer[t];e&&(e.ending=!1)}));var t=r.mediaSource;t&&"open"===t.readyState?(w.log("[buffer-controller]: Calling mediaSource.endOfStream()"),t.endOfStream()):t&&w.info("[buffer-controller]: Could not call mediaSource.endOfStream(). mediaSource.readyState: "+t.readyState)})))},e.onLevelUpdated=function(t,e){var r=e.details;r.fragments.length&&(this.details=r,this.getSourceBufferTypes().length?this.blockBuffers(this.updateMediaElementDuration.bind(this)):this.updateMediaElementDuration())},e.flushBackBuffer=function(){var t=this.hls,e=this.details,r=this.media,i=this.sourceBuffer;if(r&&null!==e){var n=this.getSourceBufferTypes();if(n.length){var a=e.live&&null!==t.config.liveBackBufferLength?t.config.liveBackBufferLength:t.config.backBufferLength;if(E(a)&&!(a<0)){var s=r.currentTime,o=e.levelTargetDuration,l=Math.max(a,o),u=Math.floor(s/o)*o-l;n.forEach((function(r){var n=i[r];if(n){var a=Ir.getBuffered(n);if(a.length>0&&u>a.start(0)){if(t.trigger(S.BACK_BUFFER_REACHED,{bufferEnd:u}),e.live)t.trigger(S.LIVE_BACK_BUFFER_REACHED,{bufferEnd:u});else if(n.ended&&a.end(a.length-1)-s<2*o)return void w.info("[buffer-controller]: Cannot flush "+r+" back buffer while SourceBuffer is in ended state");t.trigger(S.BUFFER_FLUSHING,{startOffset:0,endOffset:u,type:r})}}}))}}}},e.updateMediaElementDuration=function(){if(this.details&&this.media&&this.mediaSource&&"open"===this.mediaSource.readyState){var t=this.details,e=this.hls,r=this.media,i=this.mediaSource,n=t.fragments[0].start+t.totalduration,a=r.duration,s=E(i.duration)?i.duration:0;t.live&&e.config.liveDurationInfinity?(w.log("[buffer-controller]: Media Source duration is set to Infinity"),i.duration=1/0,this.updateSeekableRange(t)):(n>s&&n>a||!E(a))&&(w.log("[buffer-controller]: Updating Media Source duration to "+n.toFixed(3)),i.duration=n)}},e.updateSeekableRange=function(t){var e=this.mediaSource,r=t.fragments;if(r.length&&t.live&&null!=e&&e.setLiveSeekableRange){var i=Math.max(0,r[0].start),n=Math.max(i,i+t.totalduration);e.setLiveSeekableRange(i,n)}},e.checkPendingTracks=function(){var t=this.bufferCodecEventsExpected,e=this.operationQueue,r=this.pendingTracks,i=Object.keys(r).length;if(i&&!t||2===i){this.createSourceBuffers(r),this.pendingTracks={};var n=this.getSourceBufferTypes();if(n.length)this.hls.trigger(S.BUFFER_CREATED,{tracks:this.tracks}),n.forEach((function(t){e.executeNext(t)}));else{var a=new Error("could not create source buffer for media codec(s)");this.hls.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.BUFFER_INCOMPATIBLE_CODECS_ERROR,fatal:!0,error:a,reason:a.message})}}},e.createSourceBuffers=function(t){var e=this.sourceBuffer,r=this.mediaSource;if(!r)throw Error("createSourceBuffers called when mediaSource was null");for(var i in t)if(!e[i]){var n=t[i];if(!n)throw Error("source buffer exists for track "+i+", however track does not");var a=n.levelCodec||n.codec,s=n.container+";codecs="+a;w.log("[buffer-controller]: creating sourceBuffer("+s+")");try{var o=e[i]=r.addSourceBuffer(s),l=i;this.addBufferListener(l,"updatestart",this._onSBUpdateStart),this.addBufferListener(l,"updateend",this._onSBUpdateEnd),this.addBufferListener(l,"error",this._onSBUpdateError),this.tracks[i]={buffer:o,codec:a,container:n.container,levelCodec:n.levelCodec,metadata:n.metadata,id:n.id}}catch(t){w.error("[buffer-controller]: error while trying to add sourceBuffer: "+t.message),this.hls.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.BUFFER_ADD_CODEC_ERROR,fatal:!1,error:t,mimeType:s})}}},e._onSBUpdateStart=function(t){this.operationQueue.current(t).onStart()},e._onSBUpdateEnd=function(t){var e=this.operationQueue;e.current(t).onComplete(),e.shiftAndExecuteNext(t)},e._onSBUpdateError=function(t,e){var r=new Error(t+" SourceBuffer error");w.error("[buffer-controller]: "+r,e),this.hls.trigger(S.ERROR,{type:L.MEDIA_ERROR,details:R.BUFFER_APPENDING_ERROR,error:r,fatal:!1});var i=this.operationQueue.current(t);i&&i.onError(e)},e.removeExecutor=function(t,e,r){var i=this.media,n=this.mediaSource,a=this.operationQueue,s=this.sourceBuffer[t];if(!i||!n||!s)return w.warn("[buffer-controller]: Attempting to remove from the "+t+" SourceBuffer, but it does not exist"),void a.shiftAndExecuteNext(t);var o=E(i.duration)?i.duration:1/0,l=E(n.duration)?n.duration:1/0,u=Math.max(0,e),h=Math.min(r,o,l);h>u&&!s.ending?(s.ended=!1,w.log("[buffer-controller]: Removing ["+u+","+h+"] from the "+t+" SourceBuffer"),s.remove(u,h)):a.shiftAndExecuteNext(t)},e.appendExecutor=function(t,e){var r=this.operationQueue,i=this.sourceBuffer[e];if(!i)return w.warn("[buffer-controller]: Attempting to append to the "+e+" SourceBuffer, but it does not exist"),void r.shiftAndExecuteNext(e);i.ended=!1,i.appendBuffer(t)},e.blockBuffers=function(t,e){var r=this;if(void 0===e&&(e=this.getSourceBufferTypes()),!e.length)return w.log("[buffer-controller]: Blocking operation requested, but no SourceBuffers exist"),void Promise.resolve().then(t);var i=this.operationQueue,n=e.map((function(t){return i.appendBlocker(t)}));Promise.all(n).then((function(){t(),e.forEach((function(t){var e=r.sourceBuffer[t];null!=e&&e.updating||i.shiftAndExecuteNext(t)}))}))},e.getSourceBufferTypes=function(){return Object.keys(this.sourceBuffer)},e.addBufferListener=function(t,e,r){var i=this.sourceBuffer[t];if(i){var n=r.bind(this,t);this.listeners[t].push({event:e,listener:n}),i.addEventListener(e,n)}},e.removeBufferListeners=function(t){var e=this.sourceBuffer[t];e&&this.listeners[t].forEach((function(t){e.removeEventListener(t.event,t.listener)}))},t}(),wn={42:225,92:233,94:237,95:243,96:250,123:231,124:247,125:209,126:241,127:9608,128:174,129:176,130:189,131:191,132:8482,133:162,134:163,135:9834,136:224,137:32,138:232,139:226,140:234,141:238,142:244,143:251,144:193,145:201,146:211,147:218,148:220,149:252,150:8216,151:161,152:42,153:8217,154:9473,155:169,156:8480,157:8226,158:8220,159:8221,160:192,161:194,162:199,163:200,164:202,165:203,166:235,167:206,168:207,169:239,170:212,171:217,172:249,173:219,174:171,175:187,176:195,177:227,178:205,179:204,180:236,181:210,182:242,183:213,184:245,185:123,186:125,187:92,188:94,189:95,190:124,191:8764,192:196,193:228,194:214,195:246,196:223,197:165,198:164,199:9475,200:197,201:229,202:216,203:248,204:9487,205:9491,206:9495,207:9499},Cn=function(t){var e=t;return wn.hasOwnProperty(t)&&(e=wn[t]),String.fromCharCode(e)},_n=15,Pn=100,xn={17:1,18:3,21:5,22:7,23:9,16:11,19:12,20:14},Fn={17:2,18:4,21:6,22:8,23:10,19:13,20:15},Mn={25:1,26:3,29:5,30:7,31:9,24:11,27:12,28:14},On={25:2,26:4,29:6,30:8,31:10,27:13,28:15},Nn=["white","green","blue","cyan","red","yellow","magenta","black","transparent"],Un=function(){function t(){this.time=null,this.verboseLevel=0}return t.prototype.log=function(t,e){if(this.verboseLevel>=t){var r="function"==typeof e?e():e;w.log(this.time+" ["+t+"] "+r)}},t}(),Bn=function(t){for(var e=[],r=0;rPn&&(this.logger.log(3,"Too large cursor position "+this.pos),this.pos=Pn)},e.moveCursor=function(t){var e=this.pos+t;if(t>1)for(var r=this.pos+1;r=144&&this.backSpace();var r=Cn(t);this.pos>=Pn?this.logger.log(0,(function(){return"Cannot insert "+t.toString(16)+" ("+r+") at position "+e.pos+". Skipping it!"})):(this.chars[this.pos].setChar(r,this.currPenState),this.moveCursor(1))},e.clearFromPos=function(t){var e;for(e=t;e0&&(r=t?"["+e.join(" | ")+"]":e.join("\n")),r},e.getTextAndFormat=function(){return this.rows},t}(),Yn=function(){function t(t,e,r){this.chNr=void 0,this.outputFilter=void 0,this.mode=void 0,this.verbose=void 0,this.displayedMemory=void 0,this.nonDisplayedMemory=void 0,this.lastOutputScreen=void 0,this.currRollUpRow=void 0,this.writeScreen=void 0,this.cueStartTime=void 0,this.logger=void 0,this.chNr=t,this.outputFilter=e,this.mode=null,this.verbose=0,this.displayedMemory=new Vn(r),this.nonDisplayedMemory=new Vn(r),this.lastOutputScreen=new Vn(r),this.currRollUpRow=this.displayedMemory.rows[14],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null,this.logger=r}var e=t.prototype;return e.reset=function(){this.mode=null,this.displayedMemory.reset(),this.nonDisplayedMemory.reset(),this.lastOutputScreen.reset(),this.outputFilter.reset(),this.currRollUpRow=this.displayedMemory.rows[14],this.writeScreen=this.displayedMemory,this.mode=null,this.cueStartTime=null},e.getHandler=function(){return this.outputFilter},e.setHandler=function(t){this.outputFilter=t},e.setPAC=function(t){this.writeScreen.setPAC(t)},e.setBkgData=function(t){this.writeScreen.setBkgData(t)},e.setMode=function(t){t!==this.mode&&(this.mode=t,this.logger.log(2,(function(){return"MODE="+t})),"MODE_POP-ON"===this.mode?this.writeScreen=this.nonDisplayedMemory:(this.writeScreen=this.displayedMemory,this.writeScreen.reset()),"MODE_ROLL-UP"!==this.mode&&(this.displayedMemory.nrRollUpRows=null,this.nonDisplayedMemory.nrRollUpRows=null),this.mode=t)},e.insertChars=function(t){for(var e=this,r=0;r=46,e.italics)e.foreground="white";else{var r=Math.floor(t/2)-16;e.foreground=["white","green","blue","cyan","red","yellow","magenta"][r]}this.logger.log(2,"MIDROW: "+JSON.stringify(e)),this.writeScreen.setPen(e)},e.outputDataUpdate=function(t){void 0===t&&(t=!1);var e=this.logger.time;null!==e&&this.outputFilter&&(null!==this.cueStartTime||this.displayedMemory.isEmpty()?this.displayedMemory.equals(this.lastOutputScreen)||(this.outputFilter.newCue(this.cueStartTime,e,this.lastOutputScreen),t&&this.outputFilter.dispatchCue&&this.outputFilter.dispatchCue(),this.cueStartTime=this.displayedMemory.isEmpty()?null:e):this.cueStartTime=e,this.lastOutputScreen.copy(this.displayedMemory))},e.cueSplitAtTime=function(t){this.outputFilter&&(this.displayedMemory.isEmpty()||(this.outputFilter.newCue&&this.outputFilter.newCue(this.cueStartTime,t,this.displayedMemory),this.cueStartTime=t))},t}(),Wn=function(){function t(t,e,r){this.channels=void 0,this.currentChannel=0,this.cmdHistory=void 0,this.logger=void 0;var i=new Un;this.channels=[null,new Yn(t,e,i),new Yn(t+1,r,i)],this.cmdHistory={a:null,b:null},this.logger=i}var e=t.prototype;return e.getHandler=function(t){return this.channels[t].getHandler()},e.setHandler=function(t,e){this.channels[t].setHandler(e)},e.addData=function(t,e){var r,i,n,a=!1;this.logger.time=t;for(var s=0;s ("+Bn([i,n])+")"),(r=this.parseCmd(i,n))||(r=this.parseMidrow(i,n)),r||(r=this.parsePAC(i,n)),r||(r=this.parseBackgroundAttributes(i,n)),!r&&(a=this.parseChars(i,n))){var o=this.currentChannel;o&&o>0?this.channels[o].insertChars(a):this.logger.log(2,"No channel found yet. TEXT-MODE?")}r||a||this.logger.log(2,"Couldn't parse cleaned data "+Bn([i,n])+" orig: "+Bn([e[s],e[s+1]]))}},e.parseCmd=function(t,e){var r=this.cmdHistory;if(!((20===t||28===t||21===t||29===t)&&e>=32&&e<=47||(23===t||31===t)&&e>=33&&e<=35))return!1;if(qn(t,e,r))return jn(null,null,r),this.logger.log(3,"Repeated command ("+Bn([t,e])+") is dropped"),!0;var i=20===t||21===t||23===t?1:2,n=this.channels[i];return 20===t||21===t||28===t||29===t?32===e?n.ccRCL():33===e?n.ccBS():34===e?n.ccAOF():35===e?n.ccAON():36===e?n.ccDER():37===e?n.ccRU(2):38===e?n.ccRU(3):39===e?n.ccRU(4):40===e?n.ccFON():41===e?n.ccRDC():42===e?n.ccTR():43===e?n.ccRTD():44===e?n.ccEDM():45===e?n.ccCR():46===e?n.ccENM():47===e&&n.ccEOC():n.ccTO(e-32),jn(t,e,r),this.currentChannel=i,!0},e.parseMidrow=function(t,e){var r=0;if((17===t||25===t)&&e>=32&&e<=47){if((r=17===t?1:2)!==this.currentChannel)return this.logger.log(0,"Mismatch channel in midrow parsing"),!1;var i=this.channels[r];return!!i&&(i.ccMIDROW(e),this.logger.log(3,"MIDROW ("+Bn([t,e])+")"),!0)}return!1},e.parsePAC=function(t,e){var r,i=this.cmdHistory;if(!((t>=17&&t<=23||t>=25&&t<=31)&&e>=64&&e<=127||(16===t||24===t)&&e>=64&&e<=95))return!1;if(qn(t,e,i))return jn(null,null,i),!0;var n=t<=23?1:2;r=e>=64&&e<=95?1===n?xn[t]:Mn[t]:1===n?Fn[t]:On[t];var a=this.channels[n];return!!a&&(a.setPAC(this.interpretPAC(r,e)),jn(t,e,i),this.currentChannel=n,!0)},e.interpretPAC=function(t,e){var r,i={color:null,italics:!1,indent:null,underline:!1,row:t};return r=e>95?e-96:e-64,i.underline=1==(1&r),r<=13?i.color=["white","green","blue","cyan","red","yellow","magenta","white"][Math.floor(r/2)]:r<=15?(i.italics=!0,i.color="white"):i.indent=4*Math.floor((r-16)/2),i},e.parseChars=function(t,e){var r,i,n=null,a=null;if(t>=25?(r=2,a=t-8):(r=1,a=t),a>=17&&a<=19?(i=17===a?e+80:18===a?e+112:e+144,this.logger.log(2,"Special char '"+Cn(i)+"' in channel "+r),n=[i]):t>=32&&t<=127&&(n=0===e?[t]:[t,e]),n){var s=Bn(n);this.logger.log(3,"Char codes = "+s.join(",")),jn(t,e,this.cmdHistory)}return n},e.parseBackgroundAttributes=function(t,e){var r;if(!((16===t||24===t)&&e>=32&&e<=47||(23===t||31===t)&&e>=45&&e<=47))return!1;var i={};16===t||24===t?(r=Math.floor((e-32)/2),i.background=Nn[r],e%2==1&&(i.background=i.background+"_semi")):45===e?i.background="transparent":(i.foreground="black",47===e&&(i.underline=!0));var n=t<=23?1:2;return this.channels[n].setBkgData(i),jn(t,e,this.cmdHistory),!0},e.reset=function(){for(var t=0;tt)&&(this.startTime=t),this.endTime=e,this.screen=r,this.timelineController.createCaptionsTrack(this.trackName)},e.reset=function(){this.cueRanges=[],this.startTime=null},t}(),zn=function(){if("undefined"!=typeof self&&self.VTTCue)return self.VTTCue;var t=["","lr","rl"],e=["start","middle","end","left","right"];function r(t,e){if("string"!=typeof e)return!1;if(!Array.isArray(t))return!1;var r=e.toLowerCase();return!!~t.indexOf(r)&&r}function i(t){return r(e,t)}function n(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),i=1;i100)throw new Error("Position must be between 0 and 100.");T=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"positionAlign",n({},l,{get:function(){return E},set:function(t){var e=i(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");E=e,this.hasBeenReset=!0}})),Object.defineProperty(o,"size",n({},l,{get:function(){return S},set:function(t){if(t<0||t>100)throw new Error("Size must be between 0 and 100.");S=t,this.hasBeenReset=!0}})),Object.defineProperty(o,"align",n({},l,{get:function(){return L},set:function(t){var e=i(t);if(!e)throw new SyntaxError("An invalid or illegal string was specified.");L=e,this.hasBeenReset=!0}})),o.displayState=void 0}return a.prototype.getCueAsHTML=function(){return self.WebVTT.convertCueToDOMTree(self,this.text)},a}(),Qn=function(){function t(){}return t.prototype.decode=function(t,e){if(!t)return"";if("string"!=typeof t)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(t))},t}();function $n(t){function e(t,e,r,i){return 3600*(0|t)+60*(0|e)+(0|r)+parseFloat(i||0)}var r=t.match(/^(?:(\d+):)?(\d{2}):(\d{2})(\.\d+)?/);return r?parseFloat(r[2])>59?e(r[2],r[3],0,r[4]):e(r[1],r[2],r[3],r[4]):null}var Jn=function(){function t(){this.values=Object.create(null)}var e=t.prototype;return e.set=function(t,e){this.get(t)||""===e||(this.values[t]=e)},e.get=function(t,e,r){return r?this.has(t)?this.values[t]:e[r]:this.has(t)?this.values[t]:e},e.has=function(t){return t in this.values},e.alt=function(t,e,r){for(var i=0;i=0&&r<=100)return this.set(t,r),!0}return!1},t}();function Zn(t,e,r,i){var n=i?t.split(i):[t];for(var a in n)if("string"==typeof n[a]){var s=n[a].split(r);2===s.length&&e(s[0],s[1])}}var ta=new zn(0,0,""),ea="middle"===ta.align?"middle":"center";function ra(t,e,r){var i=t;function n(){var e=$n(t);if(null===e)throw new Error("Malformed timestamp: "+i);return t=t.replace(/^[^\sa-zA-Z-]+/,""),e}function a(){t=t.replace(/^\s+/,"")}if(a(),e.startTime=n(),a(),"--\x3e"!==t.slice(0,3))throw new Error("Malformed time stamp (time stamps must be separated by '--\x3e'): "+i);t=t.slice(3),a(),e.endTime=n(),a(),function(t,e){var i=new Jn;Zn(t,(function(t,e){var n;switch(t){case"region":for(var a=r.length-1;a>=0;a--)if(r[a].id===e){i.set(t,r[a].region);break}break;case"vertical":i.alt(t,e,["rl","lr"]);break;case"line":n=e.split(","),i.integer(t,n[0]),i.percent(t,n[0])&&i.set("snapToLines",!1),i.alt(t,n[0],["auto"]),2===n.length&&i.alt("lineAlign",n[1],["start",ea,"end"]);break;case"position":n=e.split(","),i.percent(t,n[0]),2===n.length&&i.alt("positionAlign",n[1],["start",ea,"end","line-left","line-right","auto"]);break;case"size":i.percent(t,e);break;case"align":i.alt(t,e,["start",ea,"end","left","right"])}}),/:/,/\s/),e.region=i.get("region",null),e.vertical=i.get("vertical","");var n=i.get("line","auto");"auto"===n&&-1===ta.line&&(n=-1),e.line=n,e.lineAlign=i.get("lineAlign","start"),e.snapToLines=i.get("snapToLines",!0),e.size=i.get("size",100),e.align=i.get("align",ea);var a=i.get("position","auto");"auto"===a&&50===ta.position&&(a="start"===e.align||"left"===e.align?0:"end"===e.align||"right"===e.align?100:50),e.position=a}(t,e)}function ia(t){return t.replace(//gi,"\n")}var na=function(){function t(){this.state="INITIAL",this.buffer="",this.decoder=new Qn,this.regionList=[],this.cue=null,this.oncue=void 0,this.onparsingerror=void 0,this.onflush=void 0}var e=t.prototype;return e.parse=function(t){var e=this;function r(){var t=e.buffer,r=0;for(t=ia(t);r>>0).toString()};function la(t,e,r){return oa(t.toString())+oa(e.toString())+oa(r)}function ua(t,e,r,i,n,a,s){var o,l,u,h=new na,d=pt(new Uint8Array(t)).trim().replace(aa,"\n").split("\n"),c=[],f=e?(o=e.baseTime,void 0===(l=e.timescale)&&(l=1),Ui(o,9e4,1/l)):0,g="00:00.000",v=0,m=0,p=!0;h.oncue=function(t){var a=r[i],s=r.ccOffset,o=(v-f)/9e4;if(null!=a&&a.new&&(void 0!==m?s=r.ccOffset=a.start:function(t,e,r){var i=t[e],n=t[i.prevCC];if(!n||!n.new&&i.new)return t.ccOffset=t.presentationOffset=i.start,void(i.new=!1);for(;null!=(a=n)&&a.new;){var a;t.ccOffset+=i.start-n.start,i.new=!1,n=t[(i=n).prevCC]}t.presentationOffset=r}(r,i,o)),o){if(!e)return void(u=new Error("Missing initPTS for VTT MPEGTS"));s=o-r.presentationOffset}var l=t.endTime-t.startTime,h=Vi(9e4*(t.startTime+s-m),9e4*n)/9e4;t.startTime=Math.max(h,0),t.endTime=Math.max(h+l,0);var d=t.text.trim();t.text=decodeURIComponent(encodeURIComponent(d)),t.id||(t.id=la(t.startTime,t.endTime,d)),t.endTime>0&&c.push(t)},h.onparsingerror=function(t){u=t},h.onflush=function(){u?s(u):a(c)},d.forEach((function(t){if(p){if(sa(t,"X-TIMESTAMP-MAP=")){p=!1,t.slice(16).split(",").forEach((function(t){sa(t,"LOCAL:")?g=t.slice(6):sa(t,"MPEGTS:")&&(v=parseInt(t.slice(7)))}));try{m=function(t){var e=parseInt(t.slice(-3)),r=parseInt(t.slice(-6,-4)),i=parseInt(t.slice(-9,-7)),n=t.length>9?parseInt(t.substring(0,t.indexOf(":"))):0;if(!(E(e)&&E(r)&&E(i)&&E(n)))throw Error("Malformed X-TIMESTAMP-MAP: Local:"+t);return e+=1e3*r,(e+=6e4*i)+36e5*n}(g)/1e3}catch(t){u=t}return}""===t&&(p=!1)}h.parse(t+"\n")})),h.flush()}var ha="stpp.ttml.im1t",da=/^(\d{2,}):(\d{2}):(\d{2}):(\d{2})\.?(\d+)?$/,ca=/^(\d*(?:\.\d*)?)(h|m|s|ms|f|t)$/,fa={left:"start",center:"center",right:"end",start:"start",end:"end"};function ga(t,e,r,i){var n=It(new Uint8Array(t),["mdat"]);if(0!==n.length){var a,s,l,u,h=n.map((function(t){return pt(t)})),d=(a=e.baseTime,s=1,void 0===(l=e.timescale)&&(l=1),void 0===u&&(u=!1),Ui(a,s,1/l,u));try{h.forEach((function(t){return r(function(t,e){var r=(new DOMParser).parseFromString(t,"text/xml").getElementsByTagName("tt")[0];if(!r)throw new Error("Invalid ttml");var i={frameRate:30,subFrameRate:1,frameRateMultiplier:0,tickRate:0},n=Object.keys(i).reduce((function(t,e){return t[e]=r.getAttribute("ttp:"+e)||i[e],t}),{}),a="preserve"!==r.getAttribute("xml:space"),s=ma(va(r,"styling","style")),l=ma(va(r,"layout","region")),u=va(r,"body","[begin]");return[].map.call(u,(function(t){var r=pa(t,a);if(!r||!t.hasAttribute("begin"))return null;var i=Ea(t.getAttribute("begin"),n),u=Ea(t.getAttribute("dur"),n),h=Ea(t.getAttribute("end"),n);if(null===i)throw Ta(t);if(null===h){if(null===u)throw Ta(t);h=i+u}var d=new zn(i-e,h-e,r);d.id=la(d.startTime,d.endTime,d.text);var c=function(t,e,r){var i="http://www.w3.org/ns/ttml#styling",n=null,a=["displayAlign","textAlign","color","backgroundColor","fontSize","fontFamily"],s=null!=t&&t.hasAttribute("style")?t.getAttribute("style"):null;return s&&r.hasOwnProperty(s)&&(n=r[s]),a.reduce((function(r,a){var s=ya(e,i,a)||ya(t,i,a)||ya(n,i,a);return s&&(r[a]=s),r}),{})}(l[t.getAttribute("region")],s[t.getAttribute("style")],s),f=c.textAlign;if(f){var g=fa[f];g&&(d.lineAlign=g),d.align=f}return o(d,c),d})).filter((function(t){return null!==t}))}(t,d))}))}catch(t){i(t)}}else i(new Error("Could not parse IMSC1 mdat"))}function va(t,e,r){var i=t.getElementsByTagName(e)[0];return i?[].slice.call(i.querySelectorAll(r)):[]}function ma(t){return t.reduce((function(t,e){var r=e.getAttribute("xml:id");return r&&(t[r]=e),t}),{})}function pa(t,e){return[].slice.call(t.childNodes).reduce((function(t,r,i){var n;return"br"===r.nodeName&&i?t+"\n":null!=(n=r.childNodes)&&n.length?pa(r,e):e?t+r.textContent.trim().replace(/\s+/g," "):t+r.textContent}),"")}function ya(t,e,r){return t&&t.hasAttributeNS(e,r)?t.getAttributeNS(e,r):null}function Ta(t){return new Error("Could not parse ttml timestamp "+t)}function Ea(t,e){if(!t)return null;var r=$n(t);return null===r&&(da.test(t)?r=function(t,e){var r=da.exec(t),i=(0|r[4])+(0|r[5])/e.subFrameRate;return 3600*(0|r[1])+60*(0|r[2])+(0|r[3])+i/e.frameRate}(t,e):ca.test(t)&&(r=function(t,e){var r=ca.exec(t),i=Number(r[1]);switch(r[2]){case"h":return 3600*i;case"m":return 60*i;case"ms":return 1e3*i;case"f":return i/e.frameRate;case"t":return i/e.tickRate}return i}(t,e))),r}var Sa=function(){function t(t){if(this.hls=void 0,this.media=null,this.config=void 0,this.enabled=!0,this.Cues=void 0,this.textTracks=[],this.tracks=[],this.initPTS=[],this.unparsedVttFrags=[],this.captionsTracks={},this.nonNativeCaptionsTracks={},this.cea608Parser1=void 0,this.cea608Parser2=void 0,this.lastSn=-1,this.lastPartIndex=-1,this.prevCC=-1,this.vttCCs={ccOffset:0,presentationOffset:0,0:{start:0,prevCC:-1,new:!0}},this.captionsProperties=void 0,this.hls=t,this.config=t.config,this.Cues=t.config.cueHandler,this.captionsProperties={textTrack1:{label:this.config.captionsTextTrack1Label,languageCode:this.config.captionsTextTrack1LanguageCode},textTrack2:{label:this.config.captionsTextTrack2Label,languageCode:this.config.captionsTextTrack2LanguageCode},textTrack3:{label:this.config.captionsTextTrack3Label,languageCode:this.config.captionsTextTrack3LanguageCode},textTrack4:{label:this.config.captionsTextTrack4Label,languageCode:this.config.captionsTextTrack4LanguageCode}},this.config.enableCEA708Captions){var e=new Xn(this,"textTrack1"),r=new Xn(this,"textTrack2"),i=new Xn(this,"textTrack3"),n=new Xn(this,"textTrack4");this.cea608Parser1=new Wn(1,e,r),this.cea608Parser2=new Wn(3,i,n)}t.on(S.MEDIA_ATTACHING,this.onMediaAttaching,this),t.on(S.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(S.MANIFEST_LOADING,this.onManifestLoading,this),t.on(S.MANIFEST_LOADED,this.onManifestLoaded,this),t.on(S.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),t.on(S.FRAG_LOADING,this.onFragLoading,this),t.on(S.FRAG_LOADED,this.onFragLoaded,this),t.on(S.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),t.on(S.FRAG_DECRYPTED,this.onFragDecrypted,this),t.on(S.INIT_PTS_FOUND,this.onInitPtsFound,this),t.on(S.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),t.on(S.BUFFER_FLUSHING,this.onBufferFlushing,this)}var e=t.prototype;return e.destroy=function(){var t=this.hls;t.off(S.MEDIA_ATTACHING,this.onMediaAttaching,this),t.off(S.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(S.MANIFEST_LOADING,this.onManifestLoading,this),t.off(S.MANIFEST_LOADED,this.onManifestLoaded,this),t.off(S.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),t.off(S.FRAG_LOADING,this.onFragLoading,this),t.off(S.FRAG_LOADED,this.onFragLoaded,this),t.off(S.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),t.off(S.FRAG_DECRYPTED,this.onFragDecrypted,this),t.off(S.INIT_PTS_FOUND,this.onInitPtsFound,this),t.off(S.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),t.off(S.BUFFER_FLUSHING,this.onBufferFlushing,this),this.hls=this.config=this.cea608Parser1=this.cea608Parser2=null},e.addCues=function(t,e,r,i,n){for(var a,s,o,l,u=!1,h=n.length;h--;){var d=n[h],c=(a=d[0],s=d[1],o=e,l=r,Math.min(s,l)-Math.max(a,o));if(c>=0&&(d[0]=Math.min(d[0],e),d[1]=Math.max(d[1],r),u=!0,c/(r-e)>.5))return}if(u||n.push([e,r]),this.config.renderTextTracksNatively){var f=this.captionsTracks[t];this.Cues.newCue(f,e,r,i)}else{var g=this.Cues.newCue(null,e,r,i);this.hls.trigger(S.CUES_PARSED,{type:"captions",cues:g,track:t})}},e.onInitPtsFound=function(t,e){var r=this,i=e.frag,n=e.id,a=e.initPTS,s=e.timescale,o=this.unparsedVttFrags;"main"===n&&(this.initPTS[i.cc]={baseTime:a,timescale:s}),o.length&&(this.unparsedVttFrags=[],o.forEach((function(t){r.onFragLoaded(S.FRAG_LOADED,t)})))},e.getExistingTrack=function(t){var e=this.media;if(e)for(var r=0;ri.cc||l.trigger(S.SUBTITLE_FRAG_PROCESSED,{success:!1,frag:i,error:e})}))}else s.push(t)},e._fallbackToIMSC1=function(t,e){var r=this,i=this.tracks[t.level];i.textCodec||ga(e,this.initPTS[t.cc],(function(){i.textCodec=ha,r._parseIMSC1(t,e)}),(function(){i.textCodec="wvtt"}))},e._appendCues=function(t,e){var r=this.hls;if(this.config.renderTextTracksNatively){var i=this.textTracks[e];if(!i||"disabled"===i.mode)return;t.forEach((function(t){return Se(i,t)}))}else{var n=this.tracks[e];if(!n)return;var a=n.default?"default":"subtitles"+e;r.trigger(S.CUES_PARSED,{type:"subtitles",cues:t,track:a})}},e.onFragDecrypted=function(t,e){e.frag.type===me&&this.onFragLoaded(S.FRAG_LOADED,e)},e.onSubtitleTracksCleared=function(){this.tracks=[],this.captionsTracks={}},e.onFragParsingUserdata=function(t,e){var r=this.cea608Parser1,i=this.cea608Parser2;if(this.enabled&&r&&i){var n=e.frag,a=e.samples;if(n.type!==ge||"NONE"!==this.closedCaptionsForLevel(n))for(var s=0;s0&&this.mediaWidth>0){var t=this.hls.levels;if(t.length){var e=this.hls;e.autoLevelCapping=this.getMaxLevel(t.length-1),e.autoLevelCapping>this.autoLevelCapping&&this.streamController&&this.streamController.nextLevelSwitch(),this.autoLevelCapping=e.autoLevelCapping}}},e.getMaxLevel=function(e){var r=this,i=this.hls.levels;if(!i.length)return-1;var n=i.filter((function(t,i){return r.isLevelAllowed(t)&&i<=e}));return this.clientRect=null,t.getMaxLevelByMediaSize(n,this.mediaWidth,this.mediaHeight)},e.startCapping=function(){this.timer||(this.autoLevelCapping=Number.POSITIVE_INFINITY,this.hls.firstLevel=this.getMaxLevel(this.firstLevel),self.clearInterval(this.timer),this.timer=self.setInterval(this.detectPlayerSize.bind(this),1e3),this.detectPlayerSize())},e.stopCapping=function(){this.restrictedLevels=[],this.firstLevel=-1,this.autoLevelCapping=Number.POSITIVE_INFINITY,this.timer&&(self.clearInterval(this.timer),this.timer=void 0)},e.getDimensions=function(){if(this.clientRect)return this.clientRect;var t=this.media,e={width:0,height:0};if(t){var r=t.getBoundingClientRect();e.width=r.width,e.height=r.height,e.width||e.height||(e.width=r.right-r.left||t.width||0,e.height=r.bottom-r.top||t.height||0)}return this.clientRect=e,e},e.isLevelAllowed=function(t){return!this.restrictedLevels.some((function(e){return t.bitrate===e.bitrate&&t.width===e.width&&t.height===e.height}))},t.getMaxLevelByMediaSize=function(t,e,r){if(null==t||!t.length)return-1;for(var i,n,a=t.length-1,s=0;s=e||o.height>=r)&&(i=o,!(n=t[s+1])||i.width!==n.width||i.height!==n.height)){a=s;break}}return a},a(t,[{key:"mediaWidth",get:function(){return this.getDimensions().width*this.contentScaleFactor}},{key:"mediaHeight",get:function(){return this.getDimensions().height*this.contentScaleFactor}},{key:"contentScaleFactor",get:function(){var t=1;if(!this.hls.config.ignoreDevicePixelRatio)try{t=self.devicePixelRatio}catch(t){}return t}}]),t}(),Aa=function(){function t(t){this.hls=void 0,this.isVideoPlaybackQualityAvailable=!1,this.timer=void 0,this.media=null,this.lastTime=void 0,this.lastDroppedFrames=0,this.lastDecodedFrames=0,this.streamController=void 0,this.hls=t,this.registerListeners()}var e=t.prototype;return e.setStreamController=function(t){this.streamController=t},e.registerListeners=function(){this.hls.on(S.MEDIA_ATTACHING,this.onMediaAttaching,this)},e.unregisterListeners=function(){this.hls.off(S.MEDIA_ATTACHING,this.onMediaAttaching,this)},e.destroy=function(){this.timer&&clearInterval(this.timer),this.unregisterListeners(),this.isVideoPlaybackQualityAvailable=!1,this.media=null},e.onMediaAttaching=function(t,e){var r=this.hls.config;if(r.capLevelOnFPSDrop){var i=e.media instanceof self.HTMLVideoElement?e.media:null;this.media=i,i&&"function"==typeof i.getVideoPlaybackQuality&&(this.isVideoPlaybackQualityAvailable=!0),self.clearInterval(this.timer),this.timer=self.setInterval(this.checkFPSInterval.bind(this),r.fpsDroppedMonitoringPeriod)}},e.checkFPS=function(t,e,r){var i=performance.now();if(e){if(this.lastTime){var n=i-this.lastTime,a=r-this.lastDroppedFrames,s=e-this.lastDecodedFrames,o=1e3*a/n,l=this.hls;if(l.trigger(S.FPS_DROP,{currentDropped:a,currentDecoded:s,totalDroppedFrames:r}),o>0&&a>l.config.fpsDroppedMonitoringThreshold*s){var u=l.currentLevel;w.warn("drop FPS ratio greater than max allowed value for currentLevel: "+u),u>0&&(-1===l.autoLevelCapping||l.autoLevelCapping>=u)&&(u-=1,l.trigger(S.FPS_DROP_LEVEL_CAPPING,{level:u,droppedLevel:l.currentLevel}),l.autoLevelCapping=u,this.streamController.nextLevelSwitch())}}this.lastTime=i,this.lastDroppedFrames=r,this.lastDecodedFrames=e}},e.checkFPSInterval=function(){var t=this.media;if(t)if(this.isVideoPlaybackQualityAvailable){var e=t.getVideoPlaybackQuality();this.checkFPS(t,e.totalVideoFrames,e.droppedVideoFrames)}else this.checkFPS(t,t.webkitDecodedFrameCount,t.webkitDroppedFrameCount)},t}(),ka="[eme]",ba=function(){function t(e){this.hls=void 0,this.config=void 0,this.media=null,this.keyFormatPromise=null,this.keySystemAccessPromises={},this._requestLicenseFailureCount=0,this.mediaKeySessions=[],this.keyIdToKeySessionPromise={},this.setMediaKeysQueue=t.CDMCleanupPromise?[t.CDMCleanupPromise]:[],this.onMediaEncrypted=this._onMediaEncrypted.bind(this),this.onWaitingForKey=this._onWaitingForKey.bind(this),this.debug=w.debug.bind(w,ka),this.log=w.log.bind(w,ka),this.warn=w.warn.bind(w,ka),this.error=w.error.bind(w,ka),this.hls=e,this.config=e.config,this.registerListeners()}var e=t.prototype;return e.destroy=function(){this.unregisterListeners(),this.onMediaDetached();var t=this.config;t.requestMediaKeySystemAccessFunc=null,t.licenseXhrSetup=t.licenseResponseCallback=void 0,t.drmSystems=t.drmSystemOptions={},this.hls=this.onMediaEncrypted=this.onWaitingForKey=this.keyIdToKeySessionPromise=null,this.config=null},e.registerListeners=function(){this.hls.on(S.MEDIA_ATTACHED,this.onMediaAttached,this),this.hls.on(S.MEDIA_DETACHED,this.onMediaDetached,this),this.hls.on(S.MANIFEST_LOADING,this.onManifestLoading,this),this.hls.on(S.MANIFEST_LOADED,this.onManifestLoaded,this)},e.unregisterListeners=function(){this.hls.off(S.MEDIA_ATTACHED,this.onMediaAttached,this),this.hls.off(S.MEDIA_DETACHED,this.onMediaDetached,this),this.hls.off(S.MANIFEST_LOADING,this.onManifestLoading,this),this.hls.off(S.MANIFEST_LOADED,this.onManifestLoaded,this)},e.getLicenseServerUrl=function(t){var e=this.config,r=e.drmSystems,i=e.widevineLicenseUrl,n=r[t];if(n)return n.licenseUrl;if(t===j.WIDEVINE&&i)return i;throw new Error('no license server URL configured for key-system "'+t+'"')},e.getServerCertificateUrl=function(t){var e=this.config.drmSystems[t];if(e)return e.serverCertificateUrl;this.log('No Server Certificate in config.drmSystems["'+t+'"]')},e.attemptKeySystemAccess=function(t){var e=this,r=this.hls.levels,i=function(t,e,r){return!!t&&r.indexOf(t)===e},n=r.map((function(t){return t.audioCodec})).filter(i),a=r.map((function(t){return t.videoCodec})).filter(i);return n.length+a.length===0&&a.push("avc1.42e01e"),new Promise((function(r,i){!function t(s){var o=s.shift();e.getMediaKeysPromise(o,n,a).then((function(t){return r({keySystem:o,mediaKeys:t})})).catch((function(e){s.length?t(s):i(e instanceof Da?e:new Da({type:L.KEY_SYSTEM_ERROR,details:R.KEY_SYSTEM_NO_ACCESS,error:e,fatal:!0},e.message))}))}(t)}))},e.requestMediaKeySystemAccess=function(t,e){var r=this.config.requestMediaKeySystemAccessFunc;if("function"!=typeof r){var i="Configured requestMediaKeySystemAccess is not a function "+r;return null===et&&"http:"===self.location.protocol&&(i="navigator.requestMediaKeySystemAccess is not available over insecure protocol "+location.protocol),Promise.reject(new Error(i))}return r(t,e)},e.getMediaKeysPromise=function(t,e,r){var i=this,n=function(t,e,r,i){var n;switch(t){case j.FAIRPLAY:n=["cenc","sinf"];break;case j.WIDEVINE:case j.PLAYREADY:n=["cenc"];break;case j.CLEARKEY:n=["cenc","keyids"];break;default:throw new Error("Unknown key-system: "+t)}return function(t,e,r,i){return[{initDataTypes:t,persistentState:i.persistentState||"not-allowed",distinctiveIdentifier:i.distinctiveIdentifier||"not-allowed",sessionTypes:i.sessionTypes||[i.sessionType||"temporary"],audioCapabilities:e.map((function(t){return{contentType:'audio/mp4; codecs="'+t+'"',robustness:i.audioRobustness||"",encryptionScheme:i.audioEncryptionScheme||null}})),videoCapabilities:r.map((function(t){return{contentType:'video/mp4; codecs="'+t+'"',robustness:i.videoRobustness||"",encryptionScheme:i.videoEncryptionScheme||null}}))}]}(n,e,r,i)}(t,e,r,this.config.drmSystemOptions),a=this.keySystemAccessPromises[t],s=null==a?void 0:a.keySystemAccess;if(!s){this.log('Requesting encrypted media "'+t+'" key-system access with config: '+JSON.stringify(n)),s=this.requestMediaKeySystemAccess(t,n);var o=this.keySystemAccessPromises[t]={keySystemAccess:s};return s.catch((function(e){i.log('Failed to obtain access to key-system "'+t+'": '+e)})),s.then((function(e){i.log('Access for key-system "'+e.keySystem+'" obtained');var r=i.fetchServerCertificate(t);return i.log('Create media-keys for "'+t+'"'),o.mediaKeys=e.createMediaKeys().then((function(e){return i.log('Media-keys created for "'+t+'"'),r.then((function(r){return r?i.setMediaKeysServerCertificate(e,t,r):e}))})),o.mediaKeys.catch((function(e){i.error('Failed to create media-keys for "'+t+'"}: '+e)})),o.mediaKeys}))}return s.then((function(){return a.mediaKeys}))},e.createMediaKeySessionContext=function(t){var e=t.decryptdata,r=t.keySystem,i=t.mediaKeys;this.log('Creating key-system session "'+r+'" keyId: '+Tt(e.keyId||[]));var n=i.createSession(),a={decryptdata:e,keySystem:r,mediaKeys:i,mediaKeysSession:n,keyStatus:"status-pending"};return this.mediaKeySessions.push(a),a},e.renewKeySession=function(t){var e=t.decryptdata;if(e.pssh){var r=this.createMediaKeySessionContext(t),i=this.getKeyIdString(e);this.keyIdToKeySessionPromise[i]=this.generateRequestWithPreferredKeySession(r,"cenc",e.pssh,"expired")}else this.warn("Could not renew expired session. Missing pssh initData.");this.removeSession(t)},e.getKeyIdString=function(t){if(!t)throw new Error("Could not read keyId of undefined decryptdata");if(null===t.keyId)throw new Error("keyId is null");return Tt(t.keyId)},e.updateKeySession=function(t,e){var r,i=t.mediaKeysSession;return this.log('Updating key-session "'+i.sessionId+'" for keyID '+Tt((null==(r=t.decryptdata)?void 0:r.keyId)||[])+"\n } (data length: "+(e?e.byteLength:e)+")"),i.update(e)},e.selectKeySystemFormat=function(t){var e=Object.keys(t.levelkeys||{});return this.keyFormatPromise||(this.log("Selecting key-system from fragment (sn: "+t.sn+" "+t.type+": "+t.level+") key formats "+e.join(", ")),this.keyFormatPromise=this.getKeyFormatPromise(e)),this.keyFormatPromise},e.getKeyFormatPromise=function(t){var e=this;return new Promise((function(r,i){var n=tt(e.config),a=t.map($).filter((function(t){return!!t&&-1!==n.indexOf(t)}));return e.getKeySystemSelectionPromise(a).then((function(t){var e=t.keySystem,n=Z(e);n?r(n):i(new Error('Unable to find format for key-system "'+e+'"'))})).catch(i)}))},e.loadKey=function(t){var e=this,r=t.keyInfo.decryptdata,i=this.getKeyIdString(r),n="(keyId: "+i+' format: "'+r.keyFormat+'" method: '+r.method+" uri: "+r.uri+")";this.log("Starting session for key "+n);var a=this.keyIdToKeySessionPromise[i];return a||(a=this.keyIdToKeySessionPromise[i]=this.getKeySystemForKeyPromise(r).then((function(i){var a=i.keySystem,s=i.mediaKeys;return e.throwIfDestroyed(),e.log("Handle encrypted media sn: "+t.frag.sn+" "+t.frag.type+": "+t.frag.level+" using key "+n),e.attemptSetMediaKeys(a,s).then((function(){e.throwIfDestroyed();var t=e.createMediaKeySessionContext({keySystem:a,mediaKeys:s,decryptdata:r});return e.generateRequestWithPreferredKeySession(t,"cenc",r.pssh,"playlist-key")}))}))).catch((function(t){return e.handleError(t)})),a},e.throwIfDestroyed=function(t){if(!this.hls)throw new Error("invalid state")},e.handleError=function(t){this.hls&&(this.error(t.message),t instanceof Da?this.hls.trigger(S.ERROR,t.data):this.hls.trigger(S.ERROR,{type:L.KEY_SYSTEM_ERROR,details:R.KEY_SYSTEM_NO_KEYS,error:t,fatal:!0}))},e.getKeySystemForKeyPromise=function(t){var e=this.getKeyIdString(t),r=this.keyIdToKeySessionPromise[e];if(!r){var i=$(t.keyFormat),n=i?[i]:tt(this.config);return this.attemptKeySystemAccess(n)}return r},e.getKeySystemSelectionPromise=function(t){if(t.length||(t=tt(this.config)),0===t.length)throw new Da({type:L.KEY_SYSTEM_ERROR,details:R.KEY_SYSTEM_NO_CONFIGURED_LICENSE,fatal:!0},"Missing key-system license configuration options "+JSON.stringify({drmSystems:this.config.drmSystems}));return this.attemptKeySystemAccess(t)},e._onMediaEncrypted=function(t){var e=this,r=t.initDataType,i=t.initData;if(this.debug('"'+t.type+'" event: init data type: "'+r+'"'),null!==i){var n,a;if("sinf"===r&&this.config.drmSystems[j.FAIRPLAY]){var s=Rt(new Uint8Array(i));try{var o=V(JSON.parse(s).sinf),l=_t(new Uint8Array(o));if(!l)return;n=l.subarray(8,24),a=j.FAIRPLAY}catch(t){return void this.warn('Failed to parse sinf "encrypted" event message initData')}}else{var u=function(t){if(!(t instanceof ArrayBuffer)||t.byteLength<32)return null;var e={version:0,systemId:"",kids:null,data:null},r=new DataView(t),i=r.getUint32(0);if(t.byteLength!==i&&i>44)return null;if(1886614376!==r.getUint32(4))return null;if(e.version=r.getUint32(8)>>>24,e.version>1)return null;e.systemId=Tt(new Uint8Array(t,12,16));var n=r.getUint32(28);if(0===e.version){if(i-32d||o.status>=400&&o.status<500)a(new Da({type:L.KEY_SYSTEM_ERROR,details:R.KEY_SYSTEM_LICENSE_REQUEST_FAILED,fatal:!0,networkDetails:o,response:{url:s,data:void 0,code:o.status,text:o.statusText}},"License Request XHR failed ("+s+"). Status: "+o.status+" ("+o.statusText+")"));else{var c=d-r._requestLicenseFailureCount+1;r.warn("Retrying license request, "+c+" attempts left"),r.requestLicense(t,e).then(n,a)}}},t.licenseXhr&&t.licenseXhr.readyState!==XMLHttpRequest.DONE&&t.licenseXhr.abort(),t.licenseXhr=o,r.setupLicenseXHR(o,s,t,e).then((function(t){var e=t.xhr,r=t.licenseChallenge;e.send(r)}))}))},e.onMediaAttached=function(t,e){if(this.config.emeEnabled){var r=e.media;this.media=r,r.addEventListener("encrypted",this.onMediaEncrypted),r.addEventListener("waitingforkey",this.onWaitingForKey)}},e.onMediaDetached=function(){var e=this,r=this.media,i=this.mediaKeySessions;r&&(r.removeEventListener("encrypted",this.onMediaEncrypted),r.removeEventListener("waitingforkey",this.onWaitingForKey),this.media=null),this._requestLicenseFailureCount=0,this.setMediaKeysQueue=[],this.mediaKeySessions=[],this.keyIdToKeySessionPromise={},Gt.clearKeyUriToKeyIdMap();var n=i.length;t.CDMCleanupPromise=Promise.all(i.map((function(t){return e.removeSession(t)})).concat(null==r?void 0:r.setMediaKeys(null).catch((function(t){e.log("Could not clear media keys: "+t+". media.src: "+(null==r?void 0:r.src))})))).then((function(){n&&(e.log("finished closing key sessions and clearing media keys"),i.length=0)})).catch((function(t){e.log("Could not close sessions and clear media keys: "+t+". media.src: "+(null==r?void 0:r.src))}))},e.onManifestLoading=function(){this.keyFormatPromise=null},e.onManifestLoaded=function(t,e){var r=e.sessionKeys;if(r&&this.config.emeEnabled&&!this.keyFormatPromise){var i=r.reduce((function(t,e){return-1===t.indexOf(e.keyFormat)&&t.push(e.keyFormat),t}),[]);this.log("Selecting key-system from session-keys "+i.join(", ")),this.keyFormatPromise=this.getKeyFormatPromise(i)}},e.removeSession=function(t){var e=this,r=t.mediaKeysSession,i=t.licenseXhr;if(r){this.log("Remove licenses and keys and close session "+r.sessionId),r.onmessage=null,r.onkeystatuseschange=null,i&&i.readyState!==XMLHttpRequest.DONE&&i.abort(),t.mediaKeysSession=t.decryptdata=t.licenseXhr=void 0;var n=this.mediaKeySessions.indexOf(t);return n>-1&&this.mediaKeySessions.splice(n,1),r.remove().catch((function(t){e.log("Could not remove session: "+t)})).then((function(){return r.close()})).catch((function(t){e.log("Could not close session: "+t)}))}},t}();ba.CDMCleanupPromise=void 0;var Da=function(t){function e(e,r){var i;return(i=t.call(this,r)||this).data=void 0,e.error||(e.error=new Error(r)),i.data=e,e.err=e.error,i}return l(e,t),e}(f(Error)),Ia="m",wa="a",Ca="v",_a="av",Pa="i",xa="tt",Fa=function(){function t(e){var r=this;this.hls=void 0,this.config=void 0,this.media=void 0,this.sid=void 0,this.cid=void 0,this.useHeaders=!1,this.initialized=!1,this.starved=!1,this.buffering=!0,this.audioBuffer=void 0,this.videoBuffer=void 0,this.onWaiting=function(){r.initialized&&(r.starved=!0),r.buffering=!0},this.onPlaying=function(){r.initialized||(r.initialized=!0),r.buffering=!1},this.applyPlaylistData=function(t){try{r.apply(t,{ot:Ia,su:!r.initialized})}catch(t){w.warn("Could not generate manifest CMCD data.",t)}},this.applyFragmentData=function(t){try{var e=t.frag,i=r.hls.levels[e.level],n=r.getObjectType(e),a={d:1e3*e.duration,ot:n};n!==Ca&&n!==wa&&n!=_a||(a.br=i.bitrate/1e3,a.tb=r.getTopBandwidth(n)/1e3,a.bl=r.getBufferLength(n)),r.apply(t,a)}catch(t){w.warn("Could not generate segment CMCD data.",t)}},this.hls=e;var i=this.config=e.config,n=i.cmcd;null!=n&&(i.pLoader=this.createPlaylistLoader(),i.fLoader=this.createFragmentLoader(),this.sid=n.sessionId||t.uuid(),this.cid=n.contentId,this.useHeaders=!0===n.useHeaders,this.registerListeners())}var e=t.prototype;return e.registerListeners=function(){var t=this.hls;t.on(S.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(S.MEDIA_DETACHED,this.onMediaDetached,this),t.on(S.BUFFER_CREATED,this.onBufferCreated,this)},e.unregisterListeners=function(){var t=this.hls;t.off(S.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(S.MEDIA_DETACHED,this.onMediaDetached,this),t.off(S.BUFFER_CREATED,this.onBufferCreated,this)},e.destroy=function(){this.unregisterListeners(),this.onMediaDetached(),this.hls=this.config=this.audioBuffer=this.videoBuffer=null},e.onMediaAttached=function(t,e){this.media=e.media,this.media.addEventListener("waiting",this.onWaiting),this.media.addEventListener("playing",this.onPlaying)},e.onMediaDetached=function(){this.media&&(this.media.removeEventListener("waiting",this.onWaiting),this.media.removeEventListener("playing",this.onPlaying),this.media=null)},e.onBufferCreated=function(t,e){var r,i;this.audioBuffer=null==(r=e.tracks.audio)?void 0:r.buffer,this.videoBuffer=null==(i=e.tracks.video)?void 0:i.buffer},e.createData=function(){var t;return{v:1,sf:"h",sid:this.sid,cid:this.cid,pr:null==(t=this.media)?void 0:t.playbackRate,mtp:this.hls.bandwidthEstimate/1e3}},e.apply=function(e,r){void 0===r&&(r={}),o(r,this.createData());var i=r.ot===Pa||r.ot===Ca||r.ot===_a;if(this.starved&&i&&(r.bs=!0,r.su=!0,this.starved=!1),null==r.su&&(r.su=this.buffering),this.useHeaders){var n=t.toHeaders(r);if(!Object.keys(n).length)return;e.headers||(e.headers={}),o(e.headers,n)}else{var a=t.toQuery(r);if(!a)return;e.url=t.appendQueryToUri(e.url,a)}},e.getObjectType=function(t){var e=t.type;return"subtitle"===e?xa:"initSegment"===t.sn?Pa:"audio"===e?wa:"main"===e?this.hls.audioTracks.length?Ca:_a:void 0},e.getTopBandwidth=function(t){var e,r=0,i=this.hls;if(t===wa)e=i.audioTracks;else{var n=i.maxAutoLevel,a=n>-1?n+1:i.levels.length;e=i.levels.slice(0,a)}for(var s,o=v(e);!(s=o()).done;){var l=s.value;l.bitrate>r&&(r=l.bitrate)}return r>0?r:NaN},e.getBufferLength=function(t){var e=this.hls.media,r=t===wa?this.audioBuffer:this.videoBuffer;return r&&e?1e3*Ir.bufferInfo(r,e.currentTime,this.config.maxBufferHole).len:NaN},e.createPlaylistLoader=function(){var t=this.config.pLoader,e=this.applyPlaylistData,r=t||this.config.loader;return function(){function t(t){this.loader=void 0,this.loader=new r(t)}var i=t.prototype;return i.destroy=function(){this.loader.destroy()},i.abort=function(){this.loader.abort()},i.load=function(t,r,i){e(t),this.loader.load(t,r,i)},a(t,[{key:"stats",get:function(){return this.loader.stats}},{key:"context",get:function(){return this.loader.context}}]),t}()},e.createFragmentLoader=function(){var t=this.config.fLoader,e=this.applyFragmentData,r=t||this.config.loader;return function(){function t(t){this.loader=void 0,this.loader=new r(t)}var i=t.prototype;return i.destroy=function(){this.loader.destroy()},i.abort=function(){this.loader.abort()},i.load=function(t,r,i){e(t),this.loader.load(t,r,i)},a(t,[{key:"stats",get:function(){return this.loader.stats}},{key:"context",get:function(){return this.loader.context}}]),t}()},t.uuid=function(){var t=URL.createObjectURL(new Blob),e=t.toString();return URL.revokeObjectURL(t),e.slice(e.lastIndexOf("/")+1)},t.serialize=function(t){for(var e,r=[],i=function(t){return!Number.isNaN(t)&&null!=t&&""!==t&&!1!==t},n=function(t){return Math.round(t)},a=function(t){return 100*n(t/100)},s={br:n,d:n,bl:a,dl:a,mtp:a,nor:function(t){return encodeURIComponent(t)},rtp:a,tb:n},o=v(Object.keys(t||{}).sort());!(e=o()).done;){var l=e.value,u=t[l];if(i(u)&&!("v"===l&&1===u||"pr"==l&&1===u)){var h=s[l];h&&(u=h(u));var d=typeof u,c=void 0;c="ot"===l||"sf"===l||"st"===l?l+"="+u:"boolean"===d?l:"number"===d?l+"="+u:l+"="+JSON.stringify(u),r.push(c)}}return r.join(",")},t.toHeaders=function(e){for(var r={},i=["Object","Request","Session","Status"],n=[{},{},{},{}],a={br:0,d:0,ot:0,tb:0,bl:1,dl:1,mtp:1,nor:1,nrr:1,su:1,cid:2,pr:2,sf:2,sid:2,st:2,v:2,bs:3,rtp:3},s=0,o=Object.keys(e);s1&&(this.updatePathwayPriority(i),r.resolved=this.pathwayId!==n)}},e.filterParsedLevels=function(t){this.levels=t;var e=this.getLevelsForPathway(this.pathwayId);if(0===e.length){var r=t[0].pathwayId;this.log("No levels found in Pathway "+this.pathwayId+'. Setting initial Pathway to "'+r+'"'),e=this.getLevelsForPathway(r),this.pathwayId=r}return e.length!==t.length?(this.log("Found "+e.length+"/"+t.length+' levels in Pathway "'+this.pathwayId+'"'),e):t},e.getLevelsForPathway=function(t){return null===this.levels?[]:this.levels.filter((function(e){return t===e.pathwayId}))},e.updatePathwayPriority=function(t){var e;this.pathwayPriority=t;var r=this.penalizedPathways,i=performance.now();Object.keys(r).forEach((function(t){i-r[t]>3e5&&delete r[t]}));for(var n=0;n0){this.log('Setting Pathway to "'+a+'"'),this.pathwayId=a,this.hls.trigger(S.LEVELS_UPDATED,{levels:e});var l=this.hls.levels[s];o&&l&&this.levels&&(l.attrs["STABLE-VARIANT-ID"]!==o.attrs["STABLE-VARIANT-ID"]&&l.bitrate!==o.bitrate&&this.log("Unstable Pathways change from bitrate "+o.bitrate+" to "+l.bitrate),this.hls.nextLoadLevel=s);break}}}},e.clonePathways=function(t){var e=this,r=this.levels;if(r){var i={},n={};t.forEach((function(t){var a=t.ID,s=t["BASE-ID"],l=t["URI-REPLACEMENT"];if(!r.some((function(t){return t.pathwayId===a}))){var u=e.getLevelsForPathway(s).map((function(t){var e=o({},t);e.details=void 0,e.url=Na(t.uri,t.attrs["STABLE-VARIANT-ID"],"PER-VARIANT-URIS",l);var r=new P(t.attrs);r["PATHWAY-ID"]=a;var s=r.AUDIO&&r.AUDIO+"_clone_"+a,u=r.SUBTITLES&&r.SUBTITLES+"_clone_"+a;s&&(i[r.AUDIO]=s,r.AUDIO=s),u&&(n[r.SUBTITLES]=u,r.SUBTITLES=u),e.attrs=r;var h=new Ne(e);return dr(h,"audio",s),dr(h,"text",u),h}));r.push.apply(r,u),Oa(e.audioTracks,i,l,a),Oa(e.subtitleTracks,n,l,a)}}))}},e.loadSteeringManifest=function(t){var e,r=this,i=this.hls.config,n=i.loader;this.loader&&this.loader.destroy(),this.loader=new n(i);try{e=new self.URL(t)}catch(e){return this.enabled=!1,void this.log("Failed to parse Steering Manifest URI: "+t)}if("data:"!==e.protocol){var a=0|(this.hls.bandwidthEstimate||i.abrEwmaDefaultEstimate);e.searchParams.set("_HLS_pathway",this.pathwayId),e.searchParams.set("_HLS_throughput",""+a)}var s={responseType:"json",url:e.href},o=i.steeringManifestLoadPolicy.default,l=o.errorRetry||o.timeoutRetry||{},u={loadPolicy:o,timeout:o.maxLoadTimeMs,maxRetry:l.maxNumRetry||0,retryDelay:l.retryDelayMs||0,maxRetryDelay:l.maxRetryDelayMs||0},h={onSuccess:function(t,i,n,a){r.log('Loaded steering manifest: "'+e+'"');var s=t.data;if(1===s.VERSION){r.updated=performance.now(),r.timeToLoad=s.TTL;var o=s["RELOAD-URI"],l=s["PATHWAY-CLONES"],u=s["PATHWAY-PRIORITY"];if(o)try{r.uri=new self.URL(o,e).href}catch(t){return r.enabled=!1,void r.log("Failed to parse Steering Manifest RELOAD-URI: "+o)}r.scheduleRefresh(r.uri||n.url),l&&r.clonePathways(l),u&&r.updatePathwayPriority(u)}else r.log("Steering VERSION "+s.VERSION+" not supported!")},onError:function(t,e,i,n){if(r.log("Error loading steering manifest: "+t.code+" "+t.text+" ("+e.url+")"),r.stopLoad(),410===t.code)return r.enabled=!1,void r.log("Steering manifest "+e.url+" no longer available");var a=1e3*r.timeToLoad;if(429!==t.code)r.scheduleRefresh(r.uri||e.url,a);else{var s=r.loader;if("function"==typeof(null==s?void 0:s.getResponseHeader)){var o=s.getResponseHeader("Retry-After");o&&(a=1e3*parseFloat(o))}r.log("Steering manifest "+e.url+" rate limited")}},onTimeout:function(t,e,i){r.log("Timeout loading steering manifest ("+e.url+")"),r.scheduleRefresh(r.uri||e.url)}};this.log("Requesting steering manifest: "+e),this.loader.load(s,u,h)},e.scheduleRefresh=function(t,e){var r=this;void 0===e&&(e=1e3*this.timeToLoad),self.clearTimeout(this.reloadTimer),this.reloadTimer=self.setTimeout((function(){r.loadSteeringManifest(t)}),e)},t}();function Oa(t,e,r,i){t&&Object.keys(e).forEach((function(n){var a=t.filter((function(t){return t.groupId===n})).map((function(t){var a=o({},t);return a.details=void 0,a.attrs=new P(a.attrs),a.url=a.attrs.URI=Na(t.url,t.attrs["STABLE-RENDITION-ID"],"PER-RENDITION-URIS",r),a.groupId=a.attrs["GROUP-ID"]=e[n],a.attrs["PATHWAY-ID"]=i,a}));t.push.apply(t,a)}))}function Na(t,e,r,i){var n,a=i.HOST,s=i.PARAMS,o=i[r];e&&(n=null==o?void 0:o[e])&&(t=n);var l=new self.URL(t);return a&&!n&&(l.host=a),s&&Object.keys(s).sort().forEach((function(t){t&&l.searchParams.set(t,s[t])})),l.href}var Ua=/^age:\s*[\d.]+\s*$/im,Ba=function(){function t(t){this.xhrSetup=void 0,this.requestTimeout=void 0,this.retryTimeout=void 0,this.retryDelay=void 0,this.config=null,this.callbacks=null,this.context=void 0,this.loader=null,this.stats=void 0,this.xhrSetup=t&&t.xhrSetup||null,this.stats=new M,this.retryDelay=0}var e=t.prototype;return e.destroy=function(){this.callbacks=null,this.abortInternal(),this.loader=null,this.config=null},e.abortInternal=function(){var t=this.loader;self.clearTimeout(this.requestTimeout),self.clearTimeout(this.retryTimeout),t&&(t.onreadystatechange=null,t.onprogress=null,4!==t.readyState&&(this.stats.aborted=!0,t.abort()))},e.abort=function(){var t;this.abortInternal(),null!=(t=this.callbacks)&&t.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.loader)},e.load=function(t,e,r){if(this.stats.loading.start)throw new Error("Loader can only be used once.");this.stats.loading.start=self.performance.now(),this.context=t,this.config=e,this.callbacks=r,this.loadInternal()},e.loadInternal=function(){var t=this,e=this.config,r=this.context;if(e){var i=this.loader=new self.XMLHttpRequest,n=this.stats;n.loading.first=0,n.loaded=0,n.aborted=!1;var a=this.xhrSetup;a?Promise.resolve().then((function(){if(!t.stats.aborted)return a(i,r.url)})).catch((function(t){return i.open("GET",r.url,!0),a(i,r.url)})).then((function(){t.stats.aborted||t.openAndSendXhr(i,r,e)})).catch((function(e){t.callbacks.onError({code:i.status,text:e.message},r,i,n)})):this.openAndSendXhr(i,r,e)}},e.openAndSendXhr=function(t,e,r){t.readyState||t.open("GET",e.url,!0);var i=this.context.headers,n=r.loadPolicy,a=n.maxTimeToFirstByteMs,s=n.maxLoadTimeMs;if(i)for(var o in i)t.setRequestHeader(o,i[o]);e.rangeEnd&&t.setRequestHeader("Range","bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),t.onreadystatechange=this.readystatechange.bind(this),t.onprogress=this.loadprogress.bind(this),t.responseType=e.responseType,self.clearTimeout(this.requestTimeout),r.timeout=a&&E(a)?a:s,this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),r.timeout),t.send()},e.readystatechange=function(){var t=this.context,e=this.loader,r=this.stats;if(t&&e){var i=e.readyState,n=this.config;if(!r.aborted&&i>=2&&(0===r.loading.first&&(r.loading.first=Math.max(self.performance.now(),r.loading.start),n.timeout!==n.loadPolicy.maxLoadTimeMs&&(self.clearTimeout(this.requestTimeout),n.timeout=n.loadPolicy.maxLoadTimeMs,this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),n.loadPolicy.maxLoadTimeMs-(r.loading.first-r.loading.start)))),4===i)){self.clearTimeout(this.requestTimeout),e.onreadystatechange=null,e.onprogress=null;var a=e.status,s="text"!==e.responseType;if(a>=200&&a<300&&(s&&e.response||null!==e.responseText)){r.loading.end=Math.max(self.performance.now(),r.loading.first);var o=s?e.response:e.responseText,l="arraybuffer"===e.responseType?o.byteLength:o.length;if(r.loaded=r.total=l,r.bwEstimate=8e3*r.total/(r.loading.end-r.loading.first),!this.callbacks)return;var u=this.callbacks.onProgress;if(u&&u(r,t,o,e),!this.callbacks)return;var h={url:e.responseURL,data:o,code:a};this.callbacks.onSuccess(h,r,t,e)}else{var d=n.loadPolicy.errorRetry;ze(d,r.retry,!1,a)?this.retry(d):(w.error(a+" while loading "+t.url),this.callbacks.onError({code:a,text:e.statusText},t,e,r))}}}},e.loadtimeout=function(){var t,e=null==(t=this.config)?void 0:t.loadPolicy.timeoutRetry;if(ze(e,this.stats.retry,!0))this.retry(e);else{w.warn("timeout while loading "+this.context.url);var r=this.callbacks;r&&(this.abortInternal(),r.onTimeout(this.stats,this.context,this.loader))}},e.retry=function(t){var e=this.context,r=this.stats;this.retryDelay=qe(t,r.retry),r.retry++,w.warn((status?"HTTP Status "+status:"Timeout")+" while loading "+e.url+", retrying "+r.retry+"/"+t.maxNumRetry+" in "+this.retryDelay+"ms"),this.abortInternal(),this.loader=null,self.clearTimeout(this.retryTimeout),this.retryTimeout=self.setTimeout(this.loadInternal.bind(this),this.retryDelay)},e.loadprogress=function(t){var e=this.stats;e.loaded=t.loaded,t.lengthComputable&&(e.total=t.total)},e.getCacheAge=function(){var t=null;if(this.loader&&Ua.test(this.loader.getAllResponseHeaders())){var e=this.loader.getResponseHeader("age");t=e?parseFloat(e):null}return t},e.getResponseHeader=function(t){return this.loader&&new RegExp("^"+t+":\\s*[\\d.]+\\s*$","im").test(this.loader.getAllResponseHeaders())?this.loader.getResponseHeader(t):null},t}(),Ga=/(\d+)-(\d+)\/(\d+)/,Ka=function(){function t(t){this.fetchSetup=void 0,this.requestTimeout=void 0,this.request=void 0,this.response=void 0,this.controller=void 0,this.context=void 0,this.config=null,this.callbacks=null,this.stats=void 0,this.loader=null,this.fetchSetup=t.fetchSetup||Ha,this.controller=new self.AbortController,this.stats=new M}var e=t.prototype;return e.destroy=function(){this.loader=this.callbacks=null,this.abortInternal()},e.abortInternal=function(){var t=this.response;null!=t&&t.ok||(this.stats.aborted=!0,this.controller.abort())},e.abort=function(){var t;this.abortInternal(),null!=(t=this.callbacks)&&t.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)},e.load=function(t,e,r){var i=this,n=this.stats;if(n.loading.start)throw new Error("Loader can only be used once.");n.loading.start=self.performance.now();var a=function(t,e){var r={method:"GET",mode:"cors",credentials:"same-origin",signal:e,headers:new self.Headers(o({},t.headers))};return t.rangeEnd&&r.headers.set("Range","bytes="+t.rangeStart+"-"+String(t.rangeEnd-1)),r}(t,this.controller.signal),s=r.onProgress,l="arraybuffer"===t.responseType,u=l?"byteLength":"length",h=e.loadPolicy,d=h.maxTimeToFirstByteMs,c=h.maxLoadTimeMs;this.context=t,this.config=e,this.callbacks=r,this.request=this.fetchSetup(t,a),self.clearTimeout(this.requestTimeout),e.timeout=d&&E(d)?d:c,this.requestTimeout=self.setTimeout((function(){i.abortInternal(),r.onTimeout(n,t,i.response)}),e.timeout),self.fetch(this.request).then((function(a){i.response=i.loader=a;var o=Math.max(self.performance.now(),n.loading.start);if(self.clearTimeout(i.requestTimeout),e.timeout=c,i.requestTimeout=self.setTimeout((function(){i.abortInternal(),r.onTimeout(n,t,i.response)}),c-(o-n.loading.start)),!a.ok){var u=a.status,h=a.statusText;throw new Va(h||"fetch, bad network response",u,a)}return n.loading.first=o,n.total=function(t){var e=t.get("Content-Range");if(e){var r=function(t){var e=Ga.exec(t);if(e)return parseInt(e[2])-parseInt(e[1])+1}(e);if(E(r))return r}var i=t.get("Content-Length");if(i)return parseInt(i)}(a.headers)||n.total,s&&E(e.highWaterMark)?i.loadProgressively(a,n,t,e.highWaterMark,s):l?a.arrayBuffer():"json"===t.responseType?a.json():a.text()})).then((function(a){var o=i.response;self.clearTimeout(i.requestTimeout),n.loading.end=Math.max(self.performance.now(),n.loading.first);var l=a[u];l&&(n.loaded=n.total=l);var h={url:o.url,data:a,code:o.status};s&&!E(e.highWaterMark)&&s(n,t,a,o),r.onSuccess(h,n,t,o)})).catch((function(e){if(self.clearTimeout(i.requestTimeout),!n.aborted){var a=e&&e.code||0,s=e?e.message:null;r.onError({code:a,text:s},t,e?e.details:null,n)}}))},e.getCacheAge=function(){var t=null;if(this.response){var e=this.response.headers.get("age");t=e?parseFloat(e):null}return t},e.getResponseHeader=function(t){return this.response?this.response.headers.get(t):null},e.loadProgressively=function(t,e,r,i,n){void 0===i&&(i=0);var a=new mn,s=t.body.getReader();return function o(){return s.read().then((function(s){if(s.done)return a.dataLength&&n(e,r,a.flush(),t),Promise.resolve(new ArrayBuffer(0));var l=s.value,u=l.length;return e.loaded+=u,u=i&&n(e,r,a.flush(),t)):n(e,r,l,t),o()})).catch((function(){return Promise.reject()}))}()},t}();function Ha(t,e){return new self.Request(t.url,e)}var Va=function(t){function e(e,r,i){var n;return(n=t.call(this,e)||this).code=void 0,n.details=void 0,n.code=r,n.details=i,n}return l(e,t),e}(f(Error)),Ya=/\s/,Wa=i(i({autoStartLoad:!0,startPosition:-1,defaultAudioCodec:void 0,debug:!1,capLevelOnFPSDrop:!1,capLevelToPlayerSize:!1,ignoreDevicePixelRatio:!1,initialLiveManifestSize:1,maxBufferLength:30,backBufferLength:1/0,maxBufferSize:6e7,maxBufferHole:.1,highBufferWatchdogPeriod:2,nudgeOffset:.1,nudgeMaxRetry:3,maxFragLookUpTolerance:.25,liveSyncDurationCount:3,liveMaxLatencyDurationCount:1/0,liveSyncDuration:void 0,liveMaxLatencyDuration:void 0,maxLiveSyncPlaybackRate:1,liveDurationInfinity:!1,liveBackBufferLength:null,maxMaxBufferLength:600,enableWorker:!0,workerPath:null,enableSoftwareAES:!0,startLevel:void 0,startFragPrefetch:!1,fpsDroppedMonitoringPeriod:5e3,fpsDroppedMonitoringThreshold:.2,appendErrorMaxRetry:3,loader:Ba,fLoader:void 0,pLoader:void 0,xhrSetup:void 0,licenseXhrSetup:void 0,licenseResponseCallback:void 0,abrController:vn,bufferController:In,capLevelController:Ra,errorController:lr,fpsController:Aa,stretchShortVideoTrack:!1,maxAudioFramesDrift:1,forceKeyFrameOnDiscontinuity:!0,abrEwmaFastLive:3,abrEwmaSlowLive:9,abrEwmaFastVoD:3,abrEwmaSlowVoD:9,abrEwmaDefaultEstimate:5e5,abrBandWidthFactor:.95,abrBandWidthUpFactor:.7,abrMaxWithRealBitrate:!1,maxStarvationDelay:4,maxLoadingDelay:4,minAutoBitrate:0,emeEnabled:!1,widevineLicenseUrl:void 0,drmSystems:{},drmSystemOptions:{},requestMediaKeySystemAccessFunc:et,testBandwidth:!0,progressive:!1,lowLatencyMode:!0,cmcd:void 0,enableDateRangeMetadataCues:!0,enableEmsgMetadataCues:!0,enableID3MetadataCues:!0,certLoadPolicy:{default:{maxTimeToFirstByteMs:8e3,maxLoadTimeMs:2e4,timeoutRetry:null,errorRetry:null}},keyLoadPolicy:{default:{maxTimeToFirstByteMs:8e3,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:2e4,backoff:"linear"},errorRetry:{maxNumRetry:8,retryDelayMs:1e3,maxRetryDelayMs:2e4,backoff:"linear"}}},manifestLoadPolicy:{default:{maxTimeToFirstByteMs:1/0,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},playlistLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:2,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},fragLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:12e4,timeoutRetry:{maxNumRetry:4,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:6,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},steeringManifestLoadPolicy:{default:{maxTimeToFirstByteMs:1e4,maxLoadTimeMs:2e4,timeoutRetry:{maxNumRetry:2,retryDelayMs:0,maxRetryDelayMs:0},errorRetry:{maxNumRetry:1,retryDelayMs:1e3,maxRetryDelayMs:8e3}}},manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:1,manifestLoadingRetryDelay:1e3,manifestLoadingMaxRetryTimeout:64e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,levelLoadingMaxRetryTimeout:64e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingMaxRetryTimeout:64e3},{cueHandler:{newCue:function(t,e,r,i){for(var n,a,s,o,l,u=[],h=self.VTTCue||self.TextTrackCue,d=0;d=16?o--:o++;var g=ia(l.trim()),v=la(e,r,g);null!=t&&null!=(c=t.cues)&&c.getCueById(v)||((a=new h(e,r,g)).id=v,a.line=d+1,a.align="left",a.position=10+Math.min(80,10*Math.floor(8*o/32)),u.push(a))}return t&&u.length&&(u.sort((function(t,e){return"auto"===t.line||"auto"===e.line?0:t.line>8&&e.line>8?e.line-t.line:t.line-e.line})),u.forEach((function(e){return Se(t,e)}))),u}},enableWebVTT:!0,enableIMSC1:!0,enableCEA708Captions:!0,captionsTextTrack1Label:"English",captionsTextTrack1LanguageCode:"en",captionsTextTrack2Label:"Spanish",captionsTextTrack2LanguageCode:"es",captionsTextTrack3Label:"Unknown CC",captionsTextTrack3LanguageCode:"",captionsTextTrack4Label:"Unknown CC",captionsTextTrack4LanguageCode:"",renderTextTracksNatively:!0}),{},{subtitleStreamController:Sn,subtitleTrackController:Rn,timelineController:Sa,audioStreamController:pn,audioTrackController:yn,emeController:ba,cmcdController:Fa,contentSteeringController:Ma});function ja(t){return t&&"object"==typeof t?Array.isArray(t)?t.map(ja):Object.keys(t).reduce((function(e,r){return e[r]=ja(t[r]),e}),{}):t}function qa(t){var e=t.loader;e!==Ka&&e!==Ba?(w.log("[config]: Custom loader detected, cannot enable progressive streaming"),t.progressive=!1):function(){if(self.fetch&&self.AbortController&&self.ReadableStream&&self.Request)try{return new self.ReadableStream({}),!0}catch(t){}return!1}()&&(t.loader=Ka,t.progressive=!0,t.enableSoftwareAES=!0,w.log("[config]: Progressive streaming enabled, using FetchLoader"))}var Xa=function(){function t(e){void 0===e&&(e={}),this.config=void 0,this.userConfig=void 0,this.coreComponents=void 0,this.networkControllers=void 0,this._emitter=new an,this._autoLevelCapping=void 0,this._maxHdcpLevel=null,this.abrController=void 0,this.bufferController=void 0,this.capLevelController=void 0,this.latencyController=void 0,this.levelController=void 0,this.streamController=void 0,this.audioTrackController=void 0,this.subtitleTrackController=void 0,this.emeController=void 0,this.cmcdController=void 0,this._media=null,this.url=null,I(e.debug||!1,"Hls instance");var r=this.config=function(t,e){if((e.liveSyncDurationCount||e.liveMaxLatencyDurationCount)&&(e.liveSyncDuration||e.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");if(void 0!==e.liveMaxLatencyDurationCount&&(void 0===e.liveSyncDurationCount||e.liveMaxLatencyDurationCount<=e.liveSyncDurationCount))throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"');if(void 0!==e.liveMaxLatencyDuration&&(void 0===e.liveSyncDuration||e.liveMaxLatencyDuration<=e.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"');var r=ja(t),n=["TimeOut","MaxRetry","RetryDelay","MaxRetryTimeout"];return["manifest","level","frag"].forEach((function(t){var i=("level"===t?"playlist":t)+"LoadPolicy",a=void 0===e[i],s=[];n.forEach((function(n){var o=t+"Loading"+n,l=e[o];if(void 0!==l&&a){s.push(o);var u=r[i].default;switch(e[i]={default:u},n){case"TimeOut":u.maxLoadTimeMs=l,u.maxTimeToFirstByteMs=l;break;case"MaxRetry":u.errorRetry.maxNumRetry=l,u.timeoutRetry.maxNumRetry=l;break;case"RetryDelay":u.errorRetry.retryDelayMs=l,u.timeoutRetry.retryDelayMs=l;break;case"MaxRetryTimeout":u.errorRetry.maxRetryDelayMs=l,u.timeoutRetry.maxRetryDelayMs=l}}})),s.length&&w.warn('hls.js config: "'+s.join('", "')+'" setting(s) are deprecated, use "'+i+'": '+JSON.stringify(e[i]))})),i(i({},r),e)}(t.DefaultConfig,e);this.userConfig=e,this._autoLevelCapping=-1,r.progressive&&qa(r);var n=r.abrController,a=r.bufferController,s=r.capLevelController,o=r.errorController,l=r.fpsController,u=new o(this),h=this.abrController=new n(this),d=this.bufferController=new a(this),c=this.capLevelController=new s(this),f=new l(this),g=new Te(this),v=new Ce(this),m=r.contentSteeringController,p=m?new m(this):null,y=this.levelController=new hr(this,p),T=new pr(this),E=new kr(this.config),L=this.streamController=new cn(this,T,E);c.setStreamController(L),f.setStreamController(L);var R=[g,y,L];p&&R.splice(1,0,p),this.networkControllers=R;var A=[h,d,c,f,v,T];this.audioTrackController=this.createController(r.audioTrackController,R);var k=r.audioStreamController;k&&R.push(new k(this,T,E)),this.subtitleTrackController=this.createController(r.subtitleTrackController,R);var b=r.subtitleStreamController;b&&R.push(new b(this,T,E)),this.createController(r.timelineController,A),E.emeController=this.emeController=this.createController(r.emeController,A),this.cmcdController=this.createController(r.cmcdController,A),this.latencyController=this.createController(_e,A),this.coreComponents=A,R.push(u);var D=u.onErrorOut;"function"==typeof D&&this.on(S.ERROR,D,u)}t.isSupported=function(){return function(){var t=qt();if(!t)return!1;var e=Zr(),r=t&&"function"==typeof t.isTypeSupported&&t.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),i=!e||e.prototype&&"function"==typeof e.prototype.appendBuffer&&"function"==typeof e.prototype.remove;return!!r&&!!i}()};var e=t.prototype;return e.createController=function(t,e){if(t){var r=new t(this);return e&&e.push(r),r}return null},e.on=function(t,e,r){void 0===r&&(r=this),this._emitter.on(t,e,r)},e.once=function(t,e,r){void 0===r&&(r=this),this._emitter.once(t,e,r)},e.removeAllListeners=function(t){this._emitter.removeAllListeners(t)},e.off=function(t,e,r,i){void 0===r&&(r=this),this._emitter.off(t,e,r,i)},e.listeners=function(t){return this._emitter.listeners(t)},e.emit=function(t,e,r){return this._emitter.emit(t,e,r)},e.trigger=function(t,e){if(this.config.debug)return this.emit(t,t,e);try{return this.emit(t,t,e)}catch(e){w.error("An internal error happened while handling event "+t+'. Error message: "'+e.message+'". Here is a stacktrace:',e),this.trigger(S.ERROR,{type:L.OTHER_ERROR,details:R.INTERNAL_EXCEPTION,fatal:!1,event:t,error:e})}return!1},e.listenerCount=function(t){return this._emitter.listenerCount(t)},e.destroy=function(){w.log("destroy"),this.trigger(S.DESTROYING,void 0),this.detachMedia(),this.removeAllListeners(),this._autoLevelCapping=-1,this.url=null,this.networkControllers.forEach((function(t){return t.destroy()})),this.networkControllers.length=0,this.coreComponents.forEach((function(t){return t.destroy()})),this.coreComponents.length=0;var t=this.config;t.xhrSetup=t.fetchSetup=void 0,this.userConfig=null},e.attachMedia=function(t){w.log("attachMedia"),this._media=t,this.trigger(S.MEDIA_ATTACHING,{media:t})},e.detachMedia=function(){w.log("detachMedia"),this.trigger(S.MEDIA_DETACHING,void 0),this._media=null},e.loadSource=function(t){this.stopLoad();var e=this.media,r=this.url,i=this.url=T.buildAbsoluteURL(self.location.href,t,{alwaysNormalize:!0});w.log("loadSource:"+i),e&&r&&(r!==i||this.bufferController.hasSourceTypes())&&(this.detachMedia(),this.attachMedia(e)),this.trigger(S.MANIFEST_LOADING,{url:t})},e.startLoad=function(t){void 0===t&&(t=-1),w.log("startLoad("+t+")"),this.networkControllers.forEach((function(e){e.startLoad(t)}))},e.stopLoad=function(){w.log("stopLoad"),this.networkControllers.forEach((function(t){t.stopLoad()}))},e.swapAudioCodec=function(){w.log("swapAudioCodec"),this.streamController.swapAudioCodec()},e.recoverMediaError=function(){w.log("recoverMediaError");var t=this._media;this.detachMedia(),t&&this.attachMedia(t)},e.removeLevel=function(t,e){void 0===e&&(e=0),this.levelController.removeLevel(t,e)},a(t,[{key:"levels",get:function(){var t=this.levelController.levels;return t||[]}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(t){w.log("set currentLevel:"+t),this.loadLevel=t,this.abrController.clearTimer(),this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(t){w.log("set nextLevel:"+t),this.levelController.manualLevel=t,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(t){w.log("set loadLevel:"+t),this.levelController.manualLevel=t}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(t){this.levelController.nextLoadLevel=t}},{key:"firstLevel",get:function(){return Math.max(this.levelController.firstLevel,this.minAutoLevel)},set:function(t){w.log("set firstLevel:"+t),this.levelController.firstLevel=t}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(t){w.log("set startLevel:"+t),-1!==t&&(t=Math.max(t,this.minAutoLevel)),this.levelController.startLevel=t}},{key:"capLevelToPlayerSize",get:function(){return this.config.capLevelToPlayerSize},set:function(t){var e=!!t;e!==this.config.capLevelToPlayerSize&&(e?this.capLevelController.startCapping():(this.capLevelController.stopCapping(),this.autoLevelCapping=-1,this.streamController.nextLevelSwitch()),this.config.capLevelToPlayerSize=e)}},{key:"autoLevelCapping",get:function(){return this._autoLevelCapping},set:function(t){this._autoLevelCapping!==t&&(w.log("set autoLevelCapping:"+t),this._autoLevelCapping=t)}},{key:"bandwidthEstimate",get:function(){var t=this.abrController.bwEstimator;return t?t.getEstimate():NaN}},{key:"ttfbEstimate",get:function(){var t=this.abrController.bwEstimator;return t?t.getEstimateTTFB():NaN}},{key:"maxHdcpLevel",get:function(){return this._maxHdcpLevel},set:function(t){Pe.indexOf(t)>-1&&(this._maxHdcpLevel=t)}},{key:"autoLevelEnabled",get:function(){return-1===this.levelController.manualLevel}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}},{key:"minAutoLevel",get:function(){var t=this.levels,e=this.config.minAutoBitrate;if(!t)return 0;for(var r=t.length,i=0;i=e)return i;return 0}},{key:"maxAutoLevel",get:function(){var t,e=this.levels,r=this.autoLevelCapping,i=this.maxHdcpLevel;if(t=-1===r&&e&&e.length?e.length-1:r,i)for(var n=t;n--;){var a=e[n].attrs["HDCP-LEVEL"];if(a&&a<=i)return n}return t}},{key:"nextAutoLevel",get:function(){return Math.min(Math.max(this.abrController.nextAutoLevel,this.minAutoLevel),this.maxAutoLevel)},set:function(t){this.abrController.nextAutoLevel=Math.max(this.minAutoLevel,t)}},{key:"playingDate",get:function(){return this.streamController.currentProgramDateTime}},{key:"mainForwardBufferInfo",get:function(){return this.streamController.getMainFwdBufferInfo()}},{key:"audioTracks",get:function(){var t=this.audioTrackController;return t?t.audioTracks:[]}},{key:"audioTrack",get:function(){var t=this.audioTrackController;return t?t.audioTrack:-1},set:function(t){var e=this.audioTrackController;e&&(e.audioTrack=t)}},{key:"subtitleTracks",get:function(){var t=this.subtitleTrackController;return t?t.subtitleTracks:[]}},{key:"subtitleTrack",get:function(){var t=this.subtitleTrackController;return t?t.subtitleTrack:-1},set:function(t){var e=this.subtitleTrackController;e&&(e.subtitleTrack=t)}},{key:"media",get:function(){return this._media}},{key:"subtitleDisplay",get:function(){var t=this.subtitleTrackController;return!!t&&t.subtitleDisplay},set:function(t){var e=this.subtitleTrackController;e&&(e.subtitleDisplay=t)}},{key:"lowLatencyMode",get:function(){return this.config.lowLatencyMode},set:function(t){this.config.lowLatencyMode=t}},{key:"liveSyncPosition",get:function(){return this.latencyController.liveSyncPosition}},{key:"latency",get:function(){return this.latencyController.latency}},{key:"maxLatency",get:function(){return this.latencyController.maxLatency}},{key:"targetLatency",get:function(){return this.latencyController.targetLatency}},{key:"drift",get:function(){return this.latencyController.drift}},{key:"forceStartLoad",get:function(){return this.streamController.forceStartLoad}}],[{key:"version",get:function(){return"1.4.12"}},{key:"Events",get:function(){return S}},{key:"ErrorTypes",get:function(){return L}},{key:"ErrorDetails",get:function(){return R}},{key:"DefaultConfig",get:function(){return t.defaultConfig?t.defaultConfig:Wa},set:function(e){t.defaultConfig=e}}]),t}();return Xa.defaultConfig=void 0,Xa},"object"==typeof exports&&"undefined"!=typeof module?module.exports=i():"function"==typeof define&&define.amd?define(i):(r="undefined"!=typeof globalThis?globalThis:r||self).Hls=i()}(!1); +//# sourceMappingURL=hls.min.js.map diff --git a/web/vendor/mpegts.min.js b/web/vendor/mpegts.min.js new file mode 100644 index 0000000..fce1774 --- /dev/null +++ b/web/vendor/mpegts.min.js @@ -0,0 +1,15 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/mpegts.js@1.7.3/dist/mpegts.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.mpegts=t():e.mpegts=t()}(window,(function(){return function(e){var t={};function i(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,i),a.l=!0,a.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var a in e)i.d(n,a,function(t){return e[t]}.bind(null,a));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=14)}([function(e,t,i){"use strict";var n=i(6),a=i.n(n),r=function(){function e(){}return e.e=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","error",n),e.ENABLE_ERROR&&(console.error?console.error(n):console.warn?console.warn(n):console.log(n))},e.i=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","info",n),e.ENABLE_INFO&&(console.info?console.info(n):console.log(n))},e.w=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","warn",n),e.ENABLE_WARN&&(console.warn?console.warn(n):console.log(n))},e.d=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","debug",n),e.ENABLE_DEBUG&&(console.debug?console.debug(n):console.log(n))},e.v=function(t,i){t&&!e.FORCE_GLOBAL_TAG||(t=e.GLOBAL_TAG);var n="["+t+"] > "+i;e.ENABLE_CALLBACK&&e.emitter.emit("log","verbose",n),e.ENABLE_VERBOSE&&console.log(n)},e}();r.GLOBAL_TAG="mpegts.js",r.FORCE_GLOBAL_TAG=!1,r.ENABLE_ERROR=!0,r.ENABLE_INFO=!0,r.ENABLE_WARN=!0,r.ENABLE_DEBUG=!0,r.ENABLE_VERBOSE=!0,r.ENABLE_CALLBACK=!1,r.emitter=new a.a,t.a=r},function(e,t,i){"use strict";t.a={IO_ERROR:"io_error",DEMUX_ERROR:"demux_error",INIT_SEGMENT:"init_segment",MEDIA_SEGMENT:"media_segment",LOADING_COMPLETE:"loading_complete",RECOVERED_EARLY_EOF:"recovered_early_eof",MEDIA_INFO:"media_info",METADATA_ARRIVED:"metadata_arrived",SCRIPTDATA_ARRIVED:"scriptdata_arrived",TIMED_ID3_METADATA_ARRIVED:"timed_id3_metadata_arrived",SMPTE2038_METADATA_ARRIVED:"smpte2038_metadata_arrived",SCTE35_METADATA_ARRIVED:"scte35_metadata_arrived",PES_PRIVATE_DATA_DESCRIPTOR:"pes_private_data_descriptor",PES_PRIVATE_DATA_ARRIVED:"pes_private_data_arrived",STATISTICS_INFO:"statistics_info",RECOMMEND_SEEKPOINT:"recommend_seekpoint"}},function(e,t,i){"use strict";i.d(t,"c",(function(){return a})),i.d(t,"b",(function(){return r})),i.d(t,"a",(function(){return s}));var n=i(3),a={kIdle:0,kConnecting:1,kBuffering:2,kError:3,kComplete:4},r={OK:"OK",EXCEPTION:"Exception",HTTP_STATUS_CODE_INVALID:"HttpStatusCodeInvalid",CONNECTING_TIMEOUT:"ConnectingTimeout",EARLY_EOF:"EarlyEof",UNRECOVERABLE_EARLY_EOF:"UnrecoverableEarlyEof"},s=function(){function e(e){this._type=e||"undefined",this._status=a.kIdle,this._needStash=!1,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null}return e.prototype.destroy=function(){this._status=a.kIdle,this._onContentLengthKnown=null,this._onURLRedirect=null,this._onDataArrival=null,this._onError=null,this._onComplete=null},e.prototype.isWorking=function(){return this._status===a.kConnecting||this._status===a.kBuffering},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"status",{get:function(){return this._status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"needStashBuffer",{get:function(){return this._needStash},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onContentLengthKnown",{get:function(){return this._onContentLengthKnown},set:function(e){this._onContentLengthKnown=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onURLRedirect",{get:function(){return this._onURLRedirect},set:function(e){this._onURLRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),e.prototype.open=function(e,t){throw new n.c("Unimplemented abstract function!")},e.prototype.abort=function(){throw new n.c("Unimplemented abstract function!")},e}()},function(e,t,i){"use strict";i.d(t,"d",(function(){return r})),i.d(t,"a",(function(){return s})),i.d(t,"b",(function(){return o})),i.d(t,"c",(function(){return d}));var n,a=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),r=function(){function e(e){this._message=e}return Object.defineProperty(e.prototype,"name",{get:function(){return"RuntimeException"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"message",{get:function(){return this._message},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return this.name+": "+this.message},e}(),s=function(e){function t(t){return e.call(this,t)||this}return a(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"IllegalStateException"},enumerable:!1,configurable:!0}),t}(r),o=function(e){function t(t){return e.call(this,t)||this}return a(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"InvalidArgumentException"},enumerable:!1,configurable:!0}),t}(r),d=function(e){function t(t){return e.call(this,t)||this}return a(t,e),Object.defineProperty(t.prototype,"name",{get:function(){return"NotImplementedException"},enumerable:!1,configurable:!0}),t}(r)},function(e,t,i){"use strict";var n={};!function(){var e=self.navigator.userAgent.toLowerCase(),t=/(edge)\/([\w.]+)/.exec(e)||/(opr)[\/]([\w.]+)/.exec(e)||/(chrome)[ \/]([\w.]+)/.exec(e)||/(iemobile)[\/]([\w.]+)/.exec(e)||/(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(firefox)[ \/]([\w.]+)/.exec(e)||[],i=/(ipad)/.exec(e)||/(ipod)/.exec(e)||/(windows phone)/.exec(e)||/(iphone)/.exec(e)||/(kindle)/.exec(e)||/(android)/.exec(e)||/(windows)/.exec(e)||/(mac)/.exec(e)||/(linux)/.exec(e)||/(cros)/.exec(e)||[],a={browser:t[5]||t[3]||t[1]||"",version:t[2]||t[4]||"0",majorVersion:t[4]||t[2]||"0",platform:i[0]||""},r={};if(a.browser){r[a.browser]=!0;var s=a.majorVersion.split(".");r.version={major:parseInt(a.majorVersion,10),string:a.version},s.length>1&&(r.version.minor=parseInt(s[1],10)),s.length>2&&(r.version.build=parseInt(s[2],10))}if(a.platform&&(r[a.platform]=!0),(r.chrome||r.opr||r.safari)&&(r.webkit=!0),r.rv||r.iemobile){r.rv&&delete r.rv;a.browser="msie",r.msie=!0}if(r.edge){delete r.edge;a.browser="msedge",r.msedge=!0}if(r.opr){a.browser="opera",r.opera=!0}if(r.safari&&r.android){a.browser="android",r.android=!0}for(var o in r.name=a.browser,r.platform=a.platform,n)n.hasOwnProperty(o)&&delete n[o];Object.assign(n,r)}(),t.a=n},function(e,t,i){"use strict";t.a={OK:"OK",FORMAT_ERROR:"FormatError",FORMAT_UNSUPPORTED:"FormatUnsupported",CODEC_UNSUPPORTED:"CodecUnsupported"}},function(e,t,i){"use strict";var n,a="object"==typeof Reflect?Reflect:null,r=a&&"function"==typeof a.apply?a.apply:function(e,t,i){return Function.prototype.apply.call(e,t,i)};n=a&&"function"==typeof a.ownKeys?a.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function o(){o.init.call(this)}e.exports=o,e.exports.once=function(e,t){return new Promise((function(i,n){function a(i){e.removeListener(t,r),n(i)}function r(){"function"==typeof e.removeListener&&e.removeListener("error",a),i([].slice.call(arguments))}g(e,t,r,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&g(e,"error",t,i)}(e,a,{once:!0})}))},o.EventEmitter=o,o.prototype._events=void 0,o.prototype._eventsCount=0,o.prototype._maxListeners=void 0;var d=10;function _(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function h(e){return void 0===e._maxListeners?o.defaultMaxListeners:e._maxListeners}function c(e,t,i,n){var a,r,s,o;if(_(i),void 0===(r=e._events)?(r=e._events=Object.create(null),e._eventsCount=0):(void 0!==r.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),r=e._events),s=r[t]),void 0===s)s=r[t]=i,++e._eventsCount;else if("function"==typeof s?s=r[t]=n?[i,s]:[s,i]:n?s.unshift(i):s.push(i),(a=h(e))>0&&s.length>a&&!s.warned){s.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=s.length,o=d,console&&console.warn&&console.warn(o)}return e}function u(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function l(e,t,i){var n={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},a=u.bind(n);return a.listener=i,n.wrapFn=a,a}function f(e,t,i){var n=e._events;if(void 0===n)return[];var a=n[t];return void 0===a?[]:"function"==typeof a?i?[a.listener||a]:[a]:i?function(e){for(var t=new Array(e.length),i=0;i0&&(s=t[0]),s instanceof Error)throw s;var o=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw o.context=s,o}var d=a[e];if(void 0===d)return!1;if("function"==typeof d)r(d,this,t);else{var _=d.length,h=m(d,_);for(i=0;i<_;++i)r(h[i],this,t)}return!0},o.prototype.addListener=function(e,t){return c(this,e,t,!1)},o.prototype.on=o.prototype.addListener,o.prototype.prependListener=function(e,t){return c(this,e,t,!0)},o.prototype.once=function(e,t){return _(t),this.on(e,l(this,e,t)),this},o.prototype.prependOnceListener=function(e,t){return _(t),this.prependListener(e,l(this,e,t)),this},o.prototype.removeListener=function(e,t){var i,n,a,r,s;if(_(t),void 0===(n=this._events))return this;if(void 0===(i=n[e]))return this;if(i===t||i.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(a=-1,r=i.length-1;r>=0;r--)if(i[r]===t||i[r].listener===t){s=i[r].listener,a=r;break}if(a<0)return this;0===a?i.shift():function(e,t){for(;t+1=0;n--)this.removeListener(e,t[n]);return this},o.prototype.listeners=function(e){return f(this,e,!0)},o.prototype.rawListeners=function(e){return f(this,e,!1)},o.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):p.call(e,t)},o.prototype.listenerCount=p,o.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]}},function(e,t,i){"use strict";i.d(t,"d",(function(){return n})),i.d(t,"b",(function(){return a})),i.d(t,"a",(function(){return r})),i.d(t,"c",(function(){return s}));var n=function(e,t,i,n,a){this.dts=e,this.pts=t,this.duration=i,this.originalDts=n,this.isSyncPoint=a,this.fileposition=null},a=function(){function e(){this.beginDts=0,this.endDts=0,this.beginPts=0,this.endPts=0,this.originalBeginDts=0,this.originalEndDts=0,this.syncPoints=[],this.firstSample=null,this.lastSample=null}return e.prototype.appendSyncPoint=function(e){e.isSyncPoint=!0,this.syncPoints.push(e)},e}(),r=function(){function e(){this._list=[]}return e.prototype.clear=function(){this._list=[]},e.prototype.appendArray=function(e){var t=this._list;0!==e.length&&(t.length>0&&e[0].originalDts=t[a].dts&&et[n].lastSample.originalDts&&e=t[n].lastSample.originalDts&&(n===t.length-1||n0&&(a=this._searchNearestSegmentBefore(i.originalBeginDts)+1),this._lastAppendLocation=a,this._list.splice(a,0,i)},e.prototype.getLastSegmentBefore=function(e){var t=this._searchNearestSegmentBefore(e);return t>=0?this._list[t]:null},e.prototype.getLastSampleBefore=function(e){var t=this.getLastSegmentBefore(e);return null!=t?t.lastSample:null},e.prototype.getLastSyncPointBefore=function(e){for(var t=this._searchNearestSegmentBefore(e),i=this._list[t].syncPoints;0===i.length&&t>0;)t--,i=this._list[t].syncPoints;return i.length>0?i[i.length-1]:null},e}()},function(e,t,i){"use strict";var n=function(){function e(){this.mimeType=null,this.duration=null,this.hasAudio=null,this.hasVideo=null,this.audioCodec=null,this.videoCodec=null,this.audioDataRate=null,this.videoDataRate=null,this.audioSampleRate=null,this.audioChannelCount=null,this.width=null,this.height=null,this.fps=null,this.profile=null,this.level=null,this.refFrames=null,this.chromaFormat=null,this.sarNum=null,this.sarDen=null,this.metadata=null,this.segments=null,this.segmentCount=null,this.hasKeyframesIndex=null,this.keyframesIndex=null}return e.prototype.isComplete=function(){var e=!1===this.hasAudio||!0===this.hasAudio&&null!=this.audioCodec&&null!=this.audioSampleRate&&null!=this.audioChannelCount,t=!1===this.hasVideo||!0===this.hasVideo&&null!=this.videoCodec&&null!=this.width&&null!=this.height&&null!=this.fps&&null!=this.profile&&null!=this.level&&null!=this.refFrames&&null!=this.chromaFormat&&null!=this.sarNum&&null!=this.sarDen;return null!=this.mimeType&&e&&t},e.prototype.isSeekable=function(){return!0===this.hasKeyframesIndex},e.prototype.getNearestKeyframe=function(e){if(null==this.keyframesIndex)return null;var t=this.keyframesIndex,i=this._search(t.times,e);return{index:i,milliseconds:t.times[i],fileposition:t.filepositions[i]}},e.prototype._search=function(e,t){var i=0,n=e.length-1,a=0,r=0,s=n;for(t=e[a]&&t0){var i=e.getConfig();t.emit("change",i)}},e.registerListener=function(t){e.emitter.addListener("change",t)},e.removeListener=function(t){e.emitter.removeListener("change",t)},e.addLogListener=function(t){r.a.emitter.addListener("log",t),r.a.emitter.listenerCount("log")>0&&(r.a.ENABLE_CALLBACK=!0,e._notifyChange())},e.removeLogListener=function(t){r.a.emitter.removeListener("log",t),0===r.a.emitter.listenerCount("log")&&(r.a.ENABLE_CALLBACK=!1,e._notifyChange())},e}();s.emitter=new a.a,t.a=s},function(e,t,i){"use strict";var n=i(6),a=i.n(n),r=i(0),s=i(4),o=i(8);function d(e,t,i){var n=e;if(t+i=128){t.push(String.fromCharCode(65535&r)),n+=2;continue}}else if(i[n]<240){if(d(i,n,2))if((r=(15&i[n])<<12|(63&i[n+1])<<6|63&i[n+2])>=2048&&55296!=(63488&r)){t.push(String.fromCharCode(65535&r)),n+=3;continue}}else if(i[n]<248){var r;if(d(i,n,3))if((r=(7&i[n])<<18|(63&i[n+1])<<12|(63&i[n+2])<<6|63&i[n+3])>65536&&r<1114112){r-=65536,t.push(String.fromCharCode(r>>>10|55296)),t.push(String.fromCharCode(1023&r|56320)),n+=4;continue}}t.push(String.fromCharCode(65533)),++n}return t.join("")},c=i(3),u=(_=new ArrayBuffer(2),new DataView(_).setInt16(0,256,!0),256===new Int16Array(_)[0]),l=function(){function e(){}return e.parseScriptData=function(t,i,n){var a={};try{var s=e.parseValue(t,i,n),o=e.parseValue(t,i+s.size,n-s.size);a[s.data]=o.data}catch(e){r.a.e("AMF",e.toString())}return a},e.parseObject=function(t,i,n){if(n<3)throw new c.a("Data not enough when parse ScriptDataObject");var a=e.parseString(t,i,n),r=e.parseValue(t,i+a.size,n-a.size),s=r.objectEnd;return{data:{name:a.data,value:r.data},size:a.size+r.size,objectEnd:s}},e.parseVariable=function(t,i,n){return e.parseObject(t,i,n)},e.parseString=function(e,t,i){if(i<2)throw new c.a("Data not enough when parse String");var n=new DataView(e,t,i).getUint16(0,!u);return{data:n>0?h(new Uint8Array(e,t+2,n)):"",size:2+n}},e.parseLongString=function(e,t,i){if(i<4)throw new c.a("Data not enough when parse LongString");var n=new DataView(e,t,i).getUint32(0,!u);return{data:n>0?h(new Uint8Array(e,t+4,n)):"",size:4+n}},e.parseDate=function(e,t,i){if(i<10)throw new c.a("Data size invalid when parse Date");var n=new DataView(e,t,i),a=n.getFloat64(0,!u),r=n.getInt16(8,!u);return{data:new Date(a+=60*r*1e3),size:10}},e.parseValue=function(t,i,n){if(n<1)throw new c.a("Data not enough when parse Value");var a,s=new DataView(t,i,n),o=1,d=s.getUint8(0),_=!1;try{switch(d){case 0:a=s.getFloat64(1,!u),o+=8;break;case 1:a=!!s.getUint8(1),o+=1;break;case 2:var h=e.parseString(t,i+1,n-1);a=h.data,o+=h.size;break;case 3:a={};var l=0;for(9==(16777215&s.getUint32(n-4,!u))&&(l=3);o32)throw new c.b("ExpGolomb: readBits() bits exceeded max 32bits!");if(e<=this._current_word_bits_left){var t=this._current_word>>>32-e;return this._current_word<<=e,this._current_word_bits_left-=e,t}var i=this._current_word_bits_left?this._current_word:0;i>>>=32-this._current_word_bits_left;var n=e-this._current_word_bits_left;this._fillCurrentWord();var a=Math.min(n,this._current_word_bits_left),r=this._current_word>>>32-a;return this._current_word<<=a,this._current_word_bits_left-=a,i=i<>>e))return this._current_word<<=e,this._current_word_bits_left-=e,e;return this._fillCurrentWord(),e+this._skipLeadingZero()},e.prototype.readUEG=function(){var e=this._skipLeadingZero();return this.readBits(e+1)-1},e.prototype.readSEG=function(){var e=this.readUEG();return 1&e?e+1>>>1:-1*(e>>>1)},e}(),p=function(){function e(){}return e._ebsp2rbsp=function(e){for(var t=e,i=t.byteLength,n=new Uint8Array(i),a=0,r=0;r=2&&3===t[r]&&0===t[r-1]&&0===t[r-2]||(n[a]=t[r],a++);return new Uint8Array(n.buffer,0,a)},e.parseSPS=function(t){for(var i=t.subarray(1,4),n="avc1.",a=0;a<3;a++){var r=i[a].toString(16);r.length<2&&(r="0"+r),n+=r}var s=e._ebsp2rbsp(t),o=new f(s);o.readByte();var d=o.readByte();o.readByte();var _=o.readByte();o.readUEG();var h=e.getProfileString(d),c=e.getLevelString(_),u=1,l=420,p=8,m=8;if((100===d||110===d||122===d||244===d||44===d||83===d||86===d||118===d||128===d||138===d||144===d)&&(3===(u=o.readUEG())&&o.readBits(1),u<=3&&(l=[0,420,422,444][u]),p=o.readUEG()+8,m=o.readUEG()+8,o.readBits(1),o.readBool()))for(var g=3!==u?8:12,v=0;v0&&M<16?(D=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][M-1],C=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][M-1]):255===M&&(D=o.readByte()<<8|o.readByte(),C=o.readByte()<<8|o.readByte())}if(o.readBool()&&o.readBool(),o.readBool()&&(o.readBits(4),o.readBool()&&o.readBits(24)),o.readBool()&&(o.readUEG(),o.readUEG()),o.readBool()){var x=o.readBits(32),U=o.readBits(32);I=o.readBool(),B=(O=U)/(P=2*x)}}var N=1;1===D&&1===C||(N=D/C);var G=0,V=0;0===u?(G=1,V=2-R):(G=3===u?1:2,V=(1===u?2:1)*(2-R));var F=16*(E+1),j=16*(A+1)*(2-R);F-=(T+L)*G,j-=(w+k)*V;var z=Math.ceil(F*N);return o.destroy(),o=null,{codec_mimetype:n,profile_idc:d,level_idc:_,profile_string:h,level_string:c,chroma_format_idc:u,bit_depth:p,bit_depth_luma:p,bit_depth_chroma:m,ref_frames:S,chroma_format:l,chroma_format_string:e.getChromaFormatString(l),frame_rate:{fixed:I,fps:B,fps_den:P,fps_num:O},sar_ratio:{width:D,height:C},codec_size:{width:F,height:j},present_size:{width:z,height:j}}},e._skipScalingList=function(e,t){for(var i=8,n=8,a=0;a=2&&3===t[r]&&0===t[r-1]&&0===t[r-2]||(n[a]=t[r],a++);return new Uint8Array(n.buffer,0,a)},e.parseVPS=function(t){var i=e._ebsp2rbsp(t),n=new f(i);n.readByte(),n.readByte();n.readBits(4);n.readBits(2);n.readBits(6);return{num_temporal_layers:n.readBits(3)+1,temporal_id_nested:n.readBool()}},e.parseSPS=function(t){var i=e._ebsp2rbsp(t),n=new f(i);n.readByte(),n.readByte();for(var a=0,r=0,s=0,o=0,d=(n.readBits(4),n.readBits(3)),_=(n.readBool(),n.readBits(2)),h=n.readBool(),c=n.readBits(5),u=n.readByte(),l=n.readByte(),p=n.readByte(),m=n.readByte(),g=n.readByte(),v=n.readByte(),y=n.readByte(),b=n.readByte(),S=n.readByte(),E=n.readByte(),A=n.readByte(),R=[],T=[],L=0;L0)for(L=d;L<8;L++)n.readBits(2);for(L=0;L1&&n.readSEG();for(L=0;L0&&Q<=16?(W=[1,12,10,16,40,24,20,32,80,18,15,64,160,4,3,2][Q-1],X=[1,11,11,11,33,11,11,11,33,11,11,33,99,3,2,1][Q-1]):255===Q&&(W=n.readBits(16),X=n.readBits(16))}if(n.readBool()&&n.readBool(),n.readBool())n.readBits(3),n.readBool(),n.readBool()&&(n.readByte(),n.readByte(),n.readByte());n.readBool()&&(n.readUEG(),n.readUEG());n.readBool(),n.readBool(),n.readBool();if(n.readBool()&&(n.readUEG(),n.readUEG(),n.readUEG(),n.readUEG()),n.readBool())if(J=n.readBits(32),Z=n.readBits(32),n.readBool())if(n.readUEG(),n.readBool()){var $=!1,ee=!1,te=!1;if($=n.readBool(),ee=n.readBool(),$||ee){(te=n.readBool())&&(n.readByte(),n.readBits(5),n.readBool(),n.readBits(5));n.readBits(4),n.readBits(4);te&&n.readBits(4),n.readBits(5),n.readBits(5),n.readBits(5)}for(L=0;L<=d;L++){var ie=n.readBool();Y=ie;var ne=!1,ae=1;ie||(ne=n.readBool());var re=!1;if(ne?n.readSEG():re=n.readBool(),re||(ae=n.readUEG()+1),$)for(V=0;V>>2!=0,s=0!=(1&t[4]),o=(n=t)[a=5]<<24|n[a+1]<<16|n[a+2]<<8|n[a+3];return o<9?i:{match:!0,consumed:o,dataOffset:o,hasAudioTrack:r,hasVideoTrack:s}},e.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},Object.defineProperty(e.prototype,"onTrackMetadata",{get:function(){return this._onTrackMetadata},set:function(e){this._onTrackMetadata=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaInfo",{get:function(){return this._onMediaInfo},set:function(e){this._onMediaInfo=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMetaDataArrived",{get:function(){return this._onMetaDataArrived},set:function(e){this._onMetaDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onScriptDataArrived",{get:function(){return this._onScriptDataArrived},set:function(e){this._onScriptDataArrived=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataAvailable",{get:function(){return this._onDataAvailable},set:function(e){this._onDataAvailable=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"timestampBase",{get:function(){return this._timestampBase},set:function(e){this._timestampBase=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedDuration",{get:function(){return this._duration},set:function(e){this._durationOverrided=!0,this._duration=e,this._mediaInfo.duration=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasAudio",{set:function(e){this._hasAudioFlagOverrided=!0,this._hasAudio=e,this._mediaInfo.hasAudio=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overridedHasVideo",{set:function(e){this._hasVideoFlagOverrided=!0,this._hasVideo=e,this._mediaInfo.hasVideo=e},enumerable:!1,configurable:!0}),e.prototype.resetMediaInfo=function(){this._mediaInfo=new o.a},e.prototype._isInitialMetadataDispatched=function(){return this._hasAudio&&this._hasVideo?this._audioInitialMetadataDispatched&&this._videoInitialMetadataDispatched:this._hasAudio&&!this._hasVideo?this._audioInitialMetadataDispatched:!(this._hasAudio||!this._hasVideo)&&this._videoInitialMetadataDispatched},e.prototype.parseChunks=function(t,i){if(!(this._onError&&this._onMediaInfo&&this._onTrackMetadata&&this._onDataAvailable))throw new c.a("Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var n=0,a=this._littleEndian;if(0===i){if(!(t.byteLength>13))return 0;n=e.probe(t).dataOffset}this._firstParse&&(this._firstParse=!1,i+n!==this._dataOffset&&r.a.w(this.TAG,"First time parsing but chunk byteStart invalid!"),0!==(s=new DataView(t,n)).getUint32(0,!a)&&r.a.w(this.TAG,"PrevTagSize0 !== 0 !!!"),n+=4);for(;nt.byteLength)break;var o=s.getUint8(0),d=16777215&s.getUint32(0,!a);if(n+11+d+4>t.byteLength)break;if(8===o||9===o||18===o){var _=s.getUint8(4),h=s.getUint8(5),u=s.getUint8(6)|h<<8|_<<16|s.getUint8(7)<<24;0!==(16777215&s.getUint32(7,!a))&&r.a.w(this.TAG,"Meet tag which has StreamID != 0!");var l=n+11;switch(o){case 8:this._parseAudioData(t,l,d,u);break;case 9:this._parseVideoData(t,l,d,u,i+n);break;case 18:this._parseScriptData(t,l,d)}var f=s.getUint32(11+d,!a);f!==11+d&&r.a.w(this.TAG,"Invalid PrevTagSize "+f),n+=11+d+4}else r.a.w(this.TAG,"Unsupported tag type "+o+", skipped"),n+=11+d+4}return this._isInitialMetadataDispatched()&&this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack),n},e.prototype._parseScriptData=function(e,t,i){var n=l.parseScriptData(e,t,i);if(n.hasOwnProperty("onMetaData")){if(null==n.onMetaData||"object"!=typeof n.onMetaData)return void r.a.w(this.TAG,"Invalid onMetaData structure!");this._metadata&&r.a.w(this.TAG,"Found another onMetaData tag!"),this._metadata=n;var a=this._metadata.onMetaData;if(this._onMetaDataArrived&&this._onMetaDataArrived(Object.assign({},a)),"boolean"==typeof a.hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=a.hasAudio,this._mediaInfo.hasAudio=this._hasAudio),"boolean"==typeof a.hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=a.hasVideo,this._mediaInfo.hasVideo=this._hasVideo),"number"==typeof a.audiodatarate&&(this._mediaInfo.audioDataRate=a.audiodatarate),"number"==typeof a.videodatarate&&(this._mediaInfo.videoDataRate=a.videodatarate),"number"==typeof a.width&&(this._mediaInfo.width=a.width),"number"==typeof a.height&&(this._mediaInfo.height=a.height),"number"==typeof a.duration){if(!this._durationOverrided){var s=Math.floor(a.duration*this._timescale);this._duration=s,this._mediaInfo.duration=s}}else this._mediaInfo.duration=0;if("number"==typeof a.framerate){var o=Math.floor(1e3*a.framerate);if(o>0){var d=o/1e3;this._referenceFrameRate.fixed=!0,this._referenceFrameRate.fps=d,this._referenceFrameRate.fps_num=o,this._referenceFrameRate.fps_den=1e3,this._mediaInfo.fps=d}}if("object"==typeof a.keyframes){this._mediaInfo.hasKeyframesIndex=!0;var _=a.keyframes;this._mediaInfo.keyframesIndex=this._parseKeyframesIndex(_),a.keyframes=null}else this._mediaInfo.hasKeyframesIndex=!1;this._dispatch=!1,this._mediaInfo.metadata=a,r.a.v(this.TAG,"Parsed onMetaData"),this._mediaInfo.isComplete()&&this._onMediaInfo(this._mediaInfo)}Object.keys(n).length>0&&this._onScriptDataArrived&&this._onScriptDataArrived(Object.assign({},n))},e.prototype._parseKeyframesIndex=function(e){for(var t=[],i=[],n=1;n>>4;if(2===s||10===s){var o=0,d=(12&a)>>>2;if(d>=0&&d<=4){o=this._flvSoundRateTable[d];var _=1&a,h=this._audioMetadata,c=this._audioTrack;if(h||(!1===this._hasAudio&&!1===this._hasAudioFlagOverrided&&(this._hasAudio=!0,this._mediaInfo.hasAudio=!0),(h=this._audioMetadata={}).type="audio",h.id=c.id,h.timescale=this._timescale,h.duration=this._duration,h.audioSampleRate=o,h.channelCount=0===_?1:2),10===s){var u=this._parseAACAudioData(e,t+1,i-1);if(null==u)return;if(0===u.packetType){if(h.config){if(S(u.data.config,h.config))return;r.a.w(this.TAG,"AudioSpecificConfig has been changed, re-generate initialization segment")}var l=u.data;h.audioSampleRate=l.samplingRate,h.channelCount=l.channelCount,h.codec=l.codec,h.originalCodec=l.originalCodec,h.config=l.config,h.refSampleDuration=1024/h.audioSampleRate*h.timescale,r.a.v(this.TAG,"Parsed AudioSpecificConfig"),this._isInitialMetadataDispatched()?this._dispatch&&(this._audioTrack.length||this._videoTrack.length)&&this._onDataAvailable(this._audioTrack,this._videoTrack):this._audioInitialMetadataDispatched=!0,this._dispatch=!1,this._onTrackMetadata("audio",h),(g=this._mediaInfo).audioCodec=h.originalCodec,g.audioSampleRate=h.audioSampleRate,g.audioChannelCount=h.channelCount,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}else if(1===u.packetType){var f=this._timestampBase+n,p={unit:u.data,length:u.data.byteLength,dts:f,pts:f};c.samples.push(p),c.length+=u.data.length}else r.a.e(this.TAG,"Flv: Unsupported AAC data type "+u.packetType)}else if(2===s){if(!h.codec){var g;if(null==(l=this._parseMP3AudioData(e,t+1,i-1,!0)))return;h.audioSampleRate=l.samplingRate,h.channelCount=l.channelCount,h.codec=l.codec,h.originalCodec=l.originalCodec,h.refSampleDuration=1152/h.audioSampleRate*h.timescale,r.a.v(this.TAG,"Parsed MPEG Audio Frame Header"),this._audioInitialMetadataDispatched=!0,this._onTrackMetadata("audio",h),(g=this._mediaInfo).audioCodec=h.codec,g.audioSampleRate=h.audioSampleRate,g.audioChannelCount=h.channelCount,g.audioDataRate=l.bitRate,g.hasVideo?null!=g.videoCodec&&(g.mimeType='video/x-flv; codecs="'+g.videoCodec+","+g.audioCodec+'"'):g.mimeType='video/x-flv; codecs="'+g.audioCodec+'"',g.isComplete()&&this._onMediaInfo(g)}var v=this._parseMP3AudioData(e,t+1,i-1,!1);if(null==v)return;f=this._timestampBase+n;var y={unit:v,length:v.byteLength,dts:f,pts:f};c.samples.push(y),c.length+=v.length}}else this._onError(m.a.FORMAT_ERROR,"Flv: Invalid audio sample rate idx: "+d)}else this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported audio codec idx: "+s)}},e.prototype._parseAACAudioData=function(e,t,i){if(!(i<=1)){var n={},a=new Uint8Array(e,t,i);return n.packetType=a[0],0===a[0]?n.data=this._parseAACAudioSpecificConfig(e,t+1,i-1):n.data=a.subarray(1),n}r.a.w(this.TAG,"Flv: Invalid AAC packet, missing AACPacketType or/and Data!")},e.prototype._parseAACAudioSpecificConfig=function(e,t,i){var n,a,r=new Uint8Array(e,t,i),s=null,o=0,d=null;if(o=n=r[0]>>>3,(a=(7&r[0])<<1|r[1]>>>7)<0||a>=this._mpegSamplingRates.length)this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid sampling frequency index!");else{var _=this._mpegSamplingRates[a],h=(120&r[1])>>>3;if(!(h<0||h>=8)){5===o&&(d=(7&r[1])<<1|r[2]>>>7,(124&r[2])>>>2);var c=self.navigator.userAgent.toLowerCase();return-1!==c.indexOf("firefox")?a>=6?(o=5,s=new Array(4),d=a-3):(o=2,s=new Array(2),d=a):-1!==c.indexOf("android")?(o=2,s=new Array(2),d=a):(o=5,d=a,s=new Array(4),a>=6?d=a-3:1===h&&(o=2,s=new Array(2),d=a)),s[0]=o<<3,s[0]|=(15&a)>>>1,s[1]=(15&a)<<7,s[1]|=(15&h)<<3,5===o&&(s[1]|=(15&d)>>>1,s[2]=(1&d)<<7,s[2]|=8,s[3]=0),{config:s,samplingRate:_,channelCount:h,codec:"mp4a.40."+o,originalCodec:"mp4a.40."+n}}this._onError(m.a.FORMAT_ERROR,"Flv: AAC invalid channel configuration")}},e.prototype._parseMP3AudioData=function(e,t,i,n){if(!(i<4)){this._littleEndian;var a=new Uint8Array(e,t,i),s=null;if(n){if(255!==a[0])return;var o=a[1]>>>3&3,d=(6&a[1])>>1,_=(240&a[2])>>>4,h=(12&a[2])>>>2,c=3!==(a[3]>>>6&3)?2:1,u=0,l=0;switch(o){case 0:u=this._mpegAudioV25SampleRateTable[h];break;case 2:u=this._mpegAudioV20SampleRateTable[h];break;case 3:u=this._mpegAudioV10SampleRateTable[h]}switch(d){case 1:34,_>>4;if(0!=(128&s)){var d=15&s,_=String.fromCharCode.apply(String,new Uint8Array(e,t,i).slice(1,5));if("hvc1"!==_)return void this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: "+_);this._parseEnhancedHEVCVideoPacket(e,t+5,i-5,n,a,o,d)}else{var h=15&s;if(7===h)this._parseAVCVideoPacket(e,t+1,i-1,n,a,o);else{if(12!==h)return void this._onError(m.a.CODEC_UNSUPPORTED,"Flv: Unsupported codec in video frame: "+h);this._parseHEVCVideoPacket(e,t+1,i-1,n,a,o)}}}},e.prototype._parseAVCVideoPacket=function(e,t,i,n,a,s){if(i<4)r.a.w(this.TAG,"Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime");else{var o=this._littleEndian,d=new DataView(e,t,i),_=d.getUint8(0),h=(16777215&d.getUint32(0,!o))<<8>>8;if(0===_)this._parseAVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===_)this._parseAVCVideoData(e,t+4,i-4,n,a,s,h);else if(2!==_)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+_)}},e.prototype._parseHEVCVideoPacket=function(e,t,i,n,a,s){if(i<4)r.a.w(this.TAG,"Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime");else{var o=this._littleEndian,d=new DataView(e,t,i),_=d.getUint8(0),h=(16777215&d.getUint32(0,!o))<<8>>8;if(0===_)this._parseHEVCDecoderConfigurationRecord(e,t+4,i-4);else if(1===_)this._parseHEVCVideoData(e,t+4,i-4,n,a,s,h);else if(2!==_)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+_)}},e.prototype._parseEnhancedHEVCVideoPacket=function(e,t,i,n,a,s,o){if(i<4)r.a.w(this.TAG,"Flv: Invalid HEVC packet, missing HEVCPacketType or/and CompositionTime");else{var d=this._littleEndian,_=new DataView(e,t,i);if(0===o)this._parseHEVCDecoderConfigurationRecord(e,t,i);else if(1===o){var h=(4294967040&_.getUint32(0,!d))>>8;this._parseHEVCVideoData(e,t+3,i-3,n,a,s,h)}else if(3===o)this._parseHEVCVideoData(e,t,i,n,a,s,0);else if(2!==o)return void this._onError(m.a.FORMAT_ERROR,"Flv: Invalid video packet type "+o)}},e.prototype._parseAVCDecoderConfigurationRecord=function(e,t,i){if(i<7)r.a.w(this.TAG,"Flv: Invalid AVCDecoderConfigurationRecord, lack of data!");else{var n=this._videoMetadata,a=this._videoTrack,s=this._littleEndian,o=new DataView(e,t,i);if(n){if(void 0!==n.avcc){var d=new Uint8Array(e,t,i);if(S(d,n.avcc))return;r.a.w(this.TAG,"AVCDecoderConfigurationRecord has been changed, re-generate initialization segment")}}else!1===this._hasVideo&&!1===this._hasVideoFlagOverrided&&(this._hasVideo=!0,this._mediaInfo.hasVideo=!0),(n=this._videoMetadata={}).type="video",n.id=a.id,n.timescale=this._timescale,n.duration=this._duration;var _=o.getUint8(0),h=o.getUint8(1);o.getUint8(2),o.getUint8(3);if(1===_&&0!==h)if(this._naluLengthSize=1+(3&o.getUint8(4)),3===this._naluLengthSize||4===this._naluLengthSize){var c=31&o.getUint8(5);if(0!==c){c>1&&r.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: SPS Count = "+c);for(var u=6,l=0;l1&&r.a.w(this.TAG,"Flv: Strange AVCDecoderConfigurationRecord: PPS Count = "+w),u++;for(l=0;l=i){r.a.w(this.TAG,"Malformed Nalu near timestamp "+f+", offset = "+u+", dataSize = "+i);break}var m=_.getUint32(u,!d);if(3===l&&(m>>>=8),m>i-l)return void r.a.w(this.TAG,"Malformed Nalus near timestamp "+f+", NaluSize > DataSize!");var g=31&_.getUint8(u+l);5===g&&(p=!0);var v=new Uint8Array(e,t+u,l+m),y={type:g,data:v};h.push(y),c+=v.byteLength,u+=l+m}if(h.length){var b=this._videoTrack,S={units:h,length:c,isKeyframe:p,dts:f,cts:o,pts:f+o};p&&(S.fileposition=a),b.samples.push(S),b.length+=c}},e.prototype._parseHEVCVideoData=function(e,t,i,n,a,s,o){for(var d=this._littleEndian,_=new DataView(e,t,i),h=[],c=0,u=0,l=this._naluLengthSize,f=this._timestampBase+n,p=1===s;u=i){r.a.w(this.TAG,"Malformed Nalu near timestamp "+f+", offset = "+u+", dataSize = "+i);break}var m=_.getUint32(u,!d);if(3===l&&(m>>>=8),m>i-l)return void r.a.w(this.TAG,"Malformed Nalus near timestamp "+f+", NaluSize > DataSize!");var g=31&_.getUint8(u+l);19!==g&&20!==g||(p=!0);var v=new Uint8Array(e,t+u,l+m),y={type:g,data:v};h.push(y),c+=v.byteLength,u+=l+m}if(h.length){var b=this._videoTrack,S={units:h,length:c,isKeyframe:p,dts:f,cts:o,pts:f+o};p&&(S.fileposition=a),b.samples.push(S),b.length+=c}},e}(),R=function(){function e(){}return e.prototype.destroy=function(){this.onError=null,this.onMediaInfo=null,this.onMetaDataArrived=null,this.onTrackMetadata=null,this.onDataAvailable=null,this.onTimedID3Metadata=null,this.onSMPTE2038Metadata=null,this.onSCTE35Metadata=null,this.onPESPrivateData=null,this.onPESPrivateDataDescriptor=null},e}(),T=function(){this.program_pmt_pid={}};!function(e){e[e.kMPEG1Audio=3]="kMPEG1Audio",e[e.kMPEG2Audio=4]="kMPEG2Audio",e[e.kPESPrivateData=6]="kPESPrivateData",e[e.kADTSAAC=15]="kADTSAAC",e[e.kLOASAAC=17]="kLOASAAC",e[e.kAC3=129]="kAC3",e[e.kID3=21]="kID3",e[e.kSCTE35=134]="kSCTE35",e[e.kH264=27]="kH264",e[e.kH265=36]="kH265"}(E||(E={}));var L,w=function(){this.pid_stream_type={},this.common_pids={h264:void 0,h265:void 0,adts_aac:void 0,loas_aac:void 0,opus:void 0,ac3:void 0,mp3:void 0},this.pes_private_data_pids={},this.timed_id3_pids={},this.scte_35_pids={},this.smpte2038_pids={}},k=function(){},D=function(){},C=function(){this.slices=[],this.total_length=0,this.expected_length=0,this.file_position=0};!function(e){e[e.kUnspecified=0]="kUnspecified",e[e.kSliceNonIDR=1]="kSliceNonIDR",e[e.kSliceDPA=2]="kSliceDPA",e[e.kSliceDPB=3]="kSliceDPB",e[e.kSliceDPC=4]="kSliceDPC",e[e.kSliceIDR=5]="kSliceIDR",e[e.kSliceSEI=6]="kSliceSEI",e[e.kSliceSPS=7]="kSliceSPS",e[e.kSlicePPS=8]="kSlicePPS",e[e.kSliceAUD=9]="kSliceAUD",e[e.kEndOfSequence=10]="kEndOfSequence",e[e.kEndOfStream=11]="kEndOfStream",e[e.kFiller=12]="kFiller",e[e.kSPSExt=13]="kSPSExt",e[e.kReserved0=14]="kReserved0"}(L||(L={}));var B,I,O=function(){},P=function(e){var t=e.data.byteLength;this.type=e.type,this.data=new Uint8Array(4+t),new DataView(this.data.buffer).setUint32(0,t),this.data.set(e.data,4)},M=function(){function e(e){this.TAG="H264AnnexBParser",this.current_startcode_offset_=0,this.eof_flag_=!1,this.data_=e,this.current_startcode_offset_=this.findNextStartCodeOffset(0),this.eof_flag_&&r.a.e(this.TAG,"Could not find H264 startcode until payload end!")}return e.prototype.findNextStartCodeOffset=function(e){for(var t=e,i=this.data_;;){if(t+3>=i.byteLength)return this.eof_flag_=!0,i.byteLength;var n=i[t+0]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3],a=i[t+0]<<16|i[t+1]<<8|i[t+2];if(1===n||1===a)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_startcode_offset_,n=31&e[i+=1===(e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3])?4:3],a=(128&e[i])>>>7,r=this.findNextStartCodeOffset(i);if(this.current_startcode_offset_=r,!(n>=L.kReserved0)&&0===a){var s=e.subarray(i,r);(t=new O).type=n,t.data=s}}return t},e}(),x=function(){function e(e,t,i){var n=8+e.byteLength+1+2+t.byteLength,a=!1;66!==e[3]&&77!==e[3]&&88!==e[3]&&(a=!0,n+=4);var r=this.data=new Uint8Array(n);r[0]=1,r[1]=e[1],r[2]=e[2],r[3]=e[3],r[4]=255,r[5]=225;var s=e.byteLength;r[6]=s>>>8,r[7]=255&s;var o=8;r.set(e,8),r[o+=s]=1;var d=t.byteLength;r[o+1]=d>>>8,r[o+2]=255&d,r.set(t,o+3),o+=3+d,a&&(r[o]=252|i.chroma_format_idc,r[o+1]=248|i.bit_depth_luma-8,r[o+2]=248|i.bit_depth_chroma-8,r[o+3]=0,o+=4)}return e.prototype.getData=function(){return this.data},e}();!function(e){e[e.kNull=0]="kNull",e[e.kAACMain=1]="kAACMain",e[e.kAAC_LC=2]="kAAC_LC",e[e.kAAC_SSR=3]="kAAC_SSR",e[e.kAAC_LTP=4]="kAAC_LTP",e[e.kAAC_SBR=5]="kAAC_SBR",e[e.kAAC_Scalable=6]="kAAC_Scalable",e[e.kLayer1=32]="kLayer1",e[e.kLayer2=33]="kLayer2",e[e.kLayer3=34]="kLayer3"}(B||(B={})),function(e){e[e.k96000Hz=0]="k96000Hz",e[e.k88200Hz=1]="k88200Hz",e[e.k64000Hz=2]="k64000Hz",e[e.k48000Hz=3]="k48000Hz",e[e.k44100Hz=4]="k44100Hz",e[e.k32000Hz=5]="k32000Hz",e[e.k24000Hz=6]="k24000Hz",e[e.k22050Hz=7]="k22050Hz",e[e.k16000Hz=8]="k16000Hz",e[e.k12000Hz=9]="k12000Hz",e[e.k11025Hz=10]="k11025Hz",e[e.k8000Hz=11]="k8000Hz",e[e.k7350Hz=12]="k7350Hz"}(I||(I={}));var U,N,G=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],V=(U=function(e,t){return(U=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}U(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),F=function(){},j=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return V(t,e),t}(F),z=function(){function e(e){this.TAG="AACADTSParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&r.a.e(this.TAG,"Could not found ADTS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+7>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(4095===(i[t+0]<<8|i[t+1])>>>4)return t;t++}},e.prototype.readNextAACFrame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_syncword_offset_,n=(8&e[i+1])>>>3,a=(6&e[i+1])>>>1,r=1&e[i+1],s=(192&e[i+2])>>>6,o=(60&e[i+2])>>>2,d=(1&e[i+2])<<2|(192&e[i+3])>>>6,_=(3&e[i+3])<<11|e[i+4]<<3|(224&e[i+5])>>>5;e[i+6];if(i+_>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var h=1===r?7:9,c=_-h;i+=h;var u=this.findNextSyncwordOffset(i+c);if(this.current_syncword_offset_=u,(0===n||1===n)&&0===a){var l=e.subarray(i,i+c);(t=new F).audio_object_type=s+1,t.sampling_freq_index=o,t.sampling_frequency=G[o],t.channel_config=d,t.data=l}}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),H=function(){function e(e){this.TAG="AACLOASParser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&r.a.e(this.TAG,"Could not found LOAS syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+1>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(695===(i[t+0]<<3|i[t+1]>>>5))return t;t++}},e.prototype.getLATMValue=function(e){for(var t=e.readBits(2),i=0,n=0;n<=t;n++)i<<=8,i|=e.readByte();return i},e.prototype.readNextAACFrame=function(e){for(var t=this.data_,i=null;null==i&&!this.eof_flag_;){var n=this.current_syncword_offset_,a=(31&t[n+1])<<8|t[n+2];if(n+3+a>=this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var s=new f(t.subarray(n+3,n+3+a)),o=null;if(s.readBool()){if(null==e){r.a.w(this.TAG,"StreamMuxConfig Missing"),this.current_syncword_offset_=this.findNextSyncwordOffset(n+3+a),s.destroy();continue}o=e}else{var d=s.readBool();if(d&&s.readBool()){r.a.e(this.TAG,"audioMuxVersionA is Not Supported"),s.destroy();break}if(d&&this.getLATMValue(s),!s.readBool()){r.a.e(this.TAG,"allStreamsSameTimeFraming zero is Not Supported"),s.destroy();break}if(0!==s.readBits(6)){r.a.e(this.TAG,"more than 2 numSubFrames Not Supported"),s.destroy();break}if(0!==s.readBits(4)){r.a.e(this.TAG,"more than 2 numProgram Not Supported"),s.destroy();break}if(0!==s.readBits(3)){r.a.e(this.TAG,"more than 2 numLayer Not Supported"),s.destroy();break}var _=d?this.getLATMValue(s):0,h=s.readBits(5);_-=5;var c=s.readBits(4);_-=4;var u=s.readBits(4);_-=4,s.readBits(3),(_-=3)>0&&s.readBits(_);var l=s.readBits(3);if(0!==l){r.a.e(this.TAG,"frameLengthType = "+l+". Only frameLengthType = 0 Supported"),s.destroy();break}s.readByte();var p=s.readBool();if(p)if(d)this.getLATMValue(s);else{for(var m=0;;){m<<=8;var g=s.readBool();if(m+=s.readByte(),!g)break}console.log(m)}s.readBool()&&s.readByte(),(o=new j).audio_object_type=h,o.sampling_freq_index=c,o.sampling_frequency=G[o.sampling_freq_index],o.channel_config=u,o.other_data_present=p}for(var v=0;;){var y=s.readByte();if(v+=y,255!==y)break}for(var b=new Uint8Array(v),S=0;S=6?(n=5,t=new Array(4),s=a-3):(n=2,t=new Array(2),s=a):-1!==o.indexOf("android")?(n=2,t=new Array(2),s=a):(n=5,s=a,t=new Array(4),a>=6?s=a-3:1===r&&(n=2,t=new Array(2),s=a)),t[0]=n<<3,t[0]|=(15&a)>>>1,t[1]=(15&a)<<7,t[1]|=(15&r)<<3,5===n&&(t[1]|=(15&s)>>>1,t[2]=(1&s)<<7,t[2]|=8,t[3]=0),this.config=t,this.sampling_rate=G[a],this.channel_count=r,this.codec_mimetype="mp4a.40."+n,this.original_codec_mimetype="mp4a.40."+i},K=function(){},W=function(){};!function(e){e[e.kSpliceNull=0]="kSpliceNull",e[e.kSpliceSchedule=4]="kSpliceSchedule",e[e.kSpliceInsert=5]="kSpliceInsert",e[e.kTimeSignal=6]="kTimeSignal",e[e.kBandwidthReservation=7]="kBandwidthReservation",e[e.kPrivateCommand=255]="kPrivateCommand"}(N||(N={}));var X,Y=function(e){var t=e.readBool();return t?(e.readBits(6),{time_specified_flag:t,pts_time:4*e.readBits(31)+e.readBits(2)}):(e.readBits(7),{time_specified_flag:t})},J=function(e){var t=e.readBool();return e.readBits(6),{auto_return:t,duration:4*e.readBits(31)+e.readBits(2)}},Z=function(e,t){var i=t.readBits(8);return e?{component_tag:i}:{component_tag:i,splice_time:Y(t)}},Q=function(e){return{component_tag:e.readBits(8),utc_splice_time:e.readBits(32)}},$=function(e){var t=e.readBits(32),i=e.readBool();e.readBits(7);var n={splice_event_id:t,splice_event_cancel_indicator:i};if(i)return n;if(n.out_of_network_indicator=e.readBool(),n.program_splice_flag=e.readBool(),n.duration_flag=e.readBool(),e.readBits(5),n.program_splice_flag)n.utc_splice_time=e.readBits(32);else{n.component_count=e.readBits(8),n.components=[];for(var a=0;a=i.byteLength)return this.eof_flag_=!0,i.byteLength;var n=i[t+0]<<24|i[t+1]<<16|i[t+2]<<8|i[t+3],a=i[t+0]<<16|i[t+1]<<8|i[t+2];if(1===n||1===a)return t;t++}},e.prototype.readNextNaluPayload=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_startcode_offset_,n=e[i+=1===(e[i]<<24|e[i+1]<<16|e[i+2]<<8|e[i+3])?4:3]>>1&63,a=(128&e[i])>>>7,r=this.findNextStartCodeOffset(i);if(this.current_startcode_offset_=r,0===a){var s=e.subarray(i,r);(t=new de).type=n,t.data=s}}return t},e}(),ce=function(){function e(e,t,i,n){var a=23+(5+e.byteLength)+(5+t.byteLength)+(5+i.byteLength),r=this.data=new Uint8Array(a);r[0]=1,r[1]=(3&n.general_profile_space)<<6|(n.general_tier_flag?1:0)<<5|31&n.general_profile_idc,r[2]=n.general_profile_compatibility_flags_1,r[3]=n.general_profile_compatibility_flags_2,r[4]=n.general_profile_compatibility_flags_3,r[5]=n.general_profile_compatibility_flags_4,r[6]=n.general_constraint_indicator_flags_1,r[7]=n.general_constraint_indicator_flags_2,r[8]=n.general_constraint_indicator_flags_3,r[9]=n.general_constraint_indicator_flags_4,r[10]=n.general_constraint_indicator_flags_5,r[11]=n.general_constraint_indicator_flags_6,r[12]=n.general_level_idc,r[13]=240|(3840&n.min_spatial_segmentation_idc)>>8,r[14]=255&n.min_spatial_segmentation_idc,r[15]=252|3&n.parallelismType,r[16]=252|3&n.chroma_format_idc,r[17]=248|7&n.bit_depth_luma_minus8,r[18]=248|7&n.bit_depth_chroma_minus8,r[19]=0,r[20]=0,r[21]=(3&n.constant_frame_rate)<<6|(7&n.num_temporal_layers)<<3|(n.temporal_id_nested?1:0)<<2|3,r[22]=3,r[23]=128|X.kSliceVPS,r[24]=0,r[25]=1,r[26]=(65280&e.byteLength)>>8,r[27]=(255&e.byteLength)>>0,r.set(e,28),r[23+(5+e.byteLength)+0]=128|X.kSliceSPS,r[23+(5+e.byteLength)+1]=0,r[23+(5+e.byteLength)+2]=1,r[23+(5+e.byteLength)+3]=(65280&t.byteLength)>>8,r[23+(5+e.byteLength)+4]=(255&t.byteLength)>>0,r.set(t,23+(5+e.byteLength)+5),r[23+(5+e.byteLength+5+t.byteLength)+0]=128|X.kSlicePPS,r[23+(5+e.byteLength+5+t.byteLength)+1]=0,r[23+(5+e.byteLength+5+t.byteLength)+2]=1,r[23+(5+e.byteLength+5+t.byteLength)+3]=(65280&i.byteLength)>>8,r[23+(5+e.byteLength+5+t.byteLength)+4]=(255&i.byteLength)>>0,r.set(i,23+(5+e.byteLength+5+t.byteLength)+5)}return e.prototype.getData=function(){return this.data},e}(),ue=function(){},le=function(){},fe=function(){},pe=[[64,64,80,80,96,96,112,112,128,128,160,160,192,192,224,224,256,256,320,320,384,384,448,448,512,512,640,640,768,768,896,896,1024,1024,1152,1152,1280,1280],[69,70,87,88,104,105,121,122,139,140,174,175,208,209,243,244,278,279,348,349,417,418,487,488,557,558,696,697,835,836,975,976,1114,1115,1253,1254,1393,1394],[96,96,120,120,144,144,168,168,192,192,240,240,288,288,336,336,384,384,480,480,576,576,672,672,768,768,960,960,1152,1152,1344,1344,1536,1536,1728,1728,1920,1920]],me=function(){function e(e){this.TAG="AC3Parser",this.data_=e,this.current_syncword_offset_=this.findNextSyncwordOffset(0),this.eof_flag_&&r.a.e(this.TAG,"Could not found AC3 syncword until payload end")}return e.prototype.findNextSyncwordOffset=function(e){for(var t=e,i=this.data_;;){if(t+7>=i.byteLength)return this.eof_flag_=!0,i.byteLength;if(2935===(i[t+0]<<8|i[t+1]<<0))return t;t++}},e.prototype.readNextAC3Frame=function(){for(var e=this.data_,t=null;null==t&&!this.eof_flag_;){var i=this.current_syncword_offset_,n=e[i+4]>>6,a=[48e3,44200,33e3][n],r=63&e[i+4],s=2*pe[n][r];if(i+s>this.data_.byteLength){this.eof_flag_=!0,this.has_last_incomplete_data=!0;break}var o=this.findNextSyncwordOffset(i+s);this.current_syncword_offset_=o;var d=e[i+5]>>3,_=7&e[i+5],h=e[i+6]>>5,c=0;0!=(1&h)&&1!==h&&(c+=2),0!=(4&h)&&(c+=2),2===h&&(c+=2);var u=(e[i+6]<<8|e[i+7]<<0)>>12-c&1,l=[2,1,2,3,3,4,4,5][h]+u;(t=new fe).sampling_frequency=a,t.channel_count=l,t.channel_mode=h,t.bit_stream_identification=d,t.low_frequency_effects_channel_on=u,t.bit_stream_mode=_,t.frame_size_code=r,t.data=e.subarray(i,i+s)}return t},e.prototype.hasIncompleteData=function(){return this.has_last_incomplete_data},e.prototype.getIncompleteData=function(){return this.has_last_incomplete_data?this.data_.subarray(this.current_syncword_offset_):null},e}(),ge=function(e){var t;t=[e.sampling_rate_code<<6|e.bit_stream_identification<<1|e.bit_stream_mode>>2,(3&e.bit_stream_mode)<<6|e.channel_mode<<3|e.low_frequency_effects_channel_on<<2|e.frame_size_code>>4,e.frame_size_code<<4&224],this.config=t,this.sampling_rate=e.sampling_frequency,this.bit_stream_identification=e.bit_stream_identification,this.bit_stream_mode=e.bit_stream_mode,this.low_frequency_effects_channel_on=e.low_frequency_effects_channel_on,this.channel_count=e.channel_count,this.channel_mode=e.channel_mode,this.codec_mimetype="ac-3",this.original_codec_mimetype="ac-3"},ve=function(){var e=function(t,i){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(t,i)};return function(t,i){function n(){this.constructor=t}e(t,i),t.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}}(),ye=function(){return(ye=Object.assign||function(e){for(var t,i=1,n=arguments.length;i=4?(r.a.v("TSDemuxer","ts_packet_size = 192, m2ts mode"),i-=4):204===n&&r.a.v("TSDemuxer","ts_packet_size = 204, RS encoded MPEG2-TS stream"),{match:!0,consumed:0,ts_packet_size:n,sync_offset:i})},t.prototype.bindDataSource=function(e){return e.onDataArrival=this.parseChunks.bind(this),this},t.prototype.resetMediaInfo=function(){this.media_info_=new o.a},t.prototype.parseChunks=function(e,t){if(!(this.onError&&this.onMediaInfo&&this.onTrackMetadata&&this.onDataAvailable))throw new c.a("onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified");var i=0;for(this.first_parse_&&(this.first_parse_=!1,i=this.sync_offset_);i+this.ts_packet_size_<=e.byteLength;){var n=t+i;192===this.ts_packet_size_&&(i+=4);var a=new Uint8Array(e,i,188),s=a[0];if(71!==s){r.a.e(this.TAG,"sync_byte = "+s+", not 0x47");break}var o=(64&a[1])>>>6,d=(a[1],(31&a[1])<<8|a[2]),_=(48&a[3])>>>4,h=15&a[3],u={},l=4;if(2==_||3==_){var f=a[4];if(5+f===188){i+=188,204===this.ts_packet_size_&&(i+=16);continue}f>0&&(u=this.parseAdaptationField(e,i+4,1+f)),l=5+f}if(1==_||3==_)if(0===d||d===this.current_pmt_pid_||null!=this.pmt_&&this.pmt_.pid_stream_type[d]===E.kSCTE35){var p=188-l;this.handleSectionSlice(e,i+l,p,{pid:d,file_position:n,payload_unit_start_indicator:o,continuity_conunter:h,random_access_indicator:u.random_access_indicator})}else if(null!=this.pmt_&&null!=this.pmt_.pid_stream_type[d]){p=188-l;var m=this.pmt_.pid_stream_type[d];d!==this.pmt_.common_pids.h264&&d!==this.pmt_.common_pids.h265&&d!==this.pmt_.common_pids.adts_aac&&d!==this.pmt_.common_pids.loas_aac&&d!==this.pmt_.common_pids.ac3&&d!==this.pmt_.common_pids.opus&&d!==this.pmt_.common_pids.mp3&&!0!==this.pmt_.pes_private_data_pids[d]&&!0!==this.pmt_.timed_id3_pids[d]||this.handlePESSlice(e,i+l,p,{pid:d,stream_type:m,file_position:n,payload_unit_start_indicator:o,continuity_conunter:h,random_access_indicator:u.random_access_indicator})}i+=188,204===this.ts_packet_size_&&(i+=16)}return this.dispatchAudioVideoMediaSegment(),i},t.prototype.parseAdaptationField=function(e,t,i){var n=new Uint8Array(e,t,i),a=n[0];return a>0?a>183?(r.a.w(this.TAG,"Illegal adaptation_field_length: "+a),{}):{discontinuity_indicator:(128&n[1])>>>7,random_access_indicator:(64&n[1])>>>6,elementary_stream_priority_indicator:(32&n[1])>>>5}:{}},t.prototype.handleSectionSlice=function(e,t,i,n){var a=new Uint8Array(e,t,i),r=this.section_slice_queues_[n.pid];if(n.payload_unit_start_indicator){var s=a[0];if(null!=r&&0!==r.total_length){var o=new Uint8Array(e,t+1,Math.min(i,s));r.slices.push(o),r.total_length+=o.byteLength,r.total_length===r.expected_length?this.emitSectionSlices(r,n):this.clearSlices(r,n)}for(var d=1+s;d=r.expected_length&&this.clearSlices(r,n),d+=o.byteLength}}else if(null!=r&&0!==r.total_length){o=new Uint8Array(e,t,Math.min(i,r.expected_length-r.total_length));r.slices.push(o),r.total_length+=o.byteLength,r.total_length===r.expected_length?this.emitSectionSlices(r,n):r.total_length>=r.expected_length&&this.clearSlices(r,n)}},t.prototype.handlePESSlice=function(e,t,i,n){var a=new Uint8Array(e,t,i),s=a[0]<<16|a[1]<<8|a[2],o=(a[3],a[4]<<8|a[5]);if(n.payload_unit_start_indicator){if(1!==s)return void r.a.e(this.TAG,"handlePESSlice: packet_start_code_prefix should be 1 but with value "+s);var d=this.pes_slice_queues_[n.pid];d&&(0===d.expected_length||d.expected_length===d.total_length?this.emitPESSlices(d,n):this.clearSlices(d,n)),this.pes_slice_queues_[n.pid]=new C,this.pes_slice_queues_[n.pid].file_position=n.file_position,this.pes_slice_queues_[n.pid].random_access_indicator=n.random_access_indicator}if(null!=this.pes_slice_queues_[n.pid]){var _=this.pes_slice_queues_[n.pid];_.slices.push(a),n.payload_unit_start_indicator&&(_.expected_length=0===o?0:o+6),_.total_length+=a.byteLength,_.expected_length>0&&_.expected_length===_.total_length?this.emitPESSlices(_,n):_.expected_length>0&&_.expected_length<_.total_length&&this.clearSlices(_,n)}},t.prototype.emitSectionSlices=function(e,t){for(var i=new Uint8Array(e.total_length),n=0,a=0;n>>6,o=t[8],d=void 0,_=void 0;2!==s&&3!==s||(d=536870912*(14&t[9])+4194304*(255&t[10])+16384*(254&t[11])+128*(255&t[12])+(254&t[13])/2,_=3===s?536870912*(14&t[14])+4194304*(255&t[15])+16384*(254&t[16])+128*(255&t[17])+(254&t[18])/2:d);var h=9+o,c=void 0;if(0!==a){if(a<3+o)return void r.a.v(this.TAG,"Malformed PES: PES_packet_length < 3 + PES_header_data_length");c=a-3-o}else c=t.byteLength-h;var u=t.subarray(h,h+c);switch(e.stream_type){case E.kMPEG1Audio:case E.kMPEG2Audio:this.parseMP3Payload(u,d);break;case E.kPESPrivateData:this.pmt_.common_pids.opus===e.pid?this.parseOpusPayload(u,d):this.pmt_.common_pids.ac3===e.pid?this.parseAC3Payload(u,d):this.pmt_.smpte2038_pids[e.pid]?this.parseSMPTE2038MetadataPayload(u,d,_,e.pid,n):this.parsePESPrivateDataPayload(u,d,_,e.pid,n);break;case E.kADTSAAC:this.parseADTSAACPayload(u,d);break;case E.kLOASAAC:this.parseLOASAACPayload(u,d);break;case E.kAC3:this.parseAC3Payload(u,d);break;case E.kID3:this.parseTimedID3MetadataPayload(u,d,_,e.pid,n);break;case E.kH264:this.parseH264Payload(u,d,_,e.file_position,e.random_access_indicator);break;case E.kH265:this.parseH265Payload(u,d,_,e.file_position,e.random_access_indicator)}}else if((188===n||191===n||240===n||241===n||255===n||242===n||248===n)&&e.stream_type===E.kPESPrivateData){h=6,c=void 0;c=0!==a?a:t.byteLength-h;u=t.subarray(h,h+c);this.parsePESPrivateDataPayload(u,void 0,void 0,e.pid,n)}}else r.a.e(this.TAG,"parsePES: packet_start_code_prefix should be 1 but with value "+i)},t.prototype.parsePAT=function(e){var t=e[0];if(0===t){var i=(15&e[1])<<8|e[2],n=(e[3],e[4],(62&e[5])>>>1),a=1&e[5],s=e[6],o=(e[7],null);if(1===a&&0===s)(o=new T).version_number=n;else if(null==(o=this.pat_))return;for(var d=i-5-4,_=-1,h=-1,c=8;c<8+d;c+=4){var u=e[c]<<8|e[c+1],l=(31&e[c+2])<<8|e[c+3];0===u?o.network_pid=l:(o.program_pmt_pid[u]=l,-1===_&&(_=u),-1===h&&(h=l))}1===a&&0===s&&(null==this.pat_&&r.a.v(this.TAG,"Parsed first PAT: "+JSON.stringify(o)),this.pat_=o,this.current_program_=_,this.current_pmt_pid_=h)}else r.a.e(this.TAG,"parsePAT: table_id "+t+" is not corresponded to PAT!")},t.prototype.parsePMT=function(e){var t=e[0];if(2===t){var i=(15&e[1])<<8|e[2],n=e[3]<<8|e[4],a=(62&e[5])>>>1,s=1&e[5],o=e[6],d=(e[7],null);if(1===s&&0===o)(d=new w).program_number=n,d.version_number=a,this.program_pmt_map_[n]=d;else if(null==(d=this.program_pmt_map_[n]))return;e[8],e[9];for(var _=(15&e[10])<<8|e[11],h=12+_,c=i-9-_-4,u=h;u0){for(var v=u+5;v1&&(r.a.w(this.TAG,"AAC: Detected pts overlapped, expected: "+s+"ms, PES pts: "+a+"ms"),a=s)}}for(var o,d=new z(e),_=null,h=a;null!=(_=d.readNextAACFrame());){n=1024/_.sampling_frequency*1e3;var c={codec:"aac",data:_};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"aac",audio_object_type:_.audio_object_type,sampling_freq_index:_.sampling_freq_index,sampling_frequency:_.sampling_frequency,channel_config:_.channel_config},this.dispatchAudioInitSegment(c)):this.detectAudioMetadataChange(c)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(c)),o=h;var u=Math.floor(h),l={unit:_.data,length:_.data.byteLength,pts:u,dts:u};this.audio_track_.samples.push(l),this.audio_track_.length+=_.data.byteLength,h+=n}d.hasIncompleteData()&&(this.aac_last_incomplete_data_=d.getIncompleteData()),o&&(this.aac_last_sample_pts_=o)}},t.prototype.parseLOASAACPayload=function(e,t){var i;if(!this.has_video_||this.video_init_segment_dispatched_){if(this.aac_last_incomplete_data_){var n=new Uint8Array(e.byteLength+this.aac_last_incomplete_data_.byteLength);n.set(this.aac_last_incomplete_data_,0),n.set(e,this.aac_last_incomplete_data_.byteLength),e=n}var a,s;if(null!=t&&(s=t/this.timescale_),"aac"===this.audio_metadata_.codec){if(null==t&&null!=this.aac_last_sample_pts_)a=1024/this.audio_metadata_.sampling_frequency*1e3,s=this.aac_last_sample_pts_+a;else if(null==t)return void r.a.w(this.TAG,"AAC: Unknown pts");if(this.aac_last_incomplete_data_&&this.aac_last_sample_pts_){a=1024/this.audio_metadata_.sampling_frequency*1e3;var o=this.aac_last_sample_pts_+a;Math.abs(o-s)>1&&(r.a.w(this.TAG,"AAC: Detected pts overlapped, expected: "+o+"ms, PES pts: "+s+"ms"),s=o)}}for(var d,_=new H(e),h=null,c=s;null!=(h=_.readNextAACFrame(null!==(i=this.loas_previous_frame)&&void 0!==i?i:void 0));){this.loas_previous_frame=h,a=1024/h.sampling_frequency*1e3;var u={codec:"aac",data:h};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"aac",audio_object_type:h.audio_object_type,sampling_freq_index:h.sampling_freq_index,sampling_frequency:h.sampling_frequency,channel_config:h.channel_config},this.dispatchAudioInitSegment(u)):this.detectAudioMetadataChange(u)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(u)),d=c;var l=Math.floor(c),f={unit:h.data,length:h.data.byteLength,pts:l,dts:l};this.audio_track_.samples.push(f),this.audio_track_.length+=h.data.byteLength,c+=a}_.hasIncompleteData()&&(this.aac_last_incomplete_data_=_.getIncompleteData()),d&&(this.aac_last_sample_pts_=d)}},t.prototype.parseAC3Payload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var i,n;if(null!=t&&(n=t/this.timescale_),"ac-3"===this.audio_metadata_.codec)if(null==t&&null!=this.aac_last_sample_pts_)i=1536/this.audio_metadata_.sampling_frequency*1e3,n=this.aac_last_sample_pts_+i;else if(null==t)return void r.a.w(this.TAG,"Opus: Unknown pts");for(var a,s=new me(e),o=null,d=n;null!=(o=s.readNextAC3Frame());){i=1536/o.sampling_frequency*1e3;var _={codec:"ac-3",data:o};0==this.audio_init_segment_dispatched_?(this.audio_metadata_={codec:"ac-3",sampling_frequency:o.sampling_frequency,bit_stream_identification:o.bit_stream_identification,bit_stream_mode:o.bit_stream_mode,low_frequency_effects_channel_on:o.low_frequency_effects_channel_on,channel_mode:o.channel_mode},console.log(JSON.stringify(this.audio_metadata_)),this.dispatchAudioInitSegment(_)):this.detectAudioMetadataChange(_)&&(this.dispatchAudioMediaSegment(),this.dispatchAudioInitSegment(_)),a=d;var h=Math.floor(d),c={unit:o.data,length:o.data.byteLength,pts:h,dts:h};this.audio_track_.samples.push(c),this.audio_track_.length+=o.data.byteLength,d+=i}a&&(this.aac_last_sample_pts_=a)}},t.prototype.parseOpusPayload=function(e,t){if(!this.has_video_||this.video_init_segment_dispatched_){var i,n;if(null!=t&&(n=t/this.timescale_),"opus"===this.audio_metadata_.codec)if(null==t&&null!=this.aac_last_sample_pts_)i=20,n=this.aac_last_sample_pts_+i;else if(null==t)return void r.a.w(this.TAG,"Opus: Unknown pts");for(var a,s=n,o=0;o>>3&3,s=(6&e[1])>>1,o=(240&e[2])>>>4,d=(12&e[2])>>>2,_=3!==(e[3]>>>6&3)?2:1,h=0,c=34;switch(r){case 0:h=[11025,12e3,8e3,0][d];break;case 2:h=[22050,24e3,16e3,0][d];break;case 3:h=[44100,48e3,32e3,0][d]}switch(s){case 1:c=34,o>>24&255,i[1]=t>>>16&255,i[2]=t>>>8&255,i[3]=255&t,i.set(e,4);var s=8;for(r=0;r>>24&255,t>>>16&255,t>>>8&255,255&t,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]))},e.trak=function(t){return e.box(e.types.trak,e.tkhd(t),e.mdia(t))},e.tkhd=function(t){var i=t.id,n=t.duration,a=t.presentWidth,r=t.presentHeight;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,a>>>8&255,255&a,0,0,r>>>8&255,255&r,0,0]))},e.mdia=function(t){return e.box(e.types.mdia,e.mdhd(t),e.hdlr(t),e.minf(t))},e.mdhd=function(t){var i=t.timescale,n=t.duration;return e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,85,196,0,0]))},e.hdlr=function(t){var i=null;return i="audio"===t.type?e.constants.HDLR_AUDIO:e.constants.HDLR_VIDEO,e.box(e.types.hdlr,i)},e.minf=function(t){var i=null;return i="audio"===t.type?e.box(e.types.smhd,e.constants.SMHD):e.box(e.types.vmhd,e.constants.VMHD),e.box(e.types.minf,i,e.dinf(),e.stbl(t))},e.dinf=function(){return e.box(e.types.dinf,e.box(e.types.dref,e.constants.DREF))},e.stbl=function(t){return e.box(e.types.stbl,e.stsd(t),e.box(e.types.stts,e.constants.STTS),e.box(e.types.stsc,e.constants.STSC),e.box(e.types.stsz,e.constants.STSZ),e.box(e.types.stco,e.constants.STCO))},e.stsd=function(t){return"audio"===t.type?"mp3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp3(t)):"ac-3"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.ac3(t)):"opus"===t.codec?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.Opus(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.mp4a(t)):"video"===t.type&&t.codec.startsWith("hvc1")?e.box(e.types.stsd,e.constants.STSD_PREFIX,e.hvc1(t)):e.box(e.types.stsd,e.constants.STSD_PREFIX,e.avc1(t))},e.mp3=function(t){var i=t.channelCount,n=t.audioSampleRate,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types[".mp3"],a)},e.mp4a=function(t){var i=t.channelCount,n=t.audioSampleRate,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types.mp4a,a,e.esds(t))},e.ac3=function(t){var i=t.channelCount,n=t.audioSampleRate,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types["ac-3"],a,e.box(e.types.dac3,new Uint8Array(t.config)))},e.esds=function(t){var i=t.config||[],n=i.length,a=new Uint8Array([0,0,0,0,3,23+n,0,1,0,4,15+n,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([n]).concat(i).concat([6,1,2]));return e.box(e.types.esds,a)},e.Opus=function(t){var i=t.channelCount,n=t.audioSampleRate,a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,i,0,16,0,0,0,0,n>>>8&255,255&n,0,0]);return e.box(e.types.Opus,a,e.dOps(t))},e.dOps=function(t){var i=t.channelCount,n=t.channelConfigCode,a=t.audioSampleRate;if(t.config)return e.box(e.types.dOps,s);var r=[];switch(n){case 1:case 2:r=[0];break;case 0:r=[255,1,1,0,1];break;case 128:r=[255,2,0,0,1];break;case 3:r=[1,2,1,0,2,1];break;case 4:r=[1,2,2,0,1,2,3];break;case 5:r=[1,3,2,0,4,1,2,3];break;case 6:r=[1,4,2,0,4,1,2,3,5];break;case 7:r=[1,4,2,0,4,1,2,3,5,6];break;case 8:r=[1,5,3,0,6,1,2,3,4,5,7];break;case 130:r=[1,1,2,0,1];break;case 131:r=[1,1,3,0,1,2];break;case 132:r=[1,1,4,0,1,2,3];break;case 133:r=[1,1,5,0,1,2,3,4];break;case 134:r=[1,1,6,0,1,2,3,4,5];break;case 135:r=[1,1,7,0,1,2,3,4,5,6];break;case 136:r=[1,1,8,0,1,2,3,4,5,6,7]}var s=new Uint8Array(Se([0,i,0,0,a>>>24&255,a>>>17&255,a>>>8&255,a>>>0&255,0,0],r));return e.box(e.types.dOps,s)},e.avc1=function(t){var i=t.avcc,n=t.codecWidth,a=t.codecHeight,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,a>>>8&255,255&a,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.avc1,r,e.box(e.types.avcC,i))},e.hvc1=function(t){var i=t.hvcc,n=t.codecWidth,a=t.codecHeight,r=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,n>>>8&255,255&n,a>>>8&255,255&a,0,72,0,0,0,72,0,0,0,0,0,0,0,1,10,120,113,113,47,102,108,118,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,255,255]);return e.box(e.types.hvc1,r,e.box(e.types.hvcC,i))},e.mvex=function(t){return e.box(e.types.mvex,e.trex(t))},e.trex=function(t){var i=t.id,n=new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]);return e.box(e.types.trex,n)},e.moof=function(t,i){return e.box(e.types.moof,e.mfhd(t.sequenceNumber),e.traf(t,i))},e.mfhd=function(t){var i=new Uint8Array([0,0,0,0,t>>>24&255,t>>>16&255,t>>>8&255,255&t]);return e.box(e.types.mfhd,i)},e.traf=function(t,i){var n=t.id,a=e.box(e.types.tfhd,new Uint8Array([0,0,0,0,n>>>24&255,n>>>16&255,n>>>8&255,255&n])),r=e.box(e.types.tfdt,new Uint8Array([0,0,0,0,i>>>24&255,i>>>16&255,i>>>8&255,255&i])),s=e.sdtp(t),o=e.trun(t,s.byteLength+16+16+8+16+8+8);return e.box(e.types.traf,a,r,o,s)},e.sdtp=function(t){for(var i=t.samples||[],n=i.length,a=new Uint8Array(4+n),r=0;r>>24&255,a>>>16&255,a>>>8&255,255&a,i>>>24&255,i>>>16&255,i>>>8&255,255&i],0);for(var o=0;o>>24&255,d>>>16&255,d>>>8&255,255&d,_>>>24&255,_>>>16&255,_>>>8&255,255&_,h.isLeading<<2|h.dependsOn,h.isDependedOn<<6|h.hasRedundancy<<4|h.isNonSync,0,0,c>>>24&255,c>>>16&255,c>>>8&255,255&c],12+16*o)}return e.box(e.types.trun,s)},e.mdat=function(t){return e.box(e.types.mdat,t)},e}();Ee.init();var Ae=Ee,Re=function(){function e(){}return e.getSilentFrame=function(e,t){if("mp4a.40.2"===e){if(1===t)return new Uint8Array([0,200,0,128,35,128]);if(2===t)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===t)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===t)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===t)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}return null},e}(),Te=i(7),Le=function(){function e(e){this.TAG="MP4Remuxer",this._config=e,this._isLive=!0===e.isLive,this._dtsBase=-1,this._dtsBaseInited=!1,this._audioDtsBase=1/0,this._videoDtsBase=1/0,this._audioNextDts=void 0,this._videoNextDts=void 0,this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList=new Te.c("audio"),this._videoSegmentInfoList=new Te.c("video"),this._onInitSegment=null,this._onMediaSegment=null,this._forceFirstIDR=!(!s.a.chrome||!(s.a.version.major<50||50===s.a.version.major&&s.a.version.build<2661)),this._fillSilentAfterSeek=s.a.msedge||s.a.msie,this._mp3UseMpegAudio=!s.a.firefox,this._fillAudioTimestampGap=this._config.fixAudioTimestampGap}return e.prototype.destroy=function(){this._dtsBase=-1,this._dtsBaseInited=!1,this._audioMeta=null,this._videoMeta=null,this._audioSegmentInfoList.clear(),this._audioSegmentInfoList=null,this._videoSegmentInfoList.clear(),this._videoSegmentInfoList=null,this._onInitSegment=null,this._onMediaSegment=null},e.prototype.bindDataSource=function(e){return e.onDataAvailable=this.remux.bind(this),e.onTrackMetadata=this._onTrackMetadataReceived.bind(this),this},Object.defineProperty(e.prototype,"onInitSegment",{get:function(){return this._onInitSegment},set:function(e){this._onInitSegment=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onMediaSegment",{get:function(){return this._onMediaSegment},set:function(e){this._onMediaSegment=e},enumerable:!1,configurable:!0}),e.prototype.insertDiscontinuity=function(){this._audioNextDts=this._videoNextDts=void 0},e.prototype.seek=function(e){this._audioStashedLastSample=null,this._videoStashedLastSample=null,this._videoSegmentInfoList.clear(),this._audioSegmentInfoList.clear()},e.prototype.remux=function(e,t){if(!this._onMediaSegment)throw new c.a("MP4Remuxer: onMediaSegment callback must be specificed!");this._dtsBaseInited||this._calculateDtsBase(e,t),t&&this._remuxVideo(t),e&&this._remuxAudio(e)},e.prototype._onTrackMetadataReceived=function(e,t){var i=null,n="mp4",a=t.codec;if("audio"===e)this._audioMeta=t,"mp3"===t.codec&&this._mp3UseMpegAudio?(n="mpeg",a="",i=new Uint8Array):i=Ae.generateInitSegment(t);else{if("video"!==e)return;this._videoMeta=t,i=Ae.generateInitSegment(t)}if(!this._onInitSegment)throw new c.a("MP4Remuxer: onInitSegment callback must be specified!");this._onInitSegment(e,{type:e,data:i.buffer,codec:a,container:e+"/"+n,mediaDuration:t.duration})},e.prototype._calculateDtsBase=function(e,t){this._dtsBaseInited||(e&&e.samples&&e.samples.length&&(this._audioDtsBase=e.samples[0].dts),t&&t.samples&&t.samples.length&&(this._videoDtsBase=t.samples[0].dts),this._dtsBase=Math.min(this._audioDtsBase,this._videoDtsBase),this._dtsBaseInited=!0)},e.prototype.getTimestampBase=function(){if(this._dtsBaseInited)return this._dtsBase},e.prototype.flushStashedSamples=function(){var e=this._videoStashedLastSample,t=this._audioStashedLastSample,i={type:"video",id:1,sequenceNumber:0,samples:[],length:0};null!=e&&(i.samples.push(e),i.length=e.length);var n={type:"audio",id:2,sequenceNumber:0,samples:[],length:0};null!=t&&(n.samples.push(t),n.length=t.length),this._videoStashedLastSample=null,this._audioStashedLastSample=null,this._remuxVideo(i,!0),this._remuxAudio(n,!0)},e.prototype._remuxAudio=function(e,t){if(null!=this._audioMeta){var i,n=e,a=n.samples,o=void 0,d=-1,_=this._audioMeta.refSampleDuration,h="mp3"===this._audioMeta.codec&&this._mp3UseMpegAudio,c=this._dtsBaseInited&&void 0===this._audioNextDts,u=!1;if(a&&0!==a.length&&(1!==a.length||t)){var l=0,f=null,p=0;h?(l=0,p=n.length):(l=8,p=8+n.length);var m=null;if(a.length>1&&(p-=(m=a.pop()).length),null!=this._audioStashedLastSample){var g=this._audioStashedLastSample;this._audioStashedLastSample=null,a.unshift(g),p+=g.length}null!=m&&(this._audioStashedLastSample=m);var v=a[0].dts-this._dtsBase;if(this._audioNextDts)o=v-this._audioNextDts;else if(this._audioSegmentInfoList.isEmpty())o=0,this._fillSilentAfterSeek&&!this._videoSegmentInfoList.isEmpty()&&"mp3"!==this._audioMeta.originalCodec&&(u=!0);else{var y=this._audioSegmentInfoList.getLastSampleBefore(v);if(null!=y){var b=v-(y.originalDts+y.duration);b<=3&&(b=0),o=v-(y.dts+y.duration+b)}else o=0}if(u){var S=v-o,E=this._videoSegmentInfoList.getLastSegmentBefore(v);if(null!=E&&E.beginDts=3*_&&this._fillAudioTimestampGap&&!s.a.safari){D=!0;var O,P=Math.floor(o/_);r.a.w(this.TAG,"Large audio timestamp gap detected, may cause AV sync to drift. Silent frames will be generated to avoid unsync.\noriginalDts: "+k+" ms, curRefDts: "+I+" ms, dtsCorrection: "+Math.round(o)+" ms, generate: "+P+" frames"),A=Math.floor(I),B=Math.floor(I+_)-A,null==(O=Re.getSilentFrame(this._audioMeta.originalCodec,this._audioMeta.channelCount))&&(r.a.w(this.TAG,"Unable to generate silent frame for "+this._audioMeta.originalCodec+" with "+this._audioMeta.channelCount+" channels, repeat last frame"),O=w),C=[];for(var M=0;M=1?T[T.length-1].duration:Math.floor(_);this._audioNextDts=A+B}-1===d&&(d=A),T.push({dts:A,pts:A,cts:0,unit:g.unit,size:g.unit.byteLength,duration:B,originalDts:k,flags:{isLeading:0,dependsOn:1,isDependedOn:0,hasRedundancy:0}}),D&&T.push.apply(T,C)}}if(0===T.length)return n.samples=[],void(n.length=0);h?f=new Uint8Array(p):((f=new Uint8Array(p))[0]=p>>>24&255,f[1]=p>>>16&255,f[2]=p>>>8&255,f[3]=255&p,f.set(Ae.types.mdat,4));for(L=0;L1&&(c-=(u=r.pop()).length),null!=this._videoStashedLastSample){var l=this._videoStashedLastSample;this._videoStashedLastSample=null,r.unshift(l),c+=l.length}null!=u&&(this._videoStashedLastSample=u);var f=r[0].dts-this._dtsBase;if(this._videoNextDts)s=f-this._videoNextDts;else if(this._videoSegmentInfoList.isEmpty())s=0;else{var p=this._videoSegmentInfoList.getLastSampleBefore(f);if(null!=p){var m=f-(p.originalDts+p.duration);m<=3&&(m=0),s=f-(p.dts+p.duration+m)}else s=0}for(var g=new Te.b,v=[],y=0;y=1?v[v.length-1].duration:Math.floor(this._videoMeta.refSampleDuration);if(S){var L=new Te.d(E,R,T,l.dts,!0);L.fileposition=l.fileposition,g.appendSyncPoint(L)}v.push({dts:E,pts:R,cts:A,units:l.units,size:l.length,isKeyframe:S,duration:T,originalDts:b,flags:{isLeading:0,dependsOn:S?2:1,isDependedOn:S?1:0,hasRedundancy:0,isNonSync:S?0:1}})}(h=new Uint8Array(c))[0]=c>>>24&255,h[1]=c>>>16&255,h[2]=c>>>8&255,h[3]=255&c,h.set(Ae.types.mdat,4);for(y=0;y0)this._demuxer.bindDataSource(this._ioctl),this._demuxer.timestampBase=this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase,n=this._demuxer.parseChunks(e,t);else{var a=null;(a=A.probe(e)).match&&(this._setupFLVDemuxerRemuxer(a),n=this._demuxer.parseChunks(e,t)),a.match||a.needMoreData||(a=be.probe(e)).match&&(this._setupTSDemuxerRemuxer(a),n=this._demuxer.parseChunks(e,t)),a.match||a.needMoreData||(a=null,r.a.e(this.TAG,"Non MPEG-TS/FLV, Unsupported media type!"),Promise.resolve().then((function(){i._internalAbort()})),this._emitter.emit(ke.a.DEMUX_ERROR,m.a.FORMAT_UNSUPPORTED,"Non MPEG-TS/FLV, Unsupported media type!"))}return n},e.prototype._setupFLVDemuxerRemuxer=function(e){this._demuxer=new A(e,this._config),this._remuxer||(this._remuxer=new Le(this._config));var t=this._mediaDataSource;null==t.duration||isNaN(t.duration)||(this._demuxer.overridedDuration=t.duration),"boolean"==typeof t.hasAudio&&(this._demuxer.overridedHasAudio=t.hasAudio),"boolean"==typeof t.hasVideo&&(this._demuxer.overridedHasVideo=t.hasVideo),this._demuxer.timestampBase=t.segments[this._currentSegmentIndex].timestampBase,this._demuxer.onError=this._onDemuxException.bind(this),this._demuxer.onMediaInfo=this._onMediaInfo.bind(this),this._demuxer.onMetaDataArrived=this._onMetaDataArrived.bind(this),this._demuxer.onScriptDataArrived=this._onScriptDataArrived.bind(this),this._remuxer.bindDataSource(this._demuxer.bindDataSource(this._ioctl)),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this)},e.prototype._setupTSDemuxerRemuxer=function(e){var t=this._demuxer=new be(e,this._config);this._remuxer||(this._remuxer=new Le(this._config)),t.onError=this._onDemuxException.bind(this),t.onMediaInfo=this._onMediaInfo.bind(this),t.onMetaDataArrived=this._onMetaDataArrived.bind(this),t.onTimedID3Metadata=this._onTimedID3Metadata.bind(this),t.onSMPTE2038Metadata=this._onSMPTE2038Metadata.bind(this),t.onSCTE35Metadata=this._onSCTE35Metadata.bind(this),t.onPESPrivateDataDescriptor=this._onPESPrivateDataDescriptor.bind(this),t.onPESPrivateData=this._onPESPrivateData.bind(this),this._remuxer.bindDataSource(this._demuxer),this._demuxer.bindDataSource(this._ioctl),this._remuxer.onInitSegment=this._onRemuxerInitSegmentArrival.bind(this),this._remuxer.onMediaSegment=this._onRemuxerMediaSegmentArrival.bind(this)},e.prototype._onMediaInfo=function(e){var t=this;null==this._mediaInfo&&(this._mediaInfo=Object.assign({},e),this._mediaInfo.keyframesIndex=null,this._mediaInfo.segments=[],this._mediaInfo.segmentCount=this._mediaDataSource.segments.length,Object.setPrototypeOf(this._mediaInfo,o.a.prototype));var i=Object.assign({},e);Object.setPrototypeOf(i,o.a.prototype),this._mediaInfo.segments[this._currentSegmentIndex]=i,this._reportSegmentMediaInfo(this._currentSegmentIndex),null!=this._pendingSeekTime&&Promise.resolve().then((function(){var e=t._pendingSeekTime;t._pendingSeekTime=null,t.seek(e)}))},e.prototype._onMetaDataArrived=function(e){this._emitter.emit(ke.a.METADATA_ARRIVED,e)},e.prototype._onScriptDataArrived=function(e){this._emitter.emit(ke.a.SCRIPTDATA_ARRIVED,e)},e.prototype._onTimedID3Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(ke.a.TIMED_ID3_METADATA_ARRIVED,e))},e.prototype._onSMPTE2038Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.dts&&(e.dts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),this._emitter.emit(ke.a.SMPTE2038_METADATA_ARRIVED,e))},e.prototype._onSCTE35Metadata=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),this._emitter.emit(ke.a.SCTE35_METADATA_ARRIVED,e))},e.prototype._onPESPrivateDataDescriptor=function(e){this._emitter.emit(ke.a.PES_PRIVATE_DATA_DESCRIPTOR,e)},e.prototype._onPESPrivateData=function(e){var t=this._remuxer.getTimestampBase();null!=t&&(null!=e.pts&&(e.pts-=t),null!=e.nearest_pts&&(e.nearest_pts-=t),null!=e.dts&&(e.dts-=t),this._emitter.emit(ke.a.PES_PRIVATE_DATA_ARRIVED,e))},e.prototype._onIOSeeked=function(){this._remuxer.insertDiscontinuity()},e.prototype._onIOComplete=function(e){var t=e+1;t0&&i[0].originalDts===n&&(n=i[0].pts),this._emitter.emit(ke.a.RECOMMEND_SEEKPOINT,n)}},e.prototype._enableStatisticsReporter=function(){null==this._statisticsReporter&&(this._statisticsReporter=self.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval))},e.prototype._disableStatisticsReporter=function(){this._statisticsReporter&&(self.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype._reportSegmentMediaInfo=function(e){var t=this._mediaInfo.segments[e],i=Object.assign({},t);i.duration=this._mediaInfo.duration,i.segmentCount=this._mediaInfo.segmentCount,delete i.segments,delete i.keyframesIndex,this._emitter.emit(ke.a.MEDIA_INFO,i)},e.prototype._reportStatisticsInfo=function(){var e={};e.url=this._ioctl.currentURL,e.hasRedirect=this._ioctl.hasRedirect,e.hasRedirect&&(e.redirectedURL=this._ioctl.currentRedirectedURL),e.speed=this._ioctl.currentSpeed,e.loaderType=this._ioctl.loaderType,e.currentSegmentIndex=this._currentSegmentIndex,e.totalSegmentCount=this._mediaDataSource.segments.length,this._emitter.emit(ke.a.STATISTICS_INFO,e)},e}();t.a=De},function(e,t,i){"use strict";var n,a=i(0),r=function(){function e(){this._firstCheckpoint=0,this._lastCheckpoint=0,this._intervalBytes=0,this._totalBytes=0,this._lastSecondBytes=0,self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now}return e.prototype.reset=function(){this._firstCheckpoint=this._lastCheckpoint=0,this._totalBytes=this._intervalBytes=0,this._lastSecondBytes=0},e.prototype.addBytes=function(e){0===this._firstCheckpoint?(this._firstCheckpoint=this._now(),this._lastCheckpoint=this._firstCheckpoint,this._intervalBytes+=e,this._totalBytes+=e):this._now()-this._lastCheckpoint<1e3?(this._intervalBytes+=e,this._totalBytes+=e):(this._lastSecondBytes=this._intervalBytes,this._intervalBytes=e,this._totalBytes+=e,this._lastCheckpoint=this._now())},Object.defineProperty(e.prototype,"currentKBps",{get:function(){this.addBytes(0);var e=(this._now()-this._lastCheckpoint)/1e3;return 0==e&&(e=1),this._intervalBytes/e/1024},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"lastSecondKBps",{get:function(){return this.addBytes(0),0!==this._lastSecondBytes?this._lastSecondBytes/1024:this._now()-this._lastCheckpoint>=500?this.currentKBps:0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"averageKBps",{get:function(){var e=(this._now()-this._firstCheckpoint)/1e3;return this._totalBytes/e/1024},enumerable:!1,configurable:!0}),e}(),s=i(2),o=i(4),d=i(3),_=(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)},function(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),h=function(e){function t(t,i){var n=e.call(this,"fetch-stream-loader")||this;return n.TAG="FetchStreamLoader",n._seekHandler=t,n._config=i,n._needStash=!0,n._requestAbort=!1,n._abortController=null,n._contentLength=null,n._receivedLength=0,n}return _(t,e),t.isSupported=function(){try{var e=o.a.msedge&&o.a.version.minor>=15048,t=!o.a.msedge||e;return self.fetch&&self.ReadableStream&&t}catch(e){return!1}},t.prototype.destroy=function(){this.isWorking()&&this.abort(),e.prototype.destroy.call(this)},t.prototype.open=function(e,t){var i=this;this._dataSource=e,this._range=t;var n=e.url;this._config.reuseRedirectedURL&&null!=e.redirectedURL&&(n=e.redirectedURL);var a=this._seekHandler.getConfig(n,t),r=new self.Headers;if("object"==typeof a.headers){var o=a.headers;for(var _ in o)o.hasOwnProperty(_)&&r.append(_,o[_])}var h={method:"GET",headers:r,mode:"cors",cache:"default",referrerPolicy:"no-referrer-when-downgrade"};if("object"==typeof this._config.headers)for(var _ in this._config.headers)r.append(_,this._config.headers[_]);!1===e.cors&&(h.mode="same-origin"),e.withCredentials&&(h.credentials="include"),e.referrerPolicy&&(h.referrerPolicy=e.referrerPolicy),self.AbortController&&(this._abortController=new self.AbortController,h.signal=this._abortController.signal),this._status=s.c.kConnecting,self.fetch(a.url,h).then((function(e){if(i._requestAbort)return i._status=s.c.kIdle,void e.body.cancel();if(e.ok&&e.status>=200&&e.status<=299){if(e.url!==a.url&&i._onURLRedirect){var t=i._seekHandler.removeURLParameters(e.url);i._onURLRedirect(t)}var n=e.headers.get("Content-Length");return null!=n&&(i._contentLength=parseInt(n),0!==i._contentLength&&i._onContentLengthKnown&&i._onContentLengthKnown(i._contentLength)),i._pump.call(i,e.body.getReader())}if(i._status=s.c.kError,!i._onError)throw new d.d("FetchStreamLoader: Http code invalid, "+e.status+" "+e.statusText);i._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:e.status,msg:e.statusText})})).catch((function(e){if(!i._abortController||!i._abortController.signal.aborted){if(i._status=s.c.kError,!i._onError)throw e;i._onError(s.b.EXCEPTION,{code:-1,msg:e.message})}}))},t.prototype.abort=function(){if(this._requestAbort=!0,(this._status!==s.c.kBuffering||!o.a.chrome)&&this._abortController)try{this._abortController.abort()}catch(e){}},t.prototype._pump=function(e){var t=this;return e.read().then((function(i){if(i.done)if(null!==t._contentLength&&t._receivedLength299)){if(this._status=s.c.kError,!this._onError)throw new d.d("MozChunkedLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}else this._status=s.c.kBuffering}},t.prototype._onProgress=function(e){if(this._status!==s.c.kError){null===this._contentLength&&null!==e.total&&0!==e.total&&(this._contentLength=e.total,this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength));var t=e.target.response,i=this._range.from+this._receivedLength;this._receivedLength+=t.byteLength,this._onDataArrival&&this._onDataArrival(t,i,this._receivedLength)}},t.prototype._onLoadEnd=function(e){!0!==this._requestAbort?this._status!==s.c.kError&&(this._status=s.c.kComplete,this._onComplete&&this._onComplete(this._range.from,this._range.from+this._receivedLength-1)):this._requestAbort=!1},t.prototype._onXhrError=function(e){this._status=s.c.kError;var t=0,i=null;if(this._contentLength&&e.loaded=this._contentLength&&(i=this._range.from+this._contentLength-1),this._currentRequestRange={from:t,to:i},this._internalOpen(this._dataSource,this._currentRequestRange)},t.prototype._internalOpen=function(e,t){this._lastTimeLoaded=0;var i=e.url;this._config.reuseRedirectedURL&&(null!=this._currentRedirectedURL?i=this._currentRedirectedURL:null!=e.redirectedURL&&(i=e.redirectedURL));var n=this._seekHandler.getConfig(i,t);this._currentRequestURL=n.url;var a=this._xhr=new XMLHttpRequest;if(a.open("GET",n.url,!0),a.responseType="arraybuffer",a.onreadystatechange=this._onReadyStateChange.bind(this),a.onprogress=this._onProgress.bind(this),a.onload=this._onLoad.bind(this),a.onerror=this._onXhrError.bind(this),e.withCredentials&&(a.withCredentials=!0),"object"==typeof n.headers){var r=n.headers;for(var s in r)r.hasOwnProperty(s)&&a.setRequestHeader(s,r[s])}if("object"==typeof this._config.headers){r=this._config.headers;for(var s in r)r.hasOwnProperty(s)&&a.setRequestHeader(s,r[s])}a.send()},t.prototype.abort=function(){this._requestAbort=!0,this._internalAbort(),this._status=s.c.kComplete},t.prototype._internalAbort=function(){this._xhr&&(this._xhr.onreadystatechange=null,this._xhr.onprogress=null,this._xhr.onload=null,this._xhr.onerror=null,this._xhr.abort(),this._xhr=null)},t.prototype._onReadyStateChange=function(e){var t=e.target;if(2===t.readyState){if(null!=t.responseURL){var i=this._seekHandler.removeURLParameters(t.responseURL);t.responseURL!==this._currentRequestURL&&i!==this._currentRedirectedURL&&(this._currentRedirectedURL=i,this._onURLRedirect&&this._onURLRedirect(i))}if(t.status>=200&&t.status<=299){if(this._waitForTotalLength)return;this._status=s.c.kBuffering}else{if(this._status=s.c.kError,!this._onError)throw new d.d("RangeLoader: Http code invalid, "+t.status+" "+t.statusText);this._onError(s.b.HTTP_STATUS_CODE_INVALID,{code:t.status,msg:t.statusText})}}},t.prototype._onProgress=function(e){if(this._status!==s.c.kError){if(null===this._contentLength){var t=!1;if(this._waitForTotalLength){this._waitForTotalLength=!1,this._totalLengthReceived=!0,t=!0;var i=e.total;this._internalAbort(),null!=i&0!==i&&(this._totalLength=i)}if(-1===this._range.to?this._contentLength=this._totalLength-this._range.from:this._contentLength=this._range.to-this._range.from+1,t)return void this._openSubRange();this._onContentLengthKnown&&this._onContentLengthKnown(this._contentLength)}var n=e.loaded-this._lastTimeLoaded;this._lastTimeLoaded=e.loaded,this._speedSampler.addBytes(n)}},t.prototype._normalizeSpeed=function(e){var t=this._chunkSizeKBList,i=t.length-1,n=0,a=0,r=i;if(e=t[n]&&e=3&&(t=this._speedSampler.currentKBps)),0!==t){var i=this._normalizeSpeed(t);this._currentSpeedNormalized!==i&&(this._currentSpeedNormalized=i,this._currentChunkSizeKB=i)}var n=e.target.response,a=this._range.from+this._receivedLength;this._receivedLength+=n.byteLength;var r=!1;null!=this._contentLength&&this._receivedLength0&&this._receivedLength0)for(var r=i.split("&"),s=0;s0;o[0]!==this._startName&&o[0]!==this._endName&&(d&&(a+="&"),a+=r[s])}return 0===a.length?t:t+"?"+a},e}(),y=function(){function e(e,t,i){this.TAG="IOController",this._config=t,this._extraData=i,this._stashInitialSize=65536,null!=t.stashInitialSize&&t.stashInitialSize>0&&(this._stashInitialSize=t.stashInitialSize),this._stashUsed=0,this._stashSize=this._stashInitialSize,this._bufferSize=3145728,this._stashBuffer=new ArrayBuffer(this._bufferSize),this._stashByteStart=0,this._enableStash=!0,!1===t.enableStashBuffer&&(this._enableStash=!1),this._loader=null,this._loaderClass=null,this._seekHandler=null,this._dataSource=e,this._isWebSocketURL=/wss?:\/\/(.+?)/.test(e.url),this._refTotalLength=e.filesize?e.filesize:null,this._totalLength=this._refTotalLength,this._fullRequestFlag=!1,this._currentRange=null,this._redirectedURL=null,this._speedNormalized=0,this._speedSampler=new r,this._speedNormalizeList=[32,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096],this._isEarlyEofReconnecting=!1,this._paused=!1,this._resumeFrom=0,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._selectSeekHandler(),this._selectLoader(),this._createLoader()}return e.prototype.destroy=function(){this._loader.isWorking()&&this._loader.abort(),this._loader.destroy(),this._loader=null,this._loaderClass=null,this._dataSource=null,this._stashBuffer=null,this._stashUsed=this._stashSize=this._bufferSize=this._stashByteStart=0,this._currentRange=null,this._speedSampler=null,this._isEarlyEofReconnecting=!1,this._onDataArrival=null,this._onSeeked=null,this._onError=null,this._onComplete=null,this._onRedirect=null,this._onRecoveredEarlyEof=null,this._extraData=null},e.prototype.isWorking=function(){return this._loader&&this._loader.isWorking()&&!this._paused},e.prototype.isPaused=function(){return this._paused},Object.defineProperty(e.prototype,"status",{get:function(){return this._loader.status},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extraData",{get:function(){return this._extraData},set:function(e){this._extraData=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onDataArrival",{get:function(){return this._onDataArrival},set:function(e){this._onDataArrival=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onSeeked",{get:function(){return this._onSeeked},set:function(e){this._onSeeked=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onError",{get:function(){return this._onError},set:function(e){this._onError=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onComplete",{get:function(){return this._onComplete},set:function(e){this._onComplete=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRedirect",{get:function(){return this._onRedirect},set:function(e){this._onRedirect=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"onRecoveredEarlyEof",{get:function(){return this._onRecoveredEarlyEof},set:function(e){this._onRecoveredEarlyEof=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentURL",{get:function(){return this._dataSource.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasRedirect",{get:function(){return null!=this._redirectedURL||null!=this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentRedirectedURL",{get:function(){return this._redirectedURL||this._dataSource.redirectedURL},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentSpeed",{get:function(){return this._loaderClass===f?this._loader.currentSpeed:this._speedSampler.lastSecondKBps},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"loaderType",{get:function(){return this._loader.type},enumerable:!1,configurable:!0}),e.prototype._selectSeekHandler=function(){var e=this._config;if("range"===e.seekType)this._seekHandler=new g(this._config.rangeLoadZeroStart);else if("param"===e.seekType){var t=e.seekParamStart||"bstart",i=e.seekParamEnd||"bend";this._seekHandler=new v(t,i)}else{if("custom"!==e.seekType)throw new d.b("Invalid seekType in config: "+e.seekType);if("function"!=typeof e.customSeekHandler)throw new d.b("Custom seekType specified in config but invalid customSeekHandler!");this._seekHandler=new e.customSeekHandler}},e.prototype._selectLoader=function(){if(null!=this._config.customLoader)this._loaderClass=this._config.customLoader;else if(this._isWebSocketURL)this._loaderClass=m;else if(h.isSupported())this._loaderClass=h;else if(u.isSupported())this._loaderClass=u;else{if(!f.isSupported())throw new d.d("Your browser doesn't support xhr with arraybuffer responseType!");this._loaderClass=f}},e.prototype._createLoader=function(){this._loader=new this._loaderClass(this._seekHandler,this._config),!1===this._loader.needStashBuffer&&(this._enableStash=!1),this._loader.onContentLengthKnown=this._onContentLengthKnown.bind(this),this._loader.onURLRedirect=this._onURLRedirect.bind(this),this._loader.onDataArrival=this._onLoaderChunkArrival.bind(this),this._loader.onComplete=this._onLoaderComplete.bind(this),this._loader.onError=this._onLoaderError.bind(this)},e.prototype.open=function(e){this._currentRange={from:0,to:-1},e&&(this._currentRange.from=e),this._speedSampler.reset(),e||(this._fullRequestFlag=!0),this._loader.open(this._dataSource,Object.assign({},this._currentRange))},e.prototype.abort=function(){this._loader.abort(),this._paused&&(this._paused=!1,this._resumeFrom=0)},e.prototype.pause=function(){this.isWorking()&&(this._loader.abort(),0!==this._stashUsed?(this._resumeFrom=this._stashByteStart,this._currentRange.to=this._stashByteStart-1):this._resumeFrom=this._currentRange.to+1,this._stashUsed=0,this._stashByteStart=0,this._paused=!0)},e.prototype.resume=function(){if(this._paused){this._paused=!1;var e=this._resumeFrom;this._resumeFrom=0,this._internalSeek(e,!0)}},e.prototype.seek=function(e){this._paused=!1,this._stashUsed=0,this._stashByteStart=0,this._internalSeek(e,!0)},e.prototype._internalSeek=function(e,t){this._loader.isWorking()&&this._loader.abort(),this._flushStashBuffer(t),this._loader.destroy(),this._loader=null;var i={from:e,to:-1};this._currentRange={from:i.from,to:-1},this._speedSampler.reset(),this._stashSize=this._stashInitialSize,this._createLoader(),this._loader.open(this._dataSource,i),this._onSeeked&&this._onSeeked()},e.prototype.updateUrl=function(e){if(!e||"string"!=typeof e||0===e.length)throw new d.b("Url must be a non-empty string!");this._dataSource.url=e},e.prototype._expandBuffer=function(e){for(var t=this._stashSize;t+10485760){var n=new Uint8Array(this._stashBuffer,0,this._stashUsed);new Uint8Array(i,0,t).set(n,0)}this._stashBuffer=i,this._bufferSize=t}},e.prototype._normalizeSpeed=function(e){var t=this._speedNormalizeList,i=t.length-1,n=0,a=0,r=i;if(e=t[n]&&e=512&&e<=1024?Math.floor(1.5*e):2*e)>8192&&(t=8192);var i=1024*t+1048576;this._bufferSize0){var r=this._stashBuffer.slice(0,this._stashUsed);if((_=this._dispatchChunks(r,this._stashByteStart))0){h=new Uint8Array(r,_);o.set(h,0),this._stashUsed=h.byteLength,this._stashByteStart+=_}}else this._stashUsed=0,this._stashByteStart+=_;this._stashUsed+e.byteLength>this._bufferSize&&(this._expandBuffer(this._stashUsed+e.byteLength),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength}else{if((_=this._dispatchChunks(e,t))this._bufferSize&&(this._expandBuffer(s),o=new Uint8Array(this._stashBuffer,0,this._bufferSize)),o.set(new Uint8Array(e,_),0),this._stashUsed+=s,this._stashByteStart=t+_}}else if(0===this._stashUsed){var s;if((_=this._dispatchChunks(e,t))this._bufferSize&&this._expandBuffer(s),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e,_),0),this._stashUsed+=s,this._stashByteStart=t+_}else{var o,_;if(this._stashUsed+e.byteLength>this._bufferSize&&this._expandBuffer(this._stashUsed+e.byteLength),(o=new Uint8Array(this._stashBuffer,0,this._bufferSize)).set(new Uint8Array(e),this._stashUsed),this._stashUsed+=e.byteLength,(_=this._dispatchChunks(this._stashBuffer.slice(0,this._stashUsed),this._stashByteStart))0){var h=new Uint8Array(this._stashBuffer,_);o.set(h,0)}this._stashUsed-=_,this._stashByteStart+=_}}},e.prototype._flushStashBuffer=function(e){if(this._stashUsed>0){var t=this._stashBuffer.slice(0,this._stashUsed),i=this._dispatchChunks(t,this._stashByteStart),n=t.byteLength-i;if(i0){var r=new Uint8Array(this._stashBuffer,0,this._bufferSize),s=new Uint8Array(t,i);r.set(s,0),this._stashUsed=s.byteLength,this._stashByteStart+=i}return 0}a.a.w(this.TAG,n+" bytes unconsumed data remain when flush buffer, dropped")}return this._stashUsed=0,this._stashByteStart=0,n}return 0},e.prototype._onLoaderComplete=function(e,t){this._flushStashBuffer(!0),this._onComplete&&this._onComplete(this._extraData)},e.prototype._onLoaderError=function(e,t){switch(a.a.e(this.TAG,"Loader error, code = "+t.code+", msg = "+t.msg),this._flushStashBuffer(!1),this._isEarlyEofReconnecting&&(this._isEarlyEofReconnecting=!1,e=s.b.UNRECOVERABLE_EARLY_EOF),e){case s.b.EARLY_EOF:if(!this._config.isLive&&this._totalLength){var i=this._currentRange.to+1;return void(i0}),!1)}e.exports=function(e,t){t=t||{};var a={main:i.m},o=t.all?{main:Object.keys(a.main)}:function(e,t){for(var i={main:[t]},n={main:[]},a={main:{}};s(i);)for(var o=Object.keys(i),d=0;d1)for(var i=1;i0&&(n+=";codecs="+i.codec);var a=!1;if(c.a.v(this.TAG,"Received Initialization Segment, mimeType: "+n),this._lastInitSegments[i.type]=i,n!==this._mimeTypes[i.type]){if(this._mimeTypes[i.type])c.a.v(this.TAG,"Notice: "+i.type+" mimeType changed, origin: "+this._mimeTypes[i.type]+", target: "+n);else{a=!0;try{var r=this._sourceBuffers[i.type]=this._mediaSource.addSourceBuffer(n);r.addEventListener("error",this.e.onSourceBufferError),r.addEventListener("updateend",this.e.onSourceBufferUpdateEnd)}catch(e){return c.a.e(this.TAG,e.message),void this._emitter.emit(S.ERROR,{code:e.code,msg:e.message})}}this._mimeTypes[i.type]=n}t||this._pendingSegments[i.type].push(i),a||this._sourceBuffers[i.type]&&!this._sourceBuffers[i.type].updating&&this._doAppendSegments(),u.a.safari&&"audio/mpeg"===i.container&&i.mediaDuration>0&&(this._requireSetMediaDuration=!0,this._pendingMediaDuration=i.mediaDuration/1e3,this._updateMediaSourceDuration())},e.prototype.appendMediaSegment=function(e){var t=e;this._pendingSegments[t.type].push(t),this._config.autoCleanupSourceBuffer&&this._needCleanupSourceBuffer()&&this._doCleanupSourceBuffer();var i=this._sourceBuffers[t.type];!i||i.updating||this._hasPendingRemoveRanges()||this._doAppendSegments()},e.prototype.seek=function(e){for(var t in this._sourceBuffers)if(this._sourceBuffers[t]){var i=this._sourceBuffers[t];if("open"===this._mediaSource.readyState)try{i.abort()}catch(e){c.a.e(this.TAG,e.message)}this._idrList.clear();var n=this._pendingSegments[t];if(n.splice(0,n.length),"closed"!==this._mediaSource.readyState){for(var a=0;a=1&&e-n.start(0)>=this._config.autoCleanupMaxBackwardDuration)return!0}}return!1},e.prototype._doCleanupSourceBuffer=function(){var e=this._mediaElement.currentTime;for(var t in this._sourceBuffers){var i=this._sourceBuffers[t];if(i){for(var n=i.buffered,a=!1,r=0;r=this._config.autoCleanupMaxBackwardDuration){a=!0;var d=e-this._config.autoCleanupMinBackwardDuration;this._pendingRemoveRanges[t].push({start:s,end:d})}}else o0&&(isNaN(t)||i>t)&&(c.a.v(this.TAG,"Update MediaSource duration from "+t+" to "+i),this._mediaSource.duration=i),this._requireSetMediaDuration=!1,this._pendingMediaDuration=0}},e.prototype._doRemoveRanges=function(){for(var e in this._pendingRemoveRanges)if(this._sourceBuffers[e]&&!this._sourceBuffers[e].updating)for(var t=this._sourceBuffers[e],i=this._pendingRemoveRanges[e];i.length&&!t.updating;){var n=i.shift();t.remove(n.start,n.end)}},e.prototype._doAppendSegments=function(){var e=this._pendingSegments;for(var t in e)if(this._sourceBuffers[t]&&!this._sourceBuffers[t].updating&&e[t].length>0){var i=e[t].shift();if(i.timestampOffset){var n=this._sourceBuffers[t].timestampOffset,a=i.timestampOffset/1e3;Math.abs(n-a)>.1&&(c.a.v(this.TAG,"Update MPEG audio timestampOffset from "+n+" to "+a),this._sourceBuffers[t].timestampOffset=a),delete i.timestampOffset}if(!i.data||0===i.data.byteLength)continue;try{this._sourceBuffers[t].appendBuffer(i.data),this._isBufferFull=!1,"video"===t&&i.hasOwnProperty("info")&&this._idrList.appendArray(i.info.syncPoints)}catch(e){this._pendingSegments[t].unshift(i),22===e.code?(this._isBufferFull||this._emitter.emit(S.BUFFER_FULL),this._isBufferFull=!0):(c.a.e(this.TAG,e.message),this._emitter.emit(S.ERROR,{code:e.code,msg:e.message}))}}},e.prototype._onSourceOpen=function(){if(c.a.v(this.TAG,"MediaSource onSourceOpen"),this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._pendingSourceBufferInit.length>0)for(var e=this._pendingSourceBufferInit;e.length;){var t=e.shift();this.appendInitSegment(t,!0)}this._hasPendingSegments()&&this._doAppendSegments(),this._emitter.emit(S.SOURCE_OPEN)},e.prototype._onSourceEnded=function(){c.a.v(this.TAG,"MediaSource onSourceEnded")},e.prototype._onSourceClose=function(){c.a.v(this.TAG,"MediaSource onSourceClose"),this._mediaSource&&null!=this.e&&(this._mediaSource.removeEventListener("sourceopen",this.e.onSourceOpen),this._mediaSource.removeEventListener("sourceended",this.e.onSourceEnded),this._mediaSource.removeEventListener("sourceclose",this.e.onSourceClose))},e.prototype._hasPendingSegments=function(){var e=this._pendingSegments;return e.video.length>0||e.audio.length>0},e.prototype._hasPendingRemoveRanges=function(){var e=this._pendingRemoveRanges;return e.video.length>0||e.audio.length>0},e.prototype._onSourceBufferUpdateEnd=function(){this._requireSetMediaDuration?this._updateMediaSourceDuration():this._hasPendingRemoveRanges()?this._doRemoveRanges():this._hasPendingSegments()?this._doAppendSegments():this._hasPendingEos&&this.endOfStream(),this._emitter.emit(S.UPDATE_END)},e.prototype._onSourceBufferError=function(e){c.a.e(this.TAG,"SourceBuffer Error: "+e)},e}(),T=i(5),L={NETWORK_ERROR:"NetworkError",MEDIA_ERROR:"MediaError",OTHER_ERROR:"OtherError"},w={NETWORK_EXCEPTION:d.b.EXCEPTION,NETWORK_STATUS_CODE_INVALID:d.b.HTTP_STATUS_CODE_INVALID,NETWORK_TIMEOUT:d.b.CONNECTING_TIMEOUT,NETWORK_UNRECOVERABLE_EARLY_EOF:d.b.UNRECOVERABLE_EARLY_EOF,MEDIA_MSE_ERROR:"MediaMSEError",MEDIA_FORMAT_ERROR:T.a.FORMAT_ERROR,MEDIA_FORMAT_UNSUPPORTED:T.a.FORMAT_UNSUPPORTED,MEDIA_CODEC_UNSUPPORTED:T.a.CODEC_UNSUPPORTED},k=function(){function e(e,t){this.TAG="MSEPlayer",this._type="MSEPlayer",this._emitter=new h.a,this._config=s(),"object"==typeof t&&Object.assign(this._config,t);var i=e.type.toLowerCase();if("mse"!==i&&"mpegts"!==i&&"m2ts"!==i&&"flv"!==i)throw new A.b("MSEPlayer requires an mpegts/m2ts/flv MediaDataSource input!");!0===e.isLive&&(this._config.isLive=!0),this.e={onvLoadedMetadata:this._onvLoadedMetadata.bind(this),onvSeeking:this._onvSeeking.bind(this),onvCanPlay:this._onvCanPlay.bind(this),onvStalled:this._onvStalled.bind(this),onvProgress:this._onvProgress.bind(this)},self.performance&&self.performance.now?this._now=self.performance.now.bind(self.performance):this._now=Date.now,this._pendingSeekTime=null,this._requestSetTime=!1,this._seekpointRecord=null,this._progressChecker=null,this._mediaDataSource=e,this._mediaElement=null,this._msectl=null,this._transmuxer=null,this._mseSourceOpened=!1,this._hasPendingLoad=!1,this._receivedCanPlay=!1,this._mediaInfo=null,this._statisticsInfo=null;var n=u.a.chrome&&(u.a.version.major<50||50===u.a.version.major&&u.a.version.build<2661);this._alwaysSeekKeyframe=!!(n||u.a.msedge||u.a.msie),this._alwaysSeekKeyframe&&(this._config.accurateSeek=!1)}return e.prototype.destroy=function(){null!=this._progressChecker&&(window.clearInterval(this._progressChecker),this._progressChecker=null),this._transmuxer&&this.unload(),this._mediaElement&&this.detachMediaElement(),this.e=null,this._mediaDataSource=null,this._emitter.removeAllListeners(),this._emitter=null},e.prototype.on=function(e,t){var i=this;e===l.MEDIA_INFO?null!=this._mediaInfo&&Promise.resolve().then((function(){i._emitter.emit(l.MEDIA_INFO,i.mediaInfo)})):e===l.STATISTICS_INFO&&null!=this._statisticsInfo&&Promise.resolve().then((function(){i._emitter.emit(l.STATISTICS_INFO,i.statisticsInfo)})),this._emitter.addListener(e,t)},e.prototype.off=function(e,t){this._emitter.removeListener(e,t)},e.prototype.attachMediaElement=function(e){var t=this;if(this._mediaElement=e,e.addEventListener("loadedmetadata",this.e.onvLoadedMetadata),e.addEventListener("seeking",this.e.onvSeeking),e.addEventListener("canplay",this.e.onvCanPlay),e.addEventListener("stalled",this.e.onvStalled),e.addEventListener("progress",this.e.onvProgress),this._msectl=new R(this._config),this._msectl.on(S.UPDATE_END,this._onmseUpdateEnd.bind(this)),this._msectl.on(S.BUFFER_FULL,this._onmseBufferFull.bind(this)),this._msectl.on(S.SOURCE_OPEN,(function(){t._mseSourceOpened=!0,t._hasPendingLoad&&(t._hasPendingLoad=!1,t.load())})),this._msectl.on(S.ERROR,(function(e){t._emitter.emit(l.ERROR,L.MEDIA_ERROR,w.MEDIA_MSE_ERROR,e)})),this._msectl.attachMediaElement(e),null!=this._pendingSeekTime)try{e.currentTime=this._pendingSeekTime,this._pendingSeekTime=null}catch(e){}},e.prototype.detachMediaElement=function(){this._mediaElement&&(this._msectl.detachMediaElement(),this._mediaElement.removeEventListener("loadedmetadata",this.e.onvLoadedMetadata),this._mediaElement.removeEventListener("seeking",this.e.onvSeeking),this._mediaElement.removeEventListener("canplay",this.e.onvCanPlay),this._mediaElement.removeEventListener("stalled",this.e.onvStalled),this._mediaElement.removeEventListener("progress",this.e.onvProgress),this._mediaElement=null),this._msectl&&(this._msectl.destroy(),this._msectl=null)},e.prototype.load=function(){var e=this;if(!this._mediaElement)throw new A.a("HTMLMediaElement must be attached before load()!");if(this._transmuxer)throw new A.a("MSEPlayer.load() has been called, please call unload() first!");this._hasPendingLoad||(this._config.deferLoadAfterSourceOpen&&!1===this._mseSourceOpened?this._hasPendingLoad=!0:(this._mediaElement.readyState>0&&(this._requestSetTime=!0,this._mediaElement.currentTime=0),this._transmuxer=new b(this._mediaDataSource,this._config),this._transmuxer.on(v.a.INIT_SEGMENT,(function(t,i){e._msectl.appendInitSegment(i)})),this._transmuxer.on(v.a.MEDIA_SEGMENT,(function(t,i){if(e._msectl.appendMediaSegment(i),e._config.lazyLoad&&!e._config.isLive){var n=e._mediaElement.currentTime;i.info.endDts>=1e3*(n+e._config.lazyLoadMaxDuration)&&null==e._progressChecker&&(c.a.v(e.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),e._suspendTransmuxer())}})),this._transmuxer.on(v.a.LOADING_COMPLETE,(function(){e._msectl.endOfStream(),e._emitter.emit(l.LOADING_COMPLETE)})),this._transmuxer.on(v.a.RECOVERED_EARLY_EOF,(function(){e._emitter.emit(l.RECOVERED_EARLY_EOF)})),this._transmuxer.on(v.a.IO_ERROR,(function(t,i){e._emitter.emit(l.ERROR,L.NETWORK_ERROR,t,i)})),this._transmuxer.on(v.a.DEMUX_ERROR,(function(t,i){e._emitter.emit(l.ERROR,L.MEDIA_ERROR,t,{code:-1,msg:i})})),this._transmuxer.on(v.a.MEDIA_INFO,(function(t){e._mediaInfo=t,e._emitter.emit(l.MEDIA_INFO,Object.assign({},t))})),this._transmuxer.on(v.a.METADATA_ARRIVED,(function(t){e._emitter.emit(l.METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SCRIPTDATA_ARRIVED,(function(t){e._emitter.emit(l.SCRIPTDATA_ARRIVED,t)})),this._transmuxer.on(v.a.TIMED_ID3_METADATA_ARRIVED,(function(t){e._emitter.emit(l.TIMED_ID3_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SMPTE2038_METADATA_ARRIVED,(function(t){e._emitter.emit(l.SMPTE2038_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.SCTE35_METADATA_ARRIVED,(function(t){e._emitter.emit(l.SCTE35_METADATA_ARRIVED,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_DESCRIPTOR,(function(t){e._emitter.emit(l.PES_PRIVATE_DATA_DESCRIPTOR,t)})),this._transmuxer.on(v.a.PES_PRIVATE_DATA_ARRIVED,(function(t){e._emitter.emit(l.PES_PRIVATE_DATA_ARRIVED,t)})),this._transmuxer.on(v.a.STATISTICS_INFO,(function(t){e._statisticsInfo=e._fillStatisticsInfo(t),e._emitter.emit(l.STATISTICS_INFO,Object.assign({},e._statisticsInfo))})),this._transmuxer.on(v.a.RECOMMEND_SEEKPOINT,(function(t){e._mediaElement&&!e._config.accurateSeek&&(e._requestSetTime=!0,e._mediaElement.currentTime=t/1e3)})),this._transmuxer.open()))},e.prototype.unload=function(){this._mediaElement&&this._mediaElement.pause(),this._msectl&&this._msectl.seek(0),this._transmuxer&&(this._transmuxer.close(),this._transmuxer.destroy(),this._transmuxer=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._internalSeek(e):this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){return Object.assign({},this._mediaInfo)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){return null==this._statisticsInfo&&(this._statisticsInfo={}),this._statisticsInfo=this._fillStatisticsInfo(this._statisticsInfo),Object.assign({},this._statisticsInfo)},enumerable:!1,configurable:!0}),e.prototype._fillStatisticsInfo=function(e){if(e.playerType=this._type,!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var a=this._mediaElement.getVideoPlaybackQuality();i=a.totalVideoFrames,n=a.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},e.prototype._onmseUpdateEnd=function(){var e=this._mediaElement.buffered,t=this._mediaElement.currentTime;if(this._config.isLive&&this._config.liveBufferLatencyChasing&&e.length>0&&!this._mediaElement.paused){var i=e.end(e.length-1);if(i>this._config.liveBufferLatencyMaxLatency&&i-t>this._config.liveBufferLatencyMaxLatency){var n=i-this._config.liveBufferLatencyMinRemain;this.currentTime=n}}if(this._config.lazyLoad&&!this._config.isLive){for(var a=0,r=0;r=t+this._config.lazyLoadMaxDuration&&null==this._progressChecker&&(c.a.v(this.TAG,"Maximum buffering duration exceeded, suspend transmuxing task"),this._suspendTransmuxer())}},e.prototype._onmseBufferFull=function(){c.a.v(this.TAG,"MSE SourceBuffer is full, suspend transmuxing task"),null==this._progressChecker&&this._suspendTransmuxer()},e.prototype._suspendTransmuxer=function(){this._transmuxer&&(this._transmuxer.pause(),null==this._progressChecker&&(this._progressChecker=window.setInterval(this._checkProgressAndResume.bind(this),1e3)))},e.prototype._checkProgressAndResume=function(){for(var e=this._mediaElement.currentTime,t=this._mediaElement.buffered,i=!1,n=0;n=a&&e=r-this._config.lazyLoadRecoverDuration&&(i=!0);break}}i&&(window.clearInterval(this._progressChecker),this._progressChecker=null,i&&(c.a.v(this.TAG,"Continue loading from paused position"),this._transmuxer.resume()))},e.prototype._isTimepointBuffered=function(e){for(var t=this._mediaElement.buffered,i=0;i=n&&e0){var a=this._mediaElement.buffered.start(0);(a<1&&e0&&t.currentTime0){var n=i.start(0);if(n<1&&t0&&(this._mediaElement.currentTime=0),this._mediaElement.preload="auto",this._mediaElement.load(),this._statisticsReporter=window.setInterval(this._reportStatisticsInfo.bind(this),this._config.statisticsInfoReportInterval)},e.prototype.unload=function(){this._mediaElement&&(this._mediaElement.src="",this._mediaElement.removeAttribute("src")),null!=this._statisticsReporter&&(window.clearInterval(this._statisticsReporter),this._statisticsReporter=null)},e.prototype.play=function(){return this._mediaElement.play()},e.prototype.pause=function(){this._mediaElement.pause()},Object.defineProperty(e.prototype,"type",{get:function(){return this._type},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"buffered",{get:function(){return this._mediaElement.buffered},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"duration",{get:function(){return this._mediaElement.duration},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"volume",{get:function(){return this._mediaElement.volume},set:function(e){this._mediaElement.volume=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"muted",{get:function(){return this._mediaElement.muted},set:function(e){this._mediaElement.muted=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentTime",{get:function(){return this._mediaElement?this._mediaElement.currentTime:0},set:function(e){this._mediaElement?this._mediaElement.currentTime=e:this._pendingSeekTime=e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"mediaInfo",{get:function(){var e={mimeType:(this._mediaElement instanceof HTMLAudioElement?"audio/":"video/")+this._mediaDataSource.type};return this._mediaElement&&(e.duration=Math.floor(1e3*this._mediaElement.duration),this._mediaElement instanceof HTMLVideoElement&&(e.width=this._mediaElement.videoWidth,e.height=this._mediaElement.videoHeight)),e},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"statisticsInfo",{get:function(){var e={playerType:this._type,url:this._mediaDataSource.url};if(!(this._mediaElement instanceof HTMLVideoElement))return e;var t=!0,i=0,n=0;if(this._mediaElement.getVideoPlaybackQuality){var a=this._mediaElement.getVideoPlaybackQuality();i=a.totalVideoFrames,n=a.droppedVideoFrames}else null!=this._mediaElement.webkitDecodedFrameCount?(i=this._mediaElement.webkitDecodedFrameCount,n=this._mediaElement.webkitDroppedFrameCount):t=!1;return t&&(e.decodedFrames=i,e.droppedFrames=n),e},enumerable:!1,configurable:!0}),e.prototype._onvLoadedMetadata=function(e){null!=this._pendingSeekTime&&(this._mediaElement.currentTime=this._pendingSeekTime,this._pendingSeekTime=null),this._emitter.emit(l.MEDIA_INFO,this.mediaInfo)},e.prototype._reportStatisticsInfo=function(){this._emitter.emit(l.STATISTICS_INFO,this.statisticsInfo)},e}();n.a.install();var C={createPlayer:function(e,t){var i=e;if(null==i||"object"!=typeof i)throw new A.b("MediaDataSource must be an javascript object!");if(!i.hasOwnProperty("type"))throw new A.b("MediaDataSource must has type field to indicate video file type!");switch(i.type){case"mse":case"mpegts":case"m2ts":case"flv":return new k(i,t);default:return new D(i,t)}},isSupported:function(){return o.supportMSEH264Playback()},getFeatureList:function(){return o.getFeatureList()}};C.BaseLoader=d.a,C.LoaderStatus=d.c,C.LoaderErrors=d.b,C.Events=l,C.ErrorTypes=L,C.ErrorDetails=w,C.MSEPlayer=k,C.NativePlayer=D,C.LoggingControl=m.a,Object.defineProperty(C,"version",{enumerable:!0,get:function(){return"1.7.3"}});t.default=C}])})); +//# sourceMappingURL=mpegts.js.map \ No newline at end of file diff --git a/web/xf-player-core.js b/web/xf-player-core.js new file mode 100644 index 0000000..fa9842a --- /dev/null +++ b/web/xf-player-core.js @@ -0,0 +1,495 @@ +/* ===================================================================== + * XtremFlow — Moteur de lecture partagé + * --------------------------------------------------------------------- + * Objectifs : + * 1. ZAP RAPIDE — premier frame le plus tôt possible. + * 2. ADAPTATIF — si le réseau décroche, le buffer s'élargit tout seul. + * 3. ZÉRO CDN — hls.js / mpegts.js servis en local, chargés à la demande. + * + * Utilisé par player.html, player_lite.html et player_mobile.html. + * ===================================================================== */ +(function (global) { + 'use strict'; + + // ------------------------------------------------------------------ + // Profils de buffer — escalade automatique en cas de micro-coupures + // ------------------------------------------------------------------ + var PROFILES = { + // Démarrage : le plus agressif possible. + fast: { + name: 'fast', + hls: { + maxBufferLength: 24, + maxMaxBufferLength: 60, + liveSyncDurationCount: 2, + liveMaxLatencyDurationCount: 8, + initialLiveManifestSize: 1 + }, + mpegtsStash: 64 * 1024 + }, + // 2 coupures : on respire. + balanced: { + name: 'balanced', + hls: { + maxBufferLength: 60, + maxMaxBufferLength: 120, + liveSyncDurationCount: 4, + liveMaxLatencyDurationCount: 14, + initialLiveManifestSize: 2 + }, + mpegtsStash: 192 * 1024 + }, + // 4 coupures : priorité absolue à la stabilité. + safe: { + name: 'safe', + hls: { + maxBufferLength: 120, + maxMaxBufferLength: 240, + liveSyncDurationCount: 8, + liveMaxLatencyDurationCount: 24, + initialLiveManifestSize: 3 + }, + mpegtsStash: 512 * 1024 + } + }; + + var ORDER = ['fast', 'balanced', 'safe']; + + // ------------------------------------------------------------------ + // Chargement paresseux des libs (aucune requête inutile) + // ------------------------------------------------------------------ + var _scriptCache = {}; + + function loadScript(src) { + if (_scriptCache[src]) return _scriptCache[src]; + _scriptCache[src] = new Promise(function (resolve, reject) { + var s = document.createElement('script'); + s.src = src; + s.async = true; + s.onload = resolve; + s.onerror = function () { reject(new Error('Échec du chargement : ' + src)); }; + document.head.appendChild(s); + }); + return _scriptCache[src]; + } + + /** Ouvre la connexion vers l'hôte du flux avant même de connaître l'URL finale. */ + function preconnect(url) { + try { + var origin = new URL(url, location.href).origin; + if (origin === location.origin) return; + ['preconnect', 'dns-prefetch'].forEach(function (rel) { + var l = document.createElement('link'); + l.rel = rel; + l.href = origin; + l.crossOrigin = 'anonymous'; + document.head.appendChild(l); + }); + } catch (e) { /* URL relative ou invalide : rien à préconnecter */ } + } + + // ------------------------------------------------------------------ + // Moteur + // ------------------------------------------------------------------ + function XFPlayer(options) { + this.video = options.video; + this.vendorPath = options.vendorPath || 'vendor/'; + this.logPrefix = options.logPrefix || '[XFPlayer]'; + + // Callbacks UI (toutes optionnelles) + this.onLoading = options.onLoading || function () {}; + this.onReady = options.onReady || function () {}; + this.onError = options.onError || function () {}; + this.onBlocked = options.onBlocked || function () {}; + this.onProfileChange = options.onProfileChange || function () {}; + + var p = new URLSearchParams(location.search); + this.params = p; + this.url = options.url || p.get('url'); + this.type = options.type || p.get('type') || ''; + this.startTime = parseFloat(p.get('t') || '0'); + this.injectedDuration = parseFloat(p.get('duration') || '0'); + this.isRecording = p.get('is_recording') === 'true'; + + // Profil de départ : forçable via ?buffer=balanced|safe + var forced = p.get('buffer'); + this.profile = PROFILES[forced] ? PROFILES[forced] : PROFILES.fast; + this.profileLocked = !!PROFILES[forced]; + + this.hls = null; + this.mpegts = null; + this._started = false; + this._stalls = 0; + this._stallTimes = []; + this._destroyed = false; + this._reportedTime = 0; + this._hlsDuration = 0; + } + + XFPlayer.prototype.log = function (m) { + if (global.console && console.log) console.log(this.logPrefix + ' ' + m); + }; + + XFPlayer.prototype.send = function (msg) { + try { global.parent.postMessage(msg, '*'); } catch (e) {} + }; + + // ---------------- Démarrage ---------------- + + XFPlayer.prototype.start = function () { + var self = this; + if (!this.url) { this.onError('Aucun flux fourni'); return Promise.resolve(); } + + preconnect(this.url); + this._wireVideoEvents(); + this._wireParentMessages(); + + var lower = this.url.toLowerCase(); + var isHls = lower.indexOf('.m3u8') !== -1; + var isLive = this.type === 'live'; + + this.onLoading('Ouverture du flux'); + + // Safari / iOS : HLS natif = le chemin le plus rapide, aucune lib à charger. + if (isHls && this._canPlayNativeHls()) { + this.log('HLS natif (Safari/iOS)'); + return Promise.resolve(this._playDirect(this.url)); + } + + if (isHls) return this._startHls(); + if (isLive || lower.indexOf('.ts') !== -1) return this._startMpegts(isLive || true); + + // VOD progressif (mp4, mkv…) : lecture directe. + return Promise.resolve(this._playDirect(this.url)); + }; + + XFPlayer.prototype._canPlayNativeHls = function () { + return this.video.canPlayType('application/vnd.apple.mpegurl') !== ''; + }; + + // ---------------- HLS ---------------- + + XFPlayer.prototype._hlsConfig = function () { + var prof = this.profile.hls; + return { + enableWorker: true, + lowLatencyMode: false, + + // ---- Fenêtre de buffer (pilotée par le profil) ---- + maxBufferLength: prof.maxBufferLength, + maxMaxBufferLength: prof.maxMaxBufferLength, + backBufferLength: 30, + maxBufferSize: 30 * 1000 * 1000, + + // ---- Démarrage rapide ---- + // 1 seul segment suffit pour commencer (au lieu de 3) : ~2 segments + // de latence en moins au zap, soit souvent 4 à 12 secondes gagnées. + initialLiveManifestSize: prof.initialLiveManifestSize, + startFragPrefetch: true, // précharge le 1er fragment pendant le parse + testBandwidth: false, // pas de mesure préalable : on joue tout de suite + + // ---- Live ---- + liveSyncDurationCount: prof.liveSyncDurationCount, + liveMaxLatencyDurationCount: prof.liveMaxLatencyDurationCount, + maxLiveSyncPlaybackRate: 1.15, + + // ---- Robustesse ---- + nudgeOffset: 0.6, + nudgeMaxRetries: 20, + abrEwmaDefaultEstimate: 2000000, + manifestLoadingRetryDelay: 500, + levelLoadingRetryDelay: 500, + fragLoadingRetryDelay: 500, + manifestLoadingMaxRetry: 4, + levelLoadingMaxRetry: 4, + fragLoadingMaxRetry: 6 + }; + }; + + XFPlayer.prototype._startHls = function () { + var self = this; + return loadScript(this.vendorPath + 'hls.min.js').then(function () { + if (!global.Hls || !global.Hls.isSupported()) { + if (self._canPlayNativeHls()) return self._playDirect(self.url); + self.onError('HLS non supporté par ce navigateur'); + return; + } + + var Hls = global.Hls; + var hls = new Hls(self._hlsConfig()); + self.hls = hls; + global.hlsInstance = hls; // compat : code existant qui inspecte l'instance + + hls.loadSource(self.url); + hls.attachMedia(self.video); + + hls.on(Hls.Events.MANIFEST_PARSED, function () { + // Démarrage immédiat : on ne sonde plus le buffer toutes les 200 ms. + // Si le réseau ne suit pas, l'escalade de profil s'en chargera. + self._attemptPlay(); + }); + + hls.on(Hls.Events.LEVEL_LOADED, function (e, d) { + if (d.details && d.details.totalduration > self._hlsDuration) { + self._hlsDuration = d.details.totalduration; + global.currentHlsDuration = self._hlsDuration; + } + }); + + hls.on(Hls.Events.ERROR, function (e, d) { + if (!d.fatal) return; + self.log('Erreur HLS fatale : ' + d.details); + if (d.type === Hls.ErrorTypes.NETWORK_ERROR) { + self._escalate('erreur réseau'); + hls.startLoad(); + } else if (d.type === Hls.ErrorTypes.MEDIA_ERROR) { + self._escalate('erreur média'); + hls.recoverMediaError(); + } else { + self.onError('Erreur HLS : ' + d.details); + } + }); + }).catch(function (err) { + self.onError(err.message); + }); + }; + + // ---------------- MPEG-TS ---------------- + + XFPlayer.prototype._startMpegts = function (isLive) { + var self = this; + return loadScript(this.vendorPath + 'mpegts.min.js').then(function () { + if (!global.mpegts || !global.mpegts.isSupported()) { + return self._playDirect(self.url); + } + self._createMpegts(isLive); + }).catch(function (err) { + self.onError(err.message); + }); + }; + + XFPlayer.prototype._createMpegts = function (isLive) { + var self = this; + var mpegts = global.mpegts; + + var player = mpegts.createPlayer( + { type: 'mpegts', isLive: isLive, url: this.url }, + { + enableWorker: true, + enableStashBuffer: true, + // Le stash initial conditionne directement le délai avant la 1re image. + // 64 Ko en profil « fast » contre 512 Ko auparavant. + stashInitialSize: this.profile.mpegtsStash, + maxStashSize: 30 * 1024 * 1024, + liveBufferLatencyChasing: false, + lazyLoad: false + } + ); + + this.mpegts = player; + this._mpegtsIsLive = isLive; + + player.on(mpegts.Events.ERROR, function (type, detail) { + self.log('Erreur MPEG-TS : ' + type + ' / ' + detail); + if (self._destroyed) return; + self._escalate('erreur MPEG-TS'); + // Recréation propre avec le nouveau profil. + setTimeout(function () { + if (self._destroyed) return; + try { + player.unload(); + player.detachMediaElement(); + player.destroy(); + } catch (e) {} + self._createMpegts(self._mpegtsIsLive); + }, 1200); + }); + + player.attachMediaElement(this.video); + player.load(); + this._attemptPlay(); + }; + + // ---------------- Lecture directe ---------------- + + XFPlayer.prototype._playDirect = function (url) { + var self = this; + this.video.src = url; + this.video.load(); + this._attemptPlay(); + this.video.addEventListener('error', function () { + self.onError('Format non supporté'); + }, { once: true }); + return true; + }; + + XFPlayer.prototype._attemptPlay = function () { + var self = this; + var p = this.video.play(); + if (p && typeof p.catch === 'function') { + p.catch(function () { + // Autoplay refusé (Safari/iOS) : on tente en sourdine, sinon overlay. + self.video.muted = true; + var q = self.video.play(); + if (q && typeof q.catch === 'function') { + q.catch(function () { self.onBlocked(); }); + } + }); + } + }; + + // ---------------- Escalade adaptative ---------------- + + /** + * Passe au profil supérieur après des coupures répétées. + * Fenêtre glissante de 60 s : deux stalls rapprochés déclenchent l'escalade, + * des stalls isolés dans le temps ne pénalisent pas la latence. + */ + XFPlayer.prototype._escalate = function (reason) { + if (this.profileLocked || this._destroyed) return; + + var idx = ORDER.indexOf(this.profile.name); + if (idx >= ORDER.length - 1) return; // déjà au maximum + + var next = PROFILES[ORDER[idx + 1]]; + this.profile = next; + this.log('Escalade buffer → ' + next.name + ' (' + reason + ')'); + this.onProfileChange(next.name, reason); + + // HLS : les fenêtres de buffer sont modifiables à chaud, pas besoin de + // recharger le flux — donc aucune coupure visible pour l'utilisateur. + if (this.hls) { + try { + this.hls.config.maxBufferLength = next.hls.maxBufferLength; + this.hls.config.maxMaxBufferLength = next.hls.maxMaxBufferLength; + this.hls.config.liveSyncDurationCount = next.hls.liveSyncDurationCount; + this.hls.config.liveMaxLatencyDurationCount = + next.hls.liveMaxLatencyDurationCount; + } catch (e) {} + } + // MPEG-TS : le stash est figé à la création — appliqué à la prochaine + // recréation du lecteur (déclenchée par le handler d'erreur). + }; + + XFPlayer.prototype._noteStall = function () { + if (!this._started) return; // les attentes d'amorçage ne comptent pas + var now = Date.now(); + this._stallTimes.push(now); + this._stallTimes = this._stallTimes.filter(function (t) { + return now - t < 60000; + }); + if (this._stallTimes.length >= 2) { + this._stallTimes = []; + this._escalate('coupures répétées'); + } + }; + + // ---------------- Événements vidéo & pont Flutter ---------------- + + XFPlayer.prototype._wireVideoEvents = function () { + var self = this; + var v = this.video; + + v.addEventListener('loadedmetadata', function () { + if (self.startTime > 0 && self.startTime < v.duration) { + v.currentTime = self.startTime; + } + }); + + v.addEventListener('playing', function () { + self._started = true; + self.onReady(); + self.send({ type: 'playback_status', status: 'playing' }); + }); + + v.addEventListener('pause', function () { + self.send({ type: 'playback_status', status: 'paused' }); + }); + + v.addEventListener('waiting', function () { self._noteStall(); }); + v.addEventListener('stalled', function () { self._noteStall(); }); + + v.addEventListener('ended', function () { + self.send({ + type: 'playback_ended', + duration: isFinite(v.duration) ? v.duration : self.injectedDuration + }); + }); + + // Remontée de position (5 s) — même contrat qu'avant. + this._posTimer = setInterval(function () { self._reportPosition(); }, 5000); + + // Activité utilisateur → masquage auto des contrôles côté Flutter. + function activity() { self.send({ type: 'user_activity' }); } + document.addEventListener('mousemove', activity, { passive: true }); + document.addEventListener('touchstart', activity, { passive: true }); + document.addEventListener('click', activity, { passive: true }); + }; + + XFPlayer.prototype._reportPosition = function () { + var v = this.video; + if (!(v.currentTime > 0) || v.paused || v.readyState <= 2) return; + if (Math.abs(v.currentTime - this._reportedTime) < 1) return; + this._reportedTime = v.currentTime; + + var duration = v.duration; + var hlsDur = this._hlsDuration || 0; + if (!isFinite(duration) || isNaN(duration) || duration < 1) { + duration = hlsDur > 0 ? hlsDur : (this.injectedDuration > 0 ? this.injectedDuration : 0); + } else if (hlsDur > duration) { + duration = hlsDur; + } else if (this.injectedDuration > 0 && duration < this.injectedDuration * 0.9) { + duration = this.injectedDuration; + } + + this.send({ + type: 'playback_position', + currentTime: v.currentTime, + duration: duration + }); + }; + + XFPlayer.prototype._wireParentMessages = function () { + var self = this; + global.addEventListener('message', function (event) { + var d = event.data; + if (!d || !d.type) return; + var v = self.video; + switch (d.type) { + case 'play': + self._attemptPlay(); + break; + case 'pause': + v.pause(); + break; + case 'seek': + if (isFinite(d.value)) v.currentTime = d.value; + break; + case 'set_volume': + v.volume = Math.max(0, Math.min(1, d.value)); + v.muted = v.volume === 0; + break; + case 'unmute': + v.muted = false; + if (v.volume === 0) v.volume = 1; + break; + } + }); + }; + + XFPlayer.prototype.destroy = function () { + this._destroyed = true; + clearInterval(this._posTimer); + try { if (this.hls) this.hls.destroy(); } catch (e) {} + try { + if (this.mpegts) { + this.mpegts.unload(); + this.mpegts.detachMediaElement(); + this.mpegts.destroy(); + } + } catch (e) {} + }; + + global.XFPlayer = XFPlayer; + global.XFPlayerProfiles = PROFILES; +})(window); diff --git a/web/xf-player.css b/web/xf-player.css new file mode 100644 index 0000000..e494d97 --- /dev/null +++ b/web/xf-player.css @@ -0,0 +1,255 @@ +/* ===================================================================== + * XtremFlow — Habillage des lecteurs, thème « Warm Cinema » + * Charbon chaud (#0B0908), crème (#F3E9DF), braise (#D9541F). + * + * PERF : aucun backdrop-filter. Le flou de fond force le compositeur à + * relire le framebuffer à chaque frame — inacceptable par-dessus une vidéo. + * ===================================================================== */ + +:root { + --xf-ink: #0B0908; + --xf-cream: #F3E9DF; + --xf-cream-dim: #C5B3A5; + --xf-ember: #D9541F; + --xf-ember-light: #FFB68C; + --xf-danger: #E5484D; + --xf-ui: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + -webkit-tap-highlight-color: transparent; +} + +html, +body { + background: var(--xf-ink); + width: 100%; + height: 100%; + overflow: hidden; + font-family: var(--xf-ui); + color: var(--xf-cream); +} + +#player-container { + width: 100%; + height: 100%; + position: relative; + background: var(--xf-ink); +} + +#video { + width: 100%; + height: 100%; + background: var(--xf-ink); + display: block; +} + +/* --------------------------------------------------------------- + * Amorce de projection — l'anneau de compte à rebours d'une bobine + * --------------------------------------------------------------- */ +.xf-center { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + text-align: center; + z-index: 20; +} + +#loading { + display: none; +} + +.xf-leader { + width: 64px; + height: 64px; + margin: 0 auto 20px; + position: relative; +} + +/* Anneau fixe, très discret */ +.xf-leader::before { + content: ""; + position: absolute; + inset: 0; + border-radius: 50%; + border: 2px solid rgba(243, 233, 223, 0.14); +} + +/* Balayage braise */ +.xf-leader::after { + content: ""; + position: absolute; + inset: 0; + border-radius: 50%; + border: 2px solid transparent; + border-top-color: var(--xf-ember); + border-right-color: var(--xf-ember); + animation: xf-sweep 900ms cubic-bezier(0.5, 0, 0.5, 1) infinite; +} + +/* Réticule central : croix d'amorce de pellicule */ +.xf-leader-cross, +.xf-leader-cross::before { + position: absolute; + background: rgba(243, 233, 223, 0.22); +} + +.xf-leader-cross { + top: 50%; + left: 12px; + right: 12px; + height: 1px; + transform: translateY(-0.5px); +} + +.xf-leader-cross::before { + content: ""; + top: -14px; + bottom: -14px; + left: 50%; + width: 1px; + height: 28px; + transform: translateX(-0.5px); +} + +@keyframes xf-sweep { + to { + transform: rotate(360deg); + } +} + +.xf-label { + font-size: 12px; + font-weight: 600; + letter-spacing: 0.18em; + text-transform: uppercase; + color: var(--xf-cream-dim); +} + +/* Mention discrète quand le buffer s'élargit tout seul */ +.xf-hint { + margin-top: 10px; + font-size: 11px; + letter-spacing: 0.08em; + color: rgba(243, 233, 223, 0.42); + min-height: 14px; +} + +/* --------------------------------------------------------------- + * Erreur + * --------------------------------------------------------------- */ +#error { + display: none; + max-width: 78vw; +} + +.xf-error-mark { + width: 52px; + height: 52px; + margin: 0 auto 18px; + border: 2px solid var(--xf-danger); + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-size: 26px; + line-height: 1; + color: var(--xf-danger); +} + +.xf-error-title { + font-size: 15px; + font-weight: 700; + letter-spacing: 0.02em; + color: var(--xf-cream); +} + +.xf-error-sub { + margin-top: 8px; + font-size: 12px; + letter-spacing: 0.04em; + color: rgba(243, 233, 223, 0.5); +} + +/* --------------------------------------------------------------- + * Overlay lecture (autoplay bloqué) + * --------------------------------------------------------------- */ +#play-overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 92px; + height: 92px; + border-radius: 50%; + background: rgba(11, 9, 8, 0.82); + border: 2px solid var(--xf-ember); + box-shadow: 0 0 40px rgba(217, 84, 31, 0.35); + display: none; + align-items: center; + justify-content: center; + cursor: pointer; + z-index: 25; + transition: transform 160ms cubic-bezier(0.16, 1, 0.3, 1); +} + +#play-overlay:hover { + transform: translate(-50%, -50%) scale(1.06); +} + +#play-overlay:active { + transform: translate(-50%, -50%) scale(0.94); +} + +#play-overlay svg { + width: 40px; + height: 40px; + fill: var(--xf-cream); + margin-left: 5px; +} + +/* --------------------------------------------------------------- + * Bouton « activer le son » (iOS) + * --------------------------------------------------------------- */ +.xf-sound-btn { + position: absolute; + bottom: 26px; + left: 50%; + transform: translateX(-50%); + display: none; + align-items: center; + gap: 9px; + padding: 12px 22px; + border: 1px solid var(--xf-ember); + border-radius: 999px; + background: rgba(11, 9, 8, 0.88); + color: var(--xf-cream); + font-family: var(--xf-ui); + font-size: 12px; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; + cursor: pointer; + z-index: 26; +} + +.xf-sound-btn svg { + width: 17px; + height: 17px; + fill: var(--xf-ember-light); +} + +/* Respect des préférences d'accessibilité */ +@media (prefers-reduced-motion: reduce) { + .xf-leader::after { + animation-duration: 2s; + } + + #play-overlay { + transition: none; + } +}