From 89725df3dc7e285adc5d3a80956f22265a858f6c Mon Sep 17 00:00:00 2001 From: Omar Roth Date: Wed, 5 Jun 2019 23:08:16 -0500 Subject: [PATCH] Update CHANGELOG and bump version --- CHANGELOG.md | 64 ++++++++++++++++++++++++++++ screenshots/native_notification.png | Bin 0 -> 22500 bytes shard.yml | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 screenshots/native_notification.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fcff74a..4804a3e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,67 @@ +# 0.18.0 (2019-06-06) + +# Version 0.18.0: Native Notifications and Optimizations + +Hope everyone has been doing well. This past month there have been [97 commits](https://github.com/omarroth/invidious/compare/0.17.0...0.18.0) from 10 contributors. For the most part changes this month have been on optimizing various parts of the site, mainly subscription feeds and support for serving images and other assets. + +I'm quite happy to mention that support for Greek (`el`) has been added, which I hope will continue to make the site accessible for more users. + +Subscription feeds will now only update when necessary, rather than periodically. This greatly lightens the load on DB as well as making the feeds generally more responsive when changing subscriptions, importing data, and when receiving new uploads. + +Caching for images and other assets should be greatly improved with [#456](https://github.com/omarroth/invidious/issues/456). JavaScript has been pulled out into separate files where possible to take advantage of this, which should result in lighter pages and faster load times. + +This past month several people have encountered issues with downloads and watching high quality video through the site, see [#532](https://github.com/omarroth/invidious/issues/532) and [#562](https://github.com/omarroth/invidious/issues/562). For this coming month I've allocated some more hardware which should help with this, and I'm also looking into optimizing how videos are currently served. + +## For Developers + +`viewCount` is now available for `/api/v1/popular` and all videos returned from `/api/v1/auth/notifications`. Both also now provide `"type"` for indicating available information for each object. + +An `/authorize_token` page is now available for more easily creating new tokens for use in applications, see [this comment](https://github.com/omarroth/invidious/issues/473#issuecomment-496230812) in [#473](https://github.com/omarroth/invidious/issues/473) for more details. + +A POST `/api/v1/auth/notifications` endpoint is also now available for correctly returning notifications for 150+ channels. + +## For Administrators + +There are two new schema changes for administrators: `views` for adding view count to the popular page, and `feed_needs_update` for tracking feed changes. + +As always the relevant migration scripts are provided which should run when following instructions for [updating](https://github.com/omarroth/invidious/wiki/Updating). Otherwise, adding `check_tables: true` to your config will automatically make the required changes. + +## Native Notifications + +[](https://omar.yt/81c3ae1839831bd9300d75e273b6552a86dc2352/native_notification.png "Example of native notification, available in repository under screnshots/native_notification.png") + +It is now possible to receive [Web notifications](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API) from subscribed channels. + +You can enable notifications by clicking "Enable web notifications" in your preferences. Generally they appear within 20-60 seconds of a new video being uploaded, and I've found them to be an enormous quality of life improvement. + +Although it has been fairly stable, please feel free to report any issues you find [here](https://github.com/omarroth/invidious/issues) or emailing me directly at omarroth@protonmail.com. + +Important to note for administrators is that instances require [`use_pubsub_feeds`](https://github.com/omarroth/invidious/wiki/Configuration) and must be served over HTTPS in order to correctly send web notifications. + +## Finances + +### Donations + +- [Patreon](https://www.patreon.com/omarroth) : \$49.73 +- [Liberapay](https://liberapay.com/omarroth) : \$100.57 +- Crypto : ~\$11.12 (converted from BCH, BTC) +- Total : \$161.42 + +### Expenses + +- invidious-load1 (nyc1) : \$10.00 (load balancer) +- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds) +- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server) +- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server) +- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server) +- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server) +- invidious-node5 (s-1vcpu-1gb) : \$5.00 (web server) +- invidious-node6 (s-1vcpu-1gb) : \$5.00 (web server) +- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database) +- Total : \$85.00 + +See you all next month! + # 0.17.0 (2019-05-06) # Version 0.17.0: Player and Authentication API diff --git a/screenshots/native_notification.png b/screenshots/native_notification.png new file mode 100644 index 0000000000000000000000000000000000000000..be246d1dcb7f7e4766f4ead74e9e661de0c01e83 GIT binary patch literal 22500 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
KM8#f$?Ck9SO`ZDJ;ln8C=j$6C z9i5h%dhGad{Jrqr(AP>7b4LKr zHB76!cki-T+ue~bql{DH+`pYj6xE>b|;T=17x~Y8b`~{smb^PeVF(Kgi zkYFS_b?i8I{(Lu!Q(`cLslVb%l_*eL!J=28R;`+)y9&isQR;kHsbFC|P%tF-?cV+8 zZ@=x_wyi<^`ry+=ix<04tJCQ&Ub@tvL4!4`S06fX0I$8nhYpP&I~GM2FI@`qrOQs3 zI1wz|yH~FxhYtO|VZ(ua`=(8uiYI8&C!Zjn7Ar0R?%uL#6aIGZ*m3Ik@x==l!i-41 zdw1&RpF0%67Zo0p?K>WXG&mf^3*hggM61z`4$(9_2w`_RJac z=FC~NWXY^KbKN;#7)gT%4SuA8#TqV~lnkDTSBDO5 z+O#Ps=C8m0qB7xzx_13~WMm}B7cX5Zb3ng-coP?DG^>94sW|;k^KtjKY2AAMoH;lO zR&{7zhxYA}zoi(n7w>fdjyJSZ&1K013-|2PclDYzty{PH^pi>WGW+ZBk^Tdphi&du zEr=L*b?JzB&%V9*3OW4u-$*!BUNqA?MC_D>aV9YA@nV1()v9HSU_ggXoxrNJ80ZyeLGMxtd>tZ@lbcKJp0hjFTeoblF+(}vFRRs!DYNfSQazi0R4 zPd|Nm&>+0k=FXm#o0s>;pBsx-L0vdt>yCv1-?zixorF8k3D*V^v}e3%EzF!U`H0~~ zn)KdceyVJc3Rz2Z0*Zt0U*i z)vJAa_eSE<<;%Bk-$nwaE_KL3p5CQQB6y9d9Li`74tD%-M3)^h@1>;R)eGLIi@TWs zkwKC+v8ht{as*>s{^uXCheIQ8+_-_+9$*eT6mhe<62&@q>co_Rfr#Doj0ba5(1&0_ zVgr5QGuIs=2EWl|sl<+5J3+y04yRJ3$R6%7-eV7jgSs;A;xTJbzX5t+j~+eRty|aN zprB+AKeWrzfD&;H;QNkQk(+6mOg83&57w+*10sf7(B56(W>FSmB+xqtX@6fI z80lc))btE=*11!jA`5h>y+7td^lGmEWo>Avt;dhv;EupwkM7;jq`C9wz52!*3++@@ z7M7uvdzzqVv}h@>a5U87tN;CX-z(i!KyiwNw`|=?wXiH)jJF*S#_JgyGYA2iHTJ2; z5eq@pf-ekont`=zy7aN)R)%vKMVdEnP8Af}yZan`2-G1|iUbaMO2lW+p2e6nygVW+ zRiac;zZSC@Z+G-P!V3YjlzH=P-m(QUc&QkSwtkoL-cnLhQAK2gtplIA(JTy$ih7qY zkGhlY(y22we-I2%cjO`C_|4*GF*n8h{Cs^>s>GxunN)^*s3N~Z(_l#2Vb4fZDzL_V()0bIz>U4lK;9F+4nc?(8|edi2<{ zZyz(iBGVvTr+;2-LzBkOUA%M|3O&6F4lE2hhG~q<(zOjQc*>Ko_i?mAk?S{XfX>3g zLP|5P%dQ4K-sWh z6B;hciA3)fO`y*P1#tyG{p1t+D7X)EV)|zKM$zH<#fAqQ8ys|a!!M-Q)Z3@T~bpl(iHUh=*BI)h#$5JZH9 z_$b}=^c_EOeA?$CTTTi3 z6i%H!Lv>xce-)gvFr~08T#T_BH*enj>F1w6ojjRtUh`(n(0zxVM)wCyB_$<|e(yb) zy|ZV|WPUH=X8v~GJj8mUUykmY!zb)lUw(-&WYkD|lj+(W5+E!p7!EcH228;iM9>A^ z84hCfE{1#HWw7tSfyo*TI%K`*_C5i4{pc+4qV7%U93!s`cy z2=zvxWr|AxQrZ_$x)(_~5-}Qg{=#_#B#ay};{N?~_zJ4W+WKlMW^2~08B94Q5#w(D zWa6ZvyoNxN7R{TvXcg!c=Yn5&ifwO9+dI<$cLloXupyHw3tleHQg)%d=pkHw*eu_C z^%V}GA6zPx7L_TQgLg$r+WnOK8NmVm)uN+>u-Vz{-2D86qhICzZ>>Hx-5hn4(iP-D3OP?l{fPeGbMGL>4J{`MmUIiB{OzA8O7mph| zwr9_t`}glhrwiP*O`0@m)v_f#t z2-<>y+_QUka4~QIW5Q$LR41K@2My83^lpg>nAqr)gX;rhM&K02J&(aD7>`#@5yZ^) zoH})S_}e48ckA}K{T)Lc!b9!A!syS$xw|><8p6~tc`;NaCMUVsJI8Di(l#PKb^7$~ z-Mc4$_8DGlUre7q=%tqc2ciye|1sYf4kfXR-cS4?f$%lFoE-uu5IIo4UOja0zzMr^ z*Dl-vEn5`(hAgVQj5z}b40z+sH+%Q$O$Sck!?37M^avwV{>LAFD0+y_K|BqZ7laF{ zg=+$)v7L>rRNyd7VDK-P+I?G?CK1GG77d)h-H%R;MhzRH$2KD)vsSH|bW2<$;%_Bb ztd@E;9veiLd@l_wtdQBL9KR7^!O5vU+sc7o> z_;~mG)-YCW^r(?g#pGg~CwdPMQhws($-{pi!2|_G<8SD8cs)_AYE^X3{%`7(@4x$w zM%|VPTln1Nt5h56*Q&15>0PwP>7l<4|21{m7l^?? z%(d%YAg9I4DU)_h(0p3zid|tu zFs5$E;KA-!M2$9XQw~wRXhW06jp3h#mjEvb_$6S+P*$D$&GS@}VqrvZ;d7HRn<$G4 zSK00se&CVF%Y$z(A6FAZjIG34K(dHe+q2i!aqWJ*nuA&!5#yU3e@LKKdX^2mIUPh@ z?>gmTxGawyJGN!pR?P4Ma&fJ}>qjSyA3yrtci$d462m%ZyO^#8_c2%)?q5tdL1(&| zu(>37JiI^g@}lV2{!T4Tx42Ul0IOnrGh82dla<&cghn7n4YsfY3!|V|D1=9%VVwsy zb-ub#BodaW&_Mv6;+ZqP#tCAyD@MLL9DP!|W#?aJ%bi{YJe+s#B;rE5a}}7{DjIPK)53wq(&F40L|} zr57={qix%^ls65N{=gyi^P06~ob(5uEjpc<8p?r30+y`PW|Wxezyjzch>yR4p&a;_ zD9WuxwcXFm^!M>``VAEx8hktPZe;iaA2B=?l_SH7Y9Kj4!0A;84D=5PaqB8nB!=j7 zLj(neN+C@3_19jbtHv0%egg->KEPBD@E{`}mfc$;M!={?WI9ulF5)zSF&D6fXU(1s zg8<{uqz?x@I~6WVW}jZYK*YcQ@duRj>C>kys!A+-?RuOo>{_eEpnM16P8~bo!vfD8 zoWfvX%$^9x6un{276dC3^Zjs=^~- za53&AbdUb==bs->oJhqB!(Kq|9Q?wrJrX5WWOrEz;64Tm<4S;$ODs~H0FwpK=9)FD zJ2*p%D~SC3g2KuX&gm8I;OI)>@C(Bu0b3X>?52a5S>2TXP5yYoB+50x%zsj8+9~1n z29)J0c)c+W3J1OXG9D-nmx~YigoFefMF-5BS+j7r(2}=q--bDiU5vG(hd>K#`e6yN ziy0RI7sP=6{V=}-5~u|aEZ#A2D&nID!NLFy{EJh@1{0X3V5*I~0rQrE ze3=by+otWo{cV{!o~FI%M)0C4r)N>>tKd|d7c)g-G3HT&Ld1Z=Q;(1OE}c8uZikFebclRSXMha|1?IAP*U3r+H1sypU_m9Z40sZ@e##55OEHI^8< zS7O855nyXH&aaR=g^3J7fFM8+_?IB?`IpmLw`|p-MN7&HieFg1Xd6YrNP}vzfr7EY zfkWBC@JL|b23~29r|27>0^nl!`jCKi{O6`WN51Vin}pX-*#pbV>va=_1Ob8oLBLxG z$fZ*F9x)LLSQQ(-RYAevUu?_-xEMM3r7}Ud@STE%v7rbGf`91^lice(8Qxv$b0I`r zYUoHof&f9_Uxa|l*Ec0K1vAIeG)gCE@&yHhaPbSy#V<2K`HPW*Qt*?&C`KuaT~gX7 z^DOW4Bt%@^2owDT0fIn9ARrM-^-_IOa*`J-gGKD;R}mdugowR()rcyB072l1A#gt< zvq__dFloKmg7C2LQ}*G7UexJS6(M4$u#ilG072j>Lm(n7^viE%QgbwWtLd2N?#