From b3824b3b03484f0bdc8d719ffdab26ec2a6805f7 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 30 Sep 2019 02:14:34 +0200 Subject: [PATCH] Solving many bugs. --- Kyoo.Transcoder/src/Transcoder.cpp | 14 +++++++++----- .../src/app/browse/browse.component.html | 4 ++-- .../src/app/browse/browse.component.scss | 15 +++++++++++---- .../episodes-list.component.scss | 13 ++++++++----- .../show-details/show-details.component.scss | 5 +++-- .../LibraryManager/LibraryManager.cs | 3 +++ .../Implementations/TheTvDB/HelperTvDB.cs | 2 +- .../TheTvDB/ProviderTheTvDB.cs | 8 ++++---- Kyoo/Transcoder/Kyoo.Transcoder.dll | Bin 44032 -> 44544 bytes Kyoo/config.json | 6 +++--- 10 files changed, 44 insertions(+), 26 deletions(-) diff --git a/Kyoo.Transcoder/src/Transcoder.cpp b/Kyoo.Transcoder/src/Transcoder.cpp index 13a90787..dbb7b635 100644 --- a/Kyoo.Transcoder/src/Transcoder.cpp +++ b/Kyoo.Transcoder/src/Transcoder.cpp @@ -223,7 +223,9 @@ Stream *ExtractSubtitles(const char *path, const char *outPath, int *streamCount if (inputCodecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) outputList[i] = NULL; else - { + { + *subtitleCount += 1; + //Get metadata for file name streams[i] = Stream(NULL, //title av_dict_get(inputStream->metadata, "language", NULL, 0)->value, //language @@ -253,12 +255,15 @@ Stream *ExtractSubtitles(const char *path, const char *outPath, int *streamCount outStream << ".srt"; else if (strcmp(streams[i].codec, "ass") == 0) outStream << ".ass"; - + else + { + std::cout << "Unsupported subtitle codec: " << streams[i].codec << std::endl; + outputList[i] = NULL; + continue; + } streams[i].path = _strdup(outStream.str().c_str()); - *subtitleCount += 1; - std::cout << "Stream #" << i << "(" << streams[i].language << "), stream type: " << inputCodecpar->codec_type << " codec: " << streams[i].codec << std::endl; AVFormatContext *outputContext = NULL; @@ -293,7 +298,6 @@ Stream *ExtractSubtitles(const char *path, const char *outPath, int *streamCount } } } - //Write subtitle data to files. AVPacket pkt; while (av_read_frame(inputContext, &pkt) == 0) diff --git a/Kyoo/ClientApp/src/app/browse/browse.component.html b/Kyoo/ClientApp/src/app/browse/browse.component.html index 40914baf..8a917687 100644 --- a/Kyoo/ClientApp/src/app/browse/browse.component.html +++ b/Kyoo/ClientApp/src/app/browse/browse.component.html @@ -1,4 +1,4 @@ -
+
@@ -20,7 +20,7 @@
-
+

{{show.title}}

diff --git a/Kyoo/ClientApp/src/app/browse/browse.component.scss b/Kyoo/ClientApp/src/app/browse/browse.component.scss index 34eebecb..fb8218d2 100644 --- a/Kyoo/ClientApp/src/app/browse/browse.component.scss +++ b/Kyoo/ClientApp/src/app/browse/browse.component.scss @@ -12,7 +12,7 @@ button font-size: 12px; } -.container +.container-fluid { display: flex; flex-wrap: wrap; @@ -21,27 +21,34 @@ button .show { width: 33%; + max-width: 200px; list-style: none; padding: 1em; text-decoration: none; color: inherit; outline: none; - @include media-breakpoint-up(md) + @include media-breakpoint-up(sm) { width: 25%; } - @include media-breakpoint-up(lg) + @include media-breakpoint-up(md) { width: 20%; } - @include media-breakpoint-up(xl) + @include media-breakpoint-up(lg) { width: 18%; } + @include media-breakpoint-up(xl) + { + width: 15%; + } + + &:focus, &:hover { > img diff --git a/Kyoo/ClientApp/src/app/episodes-list/episodes-list.component.scss b/Kyoo/ClientApp/src/app/episodes-list/episodes-list.component.scss index e78cae2b..4c7d3a8b 100644 --- a/Kyoo/ClientApp/src/app/episodes-list/episodes-list.component.scss +++ b/Kyoo/ClientApp/src/app/episodes-list/episodes-list.component.scss @@ -13,6 +13,14 @@ display: block; } } + + &:hover + { + .episodes + { + visibility: visible; + } + } } .episodes @@ -26,11 +34,6 @@ flex-direction: row; visibility: hidden; - &:hover - { - visibility: visible; - } - &::-webkit-scrollbar { height: 4px; diff --git a/Kyoo/ClientApp/src/app/show-details/show-details.component.scss b/Kyoo/ClientApp/src/app/show-details/show-details.component.scss index c1f397fd..f11c63f3 100644 --- a/Kyoo/ClientApp/src/app/show-details/show-details.component.scss +++ b/Kyoo/ClientApp/src/app/show-details/show-details.component.scss @@ -1,6 +1,6 @@ -@import "~bootstrap//scss/functions"; +@import "~bootstrap/scss/functions"; @import "~bootstrap/scss/variables"; -@import "~bootstrap/scss//mixins/breakpoints"; +@import "~bootstrap/scss/mixins/breakpoints"; a { @@ -17,6 +17,7 @@ a { width: 100%; max-height: 75vh; + min-height: 60vh; object-fit: cover; } diff --git a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs index 4c195731..008e3c81 100644 --- a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs +++ b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs @@ -748,6 +748,9 @@ namespace Kyoo.InternalAPI public void RegisterShowPeople(long showID, List people) { + if (people == null) + return; + string linkQuery = "INSERT INTO peopleLinks (peopleID, showID, role, type) VALUES($peopleID, $showID, $role, $type);"; for (int i = 0; i < people.Count; i++) diff --git a/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/HelperTvDB.cs b/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/HelperTvDB.cs index 9567b34e..ec9e568b 100644 --- a/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/HelperTvDB.cs +++ b/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/HelperTvDB.cs @@ -71,7 +71,7 @@ namespace Kyoo.InternalAPI.MetadataProvider.TheTvDB public long? GetYear(string firstAired) { - if (long.TryParse(firstAired?.Substring(0, 4), out long year)) + if (firstAired?.Length >= 4 && long.TryParse(firstAired?.Substring(0, 4), out long year)) return year; return null; diff --git a/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs b/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs index 0cc62953..159c786e 100644 --- a/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs +++ b/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs @@ -276,12 +276,12 @@ namespace Kyoo.InternalAPI.MetadataProvider string id = GetID(externalIDs); if (id == null) - return null; + return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs); string token = await Authentificate(); if (token == null) - return null; + return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs); WebRequest request = WebRequest.Create("https://api.thetvdb.com/series/" + id + "/episodes/query?airedSeason=" + seasonNumber + "&airedEpisode=" + episodeNumber); request.Method = "GET"; @@ -313,13 +313,13 @@ namespace Kyoo.InternalAPI.MetadataProvider { Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + response.StatusCode + " Message: " + response.StatusDescription); response.Close(); - return null; + return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs); } } catch (WebException ex) { Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + ex.Status); - return null; + return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs); } } diff --git a/Kyoo/Transcoder/Kyoo.Transcoder.dll b/Kyoo/Transcoder/Kyoo.Transcoder.dll index 8528a0a12f31aae0133cd67a90693aeb820abbc9..df9e86855d7bb533110a58fef04ca9ae9244aa59 100644 GIT binary patch delta 13682 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 O@a6EAyPFQw3;z>@m3)2x delta 13668 zcmeHteOy#k{{Oing98Es!tfvhgARhCI0_mf=wP511qA^?#l&YUQ_{h(R7Qbfnx@c` ztvxPnwxL;BxUIWA?3gB4ZfUu@=(;UE?T%?ht))HQ-}`g#8J&Fnc3;2W_n+@Sdta|} z-=C**KA-b&&-vUt<2a{t^y&^6q~r&Gao-{)u6{PmJV+N7%@#mVp$Yf%k<#KI^Dh`{ zhu{F;A*JfWH#1hhBRO7j@H5g4(s>@COAWp_8TxvZTs}>gEQbc+{vht1{59P7 zb^SvZpc}c}%9!k~u$X0cvBhQ#XU35Q7PI%x3=*3vS_z==mhwn_x-RSnZqvW4%b&u3 z)Nhr(%EnK6F4$*ktUvaRXo0&j~`ef?c$DsQ>8b! zXJDN4BtJVaQM#9ZJ5Y|EoUS$#wVmKzOD8(u4V}xY4C$utMyaazwrMH{sZQ`;7>ab( zY5YUOThcB3xu6j-1^LjsdWziv4LX>}&Ox&4FWxi!LeSix#S<`YvRnTbK0SDn6v`dJ zPe@rOVIdr@|)af^)gSxK4VAHySH+1(W&P#+lL;9v8kF9ego7 zUHT<|KYThSF(o1`q`Q%#E4I{o2Nm)85jO`t6hi{ju=uVM5k@I;TQqs?p%K_fq}!zM z&j+U)Zq%3)JUQ|~=_!6Fvc@2rRQ)MFG%8DHy`gJv)J!SJ6R8S|V)#?0<;H;+zD$qo zDoLdt{E5d#r#DsQSL9d8?){efpA<#jcCj6UF1z&m+?TV8AP<&sAqO2h0s2NgJ{%FE*A%O4dPZEujLqAcoD z0cNrZu_no`D{|{!?L&=8aP*GX@EzJ|?oN}NFGvlaU(gq$e~r|zapXZuEj+mzM;|iK zy1M*Ns74pKF3Zj>yM2v+mZ`-nyL!ooxzP1R!K6*2jdyuaM|R~~^IcyTyR*JV1FR(9 zl^a;(y89%x<}7S)&K_V7!N`_4a}&>Rg1t))$agKy_NH7^lp@z08RN4P!-rAFfFo}2 zL2iuA8S(_ilAKll%ec;NDV19ldlup5ziLu%Jw3~b7OXHK*MEPlkO6$_YwZ# zkP*_`JScuR?qlL(0*=X(k8wGE*pOq_Jc$ljN{c5SH*Vj>TjEos_xQf}iGhJ|nmd;N zBR+3_P!xQ-O<$E#pgrE4P(p2xGC&vR&-shc$~BqTE%c0LU}GRZqunSwQa@J z1KVQPEHj3$haM2;mLBXq!~Q{glF|7ZMgyTOqXylk(^%8qfm#FYz6S1|!JmoG8nF_` zhPQq+nd4!=Lh)ZE;^7!G8xKd~@I~}gyG!a7(=*eFQXehF^c*p+8jJaSnZ!3G4sCk; z6WX0hdWx`@FZ~KMcAg2vt{ctyzrzj-+Y$=Z`!QLSn~C+#`WMCBU{u>dBt1pWfW!+m zq?22Z+oQkPR*T`68bamf!)C8uIPeCj1YDz&jp$?%HWN9;6&i|=yoZ9WP06`J@=N1B z9&1W5jh?P{eh_V@rgYN%+s?mROr2k$8we}4^QF|5uk+<#=zPGgov*x6FnRT8HXp(by8YCq0TQWyfnGn*nE^|ckUYiIL}IwTfZ^3{EFXX9u~Ug zlI*IA#dyVf`#$1sb6nFKXaF9A6*EM@uia(WyLfO zv`WZbe;jR=q`SL5ALEjA-%sRsj{Qv9&sSUL=+0&G-&-@loVVubj%D(+aT82`z~POM zvH@D_Z!4xp`1)~$13yEsis|XD*T#*JBqzT(epS@B2>f5hCR^_@TMyPd)`)2%UzK@N z*z@CQ;J;RrH2ppNz0A>4<<6{V-D~4`Y*wmd0&Unj4iUQb2t8{UKbbX>?}es?pUR3G z{3#t$ZvA96OBo1i3I8E0YnXi#ZElpUZr77R=#3C4rU|gdE-_FsrSrKH%A~xmJrkx% z(vGf=Cno8lR;!!XTQC@0;I@UL@?SE$VkTuv6H=f#;eWx=LkRqcPi8BZn=c|;>5-lE ze&IT+m?YkkGZnLUG{-ig9!GY&s~;`r%I*oChydp8r`MOT`D27ughCFWe3!4RsXq%>cGg%7 zRS3|Guvd{K@>8eeI!oq?>D5#&O*yQ4F_j;kQWQBueZc(nk8$(Vaw(tNr%sV>=3P^7 zl`43$EmwCrl`pm>7^+j$8F2CzTTa+ZU`}{{z{aUg#R=PFX#zLoCk-r2qb@Gy8To5; zXDwZi=I2S$BmC^N4~B0utC@E5(KL)Ef=p9P^M*0@yYoLXHu?ydcx~ed1LatWDfnm=_xZJDemT&C4w{ z>=-gY>B5bQ>2M-%E!?c@TEquTzdiKR1Z|vA=?@9~?&%w)D*n^-=;^gfDCrur;|E14 zY5k^Q5+>$V1f-Y-QUyAo;xJ`zLZlwV=Z8XC?COW2VL*xN>mp3|-THXGV1{-4rwD_l zax@-BGDAk){JmmqSxavZ^g!+{xpO?QIwK$pQf|NoqwO+r!WR~ zlUk`kRKjDrlV2#B9zF{K**QRUgBcFs`7@*DT!v6dDO2y|>b+9ESE={;>V2VlU!>j_ zsFOQ~yWM-baz(-qYJwV99RI zTgXop$4EEw^Tn&ATwYcZ6GMYX%Ox1;xD|8CE<`D&%W=G^B&*=~OE_J7Y4tZNQbRVZ zvao?FCtcsL+}W^C=Y5R(`o;gcQRQXU9vEyK-i)lPt3+$)*K2 z6NF;QQrVv02L&*X+)2#W3URyB;UUuroFQDNdy4hm@|2hodHlD;z z{k_%1;eiC*4o$ayB_z~rx4sq>b*@`~v!Jxs!&^KwzDucQcYuV0nq8CExI(9uQ_IBx zW}j3-c9P-~qUK(F4Dd4AF`JKO)3$6YpGRAsO?I78Ov@rEqOL1wHd9egp9;M9xNuv&kbhS;!?tW9%&%oCgcX^tw z`vCuK`SVg3UsW*yqQ@$7BbH%mTaUj?vuP|i(xxxxpH}3oiG`H8&NQrQ{#LsEX76tT z)IB$?^{)*U_|ZY@4aJd+C5(5Z&|u~?8tkkim#oQ z5|oU(N19X4RPjgW&6Y;-3-jV61J_sCbbkopGpgoFk^JE*b4X4I>SM}mis=S^tSU3s zHG%|rEr1Ky0SD0Y6{wh&^N4Co>|#w>eVsB5${4=9Iw`bh7Gt!kGmm%cC-L^`Il42tzou3gqgfzzAe-yQ$zFWU&rdGdOU&S}h&umHs z-`r#9)<=V&4|h&|6e!y_-DZ1abC0=O|6>tj7-%TI2Su5B8hr+_y4eqzMNk3IzT)sG=3zv0#q0g`ZqdonU#E_Og3w(FY_d^7$y@-S;4c zW9JRLaN)9uJ^NJ)o6q6_{=0=0d{K>on`&hKEO14QEUoK$u0|&{jd})VxS|Apw@>3g z7WlTng93L8Y!O&5aIV0K0*47S2)wjcYxjMDJsLK#mxSO~0(T1BE^w(pyTAg0qXota z3=#NKr{?HWff~oyo(_%rhd_&pO^g|y&=fNT-Xri$frEdg>8k~H2>e`N?vt9nMPQG> zfIXVrCUC33*9GdHf*$@^HW9e42+aAl#(RIMVW+_L0w)TL68QP!n%zl(?E>os&K6kL zq1o*beu!(L+sDG;;HQaW>_x$M2)sw&34uQdoF~>yvB2@7zSat3JALg5yyrUoqfcx8 zefDgDn6m(Zy`sXK0$&q2%{Rw_A0hbJg0~CwHSD;KfBjKS)Bc#+f5se-X@VgFpA&eK zz}E%-T2%B3{0(}*377cF}SSrw`_by}( z2~7V==HO4~~TQ$tR z>F4sLOO~6LtXZ>e*%JHeb!!=GyWWm}xpZt(?_F9gPrioz0>cY5-a13WK7rw~#)to# zXmZS2PqKx+be3lCi?(v@Eo;}^zSg{=aoLJ``)dBnWkC^F9KyzD+x5F;F*@GAqOGY~ zgx8U!nLIyF!@UAa$7y`ORl~zV?hyQwg6|givOx1#&EA@!;U9(kHv-?&kY8RI5o8rH zT;dU{QgPHyS~Yci=iOR8->@B+E_i`V4AZq?HwO7bopurf^7 zzfc!r3K7y=AW7?iX8zf#;bmT|Ofw{OQN+F|{8ubR(erQY4&F;OwTtXLyli#MqC}W(USZJmkq%-FeVsHLd^S&B6UnVN z2UPif!llScP)^*9(f|UNPlscl;mv{#Z9~~enrpgH(2t_B6*}uRU6BZpDaig%K}Z8xSFb^If%|+xeG>)UhU3vhw6x z1%@7}_9f=Vj}XI6R@fA8#FQq6YjgpG`c)kCj}xc6bE&^uMSVG5o+S z0a6`*YVGg@^6G!Jq0OK9+hGmh^>BHJhpvm)Q)pLcAR;{5(e>+%Q@oI7H>1H8#(IGV zP})$!QLgg*%XMRSSVNNkpA185ud6yV#J_E{6(5`iNh3;W%Z}veX&U9HAywyY(ZaSpIE&s^sCxx1~xlFT&l*Z&T?d>*Hy$si%Vt*v=0_-pJ46-pM1@ zr%JVa67HRR3GSqg55>EgLUqW#k-wnI&#X_?^|x}}h7r2nRz%Ki8v^3Y+sN$NH2@@S zA_w@Q4KX^lo!_(}T9>w+PgxtyPj3k4V{S1>ZT!^@F+)l*_Wl>u3`Qy4h9wuRJD}E) zcJl;#d|+%Vmik>JAG{kT0VsVhVn=}3O5((z_AZPB*lO;!r$>A4f`#AZ0AG5ycvR5Q z&+PGfvgzfa4e5j1@#y+rWErh4x-`C`VR&@*b$SN=T5FB`)rR;qY6Cm_&#t-U1?7>S z931j+<3lA6Jn~S8Zt(V(cW$g35k8Nx4Eu^kyXDrkRH1LBwuSj*7OR!9Rs6n0!3-H>D;UifvT5i<*U3mbfh|b4b8p+1@mz0bZnhkb}#>l)zOiC=Y8LLTZ z$t25m$UGFMCd(ojB{bpqok7U(=1+UbZH@1R$rysZJMj)h>uwdFyD38z9TFldMq^V( z3R$%aQ7v^E*BT)0*_(j~mfg!g*fch|ZXsiJu)G5jYO_OF9~0K^@^N=mB~W`d(O#dh zxF{@s;7{F=ss<4&EW+#f**kKYE@H57LbABDfh(0(lz~Nk9KekB0i55N zKY;@8N8hMxvq7uZ1dUGw(iImfv4Ev`frP#XwiP^RbG)9o4*u=t)I_RB4-z3lRtr6Y zG?=CL@hMw|mHb&WIY6B$#^wRZ^bH`HeGa51bT?>cY&?)cT3DyOn8yX{Sn&A3QqAe# zHpi&$8+rcL)TaOB-i!>xhIV~d8`{hEF#_)pzB+((1;c=1s{>MOj{_;T7lCyCzX_z+ zp3!0pWB$Q4@@Kas#aSmYHXo%O?rDau^8Ax6sYB~?82cqkkI?$_JbZJMiF#QoCdC6U zx`)$7++XRg-DOF+5;^RzxL1X3UEf`3Nve*jXS&jP8>-~ZqG zTFSrPnx1c-!q^;?KDej8`tuP{0W2yjoEcsWsHaY)iB5&DX6&`8T1aR3lBV<$HjS|{ zC^8aDYQ>+I0<`s)93Q~qvkXjc4`hxT8QX`_rrKk={AK)1Q@lEe^wiSencH*Dpnn`WFQT2uHZ9E_=k>BMg2(h5@%xxs7~<+`tee501I9o#DeDr)+g(AOph)* z@H9V(V&K~FT;nUZrH`V3!tIO=r>72AZ@Gr~60?7)b2d~~&CviSwc_>Yy&Mlxf63_Ft$C${9diyLSyB09^2&{JT)!WOj zYLq4Tn6{L$Q_wj1sqM3Z({55@W3jt%w8sSOVt6IZZ%$3DU!=+X?>^hcUHr8T(ZRc6 zY^4eh(lPr=bCh&~pK6XA+z;862XT_2bfP#O%zfoNB&n%`?z!fb}Cj3BKk-*1sOSpWQjg>S5RT&^5cw zzeX-wkL~B-YqH#@L8ET0Uwg|t@c=k_-Kv0k)weOa=xfh!Lszxb#ju!&wG%n>+UP_BS>04GFZ z4{~8E1wImm?G$mSOKcNfm(Ov8SH{?Vo~EYJO%6c3QWFmqBNPCZzpe z28~aCEN(2$1)*H|hk^?`;#!J+F;DIA2X>DH3O7GXQ)w&#Q&jYzkw8QF=l9r-GCs)=xzMkP~i13E6?E0_NE8RSUEY zxB-Pa+~ff9s$e|8FdVzoV>*881YHk&P0;uX%056*M{C-(Y?89djmQ+M;ec>6N+UT2 z`Z7quuTk0|Ck!sY{C9%E7ihL;I%BVZ_5h7D&;!u;BF)}Mxk5HF5?~aPUriKuYDwj9 ziZDH(3130U1x@%mN-5}*z(L47C}@0BXB$wcla859c%Pbud4v%@Uo(zEiVonc5;%gq z9=IKahPoa21qwCfpG;Dcxpoe0U{7dAxdQrH0;wgIA3`3*86#w+2)YRj5z#2*AQm`P z&^BNzN;_=YfP2gEgn-@;w9Lh72TfQs4}bLoT@1uWa8=$9jHsf|I+$}{H3|hy*evLK zflcRdBgceaRWo)F6)pj9pN}4bZUjEF0FEAjW8irddOGOMIcT9)Hw3r}r2;mTB>xko z2J}UsxkhtL_$7)R@=L%Ki?Bu>!2DAJx*vt2I{`G@q|x||gKb4o=Ly(>LL))w5j5eN z#TXqlx*OPqLY+AX{7lgOKufJAC!8ecT;Ov2(4tmY4rY^3YzCe~c?FFUhAa`i1eyg+ zxEh6mUIV-==qteXrPx?dm+&A8*%1Cs(EY%i<>(k}a+^Rj5`#rYcu>$D;AEuvAHxVg zAF;1c`arW)*jP|(Xw(XvCusU!Lf=YAo?VAUi*f)P5xt4iyRGAXbOK1PggqD`dR3c_ zGM*~Xn+d&X5KTz$6GRiz8$>Z26P`yo_&`_0!+la$*uHGtl.+?) S(?\\d+)E(?\\d+)" }