From 549ff9cc04093ef68d46e6b216d6fb7755634690 Mon Sep 17 00:00:00 2001 From: Aayush9029 Date: Wed, 27 Oct 2021 22:26:35 -0400 Subject: [PATCH] added option to play in IINA --- NativeTwitch.xcodeproj/project.pbxproj | 20 +++ .../UserInterfaceState.xcuserstate | Bin 56107 -> 67769 bytes .../Contents.json | 21 +++ .../blank-profile-picture-973460_960_720.png | Bin 0 -> 17707 bytes NativeTwitch/ContentView.swift | 49 +----- .../Extensions/Double+Extension.swift | 32 ++++ .../Extensions/NSTextField+Extension.swift | 15 ++ NativeTwitch/Model/Constants.swift | 3 + NativeTwitch/NativeTwitchApp.swift | 31 +--- .../View Model/TwitchDataViewModel.swift | 58 ++++++- NativeTwitch/View/SettingsView.swift | 147 +++++++++++------- NativeTwitch/View/StreamRowView.swift | 31 +--- NativeTwitch/View/VisualEffectView.swift | 30 ++++ 13 files changed, 287 insertions(+), 150 deletions(-) create mode 100644 NativeTwitch/Assets.xcassets/streamer-image-placeholder.imageset/Contents.json create mode 100644 NativeTwitch/Assets.xcassets/streamer-image-placeholder.imageset/blank-profile-picture-973460_960_720.png create mode 100644 NativeTwitch/Extensions/Double+Extension.swift create mode 100644 NativeTwitch/Extensions/NSTextField+Extension.swift create mode 100644 NativeTwitch/View/VisualEffectView.swift diff --git a/NativeTwitch.xcodeproj/project.pbxproj b/NativeTwitch.xcodeproj/project.pbxproj index 33da836..2833483 100755 --- a/NativeTwitch.xcodeproj/project.pbxproj +++ b/NativeTwitch.xcodeproj/project.pbxproj @@ -20,6 +20,9 @@ C2A7BCF226462B030038CFB5 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2A7BCF126462B030038CFB5 /* ContentView.swift */; }; C2A7BCF426462B050038CFB5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C2A7BCF326462B050038CFB5 /* Assets.xcassets */; }; C2A7BCF726462B050038CFB5 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C2A7BCF626462B050038CFB5 /* Preview Assets.xcassets */; }; + C2E360D7272A3F54005C6858 /* Double+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2E360D6272A3F54005C6858 /* Double+Extension.swift */; }; + C2E360D9272A3F77005C6858 /* NSTextField+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2E360D8272A3F77005C6858 /* NSTextField+Extension.swift */; }; + C2E360DB272A3FBB005C6858 /* VisualEffectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2E360DA272A3FBB005C6858 /* VisualEffectView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -39,6 +42,9 @@ C2A7BCF926462B050038CFB5 /* NativeTwitch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NativeTwitch.entitlements; sourceTree = ""; }; C2A7BD0226462B050038CFB5 /* NativeTwitchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NativeTwitchTests.swift; sourceTree = ""; }; C2A7BD0426462B050038CFB5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C2E360D6272A3F54005C6858 /* Double+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+Extension.swift"; sourceTree = ""; }; + C2E360D8272A3F77005C6858 /* NSTextField+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTextField+Extension.swift"; sourceTree = ""; }; + C2E360DA272A3FBB005C6858 /* VisualEffectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VisualEffectView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -84,6 +90,7 @@ children = ( C2A7BCEF26462B030038CFB5 /* NativeTwitchApp.swift */, C2A7BCF126462B030038CFB5 /* ContentView.swift */, + C2E360D5272A3F43005C6858 /* Extensions */, C2A7BD1C26462B320038CFB5 /* View */, C2948E1726E424F0001EABC0 /* View Model */, C2A7BD1B26462B2C0038CFB5 /* Model */, @@ -125,6 +132,7 @@ C2A7BD1C26462B320038CFB5 /* View */ = { isa = PBXGroup; children = ( + C2E360DA272A3FBB005C6858 /* VisualEffectView.swift */, C269947C2647251D00B3DCF7 /* SettingsView.swift */, C26994802647255000B3DCF7 /* StreamRowView.swift */, C271885626E273E2009C8002 /* LogText.swift */, @@ -132,6 +140,15 @@ path = View; sourceTree = ""; }; + C2E360D5272A3F43005C6858 /* Extensions */ = { + isa = PBXGroup; + children = ( + C2E360D6272A3F54005C6858 /* Double+Extension.swift */, + C2E360D8272A3F77005C6858 /* NSTextField+Extension.swift */, + ); + path = Extensions; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -213,9 +230,12 @@ C271885726E273E2009C8002 /* LogText.swift in Sources */, C26FBE55264679F1006818AB /* TwitchDataViewModel.swift in Sources */, C2A7BCF226462B030038CFB5 /* ContentView.swift in Sources */, + C2E360D7272A3F54005C6858 /* Double+Extension.swift in Sources */, + C2E360DB272A3FBB005C6858 /* VisualEffectView.swift in Sources */, C2A7BCF026462B030038CFB5 /* NativeTwitchApp.swift in Sources */, C269947D2647251D00B3DCF7 /* SettingsView.swift in Sources */, C26994812647255000B3DCF7 /* StreamRowView.swift in Sources */, + C2E360D9272A3F77005C6858 /* NSTextField+Extension.swift in Sources */, C2948E1926E424FC001EABC0 /* Stream.swift in Sources */, C2948E1B26E4250A001EABC0 /* User.swift in Sources */, ); diff --git a/NativeTwitch.xcodeproj/project.xcworkspace/xcuserdata/aayushpokharel.xcuserdatad/UserInterfaceState.xcuserstate b/NativeTwitch.xcodeproj/project.xcworkspace/xcuserdata/aayushpokharel.xcuserdatad/UserInterfaceState.xcuserstate index d4c470f8232f8671bea128b8151e5f52166566c6..913eeb913eb3ae61f80df46522a93a546a1084c4 100755 GIT binary patch literal 67769 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 Juixdv{|6{S8gl>u delta 25710 zcma&O1$-38|2}>*vwOFKtQ z1&Xv-aVss>7AR6EMgFsQxt4y~@9*{JUc0&5nc1D^dF#y1uwy#4YAc$S1E~Ykhi=eW zfwsU7I00wS0l0zgz!&&|9zY9vfk4m)3;-b@97KQ^kOi_q4#)*VK_18l1)v(#fLc%o z>cI#w5_}9k0T_%1W59SY0Zax{z)bK3_!2Axi@*-B6YK)J!5**|>;wD30dNo;0*Apj z-~{+i2d;pt;2O9NZh)KM0eA?02ETw`!6Wb#LWm#*X{dxM$Urr;gjUcR+Q9bE3u<9c z*c%4HU>FL+;2;3H^E(SH{1jF!hP^CJO)p~Q}8^z1h2vC@CN(=K7x3_VeUC1ptLPfKg>Ivt&|UNp{fr)? zC+InPf&M_R(L3~>LKH&Wm36RF;ziTQp2f6Y6LZs`k4BJ8b^IbeNHW=ny6-K z3AL2^idsf3r&drasTOK2wT0SBZKJkRd#QcYQR*0Voce}3L7k({Q@>EZQje&|)D!AA z>M8Y%dQQEdey3j3fQB@p)ig_6(3Z3nZAaVFJ!q|t?n(R80dz0AHyud#q5IPP=mB&j z9YsgegXsi1oz9>$=`6aCE~0g`L}Pk1J%;|29!rm-KchdV$J3MPne-R*e0l-Bl>Uld zMlYw=(d+4B^l|zd`UHKFK1H9VzooyU&(LS-@9FFG4f-bi6MdI{L_emV(7NB~r}S(3 zPo<^ON@=aMQMOUGRkl;MSK2D=l=ezzrH8V!vWv2((q9>%3{nOw)0FAT3}vP=OPQ_A zQRXU#D)W^2%3@`uvP#*Y9In(UB_&plS58niE0-vjD!)=LQ!ZDoP_9(AC|4<0E7vQx zDYq;4D)%XmDvv3T>y+Op&nnL;e^owGK2|UH{g{TIqLRDd^a8-mVQWd3&Rt-|ct5Q^{s%%w`s#sN` z8m1~$)vD@LlT?#cQ&dw`(^S({GgNxjOw|{vS*m#|U6X3LYK3aOYJ+NrYNzU~>YVDl z>VoQf)kW1M)n(Nc)m7Cs)h*RM)qT|?)nnC5)hpE>s@JMN8N^VG9b?ZpFpi89BOC8|@@+3Fm1p}I(2sjgC2t4F9us%NP6>Y3^<)U(vH)pOKy)$`Qz z)eF>%)yvgu)N9pS)!Wqj)ce(!)R)y))K}Hl)YsKF)Hl_))VI|?sPC$ORXt7@%1&Y@vs2hv>}+-&yPn;^Ze%yHo7pYwR(2b^o!!Ci zVGpxM*ss}>>?!sF`#pP+y~JK-Z?iw>Zz%0`HkvjXM~#!lS>vhk(gbS;XhJjtHKCd? zO}HjP6RC;PL~G(SLo}J1EKQ-NNK>q-(o}24YbIzWY9?tWYo=(XYNlzXYi4Nln%SC# znnjw$nq`{hnsu7>n(dk$nsb`-nhTomH5WCPG?z73G*>m(G}kpZG(Tt_XdY{x=rpf1 ze{hJSIGR&(0w;3roCoL0d2!yH57&w7%yr?qa^1KdTp$qE`aqbLvmOICt=Pq$SazAl*xqIAw?g96Zd&E8Co^x-wx7<7KJ+I&?-h#K} zt$1tRhHt~S<=gT0d&G9`33x!{6c;azl3k$*Yg|r9sEvy7k`L9 z%wOZL^EddL{4M@A{{w%A|B?TRzso=5f8$^BuLOkv1SqhAMsN{23a)~i;4XLwo`RR) zE%*qXgl>Yr&{yaugbCq7oDeUR2*ZR@p-dfN)SaBpeow2*-tQgww*e!gsA9yxqy!P_%_a{8Mx|W+ju*=10RLgQs4nRffw+WvZWj;R~ot$ zbON107tl#Rw@tN0PvEbxS-e=vH{4b+7xdQKwe{fpg8mAdCeTkRY63y}__i+eKoAPT z^ds83SfVvUtIA4h>$-M54Bmn>Km_1ofcR>in`FY)m7(wp11*N3(Dl`DLFNUv+(PySYMRez{` ze@F7Ielw}sukDil8n29)+`5v6g2dq^b$P{Sg9n7@C0lo$MNzMJ6McgYePM-Oq0P-< z5zXP@E{fKF&5=4MWF??$pL~a>l(G>fS8!8xuxx!Y_S_X#*W$N9YdyU;vCJ$z?uCEX(0YsDm>| zBH2Rn#;tG%JP41#)9@m^Omf9rMidYj|0?2)e=S>oD&Vh1&4>h1dSvg7qQM}2H~Tp~ zVnMRPYZ>WSJQxfTKq5$z%A|6sLaLOir0Qj02uLA7JV3g_RjQF{r39&s^s)Y({c^`b zP%7(B5dl;JhDmi&z0@ELUkb`VIjLW%KkTqX*#H`wz;J!JV;hf;z^IJBb+@2y3HV5H zTQMcId!cVZ&%A=%u4fejF%6x5wPPpoQ!q~9)da>$QWN-0!utD;KF$*rpDmU=|B}}^ z1#f6D6-<|_PLn>>_i*YY%mQ;2Ud>=Om?MpoKGRn@4a!~&Rx7+#fhN#Q_+ARW0?WX1 zu!1n(0#-@mr3unRX_7Qqnj%e=rb*MK8Ipb#Sfh9W))B#M02{$3uo-LtTfus1CV{_L zYLc3zCDI+~f%Hy#FEwp)a`pq_5pY!Q#@EspP2iX`OK;Z0RtrulK5GW2z-ei=^rhr! z>hT$HL1D9mNcr1^y01^Ue$0y|GyY!IBO$u02Xznc6+n%t8X zk|vAv4lXt@H%G5^=@j-@@mUjiA}#&&|FRhW*O6!(Dk?6$>X+5DN zLEo>V*8t+1LPk{NmY3uu<_?Xh$S-I#NEEhF=$l|$X@k`1610VO&>lJ{M55nL&>41s zE`Wuu(2blupr?Le$8{curGt_}+9(|%=l#;5@1ZyJft^T`&aeyY3cJDX(3coS4}HDs zFwG8Wv$R{mR!Mhxp463y`)*ozB5P*oU<0t9SwXr$yu!RMeFemK4+^8M-EI zCH>y^4+}Tg2OI!H^w`ZA4J4iuyE$4}>fRgworB@zZV@mNM(Mk_w_|onyCg-nS*E@z znE2YD9{R33ShevUu`o{m$lV4t!+8BK?sjbwU?NOPtIDk_Hu`93ue2xIELk5P5iPgs zVr-QHQ`19|6GKbN3gSrBW|*d!^5F$ztqho{U+U2bWa-a(bV%vFH|AC57j&+w zsT@|2SEs+Y+*L&X zV6}8q@;nRcNcZYtgI?%tr#mLy{!jT6ul5miBbq?uFUhk1Rys~(fB4_B$8dD3?8ix` zrEgm0e#-dR&t<`nmrndG_(`(hrIW34PWn4G{Fg`pD;Wf8QutYLK5=evHk1zLIM{hcDpo@TK%vdLsQMJzc7B zCC=v~g$K#767(be#)=5h#Qh>ldftST(hK5#?Q|^hzDR>O>38Xmzq}z5k>&roQe>s@ zKsM4#;!0mh`6}g#1;btXj}QOQ3nN>SPyLVMMoy$@2kA9w`lpniI=G~$xV7yB zdyjuKc1NCa4?U!}O~h>`=)dh@-v)I?U5rvYhq@zQg{Zirc!&J-Nb4D>FbEQ9QBPvg z2A^f{3do;$g%2*AMZFXv>WuL`kfJRV^`X0R; zU9~-Pa>*@*7{IsQBB$4Rxka9HdV$oI)NZ36(MxNk?O8I6Bsd`@220Pa8PQzQOMj?W zgKj*S3bvCu$cx|?GL`5}>@0vxAEuJ5E|W|e7Lw`029nn;CX<7!4fBCt!{hJ-nFst1 zo+WdE-;0UUBK#?d40}2Bg17$x9R2VQAs4-wM&|tu= zBsLR+Vo@B5M}tuUN<>Lg8w_|%O~%wTOf_R_H>UPrY9FTd>xTwD2}HT5Na6Jr8jA8z zKEYmyfq;RCff)wo7+8FTiU}LT2p?q_SYoseqaB!1VJb`NtdH~TuHWD1j1JWyk}4AY zNA;)y4M&Y=1R9AxLZi^f=o6$v62fRS8iPJXW6?PD8TuTJM-$LQGzm>cQ_xg24Ff9- zY%pkxL3<4BFmS-Y34;z8bi}|70}l+mFz~^kGX`BT=#GIO23idKG3bSXE)avh81%;= z7=sWDLNN%(AX4tn45UXh(HCeInvLe5xo94mj~1XWiD(z0#i$82qa|o5`U)*0qF#Yk zq879Ytww7wh{hlvgO4%LW6*-Zehe;Q@C$|j!!{Up!!QiPGz_aT9EStp0u0wz-^CFXN*EIO2?=YqfaqfAay4s7^xcvvEUmHv9v(1JWN*yC? zEdGA>31g|FeqpdPNxZcB69X+jX#AbA*g4xQzO`#sACz7&mbw^A2k4)~i8dd=y<#kO z%{D6`jpe*ftIzh}oPw&VI@b;_DXjaDo14bU?na1i`fHo*^f!ZPy%=f!!4rQp*7D3Y zD{Z}HZ~e6ps}BG@FxK$aKaNTJpy4Cq1w2%H)+w3W@W8i>#cW+_<$42)mVd!RqFny^R%p?A3Va#SaTqGM7aKSH1|PK7h_QvQNUpz zJl)TDIU?I^FuC^tSq;R$w3Z5xOZ86u)AYB3-G>>+u2diurtoT^`cQqTepG)dhzh0# zP$ASniui^>7{p)@i$NR)@fZxoAOV9!43aQNZlS_S21GtoG&P81LatPtf;gWcBpo6j z3{o-3A;}r}mb~QzcX>nc$&@ zVUX5D5to{-H}B@AqpGM{g-tV6P1RtKfk9?7RY%ohkcC0El%JJfnO9#Q2 zKp>Q3P|-qt(aPIgY92M8@b;z5TcwFN^2`w!jFgG{$Us~awMr&#H3n5C;?@!3sP)ta za%{q&8Uw-wIoC>^%*@Oz%^Xaac2K)y3U^{q-$cS0XpkwirS?;YWT-XNLBbyf!n3>x)2itIa@sZH%qQr{XmIc?x%)CU!->)Ym27pPk@2j5c{sY}#l>I!w0x<*~6 zZcsNd_=H3o3?vK)pQAAtgTbd5jKyFa2A{Q1w_7>*sa1C#$Q*ob;$YHWx-;ECK?LKs>FX1p@&z zZy;bQ!9|OF>WsO*2q=W8H=%9lzSky`f9YW}!2hySPfx%)7nv7>chsI20LNJJqmFXZhy`+gI zHoa7)Bb831hY(enbuyV* zGA;RZFDsx6#|_9rR9m7X}9~AZB?8gTojc!Qg8Qj$&{O zgX0){(?aiQrQ`s8kUm5xIU-YX!bHip7@Wu8f~+auw`$5cnG%BA zTdsBK@6)O+j;0$wqklJ2Lj*#M=pu2m^v?!2d(NmXZEKh@-iM0qN!sElS47jgm8}i_%Qy=8lP*pZ-#phlH9W5bQvh zQ95GqV=FVt4l*-`h_;YJW|3$MIguF$W297iD!mCON7Df<|JD+3L{eQR)#1CDnpfF z%5Y_bGEy0(j8+c9;8zSDVelA(Cm8&O!BY&LVelLS(#_vnl(DV26IyW(k#WB?;eP!W z?)L`Vp#?JTLJVG+aF-C=%3;(S`M}^0gCCX8L?c*J@2iz0>NY6}#6O#qbr`%cVsBJ_ zBx4^TV<&EyU>_x8e`mlBZkbw-R*p4dCm~=ch6)+`C>i@ZBld~PSu*xX%E`(p%Bjj} z%IV4(O1*NX@(Tn0miMDMwM|P7KYOl)EuB zm$7Fk_bcTnsysljLkk1;!^9S#<$v0Ox~EHjvwt`V7t0W;-c~ADA%7-#JE+%qZNsz^mOkT`oivq3Wel+@o=}6K2NAhS4zXl{^?$Q8bJdtu zs#Vsic4UrUWut1NBKW*9Bn>((QH)f$s_Z0hxuc!+cw(Y{LZg|j%0=a7AW%h+5CXgY z{Ro-A0+o-dC($ZZCsk)v7gbkPH&u6)ugXu=L#4&AJBGd(`eE1uL-MmHhW;1^VAu=8 z-YqJBqgJT`Ree-_$+P>*#08p&>xbb03`6AJ3?yom2nMQR2xqET4EwZlrW#B*Qza-~ z$Ondfi7$~)M5{y-)HGFw%v(B!{hL&Tp&*&JbXBe@Uj|j9$}{j5Ec-_@gMa*YZsO9v zYpZ*uO?NF*RT?>|FmMw3L31N1^+p0FIwir=wHlR-Z zXL*5Ymx@eGx2Sfj_Nex%_Nn%(4yX>Q4yg{Sj$lXxkbxn&YZivt7!s4n#gM2|9)|fX zs-vx-PpD3+P7zJ`Rt8;Q0$q$@IffOoCR7?ghpDd1pl@JUXaaqkfTjWAq zfqW*q;9`RPK=rc>`yqxUO)4^VGRz43iRzgVHgWi*gQc>9zmRRHOy8}Z(DFw0-U$1h z0d~~~<#Oi5(2N;@%_tca!!T-wWi$-O@QlC^zet=`ErxX%)??U!;cyHaF&u&6NDMz} zVa$!N8Ea!mVcN;CN10%gyxy33!B35-8Fzx3AyqzZMa_82qMlEOQuCQEWHe*QN6D=} zA*h8`)Qm6FgP>-J5lT%AF+wb(ZpZXum8Uh7&QI zgyCcir(if0!)Yx{YAfzcCX2~dxH7pi?&&7ndJKs=&y~eJ&j5S?Qz-+l!f=KOc&$Ol z6)&ju#PC72oJ5e*Ur7Wrk{Km~CV*x(F&|_2g+bH|Wxd-K9}q&+5X0TAgsAEN z7a?j+O(JBIn#XW&lbTrMKK*ZX?(HqrHU>V_)&@TI6Zxv!%8GD+*u15WDJfCgtDQ-t zR6D30)lL{5!jKSqKhISp2F}nhTmfN9foHxJlmq~XQW6yz^E_kFqxopCW44u zTJ`0sft`>fnVn<|&zsmuCG4ovNV*+LECm|U?IuHrRJICPovY5186v&D*rd+K@RH0> z+hR4D7iw0Q$o_#02r`@1WwL*`V(<@+Ib`W$jk?|lnIx*D@iiH8natr8q8shW|f*sC8;djn$*oW7MCj$6`o4_e~6MVR#$EA27Uw;g1;pgyCHb@3p8uYlS?~ z=oZyeWytqUkRSf#79SZP2Y)F;CKmU=1i6VoCIkEz@*$7tiE|*Qznp`5g}Oxsyb{Bo zo7Af?{KcRW>(m=%!0TneWF$b6?87o(OUXxu(|)^}q^D%!O1;y7_Ax=LJS?M?)5vyt z2h=BJvU9lI|OW00Kq<-;vQ0w%(Y~-Xm!Ldt6}>@FVpT8Si5Z-!-X8XWkp| zzEHoC@%~QmB85S~ZDqU%TJgSPfdMZ|%7$VDKTzn~qub@HSPO!eWmq-KvKp3Sc~)RW z){HgBh{A}*NQsdOBL*WiMl41ej5v(=7S_^;muNm28{!L5 zTZ0E2$a)gQEcq?AB4#@g#B6893;DpvjL26$k(l?S6*1d`?MV=`T8u23SbvNxWiOb) z2D1HROf_s@+3JxM!Ndj;86xX{JHelVUHThe>nhA{n(iCUMj1(oG?3En?;Gd|DS7d1 zhD^#}Hi1oKlh|Z-2%EyDvS}=N=VFVI9Y*#TIbh_7krPJF7hR3PBQB8GHu>6>ijwE5*hVeb{;#QUBG_H zE@T(6i`gc&8KW*3b;YO~M%^*;#mEn%9vBg^^u)-&g_U3KlMlOsUCFkPzpG``0VdRa zFbc+KfUF832G|koP8s$tjCz@1@0C?yAG=>ZFzSs_pz%zUfh>wJ0XWJYm*F47sBaVd z4MzQB_?hf!_KZ;-zB8ype-ho;b8=8bLI2hV^DQp@om$5MgG@KR!d^ErLuN{dkqrF% z4*K}h?F!gC>?4_)AK9PSyX-yoKKp=u$o|a!!v2a;7)Ie3MPL+($vadOjnN>CVlaxu zD6WNl+)B+ex(iF1bdgjp#`0T(7>{xOREo8Z9A08$CZ>8k0b>8|nB_-TkbWMD*$ zF$*I?d=5sr7!fM-Fv`cMpheTuNQ9=h(LHMV$wU;Ih$#NcJ(e4I7@!#>^FU}MnZIE; zq=_dy{MQ)K)bkWgn#@8fMkP&}bc~Fn0!_BYFyC6E$u%g4JSx!S%SvCS&(Pc2YDzR^ zM!=;8z!e{q%YbV%AIpGiHFcVLO@n5*rcpCOGg9-BW)wzM7*%6L*saBg*l;~Y4Hyl_ zs1c(PEt*eS0gpDi0?jxXFnLiSe=s8R{l=a%vExn+83C@+?9%Mk?9uGi?9=Sm9MBxp9MT-t9KmR;-gA;e*HxO<(Vpf6JwkIz z&iXXp$rz`ZFwP)C#b_3B=>+gRy>ZH9ZOBa-=q-$C^nFd82uY(QJ(7 zU^MqXl0Htwu?99cwSf(Jl+Zf+B4@|>oEc|Jlz=nmEI3QfinHcyxHeo{t{q2S#(#;? zLW~w+v>2l%jEEeTU_|8b6-LWiI6I>fa85=g;5y0#nMMiduTcV8V^D%1t~=p|BM#Oy zO5n7FoBuN&aD6xu2%EUR7_~HU{V_6(670ATP9E`b17%)T%e<(|C^B#*lfl_CAUkdl z7iR<P5LOm>-YHk)h{>RSV|UkhLh61da|gq%?B$5xGBc+ec5J( zq+DKBAip#BPcrpvI!6{QFXv`(dTu871viVE%@OT7fYCvW4qFTEq;w6V3(eeVj&$mKj4l!}RqpUIz53xUaNirB zXJX(ocSDxV749l`jk}J~6^yQ8L~e3@DR+~*#ogw9z~}}>H!-?}(S6gp%LMLcxvRfm zbo;}uKIWc~b-JXhcQE>aEbP4LV%Pxi@}jNjc`vwEG9kZnFERQNqo10&Ke*Qz-Noo0 zS!Wp-#RDGxqlY}rYsd;DUdgL?hF9|}Mh`I}K7>4*_>f0m@f^?d0x$Ar7(K@52}ZwR z^a`UtHi^5ffH&Wsbdm`{#w8d~ae#ygwhn_rmB;jNV}Mb_pNI_u+}Hzrz%b zDJ2n5&~6)j%-#lXp1ja(;s;{%{==?@^AWtvDFrbFFr|>Y`k^+5+w!se;D2^CfltH~ z!W2ci+EKr3pIsWC#;57;x}mz=v5zF z|HybJWNqZVavh|HVp7p8&W#WJl;n6hgPRs2%oj>%Nl3;B@ewh|1dzXBD%ieEz(q zZzU#ADiWt`%OBytld*lxALWnn$N6vg6Z}d36n~okR-d!j(ThLRitBZE?>W`@)Oa-?HZH;IJJC&WBdkAD% zFQ&*SL;hfDAbIy;NIa+rV`vpR6SzVbOog<<6-cc8zeB4KAoM0+1=4}gCV_My%rMjv z`U?YOJT*cvfr_bc5;+yeoGONgthViEm}b*U>U81snjN6G^WxF36?NU7;i-TxdCnZKc#0YOcjhHO2IIq zq%!|m-b0up%qQ+em@CY~WGNGs+bk>)zQj}>rbhh3D+tX-BhJY-i!mk?=gmG?gQ z77xuf%WI9sWRc%_n-rl%AW?FKuu51htP$1<>xA{f24N$n@-bC_sX|N{k2~T7g_k{<-L*ZxP7vWdok?2H1B}lw^*N>{Vrr5BhKNX)MG8}6{)Qnk@-;Q4 z#*%9RUag%M1yTG*zeEesil7lKF*UwPw8qo~f`${@nb1fP`p)0mxQGs-<3HPV5IYie z5?wGgrAc(f)Kq=erH)0Smq=b=w20oKkJw4 zz|<^E&BoLmOwGmAycSU__EdN%T*Y2uZ!u8pBleXIU_Pc6kX8J|+KEmr#MB~8Eyh&S zrU#ciKvywABq{7tF;Pqslf@yJT7s#inEDD+%a)3%Vw#vP60=*5sTG)7iK!NS(3J%P z#6rbqOT;3vSR@*=3R5I@Zu)BJ2lV>e@J3wbi8wqk1AGI5&Xm^ee!D~=IIL~WNMF+~d*_wv;`#SJppg7_8jG759DW1*9&!z;yAL|^1MjvZ8w$S-Cw@n8)XmmEHB|Q;$qOehQh>T14ivmaxmnR88@fwvPn8d z93rL=t(G@K7ZCNV6-N=3m@6(5kBi@nx5Yc+PvSlCf%vodyZB0cExr-onJLVmnVVUZ zS*_VDvt4Fa%wC(fHFq`dYu?{H*gV8M)I8ig(mdKc#yrk^uz8|+vU#O>wRx?1z4>tS z5#}G6e{8NZ*J1N9=3~u2Gaqk0$9%o{Ve=d2e^^*qbhU`J$g-%h_{?Iy#YT%=7P~F> zS{$`FX7P>1Ig85{H!N;h{A%&k;XEh5+QHhz+Q)j3^EygThFszV7<_Kv30ZcQtMsT-&)_dK{jSK<~9~KRyOuF9c=p8MA{6piM1JQ zlW3D{Q*ATSX12{-8{Pc&(e0Dkf6{(z`?a=~wobO4Y`fTYv-P#@VcXL-z&6x2+&0oS z+BU{E&UUbEqHU$^c-tkmdu>nI{%ZT!_Kh7)G8eU-#*VkMv1@DB-p!OqFf-!98; zhTSH+-FExz4%i*C`_AsN-Cet1?Oxg|?14S9Z*T8n-__pNzK6ZP&c2s@pnZ;giTyD9 zGW&Y_(e`8QKeL};KgoWI{c8Ii_IvI3+aI()YJc4Rg#9V|pBz*URu0|{ogBJ2baU`^ z=;6@QA;6)xLm!8J4nYnn4rvY<4p|O44nrOC9SR+a9fmoSIaD}QIehA{!Qqg@X@}n& z)s9^p2RarzPIR2-xZJVDQMcN0o#O__O^!z$zjM6cc+v5)<5kD|j*lIGbA0Cb!tssc zJ12z`bfTOroE)9HI|VuobQXh!3>6GnM=v3@9%&E+&!bx%(?=;hCmeVSy%}(2# zb~x>FI_7l2>7vtRr>joaoo+hac6#LW#ObNibEn^(UOByXdgH8ewsr32+)w8m-?GX6z6HqGn{8S&vIVnyw~|V=gZF5oNqYa>Hs>}cL?f`(4o4+*bdV> ztn09$!=?^fI&AB(qrv+KWrNEmm;ElsUGBU5+EK@KwC>oUW9N?k9eZ^Q?AW*C!j8*3?&)~2 zvt09BD_t91m$2fGh+4|9)jPj*jnPjk<3FLAGN*STZ&G45mCXSmOI|I&Stdz1ST_toxe z-PgNsbl>d0)%~uAwMU3YrN=mr`5sF>mV2!9Smm+X<7L=*|Vo-h-ZXn zl;7+N;*9-fK8X#K(Az_4>?frq?X5IbQR;mV2%D+T*p)>wwoGukXArdtLRq?se1a zw%0?iU%Vc9J@I<#_1x>Nx3#yEx0iQM@BZGw-XY$h-r?Ty-U;4G-b1`oz0b1d=~gD@@eu};+9^>#aHXw$2Zb9(^r?{o9A2TTjE>hTj^WlTkqTG zJJENt?=)Y%?=0WBz6*R8`8NB0<-6Q>ukTgg`@Zk}y8DIr<@(k7P4S!Wx6E&)-)g^g zejEL^`0e*Q#Xglb=P`nJ88RW zeYIL`fHqLuPp1vm4%CKgqqH&Fcx|F~h&D}|sm;;mX$!R_+NIj%+7|5^?RxDd?N;p$ z?QZQp?LqAk?J?~M?P={9?Ro7*?G^2H?Jeyc?Op8y?JwHL+NatV+E?1wJyku`JvBXr zp19|fp3{2H==nv@-~Ew4?XU7@{qy{*{A>K{{D=GNF8Kf8|D*q1{|5mB0^$M&2P6gz z3D_5KGT?N;cLC>mx%cwxrS0Y4t9P%dy%zLZ*lTgGCB4PocD)^XJN0(yJ*xNk-V=LI z?meydyFg7KA1DS|1P%)v9ylWKqrguBF9iM&_+#MRzz2PT`^5H%?~~9cxzEZzTl;M9 zv$M~hzC-%v_bu#Otm|9a_gLQxeJ}RC-1l0)q5UfRRrjmy*U;}&zbpN&^}EsUcK=@e z!}>?`kLn*21cHPhvmlEg>!6~bx}b)j#-NXa9tOP(`XlJipm)Lb!J~se4IURfKKN?z z{oseezXU%XFl0dffWiUA14;+%A8=~Gw*$@$I3E%pk`+=L(hxEtWK@VQL^nEQY{=&! z6GNtiOb=NWvNB{<$eNIKAsa)sglr4h5wbgEZ^-_T>mhFjIt>gSSU7Of!1V*a9r!3z z6KWOOCbWI1U8rkl=g_X9-9!CCwW0o@14F|@qe5ds<3kfdt3p2x9UVG0^z+ckq0>V3 zpT2r`h^9D4GBvN%LvN~%L&U1D-0_MD-Ej%s|u?Ln;Nz@>}=Tc@V4Q7!-t0B z@WtVK!oLnb9)2?Xboj;aTj6)Y?}k4J|0VoU_>=Ib;m;#L1Qnr*U?cblF~TPzAVSwS zA}AsxA|fIxA|@g(B0FMeL}^5M#K;I;#OR2z5fdUNMNEyD97BN4|UPDGrJ zI1_O`;$p;=i0cuzB3?wiig+FICgNQrh@>KwkxZl}l8+Q4eIlbGDp^c~=olf!JjN=fO-%b3yBLQUrv@roOy<<{h3Sx%El*d%X z)Wv3{}ISbtq?Qfyu9oYExIg0F#e;Y%ULCKA z7vjz09pgL1d&m37_lfTxKOjClJ~Dn#d~AGHd}+KCKPG-${P_4u@l)ex#D5V#Cw_kX z!uU<`TjO=x<9EjIj^7u5F#bsV(fDuTPsX2)|9LPwxbxt+!F7Y@4cK75S|d35SnXo6}>x5$o7ZR={Tu-=_@KeJ5gr5_BO?Z>2PIO3g)+KgKbWik3?3CCw(Kk_> z7?2p47@wG!n4FlBn3kBCn3Fg(F+Z^=u_UoH@$2lJwq#H@MlkOz_l=L*|MbfLJKa<`iE0XP#y^^~mcTet-+$*_Ha=+xD z%wm@Z@pH`s5YKtCH6yZ%E#pye)ZW@}A`V$%m4^PQIFa zBl%YH56M3!-%Ea&{7dqq6sMMI$_|(MIlGL))iqxvq zn$-H##?+Ciqf&LLICV_w;?#YqchcxI&$QUI+O!#I8`4gvT}-=@c0KK8+WoZO(w?Wi zOnaU7Htl^nNEg!0)2-6mr0d$J+ocDjho(oR$E3%nC#R>TXQXGPm#0^yk4PVvJ~4et z`t2uQ;q%TZglfE5tQ&W~ei`3?aiT!y>~v zqiu$5hJA)(Mu&`!8EzQ^GKOZ1%UF?dGUI8ceP&Q*PNpt%LFQMPD>7GQuF+*~&D@uH zAoEb>k<6o+$1}gryqtM0^JeA`nLlQMEFsG>%OQce0*lz0bDFZj;?U+dkVV z+a=pA+cVoIyGwTW?6B;}?C9*6Y+YP-LUwX?YIb^dR(4MI&}?1y!t8_DKjttwopT1~ zROd{~S(CFhXGhNNoV__mbH2+tmvbTKQqGl}YdJS^e$IK6^IOjIoR>L&u%uUEm${m_plshc9JhvvdKDRM-JH8Ecc(6Q zPwxKQL%Cn)9?!jzdpq||?oYY*av$dYn)@X8Y3_^Mm$`oowHexDXzI|9hAtX+*5_nEb{0`||G;&;_0au?4jSGYU2ooG!RnaHZgS z!OepE1-}(MFL+t-y5McW`$AAC6q*-W6}BmCUuahtP#9VmRTxtkUzl8&QkY(tSy)zB zS=gv699j5T;iST;g)<6g7tSqQP`I#gP2tYMZwt>BUMRd&c(w3G;qAg73-1*^Ec~?y z7STnjB6X3bNGLKdvMjPLYFpI4$gU`$D5Ypr(ZZsGMfZ!jV(;R};-ccJ;@aYd;>KcJ zJfV1U@w8%n@vP!G#q)}n7q=9zDPCW^sd!8A*<#(z;vb9e6+bL~T>P~7dGYThbO}>p zUDCe9zQn1-wZy%|tHh_IcS(3jW=T#-9{I0qN=nK~Dobig>Ps3+J}Q}3qA&TPWOm8i zk_9D;N}5ZSmMkw>S+c6+SjoL%nqi%W#Sa@kZ2qvF!!8f|ec1a_SW1_wO3g~!mD-g$ zlscEXl)CClyO;JT^)KyR+PAcSX=drL(#q1B()!YorK3u9rMPrjslIeU>B7=grRz&K zm2NHFRl28if9b)}Go?35pOyYz`bX)T()VSsj4or!G-X1Wd6`?8XPI|dr?M_(-OGBE z^(+f03oPqf*1s&XY*g9evV&!J%enHd<+0@z#r2JU09tFWxFuIO0dUg1{}P!U+suOg%(tRk`^ zx+1-zxI$Mkx?*g_=M@txrc_L?m{~EqVqV3U6^kpjRqU+TU9q=ff5oASuPcsMoTxZe z@mPFSAsvoL; zs=8NAS9h!qs1B`;s*b6SuTHK`sZOuXtS+k_Q9Y%4diBie+10vv)n8UGu3l2Tta@ej z>gog4hpWG?K34rr^{MLbs?S!RufAA)x%z7LtC}`7y=yXSaLw|X6EzQO)wOQ5U2416 z_NeVy+rKuVHo7*ZHoi8YHmP<b7y;6I<_J`UZb+z|uAJo38qwCt&+1EMMxzxGUdDi*Vb*bxK*Q3tAZctrZ z-Qc>!y5zdlx{SK4x}3Vax`Mi*x=-tt)E%vRP|w%<)(@#~sQ;pVWBsoBz4Zs`57nQn zzfgav{!0Dz`kVE)>mSwsR{y;IW&P{=Hx2C?+#0+aIyZD{&^81#^ls?Wpo?xuZOCfK zZOCsZX((-|XsBw?HB4$~YFOH^yrHFGO~d+zO$}Qcb~Nm6*w=8r;bOz(hN}(N8*Vk+ zY51w(Uc9y7dZ_{`xuhu;|fw$ZLJpfR{{U}Jb=WMe{OMq_s4(8hws z;>KZ(!y897e%vTEj%gg**!=(1aOeL`6AT>38SG&^oN~!A4)Ng-WP$@3ha7UqfCof| zT!P>P++fNv;(>(jEz%n5SW16FgCg2+4J)C z{PO+$6W`Zc6Vb#G&2CLnQ>odfsnQ(K{HD38xuLnGxvOc=G-@7eo&s%v?!Yi00~iU6 z0>%L2fDeJmz*JxckPWN=Rsp%dYG5sp4-^0!fK9*_U@M>j7$6Ru0iJ35X{T%Rw78bj z{-QmsJ)%9XJ*mB@y{^5fy{)~ceV}d7Hi9W2k_x7QZNUy;CvZ484x9vj1WpHMfpfrl z;Cyf;m!AcoDo5UJkE>bKx~`9t^>H*a#QFCb$?j!&cZ1yI?o$g%j{e_zBV*nS>y# z5dsM!2atN?4ssu9KpK&k`quh?>f7r(H6t(GnwgiL`a$}4^zZ85)4#7DrJt`~q0iN? z(dRXDbsL*yy6^Nwdc0Y1bLe+8>t{i|ppP^wVhR23X3*?^s?qIcS?Hm@QUADE>v?Ht zVQ6J&ZAdrtGrVPZ+c3~D1ThRVWEe&mG7X~*V+=Wl%?7vON5chUOXFbU4C88}!AKfu zqs{0rmKe*7L1VcwWDFZ+qhhQy?lbN;RvT-KwZ>b<$Ho`N*Jw*L4Q-3IM?0c@(f;Ug z^nG+RnuUIdPC`FIr=bhbmFO1qKd2UkP(6yGCbSqu%%~N0pg~kXLueS4(HOc5{Si%~ zKckiCUi1?BvS>ijw4$$z=%Q%R(W3iUd#pRw6HCYXVuP^}SSB_a%fiNC6R>P-4mJ<_ z6kCWb!U{1xhG7IoVK&TxF_;JAuySk{reb@rz1RV)8mqx-u?yHu>=j~4F{PT)Ol?ga zOmCRFn%*?^GW9XNZyIeHV;XB3Z<=VDVw!52ZklPDWtwBkGvOxDRBL*O_rNFM%Wwd9 z<2&$DoW+B5RWEF+OA zI7yr)&JyQ|OT=a3D)G9wU-8u9)x|_{xcF@GOR^6+fm}j$h~A8c>*C%k!Q(Eyhb)sDO4M(9o3QQO!cICQ+=rZ)BtKS z^#xT(=_!mND2lRC4vL{X6i3CVYO02+qmEH0sngUs>LPWSs;90~GD7Uq`bRCAiS zt+~Cqqq(!WtGT;5)BLIVJF~~Eny=9Rpa;^^=v6e5PZ!V|=uNbiMrn-3>0+9qY1&V3 zr+3l;nxlDoKYg4&O`oGL(pTwg^q=%C`l+S0rJbdtrL*NtOD{_wOFv77WxQpgWr}5* ze4zrQLAHDrxg6>Gw}+gfEkV6C>+*m~QB*oNBPwY_HpY$h9FBW<+p zFMBI{7khVmPkXw(pM8LRpnZsajD4K_L;Ga=RQn8jwtbF$t{t)m?WY`l95WqT9XlMm z9KSfK9Qz#y9Ty$99LRk~gQLmu%<;nU+L_{f%Q@Bgu`|cH(D|8jv2&I4E9Y8go)d8D zoQTutEOMT3UU1%Y-g7>1K5{;BK6k!ywQ!}m`nra>vRq?b<6IM5*{)Ar3tfv{%Umm5 zYhC%S0@nuDX4e*1nd=18lF4AEGfSCVW(||atYbh1Mi>KwG8kiFN|>EYfZ-UC2{Tb9 z#;D9b<_L40dBij_P0V9=s=JfBi@UqKr#s!<&pp&V+&#jb>Hfey);-?6&h2woyBj>| zo=ne7&wNjgXOU-#C*M=x+2Gmi+2X16RC|8&obz1p{O;DK#{ z9f8sS8{h+CARLGW;(^_PWZ+2Pc;IB`L}a_A7QHTgYx@0T$7*Fk8a%ti;M}jQx>S z*`L`;wvIi+DVT9{YfO#5QrMTxV`DHo554f@11a1=d5jUM%$}Q)< z;8teicpUG$O^Y{3N{3E`Jf5JcGUzGPMA6ve> z94;>{uP(nMv=fF2GX-S6kRvP-mIz-8>x2T~TVbQHS=b^NgdzbKNP!ltLP)3(_6U20 zD&be*uuvx)6@C})2oHru;j!>ScrB)gt;8;3e{r;!C5{&-ic`dC;>Y4F@!#Sn;sWt& zah+Hoek*Pi3&pLXM%0Rsh=>O9d+}%SN~jeQ8WNft+7z;dBB8^f-$G|X=R+4m*F*P1 z4WY)+0+vp`?*O36@X^lL(2F zd=e*#Qdo*gyQB)~CuxsVBh^Yrq~qa#g-3=n!=uAl;q74|tcLf5k-g!n@WJq*aBcW# z_(b@R@Qv`T@ZIo(@T2fw;iusj;a8EKk%5t{$b!hKNMQtvI3wF4J0hi#vWOa~iX4m_ ziX4vA%dO=0axb~JoG$m3hshc8NO_bzMjk8AmUHAq@>2P8d4*gc1F}{IWk@FF68U@i z2f0iRBC;S$vMk5sD*2#%NUoKS$|vMg@>%(Ud`W&1O^x=5W=5w(bE0dag;8A;i5jCt z(UNFcG#C}4q3AEs`sjn`!)QaaQAtr!l{BTT(n0B@3{ZwC8Olf{Q~5}lr+lK!R~9HM zm0V?wlBcX!zEMDhP#8r}5J{1hn6gW$P<~P>m3_*7rCPbDTvqCpYswAfmU35lpgdCk zQl2Q!VyUt8*x=aY*n(Jo430TtVyr55Bz7uxA)XRXi?@mQh!2cs#7D+Q#mB_Q#izz+ z#Ixgb;`8G3TDT__=s}{9628yea-9{yhFF(E>?yNOVi|Nc2whO$c zpbk{$4pxV%!`1iHEOos4p*l&Osb;IQ)f_cXU8jDdZd41^ttz1ER75qZ*x&bqmM#Bo Mr+t6-|EuEv1-uW#VE_OC diff --git a/NativeTwitch/Assets.xcassets/streamer-image-placeholder.imageset/Contents.json b/NativeTwitch/Assets.xcassets/streamer-image-placeholder.imageset/Contents.json new file mode 100644 index 0000000..9160a0f --- /dev/null +++ b/NativeTwitch/Assets.xcassets/streamer-image-placeholder.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "blank-profile-picture-973460_960_720.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/NativeTwitch/Assets.xcassets/streamer-image-placeholder.imageset/blank-profile-picture-973460_960_720.png b/NativeTwitch/Assets.xcassets/streamer-image-placeholder.imageset/blank-profile-picture-973460_960_720.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c265b636ba3de8a52021f1c997c9bcfbc2e49a GIT binary patch literal 17707 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 zya literal 0 HcmV?d00001 diff --git a/NativeTwitch/ContentView.swift b/NativeTwitch/ContentView.swift index 5ca99be..120f110 100755 --- a/NativeTwitch/ContentView.swift +++ b/NativeTwitch/ContentView.swift @@ -33,7 +33,6 @@ struct ContentView: View { .font(.title) .bold() .foregroundColor(.gray.opacity(0.5)) - } if (twitchData.status == .streamLoaded && twitchData.getStreamData().count == 0) { Text("All streams are offline :(") @@ -45,31 +44,21 @@ struct ContentView: View { VStack { ScrollView(.vertical, showsIndicators: false){ ForEach(twitchData.getStreamData(), id: \.self) { stream in - StreamRowView(stream: stream, const: Constants(twitchClientID: twitchClientID, oauthToken: oauthToken, streamlinkLocation: streamlinkLocation), stream_logo: URL(string: "https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_960_720.png")!) + StreamRowView(stream: stream, const: Constants(twitchClientID: twitchClientID, oauthToken: oauthToken, streamlinkLocation: streamlinkLocation)) .environmentObject(twitchData) .onTapGesture(count: 2, perform: { - let shell_out = shell("ttvQT () { open -a \"quicktime player\" $(\(streamlinkLocation) twitch.tv/$@ best --stream-url) ;}; ttvQT \(stream.user_name)") - if shell_out.isEmpty{ - twitchData.addToLogs(response: "\(streamlinkLocation):🎉 Success 🎉") - }else{ - twitchData.addToLogs(response: shell_out) - twitchData.addToLogs(response: "BIG FAIL 😩 @ \(streamlinkLocation)") - twitchData.addToLogs(response: shell("which streamlink")) - } + twitchData.watchStream(streamLinkLocation: streamlinkLocation, streamerUsername: stream.user_name) }) .contextMenu(ContextMenu(menuItems: { VStack { Button("Play"){ - let shell_out = shell("ttvQT () { open -a \"quicktime player\" $(\(streamlinkLocation) twitch.tv/$@ best --stream-url) ;}; ttvQT \(stream.user_name)") - if shell_out.isEmpty{ - twitchData.addToLogs(response: "\(streamlinkLocation):🎉 Success 🎉") - }else{ - twitchData.addToLogs(response: shell_out) - twitchData.addToLogs(response: "BIG FAIL 😩 @ \(streamlinkLocation)") - twitchData.addToLogs(response: shell("which streamlink")) + twitchData.watchStream(streamLinkLocation: streamlinkLocation, streamerUsername: stream.user_name) + } + if !twitchData.iinaEnabled{ + Button("Play using IINA"){ + twitchData.watchStream(streamLinkLocation: streamlinkLocation, streamerUsername: stream.user_name, customIINAEnabled: true) } } - Divider() Button("Open chat"){ NSWorkspace.shared.open(stream.getChatURL()) @@ -92,27 +81,3 @@ struct ContentView: View { } -extension ContentView{ - func shell(_ command: String) -> String { - let task = Process() - let pipe = Pipe() - task.standardOutput = pipe - task.standardError = pipe - task.arguments = ["-c", command] - task.launchPath = "/bin/zsh" - task.launch() - - let data = pipe.fileHandleForReading.readDataToEndOfFile() - let output = String(data: data, encoding: .utf8)! - - return output - } - -} - -extension NSTextField{ - open override var focusRingType: NSFocusRingType{ - get{.none} - set{} - } -} diff --git a/NativeTwitch/Extensions/Double+Extension.swift b/NativeTwitch/Extensions/Double+Extension.swift new file mode 100644 index 0000000..3d5bc7a --- /dev/null +++ b/NativeTwitch/Extensions/Double+Extension.swift @@ -0,0 +1,32 @@ +// +// Double+Extension.swift +// NativeTwitch +// +// Created by Aayush Pokharel on 2021-10-27. +// + +import Foundation + +extension Double { + var shortStringRepresentation: String { + if self.isNaN { + return "NaN" + } + if self.isInfinite { + return "\(self < 0.0 ? "-" : "+")Infinity" + } + let units = ["", "k", "M"] + var interval = self + var i = 0 + while i < units.count - 1 { + if abs(interval) < 1000.0 { + break + } + i += 1 + interval /= 1000.0 + } + // + 2 to have one digit after the comma, + 1 to not have any. + // Remove the * and the number of digits argument to display all the digits after the comma. + return "\(String(format: "%0.*g", Int(log10(abs(interval))) + 2, interval))\(units[i])" + } +} diff --git a/NativeTwitch/Extensions/NSTextField+Extension.swift b/NativeTwitch/Extensions/NSTextField+Extension.swift new file mode 100644 index 0000000..efb4130 --- /dev/null +++ b/NativeTwitch/Extensions/NSTextField+Extension.swift @@ -0,0 +1,15 @@ +// +// NSTextField+Extension.swift +// NativeTwitch +// +// Created by Aayush Pokharel on 2021-10-27. +// + +import SwiftUI + +extension NSTextField{ + open override var focusRingType: NSFocusRingType{ + get{.none} + set{} + } +} diff --git a/NativeTwitch/Model/Constants.swift b/NativeTwitch/Model/Constants.swift index 0d6521d..e5e023e 100755 --- a/NativeTwitch/Model/Constants.swift +++ b/NativeTwitch/Model/Constants.swift @@ -30,4 +30,7 @@ enum AppStorageStrings: String{ case oauthToken = "oauthToken" case streamlinkLocation = "streamlinkLocation" case showingInfo = "showingInfo" + case iinaLocation = "IINA location (optional)" + case iinaEnabled = "Enable IINA" + } diff --git a/NativeTwitch/NativeTwitchApp.swift b/NativeTwitch/NativeTwitchApp.swift index 6d8a859..eb755fd 100755 --- a/NativeTwitch/NativeTwitchApp.swift +++ b/NativeTwitch/NativeTwitchApp.swift @@ -18,9 +18,9 @@ struct NativeTwitchApp: App { WindowGroup { ContentView() .environmentObject(twitchData) - .frame(width: 300, height: 420) + .frame(width: 320, height: 420) } - .windowStyle(HiddenTitleBarWindowStyle()) + .windowStyle(.hiddenTitleBar) .commands { CommandMenu("Actions") { VStack{ @@ -44,34 +44,13 @@ struct NativeTwitchApp: App { } } Settings { - SettingsView(showingLogs: $showingLogs).background(VisualEffectView(material: NSVisualEffectView.Material.sidebar, blendingMode: NSVisualEffectView.BlendingMode.behindWindow)) + SettingsView(showingLogs: $showingLogs) .environmentObject(twitchData) - .frame(width: 300, height: showingLogs ? 500: 270) + .background(VisualEffectView(material: NSVisualEffectView.Material.sidebar, blendingMode: NSVisualEffectView.BlendingMode.behindWindow)) + .frame(width: 320, height: showingLogs ? 650: 400) .fixedSize() } } } - - -struct VisualEffectView: NSViewRepresentable -{ - let material: NSVisualEffectView.Material - let blendingMode: NSVisualEffectView.BlendingMode - - func makeNSView(context: Context) -> NSVisualEffectView - { - let visualEffectView = NSVisualEffectView() - visualEffectView.material = material - visualEffectView.blendingMode = blendingMode - visualEffectView.state = NSVisualEffectView.State.active - return visualEffectView - } - - func updateNSView(_ visualEffectView: NSVisualEffectView, context: Context) - { - visualEffectView.material = material - visualEffectView.blendingMode = blendingMode - } -} diff --git a/NativeTwitch/View Model/TwitchDataViewModel.swift b/NativeTwitch/View Model/TwitchDataViewModel.swift index 22c1f86..0dcb44a 100755 --- a/NativeTwitch/View Model/TwitchDataViewModel.swift +++ b/NativeTwitch/View Model/TwitchDataViewModel.swift @@ -21,7 +21,8 @@ class TwitchDataViewModel: ObservableObject{ @AppStorage(AppStorageStrings.clientID.rawValue) var twitchClientID = "" @AppStorage(AppStorageStrings.oauthToken.rawValue) var oauthToken = "" @AppStorage(AppStorageStrings.streamlinkLocation.rawValue) var streamlinkLocation = "" - + @AppStorage(AppStorageStrings.iinaEnabled.rawValue) var iinaEnabled = false + @Published var status: StatusStates var user: User @@ -155,4 +156,59 @@ class TwitchDataViewModel: ObservableObject{ return self.streams } + func watchStream(streamLinkLocation: String, streamerUsername: String, customIINAEnabled: Bool = false){ + if (iinaEnabled || customIINAEnabled){ + + // There is no output to validate (if it worked with quicktime and you have IINA installed it should work with IINA. + let _ = shell("ttvQT () { open -a iina $(\(streamlinkLocation) twitch.tv/$@ best --stream-url) ;}; ttvQT \(streamerUsername)") + addToLogs(response: "\(streamLinkLocation):🎉 Success 🎉") + return + }else{ + let shell_out = shell("ttvQT () { open -a \"quicktime player\" $(\(streamlinkLocation) twitch.tv/$@ best --stream-url) ;}; ttvQT \(streamerUsername)") + if shell_out.isEmpty{ addToLogs(response: "\(streamLinkLocation):🎉 Success 🎉"); return } else{ + addToLogs(response: shell_out); addToLogs(response: "BIG FAIL 😩 @ \(streamLinkLocation)") + } + } + addToLogs(response: shell("which streamlink")) + } + + + func copyLogsToClipboard(redacted: Bool = true){ + var logsText = "" + for log in logs { + logsText += log + logsText += "\n" + } + if redacted { + logsText = logsText.replacingOccurrences(of: user.client_id, with: "********CLIENTID*****") + logsText = logsText.replacingOccurrences(of: user.oauthToken, with: "********OAUTHTOKEN*****") + logsText = logsText.replacingOccurrences(of: user.name, with: "*******USERNAME********") + logsText = logsText.replacingOccurrences(of: user.user_id, with: "*******USER_ID********") + } + + let pasteBoard = NSPasteboard.general + pasteBoard.clearContents() + pasteBoard.setString(logsText, forType: .string) + + } +} + + +extension TwitchDataViewModel{ + private func copyToClipBoard(textToCopy: String) { + } + func shell(_ command: String) -> String { + let task = Process() + let pipe = Pipe() + task.standardOutput = pipe + task.standardError = pipe + task.arguments = ["-c", command] + task.launchPath = "/bin/zsh" + task.launch() + + let data = pipe.fileHandleForReading.readDataToEndOfFile() + let output = String(data: data, encoding: .utf8)! + + return output + } } diff --git a/NativeTwitch/View/SettingsView.swift b/NativeTwitch/View/SettingsView.swift index 4d13334..ce8e2c6 100755 --- a/NativeTwitch/View/SettingsView.swift +++ b/NativeTwitch/View/SettingsView.swift @@ -13,51 +13,63 @@ struct SettingsView: View { @AppStorage(AppStorageStrings.streamlinkLocation.rawValue) var streamlinkLocation = "" @EnvironmentObject var twitchData: TwitchDataViewModel - + @State var logs = [String]() @Binding var showingLogs: Bool var body: some View { VStack{ - VStack { - HStack{ - VStack(alignment: .leading){ - Text("\(twitchData.user.name)") - .font(.title) - .fontWeight(.bold) - .foregroundColor(.red) - .lineLimit(1) - } - Spacer() - }.padding() - VStack(spacing: 10){ - TextField("Your Twitch Client ID", text: $twitchClientID) - - Divider() - - TextField("Your Twitch Access Token", text: $oauthToken) - - Link( - destination: URL(string: "https://twitchtokengenerator.com/quick/NIaMdzGYBR")!, - label: { - Label("Generate Client ID and Access Token", systemImage: "network") + VStack { + HStack{ + VStack(alignment: .leading){ + Text("\(twitchData.user.name)") + .font(.title) + .fontWeight(.bold) + .foregroundColor(.red) + .lineLimit(1) } - ) - Divider() - - TextField("Stream link Location", text: $streamlinkLocation) + Spacer() + }.padding(.vertical) + VStack(spacing: 10){ + TextField("Your Twitch Client ID", text: $twitchClientID) + + TextField("Your Twitch Access Token", text: $oauthToken) + + Link( + destination: URL(string: "https://twitchtokengenerator.com/quick/NIaMdzGYBR")!, + label: { + Label("Generate Client ID and Access Token", systemImage: "network") + .padding(8) + .background(.ultraThinMaterial) + .cornerRadius(8) + } + ) + Divider() + + TextField("Stream link Location", text: $streamlinkLocation) + + }.padding([.bottom]) + .textFieldStyle(.roundedBorder) - }.padding([.horizontal, .bottom]) - .textFieldStyle(.roundedBorder) - - VStack{ - if oauthToken.count < 10{ - Text("Press Command + R to save") - .foregroundColor(.gray) + VStack{ + if oauthToken.count < 10{ + Text("Press Command + R to save") + .foregroundColor(.gray) + } } - }.padding(.horizontal) + + } + Divider() + VStack(alignment: .leading, spacing: 10) { + Toggle("Use IINA", isOn: $twitchData.iinaEnabled) + .font(.title3.bold()) + .toggleStyle(.switch) + .accentColor(.red) + Text("Quicktime is used by default but you can use IINA. Install it via brew for optimal results.") + .font(.caption) + .foregroundColor(.gray) + } - } Divider() VStack(alignment: .leading){ HStack{ @@ -65,40 +77,67 @@ struct SettingsView: View { .font(.title3.bold()) .padding(.top, 5) Spacer() - Image(systemName: showingLogs ? "chevron.up" : "chevron.down") - .font(.title3.bold()) - .foregroundColor(.blue) - .padding(5) - .background(Color.blue.opacity(0.25)) - .cornerRadius(5) - .padding(.trailing) + + NeatButton(title: "Copy", symbol: "paperclip") .onTapGesture { - withAnimation { - showingLogs.toggle() + twitchData.copyLogsToClipboard() + } + .contextMenu { + Button("Copy Raw"){ + twitchData.copyLogsToClipboard(redacted: false) + } + Button("Copy Redacted"){ + twitchData.copyLogsToClipboard(redacted: true) } } + NeatButton(title: showingLogs ? "Hide" : "Show", symbol: showingLogs ? "chevron.up" : "chevron.down") + .onTapGesture { + showingLogs.toggle() + } } Spacer() Group{ if showingLogs{ - ScrollView{ - VStack(alignment: .leading){ - - ForEach(twitchData.logs, id: \.self){log in - LogText(text: log, color: .gray) + ScrollView(.vertical, showsIndicators: false){ + VStack(alignment: .leading){ + + ForEach(twitchData.logs, id: \.self){log in + LogText(text: log, color: .gray) + } } } } - } } - }.padding(.horizontal) - } + } + }.padding(.horizontal) } } struct UserView_Previews: PreviewProvider { static var previews: some View { - SettingsView(showingLogs: .constant(true)) + SettingsView(showingLogs: .constant(false)) .environmentObject(TwitchDataViewModel()) + .frame(width: 300, height: 670) + + } +} + +struct NeatButton: View { + let title: String + let symbol: String + @State var isHoverd: Bool = false + var body: some View { + Group{ + Label(title, systemImage: symbol) + .buttonStyle(.borderless) + .padding(8) + .background(isHoverd ? .ultraThickMaterial : .ultraThinMaterial) + .cornerRadius(8) + .shadow(color: isHoverd ? .red.opacity(0.25) : .clear, radius: 2) + + } + .onHover { val in + isHoverd = val + } } } diff --git a/NativeTwitch/View/StreamRowView.swift b/NativeTwitch/View/StreamRowView.swift index 1cd09c3..51ce6c3 100755 --- a/NativeTwitch/View/StreamRowView.swift +++ b/NativeTwitch/View/StreamRowView.swift @@ -17,7 +17,7 @@ struct StreamRowView: View { @EnvironmentObject var twitchData: TwitchDataViewModel @State private var hovered = false - @State var stream_logo: URL + @State var stream_logo: URL? var body: some View { VStack{ @@ -25,7 +25,8 @@ struct StreamRowView: View { AsyncImage(url: stream_logo) { image in image.resizable() } placeholder: { - ProgressView() + Image("streamer-image-placeholder") + .resizable() } .frame(width: 45, height: 45) .clipShape(Circle()) .overlay( @@ -72,7 +73,7 @@ struct StreamRowView: View { .cornerRadius(10) .overlay(RoundedRectangle(cornerRadius: 10) .stroke(hovered ? Color.blue : .gray.opacity(0.25), lineWidth: 2) - .shadow(color: hovered ?.blue : .blue.opacity(0), radius: 10) + .shadow(color: hovered ?.blue : .clear, radius: 10) ) .onHover { isHovered in self.hovered = isHovered } .padding(.horizontal, 10) @@ -111,27 +112,3 @@ extension StreamRowView{ } - -extension Double { - var shortStringRepresentation: String { - if self.isNaN { - return "NaN" - } - if self.isInfinite { - return "\(self < 0.0 ? "-" : "+")Infinity" - } - let units = ["", "k", "M"] - var interval = self - var i = 0 - while i < units.count - 1 { - if abs(interval) < 1000.0 { - break - } - i += 1 - interval /= 1000.0 - } - // + 2 to have one digit after the comma, + 1 to not have any. - // Remove the * and the number of digits argument to display all the digits after the comma. - return "\(String(format: "%0.*g", Int(log10(abs(interval))) + 2, interval))\(units[i])" - } -} diff --git a/NativeTwitch/View/VisualEffectView.swift b/NativeTwitch/View/VisualEffectView.swift new file mode 100644 index 0000000..ad30eff --- /dev/null +++ b/NativeTwitch/View/VisualEffectView.swift @@ -0,0 +1,30 @@ +// +// VisualEffectView.swift +// NativeTwitch +// +// Created by Aayush Pokharel on 2021-10-27. +// + +import SwiftUI + + +struct VisualEffectView: NSViewRepresentable +{ + let material: NSVisualEffectView.Material + let blendingMode: NSVisualEffectView.BlendingMode + + func makeNSView(context: Context) -> NSVisualEffectView + { + let visualEffectView = NSVisualEffectView() + visualEffectView.material = material + visualEffectView.blendingMode = blendingMode + visualEffectView.state = NSVisualEffectView.State.active + return visualEffectView + } + + func updateNSView(_ visualEffectView: NSVisualEffectView, context: Context) + { + visualEffectView.material = material + visualEffectView.blendingMode = blendingMode + } +}