From af4ae64f6faf38f8179f2e07d3cd4ad60006be92 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 2 Nov 2020 15:43:44 +0100 Subject: [PATCH] Begin live tests --- scripts/ci.sh | 3 +- server/assets/default-audio-background.jpg | Bin 14048 -> 7987 bytes server/assets/default-live-background.jpg | Bin 93634 -> 40557 bytes server/controllers/activitypub/client.ts | 2 +- server/controllers/api/videos/index.ts | 2 +- server/controllers/api/videos/live.ts | 10 +- .../custom-validators/activitypub/videos.ts | 2 +- server/helpers/middlewares/videos.ts | 4 +- server/lib/activitypub/videos.ts | 36 +- .../validators/videos/video-live.ts | 10 +- server/models/video/video-format-utils.ts | 11 +- server/models/video/video-live.ts | 6 +- server/models/video/video.ts | 30 +- server/tests/api/live/index.ts | 1 + server/tests/api/live/live.ts | 351 ++++++++++++++++++ server/types/models/video/video.ts | 9 +- shared/extra-utils/server/servers.ts | 5 +- shared/extra-utils/videos/live.ts | 14 +- .../objects/video-torrent-object.ts | 2 + shared/models/users/user-right.enum.ts | 1 + shared/models/videos/video-create.model.ts | 4 +- 21 files changed, 472 insertions(+), 31 deletions(-) create mode 100644 server/tests/api/live/index.ts create mode 100644 server/tests/api/live/live.ts diff --git a/scripts/ci.sh b/scripts/ci.sh index 486666c6a..e29b07ad7 100755 --- a/scripts/ci.sh +++ b/scripts/ci.sh @@ -58,8 +58,9 @@ elif [ "$1" = "api-2" ]; then serverFiles=$(findTestFiles server/tests/api/server) usersFiles=$(findTestFiles server/tests/api/users) + liveFiles=$(findTestFiles server/tests/api/live) - MOCHA_PARALLEL=true runTest 2 $serverFiles $usersFiles + MOCHA_PARALLEL=true runTest 2 $serverFiles $usersFiles liveFiles elif [ "$1" = "api-3" ]; then npm run build:server diff --git a/server/assets/default-audio-background.jpg b/server/assets/default-audio-background.jpg index a19173eac561a1c9784c983106b95ecb109d3d3b..0aef989a737811169d6102f8fcf5e98d7778b246 100644 GIT binary patch delta 270 zcmaEmyV*|Y|Be3-7zDiBJlz-=85tND85lPT-Dj=;#~|Wdl$uzQnxasiS(2gP?&%xA z@c%YL3j+rm8#@~-2Rl1ECnpCNj|eXhH#d)@kTAc9tdzW*tdxw5f{LEHf|8E1jEsi4 zrjCK3iHV84x}~j!k&T|Qi4h|wCnpa#j|4BTgps0*q7hc0id7UU`2P@tAP0*Dd&A`a zj3t{NuyyfIZc~%qyk3lvWpkUF49nySGjqcO|8FsHFfuVR+B4L%|3AVYA_(*y3V^6! IhN`#;07$t!VgLXD delta 265 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

}v^sPZB{~ysmf3sQGRG;egab zeQ4@c*mtTS%|dJa6st64D8N^_LJpd4X_Bj{P@>8Mnc6EaFJLvwU+UsB?E5S4=ov;qw^39GL&0}x5{XuGAjt(?r)qf>v+^Bp{U4zWi|Ys z?IhL-GR1iTS~aq0b^Bp+u`jbCK|jeka_lHCim!Lmz;iXrA`go4@&jp}ysNCNZ2y8J zuBYfsL9uY(fNadpfum<@$6eZ@T$tf^`piB?Ce2s}kMGN>-hn{sK59O!p}RlT`~r$W zLgfM!i6f5+I)0!%WOc8-TnmQ}h^C+$8W@mHaRnM!ZxOt{f&%?rWzCO<^^6LHp_fgT z4$fqS;(;y!G54E>(mmk8!9fRARTJVJ*z_S?drYA_fCn!BRS8@8aOF7Dp?cwS@~A{% zv1zq0`Q3d{mbj$b-s|+E=dqp}4>c}sk9^)Zy?-cg6!p`;4YZVWX@nM+76%sti+Lec zH@B7e(}GyBZv=h@wAjW`&y?Gn8w!X80Ln7Hzp(p7_YprL3DAyXA=Bw;vSMF-m8IHY z<(r_dGk}V8&|v*wr0*5>tQJ(pe7T*`KIlLkQu)HkfqL0rYcA4p!Pf6x1cX^dFfj zD~EDOi|)GCHwfFZh_i3`B2Nf_c1a_LKv+yTgydUslqHovkx88!pIW!#s^+ixQd8~` z^l#3@*(V~|YnvKhk7$Lg7sO-J&}U+N zLn-$@QsVEJLp^?I`{D;8&|PONuK4Sh;qT0N3TFV;^CtHwn=w=EQ>C_Nf>V?uy_Kap zR^rOk?=b*}y_G*te*X8kO1$J3vdY1gKapJtlEW|5DGAqX$NLa*68nY~YO%2yL;@6+ zg_<w!ovCwNm9sK)P0ZDn7d22Z80C5kn!#P&(v%J*n_2+jUMy@uGWK!C`wosom$&gRBvFill zJBtpk>DonNjic|^0-ApJS_5DuOKr9OR`E4LV)795Dg9d9?)BV%C}XLXH>tFb>6MiE zXMfcm0=i9=izD*&dMGhZH|)q~*NbpvpS=h+?LL)XI8p`@(@3ZhKHZr=gZ{LJ6X=xW z0}c)fxpfNTh=JX6d7s`KYhPM_p_2G+{gtivzg9tF-$=IXtfi%e7R?eiTuNGk9jI!ofsV-_XrT__7}|4?d=UTJ&TNU+bX+?SPzmX#qV z2DXw*8J>9^ugJd&t)YMOzux}+a`=Y@vPeLp#*^iMrnnB!ptZ*Sph;|9J|@-UNkdME zvG$HN?$v5{3vII9iCgBS?1lB`q*hTH&Dq)$Y%;e>IPjv;KoN0x=&I`ah{P*;t8wdb-Ox0*OA8uiSf(y41Utpvgj^ ze05Hj#PMDBG8T10bkt@H5*%3lfnX_V#ZrcTcqx%xhINaTQjMl|2`Ge730X0;v;#RL z;v9$}<|B-Zq(hN_p|(GG$W24>(J4+oIlvwntD{a4;$~a*}?_3{HWi- zL2Hagl5ks1KPQ=Y{My`vHS7~g>s|i?Y-t??1lcUJM7m|R)$Lm-L?U^0yxhNX0ejYq z+L^IeC+iX}ubV5-k}&T&b35JBjPv8#7*YT9>I|;rZ?HhMfNSgGgKVs!)XI;HqB0cB zY3@EAZzH`Z?1^azsi$hm>4d!2l#f>!4OecADrW(t=}kW2(|&dr+LACp^Qgrh|2Pwb zLFC>0sDN^LKrB&OsfYlT@-a0678~%9j1|5B89s^x76+SoSDgn1KqU;?@#dRD|K^hE zm2clZ0(^aDznz5)s}}xzDEkj#EuEAuwv$}~yZqAZzp9&#GEE^hq^hScQ?`i_6XO1uV zhXUMWH7C8em;3oQ*Yv+PuWDen` z$dliDqRIHLqRit8{`6HIZ!ZmgeQj)c{^_wC<_K&l<#W*W25XPR6;zHM)r35OQ%mI@ zt)ioW`$%@84Lun>5YUJ>xvUIRa^xy~qzDHS<#K%&RYlrQJ73sS!@8U$GN%8^Mno z?{q$C`FMYgthmM)Zb_;|jywNzAY|Ff@_Bv^2UoEq2KVWFg(P!@DsDnG^Nee`i@HD0 z@Cwfvw#0fzLQzICk`1R|m~<2l!^UGM9D*Zscp#Os`cqlfX>#j=+WKWfBbe|7oIWU<#gA}7T6FP_{R)D=~p z#P8@|=T3#ZE;7AMx0da4pUQ^x{{ZcKGCX^{Z*aje1iiPvnNX^el#pm2hWDNk>>CNk zH<5J9wH5~`Tcj_YF$?EtvX=cciJ-80R4auwx-g=wRu*^sBe?T`P)>1rqLjYyp#0#p zzD*9H^o4ZEcV2-Rng}&z8;gKxP5X9WZ3JQUZ5}1d8YJUNMQ1rGIY-LbuSAJeEqyFm z{G*bdc9@VqAuW>d9wO0~s%`SVWxjJ5x$nl@xmNAu5T!7Nyad|zK&vr~q)#0B*I=mG zA2j>)8Ln`9omBMO#U-!z2kzrEU+&z3PpA>I1f-$gXP}7B%X(f+_k9nKGcl3M`8KOS zX)a}^RmGZ}=JLKBCrkwPPgc7ng`|j-1+c;HBW^e4F>|%6%b5~JB>%;W+gTq=QJ%y3lZ8isjThQ>V4-j%3r|g{ud8;zeT4m*Bhp@YH;}>7PuY7jN70s29Jk}3IP)Pk$>9XxM(bC`ySJpf4K+6(AW*eea29GVfbWItQ%e8-kM|yCHyst5C0Qp2& zTX6BB+Pm8RrFD)C(4dQLY84`X1N_Y+8UyYqj4dX5@9BhhqlZJ*!UJGw2(A*$O;y~` z>yA@txn~BI8H1L;g7Qrk5o4jRrOG7w3=b4;w11i4_z?w5%k7|`sQu-n*R_%zHg*?K z2Okqu!KqViYXRX==^^QBDuV`?yQ>2lmgB_|FZ}8SCtXdbnKBX&L>gzeEN_D9cf*NQ zRpw}$+HN&`^4N1FXKp1#2XVY}^Hk6nfp-jNpl-!D!rBZ}Ypqu(N=wA1k=&Y6Mv*}#ra zKiva{OOBb;4z(IeW!Dh!@M1X1T3{M;)(=Lpx&lrx^&3I=A6=*fM^*e!hD z-tmq$h{)v+VG5!E6(M+e(kDV=Nfl37TR-dTJ9;g4I`^x=BCdT zZppy@v}Y1v);YH{!G{H!{JA0+N^8ijo4--E=zd6#-Z!uJD6v2u{1OkzlCz7=I9BNu z_Y=tvs~<7QReJ{xS_ag!K-ShW=$pR;AhuNo%tJs$g$Se3ULFIz@dc698u&@<1SQK6 z*u|6ZmSCSOtItjs972|;yLwuz64AZ!-@;`;A9vEytMGMWNMF{sA)#@>K2JZZ2393# zNb{irg6?d)lX%-d(7p2)FPSOG>>3>fhXgw#73baDdFQ9_0>LAL5=czFQ z;R}eTMz#7-RsLZf>B3+m5h`;~^~tm+R43V-l8Zi>Plv-&>io^Ur-7Oq!99f^Q}VOa zEZtPz9h{spd9|ied~_sA9G)MMQ4@6I`ow&?Z*SoAd@nxin-DobM_4fz^xTuY2!Q}+C9zgHqdyY(nTGfSpyZ4~;4)Ah8^;0d zVujgI6PYC>9ZLcS#@jtxDbqDxAN3>~mX@(5Abp-J#1IrYZ?LpU|fYs z@1PmOyG0d;o!N$JpljU#Cqqut?GXQG#C2*g$pGJul|XOT$efUvnzMQ)!>(@w!>qLA zPE&k3pm_ydUbxF2-$kB$-vu~gHJKRmhPM+~9o9Hy=@J}TuJl9nT$Ru96}#`q(t$Hj z#lJcBht?`ssd)FW;4B{f#bmlRrryvdR9u~*E9)d<86`c3mQm2_^Eum2|EV8B^BvUt zM+CHv}FrIH`2KezBQ+zr%X zIEYWO$!bjIhj@lNK~IR6qkMwRI-&6=^#Y8E#LTKe{)h3WElfl}iQoan2`eps80#zd zvU{6x!a5`|9QY()3q-ge>DYmbVMH|sQfr>tntTth77Mr7l74m4Qik_$9)7(XRhueg zoHb?riw9qsssjfY*B;KlrGl_p1X`q(QU-$zXjn2CqQo0OsW-G#zh7G6iOz8gE(W~T zG|j3i7`-2F-GxBb!{gPIP%WSg+D07U6F3^eK+YJ#M(d4W+uZx1p8TcsS*RfCHYo*K z3*7dCdfNDg$8y*;kj!XAZ3bY1Vy96CQ9myak+TthUzhjXeW|xz#lOQW_|Zpj!CA(Q z*EDif`GUN`aw)KTW)k0^{98AiL~Dro{7*NckZI|c@VR+Sybms+z;O4cXAi|M1d-ml z@(Jyl1O&MVetTAC3!ws4+uQ`36_pyds7A?nT3OiR7d-Ccs#qz{4a+u;h+HQEhQ$|K zYw*3$%KOH>LDqCnqMYPD)aL9|#)4jn)?RDL8gsWWmVWxO4f))kLAJ%ld|1HI313h& z4QUq%@b11~0~)_19N5MOSG|;}F~=^()mrDyOWs2xe%PDskDUM*C?>xxajD0;@|$Lj zTsOT9PMm(y)U67S#6~Z@80BGqL&Bixs>O|w@HAGcK)9n# zRWy;H1=|C;f3)|#V3K;m-{TumV(k>&qC!M6ZBg7SU;t_N;IMHKgb^swzV#V zooZMo^!><|1Pxp*>ZFjsTNamMx^Nv zCUO8Y7p`e#@98ntB(>a0e_hX4atZI2I;mU z_CfiMTp_!_BZH|bgPaBE@<0BiLCNULDe|a7)Jd|12kQkVIHp)R@pfyN`5>zA){!

11Mp6wEaS-|ej5CqBIe`vz!nnptIL;bJB3zNqJegUQ=Dl%s)Zopq5GL&;8@ za#o$zYRwj71OTh8rxZ*H^&)28ZxCZW_B*-EZzt%M%I^(k;Nu4pR5vf}?_!zzWbx3Z z3es43Lh51i_F|@|b1dtmXAd?)SE^u>LNoT4>?SysNb|tk^jGBEHcqO4Ys+lbaeta_ zuXZ=Kew$QTC!Mi&I}mOU^Nf@xt}+|iAEu#BFlAeD#8fr>yj$}EYF%gGgxFsqa`JM6 zw{OEP)`>APb5)16&GOVc3>zi|7`8aIl-KOQDHGCoa+PjXt)ZpAc*0oqwsQX>jRU)D z3m>2O2*VB5%9EDvn6HGt&xpwtL_~cFz+^EnTH^Jlq^Aa#z8d~Mup|?ijbUfj#2P_| zXejC^BfHl45s}u5zE%lLNTwfQgHQhT=tp zVS;jrU~-b-l9#ev{m?Mqo#F}8MgG+I2PQ-AiZ-%`oI%^&*f#hscOE zXLbq2rsP2HNTpku(KJyL%td!2N;b2&? zJ!QL+-&UH9>avFGCu=E~J<(aoVF7y_<*yn!KL#%nk+-ki%bl&>MUO&frW!bXntyPb z+~qQ%a9}BhbEx8ayc?zJB=eBQ?ezQ-yT3!O%bOz3#TG=uvY zKCU_cu0$mH*?saUNC^+C7xa|Gft+)W8hhm&!q8YRlGPDPxYP2u%h617NfWf36u=JL zs7k8+Gk&2vvR02SqKtny$f7qt+>qHk&T zbBAeG89xwG`w$)lFpoi9X)q`?yaIj|6<5x7MHnDw;HElP%F~`!Mk4+P!Kn&bt_Q6B z^EJE#K|Ex?YK!t$103{6VGOi)WlJN;N6eJdZP2@^I{1OtIQC~`S)+&2-lW+AxQNKY zw4y9Y32iJMfnBQ??+v1fc8S&e-w}|z{OS9de17g}@J(b)je!MvuXA&t7YZVf}^vH`K2!Zh%EWzZ1k|DMDy0f6yPq` z*t7RVr|7wgBxZsTsET}D6b-FjJnT6IjY&!demd2QE8}-gmmz1FZgV%U;*;JfCrvHp z`*L|UkV^U#j@El0uqpduS`9>T{x24T6_&YRt`dli87>iToDGc*=H4NX3=P-)gwCP! z7Src*%|pY9arj*Uh1K9~+$aJCYu2g&%kJQmVSNd|?%v&!Ov)WBJe2(Mb1ya{0c zqh$`ZRjm>RPbTB9HCP!&<@hg*vyg@N?R0EHX1$GD%j#iBy2sgfN!39Inou7wsjR_- z>+h)h9jf{yq#|uxB2MQeRxT$QTm||x`lm&pjLGZ=Xw5)b-ZN1nT+UA=&(05J{7LGH ztB&so?rU#9sqwpT-?j#tAd;U&N1gTFi8qb@m~^}`baw%ugN(>IE2Xb8#Yc~Bm)KP4 zmpE_2SNA4Y0^{wQ&x@Iq6ADZzhdaY+%)*t0jH*8!)-HIfh2=WDc|sA$ftRy9lbrJo zTmgy)_0+(>3{x4X)!bSDJH@Ml&<eT9U?{1RBT+m7C z=XM~rdPo;dW$au%j?hBMTMFM0i25#tP-y8D^T6}#Um+Rk!Cu}EfYR*>u0ESO#@E@a zSOB_xNl?zIMWXURIX+R=?~V-TzP?(Bn)tj2mBG**ik5JWnf*R24GrE zW*q4)mD_^MzT0XjrxLv__I3 zF*J*zfEWO|1odVmtFkfJ6fP}i6_^BB0 z1xRfdjgc(Ex3_dZr@SquE!ldlt-~!>1n@0O_0Nhyfnm{J$wLX9YyCvs*%Htv1_k2) zyK3diqbfI_ZTfkvX&fguOssxzbFe0%D!8ZLQXj#74@wgJx~~!9)@=3Ba7}@Q5^(i2LvzESMe`W) zvCtCt2EcAaImZ+I%>$~ZgcjHn#3OuGJhz_(fE;PDX~UmWr_d6aS72C=A`5H7p&$x& zJONl<+H~(Hh1s+8C;YQ_4K6EMFQ13;C8s7&?53Zf znGnJ1b!+2s>)NIpF2Dm6n{r5vNc44$>hy1c34or(15OJs71y;<@pSjdmkJ6F3?fp- zsBiPoCo;o?z!OPT=@PwaYa+QA6gN7DWrL$tpF+g9#^fC2*cw~tL~Ifbc(xLUdF0Wo zMNcQ)v3#7fQQ=?IOXXqlj*A33#ejSaMR23YrdPF%+lAVI0RfC`>C&ypcb0-!e>OQ0 z$~7(jwNGw#@7UobIEcvu1>I5R4dw~m;UeU&&;-F@Xf;I>d+wUWYtV?SE!ItjHtr~V zW?pTSNjXnz@d>|Qt7mVm<`JBJfFbyq;u6$* zCJsMotKk?=B<;O-VEm};Q}k&LVq3UA2rIee6WjG3IV(c92045!OZomaFzB;0dtt$g z_Y)wgL5x!X!3=p0rmBiO&DSJ=mhmIAcs3L?gw^Glm#?%f*Q+%ak+gniQcs|m{<1^D zQ$4lxaUhVO?Id*zXH@z`HDCYnrNbN;&56AqM?TY&s;E2uysa@HA1KwefO##eJ)&&9Kn62N+YNl*p(+MZ*W*I;TJ8^9yC z0QQ6ZL4w8E7#;rNLGw=#uMHI0o&}i<>kp=f6p79V(F2^@a!ceZ-^n!65t3!p zZ6FtyAkAnK9=dN=!7L#yl0I~SNtx5&*(QxH*N>$E-2_V!=T>%mz#Hmu=0kwLhNpFLF~wVF zA76E5(cDsX`XZC&yJXjV#y4=+u)Wtuv=x@0?FzGzdr&o5y?E$&L#v{Z)=gD7zu#PC zeBBb$Nk>%f1iB|E*seDgnNr02>7)u{2kCBNjiVS;LcC0h!&d_sls&L3Y@Dwm55nhF z1MNYl!v(hMj4RLk^IBHJ`L$aw1%3LHH^B~rUr`cH8deU2QLlV6H^N2URNtBnEv-jc z@-L$7Ug8Wn$2k{5DnaAl?Q$oH{9jaq_WE4csEv?ptvIt3evW7=5YtLDNs)(ZI~TLwGahRB|IR zu|Jsp`y)9Lktj^`Ni~S6Y@(gB6a(N@L_ZCa!>hba#^IVOKo|hH9FhL4H9mVfj<1kuU|6#Q55Z@ueC%Hq2k0AOFq;-exA4rRcmVsN#?0-R8AYwjE=Zcnjrh#p3 zuz!rKV?Y-2?7yfAcm4;a^%)bNA7Y&tRM5Zdb_M0c>f;pikbedLm6~n1{Xa$j@45f) z0SE;pM^r$7@nAF)6ohM__BU=V9EQL7L=(|CS0B`^*}bDsnYTwGG99&0xrWeyw?`^y zSjdg8J7NhTqH2BWB-7JTMh@{;9#hYj43TqVk^S?j7 zG3aP^@9u*QzgMT-3n6y;%N=%}Dix|p&i1R6mc9x6@gyCCV?UWO%Yrjkp-;NhLOw)| z4r&XKDt(i>m8pYaSNxLf5y^v{1wKFDu7@XT^XVFT&hq_yBtB^qX!=1hWliz(mC*

>HfZ!|Yv+~-T%Lr1P^@77`B>0N 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 diff --git a/server/controllers/activitypub/client.ts b/server/controllers/activitypub/client.ts index 1da44d096..df2a01d2c 100644 --- a/server/controllers/activitypub/client.ts +++ b/server/controllers/activitypub/client.ts @@ -223,7 +223,7 @@ function getAccountVideoRateFactory (rateType: VideoRateType) { async function videoController (req: express.Request, res: express.Response) { // We need more attributes - const video = await VideoModel.loadForGetAPI({ id: res.locals.onlyVideoWithRights.id }) as MVideoAPWithoutCaption + const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(res.locals.onlyVideoWithRights.id) if (video.url.startsWith(WEBSERVER.URL) === false) return res.redirect(video.url) diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts index 6357062bc..50e769e77 100644 --- a/server/controllers/api/videos/index.ts +++ b/server/controllers/api/videos/index.ts @@ -189,7 +189,7 @@ async function addVideo (req: express.Request, res: express.Response) { videoData.state = CONFIG.TRANSCODING.ENABLED ? VideoState.TO_TRANSCODE : VideoState.PUBLISHED videoData.duration = videoPhysicalFile['duration'] // duration was added by a previous middleware - const video = new VideoModel(videoData) as MVideoDetails + const video = new VideoModel(videoData) as MVideoFullLight video.url = getVideoActivityPubUrl(video) // We use the UUID, so set the URL after building the object const videoFile = new VideoFileModel({ diff --git a/server/controllers/api/videos/live.ts b/server/controllers/api/videos/live.ts index be46fb1c6..f980c7730 100644 --- a/server/controllers/api/videos/live.ts +++ b/server/controllers/api/videos/live.ts @@ -4,6 +4,7 @@ import { createReqFiles } from '@server/helpers/express-utils' import { CONFIG } from '@server/initializers/config' import { ASSETS_PATH, MIMETYPES } from '@server/initializers/constants' import { getVideoActivityPubUrl } from '@server/lib/activitypub/url' +import { federateVideoIfNeeded } from '@server/lib/activitypub/videos' import { buildLocalVideoFromReq, buildVideoThumbnailsFromReq, setVideoTags } from '@server/lib/video' import { videoLiveAddValidator, videoLiveGetValidator, videoLiveUpdateValidator } from '@server/middlewares/validators/videos/video-live' import { VideoLiveModel } from '@server/models/video/video-live' @@ -63,10 +64,13 @@ async function getLiveVideo (req: express.Request, res: express.Response) { async function updateLiveVideo (req: express.Request, res: express.Response) { const body: LiveVideoUpdate = req.body + const video = res.locals.videoAll const videoLive = res.locals.videoLive videoLive.saveReplay = body.saveReplay || false - await videoLive.save() + video.VideoLive = await videoLive.save() + + await federateVideoIfNeeded(video, false) return res.sendStatus(204) } @@ -113,10 +117,12 @@ async function addLiveVideo (req: express.Request, res: express.Response) { videoCreated.VideoChannel = res.locals.videoChannel videoLive.videoId = videoCreated.id - await videoLive.save(sequelizeOptions) + videoCreated.VideoLive = await videoLive.save(sequelizeOptions) await setVideoTags({ video, tags: videoInfo.tags, transaction: t }) + await federateVideoIfNeeded(videoCreated, true, t) + logger.info('Video live %s with uuid %s created.', videoInfo.name, videoCreated.uuid) return { videoCreated } diff --git a/server/helpers/custom-validators/activitypub/videos.ts b/server/helpers/custom-validators/activitypub/videos.ts index 7ff551ecd..cb385b07d 100644 --- a/server/helpers/custom-validators/activitypub/videos.ts +++ b/server/helpers/custom-validators/activitypub/videos.ts @@ -63,6 +63,7 @@ function sanitizeAndCheckVideoTorrentObject (video: any) { if (!isBooleanValid(video.downloadEnabled)) video.downloadEnabled = true if (!isBooleanValid(video.commentsEnabled)) video.commentsEnabled = false if (!isBooleanValid(video.isLiveBroadcast)) video.isLiveBroadcast = false + if (!isBooleanValid(video.liveSaveReplay)) video.liveSaveReplay = false return isActivityPubUrlValid(video.id) && isVideoNameValid(video.name) && @@ -79,7 +80,6 @@ function sanitizeAndCheckVideoTorrentObject (video: any) { isDateValid(video.updated) && (!video.originallyPublishedAt || isDateValid(video.originallyPublishedAt)) && (!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) && - video.url.length !== 0 && video.attributedTo.length !== 0 } diff --git a/server/helpers/middlewares/videos.ts b/server/helpers/middlewares/videos.ts index 77a48a467..3904f762a 100644 --- a/server/helpers/middlewares/videos.ts +++ b/server/helpers/middlewares/videos.ts @@ -92,9 +92,9 @@ async function doesVideoChannelOfAccountExist (channelId: number, user: MUserAcc return true } -function checkUserCanManageVideo (user: MUser, video: MVideoAccountLight, right: UserRight, res: Response) { +function checkUserCanManageVideo (user: MUser, video: MVideoAccountLight, right: UserRight, res: Response, onlyOwned = true) { // Retrieve the user who did the request - if (video.isOwned() === false) { + if (onlyOwned && video.isOwned() === false) { res.status(403) .json({ error: 'Cannot manage a video of another server.' }) .end() diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index ab23ff507..ea1e6a38f 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts @@ -1,3 +1,4 @@ +import { VideoLiveModel } from '@server/models/video/video-live' import * as Bluebird from 'bluebird' import { maxBy, minBy } from 'lodash' import * as magnetUtil from 'magnet-uri' @@ -84,7 +85,7 @@ async function federateVideoIfNeeded (videoArg: MVideoAPWithoutCaption, isNewVid // Check this is not a blacklisted video, or unfederated blacklisted video (video.isBlacklisted() === false || (isNewVideo === false && video.VideoBlacklist.unfederated === false)) && // Check the video is public/unlisted and published - video.hasPrivacyForFederation() && video.state === VideoState.PUBLISHED + video.hasPrivacyForFederation() && (video.state === VideoState.PUBLISHED || video.state === VideoState.WAITING_FOR_LIVE) ) { // Fetch more attributes that we will need to serialize in AP object if (isArray(video.VideoCaptions) === false) { @@ -424,6 +425,27 @@ async function updateVideoFromAP (options: { await Promise.all(videoCaptionsPromises) } + { + // Create or update existing live + if (video.isLive) { + const [ videoLive ] = await VideoLiveModel.upsert({ + saveReplay: videoObject.liveSaveReplay, + videoId: video.id + }, { transaction: t, returning: true }) + + videoUpdated.VideoLive = videoLive + } else { // Delete existing live if it exists + await VideoLiveModel.destroy({ + where: { + videoId: video.id + }, + transaction: t + }) + + videoUpdated.VideoLive = null + } + } + return videoUpdated }) @@ -436,7 +458,7 @@ async function updateVideoFromAP (options: { }) if (wasPrivateVideo || wasUnlistedVideo) Notifier.Instance.notifyOnNewVideoIfNeeded(videoUpdated) // Notify our users? - if (videoUpdated.isLive) PeerTubeSocket.Instance.sendVideoLiveNewState(video) + if (videoUpdated.isLive) PeerTubeSocket.Instance.sendVideoLiveNewState(videoUpdated) logger.info('Remote video with uuid %s updated', videoObject.uuid) @@ -606,6 +628,16 @@ async function createVideo (videoObject: VideoObject, channel: MChannelAccountLi videoCreated.VideoFiles = videoFiles + if (videoCreated.isLive) { + const videoLive = new VideoLiveModel({ + streamKey: null, + saveReplay: videoObject.liveSaveReplay, + videoId: videoCreated.id + }) + + videoCreated.VideoLive = await videoLive.save({ transaction: t }) + } + const autoBlacklisted = await autoBlacklistVideoIfNeeded({ video: videoCreated, user: undefined, diff --git a/server/middlewares/validators/videos/video-live.ts b/server/middlewares/validators/videos/video-live.ts index 69200cb60..cbc48fe93 100644 --- a/server/middlewares/validators/videos/video-live.ts +++ b/server/middlewares/validators/videos/video-live.ts @@ -16,14 +16,14 @@ const videoLiveGetValidator = [ param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'), async (req: express.Request, res: express.Response, next: express.NextFunction) => { - logger.debug('Checking videoLiveGetValidator parameters', { parameters: req.body }) + logger.debug('Checking videoLiveGetValidator parameters', { parameters: req.params, user: res.locals.oauth.token.User.username }) if (areValidationErrors(req, res)) return if (!await doesVideoExist(req.params.videoId, res, 'all')) return - // Check if the user who did the request is able to update the video + // Check if the user who did the request is able to get the live info const user = res.locals.oauth.token.User - if (!checkUserCanManageVideo(user, res.locals.videoAll, UserRight.UPDATE_ANY_VIDEO, res)) return + if (!checkUserCanManageVideo(user, res.locals.videoAll, UserRight.GET_ANY_LIVE, res, false)) return const videoLive = await VideoLiveModel.loadByVideoId(res.locals.videoAll.id) if (!videoLive) return res.sendStatus(404) @@ -122,6 +122,10 @@ const videoLiveUpdateValidator = [ .json({ error: 'Cannot update a live that has already started' }) } + // Check the user can manage the live + const user = res.locals.oauth.token.User + if (!checkUserCanManageVideo(user, res.locals.videoAll, UserRight.GET_ANY_LIVE, res)) return + return next() } ] diff --git a/server/models/video/video-format-utils.ts b/server/models/video/video-format-utils.ts index 92bde7773..04e636a15 100644 --- a/server/models/video/video-format-utils.ts +++ b/server/models/video/video-format-utils.ts @@ -352,11 +352,20 @@ function videoModelToActivityPubObject (video: MVideoAP): VideoObject { sensitive: video.nsfw, waitTranscoding: video.waitTranscoding, isLiveBroadcast: video.isLive, + + liveSaveReplay: video.isLive + ? video.VideoLive.saveReplay + : null, + state: video.state, commentsEnabled: video.commentsEnabled, downloadEnabled: video.downloadEnabled, published: video.publishedAt.toISOString(), - originallyPublishedAt: video.originallyPublishedAt ? video.originallyPublishedAt.toISOString() : null, + + originallyPublishedAt: video.originallyPublishedAt + ? video.originallyPublishedAt.toISOString() + : null, + updated: video.updatedAt.toISOString(), mediaType: 'text/markdown', content: video.description, diff --git a/server/models/video/video-live.ts b/server/models/video/video-live.ts index 345918cb9..f3bff74ea 100644 --- a/server/models/video/video-live.ts +++ b/server/models/video/video-live.ts @@ -93,7 +93,11 @@ export class VideoLiveModel extends Model { toFormattedJSON (): LiveVideo { return { - rtmpUrl: WEBSERVER.RTMP_URL, + // If we don't have a stream key, it means this is a remote live so we don't specify the rtmp URL + rtmpUrl: this.streamKey + ? WEBSERVER.RTMP_URL + : null, + streamKey: this.streamKey, saveReplay: this.saveReplay } diff --git a/server/models/video/video.ts b/server/models/video/video.ts index d094f19b0..aba8c8cf4 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -26,6 +26,7 @@ import { } from 'sequelize-typescript' import { buildNSFWFilter } from '@server/helpers/express-utils' import { getPrivaciesForFederation, isPrivacyForFederation } from '@server/helpers/video' +import { LiveManager } from '@server/lib/live-manager' import { getHLSDirectory, getTorrentFileName, getTorrentFilePath, getVideoFilename, getVideoFilePath } from '@server/lib/video-paths' import { getServerActor } from '@server/models/application/application' import { ModelCache } from '@server/models/model-cache' @@ -121,14 +122,13 @@ import { videoModelToFormattedJSON } from './video-format-utils' import { VideoImportModel } from './video-import' +import { VideoLiveModel } from './video-live' import { VideoPlaylistElementModel } from './video-playlist-element' import { buildListQuery, BuildVideosQueryOptions, wrapForAPIResults } from './video-query-builder' import { VideoShareModel } from './video-share' import { VideoStreamingPlaylistModel } from './video-streaming-playlist' import { VideoTagModel } from './video-tag' import { VideoViewModel } from './video-view' -import { LiveManager } from '@server/lib/live-manager' -import { VideoLiveModel } from './video-live' export enum ScopeNames { AVAILABLE_FOR_LIST_IDS = 'AVAILABLE_FOR_LIST_IDS', @@ -142,7 +142,8 @@ export enum ScopeNames { WITH_STREAMING_PLAYLISTS = 'WITH_STREAMING_PLAYLISTS', WITH_USER_ID = 'WITH_USER_ID', WITH_IMMUTABLE_ATTRIBUTES = 'WITH_IMMUTABLE_ATTRIBUTES', - WITH_THUMBNAILS = 'WITH_THUMBNAILS' + WITH_THUMBNAILS = 'WITH_THUMBNAILS', + WITH_LIVE = 'WITH_LIVE' } export type ForAPIOptions = { @@ -245,6 +246,14 @@ export type AvailableForListIDsOptions = { } ] }, + [ScopeNames.WITH_LIVE]: { + include: [ + { + model: VideoLiveModel, + required: false + } + ] + }, [ScopeNames.WITH_USER_ID]: { include: [ { @@ -943,6 +952,17 @@ export class VideoModel extends Model { } ] }, + { + model: VideoStreamingPlaylistModel.unscoped(), + required: false, + include: [ + { + model: VideoFileModel, + required: false + } + ] + }, + VideoLiveModel, VideoFileModel, TagModel ] @@ -1330,7 +1350,8 @@ export class VideoModel extends Model { ScopeNames.WITH_SCHEDULED_UPDATE, ScopeNames.WITH_WEBTORRENT_FILES, ScopeNames.WITH_STREAMING_PLAYLISTS, - ScopeNames.WITH_THUMBNAILS + ScopeNames.WITH_THUMBNAILS, + ScopeNames.WITH_LIVE ] if (userId) { @@ -1362,6 +1383,7 @@ export class VideoModel extends Model { ScopeNames.WITH_ACCOUNT_DETAILS, ScopeNames.WITH_SCHEDULED_UPDATE, ScopeNames.WITH_THUMBNAILS, + ScopeNames.WITH_LIVE, { method: [ ScopeNames.WITH_WEBTORRENT_FILES, true ] }, { method: [ ScopeNames.WITH_STREAMING_PLAYLISTS, true ] } ] diff --git a/server/tests/api/live/index.ts b/server/tests/api/live/index.ts new file mode 100644 index 000000000..280daf423 --- /dev/null +++ b/server/tests/api/live/index.ts @@ -0,0 +1 @@ +export * from './live' diff --git a/server/tests/api/live/live.ts b/server/tests/api/live/live.ts new file mode 100644 index 000000000..e66c0cb26 --- /dev/null +++ b/server/tests/api/live/live.ts @@ -0,0 +1,351 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ + +import 'mocha' +import * as chai from 'chai' +import { LiveVideo, LiveVideoCreate, VideoDetails, VideoPrivacy } from '@shared/models' +import { + acceptChangeOwnership, + cleanupTests, + createLive, + doubleFollow, + flushAndRunMultipleServers, + getLive, + getVideo, + getVideosList, + makeRawRequest, + removeVideo, + ServerInfo, + setAccessTokensToServers, + setDefaultVideoChannel, + testImage, + updateCustomSubConfig, + updateLive, + waitJobs +} from '../../../../shared/extra-utils' + +const expect = chai.expect + +describe('Test live', function () { + let servers: ServerInfo[] = [] + let liveVideoUUID: string + + before(async function () { + this.timeout(120000) + + servers = await flushAndRunMultipleServers(2) + + // Get the access tokens + await setAccessTokensToServers(servers) + await setDefaultVideoChannel(servers) + + await updateCustomSubConfig(servers[0].url, servers[0].accessToken, { + live: { + enabled: true, + allowReplay: true + } + }) + + // Server 1 and server 2 follow each other + await doubleFollow(servers[0], servers[1]) + }) + + describe('Live creation, update and delete', function () { + + it('Should create a live with the appropriate parameters', async function () { + this.timeout(20000) + + const attributes: LiveVideoCreate = { + category: 1, + licence: 2, + language: 'fr', + description: 'super live description', + support: 'support field', + channelId: servers[0].videoChannel.id, + nsfw: false, + waitTranscoding: false, + name: 'my super live', + tags: [ 'tag1', 'tag2' ], + commentsEnabled: false, + downloadEnabled: false, + saveReplay: true, + privacy: VideoPrivacy.PUBLIC, + previewfile: 'video_short1-preview.webm.jpg', + thumbnailfile: 'video_short1.webm.jpg' + } + + const res = await createLive(servers[0].url, servers[0].accessToken, attributes) + liveVideoUUID = res.body.video.uuid + + await waitJobs(servers) + + for (const server of servers) { + const resVideo = await getVideo(server.url, liveVideoUUID) + const video: VideoDetails = resVideo.body + + expect(video.category.id).to.equal(1) + expect(video.licence.id).to.equal(2) + expect(video.language.id).to.equal('fr') + expect(video.description).to.equal('super live description') + expect(video.support).to.equal('support field') + + expect(video.channel.name).to.equal(servers[0].videoChannel.name) + expect(video.channel.host).to.equal(servers[0].videoChannel.host) + + expect(video.nsfw).to.be.false + expect(video.waitTranscoding).to.be.false + expect(video.name).to.equal('my super live') + expect(video.tags).to.deep.equal([ 'tag1', 'tag2' ]) + expect(video.commentsEnabled).to.be.false + expect(video.downloadEnabled).to.be.false + expect(video.privacy.id).to.equal(VideoPrivacy.PUBLIC) + + await testImage(server.url, 'video_short1-preview.webm', video.previewPath) + await testImage(server.url, 'video_short1.webm', video.thumbnailPath) + + const resLive = await getLive(server.url, server.accessToken, liveVideoUUID) + const live: LiveVideo = resLive.body + + if (server.url === servers[0].url) { + expect(live.rtmpUrl).to.equal('rtmp://' + server.hostname + ':1936/live') + expect(live.streamKey).to.not.be.empty + } else { + expect(live.rtmpUrl).to.be.null + expect(live.streamKey).to.be.null + } + + expect(live.saveReplay).to.be.true + } + }) + + it('Should have a default preview and thumbnail', async function () { + this.timeout(20000) + + const attributes: LiveVideoCreate = { + name: 'default live thumbnail', + channelId: servers[0].videoChannel.id, + privacy: VideoPrivacy.UNLISTED, + nsfw: true + } + + const res = await createLive(servers[0].url, servers[0].accessToken, attributes) + const videoId = res.body.video.uuid + + await waitJobs(servers) + + for (const server of servers) { + const resVideo = await getVideo(server.url, videoId) + const video: VideoDetails = resVideo.body + + expect(video.privacy.id).to.equal(VideoPrivacy.UNLISTED) + expect(video.nsfw).to.be.true + + await makeRawRequest(server.url + video.thumbnailPath, 200) + await makeRawRequest(server.url + video.previewPath, 200) + } + }) + + it('Should not have the live listed since nobody streams into', async function () { + for (const server of servers) { + const res = await getVideosList(server.url) + + expect(res.body.total).to.equal(0) + expect(res.body.data).to.have.lengthOf(0) + } + }) + + it('Should not be able to update a live of another server', async function () { + await updateLive(servers[1].url, servers[1].accessToken, liveVideoUUID, { saveReplay: false }, 403) + }) + + it('Should update the live', async function () { + this.timeout(10000) + + await updateLive(servers[0].url, servers[0].accessToken, liveVideoUUID, { saveReplay: false }) + await waitJobs(servers) + }) + + it('Have the live updated', async function () { + for (const server of servers) { + const res = await getLive(server.url, server.accessToken, liveVideoUUID) + const live: LiveVideo = res.body + + if (server.url === servers[0].url) { + expect(live.rtmpUrl).to.equal('rtmp://' + server.hostname + ':1936/live') + expect(live.streamKey).to.not.be.empty + } else { + expect(live.rtmpUrl).to.be.null + expect(live.streamKey).to.be.null + } + + expect(live.saveReplay).to.be.false + } + }) + + it('Delete the live', async function () { + this.timeout(10000) + + await removeVideo(servers[0].url, servers[0].accessToken, liveVideoUUID) + await waitJobs(servers) + }) + + it('Should have the live deleted', async function () { + for (const server of servers) { + await getVideo(server.url, liveVideoUUID, 404) + await getLive(server.url, server.accessToken, liveVideoUUID, 404) + } + }) + }) + + describe('Test live constraints', function () { + + it('Should not have size limit if save replay is disabled', async function () { + + }) + + it('Should have size limit if save replay is enabled', async function () { + // daily quota + total quota + + }) + + it('Should have max duration limit', async function () { + + }) + }) + + describe('With save replay disabled', function () { + + it('Should correctly create and federate the "waiting for stream" live', async function () { + + }) + + it('Should correctly have updated the live and federated it when streaming in the live', async function () { + + }) + + it('Should correctly delete the video and the live after the stream ended', async function () { + // Wait 10 seconds + // get video 404 + // get video federation 404 + + // check cleanup + }) + + it('Should correctly terminate the stream on blacklist and delete the live', async function () { + // Wait 10 seconds + // get video 404 + // get video federation 404 + + // check cleanup + }) + + it('Should correctly terminate the stream on delete and delete the video', async function () { + // Wait 10 seconds + // get video 404 + // get video federation 404 + + // check cleanup + }) + }) + + describe('With save replay enabled', function () { + + it('Should correctly create and federate the "waiting for stream" live', async function () { + + }) + + it('Should correctly have updated the live and federated it when streaming in the live', async function () { + + }) + + it('Should correctly have saved the live and federated it after the streaming', async function () { + + }) + + it('Should update the saved live and correctly federate the updated attributes', async function () { + + }) + + it('Should have cleaned up the live files', async function () { + + }) + + it('Should correctly terminate the stream on blacklist and blacklist the saved replay video', async function () { + // Wait 10 seconds + // get video -> blacklisted + // get video federation -> blacklisted + + // check cleanup live files quand meme + }) + + it('Should correctly terminate the stream on delete and delete the video', async function () { + // Wait 10 seconds + // get video 404 + // get video federation 404 + + // check cleanup + }) + }) + + describe('Stream checks', function () { + + it('Should not allow a stream without the appropriate path', async function () { + + }) + + it('Should not allow a stream without the appropriate stream key', async function () { + + }) + + it('Should not allow a stream on a live that was blacklisted', async function () { + + }) + + it('Should not allow a stream on a live that was deleted', async function () { + + }) + }) + + describe('Live transcoding', function () { + + it('Should enable transcoding without additional resolutions', async function () { + // enable + // stream + // wait federation + test + + }) + + it('Should enable transcoding with some resolutions', async function () { + // enable + // stream + // wait federation + test + }) + + it('Should enable transcoding with some resolutions and correctly save them', async function () { + // enable + // stream + // end stream + // wait federation + test + }) + + it('Should correctly have cleaned up the live files', async function () { + // check files + }) + }) + + describe('Live socket messages', function () { + + it('Should correctly send a message when the live starts', async function () { + // local + // federation + }) + + it('Should correctly send a message when the live ends', async function () { + // local + // federation + }) + }) + + after(async function () { + await cleanupTests(servers) + }) +}) diff --git a/server/types/models/video/video.ts b/server/types/models/video/video.ts index 3d8f85b3d..ae23cc30f 100644 --- a/server/types/models/video/video.ts +++ b/server/types/models/video/video.ts @@ -21,6 +21,7 @@ import { MThumbnail } from './thumbnail' import { MVideoBlacklist, MVideoBlacklistLight, MVideoBlacklistUnfederated } from './video-blacklist' import { MScheduleVideoUpdate } from './schedule-video-update' import { MUserVideoHistoryTime } from '../user/user-video-history' +import { MVideoLive } from './video-live' type Use = PickWith @@ -29,7 +30,7 @@ type Use = PickWith export type MVideo = Omit + 'ScheduleVideoUpdate' | 'VideoBlacklist' | 'VideoImport' | 'VideoCaptions' | 'VideoLive'> // ############################################################################ @@ -151,7 +152,8 @@ export type MVideoFullLight = Use<'UserVideoHistories', MUserVideoHistoryTime[]> & Use<'VideoFiles', MVideoFile[]> & Use<'ScheduleVideoUpdate', MScheduleVideoUpdate> & - Use<'VideoStreamingPlaylists', MStreamingPlaylistFiles[]> + Use<'VideoStreamingPlaylists', MStreamingPlaylistFiles[]> & + Use<'VideoLive', MVideoLive> // ############################################################################ @@ -165,7 +167,8 @@ export type MVideoAP = Use<'VideoCaptions', MVideoCaptionLanguageUrl[]> & Use<'VideoBlacklist', MVideoBlacklistUnfederated> & Use<'VideoFiles', MVideoFileRedundanciesOpt[]> & - Use<'Thumbnails', MThumbnail[]> + Use<'Thumbnails', MThumbnail[]> & + Use<'VideoLive', MVideoLive> export type MVideoAPWithoutCaption = Omit diff --git a/shared/extra-utils/server/servers.ts b/shared/extra-utils/server/servers.ts index 994aac628..b4bd55968 100644 --- a/shared/extra-utils/server/servers.ts +++ b/shared/extra-utils/server/servers.ts @@ -10,10 +10,12 @@ import { randomInt } from '../../core-utils/miscs/miscs' interface ServerInfo { app: ChildProcess + url: string host: string - + hostname: string port: number + parallel: boolean internalServerNumber: number serverNumber: number @@ -109,6 +111,7 @@ async function flushAndRunServer (serverNumber: number, configOverride?: Object, serverNumber, url: `http://localhost:${port}`, host: `localhost:${port}`, + hostname: 'localhost', client: { id: null, secret: null diff --git a/shared/extra-utils/videos/live.ts b/shared/extra-utils/videos/live.ts index f500fdc3e..65942db0a 100644 --- a/shared/extra-utils/videos/live.ts +++ b/shared/extra-utils/videos/live.ts @@ -2,8 +2,8 @@ import * as ffmpeg from 'fluent-ffmpeg' import { LiveVideoCreate, LiveVideoUpdate, VideoDetails, VideoState } from '@shared/models' import { buildAbsoluteFixturePath, wait } from '../miscs/miscs' import { makeGetRequest, makePutBodyRequest, makeUploadRequest } from '../requests/requests' -import { ServerInfo } from '../server/servers' -import { getVideo, getVideoWithToken } from './videos' +import { getVideoWithToken } from './videos' +import { omit } from 'lodash' function getLive (url: string, token: string, videoId: number | string, statusCodeExpected = 200) { const path = '/api/v1/videos/live' @@ -31,16 +31,18 @@ function updateLive (url: string, token: string, videoId: number | string, field function createLive (url: string, token: string, fields: LiveVideoCreate, statusCodeExpected = 200) { const path = '/api/v1/videos/live' - let attaches: any = {} - if (fields.thumbnailfile) attaches = { thumbnailfile: fields.thumbnailfile } - if (fields.previewfile) attaches = { previewfile: fields.previewfile } + const attaches: any = {} + if (fields.thumbnailfile) attaches.thumbnailfile = fields.thumbnailfile + if (fields.previewfile) attaches.previewfile = fields.previewfile + + const updatedFields = omit(fields, 'thumbnailfile', 'previewfile') return makeUploadRequest({ url, path, token, attaches, - fields, + fields: updatedFields, statusCodeExpected }) } diff --git a/shared/models/activitypub/objects/video-torrent-object.ts b/shared/models/activitypub/objects/video-torrent-object.ts index 5b035a371..d99d273c3 100644 --- a/shared/models/activitypub/objects/video-torrent-object.ts +++ b/shared/models/activitypub/objects/video-torrent-object.ts @@ -21,7 +21,9 @@ export interface VideoObject { views: number sensitive: boolean + isLiveBroadcast: boolean + liveSaveReplay: boolean commentsEnabled: boolean downloadEnabled: boolean diff --git a/shared/models/users/user-right.enum.ts b/shared/models/users/user-right.enum.ts index 4c3d9e7c8..e815fa893 100644 --- a/shared/models/users/user-right.enum.ts +++ b/shared/models/users/user-right.enum.ts @@ -30,6 +30,7 @@ export const enum UserRight { UPDATE_ANY_VIDEO, UPDATE_ANY_VIDEO_PLAYLIST, + GET_ANY_LIVE, SEE_ALL_VIDEOS, CHANGE_VIDEO_OWNERSHIP, diff --git a/shared/models/videos/video-create.model.ts b/shared/models/videos/video-create.model.ts index 175327afa..9e980529d 100644 --- a/shared/models/videos/video-create.model.ts +++ b/shared/models/videos/video-create.model.ts @@ -18,6 +18,6 @@ export interface VideoCreate { scheduleUpdate?: VideoScheduleUpdate originallyPublishedAt?: Date | string - thumbnailfile?: Blob - previewfile?: Blob + thumbnailfile?: Blob | string + previewfile?: Blob | string } -- 2.41.0