Compare commits

...

1741 commits

Author SHA1 Message Date
Skid 0a43de655a Fix typo at log.rotation.enabled 2024-05-15 16:16:25 +02:00
Skid c22fc9f859 Fix typo at log.rotation.enabled 2024-05-15 16:16:25 +02:00
Chocobozzz 32b0206cd3
Fix typo 2024-05-15 16:14:53 +02:00
Chocobozzz 0c0cc9cab7
Update security.md 2024-05-15 16:00:28 +02:00
Chocobozzz b6dd016601
Fix too many useless angular detection changes 2024-05-15 15:38:50 +02:00
kontrollanten 2177995056 feat(server): dont client cache HTML files
Tell the clients to not cache the HTML response.

closes #6393
2024-05-13 11:17:50 +02:00
Chocobozzz 46b45dc51d
Bumped to version v6.1.0 2024-04-29 09:36:33 +02:00
Chocobozzz 9436a18e95
Update changelog 2024-04-29 09:02:35 +02:00
Chocobozzz 8d22b9100b
Fix import tests 2024-04-29 08:01:57 +02:00
Chocobozzz 1642c5b9e7
Protect all video related AP endpoints 2024-04-26 15:29:52 +02:00
Chocobozzz d72ef2a2b9
Fix federation when updating video privacy 2024-04-26 10:30:43 +02:00
Chocobozzz afb28272f5
Check video rights before providing AP information 2024-04-26 10:09:38 +02:00
Chocobozzz b8635c2606
Compact json-ld AP objects 2024-04-25 11:21:55 +02:00
Chocobozzz 712f7d18e6
Update superagent
To fix vulnerability of formidable
2024-04-25 11:01:10 +02:00
Chocobozzz 47ae6e880d
Fix AP actor follows count 2024-04-25 10:53:53 +02:00
Chocobozzz 9244620f37
Fix view explanation 2024-04-25 09:33:05 +02:00
Chocobozzz 4e09837aa0
Fix player subtitles on iOS 2024-04-24 15:57:24 +02:00
Chocobozzz fde6b32ca5
Update translations 2024-04-24 14:57:00 +02:00
spf 63654cb475
Translated using Weblate (French (France) (fr_FR))
Currently translated at 93.7% (2218 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-04-24 14:52:22 +02:00
Puryx dcd3a0ee46
Translated using Weblate (Romanian)
Currently translated at 19.1% (262 of 1367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ro/
2024-04-24 14:52:22 +02:00
Puryx db32f70799
Translated using Weblate (Romanian)
Currently translated at 18.8% (258 of 1367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ro/
2024-04-24 14:52:22 +02:00
Chocobozzz f2895d29e1
Remove duplicate main region 2024-04-23 10:56:11 +02:00
Chocobozzz b824480af7
Fix video source size column on db migration 2024-04-22 14:41:46 +02:00
Chocobozzz aa1ea0b6c8
Fix notification link on mobile 2024-04-22 14:36:00 +02:00
Chocobozzz bce0f2f11b
Fix total video file size 2024-04-22 11:48:05 +02:00
Chocobozzz da949376db
Update translations 2024-04-22 11:28:20 +02:00
chocobozzz d43dc97767
Translated using Weblate (French (France) (fr_FR))
Currently translated at 91.6% (2169 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-04-22 11:11:35 +02:00
Hồ Nhất Duy 92c1ecabf9
Translated using Weblate (Vietnamese)
Currently translated at 99.3% (2352 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2024-04-22 04:00:23 +02:00
Mürteza MERT da89fb73b2
Translated using Weblate (Turkish)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-04-17 12:28:11 +02:00
Mürteza MERT 6631facaf6
Translated using Weblate (Turkish)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-04-17 12:17:07 +02:00
Mürteza MERT 07226826ba
Translated using Weblate (Turkish)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-04-17 12:14:50 +02:00
Jeff Huang d1647652b9
Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-04-17 12:14:17 +02:00
Mürteza MERT 12d7fdb2f4
Translated using Weblate (Turkish)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-04-17 12:14:17 +02:00
Quentin PAGÈS f75dbd5e73
Translated using Weblate (Occitan)
Currently translated at 100.0% (144 of 144 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/oc/
2024-04-16 18:47:43 +02:00
Quentin PAGÈS dbcee9acd9
Translated using Weblate (Occitan)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/oc/
2024-04-16 18:47:43 +02:00
Quentin PAGÈS a50c542363
Translated using Weblate (Occitan)
Currently translated at 34.0% (805 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/oc/
2024-04-16 14:52:00 +02:00
Aitor Salaberria 6dc2cf0d42
Translated using Weblate (Basque)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-04-16 14:52:00 +02:00
Chocobozzz 8e30e1f5fd
Bumped to version v6.1.0-rc.1 2024-04-16 14:42:41 +02:00
Chocobozzz 4f12515cc7
Update changelog 2024-04-16 14:42:22 +02:00
Chocobozzz 91139b634d
Prevent layout shift with installed plugins 2024-04-16 10:15:19 +02:00
Chocobozzz df7008ddad
Remove unused property 2024-04-16 10:12:19 +02:00
Chocobozzz ddfed6aedf
Fix top menu dropdowns 2024-04-16 09:48:18 +02:00
Chocobozzz 43373e777b
Fix peertube-x svg size 2024-04-16 09:42:39 +02:00
Chocobozzz 1208269dcb
Fix nodejs install URLs 2024-04-16 09:39:49 +02:00
Chocobozzz 8cb1a8f9ff
Update translations 2024-04-15 11:44:06 +02:00
Aitor Salaberria 409ad373ac
Translated using Weblate (Basque)
Currently translated at 98.6% (2336 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-04-15 11:41:23 +02:00
Mürteza MERT 382d760bd8
Translated using Weblate (Turkish)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-04-15 11:41:23 +02:00
Kerim Demirkaynak ca7a869105
Translated using Weblate (Turkish)
Currently translated at 100.0% (144 of 144 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/tr/
2024-04-15 11:41:23 +02:00
Kerim Demirkaynak 54c0c411f1
Translated using Weblate (Turkish)
Currently translated at 100.0% (264 of 264 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/tr/
2024-04-15 11:41:23 +02:00
Kerim Demirkaynak 8e87c84f7a
Translated using Weblate (Turkish)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-04-15 11:41:23 +02:00
Ettore Atalan c783356a69
Translated using Weblate (German)
Currently translated at 97.9% (2319 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2024-04-15 11:41:23 +02:00
Milo Ivir 3fcd0b4153
Translated using Weblate (Croatian)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-04-15 11:41:23 +02:00
Luca Calcaterra 0add86337b
Translated using Weblate (Italian)
Currently translated at 99.7% (2360 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-04-15 11:41:23 +02:00
Александр 1e6edcf060
Translated using Weblate (Russian)
Currently translated at 99.8% (2363 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-04-15 11:41:23 +02:00
Chocobozzz 4c5d6306b2
Remove debug log 2024-04-15 11:41:14 +02:00
Chocobozzz 965c592e89
Fix "display all" value in videos filters 2024-04-15 11:39:33 +02:00
Chocobozzz db05e6cebb
Fix schedule update date format 2024-04-15 11:11:16 +02:00
Chocobozzz c67dfb979b
Support itunes:owner in podcast feed 2024-04-11 09:32:57 +02:00
Chocobozzz f2b4f409a3
Fix setting video subtitle in URL 2024-04-11 08:39:11 +02:00
Chocobozzz 6f3deaee2e
Fix import tests 2024-04-11 08:13:35 +02:00
Chocobozzz 2ccd64b03b
Update changelog 2024-04-11 07:27:14 +02:00
Chocobozzz b2dada8974
Update player embed api package version 2024-04-05 14:17:24 +02:00
Chocobozzz b89f37a751
Add inspect node option to benchmark script
So we can easily profile the backend
2024-04-05 10:18:45 +02:00
Chocobozzz b0ebb77197
Add view sessionId doc 2024-04-05 09:33:57 +02:00
Chocobozzz 7163a1a044
Fix self link in atom feed 2024-04-05 08:50:38 +02:00
Chocobozzz f84ac3ba41
Fix local video creator crash 2024-04-05 08:29:23 +02:00
Chocobozzz abc6c2b7f4
Merge branch 'release/6.0.0' into develop 2024-04-05 08:28:39 +02:00
Chocobozzz 47731d85c4
Typo 2024-04-05 08:20:15 +02:00
Chocobozzz f84243fc53
Ensure to release with appropriate node modules 2024-04-04 16:45:05 +02:00
Chocobozzz 3bfecf4890
Update runner version 2024-04-04 16:33:06 +02:00
Chocobozzz 93b09bf891
Fix stuck runner 2024-04-04 16:31:01 +02:00
Chocobozzz d1e634acff
Bumped to version v6.0.4 2024-04-04 16:29:46 +02:00
Chocobozzz 67ae543604
Update changelog 2024-04-04 16:29:46 +02:00
Chocobozzz 7402e6947b
Remove unused highlight pipe 2024-04-04 16:29:44 +02:00
Chocobozzz 08cce23535
Prefer innerText instead of innerHTML
The previous implementation can lead to XSS injection
2024-04-04 16:28:22 +02:00
Chocobozzz 5cb3e6a0b8
Use sessionId instead of IP to identify viewer
Breaking: YAML config `ip_view_expiration` is renamed `view_expiration`
Breaking: Views are taken into account after 10 seconds instead of 30
seconds (can be changed in YAML config)

Purpose of this commit is to get closer to other video platforms where
some platforms count views on play (mux, vimeo) or others use a very low
delay (instagram, tiktok)

We also want to improve the viewer identification, where we no longer
use the IP but the `sessionId` generated by the web browser. Multiple
viewers behind a NAT can now be able to be identified as independent
viewers (this method is also used by vimeo or mux)
2024-04-04 16:27:40 +02:00
Chocobozzz db69b78f1b
Bumped to version v6.0.4 2024-04-04 14:35:00 +02:00
Chocobozzz ff5a32ff3e
Update changelog 2024-04-04 14:15:11 +02:00
Chocobozzz 1c33c6a388
Remove unused highlight pipe 2024-04-04 14:12:44 +02:00
Chocobozzz a93217d2da
Prefer innerText instead of innerHTML
The previous implementation can lead to XSS injection
2024-04-04 13:59:15 +02:00
kontrollanten 6f6abcabfb
feat(plugins): add peertubeHelpers.loadByIdOrUUIDWithFiles (#6302) 2024-04-04 08:20:09 +02:00
kontrollanten cd42491cf0
feat: add support for sub routes under /my-account (#6218)
* feat: add support for sub routes under /my-account

closes #6217

* feat(plugins/client-routes): page titles

Add support for adding custom page titles in client routes.

* fix(client/PluginPages): reload component upon URL change

* Styling

* docs(plugins): update registerClientRoute

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2024-04-04 08:17:59 +02:00
Chocobozzz 9f92c8c426
Update translations 2024-04-03 16:40:54 +02:00
Chocobozzz 4b18b0880d
Fix tests 2024-04-03 16:40:43 +02:00
h3n3 77d4aa19d2 Translated using Weblate (Dutch)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:27 +02:00
Ewout van Mansom 4e86c38bc9 Translated using Weblate (Dutch)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:27 +02:00
T.S d627ccf2d1 Translated using Weblate (Japanese)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2024-04-03 16:16:27 +02:00
Casper Ruttten 57610f306c Translated using Weblate (Dutch)
Currently translated at 99.7% (2361 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Casper Ruttten dca3fc6e47 Translated using Weblate (Dutch)
Currently translated at 93.6% (2217 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ettore Atalan bb04450ab7 Translated using Weblate (German)
Currently translated at 97.6% (2312 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2024-04-03 16:16:26 +02:00
Ewout van Mansom e888a248e3 Translated using Weblate (Dutch)
Currently translated at 92.6% (2194 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom 635d8b49b4 Translated using Weblate (Dutch)
Currently translated at 92.6% (2193 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom f30fce8d02 Translated using Weblate (Dutch)
Currently translated at 92.0% (2179 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
josé m 7eb8f2b102 Translated using Weblate (Galician)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-04-03 16:16:26 +02:00
josé m 44600a6be0 Translated using Weblate (Galician)
Currently translated at 99.8% (2363 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom e90d140bba Translated using Weblate (Dutch)
Currently translated at 92.0% (2178 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom 7cf7836738 Translated using Weblate (Dutch)
Currently translated at 91.9% (2177 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom 87e950a91d Translated using Weblate (Dutch)
Currently translated at 91.8% (2175 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom 8d33f30051 Translated using Weblate (Dutch)
Currently translated at 91.8% (2174 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom ea4009bbc5 Translated using Weblate (Dutch)
Currently translated at 90.6% (2145 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom 3a4e05648f Translated using Weblate (Dutch)
Currently translated at 89.0% (2107 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Ewout van Mansom a88433cdf0 Translated using Weblate (Dutch)
Currently translated at 88.7% (2100 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-04-03 16:16:26 +02:00
Jeff Huang c1501620c4 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-04-03 16:16:26 +02:00
Mürteza MERT e953f78bac Translated using Weblate (Turkish)
Currently translated at 100.0% (2367 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-04-03 16:16:26 +02:00
GunChleoc 68ee493c08 Translated using Weblate (Gaelic)
Currently translated at 91.8% (2174 of 2367 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2024-04-03 16:16:26 +02:00
Chocobozzz 7816fa4d48
Fix lint 2024-04-03 16:16:06 +02:00
Chocobozzz e43326ed5b
Support "Spanish (Latin America)" metadata lang 2024-04-03 15:20:18 +02:00
Chocobozzz f8b8dc674e
Fix views crash on geoip update failure 2024-04-03 15:11:10 +02:00
Chocobozzz 61fec4e4ef
Better seconds to time formatting 2024-04-03 14:50:30 +02:00
Chocobozzz 9b70c8e7e8
Do not take into account empty view sections 2024-04-03 14:25:21 +02:00
Chocobozzz faabe996ba
Update runner version 2024-04-03 14:25:14 +02:00
Chocobozzz 17fb4fd6d0
Update runner version 2024-04-03 09:17:58 +02:00
Chocobozzz 0794fe2ac1
Fix runner ffmpeg logger 2024-04-03 09:17:45 +02:00
kontrollanten 1b323f4f65 feat(plugins): add req.rawBody for routes
Stripe webhooks endpoints requires to read the raw request body.
https://docs.stripe.com/webhooks#verify-webhook-signatures-with-official-libraries
2024-04-02 11:06:34 +02:00
Chocobozzz 107e6e73a6
Fix import tests 2024-04-02 11:05:00 +02:00
Chocobozzz 1d52f1f138
Add ffmpeg static build warning 2024-04-02 11:00:53 +02:00
Chocobozzz 121efedde2
Update peertube-runner version 2024-03-29 15:04:44 +01:00
Chocobozzz 33607e3268
Add ping debug in peertube-runner 2024-03-29 15:04:03 +01:00
Chocobozzz 7eb0189b73
Fix config test with parallel tests 2024-03-28 10:03:47 +01:00
Chocobozzz 81963e0c6e
Simplify config test 2024-03-28 09:20:23 +01:00
Chocobozzz 817f754c22
Remove difficult to maintain config update method 2024-03-28 09:10:36 +01:00
Chocobozzz 5ef0430dfb
Display playlists if allowed to escape federation 2024-03-27 15:48:29 +01:00
Chocobozzz 3f8454ce63
Fix creating remote tracker URLs on video creation 2024-03-27 15:26:15 +01:00
Chocobozzz 11521f231f
Generate small versions of banners too 2024-03-27 15:08:09 +01:00
kontrollanten aaa5acbb0c feat(plugins): add filter:api.user.me.get.result
relates to #6219
2024-03-27 13:32:53 +01:00
John Livingston bfa7e364bf Missing video privacy value 2024-03-27 11:03:22 +01:00
Chocobozzz ca889dbbb8
Ensure time to int returns an integer 2024-03-27 09:04:34 +01:00
Chocobozzz 4a35e6587a
Fix lint 2024-03-26 17:43:03 +01:00
kontrollanten 26de1467e2
fix(server/video-view): log invalid currentTime req (#6288)
* fix(server/video-view): log invalid currentTime req

relates to #6285

* Styling

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2024-03-26 17:08:15 +01:00
Chocobozzz 855def80f6
Update translations 2024-03-26 15:31:29 +01:00
Chocobozzz 51656abe54
Merge remote-tracking branch 'weblate/develop' into develop 2024-03-26 15:25:55 +01:00
chocobozzz a9cb4bcd41 Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 15:25:50 +01:00
chocobozzz 08a8114c9b Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 15:16:42 +01:00
chocobozzz 5ec9a64806 Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 15:10:59 +01:00
chocobozzz 8b3df5acd7 Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:59:41 +01:00
Chocobozzz a246c44504
Support tr locale 2024-03-26 14:25:12 +01:00
Mürteza MERT 320327eb47 Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Ewout van Mansom f956500d92 Translated using Weblate (Dutch)
Currently translated at 89.1% (2099 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-03-26 14:14:29 +01:00
Kerim Demirkaynak 959ebe88db Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 65f600c776 Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 70dde4daa5 Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 2fa474450d Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 357d502d53 Translated using Weblate (Turkish)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Andrea Monaco f6def3b17b Translated using Weblate (Italian)
Currently translated at 99.9% (2352 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-26 14:14:29 +01:00
Ewout van Mansom 87ec87d9d0 Translated using Weblate (Dutch)
Currently translated at 88.7% (2088 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-03-26 14:14:29 +01:00
Mürteza MERT 5610fae234 Translated using Weblate (Turkish)
Currently translated at 75.4% (1775 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT c501556d1c Translated using Weblate (Turkish)
Currently translated at 73.6% (1733 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 635c2ecad9 Translated using Weblate (Turkish)
Currently translated at 72.4% (1705 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 6e11da1c89 Translated using Weblate (Turkish)
Currently translated at 69.4% (1636 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 497773c78d Translated using Weblate (Turkish)
Currently translated at 68.2% (1607 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
yns bag f47a6bfda1 Translated using Weblate (Turkish)
Currently translated at 62.7% (1477 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK 21f30dfd41 Translated using Weblate (Turkish)
Currently translated at 62.7% (1477 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 60d8e54d11 Translated using Weblate (Turkish)
Currently translated at 62.4% (1469 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
yns bag ff7d7d635b Translated using Weblate (Turkish)
Currently translated at 62.4% (1469 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK a113c2e0ab Translated using Weblate (Turkish)
Currently translated at 62.4% (1469 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK b95450c417 Translated using Weblate (Turkish)
Currently translated at 59.4% (1400 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK 98ea109807 Translated using Weblate (Turkish)
Currently translated at 59.4% (1399 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK 677944c5cf Translated using Weblate (Turkish)
Currently translated at 59.3% (1397 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 86ea646e85 Translated using Weblate (Turkish)
Currently translated at 59.3% (1396 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK 2f7884bd89 Translated using Weblate (Turkish)
Currently translated at 59.3% (1396 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
yns bag d7046c50dd Translated using Weblate (Turkish)
Currently translated at 59.3% (1396 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT 756b77d8b8 Translated using Weblate (Turkish)
Currently translated at 58.9% (1387 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK a8053326a2 Translated using Weblate (Turkish)
Currently translated at 58.9% (1387 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
yns bag f3d07f3f8a Translated using Weblate (Turkish)
Currently translated at 58.9% (1387 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
yns bag 2b87e1325a Translated using Weblate (Turkish)
Currently translated at 55.9% (1318 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
Mürteza MERT f5e197d23f Translated using Weblate (Turkish)
Currently translated at 55.9% (1318 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK bd59a169ee Translated using Weblate (Turkish)
Currently translated at 55.9% (1318 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:29 +01:00
YILDIRIM YAPRAK 942846c46b Translated using Weblate (Turkish)
Currently translated at 46.3% (1092 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:28 +01:00
Ihor Hordiichuk fcd8ffd6fe Translated using Weblate (Ukrainian)
Currently translated at 92.5% (2178 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2024-03-26 14:14:28 +01:00
YILDIRIM YAPRAK 44e82d7072 Translated using Weblate (Turkish)
Currently translated at 46.0% (1083 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:28 +01:00
Mürteza MERT c639af5fb3 Translated using Weblate (Turkish)
Currently translated at 46.0% (1083 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:28 +01:00
yns bag 05b39efaf7 Translated using Weblate (Turkish)
Currently translated at 46.0% (1083 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:28 +01:00
josé m 8a76018392 Translated using Weblate (Galician)
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-03-26 14:14:28 +01:00
Ahmed ABERWAG 46ef110507 Translated using Weblate (French)
Currently translated at 100.0% (1706 of 1706 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr/
2024-03-26 14:14:28 +01:00
Renne Rocha 9f41897455 Translated using Weblate (Portuguese (Brazil))
Currently translated at 84.0% (1979 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2024-03-26 14:14:28 +01:00
Jeff Huang f457a21191 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2354 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-03-26 14:14:28 +01:00
YILDIRIM YAPRAK 74cfc88759 Translated using Weblate (Turkish)
Currently translated at 34.4% (811 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-26 14:14:28 +01:00
0que 3fd62fdec5 Translated using Weblate (Russian)
Currently translated at 99.2% (2336 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-03-26 14:14:28 +01:00
chocobozzz 6d32ad4d03 Translated using Weblate (French (France) (fr_FR))
Currently translated at 91.7% (2160 of 2354 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-03-26 14:14:28 +01:00
Chocobozzz a159b8b517
Add ability to list and delete original file
In admin
2024-03-26 14:10:02 +01:00
Chocobozzz 058ef6912c
Remove deprecated transcoding type 2024-03-25 15:17:02 +01:00
Chocobozzz 5b8da4e051
Method typo 2024-03-25 15:14:56 +01:00
Chocobozzz d4a09f9ce2
Improve runner jobs UX
Use badges with same colors for type/runner
Adds processed/finished information
2024-03-25 12:05:15 +01:00
Chocobozzz be19d9be34
Move email templates in assets directory 2024-03-20 09:15:07 +01:00
Chocobozzz b4169fe0a4
Use button for abuse message icon 2024-03-20 09:07:28 +01:00
Chocobozzz 0c0ea5dbf7
Improve state button UI 2024-03-20 08:55:53 +01:00
Chocobozzz 33101bc5b3
Optimize abuse SQL query 2024-03-20 08:34:14 +01:00
Chocobozzz 8da3e2e9b8
Reduce precision for retention time 2024-03-19 15:58:55 +01:00
Chocobozzz 85cc3b2af6
Fix button styling 2024-03-19 15:52:40 +01:00
Chocobozzz da63a030f3
Also add "allow-forms" to oembed 2024-03-19 15:29:32 +01:00
Chocobozzz 78e4cc30c5
Add allow-forms to video/playlist embed
We need it when the video is password protected
2024-03-19 15:27:59 +01:00
Chocobozzz 302fd93c49
Disable http metrics by default
Can lead to performance issues on prometheus side and peertube side if
many different URLs have been called on peertube side (google indexation
for example)
2024-03-19 14:52:41 +01:00
Chocobozzz 41fd9435a6
Remove log 2024-03-19 11:32:31 +01:00
Chocobozzz 55e3de1cdd
Font size consistency 2024-03-19 11:31:23 +01:00
Chocobozzz 167d36df63
Fix playlist start time of element 1 2024-03-19 11:29:04 +01:00
Chocobozzz 128748e6e4
Update peertube-runner version 2024-03-19 09:59:47 +01:00
Chocobozzz c09e27d77a
Optimize transcoding profile building 2024-03-19 09:53:59 +01:00
Chocobozzz 4e98d843da
Success on update "not in processing state" error
Or the job is never "ended"
2024-03-19 09:26:40 +01:00
Chocobozzz 0e718cb7b2
Fix cancel on stall error message 2024-03-19 08:39:41 +01:00
Chocobozzz 0301d77254
Don't cancel finished jobs 2024-03-19 08:39:23 +01:00
Chocobozzz c727a34cb6
Prevent aborting another live session 2024-03-18 16:09:22 +01:00
Chocobozzz 3b429f2104
Fix lint 2024-03-18 11:36:43 +01:00
Chocobozzz e6dc5318ca
Update translations 2024-03-18 11:32:30 +01:00
Luca Calcaterra ae8a0de711 Translated using Weblate (Italian)
Currently translated at 100.0% (2350 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Kempelen 4aec2ccab1 Translated using Weblate (Hungarian)
Currently translated at 100.0% (144 of 144 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/hu/
2024-03-18 11:29:57 +01:00
Kempelen ac2386d1a2 Translated using Weblate (Hungarian)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hu/
2024-03-18 11:29:57 +01:00
Kempelen 92c1dc5700 Translated using Weblate (Hungarian)
Currently translated at 96.0% (2258 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-03-18 11:29:57 +01:00
Kempelen a6712fce06 Translated using Weblate (Hungarian)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hu/
2024-03-18 11:29:57 +01:00
Vodoyo Kamal 41af8c9944 Translated using Weblate (Bengali)
Currently translated at 8.8% (154 of 1748 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/bn/
2024-03-18 11:29:57 +01:00
Luca Calcaterra cb00c76f18 Translated using Weblate (Italian)
Currently translated at 84.5% (1988 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra be2b0b622a Translated using Weblate (Italian)
Currently translated at 78.2% (1839 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 442d71b8c7 Translated using Weblate (Italian)
Currently translated at 78.2% (1839 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 713076c46d Translated using Weblate (Italian)
Currently translated at 78.2% (1839 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 060397dd2d Translated using Weblate (Italian)
Currently translated at 78.2% (1838 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 305070fbab Translated using Weblate (Italian)
Currently translated at 78.1% (1837 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra b0eaa8250e Translated using Weblate (Italian)
Currently translated at 78.0% (1834 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 4e5786ce91 Translated using Weblate (Italian)
Currently translated at 75.8% (1783 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 9fdde1ab0a Translated using Weblate (Italian)
Currently translated at 75.6% (1778 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
josé m c1747f901a Translated using Weblate (Galician)
Currently translated at 99.3% (143 of 144 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/gl/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 135b8555f1 Translated using Weblate (Italian)
Currently translated at 75.5% (1776 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 89183676c5 Translated using Weblate (Italian)
Currently translated at 75.3% (1770 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 83c272f333 Translated using Weblate (Italian)
Currently translated at 75.2% (1769 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra e04de60d94 Translated using Weblate (Italian)
Currently translated at 74.7% (1756 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Vodoyo Kamal 60fbf50b24 Translated using Weblate (Bengali)
Currently translated at 8.2% (144 of 1748 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/bn/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 4844d22f50 Translated using Weblate (Italian)
Currently translated at 73.5% (1729 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
Luca Calcaterra 6ac028e36a Translated using Weblate (Italian)
Currently translated at 73.5% (1729 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-18 11:29:57 +01:00
chocobozzz d9e96c2c62 Translated using Weblate (French (France) (fr_FR))
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/fr_FR/
2024-03-18 11:29:57 +01:00
Hồ Nhất Duy 18519e2bb3 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2350 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2024-03-18 11:29:57 +01:00
Jeff Huang f68d7f8a9b Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2350 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-03-18 11:29:57 +01:00
Milo Ivir 5cc827c79f Translated using Weblate (Croatian)
Currently translated at 100.0% (2350 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-18 11:29:57 +01:00
alex gabilondo 16084d12df Translated using Weblate (Basque)
Currently translated at 100.0% (144 of 144 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/eu/
2024-03-18 11:29:57 +01:00
Kerim Demirkaynak 766c25c1f8 Translated using Weblate (Turkish)
Currently translated at 34.4% (809 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2024-03-18 11:29:57 +01:00
josé m 6b51caecf2 Translated using Weblate (Galician)
Currently translated at 100.0% (2350 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-03-18 11:29:57 +01:00
Hồ Nhất Duy 5bfaf6b9c4 Translated using Weblate (Vietnamese)
Currently translated at 94.8% (2230 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2024-03-18 11:29:56 +01:00
T.S cd186a862b Translated using Weblate (Japanese)
Currently translated at 100.0% (2350 of 2350 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2024-03-18 11:29:56 +01:00
Chocobozzz 0cda8c70d1
Remove debug 2024-03-18 11:29:46 +01:00
Chocobozzz 0f7224b0d1
Fix changing channel/account 2024-03-18 11:28:43 +01:00
Chocobozzz 798d8d37ee
Use more specific name 2024-03-18 11:28:43 +01:00
Chocobozzz 1a8b20ba30
Less verbose on expected error 2024-03-18 11:28:43 +01:00
Chocobozzz c10c3c5e79
Add finish sign language 2024-03-18 11:28:43 +01:00
soonsouth 01af40a55f chore: fix some comments
Signed-off-by: soonsouth <cuibuwei@163.com>
2024-03-18 08:12:12 +01:00
Chocobozzz 1048d1054b
Fix dev:client command 2024-03-15 16:49:55 +01:00
chagai95 e57c3024f4
Add config option to keep original video file (basic first version) (#6157)
* testing not removing old file and adding columb to db

* implement feature

* remove unnecessary config changes

* use only keptOriginalFileName, change keptOriginalFileName to keptOriginalFilename for consistency with with videoFile table, slight refactor with basename()

* save original video files to dedicated directory original-video-files

* begin implementing object storage (bucket) support

---------

Co-authored-by: chagai.friedlander <chagai.friedlander@fairkom.eu>
Co-authored-by: Ian <ian.kraft@hotmail.com>
Co-authored-by: Chocobozzz <me@florianbigard.com>
2024-03-15 15:47:18 +01:00
kontrollanten ae31e90c30 feat(server): log rate limit exceeded 2024-03-15 14:56:46 +01:00
Chocobozzz 486b4a329f
Optimize config endpoint 2024-03-12 16:00:51 +01:00
Chocobozzz 0f67adf98a
Fix live state on user archive import 2024-03-12 11:11:53 +01:00
Chocobozzz 46950fbcc8
Fix encoder after transcoding profile deletion 2024-03-12 10:44:20 +01:00
Chocobozzz fb50a233f4
Add error info in payload on parent failure 2024-03-12 09:35:14 +01:00
Chocobozzz 52b6d97250
Fix upload transaction retry 2024-03-12 09:10:42 +01:00
Chocobozzz 3eba4fca2a
Only display availability hint in watch page 2024-03-12 08:48:37 +01:00
Chocobozzz 4e29a6f7ba
Improve storyboard grid algorithm
Try to reduce missing sprites at the end of the video
2024-03-12 06:29:56 +01:00
Chocobozzz 888b142e2e
Fix storyboard generation with some videos
Where `t` variable is never an integer due to our setpts formula
2024-03-11 15:40:14 +01:00
Chocobozzz 23aafafd1e
Add docker upgrade steps for nginx config 2024-03-11 11:43:49 +01:00
Chocobozzz 6250e4ab1d
Improve production guide 2024-03-11 11:27:33 +01:00
Chocobozzz cb77bfcd0f
Use ng-select for jobs list 2024-03-11 11:19:51 +01:00
kontrollanten 29873257e7 fix(server): cleanup db connections upon exit 2024-03-11 08:00:53 +01:00
Chocobozzz 4596ec2a9f
Add ability to sort videos by file size 2024-03-08 15:15:03 +01:00
Chocobozzz b080ccc3ee
Always be able to set email as verified
Useful for instance that do not require email verification but still
want to enable the "email in podcast feed" feature
2024-03-08 14:02:27 +01:00
Chocobozzz 3a53d44246
Update translations 2024-03-08 11:28:22 +01:00
T.S 752190f253 Translated using Weblate (Japanese)
Currently translated at 98.5% (2313 of 2347 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2024-03-08 11:24:27 +01:00
Александр 3a4d09a150 Translated using Weblate (Russian)
Currently translated at 99.9% (2346 of 2347 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-03-08 11:24:27 +01:00
Jeff Huang 2d20781966 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2347 of 2347 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-03-08 11:24:27 +01:00
Luca Calcaterra 5c447283a5 Translated using Weblate (Italian)
Currently translated at 73.9% (1735 of 2347 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-08 11:24:27 +01:00
Chocobozzz 7e573616d9
Clearer public email if email is not verified 2024-03-08 11:22:23 +01:00
Chocobozzz 10e78bb778
Remove twitter whitelisted option
It doesn't seem to be required
2024-03-08 10:54:29 +01:00
Chocobozzz 54a7183b11
Check available jobs on reconnection 2024-03-08 10:29:41 +01:00
Chocobozzz 36710e5c24
Update translation guide 2024-03-08 10:07:29 +01:00
Chocobozzz eb2ee34c57
Fix menu router link active 2024-03-08 09:53:42 +01:00
Chocobozzz e8955ac8ca
Fix text overflow 2024-03-08 09:39:44 +01:00
Chocobozzz 371f08cbaf
More visible registration request message 2024-03-07 08:57:58 +01:00
Chocobozzz 29fc2db3a2
Fix E2E tests 2024-03-06 14:32:28 +01:00
Chocobozzz 2fc3b90cb7
Fix local E2E tests 2024-03-06 10:36:40 +01:00
Chocobozzz 15b8f96b75
Add icon to owners/moderators only options 2024-03-06 10:35:20 +01:00
Chocobozzz 0fe016f0ea
Update code contributors 2024-03-05 15:40:09 +01:00
Chocobozzz f4e79548f3
Update translations 2024-03-05 15:38:46 +01:00
Chocobozzz a2052bf074
Merge remote-tracking branch 'weblate/develop' into develop 2024-03-05 15:37:12 +01:00
Luca Calcaterra 18b86fad00 Translated using Weblate (Italian)
Currently translated at 70.7% (1655 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-03-05 15:37:06 +01:00
Chocobozzz f326b726e7
Add ability to unmute account 2024-03-05 15:36:11 +01:00
Chocobozzz 2a69a02527
Fix poster with pending lives 2024-03-05 15:28:53 +01:00
Chocobozzz fa7a022e01
Prefer using short UUIDs 2024-03-05 15:23:29 +01:00
Chocobozzz b6ee2ec689
Don't submit the form on forgot my password click 2024-03-05 15:14:49 +01:00
Luca Calcaterra 2cdb94c885 Translated using Weblate (Italian)
Currently translated at 100.0% (144 of 144 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/it/
2024-03-05 13:54:01 +01:00
Luca Calcaterra 11d5cc3be5 Translated using Weblate (Italian)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/it/
2024-03-05 13:54:01 +01:00
Milo Ivir ca0efdc276 Translated using Weblate (Croatian)
Currently translated at 100.0% (2340 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir cc4bbad451 Translated using Weblate (Croatian)
Currently translated at 99.8% (2336 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir 7bd16e512e Translated using Weblate (Croatian)
Currently translated at 98.5% (2307 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir 7ce853933b Translated using Weblate (Croatian)
Currently translated at 97.9% (2293 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir c50e2ddd00 Translated using Weblate (Croatian)
Currently translated at 97.8% (2289 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir 0870929b75 Translated using Weblate (Croatian)
Currently translated at 97.7% (2287 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir c2122f77c4 Translated using Weblate (Croatian)
Currently translated at 100.0% (143 of 143 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir 2afc4f5dd6 Translated using Weblate (Croatian)
Currently translated at 97.7% (2287 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir f92939bd85 Translated using Weblate (Croatian)
Currently translated at 97.0% (2270 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir cf6219d5de Translated using Weblate (Croatian)
Currently translated at 96.9% (2268 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir f23326b774 Translated using Weblate (Croatian)
Currently translated at 96.5% (2259 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir a7142be2f0 Translated using Weblate (Croatian)
Currently translated at 100.0% (272 of 272 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir 44be6cca1b Translated using Weblate (Croatian)
Currently translated at 96.2% (2253 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
Milo Ivir de1a3c3795 Translated using Weblate (Croatian)
Currently translated at 95.4% (2233 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:01 +01:00
T.S a6b732df4d Translated using Weblate (Japanese)
Currently translated at 97.3% (2278 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2024-03-05 13:54:01 +01:00
Sveinn í Felli 862c72972b Translated using Weblate (Icelandic)
Currently translated at 100.0% (2340 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2024-03-05 13:54:01 +01:00
Sveinn í Felli ee7020685d Translated using Weblate (Icelandic)
Currently translated at 99.2% (2322 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2024-03-05 13:54:01 +01:00
T.S bd7f1fed2a Translated using Weblate (Japanese)
Currently translated at 96.5% (2260 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2024-03-05 13:54:01 +01:00
Sveinn í Felli a5613aa8a8 Translated using Weblate (Icelandic)
Currently translated at 97.9% (2293 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2024-03-05 13:54:01 +01:00
josé m cef5abbdbb Translated using Weblate (Galician)
Currently translated at 100.0% (2340 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-03-05 13:54:00 +01:00
josé m 57268f87ac Translated using Weblate (Galician)
Currently translated at 99.0% (2317 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-03-05 13:54:00 +01:00
josé m 6802da3616 Translated using Weblate (Galician)
Currently translated at 98.9% (2316 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-03-05 13:54:00 +01:00
Jiri Podhorecky 96f8bcae8e Translated using Weblate (Czech)
Currently translated at 95.2% (2230 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2024-03-05 13:54:00 +01:00
Milo Ivir 2b8ec2c6da Translated using Weblate (Croatian)
Currently translated at 94.9% (2221 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2024-03-05 13:54:00 +01:00
Milo Ivir 165449a7a9 Translated using Weblate (Croatian)
Currently translated at 100.0% (143 of 143 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/hr/
2024-03-05 13:54:00 +01:00
T.S df89e212f2 Translated using Weblate (Japanese)
Currently translated at 95.9% (2246 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2024-03-05 13:54:00 +01:00
Jeff Huang db3827d227 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2340 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-03-05 13:54:00 +01:00
0que 3fe03ee73a Translated using Weblate (Russian)
Currently translated at 99.7% (2335 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-03-05 13:54:00 +01:00
josé m a5c4e271f8 Translated using Weblate (Galician)
Currently translated at 98.2% (2300 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-03-05 13:54:00 +01:00
Ettore Atalan 607ac9be3b Translated using Weblate (German)
Currently translated at 98.3% (2302 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2024-03-05 13:54:00 +01:00
Ettore Atalan 36e88a41da Translated using Weblate (German)
Currently translated at 97.7% (2287 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2024-03-05 13:54:00 +01:00
Ettore Atalan 5d8fa623fb Translated using Weblate (German)
Currently translated at 97.6% (2286 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2024-03-05 13:54:00 +01:00
Ettore Atalan 50152904a5 Translated using Weblate (German)
Currently translated at 97.2% (2276 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2024-03-05 13:54:00 +01:00
Ettore Atalan 5b7a207dad Translated using Weblate (German)
Currently translated at 97.2% (2275 of 2340 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2024-03-05 13:54:00 +01:00
Chocobozzz 338633ce72
Remove barrels
They can prevent tree shaking
2024-03-05 10:52:32 +01:00
Chocobozzz 5e041ff7c2
Migrate to standalone components 2024-03-04 16:35:23 +01:00
Chocobozzz 62cc9b1752
Use standalone components for menu 2024-03-04 09:34:25 +01:00
Chocobozzz bfdf82c490
Refactor my-button component 2024-03-01 15:54:47 +01:00
Chocobozzz 275ba643eb
Simplify two columns layout 2024-03-01 15:01:34 +01:00
Chocobozzz c8d1f0d9c5
Remove unused dependencies 2024-02-29 14:20:28 +01:00
Chocobozzz 287ab812d3
Remove unused local storage keys 2024-02-29 13:54:30 +01:00
Chocobozzz 4b857f50c8
Anonymize IP stored in Redis too 2024-02-29 10:09:21 +01:00
Chocobozzz 4af8f5a581
Add "Detect a PeerTube instance" doc 2024-02-29 08:22:26 +01:00
Chocobozzz b00180744c
Add info about video history import/export 2024-02-28 16:53:22 +01:00
Chocobozzz 98781f353d
Add user history in import/export 2024-02-28 16:48:59 +01:00
Chocobozzz 7be401ac76
Fix playlist elements merge on import 2024-02-28 15:55:37 +01:00
Chocobozzz aff87c12ff
Typo 2024-02-28 14:54:52 +01:00
Chocobozzz f6fb7cd3e9
Ensure server actor AP object has avatars 2024-02-28 14:47:39 +01:00
Chocobozzz cd9b8c2cc8
Better video player responsive 2024-02-28 14:25:35 +01:00
Chocobozzz 109bff4bf7
Better audio file handling 2024-02-28 10:46:20 +01:00
Chocobozzz 568726e48d
Fix broken player on broken video 2024-02-28 10:02:49 +01:00
Chocobozzz 4434e78c56
Fix tests 2024-02-28 10:00:01 +01:00
Chocobozzz cf60f7af03
Add ability to add playlist from my videos 2024-02-28 09:44:43 +01:00
Chocobozzz 9808b179a5
Faster player ratio change on video update 2024-02-28 08:42:36 +01:00
Chocobozzz dee2e66e02
Fix search channel avatar size 2024-02-27 17:13:49 +01:00
Chocobozzz bb21e0b3c8
Fix embed preview ratio 2024-02-27 16:43:01 +01:00
Chocobozzz 91d7a3928f
Use video ratio for responsive embeds 2024-02-27 16:31:57 +01:00
Chocobozzz dfe98695d6
Use server video ratio if available 2024-02-27 16:24:48 +01:00
Chocobozzz 9953825499
Remove unused mixin 2024-02-27 16:07:20 +01:00
Chocobozzz 206fe1de0e
Fix actor avatar sizes 2024-02-27 16:05:34 +01:00
Chocobozzz a4b497c2a9
Add postingRestrictedToMods to channels AP objects
See https://github.com/LemmyNet/lemmy/issues/3837
2024-02-27 15:46:38 +01:00
Chocobozzz 2e760485c1
Fix abuse/registration requests stats
With old abuses/registration requests that do not have the processedAt
attribute set
2024-02-27 15:26:37 +01:00
Chocobozzz b6b1aaa56f
Add video aspect ratio in server 2024-02-27 15:24:34 +01:00
Chocobozzz c75381208f
Fix CSP 2024-02-27 11:18:19 +01:00
Chocobozzz a172cadee4
Remove password autocomplete in embed
Causes issues when the embed is in an iframe, and the parent page has a
password input if the user uses the web browser autofill
2024-02-27 09:04:13 +01:00
Chocobozzz 466acae1e5
Remove redundant thumbnail save 2024-02-26 16:36:03 +01:00
Chocobozzz 5f3009d8e9
Add player when the video is not loaded yet 2024-02-26 16:19:25 +01:00
Chocobozzz 878ea1499d
Add missing i18n tag 2024-02-26 16:14:44 +01:00
Chocobozzz 68d006b6fc
Add config to disable storing lives in s3 2024-02-26 16:14:40 +01:00
Chocobozzz c2c2cd4121
Warn if forgot password email contains uppercase 2024-02-26 15:01:56 +01:00
Chocobozzz f978e52edc
Fix close modal icon position 2024-02-26 15:01:48 +01:00
Chocobozzz 109e93c139
Generate 600x600 and 1500x1500 avatars 2024-02-26 15:00:22 +01:00
Chocobozzz fb2dc40858
Improve generated image quality 2024-02-26 11:33:17 +01:00
Chocobozzz 1abf74e464
Try to re-fix tests 2024-02-26 09:36:11 +01:00
Chocobozzz e2b2c46339
Fix tests 2024-02-23 16:29:52 +01:00
Chocobozzz 0eff76f800
Update translations 2024-02-23 16:27:14 +01:00
Framasoft 3f133cb2e6 Translated using Weblate (Chinese (Traditional))
Currently translated at 99.9% (2334 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-02-23 16:23:03 +01:00
Alexander Ivanov ac3e1df8d5 Translated using Weblate (Russian)
Currently translated at 100.0% (144 of 144 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ru/
2024-02-23 15:55:00 +01:00
Alexander Ivanov 91243020b5 Translated using Weblate (Russian)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/ru/
2024-02-23 15:55:00 +01:00
Alexander Ivanov 0fe0b1421d Translated using Weblate (Russian)
Currently translated at 100.0% (2335 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-02-23 15:55:00 +01:00
josé m 65cb19c253 Translated using Weblate (Galician)
Currently translated at 97.8% (2284 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-02-23 15:55:00 +01:00
josé m 2f455f3004 Translated using Weblate (Galician)
Currently translated at 96.1% (2246 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-02-23 15:55:00 +01:00
Aitor Salaberria ca4cc21739 Translated using Weblate (Basque)
Currently translated at 98.7% (2305 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-02-23 15:55:00 +01:00
Aitor Salaberria d92b47dccf Translated using Weblate (Basque)
Currently translated at 98.3% (2296 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-02-23 15:55:00 +01:00
Aitor Salaberria ebf557110e Translated using Weblate (Basque)
Currently translated at 97.9% (2288 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-02-23 15:55:00 +01:00
Aitor Salaberria 8cad6a3e6f Translated using Weblate (Basque)
Currently translated at 96.7% (2258 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-02-23 15:55:00 +01:00
Besnik Bleta 0b53d8ae08 Translated using Weblate (Albanian)
Currently translated at 98.6% (142 of 144 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/sq/
2024-02-23 15:55:00 +01:00
Jeff Huang 1a8aee7368 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2335 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-02-23 15:54:59 +01:00
Jeff Huang 52d15325ae Translated using Weblate (Chinese (Traditional))
Currently translated at 96.2% (2247 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-02-23 15:54:59 +01:00
Александр 5b7f477c0c Translated using Weblate (Russian)
Currently translated at 99.9% (2333 of 2335 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-02-23 15:54:59 +01:00
Chocobozzz 473840e890
Update apps versions 2024-02-23 15:49:09 +01:00
Chocobozzz 0db27b44f3
Fix tsx testing 2024-02-23 15:46:55 +01:00
Chocobozzz ed77d65699
Upgrade peertube runner dependencies 2024-02-23 15:26:08 +01:00
Chocobozzz 1e17dece73
Update peertube-cli dependencies 2024-02-23 15:23:53 +01:00
Chocobozzz c4a062109d
Fallback HLS failure to web video player 2024-02-23 15:21:29 +01:00
Chocobozzz 094accd873
Fix CI 2024-02-23 15:07:09 +01:00
Chocobozzz 0165786f65
Add total moderators/admins in stats 2024-02-23 15:04:18 +01:00
Chocobozzz bb7cb0d2fd
Add ability to set avatar to instance 2024-02-23 14:27:11 +01:00
Chocobozzz db06d13c67
Fix typescript tests 2024-02-23 08:33:01 +01:00
Chocobozzz 007b845cab
Add banner info 2024-02-22 11:49:29 +01:00
Chocobozzz 9e2700b89d
Fix lint 2024-02-22 10:32:28 +01:00
Chocobozzz 780f17f116
Fix upload script preview short option 2024-02-22 10:07:03 +01:00
Chocobozzz 971077bccd
Fix deprecated OTEL API 2024-02-21 16:24:21 +01:00
Chocobozzz d7edb2f8fe
Update client dependencies 2024-02-21 16:23:37 +01:00
Chocobozzz 6eda5c36f4
Update server dependencies 2024-02-21 16:23:31 +01:00
Chocobozzz 8349c20c08
Update translations 2024-02-21 15:43:15 +01:00
Luca Calcaterra 27f2dc51dd Translated using Weblate (Italian)
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/it/
2024-02-21 15:33:43 +01:00
Luca Calcaterra 7130b738aa Translated using Weblate (Italian)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/it/
2024-02-21 15:33:43 +01:00
Luca Calcaterra 1a6419668d Translated using Weblate (Italian)
Currently translated at 71.8% (1619 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2024-02-21 15:33:43 +01:00
Fontan 030 1ea6b40a66 Translated using Weblate (Kazakh)
Currently translated at 8.8% (200 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/kk/
2024-02-21 15:33:43 +01:00
Eric Guichaoua 90c36a07c8 Translated using Weblate (French (France) (fr_FR))
Currently translated at 98.5% (140 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/fr_FR/
2024-02-21 15:33:43 +01:00
Eric Guichaoua d6fb498573 Translated using Weblate (French (France) (fr_FR))
Currently translated at 97.0% (2185 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-02-21 15:33:43 +01:00
Balázs Meskó 69257086ce Translated using Weblate (Hungarian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-02-21 15:33:43 +01:00
Marcel Fuhrmann e58df247cf Translated using Weblate (German)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2024-02-21 15:33:42 +01:00
Salif Mehmed 410cd6161f Translated using Weblate (Bulgarian)
Currently translated at 15.4% (201 of 1305 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/bg/
2024-02-21 15:33:42 +01:00
Thijs Kinkhorst b0b94df5ae Translated using Weblate (Dutch)
Currently translated at 91.2% (2055 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-02-21 15:33:42 +01:00
Thijs Kinkhorst eb285bc84c Translated using Weblate (Dutch)
Currently translated at 91.2% (2055 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-02-21 15:33:42 +01:00
Fontan 030 1d871ade86 Translated using Weblate (Kazakh)
Currently translated at 7.3% (166 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/kk/
2024-02-21 15:33:42 +01:00
Fontan 030 f697ebc3c4 Translated using Weblate (Kazakh)
Currently translated at 50.7% (36 of 71 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/kk/
2024-02-21 15:33:42 +01:00
Fontan 030 37b2942136 Translated using Weblate (Kazakh)
Currently translated at 7.1% (161 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/kk/
2024-02-21 15:33:42 +01:00
T.S de4aeee2a6 Translated using Weblate (Japanese)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2024-02-21 15:33:42 +01:00
Fontan 030 a1018488e9 Translated using Weblate (Kazakh)
Currently translated at 1.0% (24 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/kk/
2024-02-21 15:33:42 +01:00
Hồ Nhất Duy a77d2e45ef Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2024-02-21 15:33:42 +01:00
Charlie Lambda 0225419b24 Translated using Weblate (Esperanto)
Currently translated at 66.6% (1502 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eo/
2024-02-21 15:33:42 +01:00
Jiri Podhorecky 02848ab04a Translated using Weblate (Czech)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/cs/
2024-02-21 15:33:42 +01:00
Ricardo Biloti b4e33b91f4 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti 90a8602c37 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti 5321fee555 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti f29ca82157 Translated using Weblate (Portuguese (Brazil))
Currently translated at 87.7% (1977 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti 38b16b65c5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/pt_BR/
2024-02-21 15:33:42 +01:00
Flavio F. M c7ccd9b85a Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti f2d4da685e Translated using Weblate (Portuguese (Brazil))
Currently translated at 87.6% (1975 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2024-02-21 15:33:42 +01:00
Aitor Salaberria 2a0a452984 Translated using Weblate (Basque)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-02-21 15:33:42 +01:00
Ricardo Biloti f108ef1c24 Translated using Weblate (Portuguese (Brazil))
Currently translated at 87.6% (1973 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti 5d345167e6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 78.7% (1773 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti 4506c54c18 Translated using Weblate (Portuguese (Brazil))
Currently translated at 68.9% (1552 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti ed0f6dac27 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/pt_BR/
2024-02-21 15:33:42 +01:00
Flavio F. M 1890823ec1 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti 3b0a2988a6 Translated using Weblate (Portuguese (Brazil))
Currently translated at 64.3% (1449 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2024-02-21 15:33:42 +01:00
Flavio F. M 0af1cb0254 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti 1166fe1ef8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/pt_BR/
2024-02-21 15:33:42 +01:00
Ricardo Biloti 76fc3da608 Translated using Weblate (Portuguese (Brazil))
Currently translated at 63.7% (1435 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2024-02-21 15:33:42 +01:00
Free coss 54ce688c11 Translated using Weblate (Arabic)
Currently translated at 95.1% (2142 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2024-02-21 15:33:42 +01:00
Jan Ainali 1ad8f40fed Translated using Weblate (Swedish)
Currently translated at 95.0% (2140 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2024-02-21 15:33:42 +01:00
Jan Ainali c19c5d7011 Translated using Weblate (Swedish)
Currently translated at 94.9% (2139 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2024-02-21 15:33:42 +01:00
Filip Bengtsson 1ca3787c64 Translated using Weblate (Swedish)
Currently translated at 94.7% (2134 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2024-02-21 15:33:42 +01:00
Filip Bengtsson a6ac6ecc55 Translated using Weblate (Swedish)
Currently translated at 94.3% (2124 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2024-02-21 15:33:42 +01:00
alex gabilondo c7a9dd3f31 Translated using Weblate (Basque)
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/eu/
2024-02-21 15:33:42 +01:00
alex gabilondo d1bac9fff4 Translated using Weblate (Basque)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/eu/
2024-02-21 15:33:42 +01:00
alex gabilondo b22c846dca Translated using Weblate (Basque)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-02-21 15:33:42 +01:00
Balázs Meskó e2c54724c1 Translated using Weblate (Hungarian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-02-21 15:33:42 +01:00
Balázs Meskó bd8a31c1a2 Translated using Weblate (Hungarian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-02-21 15:33:42 +01:00
Balázs Meskó 3c27cea450 Translated using Weblate (Hungarian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-02-21 15:33:41 +01:00
Balázs Meskó 0335f1c5eb Translated using Weblate (Hungarian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-02-21 15:33:41 +01:00
Balázs Meskó 6add950866 Translated using Weblate (Hungarian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-02-21 15:33:41 +01:00
Balázs Meskó 5a00113c15 Translated using Weblate (Hungarian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-02-21 15:33:41 +01:00
Jeff Huang 09b6bf1306 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-02-21 15:33:41 +01:00
0que 51483237b4 Translated using Weblate (Russian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-02-21 15:33:41 +01:00
Sveinn í Felli f6766e6c57 Translated using Weblate (Icelandic)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2024-02-21 15:33:41 +01:00
Александр 22d2574cc0 Translated using Weblate (Russian)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-02-21 15:33:41 +01:00
josé m b89a1654fc Translated using Weblate (Galician)
Currently translated at 100.0% (2252 of 2252 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-02-21 15:33:41 +01:00
Chocobozzz 0648d57870
Add total video file size column in users list 2024-02-21 15:28:38 +01:00
Chocobozzz db69d9491e
Add abuse and registration requests stats 2024-02-21 14:57:20 +01:00
Chocobozzz fbe47a9f8e Fix build 2024-02-21 13:49:08 +01:00
Chocobozzz 00ee54329a Improve a little bit completeVideoCheck 2024-02-21 13:49:08 +01:00
Chocobozzz f7e4f62870 Refactor uploadx middlewares 2024-02-21 13:49:08 +01:00
Chocobozzz e286db3a39 Refactor caption creation 2024-02-21 13:49:08 +01:00
Chocobozzz 8c3cb7e083 Add user import info in feature table 2024-02-21 13:49:08 +01:00
Chocobozzz 7986ab8452 Support chapter import/export 2024-02-21 13:49:08 +01:00
Chocobozzz 967702d6c7 Faster user import/export tests 2024-02-21 13:49:08 +01:00
Chocobozzz 009d7b39ac Stricter import types
Avoid forgetting to sanitize a field by specifying the sanitized object
type
2024-02-21 13:49:08 +01:00
Chocobozzz 02596be702 Fix api rate limit 2024-02-21 13:49:08 +01:00
Chocobozzz 3cac8a756f Fix lint, tests and styling 2024-02-21 13:49:08 +01:00
Chocobozzz f9c89b98f7 Add user import/export in client 2024-02-21 13:49:08 +01:00
Chocobozzz 35f0bb14be Update nginx template to support user import 2024-02-21 13:49:08 +01:00
Chocobozzz b18127d91b Add user import/export in openapi 2024-02-21 13:49:08 +01:00
Chocobozzz f6af3f701c Add user import/export tests 2024-02-21 13:49:08 +01:00
Chocobozzz 8573e5a80a Implement user import/export in server 2024-02-21 13:49:08 +01:00
Chocobozzz 4d63e6f577
Add banner on register page too 2024-02-20 14:43:49 +01:00
Chocobozzz 93f9677463
Add instance banner on login page 2024-02-20 14:34:33 +01:00
Chocobozzz cbfe10a43e
Fix updating instance banner 2024-02-20 14:33:10 +01:00
Chocobozzz 7ee0efb57a
Add ability to set a banner to the instance 2024-02-20 11:33:10 +01:00
Chocobozzz 1c0270ca8a
Improve player control bar icons alignment 2024-02-20 08:47:11 +01:00
Chocobozzz c97b8fd2ea
Add caption button to player control bar 2024-02-19 16:14:29 +01:00
Chocobozzz 7b86b9b458
Stop caching upload after successful upload
Just forbid sending 2 concurrent requests, but let the user decide if
it wants to upload the same video multiple times
2024-02-19 14:43:19 +01:00
Chocobozzz ebe828ec75
Fix displaying autoblock messages 2024-02-19 14:26:17 +01:00
Chocobozzz a40981fc30
Remove / in download filename 2024-02-16 10:35:28 +01:00
Chocobozzz cb23087ff5
More robust avatar finder 2024-02-16 10:24:02 +01:00
Chocobozzz 48f1d4b186
More robust channel sync 2024-02-16 10:14:12 +01:00
Chocobozzz 22ab711501
Correctly fix video feeds endpoint 2024-02-16 09:26:14 +01:00
Chocobozzz 1387e0a3bb
It's 2024! 2024-02-16 08:58:29 +01:00
Chocobozzz 65e7ffba15
Disable utp for webtorrent
Prevent crash like https://github.com/Chocobozzz/PeerTube/issues/6222
2024-02-15 16:49:04 +01:00
Chocobozzz a53834bdff
Improve channel text fading 2024-02-15 16:38:38 +01:00
Chocobozzz f49896f44e
Use more precise save label in my account settings 2024-02-15 16:33:19 +01:00
Chocobozzz 098c25ece6
Do not display empty notification settings group 2024-02-15 16:30:53 +01:00
Chocobozzz b13e81e43f
Moderators can approve registrations 2024-02-15 16:26:19 +01:00
Chocobozzz 64128512b2
Add yarn cleanup info after upgrade 2024-02-15 16:23:09 +01:00
Chocobozzz ef4e7651c1
Getting the video source requires oauth token 2024-02-15 16:15:07 +01:00
Chocobozzz 26fb3ee660
Fix account channels page
With high max channels per user peertube config
2024-02-15 14:47:49 +01:00
Lety Does Stuff c4b039886e
Fix the escapeAttribute function using HTML entities instead of backslash escapes (#6206)
* Fix the escapeAttribute function using HTML entities instead of backslash escapes

* Fix tests

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2024-02-15 14:39:59 +01:00
Chocobozzz ba3820965f
Blocked users must not be able to live stream 2024-02-15 14:27:52 +01:00
Chocobozzz 5f09fde24e
Fix tests 2024-02-15 14:14:50 +01:00
Chocobozzz 331e7cb3c5
Trim username on login
User username of email address can't have a space so it's safe to trim
the input (extra space can be easily added by pastes in some cases)
2024-02-15 14:12:56 +01:00
Chocobozzz a012d6c2a9
Add notification on subscription live stream 2024-02-15 14:06:25 +01:00
Chocobozzz 4300cc1ee1
Fix job count for waiting jobs 2024-02-15 13:40:53 +01:00
Chocobozzz acd9eaeb1d
More robust RSS feed 2024-02-15 09:15:55 +01:00
Chocobozzz bfdd4d10f3
Clearer yarn dependency version doc 2024-02-15 09:01:01 +01:00
Chocobozzz 8758d8ed8f
Ensure file is flushed before renaming it 2024-02-15 09:00:25 +01:00
Chocobozzz 11458a747c
Fix CI tests 2024-02-12 11:22:51 +01:00
Chocobozzz ca90b8f651
Update github actions 2024-02-06 07:34:58 +01:00
Chocobozzz d7e496d3a3
Update openapi version 2024-01-26 17:20:26 +01:00
Chocobozzz 9489b536a2
Add warning for s3 provider support 2024-01-26 17:20:07 +01:00
Chocobozzz 88006beeb3
Fix peertube-runner with node >= 20.11
See https://github.com/Chocobozzz/PeerTube/issues/6171
2024-01-19 10:53:57 +01:00
Chocobozzz 0d89f639f6
Merge branch 'release/6.0.0' into develop 2024-01-18 09:48:26 +01:00
Chocobozzz 01e4fd067e
Bumped to version v6.0.3 2024-01-18 09:38:18 +01:00
Chocobozzz 5b4f02c145
Update changelog 2024-01-18 09:38:02 +01:00
Chocobozzz eb02a5dd5d
Fix duplicate chapters error 2024-01-18 09:17:13 +01:00
Chocobozzz 12ea8f0dd1
Fix nginx serving private hls files 2024-01-18 09:09:31 +01:00
Chocobozzz 4d8018de68
Fix tests
New index that uses meilisearch has a sort that can be influenced, but
still tries to sort by exact match first
2024-01-15 11:30:49 +01:00
Chocobozzz 91f975f959
Update translations 2024-01-15 09:39:05 +01:00
Balázs Meskó 6e3b929518 Translated using Weblate (Hungarian)
Currently translated at 97.8% (2201 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-01-15 01:11:53 +01:00
Asier Iturralde Sarasola 53ffe6e4dd Translated using Weblate (Basque)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-01-15 01:11:53 +01:00
Aitor Salaberria 7a6d950c5c Translated using Weblate (Basque)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-01-15 01:11:53 +01:00
ButterflyOfFire 37648b4b06 Translated using Weblate (Kabyle)
Currently translated at 64.6% (1454 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/kab/
2024-01-14 12:01:43 +01:00
Matej Šujan 025b29d68f Translated using Weblate (Slovak)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sk/
2024-01-12 16:01:25 +01:00
Eric Guichaoua aeb0cb15de Translated using Weblate (French)
Currently translated at 99.9% (1705 of 1706 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr/
2024-01-12 16:01:25 +01:00
Eric Guichaoua 49a64e80c9 Translated using Weblate (French (France) (fr_FR))
Currently translated at 91.5% (2060 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-01-12 16:01:25 +01:00
I_Automne 51c88251b5 Translated using Weblate (French)
Currently translated at 100.0% (1706 of 1706 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr/
2024-01-12 16:01:25 +01:00
Eric Guichaoua 6fcbf9dbd0 Translated using Weblate (French (France) (fr_FR))
Currently translated at 91.4% (2058 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-01-12 16:01:25 +01:00
Eric Guichaoua a0ff5adfa3 Translated using Weblate (French (France) (fr_FR))
Currently translated at 91.4% (2057 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-01-12 16:01:25 +01:00
Eric Guichaoua 0c0c7c05ad Translated using Weblate (French (France) (fr_FR))
Currently translated at 91.3% (2056 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-01-12 16:01:25 +01:00
Eric Guichaoua 365f2363fb Translated using Weblate (French (France) (fr_FR))
Currently translated at 91.2% (2052 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2024-01-12 16:01:25 +01:00
Balázs Meskó 29cd853727 Translated using Weblate (Hungarian)
Currently translated at 97.1% (2186 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-01-12 16:01:25 +01:00
Balázs Meskó c366b9aa23 Translated using Weblate (Hungarian)
Currently translated at 95.8% (2156 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-01-12 16:01:25 +01:00
Phongpanot 24d17812d2 Translated using Weblate (Thai)
Currently translated at 68.6% (1544 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/th/
2024-01-12 16:01:25 +01:00
Fontan 030 a7e9fe9454 Translated using Weblate (Kazakh)
Currently translated at 38.0% (27 of 71 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/kk/
2024-01-12 16:01:25 +01:00
Fontan 030 d30fbaf297 Translated using Weblate (Kazakh)
Currently translated at 67.3% (95 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2024-01-12 16:01:25 +01:00
Phongpanot e18c5c2ba3 Translated using Weblate (Thai)
Currently translated at 85.9% (122 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/th/
2024-01-12 16:01:25 +01:00
Phongpanot bfe5125b50 Translated using Weblate (Thai)
Currently translated at 68.4% (1540 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/th/
2024-01-12 16:01:25 +01:00
Carlos García Gutiérrez b9f2911814 Translated using Weblate (Spanish)
Currently translated at 95.2% (2143 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2024-01-12 16:01:25 +01:00
h3n3 1d39df8fb8 Translated using Weblate (Dutch)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/nl/
2024-01-12 16:01:25 +01:00
h3n3 faaad4db67 Translated using Weblate (Dutch)
Currently translated at 91.4% (2057 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2024-01-12 16:01:24 +01:00
NorbiPeti 2de74bff48 Translated using Weblate (Hungarian)
Currently translated at 95.0% (2138 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-01-12 16:01:24 +01:00
Flavio F. M 226f4c9dc5 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/pt_BR/
2024-01-12 16:01:24 +01:00
0que b49fd600f8 Translated using Weblate (Russian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2024-01-12 16:01:24 +01:00
NorbiPeti 10f6af0d96 Translated using Weblate (Hungarian)
Currently translated at 86.2% (1941 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2024-01-12 16:01:24 +01:00
Hồ Nhất Duy ac2a74463e Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2024-01-12 16:01:24 +01:00
josé m e349611e49 Translated using Weblate (Galician)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2024-01-12 16:01:24 +01:00
Jeff Huang 86cfb52cf3 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2024-01-12 16:01:24 +01:00
Aitor Salaberria f99d77e1ad Translated using Weblate (Basque)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2024-01-12 16:01:24 +01:00
Olivier Bouillet 9bcf0ecc48
doc: add default values in iFrame api doc (#6118)
* doc: add default values in iFrame api doc

* doc: handle PR feedbacks

* doc: add missing feedback

* chore: one more fix

* doc: fix last code review feedbacks

---------

Co-authored-by: olivier <olivier.bouillet@ifeelsmart.com>
2024-01-12 16:01:19 +01:00
John Livingston 72e896ea49
Documentation: how to create a systemd service for the Peertube runner. (#6065)
* Documentation: how to create a systemd service for the Peertube runner.

* Styling

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2024-01-12 15:53:29 +01:00
Wicklow ffd9bf1c8b
Add ability to download videos from my videos page (#6008)
* Fix object storage download

* Add ability to download videos from my videos page

* Updated code based on review comments

* Styling

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2024-01-12 15:29:07 +01:00
Chocobozzz 1cb3afb2c2
Fix object storage download 2024-01-12 14:07:54 +01:00
Chocobozzz 0cbe9a471f
Also add stripes to square videos 2024-01-11 11:13:20 +01:00
Chocobozzz 9e9a00d7f8
Fix video timestamp linkify 2024-01-11 10:47:36 +01:00
Chocobozzz 0461ce8d24
Fix videos list pagination 2024-01-11 10:22:36 +01:00
Chocobozzz b9e11ea213
Prevent displaying multiple times channels 2024-01-11 10:08:10 +01:00
Chocobozzz b68d2b0698
Improve video import notification 2024-01-08 10:01:30 +01:00
Chocobozzz d1adcfadfd
Update angular to v17 2024-01-05 10:47:14 +01:00
Chocobozzz 7f8979e544
Update client dependencies 2024-01-05 09:43:19 +01:00
Chocobozzz 2230b1571f
Merge branch 'release/6.0.0' into develop 2024-01-04 10:37:01 +01:00
Chocobozzz 04a0ed13b4
Also update playlist URLs 2024-01-04 09:21:56 +01:00
Chocobozzz 0a53a54ed7
Merge branch 'release/6.0.0' into develop 2024-01-03 15:26:22 +01:00
Chocobozzz 5cf5465d20
Fix player ratio on audio only 2024-01-03 15:23:20 +01:00
Chocobozzz cfcbfb668e
Prevent error when live doesn't have replay files 2024-01-03 15:06:24 +01:00
Chocobozzz d7804627c2
Fix chapter position width consistency 2024-01-03 11:12:12 +01:00
Chocobozzz 3608eb4f1e
Fix input mask with 10h+ videos 2024-01-03 11:10:41 +01:00
Chocobozzz 4cbea51255
Add subdivision to viewer stats 2023-12-28 09:56:05 +01:00
Chocobozzz 4437ae0fd3
Add FEP-2677 tests 2023-12-27 16:18:18 +01:00
Chocobozzz 4f3fb47884
Implement FEP-2677
Better way to find and follow remote instance actor
2023-12-27 16:01:52 +01:00
Chocobozzz b9077c83fc
Add ability to disable storyboards 2023-12-27 10:39:09 +01:00
Chocobozzz 482223cc23
Merge branch 'release/6.0.0' into develop 2023-12-22 09:50:20 +01:00
Chocobozzz b25a6d0560
Fix theme colors on stats page 2023-12-22 09:49:59 +01:00
Chocobozzz 374820f2c0
Don't need contentUrl if embedUrl is set 2023-12-22 08:58:53 +01:00
Chocobozzz 00e0d15611
Update translations 2023-12-20 16:20:38 +01:00
Chocobozzz ef39bc9069
Merge remote-tracking branch 'weblate/develop' into develop 2023-12-20 16:18:32 +01:00
Chocobozzz 640bc1a0cd
Current time cannot be null 2023-12-20 16:07:48 +01:00
Sergey Zigachev c6a963511f Translated using Weblate (Russian)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-12-20 15:30:28 +01:00
Sergey Zigachev 05bb85c480 Translated using Weblate (Russian)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-12-20 15:30:28 +01:00
Filip Bengtsson b2f90f761c Translated using Weblate (Swedish)
Currently translated at 94.2% (2119 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-12-20 15:30:28 +01:00
Filip Bengtsson 2164843f22 Translated using Weblate (Swedish)
Currently translated at 89.4% (2010 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-12-20 15:30:28 +01:00
Filip Bengtsson c457a7bd65 Translated using Weblate (Swedish)
Currently translated at 88.6% (1993 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-12-20 15:30:28 +01:00
Filip Bengtsson a9b70daf5f Translated using Weblate (Swedish)
Currently translated at 87.0% (1958 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-12-20 15:30:28 +01:00
Filip Bengtsson 979f240436 Translated using Weblate (Swedish)
Currently translated at 85.8% (1931 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-12-20 15:30:28 +01:00
Filip Bengtsson e7a7d5b7bd Translated using Weblate (Swedish)
Currently translated at 84.3% (1897 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-12-20 15:30:28 +01:00
Filip Bengtsson 7f0f8430de Translated using Weblate (Swedish)
Currently translated at 84.1% (1892 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-12-20 15:30:28 +01:00
Filip Bengtsson 44a0530175 Translated using Weblate (Swedish)
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/sv/
2023-12-20 15:30:28 +01:00
Filip Bengtsson b384a9b2c8 Translated using Weblate (Swedish)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/sv/
2023-12-20 15:30:28 +01:00
Yaron Shahrabani 0604db09e8 Translated using Weblate (Hebrew)
Currently translated at 90.0% (218 of 242 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/he/
2023-12-20 15:30:28 +01:00
Hồ Nhất Duy 861f988667 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-12-20 15:30:28 +01:00
Александр 22c88842a0 Translated using Weblate (Russian)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-12-20 15:30:28 +01:00
Fontan 030 4cc64bd6ef Translated using Weblate (Kazakh)
Currently translated at 58.1% (82 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:28 +01:00
Phongpanot 3f8b7f7f7f Translated using Weblate (Thai)
Currently translated at 66.3% (1492 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/th/
2023-12-20 15:30:28 +01:00
Fontan 030 4b1095ccb4 Translated using Weblate (Kazakh)
Currently translated at 53.9% (76 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:28 +01:00
Fontan 030 2c9047d57a Translated using Weblate (Kazakh)
Currently translated at 52.4% (74 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:28 +01:00
Fontan 030 3a5fe8aba3 Translated using Weblate (Kazakh)
Currently translated at 48.2% (68 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:28 +01:00
Fontan 030 7f771a443c Translated using Weblate (Kazakh)
Currently translated at 47.5% (67 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:28 +01:00
Aitor Salaberria fd81e20493 Translated using Weblate (Basque)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-12-20 15:30:28 +01:00
Fontan 030 2b397d798c Translated using Weblate (Kazakh)
Currently translated at 0.8% (20 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/kk/
2023-12-20 15:30:28 +01:00
Fontan 030 e1c8e95705 Translated using Weblate (Kazakh)
Currently translated at 0.2% (6 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/kk/
2023-12-20 15:30:28 +01:00
Fontan 030 101c86275b Translated using Weblate (Kazakh)
Currently translated at 36.6% (26 of 71 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/kk/
2023-12-20 15:30:28 +01:00
Fontan 030 190f95d405 Added translation using Weblate (Kazakh) 2023-12-20 15:30:27 +01:00
Fontan 030 7e44bdd59f Translated using Weblate (Kazakh)
Currently translated at 44.6% (63 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:27 +01:00
paring 885b17be1b Translated using Weblate (Korean)
Currently translated at 85.7% (84 of 98 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ko/
2023-12-20 15:30:27 +01:00
josé m 5aafc1ec4e Translated using Weblate (Galician)
Currently translated at 99.2% (141 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/gl/
2023-12-20 15:30:27 +01:00
josé m 6e6aba9542 Translated using Weblate (Galician)
Currently translated at 100.0% (272 of 272 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/gl/
2023-12-20 15:30:27 +01:00
josé m d21f5c0137 Translated using Weblate (Galician)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-12-20 15:30:27 +01:00
Fontan 030 94adf5adee Translated using Weblate (Kazakh)
Currently translated at 39.0% (55 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:27 +01:00
Fontan 030 8157e37000 Translated using Weblate (Kazakh)
Currently translated at 32.6% (46 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:27 +01:00
Fontan 030 9d401ea8e3 Translated using Weblate (Kazakh)
Currently translated at 30.4% (43 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:27 +01:00
Balázs Meskó b0295ea938 Translated using Weblate (Hungarian)
Currently translated at 81.4% (1831 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2023-12-20 15:30:27 +01:00
Txopi 3391bdd66c Translated using Weblate (Basque)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-12-20 15:30:27 +01:00
Fontan 030 9acf470eea Translated using Weblate (Kazakh)
Currently translated at 25.3% (18 of 71 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/kk/
2023-12-20 15:30:27 +01:00
Fontan 030 a6dc865d30 Translated using Weblate (Kazakh)
Currently translated at 26.2% (37 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:27 +01:00
Fontan 030 a14fcf3e41 Added translation using Weblate (Kazakh) 2023-12-20 15:30:27 +01:00
Fontan 030 74005fb55f Translated using Weblate (Kazakh)
Currently translated at 25.5% (36 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:27 +01:00
Fontan 030 721f726cd9 Translated using Weblate (Kazakh)
Currently translated at 23.4% (33 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:27 +01:00
Sveinn í Felli 5f965a34af Translated using Weblate (Icelandic)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-12-20 15:30:27 +01:00
BGR2 e9a7660275 Translated using Weblate (Turkish)
Currently translated at 36.2% (815 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2023-12-20 15:30:27 +01:00
Fontan 030 d7a7f4f869 Translated using Weblate (Kazakh)
Currently translated at 21.2% (30 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/kk/
2023-12-20 15:30:27 +01:00
Fontan 030 db364e32cb Added translation using Weblate (Kazakh) 2023-12-20 15:30:27 +01:00
Mario Pepe c78afeeadb Translated using Weblate (Italian)
Currently translated at 71.0% (1598 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2023-12-20 15:30:27 +01:00
Pierre-Jean 0907e7761a Translated using Weblate (French)
Currently translated at 100.0% (1706 of 1706 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr/
2023-12-20 15:30:27 +01:00
Julien Maulny 9d128e35e8 Translated using Weblate (French)
Currently translated at 100.0% (1706 of 1706 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr/
2023-12-20 15:30:27 +01:00
josé m 334744a25c Translated using Weblate (Galician)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-12-20 15:30:27 +01:00
Anatoly abbd309b5c Translated using Weblate (Russian)
Currently translated at 99.9% (2247 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-12-20 15:30:27 +01:00
Renne Rocha 60fe81bab3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 62.7% (1411 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2023-12-20 15:30:27 +01:00
Balázs Meskó 1786c82e7d Translated using Weblate (Hungarian)
Currently translated at 72.9% (1639 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2023-12-20 15:30:27 +01:00
Balázs Meskó b85c1865e4 Translated using Weblate (Hungarian)
Currently translated at 72.4% (1628 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2023-12-20 15:30:27 +01:00
Balázs Meskó 070624a422 Translated using Weblate (Hungarian)
Currently translated at 72.2% (1625 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2023-12-20 15:30:27 +01:00
Jeff Huang 1d934040d7 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-12-20 15:30:26 +01:00
Goudarz Jafari 3b60d8e14b Translated using Weblate (Persian)
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/fa/
2023-12-20 15:30:26 +01:00
Goudarz Jafari 9855f7d7c6 Translated using Weblate (Persian)
Currently translated at 100.0% (272 of 272 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/fa/
2023-12-20 15:30:26 +01:00
josé m bb1a75cfe9 Translated using Weblate (Galician)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-12-20 15:30:26 +01:00
Aitor Salaberria 1c697fa24c Translated using Weblate (Basque)
Currently translated at 100.0% (2248 of 2248 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-12-20 15:30:26 +01:00
Chocobozzz f0b8938a80
Update peertube runner version 2023-12-20 15:30:14 +01:00
Henri BAUDESSON 83f8ea5c14 Runner download videoFileUrl follow redirect
The runner downloads the video file from the url set in the paylaod
of a transcoding job. This url is pointing to our API and the runner
will make POST request  to it with an jobToken and a runnerToken.
Doing this ensure we can verify the tokens and return the video file.
But returning the video file also means that we are using server
resources to serve the file. If the runner is able to follow the
redirect, we can do our usual verification and return a redirect
response to the url of the video file, the runner will download it
using his own resources.
2023-12-20 15:26:43 +01:00
FediThing cbe57fa266 Update video-watch.component.html
Tweaked error message so that users realise that refreshing the page may help the video to load properly.
2023-12-20 15:26:26 +01:00
Chocobozzz 66776b6a25
Merge branch 'release/6.0.0' into develop 2023-12-20 14:07:47 +01:00
Chocobozzz b5ae080f32
Fix tests 2023-12-20 13:51:01 +01:00
Chocobozzz c37b19ffa9
Add no-constant-binary-expression eslint rule
https://eslint.org/blog/2022/07/interesting-bugs-caught-by-no-constant-binary-expression/
2023-12-20 11:04:38 +01:00
Chocobozzz 8d1f0853cc
Relax missing two factor log level 2023-12-20 10:55:47 +01:00
Chocobozzz b6b50bf0b4
Use new plugin index sort and recommended tags 2023-12-20 10:55:47 +01:00
Chocobozzz fe37e5232b
Add ability to customize views/playback interval 2023-12-20 10:55:47 +01:00
Chocobozzz 49a4b8cb7d
Add stats to logger 2023-12-20 10:55:47 +01:00
Chocobozzz bca6d58676
Automatically filter on local videos in admin
We expect admins will mostly want to act on local videos
2023-12-20 10:55:47 +01:00
Chocobozzz b4f4432459
Viewers federation protocol v2
More efficient than the current one where instance is not fast enough to
send all viewers if a video becomes popular

The new protocol can be enabled by setting env
USE_VIEWERS_FEDERATION_V2='true'

Introduce a result field in View activity that contains the number of
viewers. This field is used by the origin instance to send the total
viewers on the video to remote instances. The difference with the
current protocol is that we don't have to send viewers individually to
remote instances.

There are 4 cases:
 * View activity from federation on Remote Video -> instance replaces
   all current viewers by a new viewer that contains the result counter
 * View activity from federation on Local Video -> instance adds the
   viewer without considering the result counter
 * Local view on Remote Video -> instance adds the viewer and send it to
   the origin instance
 * Local view on Local Video -> instance adds the viewer

Periodically PeerTube cleanups expired viewers. On local videos, the
instance sends to remote instances a View activity with the result
counter so they can update their viewers counter for that particular
video
2023-12-20 10:55:47 +01:00
Chocobozzz a73f476c8a
We don't need cookies for REST API 2023-12-20 10:55:47 +01:00
Chocobozzz dbdc20e673
Optimize views endpoint
Lazy write data in redis
2023-12-20 10:55:47 +01:00
Chocobozzz eba9528391
Optimize async middleware
Avoid using bluebird, a simple for/await is enought
2023-12-20 10:55:47 +01:00
Chocobozzz 9e0efe45ff
Improve tests 2023-12-20 10:55:28 +01:00
Chocobozzz 7b23f24b24
Fix thumbnail generation when on bad input seek 2023-12-19 08:23:38 +01:00
Chocobozzz c93b7088c2
Fix downloading video files from object storage
With title that contains non ISO 8859 characters
2023-12-19 07:26:09 +01:00
Chocobozzz c72d5ead39
Fix big play button skin applied to settings menu 2023-12-18 09:36:22 +01:00
Chocobozzz a043de80d2
Fix build concurrency issue 2023-12-18 09:36:08 +01:00
Chocobozzz 1e121c9898
Fix invalid state change notif of remote live 2023-12-15 15:58:07 +01:00
Chocobozzz 4662badde7
Fix privacy error on live update without privacy 2023-12-15 15:51:59 +01:00
Chocobozzz af8a47125f
Better isNewVideo variable/functions name 2023-12-15 14:52:12 +01:00
Chocobozzz bd1dd8fd95
Reload overviews page on logout 2023-12-15 11:23:03 +01:00
Chocobozzz 675f219639
Fix webtorrent crash
See https://github.com/Chocobozzz/PeerTube/issues/6109
2023-12-15 10:18:20 +01:00
Chocobozzz ea685879bb
Fix time to int parsing 2023-12-15 09:54:08 +01:00
Chocobozzz edc695263f
Escape quotes for html attributes 2023-12-14 11:33:08 +01:00
Chocobozzz 63c4a02ce0
Fix views events with lives 2023-12-14 11:12:18 +01:00
Chocobozzz d5fd8227b4
Avoid sending seek event on video start time 2023-12-14 09:52:50 +01:00
Chocobozzz 1aab639928
Bumped to version v6.0.2 2023-12-11 09:09:56 +01:00
Chocobozzz d72ac67bcd
Update changelog 2023-12-11 08:56:19 +01:00
Chocobozzz 5ca370e395
Fix lint 2023-12-08 14:04:20 +01:00
Chocobozzz 83e1e4dfb2
Fix backward compat upgrade script 2023-12-08 11:16:43 +01:00
Chocobozzz ba050fb0df
Fix displaying many countries 2023-12-08 11:07:49 +01:00
Chocobozzz 8031504212
Fix updating started live error 2023-12-08 10:20:15 +01:00
Chocobozzz ff338f7dda
Fix embed when waiting for a live 2023-12-08 10:13:08 +01:00
Chocobozzz b39214cb13
Fix tests 2023-12-08 09:34:35 +01:00
Chocobozzz e06e2da187
Fix cpu count when cpu info not available 2023-12-08 09:13:16 +01:00
Chocobozzz 64d9b7abd2
Fix client tests 2023-12-08 09:13:12 +01:00
Chocobozzz 83cba14a61
Originally published and reupload date consistency 2023-12-08 08:59:47 +01:00
Chocobozzz 8a22cfd628
Fix client URLs for channels and accounts 2023-12-08 08:57:14 +01:00
Chocobozzz 2fde12d7e1
Fix profile page JSONLD 2023-12-08 08:41:14 +01:00
Alejandro cf843c3f12 Text corrections 2023-12-06 08:45:06 +01:00
Alejandro 6966f37c4b Corrected reference to production.yaml 2023-12-06 08:45:06 +01:00
Chocobozzz 4fd8d34175
Ensure user is owned by plugin before updating it 2023-12-06 08:43:19 +01:00
Chocobozzz c6047e1573
Add missing logger tags 2023-11-29 16:31:29 +01:00
Chocobozzz f51bafb3fa
Fix chapters tests 2023-11-29 15:01:46 +01:00
Chocobozzz f9e710e7d4
Fix chapters import 2023-11-29 14:12:13 +01:00
Julien Rabier 7a953a6b2f Fix upgrade.sh when Peertube is installed outside the standard path (fixes #6063) 2023-11-29 11:03:44 +01:00
Chocobozzz d897a04565
Bumped to version v6.0.1 2023-11-29 10:20:14 +01:00
Chocobozzz 67cfea4270
Fix changelog 2023-11-29 10:19:33 +01:00
Chocobozzz df2d931f66
Update changelog 2023-11-29 10:18:47 +01:00
Chocobozzz ba56aadb63
Regenerate storyboard after studio 2023-11-29 09:58:20 +01:00
Chocobozzz 4826cb2c69
Add missing jobs in jobs list 2023-11-29 09:37:57 +01:00
Chocobozzz bda1d751a5
Add warning for web_videos directory name 2023-11-29 09:28:12 +01:00
Chocobozzz 9f9522e865
Fix release script 2023-11-29 08:33:39 +01:00
Chocobozzz 6c89755d04
Fix changelog 2023-11-29 08:16:19 +01:00
Chocobozzz ee6844d718
Fix web videos directory important notes 2023-11-29 08:10:26 +01:00
Chocobozzz c900788e59
Remove async-lru cache for jsonld
jsonld library has already a cache
2023-11-29 06:51:29 +01:00
Chocobozzz a5bdce80f6
Keep increasing storyboard generation ttl 2023-11-28 15:42:48 +01:00
Chocobozzz e25f7b97e9
Typo in changelog 2023-11-28 14:18:35 +01:00
Chocobozzz db61334cc3
Fix replace file nginx configuration 2023-11-28 14:11:07 +01:00
Chocobozzz 17f1920658
Fix CPU going to 100% on odd cpu count
See https://github.com/piscinajs/piscina/pull/457
2023-11-28 13:32:51 +01:00
Chocobozzz e3d4259e14
Bumped to version v6.0.0 2023-11-28 08:40:29 +01:00
Chocobozzz 8bb42bda52
Fix search index tests 2023-11-28 08:31:47 +01:00
Chocobozzz a0606360a7
Return 400 if filter query is still there 2023-11-28 08:08:57 +01:00
Chocobozzz d3849e9b22
Update changelog 2023-11-27 16:21:09 +01:00
Chocobozzz 13b78db38e
Cleanup input switch 2023-11-27 10:11:29 +01:00
Chocobozzz f3907ceeaf
Fix client registration performance 2023-11-27 09:15:42 +01:00
Chocobozzz 2703129a1a
Update translations 2023-11-27 08:42:40 +01:00
Chocobozzz 424108b98d
Merge remote-tracking branch 'weblate/develop' into develop 2023-11-27 08:40:57 +01:00
Chocobozzz 05d6520b22
Fix input switch accessibility 2023-11-27 08:37:20 +01:00
Ettore Atalan 14f8a9ba30 Translated using Weblate (German)
Currently translated at 97.1% (2183 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-11-25 16:12:22 +01:00
Ettore Atalan 2508492635 Translated using Weblate (German)
Currently translated at 96.2% (2162 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-11-25 15:51:38 +01:00
Ettore Atalan a2c0cade2e Translated using Weblate (German)
Currently translated at 95.7% (2151 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-11-25 15:43:11 +01:00
Ettore Atalan cc90c153e7 Translated using Weblate (German)
Currently translated at 94.6% (2126 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-11-25 15:35:38 +01:00
Ettore Atalan b1e23d9990 Translated using Weblate (German)
Currently translated at 94.5% (2124 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-11-25 15:33:00 +01:00
Ettore Atalan 491aac98e0 Translated using Weblate (German)
Currently translated at 94.5% (2123 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-11-25 00:36:04 +01:00
Chocobozzz 11f40299c5
Workaround to fix bug where CPU at 100%
Commit b017d4d02f does not seem to work
2023-11-24 18:11:11 +01:00
BGR2 77b23551b0 Translated using Weblate (Turkish)
Currently translated at 36.2% (815 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2023-11-24 14:52:02 +01:00
Chocobozzz f3e9a38d7e
Fix tests build 2023-11-24 14:51:31 +01:00
Chocobozzz b017d4d02f
Fix weird bug where CPU jumps and stays to 100%
Seems related to lazy import of custom-jsonld-signature
So we refactored jsonld function calls a little bit
2023-11-24 14:44:18 +01:00
Chocobozzz f93bc6a8be
Retry runner job db saving if needed 2023-11-24 14:44:04 +01:00
Chocobozzz 6349881dbd
Fix graph zooming end date 2023-11-23 09:40:04 +01:00
Chocobozzz 80efccf6c5
Add autofocus to password prompt 2023-11-23 08:58:53 +01:00
Chocobozzz b13460a10a
Add ability to set password from embed API 2023-11-23 08:14:54 +01:00
Chocobozzz 4c07200d64
CSS consistency on small screens 2023-11-22 08:28:22 +01:00
Chocobozzz 5ef3378534
Log piscina errors 2023-11-21 17:35:36 +01:00
Chocobozzz aeea2d864f
Limit max piscina threads bases on CPUs 2023-11-21 17:25:44 +01:00
Chocobozzz 76fc448ab4
Bumped to version v6.0.0-rc.2 2023-11-20 10:44:50 +01:00
Chocobozzz 3f50a1bf25
Update translations 2023-11-20 09:48:48 +01:00
Chocobozzz bbfa4208a0
Merge remote-tracking branch 'weblate/develop' into develop 2023-11-20 09:46:54 +01:00
Chocobozzz e7e2bb4374
Update changelog 2023-11-20 09:46:43 +01:00
Chocobozzz 79a61fa9c6
Prevent player mobile buttons flickering 2023-11-20 09:42:54 +01:00
Hồ Nhất Duy 6f3a118be8 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-11-20 07:11:20 +01:00
Aitor Salaberria d90b8678cb Translated using Weblate (Basque)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-11-20 07:11:20 +01:00
Jiri Podhorecky 82bc692d2b Translated using Weblate (Czech)
Currently translated at 99.8% (2243 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-11-20 07:11:20 +01:00
Jiri Podhorecky b68f7955b4 Translated using Weblate (Czech)
Currently translated at 98.7% (2218 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-11-20 07:11:20 +01:00
Jiri Podhorecky 734f5e10ba Translated using Weblate (Czech)
Currently translated at 98.5% (2213 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-11-20 07:11:20 +01:00
Jiri Podhorecky 6151833116 Translated using Weblate (Czech)
Currently translated at 98.1% (2205 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-11-20 07:11:19 +01:00
alex gabilondo 671d2963ec Translated using Weblate (Basque)
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/eu/
2023-11-20 07:11:19 +01:00
alex gabilondo 4fdf3a1227 Translated using Weblate (Basque)
Currently translated at 100.0% (274 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/eu/
2023-11-20 07:11:19 +01:00
DignifiedSilence fdd5c877fb Translated using Weblate (Japanese)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-11-20 07:11:19 +01:00
T.S 2f78d97127 Translated using Weblate (Japanese)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-11-20 07:11:19 +01:00
T.S 6e3700b0df Translated using Weblate (Japanese)
Currently translated at 99.4% (2234 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-11-20 07:11:19 +01:00
DignifiedSilence aad5ea84ab Translated using Weblate (Japanese)
Currently translated at 99.4% (2234 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-11-20 07:11:19 +01:00
T.S feac6c5ddd Translated using Weblate (Japanese)
Currently translated at 99.3% (2231 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-11-20 07:11:19 +01:00
Ignacio Carrera González 4e1fd1a330 Translated using Weblate (Spanish)
Currently translated at 95.2% (2139 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-11-20 07:11:19 +01:00
Jeff Huang 9c14f18f04 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-11-20 07:11:19 +01:00
josé m 76a6c7c0ae Translated using Weblate (Galician)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-11-20 07:11:19 +01:00
0que a08ce33ad0 Translated using Weblate (Russian)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-11-20 07:11:19 +01:00
Александр dadd88aa58 Translated using Weblate (Russian)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-11-20 07:11:19 +01:00
Chocobozzz d4f21493e1
Respect "transcode original resolution" for runner 2023-11-17 16:25:11 +01:00
Chocobozzz 1682b0bab0
Increase generate-video-storyboard job ttl
See https://github.com/Chocobozzz/PeerTube/issues/6029
2023-11-17 16:24:55 +01:00
Chocobozzz 92fb7a2b62
Optimize homepage videos query 2023-11-17 14:40:37 +01:00
fuomag9 1e3fd73cdf Inform the user to remove assets:/app/client/dist if not using the webserver container 2023-11-17 14:23:31 +01:00
Chocobozzz 5b43602457
Fix card font color theme 2023-11-17 11:29:08 +01:00
Chocobozzz 33c707616c
Disable p2p seeding using local storage
Used by E2E testing
2023-11-15 11:06:18 +01:00
Chocobozzz d8f846c69d
Add 'main' field to peertube types 2023-11-13 10:30:39 +01:00
Chocobozzz 929e05007c
Update translations 2023-11-09 09:05:23 +01:00
Chocobozzz 07de9791cf
Merge remote-tracking branch 'weblate/develop' into develop 2023-11-09 09:03:55 +01:00
Chocobozzz 3c668a1704
Update changelog 2023-11-09 09:03:32 +01:00
Chocobozzz 3da9fbbe39
Adapt storyboard sprite ratio 2023-11-09 09:03:32 +01:00
Chocobozzz c2cf26eaf7
Less space below player in portrait mode 2023-11-09 09:03:32 +01:00
Hồ Nhất Duy 1bda457656 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-11-09 06:41:08 +01:00
Jeff Huang 5312bb7819 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-11-09 06:41:08 +01:00
0que 538ea58d68 Translated using Weblate (Russian)
Currently translated at 99.2% (141 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ru/
2023-11-09 06:41:08 +01:00
0que 7e5a1a42c1 Translated using Weblate (Russian)
Currently translated at 98.9% (271 of 274 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/ru/
2023-11-09 06:41:08 +01:00
0que c0006c9a10 Translated using Weblate (Russian)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-11-09 06:41:08 +01:00
Mamiako Pavel 13dbea1103 Translated using Weblate (Russian)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-11-09 06:41:08 +01:00
Anatoly Bogomolov f544ef3647 Translated using Weblate (Russian)
Currently translated at 100.0% (2246 of 2246 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-11-09 06:41:08 +01:00
Sarah Lewis adfce264a6
Improve grammar within sign-up flow (#6026)
* Update signup-success-after-email.component.html

* Update signup-success-before-email.component.html
2023-11-09 06:41:03 +01:00
Chocobozzz 7ca4de2d98
Update page title and description on video change 2023-11-08 16:03:49 +01:00
Chocobozzz dbd0a3bcac
Fix player ratio on mobile with portrait videos 2023-11-08 15:56:56 +01:00
Chocobozzz ae16f5f115
Improve tools doc using code blocks
See the result on https://docs.joinpeertube.org/maintain/tools
2023-11-08 15:25:17 +01:00
Chocobozzz dbb54df6bd
Add doc to move videos to filesystem 2023-11-08 15:05:32 +01:00
Chocobozzz cc747fd67d
Uncomment doc regarding storyboard generation 2023-11-08 15:03:07 +01:00
Chocobozzz 5b394e1622
Increase test timeouts 2023-11-08 13:48:22 +01:00
Chocobozzz ee8f377515
Update codeql ci 2023-11-08 10:53:32 +01:00
Chocobozzz 2bc4d26b94
Add ability to customize frames to analyze 2023-11-08 10:18:39 +01:00
Chocobozzz 9880d2adf5
Improve changelog 2023-11-08 09:39:44 +01:00
Chocobozzz 6e613df63f
Fix notification scrolling 2023-11-07 11:19:36 +01:00
Chocobozzz 624da0b0a4
Fix live button with multiple words 2023-11-07 11:17:28 +01:00
Chocobozzz 788fa301f2
Don't send views for private videos 2023-11-07 10:46:08 +01:00
Chocobozzz 1ba8bbded0
Also use 127.0.0.1 for database and redis
Node 18 can resolve localhost to IPv6 address, where postgresql and/or
redis may listen on IPv4 only
2023-11-07 10:41:08 +01:00
Chocobozzz 2d4274769e
Fix production.yaml.new config generation 2023-11-07 10:25:15 +01:00
Chocobozzz 5dd39c07a7
Bumped to version v6.0.0-rc.1 2023-11-07 08:49:09 +01:00
Chocobozzz a193cfdd83
Update changelog 2023-11-07 08:49:06 +01:00
Chocobozzz 610f851651
Update translations 2023-11-07 08:17:32 +01:00
Chocobozzz 9b3b64cd44
Merge remote-tracking branch 'weblate/develop' into develop 2023-11-07 08:16:04 +01:00
Murat Özalp 1908e10d95 Translated using Weblate (Turkish)
Currently translated at 34.6% (775 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2023-11-06 20:26:25 +01:00
GunChleoc fbf64af51a Translated using Weblate (Gaelic)
Currently translated at 98.7% (2212 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2023-11-06 17:40:50 +01:00
Chocobozzz 193e752c44
Increase test timeouts 2023-11-06 14:04:43 +01:00
Txopi e5d6197487 Translated using Weblate (Basque)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-11-06 11:57:10 +01:00
Free coss cefdc74e26 Translated using Weblate (Arabic)
Currently translated at 96.0% (2151 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-11-06 11:57:10 +01:00
Jaz Dina 329344e869 Translated using Weblate (Spanish)
Currently translated at 95.9% (2149 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-11-06 11:57:10 +01:00
Aitor Salaberria 1f7a91c47e Translated using Weblate (Basque)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-11-06 11:57:10 +01:00
Aitor Salaberria cf1727cdd5 Translated using Weblate (Basque)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-11-06 11:57:10 +01:00
Aitor Salaberria b31a4bf682 Translated using Weblate (Basque)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-11-06 11:57:10 +01:00
Aitor Salaberria 582e3f97b0 Translated using Weblate (Basque)
Currently translated at 100.0% (142 of 142 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/eu/
2023-11-06 11:57:10 +01:00
Aitor Salaberria e7183d1ee7 Translated using Weblate (Basque)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-11-06 11:57:10 +01:00
Aitor Salaberria 8b7f1c1d80 Translated using Weblate (Spanish)
Currently translated at 94.6% (2120 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-11-06 11:57:10 +01:00
Chocobozzz a21b7a4193
Update changelog 2023-11-06 11:54:41 +01:00
Chocobozzz 4aeb1de909
Update p2p media loader 2023-11-06 11:20:23 +01:00
Chocobozzz b1fc5a9cb4
Add log level example in docker .env 2023-11-06 08:59:38 +01:00
Chocobozzz 96bb9de7d0
Fix E2E tests 2023-11-06 08:56:56 +01:00
Chocobozzz d3c9a2e5b9
Add script to move videos to file system 2023-11-02 09:21:49 +01:00
Chocobozzz 443358ccce
Reduce video comment sql query size 2023-10-31 10:02:19 +01:00
Chocobozzz 2e556debca
Fix log error 2023-10-30 14:14:19 +01:00
Chocobozzz 15f2ac7152
Fix invalid timeout 2023-10-30 11:58:43 +01:00
Chocobozzz 543fbd1ffe
Correctly display broken muxing session
Can happen when we stream an audio stream only
2023-10-30 11:57:39 +01:00
Chocobozzz ad801093b9
Simplify for loop 2023-10-30 11:17:46 +01:00
Chocobozzz 98ddba6808
Update translations 2023-10-30 11:13:13 +01:00
Chocobozzz e0c0089366
Merge remote-tracking branch 'weblate/develop' into develop 2023-10-30 11:11:51 +01:00
Aitor Salaberria c3a999d7ab Translated using Weblate (Basque)
Currently translated at 85.9% (1924 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-30 11:11:48 +01:00
Chocobozzz 04bd31bc18
Add more live latency info in stats for nerds 2023-10-30 11:08:09 +01:00
Chocobozzz a12d94f30d
Fix live start time
Use undefined to not break live edge position set by hls.js
2023-10-30 11:04:26 +01:00
Chocobozzz 19dbbdafcc
Fix local E2E timeout 2023-10-30 10:32:37 +01:00
Chocobozzz 078c97b357
Add chapter cache to time tooltip 2023-10-30 10:25:14 +01:00
Chocobozzz 4fa78cda92
Fix timetoint
01:02 was translated to 01h02m instead of 01m02s
2023-10-30 10:20:25 +01:00
Chocobozzz 22e05d15db
Fix video error handling 2023-10-30 09:55:06 +01:00
Chocobozzz f108600464
Fix CI 2023-10-30 09:09:55 +01:00
0que 15eb78797c Translated using Weblate (Russian)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ru/
2023-10-29 16:14:45 +01:00
0que 5d5255dfe9 Translated using Weblate (Russian)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/ru/
2023-10-29 16:14:45 +01:00
0que 46fc4852e8 Translated using Weblate (Russian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-10-29 16:14:45 +01:00
Aitor Salaberria 766203fa94 Translated using Weblate (Basque)
Currently translated at 85.9% (1924 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-29 16:14:44 +01:00
Aitor Salaberria 1025145c9f Translated using Weblate (Basque)
Currently translated at 85.1% (1906 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-28 23:57:47 +02:00
Aitor Salaberria 0de9ec0013 Translated using Weblate (Basque)
Currently translated at 79.8% (1787 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-28 09:02:49 +02:00
Free coss 384d219a73 Translated using Weblate (Arabic)
Currently translated at 95.9% (2148 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-27 17:16:22 +02:00
Ryan He 22ef09a1a6 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/zh_Hant/
2023-10-27 17:16:22 +02:00
Ryan He d03d340efc Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/zh_Hant/
2023-10-27 17:16:22 +02:00
Ryan He a427d1d67b Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-10-27 17:16:22 +02:00
Free coss 0aa4c0cd40 Translated using Weblate (Arabic)
Currently translated at 87.2% (1953 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-27 17:16:22 +02:00
Free coss a68dfc4feb Translated using Weblate (Arabic)
Currently translated at 86.4% (1936 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-27 17:16:22 +02:00
Free coss 22f1e6d782 Translated using Weblate (Arabic)
Currently translated at 86.2% (1931 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-27 17:16:22 +02:00
Free coss d96d921ffd Translated using Weblate (Arabic)
Currently translated at 85.5% (1916 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-27 17:16:22 +02:00
Free coss 102f4b9f80 Translated using Weblate (Arabic)
Currently translated at 85.3% (1910 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-27 17:16:22 +02:00
Free coss 3cc67f91b4 Translated using Weblate (Arabic)
Currently translated at 85.0% (1905 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-27 17:16:22 +02:00
josé m abb8ca1c32 Translated using Weblate (Galician)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-10-27 17:16:22 +02:00
Aitor Salaberria 76eae1ea77 Translated using Weblate (Basque)
Currently translated at 78.7% (1764 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-27 17:16:22 +02:00
Cokelat8 77c654adfc Translated using Weblate (Indonesian)
Currently translated at 98.0% (100 of 102 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/id/
2023-10-27 17:16:22 +02:00
Aitor Salaberria c8de359c57 Translated using Weblate (Basque)
Currently translated at 78.4% (1756 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-27 17:16:22 +02:00
Cokelat8 5b8179e758 Translated using Weblate (Indonesian)
Currently translated at 97.0% (99 of 102 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/id/
2023-10-27 17:16:22 +02:00
Cokelat8 238bb87189 Translated using Weblate (Indonesian)
Currently translated at 30.7% (75 of 244 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/id/
2023-10-27 17:16:22 +02:00
Cokelat8 20c2156b4d Translated using Weblate (Indonesian)
Currently translated at 12.8% (224 of 1748 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/id/
2023-10-27 17:16:22 +02:00
Aitor Salaberria 55530ad896 Translated using Weblate (Basque)
Currently translated at 77.4% (1734 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-27 17:16:22 +02:00
Mikel Gartzia Santamaria f7f326a083 Translated using Weblate (Basque)
Currently translated at 77.2% (1730 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-27 17:16:22 +02:00
Aitor Salaberria ca0a77be53 Translated using Weblate (Basque)
Currently translated at 77.2% (1730 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-27 17:16:22 +02:00
Aitor Salaberria 90cf61ec62 Translated using Weblate (Basque)
Currently translated at 71.5% (1601 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-27 17:16:22 +02:00
Aitor Salaberria 252999db9a Translated using Weblate (Basque)
Currently translated at 67.3% (1508 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-27 17:16:22 +02:00
Chocobozzz 507467b6a6
Fix local e2e tests 2023-10-27 16:53:41 +02:00
Chocobozzz 880f8b924d
Add worker thread completed OTEL metric 2023-10-27 14:40:53 +02:00
Chocobozzz 049f50bc32
Fix start time with web video player 2023-10-27 14:29:40 +02:00
Chocobozzz 2809ebbc20
Fix playlist element title overflow 2023-10-27 11:27:10 +02:00
Chocobozzz 414875a220
Fix running server in E2E tests 2023-10-27 10:44:01 +02:00
Chocobozzz 0c63b37eb3
Remove unnecessary wdio services
See https://webdriver.io/blog/2023/07/31/driver-management/
2023-10-27 10:22:38 +02:00
Chocobozzz 09ab8e577c
Increase timeouts 2023-10-26 16:41:19 +02:00
Chocobozzz a2d5c2d44f
Add worker thread queue metrics 2023-10-26 16:34:54 +02:00
Chocobozzz bbd7de5c9d
CI can be very slow 2023-10-26 15:23:07 +02:00
Chocobozzz 606c044dc8
Fix uploading empty master playlist on s3 2023-10-26 15:14:14 +02:00
Chocobozzz 3bd4637014
Also skip count for recommendation fallback 2023-10-26 14:50:20 +02:00
Chocobozzz f9bbcd4ba2
Fix stats X axis with old videos 2023-10-26 14:43:50 +02:00
Chocobozzz 40a6dcb632
Optimize video views redis calls
Try to avoid them if we can
2023-10-26 14:08:19 +02:00
Chocobozzz 0f21769205
Don't log http request to benchmark views api 2023-10-26 12:30:34 +02:00
Chocobozzz de862fd0e7
Optimize video viewer stats
Many Redis (and so network) calls can be expensive
Avoid them if we can by using in memory cache
2023-10-26 11:35:55 +02:00
Chocobozzz 8ecf95471d
Also remove video session on muxing error 2023-10-26 09:07:26 +02:00
Chocobozzz dd7de7e32d
Don't add a LIMIT 1 to prevent seq scan 2023-10-26 08:36:53 +02:00
Chocobozzz d3dd952cc5
Try to optimize tagsOneOf/tagsAllOf SQL queries
Using a CTE because the query will probably return a few results
I tried a IN clause but PG doesn't seem to be more efficient with it
The CTE seems to be the only choice
2023-10-25 16:15:41 +02:00
Chocobozzz a290fbf821
Add isLive DB index 2023-10-25 15:07:36 +02:00
Chocobozzz 82813e9739
Optimize infohash SQL query
We need to use the array operator to use GIN index
2023-10-25 15:04:00 +02:00
Chocobozzz 360439088d
Skip counting for recommended videos 2023-10-25 14:55:06 +02:00
Chocobozzz cb38deb288
Process unicast job in a worker too
Signing the request can take a long time
2023-10-25 09:43:57 +02:00
Chocobozzz 90db2b3aed
Add ability to disable HTTP logs 2023-10-24 10:57:41 +02:00
Chocobozzz edc3ff6085
Sign JSON objects in worker threads 2023-10-24 10:45:17 +02:00
Chocobozzz 9e2166a16f
Prepare changelog 2023-10-23 14:16:15 +02:00
Chocobozzz 004c9779d2
Update translations 2023-10-23 09:07:08 +02:00
Chocobozzz 40723fb79d
Merge remote-tracking branch 'weblate/develop' into develop 2023-10-23 08:57:59 +02:00
Chocobozzz 18dd8fd541
Upgrade ng-select to fix cross icon accessibility 2023-10-23 08:57:24 +02:00
Aitor Salaberria decc4f7945 Translated using Weblate (Basque)
Currently translated at 66.3% (1486 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-22 21:32:17 +02:00
Free coss 583340a6ce Translated using Weblate (Arabic)
Currently translated at 85.1% (1907 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-22 16:51:05 +02:00
Free coss 1839e9a987 Translated using Weblate (Arabic)
Currently translated at 80.3% (1798 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-22 14:15:51 +02:00
Aitor Salaberria 4dbb9575fc Translated using Weblate (Basque)
Currently translated at 64.8% (1451 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-22 14:15:45 +02:00
Aitor Salaberria b0c8bb3bd9 Translated using Weblate (Basque)
Currently translated at 63.2% (1416 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-22 13:20:39 +02:00
Aitor Salaberria fb5d877dc2 Translated using Weblate (Basque)
Currently translated at 58.3% (1306 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-22 01:23:57 +02:00
Aitor Salaberria 3cf52ac344 Translated using Weblate (Basque)
Currently translated at 56.4% (1265 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-21 20:14:11 +02:00
Aitor Salaberria 17f5bdea01 Translated using Weblate (Basque)
Currently translated at 55.9% (1252 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-21 18:33:06 +02:00
Aitor Salaberria e914cf7353 Translated using Weblate (Basque)
Currently translated at 55.2% (1236 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-21 14:00:44 +02:00
Hồ Nhất Duy 0687f186ed Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-10-21 06:26:12 +02:00
Filip Hanes d178c11e08 Translated using Weblate (Slovak)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sk/
2023-10-20 17:31:00 +02:00
Александр 6ed7db797a Translated using Weblate (Russian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-10-20 17:31:00 +02:00
DignifiedSilence a0d290deb9 Translated using Weblate (Japanese)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-10-20 17:31:00 +02:00
Free coss 3c5bb11db6 Translated using Weblate (Arabic)
Currently translated at 80.1% (1794 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-20 17:31:00 +02:00
Jeff Huang 385c55eac8 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-10-20 17:31:00 +02:00
Ihor Hordiichuk d3c41554e6 Translated using Weblate (Ukrainian)
Currently translated at 98.5% (2207 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-10-20 17:31:00 +02:00
Александр 5a3cc6fac5 Translated using Weblate (Russian)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-10-20 17:31:00 +02:00
josé m 85e16cf2d5 Translated using Weblate (Galician)
Currently translated at 100.0% (2239 of 2239 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-10-20 17:31:00 +02:00
Chocobozzz b7f1bc0c33
Fix misc endpoints tests 2023-10-20 17:30:46 +02:00
Chocobozzz 521face89e
Add embed info jsonld in embeds too 2023-10-20 16:15:45 +02:00
Chocobozzz 757ffb2a69
Add peertube version info in openapi doc 2023-10-20 16:09:08 +02:00
Chocobozzz 53fdb2e83e
Fix server build 2023-10-20 16:05:38 +02:00
Chocobozzz a74fe0b69a
Remove unused polyfill
Only needed by ios versions we don't support anymore
2023-10-20 16:00:53 +02:00
Chocobozzz 8e15a31e98
Fix overflow on videos list pages 2023-10-20 16:00:36 +02:00
Chocobozzz f90db24233
Fix SEO and refactor HTML pages generation
* Split methods in multiple classes
 * Add JSONLD tags in embed too
 * Index embeds but use a canonical URL tag (targeting the watch page)
 * Remote objects don't include a canonical URL tag anymore. Instead we
   forbid indexation
 * Canonical URLs now use the official short URL (/w/, /w/p, /a, /c
   etc.)
2023-10-20 16:00:36 +02:00
Chocobozzz e731f4b724
Fix sitemap URL for accounts and channels 2023-10-20 16:00:36 +02:00
Chocobozzz 58daa2d97b
More flexible way to forbid indexation 2023-10-20 16:00:36 +02:00
Chocobozzz 272a902b2a
Optimize video thumbnail generation
Process images in worker threads
Reduce ffmpeg calls
2023-10-20 16:00:36 +02:00
Wicklow ea6c2b064f
Allow to change the default channel name (#6000)
* Allow to change the default channel name

* Fix tests

* Fix tests

* Fix tests
2023-10-19 15:22:00 +02:00
Chocobozzz ae468445b2
Increase other test timeouts 2023-10-18 15:57:11 +02:00
Chocobozzz 0397b31efe
Reduce views tests load 2023-10-18 15:53:17 +02:00
Chocobozzz 830907ec93
Increase test timeouts 2023-10-18 15:53:08 +02:00
Chocobozzz 3546128f95
Workaround to bullmq undefined jobs 2023-10-18 15:46:18 +02:00
Chocobozzz ea01bf0167
Increase tests timeout 2023-10-13 09:59:59 +02:00
Chocobozzz 75d5a23dbc
Prevent error when removing a streaming playlist 2023-10-13 09:59:18 +02:00
Chocobozzz 81a51d4bb1
Fix chapters markers in progress bar
Fix when we update the video source
Fix when we don't have the video duration yet when creating markers
2023-10-12 16:03:20 +02:00
Chocobozzz 58fda6d416
Fix upload with chapters having non int timecode 2023-10-12 15:32:01 +02:00
Chocobozzz ed0852f1b8
Update translations 2023-10-12 15:19:52 +02:00
Free coss 4b428a7e76 Translated using Weblate (Arabic)
Currently translated at 78.3% (1749 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-12 15:17:51 +02:00
Free coss 37b4c33ab9 Translated using Weblate (Arabic)
Currently translated at 75.3% (1682 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-12 15:17:51 +02:00
Free coss bce22ae0a9 Translated using Weblate (Arabic)
Currently translated at 75.2% (1680 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-12 15:17:51 +02:00
Free coss 2c926a6933 Translated using Weblate (Arabic)
Currently translated at 74.1% (1655 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-12 15:17:51 +02:00
Free coss d8e7e759a1 Translated using Weblate (Arabic)
Currently translated at 74.0% (1652 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-12 15:17:51 +02:00
Milo Ivir f95073d75a Translated using Weblate (Croatian)
Currently translated at 100.0% (2232 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-10-12 15:17:51 +02:00
Hồ Nhất Duy 632c1e950d Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2232 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-10-12 15:17:51 +02:00
Aitor Salaberria 84f24c1c4c Translated using Weblate (Basque)
Currently translated at 55.4% (1237 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-12 15:17:51 +02:00
Free coss aa41099522 Translated using Weblate (Arabic)
Currently translated at 73.5% (1641 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-12 15:17:51 +02:00
Aitor Salaberria 916964291a Translated using Weblate (Basque)
Currently translated at 55.0% (1228 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-12 15:17:51 +02:00
Aitor Salaberria 5a4667a578 Translated using Weblate (Basque)
Currently translated at 54.4% (1215 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-12 15:17:51 +02:00
Aitor Salaberria 2c054f7d37 Translated using Weblate (Basque)
Currently translated at 53.7% (1200 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-12 15:17:51 +02:00
chocobozzz 688dfa7399 Translated using Weblate (French (France) (fr_FR))
Currently translated at 92.2% (2059 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2023-10-12 15:17:51 +02:00
Jeff Huang 1253174105 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2232 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-10-12 15:17:51 +02:00
Ihor Hordiichuk f14f622343 Translated using Weblate (Ukrainian)
Currently translated at 98.5% (2200 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-10-12 15:17:51 +02:00
Александр db337cd1d5 Translated using Weblate (Russian)
Currently translated at 100.0% (2232 of 2232 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-10-12 15:17:51 +02:00
Chocobozzz c6d2384aa7
Fix global buttons accessibility 2023-10-12 15:01:17 +02:00
Chocobozzz d3ae2e9c80
Fix feed button 2023-10-12 14:24:48 +02:00
Chocobozzz ce3d17388d
Fix remove file buttons accessibility 2023-10-12 14:24:38 +02:00
Chocobozzz e94160c770
Fix playlist buttons accessibility 2023-10-12 14:24:22 +02:00
Chocobozzz 44e12dc809
Update bullmq dependency 2023-10-12 09:29:45 +02:00
Chocobozzz a1c96a63a0
Better videos list header styling 2023-10-12 09:06:40 +02:00
Chocobozzz 5bd42bbca7
Fix resumable tests 2023-10-11 16:17:11 +02:00
Chocobozzz 7243393272
Fix signup and import 2023-10-11 15:58:16 +02:00
Chocobozzz 71ba1ead4f
Fix types test 2023-10-11 15:29:11 +02:00
Chocobozzz fca58de835
Fix runner test 2023-10-11 15:13:54 +02:00
Chocobozzz 678ae8abbd
Breaking: only support node 18
Node 16 is not supported anymore

See https://nodejs.org/fr/blog/announcements/nodejs16-eol
2023-10-11 13:59:24 +02:00
Chocobozzz 13f07161f5
Do not display only "Older" period 2023-10-11 11:56:03 +02:00
Chocobozzz e2c7e58f42
Fix input switch accessibility 2023-10-11 11:49:15 +02:00
Chocobozzz 30ad7fdf69
Upgrade client dependencies 2023-10-11 11:42:57 +02:00
Chocobozzz 2db1f3238d
Update server dependencies 2023-10-11 11:06:34 +02:00
Chocobozzz 066efd4b94
Add tooltip to know we can sort the column 2023-10-11 09:20:09 +02:00
Chocobozzz d0cd721254
Fix focus visible on table row 2023-10-10 11:00:11 +02:00
Chocobozzz 58036ff463
Fix focus on table header cell with sort 2023-10-10 10:56:25 +02:00
Chocobozzz dc5564258f
Fix focus information on table checkboxes 2023-10-10 10:49:22 +02:00
Chocobozzz bc80e45a09
Fix table expand button accessibility 2023-10-10 09:16:33 +02:00
Chocobozzz 0d0b5ac08d
Fix custom bootstrap helpers margins/paddings 2023-10-10 09:11:50 +02:00
Chocobozzz cf5ab8abf2
Add focus to important elements with tooltip 2023-10-10 09:04:56 +02:00
Chocobozzz 57abac459b
Fix registration button style 2023-10-10 08:41:35 +02:00
Chocobozzz 905a40217d
Fix logged in hotkeys 2023-10-10 08:35:53 +02:00
Chocobozzz 0bb768a712
padding/margin inline is supported by ios 12.1
So we don't need the @supports CSS rule anymore
2023-10-09 16:11:51 +02:00
Chocobozzz 50e415e12e
Allow to disable all hotkeys
Added angular2-hotkeys dependency inside PeerTube, to tweak some
settings

It will also allow us to support non latin keyboard in the future as we
can choose the "mouse trap" dependency
2023-10-09 15:33:19 +02:00
Chocobozzz e6b455b4ea
Better title for the date component 2023-10-09 10:19:06 +02:00
Chocobozzz 9b879f69c4
Fix video playlist miniature tabindex 2023-10-09 10:09:17 +02:00
Chocobozzz f47762c60b
Add global skip link
Don't use routerLink as some pages react on route params changes
Prefer to programmatically focus the main content if we can
2023-10-09 10:07:03 +02:00
Chocobozzz bd4b321b0b
Add missing autocomplete fields 2023-10-09 09:50:59 +02:00
Chocobozzz 31a67bc620
Add placeholder to contact email input 2023-10-09 09:49:07 +02:00
Chocobozzz 62dd3ad573
Explain the filter button will close the filters 2023-10-09 09:41:54 +02:00
Chocobozzz be42d9a2b4
Add radiogroup role 2023-10-09 09:38:08 +02:00
Chocobozzz f84002001a
Fix search input accessibility label 2023-10-09 09:28:58 +02:00
Chocobozzz 28af325f99
Fix x overflow for search results 2023-10-09 09:21:43 +02:00
Chocobozzz a41c908370
Improve simple/advanced search accessibility 2023-10-06 16:42:06 +02:00
Chocobozzz f547ab7dd1
Fix tables on small devices 2023-10-06 15:13:50 +02:00
Chocobozzz 52319e371f
Fix top sub menu accessibility 2023-10-06 14:56:29 +02:00
Chocobozzz 8d20c8f391
Prevent setting color attribute on loading bar
Fire accessibility/HTML guidelines warnings/errors
2023-10-06 11:29:13 +02:00
Chocobozzz 04bc2e2dbe
Use lists for the left menu 2023-10-06 11:23:12 +02:00
Chocobozzz dcf5075ae4
Use <header> and <main> 2023-10-06 10:47:39 +02:00
Chocobozzz 2861397f9d
Replace <menu> by <nav> for left menu 2023-10-06 10:45:42 +02:00
Chocobozzz 7938f1d5e6
Use h1 for hotkeys modal
And so hide what's behind the modal
2023-10-06 10:41:45 +02:00
Chocobozzz 1019aaf8e7
Avoid multiple <br /> tags 2023-10-06 10:29:42 +02:00
Chocobozzz 743db867f2
Remove invalid role on noscript tag 2023-10-06 10:19:58 +02:00
Chocobozzz 55d7e361f5
Add alert role to form error messages 2023-10-06 10:19:20 +02:00
Chocobozzz 54f16adca8
Add accessibility role to notification div 2023-10-06 10:17:44 +02:00
Chocobozzz 27243f96f1
Improve left menu toggle accessibility 2023-10-06 10:08:51 +02:00
Chocobozzz ce99886db6
Improve search bar accessibility
Also remove the "X" icon from Chrome we don't want
2023-10-06 09:59:21 +02:00
Chocobozzz e049e3ec73
Remove unused file 2023-10-06 09:59:18 +02:00
Chocobozzz c5397bd066
Fix broadcast dismiss icon accessibility 2023-10-05 16:30:08 +02:00
Chocobozzz 84bcfdaeff
Add scope="col" to column headers 2023-10-05 16:20:15 +02:00
Chocobozzz d6a31f9bef
Improve accessibility of empty column header 2023-10-05 16:13:12 +02:00
Chocobozzz 0ac3820f4d
Improve hotkeys popup accessibility 2023-10-05 15:56:36 +02:00
Chocobozzz 4d61e5ef9c
Improve video miniature link label accessibility 2023-10-05 15:43:24 +02:00
Chocobozzz 46dd167df6
Fix placeholder accesibility 2023-10-05 15:24:32 +02:00
Chocobozzz f85ace9ebb
Improve alert links accessibility 2023-10-05 15:20:24 +02:00
Chocobozzz e5eefaf7a5
Use aria hidden for global icons
We use them in buttons/links that already have accessible context
(title, content or label) or just as decorative icons (in menu for
example)
2023-10-05 15:05:24 +02:00
Chocobozzz 516479f113
Try to use atomic move for runner live 2023-10-05 11:09:11 +02:00
Chocobozzz d970837922
Fix test paths 2023-10-04 15:40:33 +02:00
Chocobozzz 5a3d0650c9
server/server -> server/core 2023-10-04 15:13:25 +02:00
Chocobozzz 114327d4ce
Fix margin with big resolution labels 2023-10-04 14:08:01 +02:00
Chocobozzz 9257243620
Fix hls tests 2023-10-04 11:12:29 +02:00
Chocobozzz 0112cd3851
Update translations 2023-10-04 10:06:21 +02:00
Aitor Salaberria 195d724014 Translated using Weblate (Basque)
Currently translated at 51.5% (1149 of 2231 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-04 10:01:10 +02:00
Ihor Hordiichuk 557a80b30b Translated using Weblate (Ukrainian)
Currently translated at 98.3% (2195 of 2231 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-10-04 10:01:10 +02:00
Jeff Huang aea1fd022c Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2231 of 2231 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-10-04 10:01:10 +02:00
nexi 4fdf489324 Translated using Weblate (Serbian (cyrillic))
Currently translated at 14.6% (256 of 1747 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sr_Cyrl/
2023-10-04 10:01:10 +02:00
Filip Hanes db6f6950dd Translated using Weblate (Slovak)
Currently translated at 100.0% (234 of 234 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/sk/
2023-10-04 10:01:10 +02:00
Filip Hanes c015394fd4 Translated using Weblate (Slovak)
Currently translated at 100.0% (2231 of 2231 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sk/
2023-10-04 10:01:10 +02:00
Александр a655a8a100 Translated using Weblate (Russian)
Currently translated at 100.0% (2231 of 2231 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-10-04 10:01:10 +02:00
Vri 62b2ee85c4 Translated using Weblate (German)
Currently translated at 95.4% (2129 of 2231 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-10-04 10:01:10 +02:00
Chocobozzz d0f8a0e677
Fix mime type handling from remote instances 2023-10-04 09:59:27 +02:00
Chocobozzz fbc7f1a00d
Fix video quality on high resolution/fps 2023-10-04 09:21:14 +02:00
Chocobozzz 1611721c9b
Fix feed audio file mimetype 2023-10-03 12:20:11 +02:00
Chocobozzz 5cea8f9567
Prevent remote subscribe on accounts
Which is not supported by PeerTube
2023-10-03 10:20:29 +02:00
Chocobozzz 3601872153
Support empty value returned by video get filter 2023-10-03 09:36:00 +02:00
Wicklow 9864a0cae1
Add brazilian option for video/captions languages (#5971)
* Add brazilian option for video/captions languages

* Respect default local region
2023-10-02 11:54:13 +02:00
Johnny Jazeix 86731e752a
Add Valencian option for video/captions languages (#5975) 2023-10-02 11:53:32 +02:00
Chocobozzz 4f718651dd
Update translations 2023-10-02 11:51:32 +02:00
chocobozzz 2c4065958e Translated using Weblate (Icelandic)
Currently translated at 100.0% (2226 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-10-02 11:42:56 +02:00
Filip Hanes 691523f1b0 Translated using Weblate (Slovak)
Currently translated at 100.0% (98 of 98 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/sk/
2023-10-02 11:24:51 +02:00
Filip Hanes 3b4d5a882f Translated using Weblate (Slovak)
Currently translated at 97.8% (229 of 234 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/sk/
2023-10-02 11:24:51 +02:00
Filip Hanes a5a12bac9b Translated using Weblate (Slovak)
Currently translated at 89.3% (1990 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sk/
2023-10-02 11:24:51 +02:00
Aitor Salaberria 5e46d4a0df Translated using Weblate (Basque)
Currently translated at 48.5% (1081 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-02 11:24:51 +02:00
Filip Hanes b84a741b78 Translated using Weblate (Slovak)
Currently translated at 2.3% (52 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sk/
2023-10-02 11:24:51 +02:00
Aitor Salaberria 923e636543 Translated using Weblate (Basque)
Currently translated at 43.3% (965 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-02 11:24:51 +02:00
Aitor Salaberria 71fe133884 Translated using Weblate (Basque)
Currently translated at 41.4% (923 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-02 11:24:51 +02:00
Jeston Tan 9156f3f5a0 Translated using Weblate (Chinese (Simplified))
Currently translated at 90.6% (2017 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hans/
2023-10-02 11:24:51 +02:00
Txopi 2839f33682 Translated using Weblate (Basque)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/eu/
2023-10-02 11:24:51 +02:00
Aitor Salaberria 27f274bf28 Translated using Weblate (Basque)
Currently translated at 41.1% (917 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-02 11:24:51 +02:00
Aitor Salaberria d79884cf72 Translated using Weblate (Basque)
Currently translated at 40.6% (904 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-10-02 11:24:51 +02:00
Neko Nekowazarashi 45ec230569 Translated using Weblate (Indonesian)
Currently translated at 96.0% (98 of 102 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/id/
2023-10-02 11:24:51 +02:00
Neko Nekowazarashi eb0e9180dd Translated using Weblate (Indonesian)
Currently translated at 29.9% (73 of 244 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/id/
2023-10-02 11:24:50 +02:00
Free coss 86f7074458 Translated using Weblate (Arabic)
Currently translated at 71.3% (1589 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-02 11:24:50 +02:00
Victor Hampel 9c64a6e0ab Translated using Weblate (German)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/de/
2023-10-02 11:24:50 +02:00
Victor Hampel 13e8f300a8 Translated using Weblate (German)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/de/
2023-10-02 11:24:50 +02:00
Free coss 9099a91c13 Translated using Weblate (Arabic)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/ar/
2023-10-02 11:24:50 +02:00
Free coss dcc907e1ec Translated using Weblate (Arabic)
Currently translated at 71.3% (1589 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-02 11:24:50 +02:00
Eric Guichaoua 2198aa190d Translated using Weblate (French (France) (fr_FR))
Currently translated at 92.5% (2061 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2023-10-02 11:24:50 +02:00
Jim Kats fd6db1cb34 Translated using Weblate (Greek)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/el/
2023-10-02 11:24:50 +02:00
Jim Kats f67ab92939 Translated using Weblate (Greek)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/el/
2023-10-02 11:24:50 +02:00
Jim Kats cc66b565df Translated using Weblate (Greek)
Currently translated at 45.7% (1019 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/el/
2023-10-02 11:24:50 +02:00
Jim Kats ad9a4006e8 Translated using Weblate (Greek)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/el/
2023-10-02 11:24:50 +02:00
Free coss e687f6fbc6 Translated using Weblate (Arabic)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ar/
2023-10-02 11:24:50 +02:00
Free coss 3e81eeab51 Translated using Weblate (Arabic)
Currently translated at 70.8% (1577 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-10-02 11:24:50 +02:00
Hồ Nhất Duy 5b05d5dc8d Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2226 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-10-02 11:24:50 +02:00
nexi 948fade981 Translated using Weblate (Serbian (cyrillic))
Currently translated at 100.0% (102 of 102 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/sr_Cyrl/
2023-10-02 11:24:50 +02:00
Jiri Podhorecky 4f36f466f3 Translated using Weblate (Czech)
Currently translated at 98.9% (2202 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-10-02 11:24:50 +02:00
Besnik Bleta 8b1165d13a Translated using Weblate (Albanian)
Currently translated at 98.5% (139 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/sq/
2023-10-02 11:24:50 +02:00
no b208072eec Translated using Weblate (Albanian)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/sq/
2023-10-02 11:24:50 +02:00
Balázs Meskó 044af75497 Translated using Weblate (Hungarian)
Currently translated at 73.2% (1631 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2023-10-02 11:24:50 +02:00
nexi f51c1cb71c Translated using Weblate (Serbian (cyrillic))
Currently translated at 14.5% (255 of 1747 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sr_Cyrl/
2023-10-02 11:24:50 +02:00
Александр 1ad14eb413 Translated using Weblate (Russian)
Currently translated at 99.9% (2225 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-10-02 11:24:50 +02:00
GunChleoc fb6a5539ea Translated using Weblate (Gaelic)
Currently translated at 100.0% (2226 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2023-10-02 11:24:50 +02:00
GunChleoc 85abebf5a6 Translated using Weblate (Gaelic)
Currently translated at 99.9% (2224 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2023-10-02 11:24:50 +02:00
nexi 03ffad7e14 Translated using Weblate (Serbian (cyrillic))
Currently translated at 100.0% (102 of 102 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/sr_Cyrl/
2023-10-02 11:24:50 +02:00
nexi 058d0bbe88 Translated using Weblate (Serbian (cyrillic))
Currently translated at 14.5% (254 of 1747 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sr_Cyrl/
2023-10-02 11:24:49 +02:00
nexi 8207c94dbc Translated using Weblate (Serbian (cyrillic))
Currently translated at 100.0% (244 of 244 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/sr_Cyrl/
2023-10-02 11:24:49 +02:00
Milo Ivir 6d706b6796 Translated using Weblate (Croatian)
Currently translated at 100.0% (2226 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-10-02 11:24:49 +02:00
Milo Ivir 4bbd1b9632 Translated using Weblate (Croatian)
Currently translated at 99.8% (2223 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-10-02 11:24:49 +02:00
Milo Ivir 228b46ec80 Translated using Weblate (Croatian)
Currently translated at 99.8% (2222 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-10-02 11:24:49 +02:00
josé m fa1b0eb4d9 Translated using Weblate (Galician)
Currently translated at 100.0% (2226 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-10-02 11:24:49 +02:00
DignifiedSilence cddd451af8 Translated using Weblate (Japanese)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ja/
2023-10-02 11:24:49 +02:00
T.S cdf0e4cc1e Translated using Weblate (Japanese)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ja/
2023-10-02 11:24:49 +02:00
DignifiedSilence 3d0e097113 Translated using Weblate (Japanese)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/ja/
2023-10-02 11:24:49 +02:00
DignifiedSilence b60db6ebe3 Translated using Weblate (Japanese)
Currently translated at 100.0% (2226 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-10-02 11:24:49 +02:00
Sveinn í Felli 712d69af01 Translated using Weblate (Icelandic)
Currently translated at 100.0% (2226 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-10-02 11:24:49 +02:00
Jeff Huang d67541f3c8 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2226 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-10-02 11:24:49 +02:00
Payman Moghadam 3314c76ec5 Translated using Weblate (Persian)
Currently translated at 97.7% (2177 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-10-02 11:24:49 +02:00
Ihor Hordiichuk 36c73a9aef Translated using Weblate (Ukrainian)
Currently translated at 98.5% (2194 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-10-02 11:24:49 +02:00
GunChleoc f2a6020934 Translated using Weblate (Gaelic)
Currently translated at 96.5% (2150 of 2226 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2023-10-02 11:24:48 +02:00
Chocobozzz 1022e27309
Fix live replay privacy change 2023-09-01 16:47:25 +02:00
Chocobozzz a1d9318066
Stop live before removing files 2023-09-01 13:16:27 +02:00
Chocobozzz d38a49463f
Fix disabling object storage ACL in docker 2023-09-01 11:41:38 +02:00
Julien Rabier 0216c3485d Fix path to Peertube installation in upgrade.sh 2023-09-01 11:07:37 +02:00
Chocobozzz d2640682f6
Fix atom feed with science and technology category 2023-09-01 10:09:10 +02:00
Chocobozzz 0cc1a69881
Avoid federation error logs with likes on notes 2023-09-01 09:58:13 +02:00
Chocobozzz c4799cd1b9
Avoid illegal characters in torrent filename 2023-09-01 09:55:08 +02:00
Chocobozzz ca8a00d0e7
Fix ERR_HTTP_HEADERS_SENT crash 2023-09-01 09:27:57 +02:00
Chocobozzz 69601b66fe
Fix tests 2023-08-30 20:19:56 +02:00
Chocobozzz 6495764268
Fix chapters extract 2023-08-30 19:24:01 +02:00
Chocobozzz 76dbe843d1
Merge branch 'release/5.2.0' into develop 2023-08-30 19:03:03 +02:00
Chocobozzz 0c302acb3c
Bumped to version v5.2.1 2023-08-30 18:35:48 +02:00
Chocobozzz 995599654e
Update changelog 2023-08-30 18:35:12 +02:00
Chocobozzz d8a80446da
Reduce ffmpeg thumbnail generation load
Can also lead to memory issues with big values (default is 100)
2023-08-28 17:50:47 +02:00
Chocobozzz 6b44f0b03c
Publish new version of peertube runner 2023-08-28 17:50:24 +02:00
Chocobozzz 9f4bdf3915
Add Guadeloupean language support 2023-08-28 17:11:27 +02:00
Chocobozzz fe1e3535fd
Ping runners on job abort/error 2023-08-28 16:59:45 +02:00
Chocobozzz 6a85ec0480
Also handle SIGTERM to cleanup jobs 2023-08-28 16:52:08 +02:00
Chocobozzz e23b95a901
Fix loading spinner displayed forever on chrome 2023-08-28 16:42:32 +02:00
Chocobozzz 8ed4b82346
Fix tests build 2023-08-28 16:42:32 +02:00
Chocobozzz 80a94b04fb
Fix loading spinner displayed forever on chrome 2023-08-28 16:42:05 +02:00
Alejandro d6aeed4359 Corrected storage tmp location 2023-08-28 16:20:36 +02:00
Chocobozzz 77b70702d2
Add video chapters support 2023-08-28 16:17:31 +02:00
Chocobozzz 7113f32a87
Fix build 2023-08-21 15:55:54 +02:00
Chocobozzz 4d3ea87486
More robust about page
Don't throw if we can't find a category or a language
Can happen if the instance configuration contains a category/language
that has been deleted by a plugin for example
2023-08-21 15:32:33 +02:00
Chocobozzz ab5f1356b9
Try to fix github ci 2023-08-21 15:04:33 +02:00
Chocobozzz 0d87602a20
Optimize update host script 2023-08-18 14:21:04 +02:00
Chocobozzz 273d57023b
Update translations 2023-08-18 14:12:32 +02:00
Chocobozzz a4a8ccdfb6
Merge remote-tracking branch 'weblate/develop' into develop 2023-08-18 13:44:29 +02:00
Chocobozzz c74dc602a6
Simplify table pagination footer 2023-08-18 13:43:59 +02:00
Chocobozzz 863ef63805
Fix typo 2023-08-18 13:43:55 +02:00
GunChleoc f0e7993e46 Translated using Weblate (Gaelic)
Currently translated at 96.2% (2155 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2023-08-18 12:26:38 +02:00
Txopi 7c827e0b1a Translated using Weblate (Basque)
Currently translated at 38.7% (867 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-08-18 12:26:38 +02:00
GunChleoc c6660368e9 Translated using Weblate (Gaelic)
Currently translated at 94.3% (2113 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2023-08-18 12:26:38 +02:00
GunChleoc 7f8601bc5d Translated using Weblate (Gaelic)
Currently translated at 92.5% (2074 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2023-08-18 12:26:38 +02:00
GunChleoc ea4ae0abdc Translated using Weblate (Gaelic)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/gd/
2023-08-18 12:26:38 +02:00
GunChleoc 6fd18713a5 Translated using Weblate (Gaelic)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/gd/
2023-08-18 12:26:38 +02:00
GunChleoc 49eda08643 Translated using Weblate (Gaelic)
Currently translated at 91.5% (2050 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gd/
2023-08-18 12:26:38 +02:00
Txopi d952a2b787 Translated using Weblate (Basque)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/eu/
2023-08-18 12:26:38 +02:00
Txopi 89cc743dd5 Translated using Weblate (Basque)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/eu/
2023-08-18 12:26:38 +02:00
jinubook fe86ac023a Translated using Weblate (Korean)
Currently translated at 9.5% (214 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ko/
2023-08-18 12:26:38 +02:00
Mamiako Pavel 3ca4ccc9ad Translated using Weblate (Russian)
Currently translated at 100.0% (2240 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-08-18 12:26:38 +02:00
Александр 7a6b5776e4 Translated using Weblate (Russian)
Currently translated at 100.0% (2240 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-08-18 12:26:38 +02:00
Renne Rocha 3da9cb2aa8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 63.2% (1416 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2023-08-18 12:26:37 +02:00
Milo Ivir 5eb669472e Translated using Weblate (Croatian)
Currently translated at 100.0% (2240 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-08-18 12:26:37 +02:00
Timur Seber b1e9f22815 Translated using Weblate (Tatar)
Currently translated at 1.4% (32 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tt/
2023-08-18 12:26:37 +02:00
Jeff Huang b591c569ec Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2240 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-08-18 12:26:37 +02:00
Hồ Nhất Duy 0112fa45ad Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2240 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-08-18 12:26:37 +02:00
Ihor Hordiichuk cd3d5c22dd Translated using Weblate (Ukrainian)
Currently translated at 98.4% (2206 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-08-18 12:26:37 +02:00
Timur Seber e65135150a Added translation using Weblate (Tatar) 2023-08-18 12:26:37 +02:00
Александр 909fac516c Translated using Weblate (Russian)
Currently translated at 100.0% (2240 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-08-18 12:26:37 +02:00
Txopi ce2e0ae23d Translated using Weblate (Basque)
Currently translated at 37.2% (835 of 2240 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-08-18 12:26:37 +02:00
Chocobozzz cb909ab38a
Fix security.txt test 2023-08-18 11:54:55 +02:00
Chocobozzz 64cb55fcb1
Correctly handle optional replay setting 2023-08-18 11:52:12 +02:00
Chocobozzz 18570bee99
Add unset originallyPublishedAt test 2023-08-18 11:50:36 +02:00
Chocobozzz 18987248f6
Add test without replay settings object 2023-08-18 11:45:16 +02:00
Chocobozzz 7ace48819e
Add ability to reset originallyPublishedAt 2023-08-18 11:40:54 +02:00
Chocobozzz ca589b42f1
Fix button router link
Using the default one assigns the directive to the host, where we just
want to put it inside the `my-button` component
2023-08-18 11:09:34 +02:00
Chocobozzz c925e99ca4
Fix helper tests 2023-08-18 10:52:53 +02:00
Chocobozzz 90b84bd4bb
Fix live replay setting breaking change 2023-08-18 10:49:33 +02:00
Chocobozzz 5f79f37d10
Remove useless information 2023-08-18 10:39:49 +02:00
Chocobozzz 822872aacd
Don't display admin email in security.txt 2023-08-18 10:35:45 +02:00
Chocobozzz 3ff44b67ea
Fix plugin global path error log 2023-08-18 10:19:43 +02:00
Chocobozzz 9c63644b2d
Fix peertube helpers tsx tests 2023-08-18 10:18:56 +02:00
Seth Falco 2055962c84 fix: handle git installation of ffmpeg 2023-08-18 10:17:16 +02:00
Chocobozzz 8e4fba97b2
Automatically adapt player ratio 2023-08-18 09:48:45 +02:00
Chocobozzz 276f5fa24f
Fix peertube runner build 2023-08-18 07:54:31 +02:00
Chocobozzz 869c5c7b5c
Update openapi version 2023-08-17 15:18:27 +02:00
Chocobozzz 5ab73a4570
Improve plugin guide 2023-08-17 15:18:27 +02:00
Yehuda Deutsch f7882ca3eb Switch from debian bullseye to bookworm 2023-08-17 15:18:21 +02:00
Chocobozzz a5bde7ad60
Fix benchmark script 2023-08-17 15:03:27 +02:00
Chocobozzz 23092139a6
Better abuse style of removed videos 2023-08-17 14:34:49 +02:00
Chocobozzz c5f8dc0533
Correctly truncate HTML
We can because we don't use the video truncated description since v5.0
2023-08-17 14:34:49 +02:00
Chocobozzz e4f82eaa8b
Remove invalid timeout 2023-08-17 14:34:49 +02:00
John Livingston e6c12444aa Enhance registerClientRoute documentation:
Adding the path on which routes created with registerClientRoute are
available.
2023-08-17 13:38:26 +02:00
Chocobozzz cb78deba47
Fix broken links 2023-08-17 09:46:24 +02:00
Chocobozzz 0632cdda04
Fix build 2023-08-17 09:24:45 +02:00
Chocobozzz c380e39285
Merge branch 'feature/esm-and-nx' into develop 2023-08-17 08:59:21 +02:00
Chocobozzz 3a4992633e
Migrate server to ESM
Sorry for the very big commit that may lead to git log issues and merge
conflicts, but it's a major step forward:

 * Server can be faster at startup because imports() are async and we can
   easily lazy import big modules
 * Angular doesn't seem to support ES import (with .js extension), so we
   had to correctly organize peertube into a monorepo:
    * Use yarn workspace feature
    * Use typescript reference projects for dependencies
    * Shared projects have been moved into "packages", each one is now a
      node module (with a dedicated package.json/tsconfig.json)
    * server/tools have been moved into apps/ and is now a dedicated app
      bundled and published on NPM so users don't have to build peertube
      cli tools manually
    * server/tests have been moved into packages/ so we don't compile
      them every time we want to run the server
 * Use isolatedModule option:
   * Had to move from const enum to const
     (https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums)
   * Had to explictely specify "type" imports when used in decorators
 * Prefer tsx (that uses esbuild under the hood) instead of ts-node to
   load typescript files (tests with mocha or scripts):
     * To reduce test complexity as esbuild doesn't support decorator
       metadata, we only test server files that do not import server
       models
     * We still build tests files into js files for a faster CI
 * Remove unmaintained peertube CLI import script
 * Removed some barrels to speed up execution (less imports)
2023-08-11 15:02:33 +02:00
Chocobozzz a8ca6190fb
Fix youtube-dl tests 2023-08-09 11:09:06 +02:00
Chocobozzz 04d1da5621
Update translations 2023-07-31 10:03:03 +02:00
Sveinn í Felli ad0515e962 Translated using Weblate (Icelandic)
Currently translated at 100.0% (2219 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-07-31 09:36:19 +02:00
Shun Sakai f060fb7890 Translated using Weblate (Japanese)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/ja/
2023-07-31 09:36:19 +02:00
Blood Axe a190f53b07 Translated using Weblate (Norwegian Bokmål)
Currently translated at 83.7% (1858 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-07-31 09:36:19 +02:00
Blood Axe cf4aa3b50d Translated using Weblate (Norwegian Bokmål)
Currently translated at 77.6% (1723 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-07-31 09:36:19 +02:00
Ihor Hordiichuk b77baa8dd7 Translated using Weblate (Ukrainian)
Currently translated at 98.5% (2186 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-07-31 09:36:19 +02:00
Ihor Hordiichuk 53e765aa43 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/uk/
2023-07-31 09:36:19 +02:00
Ihor Hordiichuk caf5fddb63 Translated using Weblate (Ukrainian)
Currently translated at 98.2% (2181 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-07-31 09:36:19 +02:00
Ihor Hordiichuk c333fcd4c1 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/uk/
2023-07-31 09:36:19 +02:00
Ihor Hordiichuk 3264b91797 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (269 of 269 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/uk/
2023-07-31 09:36:19 +02:00
Ihor Hordiichuk 71e3d66ad1 Translated using Weblate (Ukrainian)
Currently translated at 98.2% (2181 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-07-31 09:36:19 +02:00
T.S 335bf9d159 Translated using Weblate (Japanese)
Currently translated at 100.0% (2219 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-07-31 09:36:19 +02:00
DignifiedSilence eab39eeaa2 Translated using Weblate (Japanese)
Currently translated at 100.0% (2219 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-07-31 09:36:19 +02:00
DignifiedSilence 43900e44a5 Translated using Weblate (Japanese)
Currently translated at 99.9% (2218 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-07-31 09:36:19 +02:00
Sveinn í Felli 8eb672b901 Translated using Weblate (Icelandic)
Currently translated at 100.0% (2219 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-07-31 09:36:19 +02:00
Hannes Ylä-Jääski 87554129c1 Translated using Weblate (Finnish)
Currently translated at 100.0% (141 of 141 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/fi/
2023-07-31 09:36:19 +02:00
Hannes Ylä-Jääski 7c17c6e088 Translated using Weblate (Finnish)
Currently translated at 100.0% (271 of 271 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/fi/
2023-07-31 09:36:19 +02:00
Hannes Ylä-Jääski e5ac2bd89d Translated using Weblate (Finnish)
Currently translated at 93.8% (2082 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fi/
2023-07-31 09:36:19 +02:00
Александр ce551c05ef Translated using Weblate (Russian)
Currently translated at 100.0% (2219 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-07-31 09:36:19 +02:00
Milo Ivir 64c25db21c Translated using Weblate (Croatian)
Currently translated at 100.0% (269 of 269 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hr/
2023-07-31 09:36:19 +02:00
Александр 44a3c5e60b Translated using Weblate (Russian)
Currently translated at 99.0% (2199 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-07-31 09:36:19 +02:00
Milo Ivir e28d3fd8cf Translated using Weblate (Croatian)
Currently translated at 100.0% (2219 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-07-31 09:36:19 +02:00
Milo Ivir dfa93a67c4 Translated using Weblate (Croatian)
Currently translated at 100.0% (140 of 140 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/hr/
2023-07-31 09:36:19 +02:00
Jeff Huang 3bde8546cf Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2219 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-07-31 09:36:19 +02:00
Milo Ivir 37371739ab Translated using Weblate (Croatian)
Currently translated at 99.9% (2217 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-07-31 09:36:19 +02:00
Ihor Hordiichuk 29594b0e7a Translated using Weblate (Ukrainian)
Currently translated at 98.2% (2181 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-07-31 09:36:19 +02:00
Milo Ivir afdc22fb24 Translated using Weblate (Croatian)
Currently translated at 99.8% (2216 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-07-31 09:36:19 +02:00
Milo Ivir d8c0ffc2b5 Translated using Weblate (Croatian)
Currently translated at 100.0% (269 of 269 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hr/
2023-07-31 09:36:19 +02:00
Milo Ivir a902f3afcf Translated using Weblate (Croatian)
Currently translated at 99.7% (2213 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-07-31 09:36:19 +02:00
Milo Ivir 533a4a61f4 Translated using Weblate (Croatian)
Currently translated at 99.0% (2197 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-07-31 09:36:19 +02:00
Payman Moghadam 0bfa26f9cf Translated using Weblate (Persian)
Currently translated at 98.9% (2196 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-31 09:36:18 +02:00
Ihor Hordiichuk 9b7b784083 Translated using Weblate (Ukrainian)
Currently translated at 97.5% (2165 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-07-31 09:36:18 +02:00
Payman Moghadam ab84f2802d Translated using Weblate (Persian)
Currently translated at 98.9% (2196 of 2219 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-31 09:36:18 +02:00
Chocobozzz 3229fcf704
More robust logs tests 2023-07-31 09:35:48 +02:00
Chocobozzz 5e1ced7067
Fix live tests 2023-07-31 09:31:28 +02:00
Chocobozzz 257df4cb56
Remove deprecated "views" from live video event 2023-07-28 16:35:57 +02:00
Chocobozzz 982edf32ae
Remove deprecated video query filter 2023-07-28 16:33:12 +02:00
Chocobozzz ce8d0b5aae
Remove deprecated scheduler 2023-07-28 16:22:27 +02:00
Chocobozzz b203a25e1f
Keep s3 commands simple
As s3 implementation between s3 providers can be different
2023-07-28 16:21:15 +02:00
Chocobozzz eeb838faf2
currentTime is now required 2023-07-28 16:17:37 +02:00
Chocobozzz 74c8d5bf2d
Refactor enableTranscoding command helpers 2023-07-28 16:06:49 +02:00
Chocobozzz e390107e5a
Fix add to playlist button width 2023-07-28 15:55:49 +02:00
Chocobozzz f9ac050a35
Remove unnecessary workarounds
Has been fixed upstream
2023-07-28 15:46:14 +02:00
Chocobozzz 3193ac2c3b
Refactor a little bit nsfwPolicyToParam 2023-07-28 15:37:22 +02:00
Chocobozzz 65bb29c6d3
Remove unnecesary fixme/todo 2023-07-28 15:20:49 +02:00
Chocobozzz 2bfc8ce3d0
Remove unnecessary cast 2023-07-28 11:41:17 +02:00
Chocobozzz f932957b2e
Remove banner/avatar fields from channel/account
Deprecated since 4.2
2023-07-28 11:41:14 +02:00
Chocobozzz 89aa333110
Add ability to force transcoding 2023-07-28 11:09:03 +02:00
Chocobozzz ac8f81e373
Reduce hls.js not supported log
Happens often on iOS
2023-07-28 09:18:12 +02:00
mira.bat f862be2749
Add an option to sign federated fetches for mastodon compatibility (#5898)
* Fix player error modal

Not hidden when we change the video

* Correctly dispose player components

* Sign cross-server fetch requests for mastodon AUTHORIZED_FETCH compatibilty

* Add a remote fetch sign configuration knob

* Federated fetches refactoring

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
Co-authored-by: ira <ira@foxgirl.space>
2023-07-27 17:01:15 +02:00
Chocobozzz 787d822cd4
Rephrase emailer conflict error messages 2023-07-27 16:41:35 +02:00
Chocobozzz 809fecf2b4
Correctly dispose player components 2023-07-27 14:49:58 +02:00
Chocobozzz 39c0ceee8b
Fix player error modal
Not hidden when we change the video
2023-07-27 14:44:34 +02:00
Chocobozzz 9dfbf73576
Increase rate limits for benchmark 2023-07-27 14:18:59 +02:00
Chocobozzz f18003d0ac
Improve runner management
* Add ability to remove runner jobs
 * Add runner job state quick filter
 * Merge registration tokens and runners tables in the same page
 * Add copy button to copy registration token
2023-07-27 14:17:12 +02:00
Chocobozzz f5af5feb5a
Use built in toc doc
As we mainly use this file on https://docs.joinpeertube.org/contribute/plugins
2023-07-26 11:47:00 +02:00
Chocobozzz ec3228cae7
Fix playlist owner font size 2023-07-26 11:03:21 +02:00
Chocobozzz 17522af1e0
Use typed pick 2023-07-26 10:49:32 +02:00
Chocobozzz 69e3f2049f
Fix invalid short uuid conversion
Avoid "TypeError: Expected a string but received a null" error
2023-07-26 10:48:30 +02:00
Chocobozzz 3ffff82e87
Truncate html/og/card HTML description tags 2023-07-26 10:19:51 +02:00
Chocobozzz d7c3670945
Fix lint 2023-07-26 10:08:24 +02:00
Chocobozzz 053ed7f5e6
Update code contributors 2023-07-26 09:49:53 +02:00
Chocobozzz 22e7ffc781
Fix check params tests 2023-07-26 09:42:44 +02:00
Chocobozzz 93fd6f3b18
Fix fk error when generating storyboard 2023-07-26 09:25:21 +02:00
Chocobozzz 89b9eab5a7
Add more logs to debug oauth-client error 2023-07-26 09:25:10 +02:00
Chocobozzz 97583d0023
Add more rate limits 2023-07-26 08:37:50 +02:00
Chocobozzz 9901c8d690
Add video file update hook tests 2023-07-25 15:17:58 +02:00
Chocobozzz 3b46eec8ae
Remove unused param 2023-07-25 14:26:12 +02:00
Chocobozzz f42dd5524b
Add more context to request error 2023-07-25 14:21:01 +02:00
Chocobozzz f42fcb4b58
Implement video file replacement in client 2023-07-25 11:53:08 +02:00
Chocobozzz 12dc3a942a
Implement replace file in server side 2023-07-21 17:38:13 +02:00
Chocobozzz c6867725fb
Add p2p info to metrics 2023-07-21 11:42:52 +02:00
Chocobozzz b63c607b92
Fix updating P2P setting 2023-07-21 11:07:49 +02:00
Chocobozzz 305facdfab
Add peers number and p2p enabled label to metrics 2023-07-20 12:06:39 +02:00
Chocobozzz 4e5da193d0
Keep old docker path for web videos
Avoid breaking existing peertube instances on upgrade
2023-07-20 11:26:33 +02:00
Chocobozzz 8a9d247105
Fix "undefined" in stats card 2023-07-20 11:18:47 +02:00
Chocobozzz 4ddf488ab5
Improve player settings menu style 2023-07-20 10:53:22 +02:00
Chocobozzz c8defc41ee
Fix max settings panel height 2023-07-20 10:26:14 +02:00
Chocobozzz 8ece9c8ca0
Improve recommended videos without video tags 2023-07-19 13:24:31 +02:00
Chocobozzz 4f8b623668
Add missing storyboard directory to docker 2023-07-19 11:42:00 +02:00
Chocobozzz d430862f00
Force ltr on code inputs 2023-07-19 11:22:05 +02:00
Chocobozzz 15c2303489
More robust runner socket test 2023-07-19 10:43:12 +02:00
Chocobozzz bfd01f289d
Fix player metrics 2023-07-19 10:20:01 +02:00
Chocobozzz 6b745df087
Try to fix CI test 2023-07-17 14:34:44 +02:00
Chocobozzz c6a3445360
Fix lint 2023-07-17 14:17:18 +02:00
Chocobozzz 4212a107d4
Update translations 2023-07-17 11:50:58 +02:00
Blood Axe b0ac4b2438 Translated using Weblate (Norwegian Bokmål)
Currently translated at 77.0% (1734 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-07-17 11:46:42 +02:00
Vodoyo Kamal 8a0ee81535 Translated using Weblate (Bengali)
Currently translated at 8.1% (143 of 1748 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/bn/
2023-07-17 11:46:42 +02:00
Ewout van Mansom 4dcc1f4c9f Translated using Weblate (Dutch)
Currently translated at 94.9% (2137 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2023-07-17 11:46:42 +02:00
Blood Axe 1464f3bd1c Translated using Weblate (Norwegian Bokmål)
Currently translated at 70.5% (1587 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-07-17 11:46:42 +02:00
Blood Axe 82a5bbf509 Translated using Weblate (Norwegian Bokmål)
Currently translated at 82.9% (112 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/nb_NO/
2023-07-17 11:46:42 +02:00
Branislav Pavelka 39802e9ec4 Translated using Weblate (Slovak)
Currently translated at 2.4% (54 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sk/
2023-07-17 11:46:42 +02:00
Victor Hampel 0341f8445a Translated using Weblate (German)
Currently translated at 100.0% (270 of 270 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/de/
2023-07-17 11:46:42 +02:00
Phongpanot a65c450a3b Translated using Weblate (Thai)
Currently translated at 62.5% (1408 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/th/
2023-07-17 11:46:42 +02:00
Phongpanot e2991217a3 Translated using Weblate (Thai)
Currently translated at 62.5% (1408 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/th/
2023-07-17 11:46:42 +02:00
Payman Moghadam 7d1d5514c2 Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-17 11:46:42 +02:00
Hồ Nhất Duy a88684e0df Translated using Weblate (Vietnamese)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/vi/
2023-07-17 11:46:42 +02:00
Hồ Nhất Duy 2a21ecc873 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-07-17 11:46:42 +02:00
Branislav Pavelka d3b0db9168 Translated using Weblate (Slovak)
Currently translated at 1.6% (38 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sk/
2023-07-17 11:46:42 +02:00
Payman Moghadam 82a3277db7 Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-17 11:46:42 +02:00
Jiri Podhorecky b7b50dfa76 Translated using Weblate (Czech)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-07-17 11:46:42 +02:00
Milo Ivir 47b89723dd Translated using Weblate (Croatian)
Currently translated at 100.0% (268 of 268 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hr/
2023-07-17 11:46:42 +02:00
Milo Ivir ce65d401dd Translated using Weblate (Croatian)
Currently translated at 99.3% (2236 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-07-17 11:46:42 +02:00
DignifiedSilence 87421e87a9 Translated using Weblate (Japanese)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ja/
2023-07-17 11:46:42 +02:00
DignifiedSilence 4ab9816215 Translated using Weblate (Japanese)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-07-17 11:46:41 +02:00
T.S b6ac52d52c Translated using Weblate (Japanese)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-07-17 11:46:41 +02:00
Payman Moghadam ec731e21f4 Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-17 11:46:41 +02:00
Payman Moghadam 87c8a55284 Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-17 11:46:41 +02:00
Payman Moghadam 3b9f845145 Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-17 11:46:41 +02:00
Payman Moghadam ec2922b660 Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-17 11:46:41 +02:00
Payman Moghadam 6078c0e4e9 Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-17 11:46:41 +02:00
Jeff Huang 2d78af0f68 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-07-17 11:46:41 +02:00
Payman Moghadam ed2b8f127c Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-07-17 11:46:41 +02:00
Ihor Hordiichuk 39d58998c4 Translated using Weblate (Ukrainian)
Currently translated at 97.9% (2203 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-07-17 11:46:41 +02:00
Александр 1cfded4f14 Translated using Weblate (Russian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-07-17 11:46:41 +02:00
Chocobozzz d0b7d66f58
Fix password E2E tests 2023-07-17 11:46:24 +02:00
Chocobozzz 9a72e4fe9e
Improve settings menu label handler 2023-07-17 11:31:46 +02:00
Chocobozzz e29221f855
Fix e2e tests 2023-07-17 11:31:46 +02:00
Chocobozzz 9684bc959e
Fix anonymous autoplay 2023-07-17 11:31:46 +02:00
Chocobozzz 45ec48b2b1
Don't update opengraph in angular
We already set these tags in the server
2023-07-17 11:31:46 +02:00
Chocobozzz 28dd2f14f5
Some player fixes on Android, Safari and iOS 2023-07-17 11:31:46 +02:00
Chocobozzz 930e1b939a
Fix HLS player on mobile 2023-07-17 11:31:46 +02:00
Chocobozzz 9bb541bec7
Round HTTP/P2P network stats 2023-07-17 11:31:46 +02:00
Chocobozzz 9bc85bd2f8
Prevent multiple sha requests 2023-07-17 11:31:46 +02:00
Chocobozzz 9a26d00e5e
Add nginx comment for webseed redirection 2023-07-17 11:31:46 +02:00
Wicklow cbe06f779f
Add e2e tests for password protected videos (#5860) 2023-07-17 11:31:42 +02:00
Jackson Chen 260242decd update third party link to docs 2023-07-17 11:30:45 +02:00
Chocobozzz 288e1d37e9
Fix lint 2023-07-12 13:39:37 +02:00
Chocobozzz 5c34189aa9
Fix prune storage test 2023-07-12 11:32:12 +02:00
Chocobozzz c5ad375a2c
Use web-videos for webseed redirection 2023-07-12 11:26:01 +02:00
Chocobozzz d874522774
Avoid update remote runner error 2023-07-12 11:14:59 +02:00
Chocobozzz d959b763f0
Avoid duplicate runner names 2023-07-12 10:56:07 +02:00
Chocobozzz 88cde4392a
Merge branch 'release/5.2.0' into develop 2023-07-12 10:37:59 +02:00
Chocobozzz ed22eaabfa
Fix terms/code of conduct link toggle 2023-07-12 10:22:43 +02:00
Chocobozzz d98909f690
Fix fps transcoding on remote runners 2023-07-12 10:07:21 +02:00
Chocobozzz 97f57e928f
Add custom db port when upgrading peertube 2023-07-11 13:43:41 +02:00
Chocobozzz 34555bebf8
Migrate from webseed to web-videos 2023-07-11 11:39:59 +02:00
Chocobozzz d732ec7b46
Rename "videos" config to "web-videos" 2023-07-11 11:23:51 +02:00
Chocobozzz 76824f522a
Reword runner registration 2023-07-11 10:10:51 +02:00
Chocobozzz c57ad141a9
Rename webtorrent config to web_videos 2023-07-11 09:52:14 +02:00
Chocobozzz 784e2ad5c3
Prefer web videos in favour of webtorrent 2023-07-11 09:21:13 +02:00
Chocobozzz c3030e944a
Fix build 2023-07-10 16:41:08 +02:00
Chocobozzz 63e2f087c3
Merge branch 'feature/remove-webtorrent' into develop 2023-07-10 16:13:22 +02:00
Chocobozzz 8953f055c8
Rename player embed api 2023-07-10 16:08:53 +02:00
Chocobozzz a1bd2b77d9
Remove webtorrent support from client 2023-07-10 16:08:28 +02:00
Chocobozzz 83b42f5a32
Add note for peertube runner dependencies 2023-07-06 16:59:20 +02:00
Chocobozzz 8ef866071f
Fix fetching storyboard of password protected video 2023-06-29 14:22:13 +02:00
Chocobozzz 9cd06903f4
Fix HLS playlist generation with 0 duration length 2023-06-29 14:20:03 +02:00
Chocobozzz a287136427
Fix migration conflict 2023-06-29 13:52:24 +02:00
Chocobozzz 6bd160a68d
Fix 400 error on resumable re-upload 2023-06-29 11:35:25 +02:00
q_h 926c3f2b37
Fix the cleanup after a failed upload (#5840)
* Fix the cleanup after a failed upload

* Update tests

* Update tests
2023-06-29 10:38:37 +02:00
Chocobozzz 9fe86c2c9b
Update runner version 2023-06-29 10:19:55 +02:00
Chocobozzz d68b88bac4
Prevent stalled jobs 2023-06-29 10:19:55 +02:00
Chocobozzz bc3918b2ae
Shuffle servers when checking available jobs
To not favour a specific instance
2023-06-29 10:19:55 +02:00
Chocobozzz 19aeb64b25
Better channel deletion message 2023-06-29 10:19:55 +02:00
Chocobozzz d961735d5d
Fix prune storage tests 2023-06-29 10:19:55 +02:00
Chocobozzz 180d8f297e
More robust wait transcoding checkbox display 2023-06-29 10:19:55 +02:00
Chocobozzz 17ad0e8428
Fix regenerate thumbnail test 2023-06-29 10:19:55 +02:00
Chocobozzz cf069671f4
Use promise cache to load remote thumbnails 2023-06-29 10:19:55 +02:00
Chocobozzz 2b5dfa2fe0
Fix adding element in playlists 2023-06-29 10:19:55 +02:00
Chocobozzz 7a30349748
Fix migration conflict 2023-06-29 10:19:55 +02:00
Chocobozzz 53d4db2a8a
Fix playlist thumbnail generation 2023-06-29 10:19:54 +02:00
Chocobozzz 109d4a7f01
Add thumbnail disk database migration 2023-06-29 10:19:33 +02:00
Chocobozzz 89becbcb37
Add missing playbackRate URL param doc 2023-06-29 10:19:33 +02:00
Chocobozzz bafaba0bcd
Support lazy download of remote video miniatures 2023-06-29 10:19:33 +02:00
Chocobozzz f162d32da0
Support lazy download thumbnails 2023-06-29 10:19:33 +02:00
Chocobozzz a673d9e848
Fix storyboard tests 2023-06-29 10:19:07 +02:00
Chocobozzz ff75ba7160
Also replace base url of pre signed s3 url 2023-06-29 10:19:07 +02:00
Chocobozzz c37e305342
Fix CI tests 2023-06-29 10:19:05 +02:00
Chocobozzz 881958d179
Correctly download files from S3
Use pre signed URLs to inject content disposition header
2023-06-29 10:18:21 +02:00
Chocobozzz 1c9dc98c27
Lock video files when generating storyboard 2023-06-29 10:18:21 +02:00
Chocobozzz d299afeb2c
Fix lint 2023-06-29 10:18:20 +02:00
Chocobozzz 7f7e9d4e90
Handle correctly formatted AP attributedTo 2023-06-29 10:18:00 +02:00
Chocobozzz cefe22cf7c
Fetch remote AP objects if only id is specified 2023-06-29 10:18:00 +02:00
Chocobozzz f987425bd1
Fix thumbnails tests 2023-06-29 10:18:00 +02:00
Chocobozzz d896fef7e2
Refactor video formatter 2023-06-29 10:18:00 +02:00
Chocobozzz 638a295021
Support storyboards in embed 2023-06-29 10:17:59 +02:00
Chocobozzz 52807a075f
Fix storyboard on firefox 2023-06-29 10:16:57 +02:00
Chocobozzz b7f946892b
Simpler thumbnail generation 2023-06-29 10:16:57 +02:00
Chocobozzz 318aa9c422
Delete storyboard file on video deletion 2023-06-29 10:16:57 +02:00
Chocobozzz 9c5cc50133
Add script to generate storyboards 2023-06-29 10:16:57 +02:00
Chocobozzz d8f39b126d
Add storyboard support 2023-06-29 10:16:55 +02:00
Chocobozzz 1fb7d09422
Don't cache upload after video deletion 2023-06-29 09:49:06 +02:00
Chocobozzz 866c5f667d
Simplify ICU in components 2023-06-29 09:49:06 +02:00
Wicklow 40346ead2b
Feature/password protected videos (#5836)
* Add server endpoints

* Refactoring test suites

* Update server and add openapi documentation

* fix compliation and tests

* upload/import password protected video on client

* add server error code

* Add video password to update resolver

* add custom message when sharing pw protected video

* improve confirm component

* Add new alert in component

* Add ability to watch protected video on client

* Cannot have password protected replay privacy

* Add migration

* Add tests

* update after review

* Update check params tests

* Add live videos test

* Add more filter test

* Update static file privacy test

* Update object storage tests

* Add test on feeds

* Add missing word

* Fix tests

* Fix tests on live videos

* add embed support on password protected videos

* fix style

* Correcting data leaks

* Unable to add password protected privacy on replay

* Updated code based on review comments

* fix validator and command

* Updated code based on review comments
2023-06-29 09:48:55 +02:00
Chocobozzz ae22c59f14
Fix broken replay with long live video name 2023-06-29 09:08:13 +02:00
Chocobozzz ba278fa51d
Fix build 2023-06-21 10:54:48 +02:00
Chocobozzz 2c16f5ad5e
Fix undefined actor image 2023-06-21 10:44:40 +02:00
Chocobozzz b4516abc39
Bumped to version v5.2.0 2023-06-21 09:06:13 +02:00
Chocobozzz 2dd4c93c1b
Update changelog 2023-06-21 09:03:42 +02:00
Chocobozzz e915cde30e
Fix runner api rate limit bypass 2023-06-20 14:17:34 +02:00
Chocobozzz 923e41fa4f
Update translations 2023-06-20 09:25:22 +02:00
Payman Moghadam fa1f8915de Translated using Weblate (Persian)
Currently translated at 100.0% (2250 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-06-20 09:22:23 +02:00
chocobozzz 7c3b866881 Translated using Weblate (Czech)
Currently translated at 99.9% (2248 of 2250 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-06-20 09:22:23 +02:00
Chocobozzz 7c8bf6d0b0
Update translations 2023-06-20 09:07:21 +02:00
Payman Moghadam 914d1b15c4 Translated using Weblate (Persian)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-06-19 16:07:59 +02:00
Payman Moghadam 69ad479457 Translated using Weblate (Persian)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-06-19 16:07:59 +02:00
Jiri Podhorecky 0a7c3a08d2 Translated using Weblate (Czech)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-06-19 16:07:59 +02:00
Ettore Atalan 08ae214926 Translated using Weblate (German)
Currently translated at 97.8% (2200 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-06-19 16:07:59 +02:00
Ettore Atalan c43e50c51c Translated using Weblate (German)
Currently translated at 97.7% (2198 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-06-19 16:07:59 +02:00
Sveinn í Felli 175f0fccf1 Translated using Weblate (Icelandic)
Currently translated at 100.0% (268 of 268 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/is/
2023-06-19 16:07:59 +02:00
Sveinn í Felli c371ba1685 Translated using Weblate (Icelandic)
Currently translated at 100.0% (134 of 134 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/is/
2023-06-19 16:07:59 +02:00
Sveinn í Felli a688701f91 Translated using Weblate (Icelandic)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-06-19 16:07:59 +02:00
Sveinn í Felli cd6fa266b8 Translated using Weblate (Icelandic)
Currently translated at 99.9% (2247 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-06-19 16:07:59 +02:00
Kindred La Boneta 9f9131f843 Translated using Weblate (Esperanto)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/eo/
2023-06-19 16:07:59 +02:00
Kindred La Boneta 2f4e4d10e9 Translated using Weblate (Esperanto)
Currently translated at 100.0% (270 of 270 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/eo/
2023-06-19 16:07:59 +02:00
Kindred La Boneta 99c494e504 Translated using Weblate (Esperanto)
Currently translated at 69.6% (1566 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eo/
2023-06-19 16:07:59 +02:00
Hồ Nhất Duy 20cea0cdc0 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-06-19 16:07:59 +02:00
DignifiedSilence 68f5eae953 Translated using Weblate (Japanese)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-06-19 16:07:59 +02:00
Payman Moghadam 7f41ff1152 Translated using Weblate (Persian)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-06-19 16:07:59 +02:00
Payman Moghadam f23887487f Translated using Weblate (Persian)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-06-19 16:07:59 +02:00
Payman Moghadam 0f8f495528 Translated using Weblate (Persian)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-06-19 16:07:59 +02:00
Payman Moghadam cf0eff3972 Translated using Weblate (Persian)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/fa/
2023-06-19 16:07:59 +02:00
Payman Moghadam 0dc5d1e6bb Translated using Weblate (Persian)
Currently translated at 100.0% (268 of 268 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/fa/
2023-06-19 16:07:59 +02:00
Payman Moghadam c909306251 Translated using Weblate (Persian)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-06-19 16:07:59 +02:00
Payman Moghadam 1743510282 Translated using Weblate (Persian)
Currently translated at 100.0% (268 of 268 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/fa/
2023-06-19 16:07:59 +02:00
Chocobozzz 31b9518a86
Fix log 2023-06-19 14:29:50 +02:00
Chocobozzz 43897b0311
Update peertube-runner version 2023-06-19 13:54:42 +02:00
Chocobozzz a34c612f38
More robust runner update handler 2023-06-19 13:45:26 +02:00
Chocobozzz 7d758898dc
Alphabetical order for channels filter 2023-06-19 11:18:56 +02:00
Chocobozzz 7aacaa76ec
Fix registration notification error in client 2023-06-19 10:52:40 +02:00
Chocobozzz 7c77ace9a7
Fix languages alphabetical sort 2023-06-19 10:11:23 +02:00
Chocobozzz 58af76dc4e
Fix REST API menu link 2023-06-07 08:26:10 +02:00
Chocobozzz 07880c3642
Correctly unload plugin paths 2023-06-06 11:59:27 +02:00
Chocobozzz 25d7cc3cb6
Fix custom default route link 2023-06-05 10:33:35 +02:00
Chocobozzz ae51278920
Fix video channels quick filter overflow 2023-06-05 10:19:23 +02:00
Chocobozzz ed14d1ebd7
Invalidate cache feed even after server restart 2023-06-05 10:05:49 +02:00
Chocobozzz 96290a6b78
Merge branch 'develop' into release/5.2.0 2023-06-05 09:00:48 +02:00
Chocobozzz 8715c76356
More specific message when signup is not allowed 2023-06-05 09:00:47 +02:00
Chocobozzz f5a12121fe
Don't display unknown information 2023-06-05 09:00:47 +02:00
Alecks Gates 1ed1994fff
Use largest avatar in RSS feeds, unique guid for liveItems (#5817)
* Attempt to get largest avatar size

* WIP live guid changes

* Use largest avatar version in feeds

* Misc variable names/import changes

* Update podcast feed tests for guid changes

* More <guid> testing

* Lint fix

* Styling

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2023-06-05 09:00:30 +02:00
Chocobozzz 4e9a98669f
More specific message when signup is not allowed 2023-06-05 08:53:31 +02:00
Chocobozzz a45e2971f7
Don't display unknown information 2023-06-05 08:50:54 +02:00
Chocobozzz 9a64621975
Bumped to version v5.2.0-rc.1 2023-05-30 10:18:25 +02:00
Chocobozzz c47430bc37
Update changelog 2023-05-30 10:18:13 +02:00
Chocobozzz 01619dd083
Update translations 2023-05-30 09:41:25 +02:00
Chocobozzz 6cc8a0dfad
Merge remote-tracking branch 'weblate/develop' into develop 2023-05-30 09:39:45 +02:00
Chocobozzz 29c7319c8a
Fix transcoding error
When transcoding.always_transcode_original_resolution is false
2023-05-30 09:35:21 +02:00
Payman Moghadam d468b8f869 Translated using Weblate (Persian)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-29 16:32:58 +02:00
Payman Moghadam aa8ec31e82 Translated using Weblate (Persian)
Currently translated at 99.3% (2235 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-29 00:46:56 +02:00
Payman Moghadam f5aac6736b Translated using Weblate (Persian)
Currently translated at 97.5% (2195 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-28 12:39:42 +02:00
Payman Moghadam a7fd6b6baf Translated using Weblate (Persian)
Currently translated at 95.3% (2144 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-28 08:48:02 +02:00
Payman Moghadam d4fff51d96 Translated using Weblate (Persian)
Currently translated at 95.3% (2144 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-27 17:12:09 +02:00
josé m fbd05f0c09 Translated using Weblate (Galician)
Currently translated at 99.9% (2247 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-05-27 10:18:31 +02:00
José M 53cd2b9901 Translated using Weblate (Spanish)
Currently translated at 98.0% (2206 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-05-27 01:31:45 +02:00
José M 9276129d75 Translated using Weblate (Spanish)
Currently translated at 98.0% (2206 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-05-27 01:30:38 +02:00
Александр b730794535 Translated using Weblate (Russian)
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-26 16:26:42 +02:00
Farooq Karimi Zadeh 3dabd401d3 Translated using Weblate (Persian)
Currently translated at 95.3% (2144 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-26 16:26:42 +02:00
Chocobozzz 89eda2aab0
Fix runner vod transcoding error test 2023-05-26 16:09:28 +02:00
Chocobozzz c56dd2807f
Fix peertube subtitles import 2023-05-26 16:05:08 +02:00
Chocobozzz c2eb81227b
Update contributors list 2023-05-26 14:36:07 +02:00
Chocobozzz 50b00de4f6
Update changelog 2023-05-26 14:35:57 +02:00
Chocobozzz ca91a74b87
Improve responsive on medium destkop screens 2023-05-26 11:18:02 +02:00
Chocobozzz 4b70c278a9
Automatic colspan for tables 2023-05-26 10:27:02 +02:00
Chocobozzz a4c49a17ea
Add missing tests env doc 2023-05-26 09:52:50 +02:00
Chocobozzz 64aa66c4a6
Don't fail remote transcoding on retry 2023-05-26 09:28:44 +02:00
Chocobozzz f474a519dc
Specify runner name when unregistering the runner 2023-05-26 09:04:22 +02:00
Chocobozzz e35967ee08
Fix primeng calendar style 2023-05-25 16:15:12 +02:00
Chocobozzz 4958e9e56e
Fix video edit page overflow 2023-05-25 16:09:47 +02:00
Chocobozzz 0a1aaf2d11
Fix primeng table pagination style 2023-05-25 15:58:53 +02:00
Chocobozzz ffc424259e
Fix scss lint 2023-05-25 14:36:17 +02:00
Chocobozzz 38358661e0
Add tooltip to plugin auth
In case the cell is truncated
2023-05-25 13:43:15 +02:00
Chocobozzz a41b944398
Fix local e2e tests 2023-05-25 11:41:29 +02:00
Chocobozzz 22b34b2d75
Upgrade @peertube/xliffmerge 2023-05-25 10:50:29 +02:00
Chocobozzz 2290864bc7
Update chart.js 2023-05-25 10:04:32 +02:00
Chocobozzz 8777a98e3a
Revert hls.js upgrade
See https://github.com/Chocobozzz/PeerTube/issues/5790
2023-05-25 09:58:27 +02:00
Chocobozzz a60b100601
Add more logs when storing master playlist in s3 2023-05-25 09:58:08 +02:00
Chocobozzz 51afea5411
Update client dependencies 2023-05-25 09:24:55 +02:00
Chocobozzz 98eacc80d3
Remove invalid console logs 2023-05-25 08:45:37 +02:00
Chocobozzz 608c07bb39
Update translations 2023-05-25 08:32:41 +02:00
chocobozzz ce722c0f0f Translated using Weblate (Italian)
Currently translated at 73.5% (1655 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2023-05-25 08:28:04 +02:00
Jeff Huang 78b2402f7a Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2249 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-05-25 08:07:40 +02:00
Александр eaa32af7d0 Translated using Weblate (Russian)
Currently translated at 99.6% (2242 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-25 08:07:39 +02:00
chocobozzz de9f3b05d7 Translated using Weblate (Italian)
Currently translated at 73.5% (1655 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2023-05-25 08:07:38 +02:00
Ihor Hordiichuk 77bf19ec1d Translated using Weblate (Ukrainian)
Currently translated at 97.9% (2202 of 2249 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-24 23:28:21 +02:00
Chocobozzz 785471d3e6
Update translations 2023-05-24 17:44:36 +02:00
Chocobozzz 8cdb6b6276
Merge remote-tracking branch 'weblate/develop' into develop 2023-05-24 17:39:13 +02:00
Linus 708107c8c8 Translated using Weblate (Russian)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ru/
2023-05-24 17:39:07 +02:00
Linus fbbc50f155 Translated using Weblate (Russian)
Currently translated at 100.0% (270 of 270 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/ru/
2023-05-24 17:39:07 +02:00
Linus 041083c74b Translated using Weblate (Russian)
Currently translated at 100.0% (2245 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-24 17:39:06 +02:00
chocobozzz 2e7c70657c Translated using Weblate (Italian)
Currently translated at 73.8% (1657 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/it/
2023-05-24 17:39:05 +02:00
Chocobozzz f9fc41cb88
Broadcast message level should be translated 2023-05-24 17:37:45 +02:00
Chocobozzz b99ee1b150
Better label for default transcoding profile 2023-05-24 17:35:39 +02:00
Chocobozzz b14e3c3de9
Add contained in playlists badges gap 2023-05-24 17:25:09 +02:00
Chocobozzz f9735a9e88
Fix notification settings 2023-05-24 17:22:40 +02:00
Chocobozzz 431ebbd5e4
Migrate deprecated accordion component 2023-05-24 17:13:57 +02:00
Chocobozzz 5490930428
Remove suppressImplicitAnyIndexErrors
It's deprecated by TS
2023-05-24 16:56:05 +02:00
Chocobozzz d0fbc9fd0a
Fix lint 2023-05-24 15:27:15 +02:00
Payman Moghadam 20f9745985 Translated using Weblate (Persian)
Currently translated at 95.1% (2136 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-24 13:51:12 +02:00
Payman Moghadam 7afa89828d Translated using Weblate (Persian)
Currently translated at 95.0% (2134 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-24 08:32:58 +02:00
Jiri Podhorecky ab6f580bea Translated using Weblate (Czech)
Currently translated at 99.1% (2225 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-05-24 04:32:34 +02:00
josé m 0dd465935f Translated using Weblate (Galician)
Currently translated at 99.9% (2243 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/gl/
2023-05-23 20:22:09 +02:00
Payman Moghadam 8622180672 Translated using Weblate (Persian)
Currently translated at 95.0% (2134 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-23 20:22:08 +02:00
Payman Moghadam e36b309700 Translated using Weblate (Persian)
Currently translated at 95.0% (2134 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-23 13:53:03 +02:00
Payman Moghadam 4876644dc6 Translated using Weblate (Persian)
Currently translated at 95.0% (2134 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-23 13:45:59 +02:00
Chocobozzz 25ea1d85e1
Increase max log size for test instances 2023-05-23 11:27:38 +02:00
Chocobozzz cffef25313
Fix s3 mock cleanup 2023-05-23 11:27:27 +02:00
Chocobozzz 52798aa5f2
Update angular 2023-05-23 11:27:09 +02:00
Chocobozzz f89189907b
Prevent object storage mock conflicts
When running tests in parallel
2023-05-23 10:49:45 +02:00
Chocobozzz 41cde76bbf
Update common client packages 2023-05-23 09:42:10 +02:00
Jeff Huang 813f37438a Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2245 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-05-23 08:51:56 +02:00
Chocobozzz d4d0f3ba0e
Don't send an error on live abort 2023-05-23 08:31:02 +02:00
Chocobozzz d8fe90dde2
Wait for segments generation 2023-05-23 08:28:25 +02:00
Ihor Hordiichuk 4731f68f35 Translated using Weblate (Ukrainian)
Currently translated at 98.0% (2201 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-23 01:30:29 +02:00
Chocobozzz 83002a8234
Update server dependencies 2023-05-22 17:11:31 +02:00
Chocobozzz 57c318653e
Fix live quota tests 2023-05-22 16:23:28 +02:00
Александр 3cdaa3df76 Translated using Weblate (Russian)
Currently translated at 100.0% (2245 of 2245 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-22 16:00:11 +02:00
Alecks Gates cb0eda5602
Add Podcast RSS feeds (#5487)
* Initial test implementation of Podcast RSS

This is a pretty simple implementation to add support for The Podcast Namespace in RSS -- instead of affecting the existing RSS implementation, this adds a new UI option.

I attempted to retain compatibility with the rest of the RSS feed implementation as much as possible and have created a temporary fork of the "pfeed" library to support this effort.

* Update to pfeed-podcast 1.2.2

* Initial test implementation of Podcast RSS

This is a pretty simple implementation to add support for The Podcast Namespace in RSS -- instead of affecting the existing RSS implementation, this adds a new UI option.

I attempted to retain compatibility with the rest of the RSS feed implementation as much as possible and have created a temporary fork of the "pfeed" library to support this effort.

* Update to pfeed-podcast 1.2.2

* Initial test implementation of Podcast RSS

This is a pretty simple implementation to add support for The Podcast Namespace in RSS -- instead of affecting the existing RSS implementation, this adds a new UI option.

I attempted to retain compatibility with the rest of the RSS feed implementation as much as possible and have created a temporary fork of the "pfeed" library to support this effort.

* Update to pfeed-podcast 1.2.2

* Add correct feed image to RSS channel

* Prefer HLS videos for podcast RSS

Remove video/stream titles, add optional height attribute to podcast RSS

* Prefix podcast RSS images with root server URL

* Add optional video query support to include captions

* Add transcripts & person images to podcast RSS feed

* Prefer webseed/webtorrent files over HLS fragmented mp4s

* Experimentally adding podcast fields to basic config page

* Add validation for new basic config fields

* Don't include "content" in podcast feed, use full description for "description"

* Initial test implementation of Podcast RSS

This is a pretty simple implementation to add support for The Podcast Namespace in RSS -- instead of affecting the existing RSS implementation, this adds a new UI option.

I attempted to retain compatibility with the rest of the RSS feed implementation as much as possible and have created a temporary fork of the "pfeed" library to support this effort.

* Update to pfeed-podcast 1.2.2

* Add correct feed image to RSS channel

* Prefer HLS videos for podcast RSS

Remove video/stream titles, add optional height attribute to podcast RSS

* Prefix podcast RSS images with root server URL

* Add optional video query support to include captions

* Add transcripts & person images to podcast RSS feed

* Prefer webseed/webtorrent files over HLS fragmented mp4s

* Experimentally adding podcast fields to basic config page

* Add validation for new basic config fields

* Don't include "content" in podcast feed, use full description for "description"

* Add medium/socialInteract to podcast RSS feeds. Use HTML for description

* Change base production image to bullseye, install prosody in image

* Add liveItem and trackers to Podcast RSS feeds

Remove height from alternateEnclosure, replaced with title.

* Clear Podcast RSS feed cache when live streams start/end

* Upgrade to Node 16

* Refactor clearCacheRoute to use ApiCache

* Remove unnecessary type hint

* Update dockerfile to node 16, install python-is-python2

* Use new file paths for captions/playlists

* Fix legacy videos in RSS after migration to object storage

* Improve method of identifying non-fragmented mp4s in podcast RSS feeds

* Don't include fragmented MP4s in podcast RSS feeds

* Add experimental support for podcast:categories on the podcast RSS item

* Fix undefined category when no videos exist

Allows for empty feeds to exist (important for feeds that might only go live)

* Add support for podcast:locked -- user has to opt in to show their email

* Use comma for podcast:categories delimiter

* Make cache clearing async

* Fix merge, temporarily test with pfeed-podcast

* Syntax changes

* Add EXT_MIMETYPE constants for captions

* Update & fix tests, fix enclosure mimetypes, remove admin email

* Add test for podacst:socialInteract

* Add filters hooks for podcast customTags

* Remove showdown, updated to pfeed-podcast 6.1.2

* Add 'action:api.live-video.state.updated' hook

* Avoid assigning undefined category to podcast feeds

* Remove nvmrc

* Remove comment

* Remove unused podcast config

* Remove more unused podcast config

* Fix MChannelAccountDefault type hint missed in merge

* Remove extra line

* Re-add newline in config

* Fix lint errors for isEmailPublic

* Fix thumbnails in podcast feeds

* Requested changes based on review

* Provide podcast rss 2.0 only on video channels

* Misc cleanup for a less messy PR

* Lint fixes

* Remove pfeed-podcast

* Add peertube version to new hooks

* Don't use query include, remove TODO

* Remove film medium hack

* Clear podcast rss cache before video/channel update hooks

* Clear podcast rss cache before video uploaded/deleted hooks

* Refactor podcast feed cache clearing

* Set correct person name from video channel

* Styling

* Fix tests

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2023-05-22 16:00:05 +02:00
Chocobozzz 3f0ceab06e
More robust quota check
Avoid concurrency issues with permanent lives
2023-05-22 15:52:59 +02:00
Chocobozzz fa3da7a623
End runner live transcoding on update error 2023-05-22 15:24:19 +02:00
Chocobozzz 6a9b315182
Fix tests 2023-05-22 15:03:14 +02:00
Chocobozzz 8762b1c7ff
Include err type in res 2023-05-22 14:10:59 +02:00
Chocobozzz 17ecdf61ce
Force stop remote live transcoding 2023-05-22 13:54:46 +02:00
Chocobozzz f3bc1b5416
Help button must not send the parent form 2023-05-22 11:13:01 +02:00
Chocobozzz b9393464a8
Lock when removing video files 2023-05-22 11:06:04 +02:00
Chocobozzz 33b91e53d2
Remove low timeouts
Default timeout is 30s
2023-05-22 09:22:08 +02:00
Chocobozzz 679f8800cd
Update translations 2023-05-22 09:03:05 +02:00
Zet 9fa05c206f Translated using Weblate (Arabic)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/ar/
2023-05-22 09:00:53 +02:00
Zet 26a3f6b212 Translated using Weblate (Arabic)
Currently translated at 71.3% (1600 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ar/
2023-05-22 09:00:53 +02:00
Payman Moghadam db4d0eef52 Translated using Weblate (Persian)
Currently translated at 95.1% (2134 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:53 +02:00
Payman Moghadam 2937c36871 Translated using Weblate (Persian)
Currently translated at 95.0% (2133 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:53 +02:00
Payman Moghadam 811ea73c65 Translated using Weblate (Persian)
Currently translated at 94.9% (2129 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:53 +02:00
Payman Moghadam 32c968bf3c Translated using Weblate (Persian)
Currently translated at 94.9% (2129 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:53 +02:00
Payman Moghadam 6cfcb09fe3 Translated using Weblate (Persian)
Currently translated at 94.9% (2129 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:53 +02:00
Hồ Nhất Duy 66fc91e479 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2243 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-05-22 09:00:52 +02:00
Payman Moghadam 6292fb9843 Translated using Weblate (Persian)
Currently translated at 94.8% (2128 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:52 +02:00
Hồ Nhất Duy 77cea2114c Translated using Weblate (Vietnamese)
Currently translated at 98.6% (2212 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-05-22 09:00:52 +02:00
Александр 4b9c3bff7b Translated using Weblate (Russian)
Currently translated at 100.0% (2243 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-22 09:00:52 +02:00
Payman Moghadam 47282e8198 Translated using Weblate (Persian)
Currently translated at 94.8% (2128 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:52 +02:00
Milo Ivir 788273d84f Translated using Weblate (Croatian)
Currently translated at 99.1% (2224 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-05-22 09:00:52 +02:00
Payman Moghadam b4f0259e27 Translated using Weblate (Persian)
Currently translated at 94.8% (2127 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:52 +02:00
Sveinn í Felli f4a034c60e Translated using Weblate (Icelandic)
Currently translated at 98.4% (2208 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-05-22 09:00:52 +02:00
chocobozzz 54c70a2b5e Translated using Weblate (French (France) (fr_FR))
Currently translated at 95.1% (2135 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2023-05-22 09:00:52 +02:00
Milo Ivir b6e14be7a9 Translated using Weblate (Croatian)
Currently translated at 98.6% (2213 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-05-22 09:00:52 +02:00
Milo Ivir de31d9c50a Translated using Weblate (Croatian)
Currently translated at 100.0% (267 of 267 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hr/
2023-05-22 09:00:52 +02:00
Milo Ivir 167e28c6eb Translated using Weblate (Croatian)
Currently translated at 98.2% (2203 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-05-22 09:00:52 +02:00
Milo Ivir 71d1bbb6bd Translated using Weblate (Croatian)
Currently translated at 100.0% (267 of 267 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hr/
2023-05-22 09:00:52 +02:00
Milo Ivir 02455465ef Translated using Weblate (Croatian)
Currently translated at 98.1% (2201 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-05-22 09:00:52 +02:00
DignifiedSilence 0858844ecf Translated using Weblate (Japanese)
Currently translated at 100.0% (2243 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-05-22 09:00:52 +02:00
Payman Moghadam 79ae5f6cf0 Translated using Weblate (Persian)
Currently translated at 94.7% (2125 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:52 +02:00
Hồ Nhất Duy 4cf800a350 Translated using Weblate (Vietnamese)
Currently translated at 98.2% (2204 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-05-22 09:00:52 +02:00
Ihor Hordiichuk 57ba36d6c2 Translated using Weblate (Ukrainian)
Currently translated at 98.2% (2203 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-22 09:00:52 +02:00
Payman Moghadam b00f185643 Translated using Weblate (Persian)
Currently translated at 94.3% (2117 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:52 +02:00
Anael González Paz c6ffe7fb2b Translated using Weblate (Spanish)
Currently translated at 98.6% (2213 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-05-22 09:00:52 +02:00
Anael González Paz ea59064054 Translated using Weblate (Spanish)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/es/
2023-05-22 09:00:52 +02:00
Anael González Paz 6597fe00e3 Translated using Weblate (Spanish)
Currently translated at 98.2% (2203 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-05-22 09:00:52 +02:00
Александр 9d3d30318c Translated using Weblate (Russian)
Currently translated at 100.0% (2243 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-22 09:00:52 +02:00
Jeff Huang af2c20b80c Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2243 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-05-22 09:00:52 +02:00
Ihor Hordiichuk 185af78dac Translated using Weblate (Ukrainian)
Currently translated at 97.9% (2196 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-22 09:00:52 +02:00
Payman Moghadam e3a32a880c Translated using Weblate (Persian)
Currently translated at 94.3% (2117 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:52 +02:00
Ihor Hordiichuk fc3fc07923 Translated using Weblate (Ukrainian)
Currently translated at 97.0% (2177 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-22 09:00:52 +02:00
Payman Moghadam ddf36b2fa2 Translated using Weblate (Persian)
Currently translated at 94.3% (2117 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-22 09:00:52 +02:00
Ihor Hordiichuk 22a4444096 Translated using Weblate (Ukrainian)
Currently translated at 97.0% (2176 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-22 09:00:52 +02:00
Александр 5e84410027 Translated using Weblate (Russian)
Currently translated at 100.0% (2243 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-22 09:00:52 +02:00
Ihor Hordiichuk 2633304afb Translated using Weblate (Ukrainian)
Currently translated at 97.0% (2176 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-22 09:00:52 +02:00
Александр 0343b57e14 Translated using Weblate (Russian)
Currently translated at 98.3% (2207 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-22 09:00:52 +02:00
Ihor Hordiichuk 3ffddbf18a Translated using Weblate (Ukrainian)
Currently translated at 97.0% (2176 of 2243 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-22 09:00:51 +02:00
Chocobozzz 8527f4b163
Fix menu dropdowns
Better responsive
Avoid menu scrollbar displayed in notification popove
2023-05-22 08:22:57 +02:00
Chocobozzz 9ba1faa2ee
Fix lowest email port 2023-05-19 15:33:26 +02:00
Chocobozzz c0b5a5eb4b
Use saveInTransactionWithRetries helper 2023-05-19 15:20:12 +02:00
Chocobozzz d1c64fd970
Fix missing wait jobs 2023-05-19 15:05:32 +02:00
Chocobozzz 26818a73ba
Add expect message to ease debug 2023-05-19 14:49:00 +02:00
Chocobozzz 3733175b6b
Remove wait before publishing master playlist
It doesn't seem necessary
2023-05-19 14:44:57 +02:00
Chocobozzz ec720affe9
Correctly fix s3 live sync 2023-05-19 14:44:25 +02:00
Chocobozzz bcdfd87906
Publish runner 2023-05-19 14:40:38 +02:00
Chocobozzz cfa6176381
Fix runner cleanup test 2023-05-19 14:35:03 +02:00
Chocobozzz 476ce1d7f4
Add bulk actions on runner jobs 2023-05-19 14:27:27 +02:00
Chocobozzz 01283e2066
Improve remote runner config UX 2023-05-19 14:11:22 +02:00
Chocobozzz be61627067
Fix lowest server port 2023-05-19 13:57:44 +02:00
Chocobozzz def4ea4f38
More robust chunk handler 2023-05-19 13:52:38 +02:00
Chocobozzz 6403a6bd01
peertube runner tests in parallel 2023-05-19 13:33:27 +02:00
Chocobozzz 30453cb5ba
Wait master playlist generation 2023-05-19 12:01:36 +02:00
Chocobozzz 72d606dc07
Avoid uploading empty master file 2023-05-19 11:03:47 +02:00
Chocobozzz 296d07c6fe
Prefer to wait before processing new jobs 2023-05-19 10:16:43 +02:00
Chocobozzz 472170b4f9
Avoid aborting completing jobs 2023-05-19 10:10:41 +02:00
Chocobozzz 2617295569
Add % to runner job percentage 2023-05-19 10:10:19 +02:00
Chocobozzz a5cf9c9867
Don't run ffmpeg twice for lives 2023-05-19 09:40:30 +02:00
Chocobozzz fe7019b232
Fix peertube runner concurrency 2023-05-19 09:23:20 +02:00
Chocobozzz ef2e6aabf7
Force ffmpeg to exit on abort 2023-05-17 16:52:56 +02:00
Chocobozzz e901579b00
Fix tests 2023-05-17 16:43:05 +02:00
Chocobozzz f86ff3a026
Prevent uninstall error on install error 2023-05-17 16:19:30 +02:00
Chocobozzz 1281e6a5f7
Fix bootstrap utility classes on RTL layourt 2023-05-17 15:30:46 +02:00
Chocobozzz 42379e4eef
Fix table th on RTL layout 2023-05-17 15:19:40 +02:00
Chocobozzz d3fcf1c57a
Fix pending subscription deletion 2023-05-17 15:08:40 +02:00
Chocobozzz f530dde244
Prevent notification from pending subscriptions 2023-05-17 15:02:23 +02:00
Chocobozzz d381e967c4
Add nginx config to receive runner job results 2023-05-17 14:58:29 +02:00
Chocobozzz d3ab2f63b6
Remove uneeded date pipe 2023-05-17 14:56:35 +02:00
Chocobozzz f383c7c881
Increase last runner contact update 2023-05-17 14:50:12 +02:00
Chocobozzz d38541fd59
More robust accept job controller 2023-05-17 14:47:17 +02:00
Chocobozzz 77666e3433
Fix docker compose guide 2023-05-16 10:38:04 +02:00
Chocobozzz cc518fdbcb
Fix test 2023-05-16 10:10:58 +02:00
Chocobozzz 49b80bd9e1
Use atomic rename 2023-05-16 10:06:07 +02:00
Chocobozzz 0d6a8289fb
Better runner error UX when server is not run 2023-05-16 09:27:49 +02:00
Chocobozzz 2870570505
Provide public RTMP URL to runners 2023-05-16 09:12:50 +02:00
Chocobozzz b30ad9888f
Add config file merging in upgrade script 2023-05-16 08:59:05 +02:00
Chocobozzz aa54733149
Add retries to all webtorrent tests 2023-05-15 16:16:41 +02:00
Chocobozzz 261dac403a
More robust test 2023-05-15 15:42:16 +02:00
Chocobozzz 5a05c14573
Force live stream termination 2023-05-15 15:06:14 +02:00
Chocobozzz 1a5b7dff7f
Fix dropdown item in RTL 2023-05-15 14:23:11 +02:00
Chocobozzz 18a2164366
Don't run the server in detached state 2023-05-15 14:02:13 +02:00
Chocobozzz 8eb6a9eb2b
Fix test 2023-05-15 13:56:08 +02:00
Chocobozzz c08a7f16e7
Don't save the session twice 2023-05-15 13:56:00 +02:00
Chocobozzz a63943feae
Increase request retry interval
CI seems to have a slow disk?
2023-05-15 11:44:33 +02:00
Chocobozzz 339d3fba83
Allow to retry some tests that may fail 2023-05-15 11:41:55 +02:00
Chocobozzz be3ec61a66
Atomic live segment file write 2023-05-15 11:09:16 +02:00
Chocobozzz 65b2ec673d
Fix SQL query 2023-05-12 09:06:16 +02:00
Chocobozzz 5752683ea5
Increase test timeouts 2023-05-11 16:33:30 +02:00
Chocobozzz 85c20aaeb9
Set actor preferred name case insensitive 2023-05-11 16:16:27 +02:00
Chocobozzz 823c34c07f
Fix reset sequelize instance 2023-05-11 15:03:47 +02:00
Chocobozzz 81f14b9112
Correctly wait for live segment generation 2023-05-11 11:41:43 +02:00
Chocobozzz c106db1413
Fix tests 2023-05-10 16:23:55 +02:00
Chocobozzz c17a55fbca
Support handles starting with @ 2023-05-10 14:55:37 +02:00
Chocobozzz 0ef18e5b89
Reduce time to throw an error on live problem 2023-05-10 14:52:02 +02:00
Chocobozzz 7815dc450e
Prevent invalid end watch section warnings 2023-05-10 14:23:59 +02:00
Chocobozzz bc3bd960e3
Upgrade hls.js
Should fix a fragment loading crash
2023-05-10 14:20:40 +02:00
Chocobozzz 644391bee6
Fix test cleanup 2023-05-10 13:57:06 +02:00
Chocobozzz 7590f7a868
Add more tests on registration request conflict 2023-05-10 11:53:04 +02:00
Chocobozzz 89fc014262
Catch metrics error 2023-05-10 11:25:24 +02:00
Chocobozzz 34023e1253
Fix S3 live sync
Ensure TS chunks referenced in M3U8 playlist are already uploaded on S3
2023-05-10 11:16:05 +02:00
John Livingston f9eee54f2a
Fix #5744: Missing plugins-global.css + missing async (#5746)
* Fix #5744: Missing plugins-global.css + missing async

* Modifications required by Chocobozzz.

* Styling

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2023-05-10 09:54:44 +02:00
kontrollanten 674f8ddd41
feat(server): add redis sentinel support (#5593)
* feat(server): add redis sentinel support

closes #5141

* Styling

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
2023-05-10 09:52:50 +02:00
Chocobozzz 5170f492b9
Try to have more robust live tests 2023-05-10 09:30:33 +02:00
Chocobozzz 9d1e41e8bb
Increase timeouts 2023-05-10 09:02:42 +02:00
Chocobozzz ce1b5ba78c
Correctly cleanup sql command 2023-05-10 08:43:16 +02:00
Chocobozzz 2f63f629ad
Fix subscribe button responsive 2023-05-09 13:53:33 +02:00
Chocobozzz f77043f96e
Update translations 2023-05-09 11:25:54 +02:00
Chocobozzz b7221c1d94
Merge remote-tracking branch 'weblate/develop' into develop 2023-05-09 11:23:41 +02:00
Chocobozzz 76ad705ecb
Add peertube-runner CLI doc 2023-05-09 11:20:08 +02:00
Chocobozzz 5b2ee4e6ca
Add peertube-runner version info 2023-05-09 10:45:37 +02:00
Chocobozzz 8d5ffb0169
Add node shebang 2023-05-09 10:43:35 +02:00
Chocobozzz 9aff314023
Use @peertube org for npm 2023-05-09 10:16:18 +02:00
Chocobozzz 21c8db6905
Add npmignore to peertube-runner 2023-05-09 10:14:58 +02:00
Chocobozzz 85ec2d2e25
Update gitignore 2023-05-09 10:11:11 +02:00
Chocobozzz 902b16af03
Breaking: remove node 14 support 2023-05-09 10:02:54 +02:00
Chocobozzz 1c7fbce4fa
Increase timeout 2023-05-09 08:58:15 +02:00
Milo Ivir 3653b0b512 Translated using Weblate (Croatian)
Currently translated at 100.0% (2201 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-05-09 08:57:41 +02:00
Ihor Hordiichuk fabe350bca Translated using Weblate (Ukrainian)
Currently translated at 98.6% (2172 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-09 08:57:41 +02:00
Payman Moghadam bead26f244 Translated using Weblate (Persian)
Currently translated at 96.1% (2117 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-09 08:57:41 +02:00
Hồ Nhất Duy 9854bdf905 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (2201 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/vi/
2023-05-09 08:57:41 +02:00
Jurij Podgoršek 7d5d8b7665 Translated using Weblate (Slovenian)
Currently translated at 7.2% (17 of 234 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/sl/
2023-05-09 08:57:41 +02:00
Jeff Huang 6547d9b3db Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2201 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-05-09 08:57:41 +02:00
Ihor Hordiichuk 903631b117 Translated using Weblate (Ukrainian)
Currently translated at 98.6% (2172 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-09 08:57:41 +02:00
Payman Moghadam 2c015b5419 Translated using Weblate (Persian)
Currently translated at 96.1% (2117 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-09 08:57:41 +02:00
Александр 76ecc7e2c1 Translated using Weblate (Russian)
Currently translated at 100.0% (2201 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-09 08:57:41 +02:00
Payman Moghadam d22ca57af6 Translated using Weblate (Persian)
Currently translated at 96.1% (2117 of 2201 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-09 08:57:41 +02:00
Chocobozzz 21609258de Increase timeouts 2023-05-09 08:57:34 +02:00
Chocobozzz a687879e94 Reload the video after waiting for the files lock 2023-05-09 08:57:34 +02:00
Chocobozzz e7d8e2b245 Fix audio transcoding copy 2023-05-09 08:57:34 +02:00
Chocobozzz dd3f99434c Fix studio tests 2023-05-09 08:57:34 +02:00
Chocobozzz ab14f0e0dc Prefer video studio instead of video edition
Clearer and easier to find in the project
2023-05-09 08:57:34 +02:00
Chocobozzz 5e47f6ab98 Support studio transcoding in peertube runner 2023-05-09 08:57:34 +02:00
Chocobozzz 6a49056026 Add TMP persistent directory
To store files that must be preserved between peertube restarts
2023-05-09 08:57:34 +02:00
Chocobozzz 3a0c2a77b1 Enable external plugins to test the PR 2023-05-09 08:57:34 +02:00
Chocobozzz 9a3db678f5 Fix import video file lock 2023-05-09 08:57:34 +02:00
Chocobozzz 94bb740b49 Add runner jobs openapi 2023-05-09 08:57:34 +02:00
Chocobozzz cc2abbc320 Fix next video state after optimize/audio merge 2023-05-09 08:57:34 +02:00
Chocobozzz 1772b383de Add peertube runner cli 2023-05-09 08:57:34 +02:00
Chocobozzz 118626c875 Implement runner in client side 2023-05-09 08:57:34 +02:00
Chocobozzz e592df48c7 Update i18n server strings 2023-05-09 08:57:34 +02:00
Chocobozzz 18c53ef949 Fix activitypub doc URL 2023-05-09 08:57:34 +02:00
Chocobozzz b708c9e464 Update tools doc 2023-05-09 08:57:34 +02:00
Chocobozzz c50bb3c561 Remove unmaintained help script 2023-05-09 08:57:34 +02:00
Chocobozzz d102de1b38 Add runner server tests 2023-05-09 08:57:34 +02:00
Chocobozzz 2fe978744e Remove transcoding scripts
We don't have enough energy to maintain them
2023-05-09 08:57:34 +02:00
Chocobozzz 0c9668f779 Implement remote runner jobs in server
Move ffmpeg functions to @shared
2023-05-09 08:57:34 +02:00
Chocobozzz 6bcb854cde
Fix unregister default value 2023-05-05 14:47:24 +02:00
Chocobozzz 5f3505ba78
Fix changelog of secret config for docker 2023-05-05 14:24:27 +02:00
Chocobozzz 841ddf8886
Don't call plugin register/unregister methods 2023-05-05 14:24:27 +02:00
Chocobozzz 257fa0d1a0
Add version comment 2023-05-05 14:24:27 +02:00
Alvar C.H. Freude 9c50bf69f1 Add compatibility with FreeBSD ls
The ls command of FreebSD does not understand the --search=time parameter for the ls command. "ls -t" is equivalent and behaves on Linux in the same way.
2023-05-04 08:03:36 +02:00
Chocobozzz a166257611
Update translations 2023-05-02 10:35:52 +02:00
Chocobozzz ee252a0441
Merge remote-tracking branch 'weblate/develop' into develop 2023-05-02 10:34:27 +02:00
Chocobozzz 7b59f76e82
Remove extra space 2023-05-02 10:33:50 +02:00
Payman Moghadam c14521a850 Translated using Weblate (Persian)
Currently translated at 96.1% (2119 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Milo Ivir 11f7079447 Translated using Weblate (Croatian)
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-05-02 10:31:12 +02:00
Milo Ivir 66a1f849e0 Translated using Weblate (Croatian)
Currently translated at 100.0% (134 of 134 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/hr/
2023-05-02 10:31:12 +02:00
Ewout van Mansom 5a22981f8f Translated using Weblate (Dutch)
Currently translated at 97.3% (2145 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2023-05-02 10:31:12 +02:00
Payman Moghadam 3db9f8bf0e Translated using Weblate (Persian)
Currently translated at 96.1% (2119 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Milo Ivir 212c55a9f5 Translated using Weblate (German)
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-05-02 10:31:12 +02:00
Fatih Özsoy d2f8170d40 Translated using Weblate (Turkish)
Currently translated at 100.0% (234 of 234 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/tr/
2023-05-02 10:31:12 +02:00
Fatih Özsoy 5674496443 Translated using Weblate (Turkish)
Currently translated at 35.9% (793 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/tr/
2023-05-02 10:31:12 +02:00
Payman Moghadam ca3734631f Translated using Weblate (Persian)
Currently translated at 96.0% (2117 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Milo Ivir de757c3f97 Translated using Weblate (Croatian)
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-05-02 10:31:12 +02:00
Milo Ivir 44ba8aaa4b Translated using Weblate (Croatian)
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-05-02 10:31:12 +02:00
Milo Ivir 7dd55cc190 Translated using Weblate (Croatian)
Currently translated at 100.0% (134 of 134 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/hr/
2023-05-02 10:31:12 +02:00
Payman Moghadam cb51a9c1c3 Translated using Weblate (Persian)
Currently translated at 95.3% (2100 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Ihor Hordiichuk 8659ec5686 Translated using Weblate (Ukrainian)
Currently translated at 97.5% (2150 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-02 10:31:12 +02:00
Flavio F. M aa85f27b22 Translated using Weblate (Portuguese (Brazil))
Currently translated at 66.2% (1459 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2023-05-02 10:31:12 +02:00
Daniel Dutra dcfdbf273e Translated using Weblate (Portuguese (Brazil))
Currently translated at 66.2% (1459 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pt_BR/
2023-05-02 10:31:12 +02:00
DignifiedSilence 3b75186a31 Translated using Weblate (Japanese)
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-05-02 10:31:12 +02:00
T.S b78e028754 Translated using Weblate (Japanese)
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-05-02 10:31:12 +02:00
Payman Moghadam cf17f28033 Translated using Weblate (Persian)
Currently translated at 95.1% (2096 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Payman Moghadam 0f2f872de3 Translated using Weblate (Persian)
Currently translated at 95.1% (2096 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Ihor Hordiichuk 6a07ee8900 Translated using Weblate (Ukrainian)
Currently translated at 97.5% (2150 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-05-02 10:31:12 +02:00
Payman Moghadam e748a75c59 Translated using Weblate (Persian)
Currently translated at 95.1% (2096 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Payman Moghadam fd49c13183 Translated using Weblate (Persian)
Currently translated at 94.9% (2091 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Payman Moghadam ecf295ba5a Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Ilia cc07b45be1 Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Ilia 27b8410d90 Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Payman Moghadam 24654dfe0b Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Payman Moghadam 41c35ad904 Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:12 +02:00
Ilia 31c3e5ac56 Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:11 +02:00
Masood Masaeli 13fdd30415 Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:11 +02:00
Payman Moghadam 581ecdeb09 Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:11 +02:00
Blood Axe cecfb3d2f0 Translated using Weblate (Norwegian Bokmål)
Currently translated at 64.0% (1410 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-05-02 10:31:11 +02:00
Payman Moghadam 08c5617119 Translated using Weblate (Persian)
Currently translated at 93.8% (2067 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:11 +02:00
Jiri Podhorecky d8832af492 Translated using Weblate (Czech)
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-05-02 10:31:11 +02:00
Payman Moghadam 153316a8f1 Translated using Weblate (Persian)
Currently translated at 100.0% (259 of 259 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/fa/
2023-05-02 10:31:11 +02:00
Jeff Huang e0c7e76e41 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/zh_Hant/
2023-05-02 10:31:11 +02:00
kafbatur kafbatarsson 969bae42bc Translated using Weblate (Icelandic)
Currently translated at 100.0% (134 of 134 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/is/
2023-05-02 10:31:11 +02:00
kafbatur kafbatarsson afa2fa1e83 Translated using Weblate (Icelandic)
Currently translated at 99.4% (2190 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/is/
2023-05-02 10:31:11 +02:00
Александр 4a50dc1cc0 Translated using Weblate (Russian)
Currently translated at 100.0% (2203 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-05-02 10:31:11 +02:00
Payman Moghadam 2d3fdcdc5f Translated using Weblate (Persian)
Currently translated at 93.7% (2066 of 2203 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-05-02 10:31:11 +02:00
Wicklow a8d42c560a
I18n missing parameter (#5782)
* fix syntax

* Missing i18n parameter
2023-05-02 10:31:00 +02:00
Wicklow 73ef4b54aa Don't send replay settings on not replayed lives 2023-04-19 15:59:36 +02:00
Chocobozzz f8c62d3414
Fix lint 2023-04-17 10:06:21 +02:00
Chocobozzz 82d1653d79
Prevent crash on plugin ws error 2023-04-17 09:51:18 +02:00
Chocobozzz 208c97e111
Always translate user role 2023-04-17 09:21:02 +02:00
chocobozzz 29ccdcb51f Translated using Weblate (French (France) (fr_FR))
Currently translated at 100.0% (261 of 261 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/fr_FR/
2023-04-17 09:01:34 +02:00
Chocobozzz 01cee4e740
Update translations 2023-04-17 08:55:10 +02:00
Chocobozzz 85b0ed70a1
Merge remote-tracking branch 'weblate/develop' into develop 2023-04-17 08:53:07 +02:00
Payman Moghadam da41a5a6f4 Translated using Weblate (Persian)
Currently translated at 94.0% (2068 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-17 08:52:59 +02:00
Chocobozzz 3ba6af5265
Better noscript wording 2023-04-17 08:52:45 +02:00
Chocobozzz df0bd13210
Add missing strings to translate 2023-04-17 08:51:51 +02:00
Chocobozzz fee3d77d63
Add user role label to translatable strings 2023-04-17 08:49:52 +02:00
Payman Moghadam b6102a5690 Translated using Weblate (Persian)
Currently translated at 94.0% (2068 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-16 12:18:04 +02:00
Blood Axe 48a1284fb1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 60.7% (1336 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-16 09:28:57 +02:00
Payman Moghadam 537a6a73cc Translated using Weblate (Persian)
Currently translated at 93.9% (2065 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-16 09:28:56 +02:00
Vri 26c035c951 Translated using Weblate (German)
Currently translated at 100.0% (2199 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-04-16 09:28:55 +02:00
Jiri Podhorecky 5b207706de Translated using Weblate (Czech)
Currently translated at 99.7% (2194 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-04-16 09:28:55 +02:00
Ewout van Mansom d5f9ae7b5e Translated using Weblate (Dutch)
Currently translated at 97.7% (2149 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nl/
2023-04-15 10:42:14 +02:00
Payman Moghadam 7105cb970e Translated using Weblate (Persian)
Currently translated at 93.6% (2059 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-15 10:42:14 +02:00
Milo Ivir d1a557774c Translated using Weblate (Croatian)
Currently translated at 100.0% (2199 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-04-14 10:26:50 +02:00
Vri 6c5949e759 Translated using Weblate (German)
Currently translated at 100.0% (2199 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/de/
2023-04-14 10:26:50 +02:00
Milo Ivir 668341cc18 Translated using Weblate (Croatian)
Currently translated at 100.0% (256 of 256 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/hr/
2023-04-14 10:26:50 +02:00
Milo Ivir e01ac719bc Translated using Weblate (Croatian)
Currently translated at 100.0% (2199 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hr/
2023-04-14 10:26:50 +02:00
Milo Ivir 045736dc9d Translated using Weblate (Croatian)
Currently translated at 100.0% (134 of 134 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/hr/
2023-04-14 10:26:50 +02:00
FediverseTV 2af59a5a27 Translated using Weblate (Spanish)
Currently translated at 100.0% (2199 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-04-14 10:26:50 +02:00
FediverseTV 2f9b374ad9 Translated using Weblate (Spanish)
Currently translated at 96.9% (2133 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/es/
2023-04-14 10:26:50 +02:00
Blood Axe d5765d5f7b Translated using Weblate (Norwegian Bokmål)
Currently translated at 52.6% (1158 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:50 +02:00
Blood Axe 97b2f93692 Translated using Weblate (Norwegian Bokmål)
Currently translated at 46.2% (1018 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:50 +02:00
Blood Axe 42e4c9c336 Translated using Weblate (Norwegian Bokmål)
Currently translated at 41.6% (916 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:50 +02:00
Blood Axe b7e509b6ca Translated using Weblate (Norwegian Bokmål)
Currently translated at 34.8% (767 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:50 +02:00
Blood Axe a1779d2683 Translated using Weblate (Norwegian Bokmål)
Currently translated at 8.1% (180 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:50 +02:00
Payman Moghadam 89452924f5 Translated using Weblate (Persian)
Currently translated at 93.5% (2057 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:50 +02:00
Payman Moghadam 77448fd31c Translated using Weblate (Persian)
Currently translated at 93.5% (2057 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:50 +02:00
Payman Moghadam bf09458f44 Translated using Weblate (Persian)
Currently translated at 93.5% (2057 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:50 +02:00
Payman Moghadam 6879b4bddb Translated using Weblate (Persian)
Currently translated at 93.5% (2057 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:50 +02:00
Payman Moghadam f2a31c855b Translated using Weblate (Persian)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/fa/
2023-04-14 10:26:50 +02:00
Payman Moghadam b8f283385e Translated using Weblate (Persian)
Currently translated at 100.0% (256 of 256 strings)

Translation: PeerTube/server
Translate-URL: https://weblate.framasoft.org/projects/peertube/server/fa/
2023-04-14 10:26:50 +02:00
Payman Moghadam 14d5cfe70e Translated using Weblate (Persian)
Currently translated at 93.4% (2056 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:50 +02:00
Payman Moghadam 8a3206421e Translated using Weblate (Persian)
Currently translated at 93.4% (2056 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam 80edcc36ac Translated using Weblate (Persian)
Currently translated at 93.3% (2053 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam f7e83bab9b Translated using Weblate (Persian)
Currently translated at 93.2% (2051 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam ca4ee24661 Translated using Weblate (Persian)
Currently translated at 93.2% (2051 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam fd88f4dc32 Translated using Weblate (Persian)
Currently translated at 93.2% (2051 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam ad49485d0c Translated using Weblate (Persian)
Currently translated at 93.2% (2050 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam 183ae9ec64 Translated using Weblate (Persian)
Currently translated at 93.2% (2050 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam e1d01dc041 Translated using Weblate (Persian)
Currently translated at 93.2% (2050 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam 9d790a9812 Translated using Weblate (Persian)
Currently translated at 91.3% (2009 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam 532ef1cb61 Translated using Weblate (Persian)
Currently translated at 91.3% (2008 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam 26151f5b69 Translated using Weblate (Persian)
Currently translated at 87.7% (1929 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam 7aede2c8fb Translated using Weblate (Persian)
Currently translated at 87.5% (1925 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Ilia 810cf0638e Translated using Weblate (Persian)
Currently translated at 87.5% (1925 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam ac24de4e7d Translated using Weblate (Persian)
Currently translated at 87.5% (1925 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam 473de3b0fc Translated using Weblate (Persian)
Currently translated at 87.5% (1925 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam b1f31a26e7 Translated using Weblate (Persian)
Currently translated at 87.4% (1924 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Payman Moghadam 702c8fa4d9 Translated using Weblate (Persian)
Currently translated at 86.4% (1901 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fa/
2023-04-14 10:26:49 +02:00
Apps 3b06c60cab Translated using Weblate (French (France) (fr_FR))
Currently translated at 97.4% (2142 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2023-04-14 10:26:49 +02:00
T.S 5d9d76dd99 Translated using Weblate (Japanese)
Currently translated at 100.0% (2199 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-04-14 10:26:49 +02:00
Jiri Podhorecky e0abb0aafe Translated using Weblate (Czech)
Currently translated at 99.6% (2191 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-04-14 10:26:49 +02:00
Jiri Podhorecky a78b1e527b Translated using Weblate (Czech)
Currently translated at 98.9% (2175 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/cs/
2023-04-14 10:26:49 +02:00
Mats Blomdahl a47fd7b504 Translated using Weblate (Swedish)
Currently translated at 85.7% (1886 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-04-14 10:26:49 +02:00
Mats Blomdahl b4caeeb443 Translated using Weblate (Swedish)
Currently translated at 84.1% (1850 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-04-14 10:26:49 +02:00
Ihor Hordiichuk 8e5c446553 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (135 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/uk/
2023-04-14 10:26:49 +02:00
Ihor Hordiichuk d3ff2da406 Translated using Weblate (Ukrainian)
Currently translated at 97.7% (2149 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/uk/
2023-04-14 10:26:49 +02:00
Mats Blomdahl 10e93f6776 Translated using Weblate (Swedish)
Currently translated at 83.1% (1828 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/sv/
2023-04-14 10:26:49 +02:00
adam iter 7f3f496852 Translated using Weblate (Polish)
Currently translated at 78.9% (1736 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/pl/
2023-04-14 10:26:49 +02:00
Александр fd35268f16 Translated using Weblate (Russian)
Currently translated at 100.0% (2199 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ru/
2023-04-14 10:26:49 +02:00
T.S 4b6e4f8ca2 Translated using Weblate (Japanese)
Currently translated at 99.9% (2198 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-04-14 10:26:49 +02:00
DignifiedSilence 670e909e31 Translated using Weblate (Japanese)
Currently translated at 99.9% (2198 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-04-14 10:26:49 +02:00
DignifiedSilence 57b3a82aa0 Translated using Weblate (Japanese)
Currently translated at 99.9% (2198 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-04-14 10:26:49 +02:00
Erik Guldberg b03dc150c1 Translated using Weblate (Norwegian Bokmål)
Currently translated at 7.5% (165 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:48 +02:00
T.S 7ffafcbadf Translated using Weblate (Japanese)
Currently translated at 96.7% (2128 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/ja/
2023-04-14 10:26:48 +02:00
Erik Guldberg a86017c97a Translated using Weblate (Norwegian Bokmål)
Currently translated at 6.9% (152 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:48 +02:00
Txopi b134b55864 Translated using Weblate (Basque)
Currently translated at 39.3% (865 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/eu/
2023-04-14 10:26:48 +02:00
Erik Guldberg cf4b5d92be Translated using Weblate (Norwegian Bokmål)
Currently translated at 77.7% (105 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/nb_NO/
2023-04-14 10:26:48 +02:00
Erik Guldberg f7ab36cb82 Translated using Weblate (Norwegian Bokmål)
Currently translated at 6.1% (135 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:48 +02:00
Balázs Meskó 65e72c18cd Translated using Weblate (Hungarian)
Currently translated at 76.1% (1674 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/hu/
2023-04-14 10:26:48 +02:00
Erik Guldberg 49b8dd3f2a Translated using Weblate (Norwegian Bokmål)
Currently translated at 68.1% (92 of 135 strings)

Translation: PeerTube/player
Translate-URL: https://weblate.framasoft.org/projects/peertube/player/nb_NO/
2023-04-14 10:26:48 +02:00
Erik Guldberg 8ff9b1cd3c Translated using Weblate (Norwegian Bokmål)
Currently translated at 5.0% (110 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/nb_NO/
2023-04-14 10:26:48 +02:00
chocobozzz b69deb9eec Translated using Weblate (French (France) (fr_FR))
Currently translated at 96.6% (2126 of 2199 strings)

Translation: PeerTube/angular
Translate-URL: https://weblate.framasoft.org/projects/peertube/angular/fr_FR/
2023-04-14 10:26:48 +02:00
Chocobozzz e7c89cc3f3
Allow to update a live with untouched privacy 2023-04-14 10:14:40 +02:00
Chocobozzz 8b95440c8a
Fix button theming 2023-04-14 09:46:45 +02:00
Chocobozzz d15531fb35
Fix follow links 2023-04-14 09:42:50 +02:00
Chocobozzz 848347f193
Prevent exception when headers are already sent 2023-04-14 09:34:53 +02:00
Chocobozzz 3f9f1bceb6
Breaking: docker requires compose v2 2023-04-14 09:31:04 +02:00
Wicklow 2a4c0d8bbe
Feature/filter already watched videos (#5739)
* filter already watched videos

* Updated code based on review comments
2023-04-12 09:32:20 +02:00
Chocobozzz 0cda019c1d
Remove invalid jsonld property 2023-04-11 14:06:46 +02:00
Joël Galeran 3458e8ba0d
feat(docker): make database name configurable (#5734)
* feat(docker): make database name configurable

WIP
Related https://github.com/Chocobozzz/PeerTube/issues/5708

* Update .env

* PEERTUBE_DB_NAME & add comments
2023-04-07 10:52:49 +02:00
Wicklow b302c80dc0
feature/ability to disable video history by default (#5728)
* draft: ability to disable video history by default

* Update configuration and add tests

* Updated code based on review comments

* Add tests on registration and video quota

* Remove required video quotas in query

* Fix tests
2023-04-07 10:09:54 +02:00
Joël Galeran 9258e9a4a3
feat(about): render images in markdown (#5732)
* feat(about): render images in markdown

Closes https://github.com/Chocobozzz/PeerTube/issues/5710

* Update edit-instance-information.component.html

* use `markdownType="enhanced"`
2023-04-05 11:12:00 +02:00
Mats Blomdahl 907bcfa02c
Misc wording fixes, while learning how to test/contribute (#5727)
* Misc wording fixes, while learning how to test/contribute

- Remove duplicate discrimination topic in Code of Conduct
- Correct capitalization of some brands (PeerTube, GitHub)
- Replace `npm` with `yarn`, for additional consistency

* Revert `yarn` to `npm run` per PR #5727 comment

* Remove note on how to start Redis on Windows/WSL
2023-04-05 08:51:38 +02:00
Chocobozzz 00ee545c24
Remove $ for bash commands
It prevents easy copy
2023-04-04 09:18:06 +02:00
ar9708 b5f38b7898 Correct API docs link in ./config/production.yaml.example
Just a broken link. :)
2023-04-03 11:08:32 +02:00
Chocobozzz bb7e5605d1
Use hook inside the transaction
To prevent serialization issue
2023-03-31 13:28:41 +02:00
Wicklow 05a60d8599
Feature/Add replay privacy (#5692)
* Add replay settings feature

* Fix replay settings behaviour

* Fix tests

* Fix tests

* Fix tests

* Update openapi doc and fix tests

* Add tests and fix code

* Models correction

* Add migration and update controller and middleware

* Add check params tests

* Fix video live middleware

* Updated code based on review comments
2023-03-31 09:12:21 +02:00
Chocobozzz ebd61437c1
Revert matrix for docker build 2023-03-27 09:00:16 +02:00
Chocobozzz 1e3e64a679
Fix tests 2023-03-27 08:43:50 +02:00
Chocobozzz d91ce83d39
Add filter:html.client.json-ld.result hook 2023-03-24 18:37:55 +01:00
Chocobozzz 80d7d180a3
Merge branch 'release/5.1.0' into develop 2023-03-23 08:57:01 +01:00
Chocobozzz 43fe59ae86
Fix docker ci matrix 2023-03-23 08:55:27 +01:00
Chocobozzz b070b2e5e8
Try to fix docker build timeout 2023-03-22 11:25:30 +01:00
Chocobozzz b926a23c62
Stop testing broken youtube-dl 2023-03-22 11:25:30 +01:00
Chocobozzz d6fcbe8d6d
Try to fix docker build timeout 2023-03-22 09:14:20 +01:00
kontrollanten 6f640ccb48 fix(object-storage-proxy): set content-range 2023-03-22 07:35:36 +01:00
Chocobozzz 951414fc62
Merge branch 'release/5.1.0' into develop 2023-03-21 09:17:25 +01:00
Chocobozzz 1c41b5c1ac
Add infohash test for VOD 2023-03-20 08:57:01 +01:00
3849 changed files with 561113 additions and 318172 deletions

View file

@ -1,5 +1,6 @@
{
"extends": "standard-with-typescript",
"root": true,
"rules": {
"eol-last": [
"error",
@ -39,6 +40,9 @@
}
],
"quotes": "off",
"no-constant-binary-expression": "error",
"@typescript-eslint/indent": [
"error",
2,
@ -114,6 +118,8 @@
"@typescript-eslint/consistent-type-exports": "off",
"@typescript-eslint/key-spacing": "off",
"@typescript-eslint/no-unsafe-argument": "off",
"@typescript-eslint/ban-types": [
"error",
{
@ -126,16 +132,20 @@
]
},
"ignorePatterns": [
"node_modules/"
"node_modules",
"packages/tests/fixtures",
"apps/**/dist",
"packages/**/dist",
"server/dist",
"packages/types-generator/tests",
"*.js",
"/client",
"/dist"
],
"parserOptions": {
"EXPERIMENTAL_useSourceOfProjectReferenceRedirect": true,
"project": [
"./tsconfig.json",
"./shared/tsconfig.json",
"./scripts/tsconfig.json",
"./server/tsconfig.json",
"./server/tools/tsconfig.json"
]
"./tsconfig.eslint.json"
],
"EXPERIMENTAL_useSourceOfProjectReferenceRedirect": true
}
}

View file

@ -53,13 +53,25 @@ interested in, user interface, design, decentralized architecture...
You can help to write the documentation of the REST API, code, architecture,
demonstrations.
For the REST API you can see the documentation in [/support/doc/api](https://github.com/Chocobozzz/PeerTube/tree/develop/support/doc/api) directory.
Then, you can just open the `openapi.yaml` file in a special editor like [http://editor.swagger.io/](http://editor.swagger.io/) to easily see and edit the documentation. You can also use [redoc-cli](https://github.com/Redocly/redoc/blob/master/cli/README.md) and run `redoc-cli serve --watch support/doc/api/openapi.yaml` to see the final result.
### User documentation
The official user documentation is available on https://docs.joinpeertube.org/
You can update it by writing markdown files in the following repository: https://framagit.org/framasoft/peertube/documentation/
### REST API documentation
The [REST API documentation](https://docs.joinpeertube.org/api-rest-reference.html) is generated from `support/doc/api/openapi.yaml` file.
To quickly get a preview of your changes, you can generate the documentation *on the fly* using the following command:
```
npx @redocly/cli preview-docs ./support/doc/api/openapi.yaml
```
Some hints:
* Routes are defined in [/server/controllers/](https://github.com/Chocobozzz/PeerTube/tree/develop/server/controllers) directory
* Parameters validators are defined in [/server/middlewares/validators](https://github.com/Chocobozzz/PeerTube/tree/develop/server/middlewares/validators) directory
* Models sent/received by the controllers are defined in [/shared/models](https://github.com/Chocobozzz/PeerTube/tree/develop/shared/models) directory
* Routes are defined in [/server/core/controllers/](https://github.com/Chocobozzz/PeerTube/tree/develop/server/core/controllers) directory
* Parameters validators are defined in [/server/core/middlewares/validators](https://github.com/Chocobozzz/PeerTube/tree/develop/server/core/middlewares/validators) directory
* Models sent/received by the controllers are defined in [/packages/models](https://github.com/Chocobozzz/PeerTube/tree/develop/packages/models) directory
## Improve the website
@ -88,23 +100,23 @@ First, you should use a server or PC with at least 4GB of RAM. Less RAM may lead
[the steps](/support/doc/dependencies.md)
to install the dependencies.
1) Install [parallel](https://www.gnu.org/software/parallel/) to be able to run tests.
1) Fork the Github repository.
1) Fork the GitHub repository.
1) Run the following commands.
```
$ git clone https://github.com/Chocobozzz/PeerTube
$ cd PeerTube
$ git remote add me git@github.com:YOUR_GITHUB_USERNAME/PeerTube.git
$ yarn install --pure-lockfile
git clone https://github.com/Chocobozzz/PeerTube
cd PeerTube
git remote add me git@github.com:YOUR_GITHUB_USERNAME/PeerTube.git
yarn install --pure-lockfile
```
Note that development is done on the `develop` branch. If you want to hack on
Peertube, you should switch to that branch. Also note that you have to repeat
PeerTube, you should switch to that branch. Also note that you have to repeat
the `yarn install --pure-lockfile` command.
When you create a new branch you should also tell to use your repo for upload
not default one. To do just do:
```
$ git push --set-upstream me <your branch name>
git push --set-upstream me <your branch name>
```
Then, create a postgres database and user with the values set in the
@ -121,11 +133,11 @@ Enter password for new role: peertube
Then enable extensions PeerTube needs:
```
$ sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_dev
$ sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_dev
sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" peertube_dev
sudo -u postgres psql -c "CREATE EXTENSION unaccent;" peertube_dev
```
Peertube also requires a running redis server, no special setup is needed for
PeerTube also requires a running redis server, no special setup is needed for
this.
In dev mode, administrator username is **root** and password is **test**.
@ -141,7 +153,7 @@ You can get a complete PeerTube development setup with Gitpod, a free one-click
To develop on the server-side:
```
$ npm run dev:server
npm run dev:server
```
Then, the server will listen on `localhost:9000`. When server source files
@ -157,7 +169,7 @@ More detailed documentation is available:
To develop on the client side:
```
$ npm run dev:client
npm run dev:client
```
The API will listen on `localhost:9000` and the frontend on `localhost:3000`.
@ -175,7 +187,7 @@ File changes are automatically recompiled, injected in the web browser (no need
and the web server is automatically restarted.
```
$ npm run dev
npm run dev
```
### Embed
@ -185,7 +197,7 @@ The generated files (HTML entrypoint and multiple JS and CSS files) are served b
The following command will compile embed files and run the PeerTube server:
```
$ npm run dev:embed
npm run dev:embed
```
### RTL layout
@ -193,7 +205,7 @@ $ npm run dev:embed
To test RTL (right-to-left) layout using `ar` locale:
```
$ npm run dev -- --ar-locale
npm run dev -- --ar-locale
```
### Testing
@ -211,23 +223,23 @@ Create a PostgreSQL user **with the same name as your username** in order to avo
Then, we can create the databases (if they don't already exist):
```
$ sudo -u postgres createuser you_username --createdb --superuser
$ createdb -O peertube peertube_test{1,2,3}
sudo -u postgres createuser you_username --createdb --superuser
createdb -O peertube peertube_test{1,2,3}
```
Build the application and flush the old tests data:
```
$ npm run build
$ npm run clean:server:test
npm run build
npm run clean:server:test
```
To run 3 nodes:
```
$ NODE_APP_INSTANCE=1 NODE_ENV=test npm start
$ NODE_APP_INSTANCE=2 NODE_ENV=test npm start
$ NODE_APP_INSTANCE=3 NODE_ENV=test npm start
NODE_APP_INSTANCE=1 NODE_ENV=test npm start
NODE_APP_INSTANCE=2 NODE_ENV=test npm start
NODE_APP_INSTANCE=3 NODE_ENV=test npm start
```
Then you will get access to the three nodes at `http://127.0.0.1:900{1,2,3}`
@ -242,15 +254,6 @@ To test emails with PeerTube:
* Run [mailslurper](http://mailslurper.com/)
* Run PeerTube using mailslurper SMTP port: `NODE_CONFIG='{ "smtp": { "hostname": "localhost", "port": 2500, "tls": false } }' NODE_ENV=dev node dist/server`
### OpenAPI documentation
The [REST API documentation](https://docs.joinpeertube.org/api/rest-reference.html) is generated from `support/doc/api/openapi.yaml` file.
To quickly get a preview of your changes, you can generate the documentation *on the fly* using the following command:
```
npx @redocly/cli preview-docs ./support/doc/api/openapi.yaml
```
### Environment variables
PeerTube can be configured using environment variables.
@ -278,7 +281,7 @@ You can see the list on the [dedicated documentation](/support/doc/development/l
### CI
PeerTube uses Github actions to run tests every time a commit is pushed or a PR is opened.
PeerTube uses GitHub actions to run tests every time a commit is pushed or a PR is opened.
You can find more information about these tasks on the [dedicated documentation](/support/doc/development/ci.md).
### Monitoring
@ -288,11 +291,11 @@ To do so, see the [dedicated documentation](/support/doc/development/monitoring.
### Test live stream
To easily test a live on PeerTube:
To easily test a live stream on PeerTube:
* Enable live support in web admin configuration
* Create a permanent live on the PeerTube instance
* Get the **RTMP URL** and the **Live stream key**
* Send the live to PeerTube using `ffmpeg` using a local video:
* Send the live stream to PeerTube using `ffmpeg` using a local video:
```
ffmpeg -stream_loop -1 -re -i any-video.mp4 -c copy -f flv rtmp://{RTMP URL}/live/{STREAM KEY}

View file

@ -15,4 +15,4 @@ body:
description: |
Are you up to submit a pull request? Chances are, only a small edit is required, so give it a try:
* Click "Edit this page" if on https://docs.joinpeertube.org
* Edit https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/api/openapi.yaml if on https://docs.joinpeertube.org/api/rest-reference.html
* Edit https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/api/openapi.yaml if on https://docs.joinpeertube.org/api-rest-reference.html

View file

@ -12,12 +12,12 @@ runs:
steps:
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: ${{ inputs.node-version }}
- name: Cache Node.js modules
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: |
**/node_modules
@ -29,3 +29,15 @@ runs:
- name: Install dependencies
shell: bash
run: yarn install --frozen-lockfile
- name: Install peertube runner dependencies
shell: bash
run: cd apps/peertube-runner && yarn install --frozen-lockfile
- name: Install peertube CLI dependencies
shell: bash
run: cd apps/peertube-cli && yarn install --frozen-lockfile
- name: Display PeerTube dependencies
shell: bash
run: ls -l node_modules/@peertube

View file

@ -31,17 +31,18 @@ jobs:
PGHOST: localhost
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: './.github/actions/reusable-prepare-peertube-build'
with:
node-version: '14.x'
node-version: '18.x'
- uses: './.github/actions/reusable-prepare-peertube-run'
- name: Build
run: |
startClient=`date +%s`
npm run build:server
npm run build:client
endClient=`date +%s`
clientBuildTime=$((endClient-startClient))
@ -71,7 +72,7 @@ jobs:
- name: Run benchmark
run: |
node dist/scripts/benchmark.js -o benchmark.json
npm run benchmark-server -- -o benchmark.json
- name: Display result
run: |

View file

@ -29,17 +29,17 @@ jobs:
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
language: [ 'javascript-typescript' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://git.io/codeql-language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
config-file: ./.github/workflows/codeql/codeql-config.yml
@ -51,7 +51,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@ -65,4 +65,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v2

View file

@ -1,4 +1,6 @@
name: "PeerTube CodeQL config"
paths-ignore:
- server/tests
- packages/tests
- packages/server-commands
- packages/types-generator

View file

@ -15,7 +15,7 @@ jobs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
ref: master
- name: Set matrix for build
@ -24,8 +24,8 @@ jobs:
# FIXME: https://github.com/actions/checkout/issues/290
git fetch --force --tags
one="{ \"file\": \"./support/docker/production/Dockerfile.bullseye\", \"ref\": \"develop\", \"tags\": \"chocobozzz/peertube:develop-bullseye\" }"
two="{ \"file\": \"./support/docker/production/Dockerfile.bullseye\", \"ref\": \"master\", \"tags\": \"chocobozzz/peertube:production-bullseye,chocobozzz/peertube:$(git describe --abbrev=0)-bullseye\" }"
one="{ \"file\": \"./support/docker/production/Dockerfile.bookworm\", \"ref\": \"develop\", \"tags\": \"chocobozzz/peertube:develop-bookworm\" }"
two="{ \"file\": \"./support/docker/production/Dockerfile.bookworm\", \"ref\": \"master\", \"tags\": \"chocobozzz/peertube:production-bookworm,chocobozzz/peertube:$(git describe --abbrev=0)-bookworm\" }"
three="{ \"file\": \"./support/docker/production/Dockerfile.nginx\", \"ref\": \"master\", \"tags\": \"chocobozzz/peertube-webserver:latest\" }"
matrix="[$one,$two,$three]"
@ -58,7 +58,7 @@ jobs:
-
name: Checkout develop
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
ref: ${{ matrix.ref }}
-

View file

@ -12,13 +12,13 @@ jobs:
steps:
-
name: Checkout develop
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
ref: develop
- uses: './.github/actions/reusable-prepare-peertube-build'
with:
node-version: '14.x'
node-version: '18.x'
- name: Build
run: npm run nightly

View file

@ -18,11 +18,11 @@ jobs:
CI_BRANCH_BASE: develop
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: './.github/actions/reusable-prepare-peertube-build'
with:
node-version: '16.x'
node-version: '18.x'
- name: Angular bundlewatch
uses: jackyef/bundlewatch-gh-action@master
@ -36,12 +36,12 @@ jobs:
run: |
wget "https://github.com/boyter/scc/releases/download/v3.0.0/scc-3.0.0-x86_64-unknown-linux.zip"
unzip "scc-3.0.0-x86_64-unknown-linux.zip"
./scc --format=json --exclude-dir .git,node_modules,client/node_modules,client/dist,dist,yarn.lock,client/yarn.lock,client/src/locale,test1,test2,test3,client/src/assets/images,config,storage,server/tests/fixtures,support/openapi,.idea,.vscode,docker-volume,ffmpeg-3,ffmpeg-4 > ./scc.json
./scc --format=json --exclude-dir .git,node_modules,client/node_modules,client/dist,dist,yarn.lock,client/yarn.lock,client/src/locale,test1,test2,test3,client/src/assets/images,config,storage,packages/tests/fixtures,support/openapi,.idea,.vscode,docker-volume,ffmpeg-3,ffmpeg-4 > ./scc.json
- name: PeerTube client stats
if: github.event_name != 'pull_request'
run: |
node dist/scripts/client-build-stats.js > client-build-stats.json
npm run client:build-stats > client-build-stats.json
- name: PeerTube client lighthouse report
if: github.event_name != 'pull_request'

View file

@ -46,21 +46,22 @@ jobs:
PGHOST: localhost
NODE_PENDING_JOB_WAIT: 250
ENABLE_OBJECT_STORAGE_TESTS: true
ENABLE_FFMPEG_THUMBNAIL_PIXEL_COMPARISON_TESTS: true
OBJECT_STORAGE_SCALEWAY_KEY_ID: ${{ secrets.OBJECT_STORAGE_SCALEWAY_KEY_ID }}
OBJECT_STORAGE_SCALEWAY_ACCESS_KEY: ${{ secrets.OBJECT_STORAGE_SCALEWAY_ACCESS_KEY }}
YOUTUBE_DL_DOWNLOAD_BEARER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: './.github/actions/reusable-prepare-peertube-build'
with:
node-version: '14.x'
node-version: '18.x'
- uses: './.github/actions/reusable-prepare-peertube-run'
- name: Cache fixtures
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: |
fixtures

17
.gitignore vendored
View file

@ -1,8 +1,8 @@
# NPM instalation
/node_modules/
/server/tools/node_modules
node_modules
*npm-debug.log
yarn-error.log
.yarn
# Testing
/test1/
@ -11,8 +11,8 @@ yarn-error.log
/test4/
/test5/
/test6/
/server/tests/fixtures/video_high_bitrate_1080p.mp4
/server/tests/fixtures/video_59fps.mp4
/packages/tests/fixtures/video_high_bitrate_1080p.mp4
/packages/tests/fixtures/video_59fps.mp4
# Production
/storage
@ -23,6 +23,7 @@ yarn-error.log
/ffmpeg-4/
/thumbnails/
/torrents/
/web-videos/
/videos/
/previews/
/logs/
@ -48,12 +49,14 @@ yarn-error.log
/*.tar.xz
/*.asc
*.DS_Store
/server/tools/import-mediacore.ts
/docker-volume/
/init.mp4
# TypeScript
*.tsbuildinfo
# Packages
/packages/types/dist/
# EsLint
.eslintcache
# Compiled output
dist

10
.mocharc.cjs Normal file
View file

@ -0,0 +1,10 @@
process.env.TSX_TSCONFIG_PATH = './packages/tests/tsconfig.json'
module.exports = {
"node-option": [
"import=tsx",
"no-warnings",
"conditions=peertube:tsx"
],
"timeout": 30000
}

View file

@ -1,5 +1,465 @@
# Changelog
## v6.1.0
### IMPORTANT NOTES
* You must update nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/nginx/peertube
* Add `location ~ ^/api/v1/users/[^/]+/imports/import-resumable$ {` block
* This release changes the way how PeerTube counts a video view:
* Views are taken into account after 10 seconds instead of 30 seconds (can be changed in YAML config)
* Views use a *Session ID* generated by the web browser instead of using the request IP (former behavior can be restored in YAML config)
* The goal of this change is to get closer to how other video platforms like Mux, Vimeo, or Instagram work
### SECURITY
* Compact ActivityPub JSON-LD objects before using them to prevent incorrect access control @tesaguri
* Protect ActivityPub information related to private/internal/blocked videos
### Admin config (non-exhaustive)
* **Breaking changes**:
* Rename `views.videos.ip_view_expiration` to `views.videos.view_expiration`
* YAML & web admin configs:
* Add `storyboards.enabled` config to disable storyboard generation
* Remove `services.twitter.whitelisted`: Twitter/X doesn't seem to need this anymore. This means that PeerTube will try to inject the video player in Twitter/X by default instead of using a classic image/description
* YAML config only:
* Add `open_telemetry.metrics.playback_stats_interval` config to customize how often viewers send playback stats to server
* Add `views.videos.watching_interval.{anonymous,users}` configs to change how often the web browser sends "is watching" information to the server
* Add `stats.registration_requests.enabled` and `stats.abuses.enabled` configs to hide instance registration/abuse requests public stats (average response time, total registration/abuse requests etc.)
* Add `stats.total_moderators.enabled` and `stats.total_admins.enabled`configs to hide total admins/moderators public stats
* Add `object_storage.streaming_playlists.store_live_streams` config to not store live stream chunks into object storage (when enabled for streaming playlists)
* Set `open_telemetry.metrics.http_request_duration.enabled` to `false` by default to avoid performance issues on the Prometheus backend due to high metric cardinality
### Maintenance
* Also generate `600x600` and `1500x1500` avatar sizes
* Also generate `600x100` banner size
### Plugins/Themes/Embed API
* Add ability for plugins to create a client custom sub-page in `/my-account` page [#6218](https://github.com/Chocobozzz/PeerTube/pull/6218)
* Add access to `req.rawBody` for [plugin routes](https://docs.joinpeertube.org/contribute/plugins#add-custom-routes) [#6300](https://github.com/Chocobozzz/PeerTube/pull/6300)
* Add server plugin hooks (https://docs.joinpeertube.org/api/plugins):
* `filter:api.user.me.get.result` [#6219](https://github.com/Chocobozzz/PeerTube/issues/6219)
* Add `peertubeHelpers.videos.loadByIdOrUUIDWithFiles` helper [#6302](https://github.com/Chocobozzz/PeerTube/pull/6302)
### Features
* :tada: Implement user import/export :tada: [#6215](https://github.com/Chocobozzz/PeerTube/pull/6215)
* This is not a migration tool: data (like channels or videos) is duplicated and not moved from the previous PeerTube instance
* Export:
* A ZIP is generated by PeerTube and an email is sent to the user when the archive is ready
* The archive file contains ActivityPub data for federation compatibility and custom JSON files used by PeerTube import. It also contains video/playlist thumbnail and channel/account avatar/banner files
* User can include video files in the archive
* Archive files can be stored in object storage
* Export can be disabled by the admin. They can also set an expiration time to automatically delete archive files and limit the export file size depending on the user's video quota
* Import:
* Update account metadata (display name, description...)
* Update user settings (video autoplay policy, notification settings...)
* Create entries in the mute list
* Add watched videos in user's videos history
Add likes/dislikes
* Send a follow request to imported subscriptions
* Create channels, playlists and videos (if the video files are included in the archive)
* Admins can disable user import
* :tada: Add ability to keep the original video file :tada: [#6157](https://github.com/Chocobozzz/PeerTube/pull/6157)
* Can be stored in object storage
* Uploader can download the original file
* The original file is used in the user export archive (instead of the max quality file)
* Add Turkish language support in client
* Add ability for admins to set a banner and an avatar to the instance. The banner is used in *About instance*/*Login*/*Register an account* pages. Both the banner and the avatar can be used on the instance homepage using `<peertube-instance-banner>`/`<peertube-instance-avatar>` tag or on external websites/applications like the [JoinPeerTube website](https://joinpeertube.org/instances)
* Add ability for uploaders to download and add a video to a playlist on the *My videos* page using the dropdown button [#6008](https://github.com/Chocobozzz/PeerTube/pull/6008)
* Video views statistics:
* Count a *view* after 10 seconds and use a web browser session id to identify a viewer (see IMPORTANT CHANGES section)
* Add information about the location of the viewer subdivision/region
* More accurate retention stats where PeerTube doesn't take into account empty views anymore
* UI/UX:
* Automatically filter on *Local videos* in admin
* Add ability to sort videos by file size
* Add total video file size column in admin users list
* Improve admin runner jobs list by using badges with same colors for type/runner and add *processed/finished* columns
* Add *Recommended* tags to recommended PeerTube plugins/themes
* Improve plugins/themes default trending sort
* Trim username on login
* Warn if "Forgot password" email contains uppercase
* Use more precise buttons label to save changes in *My account* settings
* Add icon to owners/moderators only options
* Always use short UUIDs instead of full UUIDs in client to prevent URL confusion
* Add average admins/moderators response time in *Request an account* page
* Add color to registration/abuse state icon
* Player:
* Add an enable/disable subtitle button to the control bar
* Faster auto-resizing of the player when the video has a custom aspect ratio (only for videos uploaded on PeerTube >= 6.1)
* Use video aspect ratio for responsive embeds (only for videos uploaded on PeerTube >= 6.1)
* Performance:
* Optimize *watching* (`/api/v1/videos/:videoId/views`) endpoint
* Reduce `ffprobe` calls when not needed resulting in faster live stream transcoding startup and CPU/IO reduction during video upload/import
* Federation
* Introduce a new way to federate `Views` events in the federation. See [the commit details](https://github.com/Chocobozzz/PeerTube/commit/b4f4432459f22994cb8fa667c862a0edd7af0ebc) for more information
* Implements [FEP-2677](https://codeberg.org/fediverse/fep/src/branch/main/fep/2677/fep-2677.md) to identify the `Application` `Actor`
* Add Lemmy `postingRestrictedToMods` information to channels AP objects
* Improve generated video thumbnail quality
* Add notification when a subscribed video channel is live streaming
* Support `itunes:owner` in podcast feed
### Bug fixes
* Add stripes to square video thumbnails too (like we do for portrait videos)
* Prevent channels from being displayed multiple times on the *My channels* page
* Stricter video timestamp "linkification"
* Correctly fix downloading video files from object storage with some video names
* Fix broken RSS feed in some (rare) cases
* Fix local jobs count/pagination with *Waiting* jobs
* Banned users cannot live stream anymore
* Correctly escape HTML entities in meta tags [#6206](https://github.com/Chocobozzz/PeerTube/pull/6206)
* Fix broken account channels page with high `video_channels.max_per_user` config
* Add ability for moderators to approve/reject user registrations
* Do not display empty notification settings group
* Correctly fix WebTorrent video import crash
* Fix video channel synchronization crash on remote channels/playlists that contain hidden videos (unavailable, deleted etc.)
* Ensure the filename doesn't contain `/` character when downloading a video
* Fix Google Search SEO (with `Video is not the main content of the page` error)
* Remove password autocomplete in embed which causes issues when the parent page has a password input and the user uses the web browser's password autofill feature
* Don't submit the login form on forgot my password keyboard click
* Fix storyboard generation with some videos
* Fix ffmpeg encoder after custom plugin transcoding profile deletion
* Fix navigating from one channel related page (playlist, videos...) to another one
* More robust live stream transcoded by a remote runner
* Fix first video in playlist that doesn't start at "starts at"
* Fix embed HTML code for videos/playlists that have passwords
* Display external account/channel playlists if user is allowed to escape the federation
* Fix view endpoint crash on geoip update failure
* Fix setting video subtitle from URL query
* Fix selecting "Display all languages/categories/licences" in videos search resulting in an empty search
* Fix followers/following counter of local ActivityPub actors
* Fix notification button link on mobile
* Fix player subtitles on iOS
## v6.0.4
### IMPORTANT NOTES
* If you upgrade from PeerTube **< v6.0.0**, please follow v6.0.0 IMPORTANT NOTES
* If you upgrade from PeerTube **v6.0.0**, please follow v6.0.1 IMPORTANT NOTES
### SECURITY
* **Important:** Prevent XSS injection in embed. Thanks [Syst3m0ver](https://www.linkedin.com/in/ahmed-hasnaoui-790618180) and [aramido GmbH](https://aramido.de/sicherheitspruefung/penetrationstest)!
## v6.0.3
### IMPORTANT NOTES
* If you upgrade from PeerTube **< v6.0.0**, please follow v6.0.0 IMPORTANT NOTES
* If you upgrade from PeerTube **v6.0.0**, please follow v6.0.1 IMPORTANT NOTES
### SECURITY
* Prevent nginx from serving private/internal/password protected HLS video static files
* You must update your nginx configuration like in [this commit](https://github.com/Chocobozzz/PeerTube/commit/12ea8f0dd11e3fb5fbb8955f5b7d52f27332d619#diff-be9f96b9b1de67284047e610821493f9a5bec86bfcdf81a7d8d6e7904474c186) (line `202` replace `location ~ ^(/static/(webseed|web-videos|streaming-playlists)/private/)|^/download {` by `location ~ ^(/static/(webseed|web-videos|streaming-playlists/hls)/private/)|^/download {`)
### Bug fixes
* Fix HTML meta tags with attributes that contain quotes
* Fix time parsing resulting in broken video start time in some cases
* Fix WebTorrent video import crash
* Reload *Discover* page on logout
* Fix privacy error when updating a live, even if the privacy has not changed
* Fix invalid remote live state change notification that causes the player to reload
* Don't apply big play button skin to settings menu
* Fix downloading video files from object storage with some video names (that include emojis, quotes etc)
* Fix thumbnail generation when ffmpeg cannot seek the input
* Fix theme colors on stats page
* Fix input mask (used for chapters, playlist timecodes...) with 10h+ videos
* Fix chapter *position* width consistency
* Fix player ratio with audio only videos
* Also update video playlist URLs when using `update-host` script
* Fix upload/import/update of videos that contain multiple chapters with the same timecode
## v6.0.2
### IMPORTANT NOTES
* If you upgrade from PeerTube **< v6.0.0**, please follow v6.0.0 IMPORTANT NOTES
* If you upgrade from PeerTube **v6.0.0**, please follow v6.0.1 IMPORTANT NOTES
### Bug fixes
* Fix upgrade.sh when Peertube is installed outside the standard path [#6064](https://github.com/Chocobozzz/PeerTube/pull/6064)
* Fix importing videos with too long chapter name
* Don't create chapters from description if there is only one
* Ensure user is owned by the auth plugin before updating its attributes
* Improve channels and accounts SEO by fixing structured JSON-LD data and canonical URLs
* Originally published and reupload date format consistency in watch page
* Fix cpu count when cpu info not available
* Fix embed when waiting for a live
* Fix updating already started live if live attributes don't change
* Fix displaying many countries in video stats
## v6.0.1
### IMPORTANT NOTES
* If you upgrade from PeerTube **< v6.0.0**, please follow v6.0.0 IMPORTANT NOTES
* We've made some modifications in v6.0.0 IMPORTANT NOTES, so if you upgrade from PeerTube v6.0.0:
* Ensure `location = /api/v1/videos/upload-resumable {` has been replaced by `location ~ ^/api/v1/videos/(upload-resumable|([^/]+/source/replace-resumable))$ {` in your nginx configuration
* Ensure you updated `storage.web_videos` configuration value to use `web-videos/` directory name
* Ensure your directory name on filesystem is the same as `storage.web_videos` configuration value: directory on filesystem must be renamed from `videos/` to `web-videos/` to represent the value of `storage.web_videos`
### Bug fixes
* Fix CPU going to 100% on odd cpu count
* Increase storyboard generation job TTL
* Add missing `generate-video-storyboard` job type in admin jobs list
* Regenerate storyboard after studio job
## v6.0.0
### IMPORTANT NOTES
We have many important notes in this release. We know it's a pain for sysadmin, but consider each one as a major step forward for PeerTube quality!
#### Sysadmins important notes
* Remove NodeJS 16 support (see https://nodejs.org/fr/blog/announcements/nodejs16-eol):
* Please upgrade to NodeJS 18 before upgrading PeerTube
* If you use NodeSource repository, you may have to migrate to their new repository: https://github.com/nodesource/distributions/wiki/How-to-migrate-to-the-new-repository
* Check in `production.yaml` that you use `127.0.0.1` instead of `localhost` for `listen.hostname`, `database.hostname` and `redis.hostname` as Node 18 favours IPv6 for `localhost` resolution
* Remove WebTorrent support in player:
* "WebTorrent videos" are renamed to "Web Video". The video format is the same, we just stop to use P2P for these videos
* There is no "Auto" quality anymore for Web Videos. The viewer has to explicitly choose the video resolution
* We still use P2P with the HLS player, which is the recommended transcoding format since several versions
* See https://github.com/Chocobozzz/PeerTube/issues/5465 for more information
* Configuration key that you must update in your `production.yaml` if not automatically done by your upgrade script:
* `storage.videos` must be **renamed** to `storage.web_videos`: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L151
* Configuration value of `storage.web_videos` must have the directory name to be **changed** from `videos/` to `web-videos/`: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L151
* Directory on filesystem must be **renamed** from `videos/` to `web-videos/` to represent the value of `storage.web_videos`
* Classic installation: `sudo -u peertube mv '/var/www/peertube/storage/videos/' '/var/www/peertube/storage/web-videos/'`
* Docker installation: `mv '/path-to-docker-installation/docker-volume/data/videos/' '/path-to-docker-installation/docker-volume/data/web-videos/'`
* `transcoding.webtorrent` must be **renamed** to `transcoding.web_videos`: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L532
* `object_storage.videos` must be **renamed** to `object_storage.web_videos`. The value of `object_storage.web_videos.bucket_name` doesn't need to be changed: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L223
* `storage.storyboards` must be **added**: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L157
* PeerTube Docker image now uses `bookworm`. `chocobozzz/peertube:production-bullseye` needs to be replaced by `chocobozzz/peertube:production-bookworm`
* Env configuration that your must update if you use Docker:
* `PEERTUBE_TRANSCODING_WEBTORRENT_ENABLED` must be **renamed** to `PEERTUBE_TRANSCODING_WEB_VIDEOS_ENABLED`
* `PEERTUBE_OBJECT_STORAGE_VIDEOS_BUCKET_NAME` must be **renamed** to `PEERTUBE_OBJECT_STORAGE_WEB_VIDEOS_BUCKET_NAME`
* `PEERTUBE_OBJECT_STORAGE_VIDEOS_PREFIX` must be **renamed** to `PEERTUBE_OBJECT_STORAGE_WEB_VIDEOS_PREFIX`
* `PEERTUBE_OBJECT_STORAGE_VIDEOS_BASE_URL` must be **renamed** to `PEERTUBE_OBJECT_STORAGE_WEB_VIDEOS_BASE_URL`
* You must update nginx configuration: https://github.com/Chocobozzz/PeerTube/blob/develop/support/nginx/peertube
* `location ~ ^/static/(thumbnails|avatars)/ {` block must be removed
* `location = /api/v1/videos/upload-resumable {` must be updated to `location ~ ^/api/v1/videos/(upload-resumable|([^/]+/source/replace-resumable))$ {`
* `location ~ ^(/static/(webseed|streaming-playlists)/private/)|^/download {` must be updated to `location ~ ^(/static/(webseed|web-videos|streaming-playlists)/private/)|^/download {`
* `location ~ ^/static/(webseed|redundancy|streaming-playlists)/ {` must be updated to `location ~ ^/static/(webseed|web-videos|redundancy|streaming-playlists)/ {`
* Tracing requires `--experimental-loader=@opentelemetry/instrumentation/hook.mjs` node option: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L264
#### Developers important notes
* REST API breaking changes:
* Removed `webtorrentEnabled` from user response (deprecated since 4.1 in favour of `p2pEnabled`)
* Removed `avatar` and `banner` fields from account/channel responses (deprecated since 4.2 in favour of `avatars` and `banners`)
* Removed `filter` query when listing videos (deprecated since 4.0 in favour of `isLocal` and `include`)
* Deprecate `/api/v1/videos/:id/webtorrent` video file routes in favour of `/api/v1/videos/:id/web-videos` routes
* Deprecate `hasWebtorrentFiles` body video filter in favour of `hasWebVideoFiles` when listing videos
* Deprecate `webtorrent` `transcodingType` in favour of `web-video` in `/api/v1/videos/{id}/transcoding` route
* `currentTime` is now required to notify the user is watching the video using `/api/v1/videos/{id}/views` (introduced in 4.2)
* Static server paths breaking changes:
* `/static/webseed/...` is deprecated in favour of `/static/web-videos/...`
* `/object-storage-proxy/webseed/...` is deprecated in favour of `/object-storage-proxy/web-videos/...`
* `/static/thumbnails/...` is deprecated in favour of `/static/lazy-thumbnails/...`
* Plugin API breaking changes:
* Deprecated `webtorrent` key in `getFiles()` helper result. Use `webVideo` instead
### CLI tools
* Removed unmaintained `peertube-import-videos` (also aliased as `peertube import-videos` or `peertube import`) script
* PeerTube remote CLI is much more simpler to install using NPM: https://docs.joinpeertube.org/maintain/tools#remote-peertube-cli
* Support moving video files from object storage to filesystem: https://docs.joinpeertube.org/maintain/tools#move-video-files-from-object-storage-to-filesystem
### Features
* :tada: **Add "Password protected" video privacy** [#5836](https://github.com/Chocobozzz/PeerTube/pull/5836) :tada:
* A single password can be set using the web interface at video upload/import/update
* The [REST API](https://docs.joinpeertube.org/api-rest-reference.html#tag/Video-Passwords) can store as many passwords as you want, allowing developers to use this feature to easily give or revoke access to a video *on the fly*
* Developers that use PeerTube embeds can set the video password using [the embed API](https://docs.joinpeertube.org/api/embed-player#setvideopassword-promise-void)
* :tada: **Add video storyboard support** :tada:
* PeerTube automatically generates a storyboard on video upload/import
* Viewers can see the image around the targeted timecode when hovering the progress bar
* Storyboard of videos uploaded/imported before v6 can be generated by the admin using `npm run create-generate-storyboard-job` command: https://docs.joinpeertube.org/maintain/tools#generate-storyboard
* :tada: **Add ability for users to replace their video file** :tada:
* Has to be enabled by the PeerTube instance administrator
* The user can replace the video file in the *Update Video* page
* The *re-upload* date is displayed under the video player
* :tada: **Add video chapters support** :tada:
* Add chapters in the upload/import/update video page or let PeerTube automatically imports them from the video container/youtube-dl
* Markers are displayed in the player progress bar to symbolize a chapter
* Chapter title is displayed when hovering/touching the player progress bar
* Better video player:
* More efficient as we don't rebuild the player every time the played video changes
* The player keeps the current player settings (playback speed, fullscreen...) when the played video changes
* Automatically adjust the player size to match video ratio
* Improve SEO and video link sharing:
* Use short video/channel/account URLs in sitemap and for canonical tags
* Add JSON-LD tag in embed page
* Embed page does not forbid indexation anymore: we use a canonical tag instead that targets the watch page
* Forbid indexation of remote videos, accounts and channels (instead of providing an invalid canonical tag)
* Truncate OpenGraph/Twitter card link description
* Fix client accessibility and keyboard navigation:
* Fix links in bootstrap alerts color
* Better input placeholder contrast
* Fix video miniature link label
* Add ability to disable hotkeys
* Improve table overall accessibility
* Wrap icons that can lead to an action inside buttons
* Fix left menu admin/my-library menu accessibility
* And many more improvements!
* Improve remote runner management:
* Add ability to remove runner jobs
* Add runner job state quick filter
* Merge registration tokens and runners tables in same page
* Add copy button to copy registration token
* Add ability for admins to force transcoding on a specific video even if it's in broken state (stuck in *To Transcode* for example)
* Add an option to sign federated fetches (ActivityPub based software such as Mastodon may require it to access content)
* Download video file directly from S3 using pre signed URLs
* Lazy download remote video thumbnails to reduce storage
* Improve recommended videos when the watched video doesn't have tags set
* Add more rate limits in configuration (`plugins`, `well-known`, `feeds`, `activity_pub` and `client` endpoints)
* Add ability to reset video *Originally published at* attribute
* Add ability for admins to set the default user channel name [#6000](https://github.com/Chocobozzz/PeerTube/pull/6000)
* Server now uses [ESM modules](https://nodejs.org/api/esm.html)
* Add worker threads Prometheus metrics
* Performance:
* Process unicast HTTP job in worker threads
* Sign ActivityPub requests in worker threads
* Optimize recommended videos HTTP request
* Optimize videos SQL queries when filtering on lives or tags
* Optimize `/videos/{id}/views` endpoint with many viewers
* Add ability to disable PeerTube HTTP logs
* Optimize homepage videos HTTP queries
### Bug fixes
* Don't cache upload response if the video has been deleted
* Fix broken upgrade script when using custom database port
* Prevent duplicate runner names
* Avoid runner job update error
* Notify remote runners there are available jobs when a job is aborted/errored
* Fix updating P2P settings in left menu
* Fix 500 HTTP error on invalid short UUID conversion
* Don't display admin email in `security.txt` well-known endpoint
* Optimize `update-host` script to fix out of memory error
* Fix error log when using an unconventional distribution of FFmpeg with a non-standard version string [#5917](https://github.com/Chocobozzz/PeerTube/pull/5917)
* Fix live replay REST API breaking change: `replaySettings.privacy` is not required anymore
* Fix broken live replay when updating replay privacy
* More robust *About* page when getting category from server
* Fix `ERR_HTTP_HEADERS_SENT` crash
* Avoid illegal characters in torrent filename
* Avoid federation error log with remote `Like` on `Note`
* Fix atom feed with *Science & Technology* category
* Support empty value returned by `filter:api.video.get.result` hook
* Prevent remote subscribe on accounts (not yet supported by PeerTube)
* Fix feed audio file mimetype
* Fix video quality on high video resolution/fps
* Fix disabling Object Storage ACL using Docker env `PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PUBLIC` and `PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PRIVATE` in `.env`
* Correctly end live session on ffprobe error
* Fix video stats X axis with old videos
* Fix empty master playlist upload on s3
* Correctly generate `production.yaml.new` that should merge your current `production.yaml` with new keys defined by PeerTube
* Fix card font color theme
* Respect "transcode original resolution" setting when using remote runners
* Prevent player mobile buttons flickering
* Fix graph zooming end date
## v5.2.1
### Bug fixes
* Fix loading spinner displayed forever on Chrome
* Fix broken replay with long live name
* Fix fps transcoding on remote runners
* Fix terms/code of conduct link toggle
## v5.2.0
### IMPORTANT NOTES
* **Important** Remove NodeJS 14 support
* **Important** You must update your nginx configuration to support remote runners: https://github.com/Chocobozzz/PeerTube/blob/develop/support/nginx/peertube#L101
* Add `storage.tmp_persistent` directory in configuration file. **You must configure it in your production.yaml**: https://github.com/Chocobozzz/PeerTube/blob/develop/config/production.yaml.example#L148
* PeerTube requires **Docker Compose >= v2** for Docker compose installation
### Maintenance
* Remove `npm run create-transcoding-job` and `npm run print-transcode-command` unmaintained scripts
* Add Redis sentinel support [#5593](https://github.com/Chocobozzz/PeerTube/pull/5593)
* Improve upgrade script (used when you will upgrade from PeerTube 5.2 to its next version) for classic installation:
* Automatically generate a `config/production.yaml.new` file after the upgrade, which is the fusion between the new PeerTube configuration keys and your current `production.yaml`. After a review you can replace your old `config/production.yaml` with this new file so you don't have to add new keys manually
* Add `ls` option compatibility with FreeBSD [#5785](https://github.com/Chocobozzz/PeerTube/pull/5785)
### Docker
* Make database name configurable using env variable [#5734](https://github.com/Chocobozzz/PeerTube/pull/5734)
### Plugins/Themes/Embed API
* Add `filter:html.client.json-ld.result` hook
### Features
* :tada: Implement remote transcoding for VOD videos, Live streams and Studio editions :tada: [#5769](https://github.com/Chocobozzz/PeerTube/pull/5769)
* If enabled, remote PeerTube runners can process these high CPU jobs
* Admin documentation: https://docs.joinpeertube.org/admin/remote-runners
* PeerTube runner CLI documentation: https://docs.joinpeertube.org/maintain/tools#peertube-runner
* Demonstration video: https://peertube2.cpy.re/w/oJwHHYwt4oKjKhLNh2diAY
* Architecture documentation: https://docs.joinpeertube.org/contribute/architecture#remote-vod-live-transcoding
* Add Podcast RSS feed support: [#5487](https://github.com/Chocobozzz/PeerTube/pull/5487)
* Add ability to set custom privacy for live replays [#5692](https://github.com/Chocobozzz/PeerTube/pull/5692)
* Render images of markdown fields in *About* page [#5732](https://github.com/Chocobozzz/PeerTube/pull/5732)
* Admin can disable user video history by default [#5728](https://github.com/Chocobozzz/PeerTube/pull/5728)
* Improve global accessibility
### Bug fixes
* Fix live stream object storage sync resulting in broken playback on iOS after a few minutes
* Correctly proxify HTTP 206 content-range header from object storage [#5703](https://github.com/Chocobozzz/PeerTube/pull/5703)
* Filter out already watched videos from recommended videos [#5739](https://github.com/Chocobozzz/PeerTube/pull/5739)
* Prevent exception when HTTP headers are already sent
* Fix remote instance following/followers links in about page
* Prevent error when updating a running live stream if the privacy hasn't changed
* Prevent crash on plugin websocket error
* Don't call `register`/`unregister` plugin API when installing/uninstalling plugins using `script/plugin` scripts (offline mode)
* Fix error on missing plugin CSS file at PeerTube startup [#5746](https://github.com/Chocobozzz/PeerTube/pull/5746)
* Prevent "invalid end watch section" server log warnings
* Support remote subscribe with a handle starting with a `@` character
* Actor preferred username (account/channel handle) is now case insensitive
* Fix RTL layout inconsistencies
* Prevent user video notification when the subscription is still in *Pending* state
* Correctly remove *Pending* subscription
* Fix PeerTube subtitles import
* Fix languages alphabetical order
* Fix registration notification error
* Correctly unload plugin paths
* Fix custom default route in instance logo link
* Fix video channels quick filter overflow
## v5.1.0
### IMPORTANT NOTES
@ -52,7 +512,7 @@
* :tada: Implement user registration approval (https://docs.joinpeertube.org/admin/managing-users#registration-approval) [#5544](https://github.com/Chocobozzz/PeerTube/pull/5544)
* If enabled, the user has to fill a *Registration reason* input
* Moderators have to to accept/reject the registration with a *Moderation response* that will be sent by email to the user
* Moderators have to accept/reject the registration with a *Moderation response* that will be sent by email to the user
* If the registration is accepted, the user and its channel are automatically created
* Add "back to live" button in player
* The *Live* button is red when the player is synced with the live
@ -155,7 +615,9 @@
* Classic installation: `cd /var/www/peertube/peertube-latest && sudo -u peertube NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production node dist/scripts/migrations/peertube-5.0.js`
* Docker installation: `cd /var/www/peertube-docker && docker-compose exec -u peertube peertube node dist/scripts/migrations/peertube-5.0.js`
* Configuration changes (`config/production.yaml`):
* There is a new `secrets.peertube` configuration. You must fill it before running PeerTube v5: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/config/production.yaml.example#L14
* There is a new `secrets.peertube` configuration:
* Classic install: fill it before running PeerTube v5: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/config/production.yaml.example#L14
* Docker install: fill it using an env variable before running the containers: https://github.com/Chocobozzz/PeerTube/blob/develop/support/docker/production/.env#L27
* `object_storage.upload_acl` is now a parent key that you must update: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/config/production.yaml.example#L153
* You must update your nginx configuration:
* We introduced a new `location` for plugin websocket routes: https://github.com/Chocobozzz/PeerTube/blob/v5.0.0/support/nginx/peertube#L135
@ -448,7 +910,7 @@
* **Important** SQL migrations (in particular `0685-multiple-actor-images`) can take several minutes to complete
* **Important** You must update your nginx configuration to support video web editor: https://docs.joinpeertube.org/install/any-os#nginx
* REST API:
* `PUT /api/v1/videos/{id}/watching` is deprecated, use `POST /api/v1/videos/videos/{id}/views` instead: https://docs.joinpeertube.org/api/rest-reference.html#operation/addView
* `PUT /api/v1/videos/{id}/watching` is deprecated, use `POST /api/v1/videos/videos/{id}/views` instead: https://docs.joinpeertube.org/api-rest-reference.html#operation/addView
### Maintenance
@ -1602,7 +2064,7 @@ A new endpoint to report videos will be created in PeerTube 2.4 and will also al
### Features
* :tada: Add global search support (has to be explicitely enabled by admins)
* :tada: Add global search support (has to be explicitly enabled by admins)
* :tada: Add ability for admins to display a banner on their instance
* :tada: Support Vietnamese and Kabyle languages. Also re-establish Occitan language locale despite lack of support in Angular
* Federation:
@ -2923,8 +3385,8 @@ This version is a pre release because it contains many important changes, and re
**Important:** Before upgrading run the following commands (no need to stop PeerTube) on your PeerTube database (in this example it's *peertube_prod*):
```
$ sudo -u postgres psql peertube_prod -c 'CREATE EXTENSION IF NOT EXISTS unaccent;'
$ sudo -u postgres psql peertube_prod -c 'CREATE EXTENSION IF NOT EXISTS pg_trgm;'
sudo -u postgres psql peertube_prod -c 'CREATE EXTENSION IF NOT EXISTS unaccent;'
sudo -u postgres psql peertube_prod -c 'CREATE EXTENSION IF NOT EXISTS pg_trgm;'
```
You will need [PostgreSQL Contrib](https://www.postgresql.org/docs/9.6/static/contrib.html).

View file

@ -7,7 +7,6 @@ In order to create an open and welcoming environment, we as contributors and mai
* age
* body size
* disability
* ethnicity
* gender identity and expression
* level of experience
* education
@ -63,7 +62,7 @@ We also reserve the right to temporarily or permanently ban any contributor for
## Scope
This code of conduct applies whenever you are representing the project or community. For example you may be:
This code of conduct applies whenever you are representing the project or community. For example, you may be:
* working in a project space online or in the public (i.e.: github.com, framacolibri.org, IRC)
* using an official project email address

View file

@ -6,48 +6,55 @@
* Александр
* T.S
* Hồ Nhất Duy
* Berto Te
* Filip Bengtsson
* josé m
* Jeff Huang
* Simon Brosdetzko
* kontrollanten
* Ihor Hordiichuk
* Filip Bengtsson
* Payman Moghadam
* Berto Te
* Simon Brosdetzko
* Jiri Podhorecky
* Milo Ivir
* kontrollanten
* Phongpanot
* GunChleoc
* hecko
* Laurent Ettouati
* kimsible
* Phongpanot
* Zet
* GunChleoc
* Sveinn í Felli
* Aitor Salaberria
* Clemens Schielicke
* Racida S
* Ewout van Mansom
* Marcin Mikołajczak
* Eivind Ødegård
* Milo Ivir
* Ewout van Mansom
* Balázs Meskó
* Tirifto
* Kim
* Wicklow
* Hannes Ylä-Jääski
* Mohamad Reza
* Vodoyo Kamal
* Kim
* Armin
* Kimsible
* Sveinn í Felli
* Fontan 030
* John Livingston
* Vodoyo Kamal
* Mohamad Reza
* Besnik Bleta
* Kimsible
* Felix Ableitner
* Frank Sträter
* John Livingston
* Free coss
* Quentin PAGÈS
* Gérald Niel
* Luca Calcaterra
* ButterflyOfFire
* Duy
* Slimane Selyan AMIRI
* ButterflyOfFire
* Dingzhong Chen
* Eric Guichaoua
* Julien Maulny
* Mark Van den Borre
* x
* Julien Maulny
* Balázs Meskó
* Jorropo
* Josh Morel
* Manuel Viens
@ -56,27 +63,30 @@
* Elegant Codes
* Florian CUNY
* Francesc
* Luca Calcaterra
* Payman Moghadam
* Renne Rocha
* mando laress
* Артём Котлубай
* Ettore Atalan
* Ricardo Biloti
* Blood Axe
* Cedric F
* Florent
* Marc Strange
* Renne Rocha
* Ch
* J. Lavoie
* barzofarev2
* jan Seli
* lutangar
* 李奕寯
* 0que
* Martin Hoefler
* Porrumentzio
* Poslovitch
* Xabi
* buoyantair
* 李奕寯
* Alexander Ivanov
* Balázs Úr
* Eric Guichaoua
* Echo Kilo
* Jan Keromnes
* Luc Didry
* Siourdakis Thanos
@ -86,18 +96,21 @@
* Caroline Chuong
* David Soh
* Diazepan Medina
* Erik Guldberg
* Jason Zhou
* Loukas Stamellos
* Ms Kimsible
* NorbiPeti
* Sergey Zigachev
* Thomas Citharel
* Txopi
* Benjamin Bouvier
* Filip Hanes
* Joe Bill
* Kemal Oktay Aktoğan
* Lucas Declercq
* Sirxy
* chris@famichiki.tube
* matograine
* Alexander Ivanov
* Daniel Santos
* David Libeau
* Ewald Arnold
@ -105,26 +118,31 @@
* Jayme Soares Almeida Cruz
* Kempelen
* Nassim Bounouas
* NorbiPeti
* Rafael Fontenelle
* Sergey Zigachev
* Thomas Kuntz
* Tzafrir Cohen
* Viorel-Cătălin Răpițeanu
* Vri
* miro
* nexi
* owiox8+1viroxeaziaxw@sharklasers.com
* Adrià Martín
* Ahmed ABERWAG
* Anne-Gaelle Moulun
* Arman
* Asier Iturralde Sarasola
* BRAINS YUM
* Belkacem Mohammed
* Côme 744
* Dimitri Gilbert
* Flavio F. M
* Florent Poinsaut
* Frank Chang
* Green-Star
* I_Automne
* Ilia
* Micah Elizabeth Scott
* Pierre-Jean
* Ret Samys
* SVNET Libre
* Tomasz
@ -132,6 +150,7 @@
* William Lahti
* Wirebrass
* Yury Bulka
* alex gabilondo
* boris joeson
* frankstrater
* mater
@ -141,24 +160,26 @@
* Ajeje Brazorf
* Andrey
* Angristan
* Benjamin Seitz
* Bob Oob
* Booteille
* Chris Sakura 佐倉くりす on Youtube
* Cokelat8
* DontUseGithub
* I_Automne
* Farooq Karimi Zadeh
* Iñigo
* Jim Kats
* Joan Montané
* Kristoffer Grundström
* LecygneNoir
* Lukas
* MahdiTurki
* Martijn Dekker
* Mats Blomdahl
* Maxime Louet
* Mildred
* Nikolay
* Okhin
* Pierre-Alain TORET
* Pierre-Jean
* Serge Victor
* Théo Le Calvar
* Ugaitz
@ -171,13 +192,14 @@
* roberto marcolin
* Ahsan Haris Ahmed
* Alberto Teira
* Alejandro
* Alex
* Aliaksandr Hrankin
* Anael González Paz
* Andréas Livet
* Andrés Maldonado
* Arco
* Armin Kunkel
* Asier Iturralde Sarasola
* Asr128
* Aurélien Bertron
* Axel Viala
@ -187,7 +209,6 @@
* Eder Etxebarria
* Ehsan Gholami
* Elga Ahmad Prayoga
* Farooq Karimi Zadeh
* Girish Ramakrishnan
* Hakim Oubouali
* Hans Meiser
@ -196,8 +217,11 @@
* Jelle Besseling
* Jocelyn Jaubert
* Johan Fleury
* Jurij Podgoršek
* Kindred La Boneta
* Kiro
* Leopere
* Linus
* Lukas Winkler
* M Z
* Manuela Silva
@ -207,9 +231,11 @@
* Pedro
* Petr Balíček
* Piotr Sikora
* Ryan He
* Stefan Keks
* Tom Wellington
* Urtzi Odriozola
* Victor Hampel
* Waazdakka
* Winfried Hyronimus
* Yohan Boniface
@ -224,6 +250,7 @@
* Ömer Faruk Çakmak
* AQR_Rastiq
* Al-Hassan Abdel-Raouf
* Alecks Gates
* Amos Tamam
* Andrew Morgan
* Andy Khit
@ -233,33 +260,43 @@
* Arne Uplegger
* Aurélien Béranger
* Average Dude
* BGR2
* BitTube
* Boo Teille
* Branislav Pavelka
* Dashie
* David Luís Pereira Pires
* David Marzal
* EndoGai
* Erik Guldberg
* Fatih Özsoy
* FediverseTV
* Florent Fayolle
* Florian
* Frank de Lange
* G4dter
* Gaëtan Rizio
* Gopherslol
* Goudarz Jafari
* HHY
* Hange
* Hjalte
* Hugo Peixoto
* HybridGlucose
* J C Worm
* Jan Ainali
* Jan Marsalek
* José M
* Joël Galeran
* Julien Lemaire
* Jurij Podgoršek
* Julien Rabier
* Lucas Teixeira
* Mamiako Pavel
* Masood Masaeli
* Millicent Billette
* Mondo Xíbaro
* Moritz Warning
* Mostafa Ahangarha
* Neko Nekowazarashi
* Nicolai Larsen
* Nojus
* Pierre Jaury
@ -271,9 +308,11 @@
* Takeshi Umeda
* Thai Localization
* The Cashew Trader
* Thijs Kinkhorst
* Timur Seber
* Toso Malero
* Valvin
* Wicklow
* Yaron Shahrabani
* YiDai
* Yogesh K S
* ahmadsharifian
@ -281,10 +320,14 @@
* brucekomike
* dingycle
* framail
* h3n3
* imgradeone Yan
* kafbatur kafbatarsson
* les
* libertas
* merty
* plr20
* q_h
* qwerty
* spf
* taziden
@ -307,10 +350,14 @@
* Alexander F. Rødseth
* Ali Alim
* Alperen Abak
* Alvar C.H. Freude
* Aman Sharma
* Anatoly
* Anatoly Bogomolov
* Andrews Góes Santos
* Antoine Millet
* Anton Latukha
* Apps
* Armando Lüscher
* Artem Prosvetov
* Arthur Lutz
@ -324,13 +371,16 @@
* Brad Johnson
* Cadence Ember
* Cale
* Carlos García Gutiérrez
* Charles de Lacombe
* Chris Sakura 佐倉くりす on Youtube - 日本語は第二言語やけ、間違っとったら思いっきり叩いてくださいw つたない日本語ばっかりやけど頑張りまーす♪
* Charlie Lambda
* Christoph Geschwind
* Chronos
* Claude
* Clifford Garwood II
* Clément Brizard
* DLP
* Daniel Dutra
* David Dobryakov
* DeeJayBro
* Dimitri DI GUSTO
@ -346,33 +396,40 @@
* Esmail_Hazem
* Ethan Corgatelli
* Fabio Agreles Bezerra
* FediThing
* Fernandez, ReK2
* Framasoft
* Gabriel Scherer
* Glandos
* Grzesiek11
* Guillaume Pérution-Kihli
* Gérald CHATAGNON
* Haelwenn (lanodan) Monnier
* Henri BAUDESSON
* HesioZ
* Hozan Şahin
* ICabaleiro
* Ignacio Carrera González
* Iker Garaialde
* Ilia
* Ismaël Bouya
* Ivan Ip
* Iván Cabaleiro
* J Webb
* Jacen
* Jackson Chen
* Jacob
* Jacques Foucry
* Jagannath Bhat
* Jan Prunk
* Janey Muñoz
* Jarosław Maciejewski
* Jaz Dina
* Jeena
* Jessica Fairchild
* Jeston Tan
* Jinn Koriech
* Jlll1
* Johnny Jazeix
* Jonas Sulzer
* Jonatan Nyberg
* Jorge Silva
@ -387,6 +444,7 @@
* Kyâne Pichou
* Leo Mouyna
* Lesterpig
* Lety Does Stuff
* Levi Bard
* LiPeK
* Lint
@ -395,10 +453,13 @@
* Lupinard
* Léo Andrès
* ManMade-cube42
* Marcel Fuhrmann
* Marco Zehe
* Marian Steinbach
* Mario Pepe
* Markus Richter
* Martin Trigaux
* Matej Šujan
* Mateusz Piotrowski
* Mathieu Agopian
* Mathieu Brunot
@ -408,8 +469,10 @@
* Michael Williams
* Miguel Mayol Tur
* Mike
* Mikel Gartzia Santamaria
* Milo van der Linden
* MrGiga
* Murat Özalp
* Mélanie Pin
* Nataly Rocha
* Nathanaël J
@ -419,6 +482,7 @@
* Nitesh Sawant
* Novel Martin Harianto
* Nuño Sempere
* Olivier Bouillet
* Olivier Jolly
* Pablo Joubert
* Paul FLORENCE
@ -444,10 +508,14 @@
* Roberto Resoli
* Robin
* Rostyslav Haitkulov
* Salif Mehmed
* Sankar
* SansPseudoFix
* Sarah Lewis
* Sebastian Paweł Wolski
* Seth Falco
* Showfom
* Shun Sakai
* Simon Gilliot
* Simounet
* Stefan Schüller
@ -477,14 +545,16 @@
* William Cliff
* WingsLikeEagles
* Yann Sionneau
* Yaron Shahrabani
* Yehuda Deutsch
* Yorwba
* Yun
* Zekovski
* Zig-03
* [ Bie ] Watcharapong Suriyawan
* adam iter
* anmol26s
* april
* ar9708
* augier
* big gamer
* bikepunk
@ -493,13 +563,15 @@
* decentral1se
* eduard pintilie
* framabr
* fuomag9
* gillux
* imgradeone Yan
* jameskimmel
* jinubook
* jomo
* kukhariev
* lambdacastix
* libertysoft3
* lost_geographer
* lsde
* ltsallas
* luz paz
@ -509,16 +581,18 @@
* mahdi
* memorybox
* mike stedman
* mira.bat
* mj-saunders
* morteza
* no
* norrist
* nxjoseph
* osauzet
* paring
* paulienm
* philippe lhardy
* pitchum
* potedeo
* q_h
* rdxuan
* retiolus
* ruvilonix

View file

@ -116,7 +116,7 @@ Be it as a user or an instance administrator, you can decide what your experienc
<h3 align="right">Communities that help each other</h3>
<p align="right">
In addition to visitors using WebTorrent to share the load among them, instances can help each other by caching one another's videos. This way even small instances have a way to show content to a wider audience, as they will be shouldered by friend instances (more about that in our <a href="https://docs.joinpeertube.org/contribute/architecture#redundancy-between-instances">redundancy guide</a>).
In addition to visitors using P2P with WebRTC to share the load among them, instances can help each other by caching one another's videos. This way even small instances have a way to show content to a wider audience, as they will be shouldered by friend instances (more about that in our <a href="https://docs.joinpeertube.org/contribute/architecture#redundancy-between-instances">redundancy guide</a>).
</p>
<p align="right">
Content creators can get help from their viewers in the simplest way possible: a support button showing a message linking to their donation accounts or really anything else. No more pay-per-view and advertisements that hurt visitors and alter creativity (more about that in our <a href="https://github.com/Chocobozzz/PeerTube/blob/develop/FAQ.md">FAQ</a>).
@ -174,7 +174,7 @@ See the [architecture blueprint](https://docs.joinpeertube.org/contribute/archit
See our REST API documentation:
* OpenAPI 3.0.0 schema: [/support/doc/api/openapi.yaml](https://github.com/Chocobozzz/PeerTube/blob/develop/support/doc/api/openapi.yaml)
* Spec explorer: [docs.joinpeertube.org/api-rest-reference.html](https://docs.joinpeertube.org/api/rest-reference.html)
* Spec explorer: [docs.joinpeertube.org/api-rest-reference.html](https://docs.joinpeertube.org/api-rest-reference.html)
See our [ActivityPub documentation](https://docs.joinpeertube.org/api/activitypub).
@ -186,7 +186,7 @@ See our [ActivityPub documentation](https://docs.joinpeertube.org/api/activitypu
### Code
Copyright (C) 2015-2023 PeerTube Contributors (see [CREDITS.md](/CREDITS.md))
Copyright (C) 2015-2024 PeerTube Contributors (see [CREDITS.md](/CREDITS.md))
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published

View file

@ -39,9 +39,27 @@ The vulnerability is kept private until a majority of instances known on instanc
## Official Channels
To help us receive vulnerability submissions we use the following official reporting channels:
- chocobozzz@framasoft.org (GPG: [583A612D890159BE](https://keybase.io/chocobozzz/pgp_keys.asc?fingerprint=c44aad638367912ca93edd57583a612d890159be))
- sendmemail@rigelk.eu (GPG: [EA12971B0E438F36](https://api.github.com/users/rigelk/gpg_keys))
To help us receive vulnerability submissions we use the following official reporting channel:
- peertube-security@framasoft.org
The following PGP key can be used to encrypt your email:
```
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEZjD41hYJKwYBBAHaRw8BAQdAfhTpNfIk8/doN8j+PnGzNazK6p6KXEatqz1L
ARAmlU20M1BlZXJUdWJlIFNlY3VyaXR5IDxwZWVydHViZS1zZWN1cml0eUBmcmFt
YXNvZnQub3JnPoiTBBMWCgA7FiEEr+3Jvd9JW64FG8cvQOaXHEo/b6cFAmYw+NYC
GwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQQOaXHEo/b6fRbgD8DiAL
7o3eeHuYnQe1I+SnSHU6RDVk/OY27+ZFSrWgsYMBAAA16aGGkbmme1mmig+iEMiL
uhjVAfwuXb0VzrxqqmYMuDgEZjD41hIKKwYBBAGXVQEFAQEHQDCVpwHHyrS9rCQq
0uXbPTWkWuf8yZJqpzZSoG3KY5JZAwEIB4h4BBgWCgAgFiEEr+3Jvd9JW64FG8cv
QOaXHEo/b6cFAmYw+NYCGwwACgkQQOaXHEo/b6fwmAEAsiJDN2GG7sNA2ExjoNT8
P0hnqJkaRh8WJ/pi3u+QlWABAJj5qRhA3Om7SYJjzYfe3fEnrS5cTW51qc96r7GU
IdUI
=y06w
-----END PGP PUBLIC KEY BLOCK-----
```
If you think you have found a vulnerability, please include the following details with your report and be as descriptive as possible:
- The location and nature of the vulnerability,

View file

@ -0,0 +1,4 @@
src
meta.json
tsconfig.json
scripts

View file

@ -0,0 +1,43 @@
# PeerTube CLI
## Usage
See https://docs.joinpeertube.org/maintain/tools#remote-tools
## Dev
## Install dependencies
```bash
cd peertube-root
yarn install --pure-lockfile
cd apps/peertube-cli && yarn install --pure-lockfile
```
## Develop
```bash
cd peertube-root
npm run dev:peertube-cli
```
## Build
```bash
cd peertube-root
npm run build:peertube-cli
```
## Run
```bash
cd peertube-root
node apps/peertube-cli/dist/peertube-cli.js --help
```
## Publish on NPM
```bash
cd peertube-root
(cd apps/peertube-cli && npm version patch) && npm run build:peertube-cli && (cd apps/peertube-cli && npm publish --access=public)
```

View file

@ -0,0 +1,19 @@
{
"name": "@peertube/peertube-cli",
"version": "1.0.2",
"type": "module",
"main": "dist/peertube.js",
"bin": "dist/peertube.js",
"engines": {
"node": ">=16.x"
},
"scripts": {},
"license": "AGPL-3.0",
"private": false,
"devDependencies": {
"application-config": "^3.0.0",
"cli-table3": "^0.6.0",
"netrc-parser": "^3.1.6"
},
"dependencies": {}
}

View file

@ -0,0 +1,27 @@
import * as esbuild from 'esbuild'
import { readFileSync } from 'fs'
const packageJSON = JSON.parse(readFileSync(new URL('../package.json', import.meta.url)))
export const esbuildOptions = {
entryPoints: [ './src/peertube.ts' ],
bundle: true,
platform: 'node',
format: 'esm',
target: 'node16',
external: [
'./lib-cov/fluent-ffmpeg',
'pg-hstore'
],
outfile: './dist/peertube.js',
banner: {
js: `const require = (await import("node:module")).createRequire(import.meta.url);` +
`const __filename = (await import("node:url")).fileURLToPath(import.meta.url);` +
`const __dirname = (await import("node:path")).dirname(__filename);`
},
define: {
'process.env.PACKAGE_VERSION': `'${packageJSON.version}'`
}
}
await esbuild.build(esbuildOptions)

View file

@ -0,0 +1,7 @@
import * as esbuild from 'esbuild'
import { esbuildOptions } from './build.js'
const context = await esbuild.context(esbuildOptions)
// Enable watch mode
await context.watch()

View file

@ -0,0 +1,171 @@
import CliTable3 from 'cli-table3'
import prompt from 'prompt'
import { Command } from '@commander-js/extra-typings'
import { assignToken, buildServer, getNetrc, getSettings, writeSettings } from './shared/index.js'
export function defineAuthProgram () {
const program = new Command()
.name('auth')
.description('Register your accounts on remote instances to use them with other commands')
program
.command('add')
.description('remember your accounts on remote instances for easier use')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.option('--default', 'add the entry as the new default')
.action(options => {
/* eslint-disable no-import-assign */
prompt.override = options
prompt.start()
prompt.get({
properties: {
url: {
description: 'instance url',
conform: value => isURLaPeerTubeInstance(value),
message: 'It should be an URL (https://peertube.example.com)',
required: true
},
username: {
conform: value => typeof value === 'string' && value.length !== 0,
message: 'Name must be only letters, spaces, or dashes',
required: true
},
password: {
hidden: true,
replace: '*',
required: true
}
}
}, async (_, result) => {
// Check credentials
try {
// Strip out everything after the domain:port.
// See https://github.com/Chocobozzz/PeerTube/issues/3520
result.url = stripExtraneousFromPeerTubeUrl(result.url)
const server = buildServer(result.url)
await assignToken(server, result.username, result.password)
} catch (err) {
console.error(err.message)
process.exit(-1)
}
await setInstance(result.url, result.username, result.password, options.default)
process.exit(0)
})
})
program
.command('del <url>')
.description('Unregisters a remote instance')
.action(async url => {
await delInstance(url)
process.exit(0)
})
program
.command('list')
.description('List registered remote instances')
.action(async () => {
const [ settings, netrc ] = await Promise.all([ getSettings(), getNetrc() ])
const table = new CliTable3({
head: [ 'instance', 'login' ],
colWidths: [ 30, 30 ]
}) as any
settings.remotes.forEach(element => {
if (!netrc.machines[element]) return
table.push([
element,
netrc.machines[element].login
])
})
console.log(table.toString())
process.exit(0)
})
program
.command('set-default <url>')
.description('Set an existing entry as default')
.action(async url => {
const settings = await getSettings()
const instanceExists = settings.remotes.includes(url)
if (instanceExists) {
settings.default = settings.remotes.indexOf(url)
await writeSettings(settings)
process.exit(0)
} else {
console.log('<url> is not a registered instance.')
process.exit(-1)
}
})
program.addHelpText('after', '\n\n Examples:\n\n' +
' $ peertube auth add -u https://peertube.cpy.re -U "PEERTUBE_USER" --password "PEERTUBE_PASSWORD"\n' +
' $ peertube auth add -u https://peertube.cpy.re -U root\n' +
' $ peertube auth list\n' +
' $ peertube auth del https://peertube.cpy.re\n'
)
return program
}
// ---------------------------------------------------------------------------
// Private
// ---------------------------------------------------------------------------
async function delInstance (url: string) {
const [ settings, netrc ] = await Promise.all([ getSettings(), getNetrc() ])
const index = settings.remotes.indexOf(url)
settings.remotes.splice(index)
if (settings.default === index) settings.default = -1
await writeSettings(settings)
delete netrc.machines[url]
await netrc.save()
}
async function setInstance (url: string, username: string, password: string, isDefault: boolean) {
const [ settings, netrc ] = await Promise.all([ getSettings(), getNetrc() ])
if (settings.remotes.includes(url) === false) {
settings.remotes.push(url)
}
if (isDefault || settings.remotes.length === 1) {
settings.default = settings.remotes.length - 1
}
await writeSettings(settings)
netrc.machines[url] = { login: username, password }
await netrc.save()
}
function isURLaPeerTubeInstance (url: string) {
return url.startsWith('http://') || url.startsWith('https://')
}
function stripExtraneousFromPeerTubeUrl (url: string) {
// Get everything before the 3rd /.
const urlLength = url.includes('/', 8)
? url.indexOf('/', 8)
: url.length
return url.substring(0, urlLength)
}

View file

@ -0,0 +1,39 @@
import { Command } from '@commander-js/extra-typings'
import { assignToken, buildServer } from './shared/index.js'
export function defineGetAccessProgram () {
const program = new Command()
.name('get-access-token')
.description('Get a peertube access token')
.alias('token')
program
.option('-u, --url <url>', 'Server url')
.option('-n, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.action(async options => {
try {
if (
!options.url ||
!options.username ||
!options.password
) {
if (!options.url) console.error('--url field is required.')
if (!options.username) console.error('--username field is required.')
if (!options.password) console.error('--password field is required.')
process.exit(-1)
}
const server = buildServer(options.url)
await assignToken(server, options.username, options.password)
console.log(server.accessToken)
} catch (err) {
console.error('Cannot get access token: ' + err.message)
process.exit(-1)
}
})
return program
}

View file

@ -0,0 +1,167 @@
import CliTable3 from 'cli-table3'
import { isAbsolute } from 'path'
import { Command } from '@commander-js/extra-typings'
import { PluginType, PluginType_Type } from '@peertube/peertube-models'
import { assignToken, buildServer, CommonProgramOptions, getServerCredentials } from './shared/index.js'
export function definePluginsProgram () {
const program = new Command()
program
.name('plugins')
.description('Manage instance plugins/themes')
.alias('p')
program
.command('list')
.description('List installed plugins')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.option('-t, --only-themes', 'List themes only')
.option('-P, --only-plugins', 'List plugins only')
.action(async options => {
try {
await pluginsListCLI(options)
} catch (err) {
console.error('Cannot list plugins: ' + err.message)
process.exit(-1)
}
})
program
.command('install')
.description('Install a plugin or a theme')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.option('-P --path <path>', 'Install from a path')
.option('-n, --npm-name <npmName>', 'Install from npm')
.option('--plugin-version <pluginVersion>', 'Specify the plugin version to install (only available when installing from npm)')
.action(async options => {
try {
await installPluginCLI(options)
} catch (err) {
console.error('Cannot install plugin: ' + err.message)
process.exit(-1)
}
})
program
.command('update')
.description('Update a plugin or a theme')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.option('-P --path <path>', 'Update from a path')
.option('-n, --npm-name <npmName>', 'Update from npm')
.action(async options => {
try {
await updatePluginCLI(options)
} catch (err) {
console.error('Cannot update plugin: ' + err.message)
process.exit(-1)
}
})
program
.command('uninstall')
.description('Uninstall a plugin or a theme')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.option('-n, --npm-name <npmName>', 'NPM plugin/theme name')
.action(async options => {
try {
await uninstallPluginCLI(options)
} catch (err) {
console.error('Cannot uninstall plugin: ' + err.message)
process.exit(-1)
}
})
return program
}
// ----------------------------------------------------------------------------
async function pluginsListCLI (options: CommonProgramOptions & { onlyThemes?: true, onlyPlugins?: true }) {
const { url, username, password } = await getServerCredentials(options)
const server = buildServer(url)
await assignToken(server, username, password)
let pluginType: PluginType_Type
if (options.onlyThemes) pluginType = PluginType.THEME
if (options.onlyPlugins) pluginType = PluginType.PLUGIN
const { data } = await server.plugins.list({ start: 0, count: 100, sort: 'name', pluginType })
const table = new CliTable3({
head: [ 'name', 'version', 'homepage' ],
colWidths: [ 50, 20, 50 ]
}) as any
for (const plugin of data) {
const npmName = plugin.type === PluginType.PLUGIN
? 'peertube-plugin-' + plugin.name
: 'peertube-theme-' + plugin.name
table.push([
npmName,
plugin.version,
plugin.homepage
])
}
console.log(table.toString())
}
async function installPluginCLI (options: CommonProgramOptions & { path?: string, npmName?: string, pluginVersion?: string }) {
if (!options.path && !options.npmName) {
throw new Error('You need to specify the npm name or the path of the plugin you want to install.')
}
if (options.path && !isAbsolute(options.path)) {
throw new Error('Path should be absolute.')
}
const { url, username, password } = await getServerCredentials(options)
const server = buildServer(url)
await assignToken(server, username, password)
await server.plugins.install({ npmName: options.npmName, path: options.path, pluginVersion: options.pluginVersion })
console.log('Plugin installed.')
}
async function updatePluginCLI (options: CommonProgramOptions & { path?: string, npmName?: string }) {
if (!options.path && !options.npmName) {
throw new Error('You need to specify the npm name or the path of the plugin you want to update.')
}
if (options.path && !isAbsolute(options.path)) {
throw new Error('Path should be absolute.')
}
const { url, username, password } = await getServerCredentials(options)
const server = buildServer(url)
await assignToken(server, username, password)
await server.plugins.update({ npmName: options.npmName, path: options.path })
console.log('Plugin updated.')
}
async function uninstallPluginCLI (options: CommonProgramOptions & { npmName?: string }) {
if (!options.npmName) {
throw new Error('You need to specify the npm name of the plugin/theme you want to uninstall.')
}
const { url, username, password } = await getServerCredentials(options)
const server = buildServer(url)
await assignToken(server, username, password)
await server.plugins.uninstall({ npmName: options.npmName })
console.log('Plugin uninstalled.')
}

View file

@ -0,0 +1,186 @@
import bytes from 'bytes'
import CliTable3 from 'cli-table3'
import { URL } from 'url'
import { Command } from '@commander-js/extra-typings'
import { forceNumber, uniqify } from '@peertube/peertube-core-utils'
import { HttpStatusCode, VideoRedundanciesTarget } from '@peertube/peertube-models'
import { assignToken, buildServer, CommonProgramOptions, getServerCredentials } from './shared/index.js'
export function defineRedundancyProgram () {
const program = new Command()
.name('redundancy')
.description('Manage instance redundancies')
.alias('r')
program
.command('list-remote-redundancies')
.description('List remote redundancies on your videos')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.action(async options => {
try {
await listRedundanciesCLI({ target: 'my-videos', ...options })
} catch (err) {
console.error('Cannot list remote redundancies: ' + err.message)
process.exit(-1)
}
})
program
.command('list-my-redundancies')
.description('List your redundancies of remote videos')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.action(async options => {
try {
await listRedundanciesCLI({ target: 'remote-videos', ...options })
} catch (err) {
console.error('Cannot list redundancies: ' + err.message)
process.exit(-1)
}
})
program
.command('add')
.description('Duplicate a video in your redundancy system')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.requiredOption('-v, --video <videoId>', 'Video id to duplicate', parseInt)
.action(async options => {
try {
await addRedundancyCLI(options)
} catch (err) {
console.error('Cannot duplicate video: ' + err.message)
process.exit(-1)
}
})
program
.command('remove')
.description('Remove a video from your redundancies')
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.requiredOption('-v, --video <videoId>', 'Video id to remove from redundancies', parseInt)
.action(async options => {
try {
await removeRedundancyCLI(options)
} catch (err) {
console.error('Cannot remove redundancy: ' + err)
process.exit(-1)
}
})
return program
}
// ----------------------------------------------------------------------------
async function listRedundanciesCLI (options: CommonProgramOptions & { target: VideoRedundanciesTarget }) {
const { target } = options
const { url, username, password } = await getServerCredentials(options)
const server = buildServer(url)
await assignToken(server, username, password)
const { data } = await server.redundancy.listVideos({ start: 0, count: 100, sort: 'name', target })
const table = new CliTable3({
head: [ 'video id', 'video name', 'video url', 'files', 'playlists', 'by instances', 'total size' ]
}) as any
for (const redundancy of data) {
const webVideoFiles = redundancy.redundancies.files
const streamingPlaylists = redundancy.redundancies.streamingPlaylists
let totalSize = ''
if (target === 'remote-videos') {
const tmp = webVideoFiles.concat(streamingPlaylists)
.reduce((a, b) => a + b.size, 0)
// FIXME: don't use external dependency to stringify bytes: we already have the functions in the client
totalSize = bytes(tmp)
}
const instances = uniqify(
webVideoFiles.concat(streamingPlaylists)
.map(r => r.fileUrl)
.map(u => new URL(u).host)
)
table.push([
redundancy.id.toString(),
redundancy.name,
redundancy.url,
webVideoFiles.length,
streamingPlaylists.length,
instances.join('\n'),
totalSize
])
}
console.log(table.toString())
}
async function addRedundancyCLI (options: { video: number } & CommonProgramOptions) {
const { url, username, password } = await getServerCredentials(options)
const server = buildServer(url)
await assignToken(server, username, password)
if (!options.video || isNaN(options.video)) {
throw new Error('You need to specify the video id to duplicate and it should be a number.')
}
try {
await server.redundancy.addVideo({ videoId: options.video })
console.log('Video will be duplicated by your instance!')
} catch (err) {
if (err.message.includes(HttpStatusCode.CONFLICT_409)) {
throw new Error('This video is already duplicated by your instance.')
}
if (err.message.includes(HttpStatusCode.NOT_FOUND_404)) {
throw new Error('This video id does not exist.')
}
throw err
}
}
async function removeRedundancyCLI (options: CommonProgramOptions & { video: number }) {
const { url, username, password } = await getServerCredentials(options)
const server = buildServer(url)
await assignToken(server, username, password)
if (!options.video || isNaN(options.video)) {
throw new Error('You need to specify the video id to remove from your redundancies')
}
const videoId = forceNumber(options.video)
const myVideoRedundancies = await server.redundancy.listVideos({ target: 'my-videos' })
let videoRedundancy = myVideoRedundancies.data.find(r => videoId === r.id)
if (!videoRedundancy) {
const remoteVideoRedundancies = await server.redundancy.listVideos({ target: 'remote-videos' })
videoRedundancy = remoteVideoRedundancies.data.find(r => videoId === r.id)
}
if (!videoRedundancy) {
throw new Error('Video redundancy not found.')
}
const ids = videoRedundancy.redundancies.files
.concat(videoRedundancy.redundancies.streamingPlaylists)
.map(r => r.id)
for (const id of ids) {
await server.redundancy.removeVideo({ redundancyId: id })
}
console.log('Video redundancy removed!')
}

View file

@ -0,0 +1,167 @@
import { access, constants } from 'fs/promises'
import { isAbsolute } from 'path'
import { inspect } from 'util'
import { Command } from '@commander-js/extra-typings'
import { VideoPrivacy } from '@peertube/peertube-models'
import { PeerTubeServer } from '@peertube/peertube-server-commands'
import { assignToken, buildServer, getServerCredentials, listOptions } from './shared/index.js'
type UploadOptions = {
url?: string
username?: string
password?: string
thumbnail?: string
preview?: string
file?: string
videoName?: string
category?: string
licence?: string
language?: string
tags?: string
nsfw?: true
videoDescription?: string
privacy?: number
channelName?: string
noCommentsEnabled?: true
support?: string
noWaitTranscoding?: true
noDownloadEnabled?: true
}
export function defineUploadProgram () {
const program = new Command('upload')
.description('Upload a video on a PeerTube instance')
.alias('up')
program
.option('-u, --url <url>', 'Server url')
.option('-U, --username <username>', 'Username')
.option('-p, --password <token>', 'Password')
.option('-b, --thumbnail <thumbnailPath>', 'Thumbnail path')
.option('--preview <previewPath>', 'Preview path')
.option('-f, --file <file>', 'Video absolute file path')
.option('-n, --video-name <name>', 'Video name')
.option('-c, --category <category_number>', 'Category number')
.option('-l, --licence <licence_number>', 'Licence number')
.option('-L, --language <language_code>', 'Language ISO 639 code (fr or en...)')
.option('-t, --tags <tags>', 'Video tags', listOptions)
.option('-N, --nsfw', 'Video is Not Safe For Work')
.option('-d, --video-description <description>', 'Video description')
.option('-P, --privacy <privacy_number>', 'Privacy', parseInt)
.option('-C, --channel-name <channel_name>', 'Channel name')
.option('--no-comments-enabled', 'Disable video comments')
.option('-s, --support <support>', 'Video support text')
.option('--no-wait-transcoding', 'Do not wait transcoding before publishing the video')
.option('--no-download-enabled', 'Disable video download')
.option('-v, --verbose <verbose>', 'Verbosity, from 0/\'error\' to 4/\'debug\'', 'info')
.action(async options => {
try {
const { url, username, password } = await getServerCredentials(options)
if (!options.videoName || !options.file) {
if (!options.videoName) console.error('--video-name is required.')
if (!options.file) console.error('--file is required.')
process.exit(-1)
}
if (isAbsolute(options.file) === false) {
console.error('File path should be absolute.')
process.exit(-1)
}
await run({ ...options, url, username, password })
} catch (err) {
console.error('Cannot upload video: ' + err.message)
process.exit(-1)
}
})
return program
}
// ---------------------------------------------------------------------------
// Private
// ---------------------------------------------------------------------------
async function run (options: UploadOptions) {
const { url, username, password } = options
const server = buildServer(url)
await assignToken(server, username, password)
await access(options.file, constants.F_OK)
console.log('Uploading %s video...', options.videoName)
const baseAttributes = await buildVideoAttributesFromCommander(server, options)
const attributes = {
...baseAttributes,
fixture: options.file,
thumbnailfile: options.thumbnail,
previewfile: options.preview
}
try {
await server.videos.upload({ attributes })
console.log(`Video ${options.videoName} uploaded.`)
process.exit(0)
} catch (err) {
const message = err.message || ''
if (message.includes('413')) {
console.error('Aborted: user quota is exceeded or video file is too big for this PeerTube instance.')
} else {
console.error(inspect(err))
}
process.exit(-1)
}
}
async function buildVideoAttributesFromCommander (server: PeerTubeServer, options: UploadOptions, defaultAttributes: any = {}) {
const defaultBooleanAttributes = {
nsfw: false,
commentsEnabled: true,
downloadEnabled: true,
waitTranscoding: true
}
const booleanAttributes: { [id in keyof typeof defaultBooleanAttributes]: boolean } | {} = {}
for (const key of Object.keys(defaultBooleanAttributes)) {
if (options[key] !== undefined) {
booleanAttributes[key] = options[key]
} else if (defaultAttributes[key] !== undefined) {
booleanAttributes[key] = defaultAttributes[key]
} else {
booleanAttributes[key] = defaultBooleanAttributes[key]
}
}
const videoAttributes = {
name: options.videoName || defaultAttributes.name,
category: options.category || defaultAttributes.category || undefined,
licence: options.licence || defaultAttributes.licence || undefined,
language: options.language || defaultAttributes.language || undefined,
privacy: options.privacy || defaultAttributes.privacy || VideoPrivacy.PUBLIC,
support: options.support || defaultAttributes.support || undefined,
description: options.videoDescription || defaultAttributes.description || undefined,
tags: options.tags || defaultAttributes.tags || undefined
}
Object.assign(videoAttributes, booleanAttributes)
if (options.channelName) {
const videoChannel = await server.channels.get({ channelName: options.channelName })
Object.assign(videoAttributes, { channelId: videoChannel.id })
if (!videoAttributes.support && videoChannel.support) {
Object.assign(videoAttributes, { support: videoChannel.support })
}
}
return videoAttributes
}

View file

@ -0,0 +1,64 @@
#!/usr/bin/env node
import { Command } from '@commander-js/extra-typings'
import { defineAuthProgram } from './peertube-auth.js'
import { defineGetAccessProgram } from './peertube-get-access-token.js'
import { definePluginsProgram } from './peertube-plugins.js'
import { defineRedundancyProgram } from './peertube-redundancy.js'
import { defineUploadProgram } from './peertube-upload.js'
import { getSettings, version } from './shared/index.js'
const program = new Command()
program
.version(version, '-v, --version')
.usage('[command] [options]')
program.addCommand(defineAuthProgram())
program.addCommand(defineUploadProgram())
program.addCommand(defineRedundancyProgram())
program.addCommand(definePluginsProgram())
program.addCommand(defineGetAccessProgram())
// help on no command
if (!process.argv.slice(2).length) {
const logo = '░P░e░e░r░T░u░b░e░'
console.log(`
___/),.._ ` + logo + `
/' ,. ."'._
( "' '-.__"-._ ,-
\\'='='), "\\ -._-"-. -"/
/ ""/"\\,_\\,__"" _" /,-
/ / -" _/"/
/ | ._\\\\ |\\ |_.".-" /
/ | __\\)|)|),/|_." _,."
/ \\_." " ") | ).-""---''--
( "/.""7__-""''
| " ."._--._
\\ \\ (_ __ "" ".,_
\\.,. \\ "" -"".-"
".,_, (",_-,,,-".-
"'-,\\_ __,-"
",)" ")
/"\\-"
,"\\/
_,.__/"\\/_ (the CLI for red chocobos)
/ \\) "./, ".
--/---"---" "-) )---- by Chocobozzz et al.\n`)
}
getSettings()
.then(settings => {
const state = (settings.default === undefined || settings.default === -1)
? 'no instance selected, commands will require explicit arguments'
: 'instance ' + settings.remotes[settings.default] + ' selected'
program
.addHelpText('after', '\n\n State: ' + state + '\n\n' +
' Examples:\n\n' +
' $ peertube auth add -u "PEERTUBE_URL" -U "PEERTUBE_USER" --password "PEERTUBE_PASSWORD"\n' +
' $ peertube up <videoFile>\n'
)
.parse(process.argv)
})
.catch(err => console.error(err))

View file

@ -0,0 +1,195 @@
import applicationConfig from 'application-config'
import { Netrc } from 'netrc-parser'
import { join } from 'path'
import { createLogger, format, transports } from 'winston'
import { UserRole } from '@peertube/peertube-models'
import { getAppNumber, isTestInstance, root } from '@peertube/peertube-node-utils'
import { PeerTubeServer } from '@peertube/peertube-server-commands'
export type CommonProgramOptions = {
url?: string
username?: string
password?: string
}
let configName = 'PeerTube/CLI'
if (isTestInstance()) configName += `-${getAppNumber()}`
const config = applicationConfig(configName)
const version: string = process.env.PACKAGE_VERSION
async function getAdminTokenOrDie (server: PeerTubeServer, username: string, password: string) {
const token = await server.login.getAccessToken(username, password)
const me = await server.users.getMyInfo({ token })
if (me.role.id !== UserRole.ADMINISTRATOR) {
console.error('You must be an administrator.')
process.exit(-1)
}
return token
}
interface Settings {
remotes: any[]
default: number
}
async function getSettings () {
const defaultSettings: Settings = {
remotes: [],
default: -1
}
const data = await config.read() as Promise<Settings>
return Object.keys(data).length === 0
? defaultSettings
: data
}
async function getNetrc () {
const netrc = isTestInstance()
? new Netrc(join(root(import.meta.url), 'test' + getAppNumber(), 'netrc'))
: new Netrc()
await netrc.load()
return netrc
}
function writeSettings (settings: Settings) {
return config.write(settings)
}
function deleteSettings () {
return config.trash()
}
function getRemoteObjectOrDie (
options: CommonProgramOptions,
settings: Settings,
netrc: Netrc
): { url: string, username: string, password: string } {
function exitIfNoOptions (optionNames: string[], errorPrefix: string = '') {
let exit = false
for (const key of optionNames) {
if (!options[key]) {
if (exit === false && errorPrefix) console.error(errorPrefix)
console.error(`--${key} field is required`)
exit = true
}
}
if (exit) process.exit(-1)
}
// If username or password are specified, both are mandatory
if (options.username || options.password) {
exitIfNoOptions([ 'username', 'password' ])
}
// If no available machines, url, username and password args are mandatory
if (Object.keys(netrc.machines).length === 0) {
exitIfNoOptions([ 'url', 'username', 'password' ], 'No account found in netrc')
}
if (settings.remotes.length === 0 || settings.default === -1) {
exitIfNoOptions([ 'url' ], 'No default instance found')
}
let url: string = options.url
let username: string = options.username
let password: string = options.password
if (!url && settings.default !== -1) url = settings.remotes[settings.default]
const machine = netrc.machines[url]
if ((!username || !password) && !machine) {
console.error('Cannot find existing configuration for %s.', url)
process.exit(-1)
}
if (!username && machine) username = machine.login
if (!password && machine) password = machine.password
return { url, username, password }
}
function listOptions (val: any) {
return val.split(',')
}
function getServerCredentials (options: CommonProgramOptions) {
return Promise.all([ getSettings(), getNetrc() ])
.then(([ settings, netrc ]) => {
return getRemoteObjectOrDie(options, settings, netrc)
})
}
function buildServer (url: string) {
return new PeerTubeServer({ url })
}
async function assignToken (server: PeerTubeServer, username: string, password: string) {
const bodyClient = await server.login.getClient()
const client = { id: bodyClient.client_id, secret: bodyClient.client_secret }
const body = await server.login.login({ client, user: { username, password } })
server.accessToken = body.access_token
}
function getLogger (logLevel = 'info') {
const logLevels = {
0: 0,
error: 0,
1: 1,
warn: 1,
2: 2,
info: 2,
3: 3,
verbose: 3,
4: 4,
debug: 4
}
const logger = createLogger({
levels: logLevels,
format: format.combine(
format.splat(),
format.simple()
),
transports: [
new (transports.Console)({
level: logLevel
})
]
})
return logger
}
// ---------------------------------------------------------------------------
export {
version,
getLogger,
getSettings,
getNetrc,
getRemoteObjectOrDie,
writeSettings,
deleteSettings,
getServerCredentials,
listOptions,
getAdminTokenOrDie,
buildServer,
assignToken
}

View file

@ -0,0 +1 @@
export * from './cli.js'

View file

@ -0,0 +1,15 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist",
"rootDir": "src",
"tsBuildInfoFile": "./dist/.tsbuildinfo"
},
"references": [
{ "path": "../../packages/core-utils" },
{ "path": "../../packages/models" },
{ "path": "../../packages/node-utils" },
{ "path": "../../packages/server-commands" }
]
}

236
apps/peertube-cli/yarn.lock Normal file
View file

@ -0,0 +1,236 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@colors/colors@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9"
integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==
ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
application-config-path@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/application-config-path/-/application-config-path-1.0.0.tgz#9c25b8c00ac9a342db27275abd3f38c67bbe5a05"
integrity sha512-6ZDlLTlfqrTybVzZJDpX2K2ZufqyMyiTbOG06GpxmkmczFgTN+YYRGcTcMCXv/F5P5SrZijVjzzpPUE9BvheLg==
application-config@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/application-config/-/application-config-3.0.0.tgz#9adec84dd2d81e97dd78ea0dffcbf97381a1f55c"
integrity sha512-7ViR4soQJDx2O9iLf1vGxvekkPqvwqV/AZ2OL3DNcAQrg03UjJE1VeBk7oYNoN9AKB0eNyVrcM7kPD30NKeLLw==
dependencies:
application-config-path "^1.0.0"
load-json-file "^7.0.1"
write-json-file "^5.0.0"
cli-table3@^0.6.0:
version "0.6.3"
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2"
integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==
dependencies:
string-width "^4.2.0"
optionalDependencies:
"@colors/colors" "1.5.0"
cross-spawn@^6.0.0:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
dependencies:
nice-try "^1.0.4"
path-key "^2.0.1"
semver "^5.5.0"
shebang-command "^1.2.0"
which "^1.2.9"
debug@^3.1.0:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
dependencies:
ms "^2.1.1"
detect-indent@^7.0.0:
version "7.0.1"
resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25"
integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
execa@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50"
integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==
dependencies:
cross-spawn "^6.0.0"
get-stream "^3.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-plain-obj@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0"
integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==
is-typedarray@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
load-json-file@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-7.0.1.tgz#a3c9fde6beffb6bedb5acf104fad6bb1604e1b00"
integrity sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==
ms@^2.1.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
netrc-parser@^3.1.6:
version "3.1.6"
resolved "https://registry.yarnpkg.com/netrc-parser/-/netrc-parser-3.1.6.tgz#7243c9ec850b8e805b9bdc7eae7b1450d4a96e72"
integrity sha512-lY+fmkqSwntAAjfP63jB4z5p5WbuZwyMCD3pInT7dpHU/Gc6Vv90SAC6A0aNiqaRGHiuZFBtiwu+pu8W/Eyotw==
dependencies:
debug "^3.1.0"
execa "^0.10.0"
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==
dependencies:
path-key "^2.0.0"
p-finally@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
path-key@^2.0.0, path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
semver@^5.5.0:
version "5.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
dependencies:
shebang-regex "^1.0.0"
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.7"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
sort-keys@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-5.0.0.tgz#5d775f8ae93ecc29bc7312bbf3acac4e36e3c446"
integrity sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==
dependencies:
is-plain-obj "^4.0.0"
string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-eof@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==
typedarray-to-buffer@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
dependencies:
is-typedarray "^1.0.0"
which@^1.2.9:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
dependencies:
isexe "^2.0.0"
write-file-atomic@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
dependencies:
imurmurhash "^0.1.4"
is-typedarray "^1.0.0"
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
write-json-file@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-5.0.0.tgz#11c329a8ea9e8e23fb92a87cc27412a15f87708b"
integrity sha512-ddSsCLa4aQ3kI21BthINo4q905/wfhvQ3JL3774AcRjBaiQmfn5v4rw77jQ7T6CmAit9VOQO+FsLyPkwxoB1fw==
dependencies:
detect-indent "^7.0.0"
is-plain-obj "^4.0.0"
sort-keys "^5.0.0"
write-file-atomic "^3.0.3"

3
apps/peertube-runner/.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
node_modules
dist
meta.json

View file

@ -0,0 +1,4 @@
src
meta.json
tsconfig.json
scripts

View file

@ -0,0 +1,43 @@
# PeerTube runner
Runner program to execute jobs (transcoding...) of remote PeerTube instances.
Commands below has to be run at the root of PeerTube git repository.
## Dev
### Install dependencies
```bash
cd peertube-root
yarn install --pure-lockfile
cd apps/peertube-runner && yarn install --pure-lockfile
```
### Develop
```bash
cd peertube-root
npm run dev:peertube-runner
```
### Build
```bash
cd peertube-root
npm run build:peertube-runner
```
### Run
```bash
cd peertube-root
node apps/peertube-runner/dist/peertube-runner.js --help
```
### Publish on NPM
```bash
cd peertube-root
(cd apps/peertube-runner && npm version patch) && npm run build:peertube-runner && (cd apps/peertube-runner && npm publish --access=public)
```

View file

@ -0,0 +1,21 @@
{
"name": "@peertube/peertube-runner",
"version": "0.0.16",
"type": "module",
"main": "dist/peertube-runner.js",
"bin": "dist/peertube-runner.js",
"engines": {
"node": ">=16.x"
},
"license": "AGPL-3.0",
"dependencies": {},
"devDependencies": {
"@iarna/toml": "^2.2.5",
"@peertube/net-ipc": "^2.2.0",
"@types/follow-redirects": "1.14.4",
"env-paths": "^3.0.0",
"follow-redirects": "^1.15.5",
"pino": "^8.11.0",
"pino-pretty": "^10.0.0"
}
}

View file

@ -0,0 +1,27 @@
import * as esbuild from 'esbuild'
import { readFileSync } from 'fs'
const packageJSON = JSON.parse(readFileSync(new URL('../package.json', import.meta.url)))
export const esbuildOptions = {
entryPoints: [ './src/peertube-runner.ts' ],
bundle: true,
platform: 'node',
format: 'esm',
target: 'node16',
external: [
'./lib-cov/fluent-ffmpeg',
'pg-hstore'
],
outfile: './dist/peertube-runner.js',
banner: {
js: `const require = (await import("node:module")).createRequire(import.meta.url);` +
`const __filename = (await import("node:url")).fileURLToPath(import.meta.url);` +
`const __dirname = (await import("node:path")).dirname(__filename);`
},
define: {
'process.env.PACKAGE_VERSION': `'${packageJSON.version}'`
}
}
await esbuild.build(esbuildOptions)

View file

@ -0,0 +1,7 @@
import * as esbuild from 'esbuild'
import { esbuildOptions } from './build.js'
const context = await esbuild.context(esbuildOptions)
// Enable watch mode
await context.watch()

View file

@ -0,0 +1,91 @@
#!/usr/bin/env node
import { Command, InvalidArgumentError } from '@commander-js/extra-typings'
import { listRegistered, registerRunner, unregisterRunner } from './register/index.js'
import { RunnerServer } from './server/index.js'
import { ConfigManager, logger } from './shared/index.js'
const program = new Command()
.version(process.env.PACKAGE_VERSION)
.option(
'--id <id>',
'Runner server id, so you can run multiple PeerTube server runners with different configurations on the same machine',
'default'
)
.option('--verbose', 'Run in verbose mode')
.hook('preAction', thisCommand => {
const options = thisCommand.opts()
ConfigManager.Instance.init(options.id)
if (options.verbose === true) {
logger.level = 'debug'
}
})
program.command('server')
.description('Run in server mode, to execute remote jobs of registered PeerTube instances')
.action(async () => {
try {
await RunnerServer.Instance.run()
} catch (err) {
logger.error(err, 'Cannot run PeerTube runner as server mode')
process.exit(-1)
}
})
program.command('register')
.description('Register a new PeerTube instance to process runner jobs')
.requiredOption('--url <url>', 'PeerTube instance URL', parseUrl)
.requiredOption('--registration-token <token>', 'Runner registration token (can be found in PeerTube instance administration')
.requiredOption('--runner-name <name>', 'Runner name')
.option('--runner-description <description>', 'Runner description')
.action(async options => {
try {
await registerRunner(options)
} catch (err) {
console.error('Cannot register this PeerTube runner.')
console.error(err)
process.exit(-1)
}
})
program.command('unregister')
.description('Unregister the runner from PeerTube instance')
.requiredOption('--url <url>', 'PeerTube instance URL', parseUrl)
.requiredOption('--runner-name <name>', 'Runner name')
.action(async options => {
try {
await unregisterRunner(options)
} catch (err) {
console.error('Cannot unregister this PeerTube runner.')
console.error(err)
process.exit(-1)
}
})
program.command('list-registered')
.description('List registered PeerTube instances')
.action(async () => {
try {
await listRegistered()
} catch (err) {
console.error('Cannot list registered PeerTube instances.')
console.error(err)
process.exit(-1)
}
})
program.parse()
// ---------------------------------------------------------------------------
// Private
// ---------------------------------------------------------------------------
function parseUrl (url: string) {
if (url.startsWith('http://') !== true && url.startsWith('https://') !== true) {
throw new InvalidArgumentError('URL should start with a http:// or https://')
}
return url
}

View file

@ -0,0 +1 @@
export * from './register.js'

View file

@ -0,0 +1,36 @@
import { IPCClient } from '../shared/ipc/index.js'
export async function registerRunner (options: {
url: string
registrationToken: string
runnerName: string
runnerDescription?: string
}) {
const client = new IPCClient()
await client.run()
await client.askRegister(options)
client.stop()
}
export async function unregisterRunner (options: {
url: string
runnerName: string
}) {
const client = new IPCClient()
await client.run()
await client.askUnregister(options)
client.stop()
}
export async function listRegistered () {
const client = new IPCClient()
await client.run()
await client.askListRegistered()
client.stop()
}

View file

@ -0,0 +1 @@
export * from './server.js'

View file

@ -0,0 +1,2 @@
export * from './shared/index.js'
export * from './process.js'

View file

@ -0,0 +1,34 @@
import {
RunnerJobLiveRTMPHLSTranscodingPayload,
RunnerJobStudioTranscodingPayload,
RunnerJobVODAudioMergeTranscodingPayload,
RunnerJobVODHLSTranscodingPayload,
RunnerJobVODWebVideoTranscodingPayload
} from '@peertube/peertube-models'
import { logger } from '../../shared/index.js'
import { processAudioMergeTranscoding, processHLSTranscoding, ProcessOptions, processWebVideoTranscoding } from './shared/index.js'
import { ProcessLiveRTMPHLSTranscoding } from './shared/process-live.js'
import { processStudioTranscoding } from './shared/process-studio.js'
export async function processJob (options: ProcessOptions) {
const { server, job } = options
logger.info(`[${server.url}] Processing job of type ${job.type}: ${job.uuid}`, { payload: job.payload })
if (job.type === 'vod-audio-merge-transcoding') {
await processAudioMergeTranscoding(options as ProcessOptions<RunnerJobVODAudioMergeTranscodingPayload>)
} else if (job.type === 'vod-web-video-transcoding') {
await processWebVideoTranscoding(options as ProcessOptions<RunnerJobVODWebVideoTranscodingPayload>)
} else if (job.type === 'vod-hls-transcoding') {
await processHLSTranscoding(options as ProcessOptions<RunnerJobVODHLSTranscodingPayload>)
} else if (job.type === 'live-rtmp-hls-transcoding') {
await new ProcessLiveRTMPHLSTranscoding(options as ProcessOptions<RunnerJobLiveRTMPHLSTranscodingPayload>).process()
} else if (job.type === 'video-studio-transcoding') {
await processStudioTranscoding(options as ProcessOptions<RunnerJobStudioTranscodingPayload>)
} else {
logger.error(`Unknown job ${job.type} to process`)
return
}
logger.info(`[${server.url}] Finished processing job of type ${job.type}: ${job.uuid}`)
}

View file

@ -0,0 +1,106 @@
import { remove } from 'fs-extra/esm'
import { join } from 'path'
import { FFmpegEdition, FFmpegLive, FFmpegVOD, getDefaultAvailableEncoders, getDefaultEncodersToTry } from '@peertube/peertube-ffmpeg'
import { RunnerJob, RunnerJobPayload } from '@peertube/peertube-models'
import { buildUUID } from '@peertube/peertube-node-utils'
import { PeerTubeServer } from '@peertube/peertube-server-commands'
import { ConfigManager, downloadFile, logger } from '../../../shared/index.js'
import { getTranscodingLogger } from './transcoding-logger.js'
export type JobWithToken <T extends RunnerJobPayload = RunnerJobPayload> = RunnerJob<T> & { jobToken: string }
export type ProcessOptions <T extends RunnerJobPayload = RunnerJobPayload> = {
server: PeerTubeServer
job: JobWithToken<T>
runnerToken: string
}
export async function downloadInputFile (options: {
url: string
job: JobWithToken
runnerToken: string
}) {
const { url, job, runnerToken } = options
const destination = join(ConfigManager.Instance.getTranscodingDirectory(), buildUUID())
try {
await downloadFile({ url, jobToken: job.jobToken, runnerToken, destination })
} catch (err) {
remove(destination)
.catch(err => logger.error({ err }, `Cannot remove ${destination}`))
throw err
}
return destination
}
export function scheduleTranscodingProgress (options: {
server: PeerTubeServer
runnerToken: string
job: JobWithToken
progressGetter: () => number
}) {
const { job, server, progressGetter, runnerToken } = options
const updateInterval = ConfigManager.Instance.isTestInstance()
? 500
: 60000
const update = () => {
server.runnerJobs.update({ jobToken: job.jobToken, jobUUID: job.uuid, runnerToken, progress: progressGetter() })
.catch(err => logger.error({ err }, 'Cannot send job progress'))
}
const interval = setInterval(() => {
update()
}, updateInterval)
update()
return interval
}
// ---------------------------------------------------------------------------
export function buildFFmpegVOD (options: {
onJobProgress: (progress: number) => void
}) {
const { onJobProgress } = options
return new FFmpegVOD({
...getCommonFFmpegOptions(),
updateJobProgress: arg => {
const progress = arg < 0 || arg > 100
? undefined
: arg
onJobProgress(progress)
}
})
}
export function buildFFmpegLive () {
return new FFmpegLive(getCommonFFmpegOptions())
}
export function buildFFmpegEdition () {
return new FFmpegEdition(getCommonFFmpegOptions())
}
function getCommonFFmpegOptions () {
const config = ConfigManager.Instance.getConfig()
return {
niceness: config.ffmpeg.nice,
threads: config.ffmpeg.threads,
tmpDirectory: ConfigManager.Instance.getTranscodingDirectory(),
profile: 'default',
availableEncoders: {
available: getDefaultAvailableEncoders(),
encodersToTry: getDefaultEncodersToTry()
},
logger: getTranscodingLogger()
}
}

View file

@ -0,0 +1,3 @@
export * from './common.js'
export * from './process-vod.js'
export * from './transcoding-logger.js'

View file

@ -0,0 +1,342 @@
import { FSWatcher, watch } from 'chokidar'
import { FfmpegCommand } from 'fluent-ffmpeg'
import { ensureDir, remove } from 'fs-extra/esm'
import { basename, join } from 'path'
import { wait } from '@peertube/peertube-core-utils'
import { ffprobePromise, getVideoStreamBitrate, getVideoStreamDimensionsInfo, hasAudioStream } from '@peertube/peertube-ffmpeg'
import {
LiveRTMPHLSTranscodingSuccess,
LiveRTMPHLSTranscodingUpdatePayload,
PeerTubeProblemDocument,
RunnerJobLiveRTMPHLSTranscodingPayload,
ServerErrorCode
} from '@peertube/peertube-models'
import { buildUUID } from '@peertube/peertube-node-utils'
import { ConfigManager } from '../../../shared/config-manager.js'
import { logger } from '../../../shared/index.js'
import { buildFFmpegLive, ProcessOptions } from './common.js'
export class ProcessLiveRTMPHLSTranscoding {
private readonly outputPath: string
private readonly fsWatchers: FSWatcher[] = []
// Playlist name -> chunks
private readonly pendingChunksPerPlaylist = new Map<string, string[]>()
private readonly playlistsCreated = new Set<string>()
private allPlaylistsCreated = false
private ffmpegCommand: FfmpegCommand
private ended = false
private errored = false
constructor (private readonly options: ProcessOptions<RunnerJobLiveRTMPHLSTranscodingPayload>) {
this.outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), buildUUID())
logger.debug(`Using ${this.outputPath} to process live rtmp hls transcoding job ${options.job.uuid}`)
}
process () {
const job = this.options.job
const payload = job.payload
return new Promise<void>(async (res, rej) => {
try {
await ensureDir(this.outputPath)
logger.info(`Probing ${payload.input.rtmpUrl}`)
const probe = await ffprobePromise(payload.input.rtmpUrl)
logger.info({ probe }, `Probed ${payload.input.rtmpUrl}`)
const hasAudio = await hasAudioStream(payload.input.rtmpUrl, probe)
const bitrate = await getVideoStreamBitrate(payload.input.rtmpUrl, probe)
const { ratio } = await getVideoStreamDimensionsInfo(payload.input.rtmpUrl, probe)
const m3u8Watcher = watch(this.outputPath + '/*.m3u8')
this.fsWatchers.push(m3u8Watcher)
const tsWatcher = watch(this.outputPath + '/*.ts')
this.fsWatchers.push(tsWatcher)
m3u8Watcher.on('change', p => {
logger.debug(`${p} m3u8 playlist changed`)
})
m3u8Watcher.on('add', p => {
this.playlistsCreated.add(p)
if (this.playlistsCreated.size === this.options.job.payload.output.toTranscode.length + 1) {
this.allPlaylistsCreated = true
logger.info('All m3u8 playlists are created.')
}
})
tsWatcher.on('add', async p => {
try {
await this.sendPendingChunks()
} catch (err) {
this.onUpdateError({ err, rej, res })
}
const playlistName = this.getPlaylistIdFromTS(p)
const pendingChunks = this.pendingChunksPerPlaylist.get(playlistName) || []
pendingChunks.push(p)
this.pendingChunksPerPlaylist.set(playlistName, pendingChunks)
})
tsWatcher.on('unlink', p => {
this.sendDeletedChunkUpdate(p)
.catch(err => this.onUpdateError({ err, rej, res }))
})
this.ffmpegCommand = await buildFFmpegLive().getLiveTranscodingCommand({
inputUrl: payload.input.rtmpUrl,
outPath: this.outputPath,
masterPlaylistName: 'master.m3u8',
segmentListSize: payload.output.segmentListSize,
segmentDuration: payload.output.segmentDuration,
toTranscode: payload.output.toTranscode,
bitrate,
ratio,
hasAudio,
probe
})
logger.info(`Running live transcoding for ${payload.input.rtmpUrl}`)
this.ffmpegCommand.on('error', (err, stdout, stderr) => {
this.onFFmpegError({ err, stdout, stderr })
res()
})
this.ffmpegCommand.on('end', () => {
this.onFFmpegEnded()
.catch(err => logger.error({ err }, 'Error in FFmpeg end handler'))
res()
})
this.ffmpegCommand.run()
} catch (err) {
rej(err)
}
})
}
// ---------------------------------------------------------------------------
private onUpdateError (options: {
err: Error
res: () => void
rej: (reason?: any) => void
}) {
const { err, res, rej } = options
if (this.errored) return
if (this.ended) return
this.errored = true
this.ffmpegCommand.kill('SIGINT')
const type = ((err as any).res?.body as PeerTubeProblemDocument)?.code
if (type === ServerErrorCode.RUNNER_JOB_NOT_IN_PROCESSING_STATE) {
logger.info('Stopping transcoding as the job is not in processing state anymore')
this.sendSuccess()
.catch(err => logger.error({ err }, 'Cannot send success'))
res()
} else {
logger.error({ err }, 'Cannot send update after added/deleted chunk, stopping live transcoding')
this.sendError(err)
.catch(subErr => logger.error({ err: subErr }, 'Cannot send error'))
rej(err)
}
this.cleanup()
}
// ---------------------------------------------------------------------------
private onFFmpegError (options: {
err: any
stdout: string
stderr: string
}) {
const { err, stdout, stderr } = options
// Don't care that we killed the ffmpeg process
if (err?.message?.includes('Exiting normally')) return
if (this.errored) return
if (this.ended) return
this.errored = true
logger.error({ err, stdout, stderr }, 'FFmpeg transcoding error.')
this.sendError(err)
.catch(subErr => logger.error({ err: subErr }, 'Cannot send error'))
this.cleanup()
}
private async sendError (err: Error) {
await this.options.server.runnerJobs.error({
jobToken: this.options.job.jobToken,
jobUUID: this.options.job.uuid,
runnerToken: this.options.runnerToken,
message: err.message
})
}
// ---------------------------------------------------------------------------
private async onFFmpegEnded () {
if (this.ended) return
this.ended = true
logger.info('FFmpeg ended, sending success to server')
// Wait last ffmpeg chunks generation
await wait(1500)
this.sendSuccess()
.catch(err => logger.error({ err }, 'Cannot send success'))
this.cleanup()
}
private async sendSuccess () {
const successBody: LiveRTMPHLSTranscodingSuccess = {}
await this.options.server.runnerJobs.success({
jobToken: this.options.job.jobToken,
jobUUID: this.options.job.uuid,
runnerToken: this.options.runnerToken,
payload: successBody
})
}
// ---------------------------------------------------------------------------
private sendDeletedChunkUpdate (deletedChunk: string): Promise<any> {
if (this.ended) return Promise.resolve()
logger.debug(`Sending removed live chunk ${deletedChunk} update`)
const videoChunkFilename = basename(deletedChunk)
let payload: LiveRTMPHLSTranscodingUpdatePayload = {
type: 'remove-chunk',
videoChunkFilename
}
if (this.allPlaylistsCreated) {
const playlistName = this.getPlaylistName(videoChunkFilename)
payload = {
...payload,
masterPlaylistFile: join(this.outputPath, 'master.m3u8'),
resolutionPlaylistFilename: playlistName,
resolutionPlaylistFile: join(this.outputPath, playlistName)
}
}
return this.updateWithRetry(payload)
}
private async sendPendingChunks (): Promise<any> {
if (this.ended) return Promise.resolve()
const promises: Promise<any>[] = []
for (const playlist of this.pendingChunksPerPlaylist.keys()) {
for (const chunk of this.pendingChunksPerPlaylist.get(playlist)) {
logger.debug(`Sending added live chunk ${chunk} update`)
const videoChunkFilename = basename(chunk)
let payload: LiveRTMPHLSTranscodingUpdatePayload = {
type: 'add-chunk',
videoChunkFilename,
videoChunkFile: chunk
}
if (this.allPlaylistsCreated) {
const playlistName = this.getPlaylistName(videoChunkFilename)
payload = {
...payload,
masterPlaylistFile: join(this.outputPath, 'master.m3u8'),
resolutionPlaylistFilename: playlistName,
resolutionPlaylistFile: join(this.outputPath, playlistName)
}
}
promises.push(this.updateWithRetry(payload))
}
this.pendingChunksPerPlaylist.set(playlist, [])
}
await Promise.all(promises)
}
private async updateWithRetry (payload: LiveRTMPHLSTranscodingUpdatePayload, currentTry = 1): Promise<any> {
if (this.ended || this.errored) return
try {
await this.options.server.runnerJobs.update({
jobToken: this.options.job.jobToken,
jobUUID: this.options.job.uuid,
runnerToken: this.options.runnerToken,
payload
})
} catch (err) {
if (currentTry >= 3) throw err
if ((err.res?.body as PeerTubeProblemDocument)?.code === ServerErrorCode.RUNNER_JOB_NOT_IN_PROCESSING_STATE) throw err
logger.warn({ err }, 'Will retry update after error')
await wait(250)
return this.updateWithRetry(payload, currentTry + 1)
}
}
private getPlaylistName (videoChunkFilename: string) {
return `${videoChunkFilename.split('-')[0]}.m3u8`
}
private getPlaylistIdFromTS (segmentPath: string) {
const playlistIdMatcher = /^([\d+])-/
return basename(segmentPath).match(playlistIdMatcher)[1]
}
// ---------------------------------------------------------------------------
private cleanup () {
logger.debug(`Cleaning up job ${this.options.job.uuid}`)
for (const fsWatcher of this.fsWatchers) {
fsWatcher.close()
.catch(err => logger.error({ err }, 'Cannot close watcher'))
}
remove(this.outputPath)
.catch(err => logger.error({ err }, `Cannot remove ${this.outputPath}`))
}
}

View file

@ -0,0 +1,165 @@
import { remove } from 'fs-extra/esm'
import { join } from 'path'
import { pick } from '@peertube/peertube-core-utils'
import {
RunnerJobStudioTranscodingPayload,
VideoStudioTask,
VideoStudioTaskCutPayload,
VideoStudioTaskIntroPayload,
VideoStudioTaskOutroPayload,
VideoStudioTaskPayload,
VideoStudioTaskWatermarkPayload,
VideoStudioTranscodingSuccess
} from '@peertube/peertube-models'
import { buildUUID } from '@peertube/peertube-node-utils'
import { ConfigManager } from '../../../shared/config-manager.js'
import { logger } from '../../../shared/index.js'
import { buildFFmpegEdition, downloadInputFile, JobWithToken, ProcessOptions, scheduleTranscodingProgress } from './common.js'
export async function processStudioTranscoding (options: ProcessOptions<RunnerJobStudioTranscodingPayload>) {
const { server, job, runnerToken } = options
const payload = job.payload
let inputPath: string
let outputPath: string
let tmpInputFilePath: string
let tasksProgress = 0
const updateProgressInterval = scheduleTranscodingProgress({
job,
server,
runnerToken,
progressGetter: () => tasksProgress
})
try {
logger.info(`Downloading input file ${payload.input.videoFileUrl} for job ${job.jobToken}`)
inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job })
tmpInputFilePath = inputPath
logger.info(`Input file ${payload.input.videoFileUrl} downloaded for job ${job.jobToken}. Running studio transcoding tasks.`)
for (const task of payload.tasks) {
const outputFilename = 'output-edition-' + buildUUID() + '.mp4'
outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), outputFilename)
await processTask({
inputPath: tmpInputFilePath,
outputPath,
task,
job,
runnerToken
})
if (tmpInputFilePath) await remove(tmpInputFilePath)
// For the next iteration
tmpInputFilePath = outputPath
tasksProgress += Math.floor(100 / payload.tasks.length)
}
const successBody: VideoStudioTranscodingSuccess = {
videoFile: outputPath
}
await server.runnerJobs.success({
jobToken: job.jobToken,
jobUUID: job.uuid,
runnerToken,
payload: successBody
})
} finally {
if (tmpInputFilePath) await remove(tmpInputFilePath)
if (outputPath) await remove(outputPath)
if (updateProgressInterval) clearInterval(updateProgressInterval)
}
}
// ---------------------------------------------------------------------------
// Private
// ---------------------------------------------------------------------------
type TaskProcessorOptions <T extends VideoStudioTaskPayload = VideoStudioTaskPayload> = {
inputPath: string
outputPath: string
task: T
runnerToken: string
job: JobWithToken
}
const taskProcessors: { [id in VideoStudioTask['name']]: (options: TaskProcessorOptions) => Promise<any> } = {
'add-intro': processAddIntroOutro,
'add-outro': processAddIntroOutro,
'cut': processCut,
'add-watermark': processAddWatermark
}
async function processTask (options: TaskProcessorOptions) {
const { task } = options
const processor = taskProcessors[options.task.name]
if (!process) throw new Error('Unknown task ' + task.name)
return processor(options)
}
async function processAddIntroOutro (options: TaskProcessorOptions<VideoStudioTaskIntroPayload | VideoStudioTaskOutroPayload>) {
const { inputPath, task, runnerToken, job } = options
logger.debug('Adding intro/outro to ' + inputPath)
const introOutroPath = await downloadInputFile({ url: task.options.file, runnerToken, job })
try {
await buildFFmpegEdition().addIntroOutro({
...pick(options, [ 'inputPath', 'outputPath' ]),
introOutroPath,
type: task.name === 'add-intro'
? 'intro'
: 'outro'
})
} finally {
await remove(introOutroPath)
}
}
function processCut (options: TaskProcessorOptions<VideoStudioTaskCutPayload>) {
const { inputPath, task } = options
logger.debug(`Cutting ${inputPath}`)
return buildFFmpegEdition().cutVideo({
...pick(options, [ 'inputPath', 'outputPath' ]),
start: task.options.start,
end: task.options.end
})
}
async function processAddWatermark (options: TaskProcessorOptions<VideoStudioTaskWatermarkPayload>) {
const { inputPath, task, runnerToken, job } = options
logger.debug('Adding watermark to ' + inputPath)
const watermarkPath = await downloadInputFile({ url: task.options.file, runnerToken, job })
try {
await buildFFmpegEdition().addWatermark({
...pick(options, [ 'inputPath', 'outputPath' ]),
watermarkPath,
videoFilters: {
watermarkSizeRatio: task.options.watermarkSizeRatio,
horitonzalMarginRatio: task.options.horitonzalMarginRatio,
verticalMarginRatio: task.options.verticalMarginRatio
}
})
} finally {
await remove(watermarkPath)
}
}

View file

@ -0,0 +1,201 @@
import { remove } from 'fs-extra/esm'
import { join } from 'path'
import {
RunnerJobVODAudioMergeTranscodingPayload,
RunnerJobVODHLSTranscodingPayload,
RunnerJobVODWebVideoTranscodingPayload,
VODAudioMergeTranscodingSuccess,
VODHLSTranscodingSuccess,
VODWebVideoTranscodingSuccess
} from '@peertube/peertube-models'
import { buildUUID } from '@peertube/peertube-node-utils'
import { ConfigManager } from '../../../shared/config-manager.js'
import { logger } from '../../../shared/index.js'
import { buildFFmpegVOD, downloadInputFile, ProcessOptions, scheduleTranscodingProgress } from './common.js'
export async function processWebVideoTranscoding (options: ProcessOptions<RunnerJobVODWebVideoTranscodingPayload>) {
const { server, job, runnerToken } = options
const payload = job.payload
let ffmpegProgress: number
let inputPath: string
const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `output-${buildUUID()}.mp4`)
const updateProgressInterval = scheduleTranscodingProgress({
job,
server,
runnerToken,
progressGetter: () => ffmpegProgress
})
try {
logger.info(`Downloading input file ${payload.input.videoFileUrl} for web video transcoding job ${job.jobToken}`)
inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job })
logger.info(`Downloaded input file ${payload.input.videoFileUrl} for job ${job.jobToken}. Running web video transcoding.`)
const ffmpegVod = buildFFmpegVOD({
onJobProgress: progress => { ffmpegProgress = progress }
})
await ffmpegVod.transcode({
type: 'video',
inputPath,
outputPath,
inputFileMutexReleaser: () => {},
resolution: payload.output.resolution,
fps: payload.output.fps
})
const successBody: VODWebVideoTranscodingSuccess = {
videoFile: outputPath
}
await server.runnerJobs.success({
jobToken: job.jobToken,
jobUUID: job.uuid,
runnerToken,
payload: successBody
})
} finally {
if (inputPath) await remove(inputPath)
if (outputPath) await remove(outputPath)
if (updateProgressInterval) clearInterval(updateProgressInterval)
}
}
export async function processHLSTranscoding (options: ProcessOptions<RunnerJobVODHLSTranscodingPayload>) {
const { server, job, runnerToken } = options
const payload = job.payload
let ffmpegProgress: number
let inputPath: string
const uuid = buildUUID()
const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `${uuid}-${payload.output.resolution}.m3u8`)
const videoFilename = `${uuid}-${payload.output.resolution}-fragmented.mp4`
const videoPath = join(join(ConfigManager.Instance.getTranscodingDirectory(), videoFilename))
const updateProgressInterval = scheduleTranscodingProgress({
job,
server,
runnerToken,
progressGetter: () => ffmpegProgress
})
try {
logger.info(`Downloading input file ${payload.input.videoFileUrl} for HLS transcoding job ${job.jobToken}`)
inputPath = await downloadInputFile({ url: payload.input.videoFileUrl, runnerToken, job })
logger.info(`Downloaded input file ${payload.input.videoFileUrl} for job ${job.jobToken}. Running HLS transcoding.`)
const ffmpegVod = buildFFmpegVOD({
onJobProgress: progress => { ffmpegProgress = progress }
})
await ffmpegVod.transcode({
type: 'hls',
copyCodecs: false,
inputPath,
hlsPlaylist: { videoFilename },
outputPath,
inputFileMutexReleaser: () => {},
resolution: payload.output.resolution,
fps: payload.output.fps
})
const successBody: VODHLSTranscodingSuccess = {
resolutionPlaylistFile: outputPath,
videoFile: videoPath
}
await server.runnerJobs.success({
jobToken: job.jobToken,
jobUUID: job.uuid,
runnerToken,
payload: successBody
})
} finally {
if (inputPath) await remove(inputPath)
if (outputPath) await remove(outputPath)
if (videoPath) await remove(videoPath)
if (updateProgressInterval) clearInterval(updateProgressInterval)
}
}
export async function processAudioMergeTranscoding (options: ProcessOptions<RunnerJobVODAudioMergeTranscodingPayload>) {
const { server, job, runnerToken } = options
const payload = job.payload
let ffmpegProgress: number
let audioPath: string
let inputPath: string
const outputPath = join(ConfigManager.Instance.getTranscodingDirectory(), `output-${buildUUID()}.mp4`)
const updateProgressInterval = scheduleTranscodingProgress({
job,
server,
runnerToken,
progressGetter: () => ffmpegProgress
})
try {
logger.info(
`Downloading input files ${payload.input.audioFileUrl} and ${payload.input.previewFileUrl} ` +
`for audio merge transcoding job ${job.jobToken}`
)
audioPath = await downloadInputFile({ url: payload.input.audioFileUrl, runnerToken, job })
inputPath = await downloadInputFile({ url: payload.input.previewFileUrl, runnerToken, job })
logger.info(
`Downloaded input files ${payload.input.audioFileUrl} and ${payload.input.previewFileUrl} ` +
`for job ${job.jobToken}. Running audio merge transcoding.`
)
const ffmpegVod = buildFFmpegVOD({
onJobProgress: progress => { ffmpegProgress = progress }
})
await ffmpegVod.transcode({
type: 'merge-audio',
audioPath,
inputPath,
outputPath,
inputFileMutexReleaser: () => {},
resolution: payload.output.resolution,
fps: payload.output.fps
})
const successBody: VODAudioMergeTranscodingSuccess = {
videoFile: outputPath
}
await server.runnerJobs.success({
jobToken: job.jobToken,
jobUUID: job.uuid,
runnerToken,
payload: successBody
})
} finally {
if (audioPath) await remove(audioPath)
if (inputPath) await remove(inputPath)
if (outputPath) await remove(outputPath)
if (updateProgressInterval) clearInterval(updateProgressInterval)
}
}

View file

@ -0,0 +1,19 @@
import { LogFn } from 'pino'
import { logger } from '../../../shared/index.js'
export function getTranscodingLogger () {
return {
info: buildWinstonLogger(logger.info.bind(logger)),
debug: buildWinstonLogger(logger.debug.bind(logger)),
warn: buildWinstonLogger(logger.warn.bind(logger)),
error: buildWinstonLogger(logger.error.bind(logger))
}
}
function buildWinstonLogger (log: LogFn) {
return (arg1: string, arg2?: object) => {
if (arg2) return log(arg2, arg1)
return log(arg1)
}
}

View file

@ -0,0 +1,322 @@
import { ensureDir, remove } from 'fs-extra/esm'
import { readdir } from 'fs/promises'
import { join } from 'path'
import { io, Socket } from 'socket.io-client'
import { pick, shuffle, wait } from '@peertube/peertube-core-utils'
import { PeerTubeProblemDocument, ServerErrorCode } from '@peertube/peertube-models'
import { PeerTubeServer as PeerTubeServerCommand } from '@peertube/peertube-server-commands'
import { ConfigManager } from '../shared/index.js'
import { IPCServer } from '../shared/ipc/index.js'
import { logger } from '../shared/logger.js'
import { JobWithToken, processJob } from './process/index.js'
import { isJobSupported } from './shared/index.js'
type PeerTubeServer = PeerTubeServerCommand & {
runnerToken: string
runnerName: string
runnerDescription?: string
}
export class RunnerServer {
private static instance: RunnerServer
private servers: PeerTubeServer[] = []
private processingJobs: { job: JobWithToken, server: PeerTubeServer }[] = []
private checkingAvailableJobs = false
private cleaningUp = false
private initialized = false
private readonly sockets = new Map<PeerTubeServer, Socket>()
private constructor () {}
async run () {
logger.info('Running PeerTube runner in server mode')
await ConfigManager.Instance.load()
for (const registered of ConfigManager.Instance.getConfig().registeredInstances) {
const serverCommand = new PeerTubeServerCommand({ url: registered.url })
this.loadServer(Object.assign(serverCommand, registered))
logger.info(`Loading registered instance ${registered.url}`)
}
// Run IPC
const ipcServer = new IPCServer()
try {
await ipcServer.run(this)
} catch (err) {
logger.error('Cannot start local socket for IPC communication', err)
process.exit(-1)
}
// Cleanup on exit
for (const code of [ 'SIGTERM', 'SIGINT', 'SIGUSR1', 'SIGUSR2', 'uncaughtException' ]) {
process.on(code, async (err, origin) => {
if (code === 'uncaughtException') {
logger.error({ err, origin }, 'uncaughtException')
}
await this.onExit()
})
}
// Process jobs
await ensureDir(ConfigManager.Instance.getTranscodingDirectory())
await this.cleanupTMP()
logger.info(`Using ${ConfigManager.Instance.getTranscodingDirectory()} for transcoding directory`)
this.initialized = true
await this.checkAvailableJobs()
}
// ---------------------------------------------------------------------------
async registerRunner (options: {
url: string
registrationToken: string
runnerName: string
runnerDescription?: string
}) {
const { url, registrationToken, runnerName, runnerDescription } = options
logger.info(`Registering runner ${runnerName} on ${url}...`)
const serverCommand = new PeerTubeServerCommand({ url })
const { runnerToken } = await serverCommand.runners.register({ name: runnerName, description: runnerDescription, registrationToken })
const server: PeerTubeServer = Object.assign(serverCommand, {
runnerToken,
runnerName,
runnerDescription
})
this.loadServer(server)
await this.saveRegisteredInstancesInConf()
logger.info(`Registered runner ${runnerName} on ${url}`)
}
private loadServer (server: PeerTubeServer) {
this.servers.push(server)
const url = server.url + '/runners'
const socket = io(url, {
auth: {
runnerToken: server.runnerToken
},
transports: [ 'websocket' ]
})
socket.on('connect_error', err => logger.warn({ err }, `Cannot connect to ${url} socket`))
socket.on('available-jobs', () => this.safeAsyncCheckAvailableJobs())
socket.on('connect', () => {
logger.info(`Connected to ${url} socket`)
this.safeAsyncCheckAvailableJobs()
})
socket.on('disconnect', () => logger.warn(`Disconnected from ${url} socket`))
socket.io.on('ping', () => logger.debug(`Received a "ping" for ${url}`))
this.sockets.set(server, socket)
}
async unregisterRunner (options: {
url: string
runnerName: string
}) {
const { url, runnerName } = options
const server = this.servers.find(s => s.url === url && s.runnerName === runnerName)
if (!server) {
logger.error(`Unknown server ${url} - ${runnerName} to unregister`)
return
}
logger.info(`Unregistering runner ${runnerName} on ${url}...`)
try {
await server.runners.unregister({ runnerToken: server.runnerToken })
} catch (err) {
logger.error({ err }, `Cannot unregister runner ${runnerName} on ${url}`)
}
this.unloadServer(server)
await this.saveRegisteredInstancesInConf()
logger.info(`Unregistered runner ${runnerName} on ${url}`)
}
private unloadServer (server: PeerTubeServer) {
this.servers = this.servers.filter(s => s !== server)
const socket = this.sockets.get(server)
socket.disconnect()
this.sockets.delete(server)
}
listRegistered () {
return {
servers: this.servers.map(s => {
return {
url: s.url,
runnerName: s.runnerName,
runnerDescription: s.runnerDescription
}
})
}
}
// ---------------------------------------------------------------------------
private safeAsyncCheckAvailableJobs () {
this.checkAvailableJobs()
.catch(err => logger.error({ err }, `Cannot check available jobs`))
}
private async checkAvailableJobs () {
if (!this.initialized) return
if (this.checkingAvailableJobs) return
this.checkingAvailableJobs = true
let hadAvailableJob = false
for (const server of shuffle([ ...this.servers ])) {
try {
logger.info('Checking available jobs on ' + server.url)
const job = await this.requestJob(server)
if (!job) continue
hadAvailableJob = true
await this.tryToExecuteJobAsync(server, job)
} catch (err) {
hadAvailableJob = false
const code = (err.res?.body as PeerTubeProblemDocument)?.code
if (code === ServerErrorCode.RUNNER_JOB_NOT_IN_PENDING_STATE) {
logger.debug({ err }, 'Runner job is not in pending state anymore, retry later')
continue
}
if (code === ServerErrorCode.UNKNOWN_RUNNER_TOKEN) {
logger.error({ err }, `Unregistering ${server.url} as the runner token ${server.runnerToken} is invalid`)
await this.unregisterRunner({ url: server.url, runnerName: server.runnerName })
continue
}
logger.error({ err }, `Cannot request/accept job on ${server.url} for runner ${server.runnerName}`)
}
}
this.checkingAvailableJobs = false
if (hadAvailableJob && this.canProcessMoreJobs()) {
await wait(2500)
this.checkAvailableJobs()
.catch(err => logger.error({ err }, 'Cannot check more available jobs'))
}
}
private async requestJob (server: PeerTubeServer) {
logger.debug(`Requesting jobs on ${server.url} for runner ${server.runnerName}`)
const { availableJobs } = await server.runnerJobs.request({ runnerToken: server.runnerToken })
const filtered = availableJobs.filter(j => isJobSupported(j))
if (filtered.length === 0) {
logger.debug(`No job available on ${server.url} for runner ${server.runnerName}`)
return undefined
}
return filtered[0]
}
private async tryToExecuteJobAsync (server: PeerTubeServer, jobToAccept: { uuid: string }) {
if (!this.canProcessMoreJobs()) return
const { job } = await server.runnerJobs.accept({ runnerToken: server.runnerToken, jobUUID: jobToAccept.uuid })
const processingJob = { job, server }
this.processingJobs.push(processingJob)
processJob({ server, job, runnerToken: server.runnerToken })
.catch(err => {
logger.error({ err }, 'Cannot process job')
server.runnerJobs.error({ jobToken: job.jobToken, jobUUID: job.uuid, runnerToken: server.runnerToken, message: err.message })
.catch(err2 => logger.error({ err: err2 }, 'Cannot abort job after error'))
})
.finally(() => {
this.processingJobs = this.processingJobs.filter(p => p !== processingJob)
return this.checkAvailableJobs()
})
}
// ---------------------------------------------------------------------------
private saveRegisteredInstancesInConf () {
const data = this.servers.map(s => {
return pick(s, [ 'url', 'runnerToken', 'runnerName', 'runnerDescription' ])
})
return ConfigManager.Instance.setRegisteredInstances(data)
}
private canProcessMoreJobs () {
return this.processingJobs.length < ConfigManager.Instance.getConfig().jobs.concurrency
}
// ---------------------------------------------------------------------------
private async cleanupTMP () {
const files = await readdir(ConfigManager.Instance.getTranscodingDirectory())
for (const file of files) {
await remove(join(ConfigManager.Instance.getTranscodingDirectory(), file))
}
}
private async onExit () {
if (this.cleaningUp) return
this.cleaningUp = true
logger.info('Cleaning up after program exit')
try {
for (const { server, job } of this.processingJobs) {
await server.runnerJobs.abort({
jobToken: job.jobToken,
jobUUID: job.uuid,
reason: 'Runner stopped',
runnerToken: server.runnerToken
})
}
await this.cleanupTMP()
} catch (err) {
logger.error(err)
process.exit(-1)
}
process.exit()
}
static get Instance () {
return this.instance || (this.instance = new this())
}
}

View file

@ -0,0 +1 @@
export * from './supported-job.js'

View file

@ -0,0 +1,43 @@
import {
RunnerJobLiveRTMPHLSTranscodingPayload,
RunnerJobPayload,
RunnerJobType,
RunnerJobStudioTranscodingPayload,
RunnerJobVODAudioMergeTranscodingPayload,
RunnerJobVODHLSTranscodingPayload,
RunnerJobVODWebVideoTranscodingPayload,
VideoStudioTaskPayload
} from '@peertube/peertube-models'
const supportedMatrix = {
'vod-web-video-transcoding': (_payload: RunnerJobVODWebVideoTranscodingPayload) => {
return true
},
'vod-hls-transcoding': (_payload: RunnerJobVODHLSTranscodingPayload) => {
return true
},
'vod-audio-merge-transcoding': (_payload: RunnerJobVODAudioMergeTranscodingPayload) => {
return true
},
'live-rtmp-hls-transcoding': (_payload: RunnerJobLiveRTMPHLSTranscodingPayload) => {
return true
},
'video-studio-transcoding': (payload: RunnerJobStudioTranscodingPayload) => {
const tasks = payload?.tasks
const supported = new Set<VideoStudioTaskPayload['name']>([ 'add-intro', 'add-outro', 'add-watermark', 'cut' ])
if (!Array.isArray(tasks)) return false
return tasks.every(t => t && supported.has(t.name))
}
}
export function isJobSupported (job: {
type: RunnerJobType
payload: RunnerJobPayload
}) {
const fn = supportedMatrix[job.type]
if (!fn) return false
return fn(job.payload as any)
}

View file

@ -0,0 +1,140 @@
import { parse, stringify } from '@iarna/toml'
import envPaths from 'env-paths'
import { ensureDir, pathExists, remove } from 'fs-extra/esm'
import { readFile, writeFile } from 'fs/promises'
import merge from 'lodash-es/merge.js'
import { dirname, join } from 'path'
import { logger } from '../shared/index.js'
const paths = envPaths('peertube-runner')
type Config = {
jobs: {
concurrency: number
}
ffmpeg: {
threads: number
nice: number
}
registeredInstances: {
url: string
runnerToken: string
runnerName: string
runnerDescription?: string
}[]
}
export class ConfigManager {
private static instance: ConfigManager
private config: Config = {
jobs: {
concurrency: 2
},
ffmpeg: {
threads: 2,
nice: 20
},
registeredInstances: []
}
private id: string
private configFilePath: string
private constructor () {}
init (id: string) {
this.id = id
this.configFilePath = join(this.getConfigDir(), 'config.toml')
}
async load () {
logger.info(`Using ${this.configFilePath} as configuration file`)
if (this.isTestInstance()) {
logger.info('Removing configuration file as we are using the "test" id')
await remove(this.configFilePath)
}
await ensureDir(dirname(this.configFilePath))
if (!await pathExists(this.configFilePath)) {
await this.save()
}
const file = await readFile(this.configFilePath, 'utf-8')
this.config = merge(this.config, parse(file))
}
save () {
return writeFile(this.configFilePath, stringify(this.config))
}
// ---------------------------------------------------------------------------
async setRegisteredInstances (registeredInstances: {
url: string
runnerToken: string
runnerName: string
runnerDescription?: string
}[]) {
this.config.registeredInstances = registeredInstances
await this.save()
}
// ---------------------------------------------------------------------------
getConfig () {
return this.deepFreeze(this.config)
}
// ---------------------------------------------------------------------------
getTranscodingDirectory () {
return join(paths.cache, this.id, 'transcoding')
}
getSocketDirectory () {
return join(paths.data, this.id)
}
getSocketPath () {
return join(this.getSocketDirectory(), 'peertube-runner.sock')
}
getConfigDir () {
return join(paths.config, this.id)
}
// ---------------------------------------------------------------------------
isTestInstance () {
return typeof this.id === 'string' && this.id.match(/^test-\d$/)
}
// ---------------------------------------------------------------------------
// Thanks: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
private deepFreeze <T extends object> (object: T) {
const propNames = Reflect.ownKeys(object)
// Freeze properties before freezing self
for (const name of propNames) {
const value = object[name]
if ((value && typeof value === 'object') || typeof value === 'function') {
this.deepFreeze(value)
}
}
return Object.freeze({ ...object })
}
static get Instance () {
return this.instance || (this.instance = new this())
}
}

View file

@ -0,0 +1,67 @@
import { createWriteStream } from 'fs'
import { remove } from 'fs-extra/esm'
import { RequestOptions } from 'https'
import { http, https } from 'follow-redirects'
import { logger } from './logger.js'
export function downloadFile (options: {
url: string
destination: string
runnerToken: string
jobToken: string
}) {
const { url, destination, runnerToken, jobToken } = options
logger.debug(`Downloading file ${url}`)
return new Promise<void>((res, rej) => {
const parsed = new URL(url)
const body = JSON.stringify({
runnerToken,
jobToken
})
const getOptions: RequestOptions = {
method: 'POST',
hostname: parsed.hostname,
port: parsed.port,
path: parsed.pathname,
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body, 'utf-8')
}
}
const request = getRequest(url)(getOptions, response => {
const code = response.statusCode ?? 0
if (code >= 400) {
return rej(new Error(response.statusMessage))
}
const file = createWriteStream(destination)
file.on('finish', () => res())
response.pipe(file)
})
request.on('error', err => {
remove(destination)
.catch(err => logger.error(err))
return rej(err)
})
request.write(body)
request.end()
})
}
// ---------------------------------------------------------------------------
function getRequest (url: string) {
if (url.startsWith('https://')) return https.request.bind(https)
return http.request.bind(http)
}

View file

@ -0,0 +1,3 @@
export * from './config-manager.js'
export * from './http.js'
export * from './logger.js'

View file

@ -0,0 +1,2 @@
export * from './ipc-client.js'
export * from './ipc-server.js'

View file

@ -0,0 +1,88 @@
import CliTable3 from 'cli-table3'
import { ensureDir } from 'fs-extra/esm'
import { Client as NetIPC } from '@peertube/net-ipc'
import { ConfigManager } from '../config-manager.js'
import { IPCReponse, IPCReponseData, IPCRequest } from './shared/index.js'
export class IPCClient {
private netIPC: NetIPC
async run () {
await ensureDir(ConfigManager.Instance.getSocketDirectory())
const socketPath = ConfigManager.Instance.getSocketPath()
this.netIPC = new NetIPC({ path: socketPath })
try {
await this.netIPC.connect()
} catch (err) {
if (err.code === 'ECONNREFUSED') {
throw new Error(
'This runner is not currently running in server mode on this system. ' +
'Please run it using the `server` command first (in another terminal for example) and then retry your command.'
)
}
throw err
}
}
async askRegister (options: {
url: string
registrationToken: string
runnerName: string
runnerDescription?: string
}) {
const req: IPCRequest = {
type: 'register',
...options
}
const { success, error } = await this.netIPC.request(req) as IPCReponse
if (success) console.log('PeerTube instance registered')
else console.error('Could not register PeerTube instance on runner server side', error)
}
async askUnregister (options: {
url: string
runnerName: string
}) {
const req: IPCRequest = {
type: 'unregister',
...options
}
const { success, error } = await this.netIPC.request(req) as IPCReponse
if (success) console.log('PeerTube instance unregistered')
else console.error('Could not unregister PeerTube instance on runner server side', error)
}
async askListRegistered () {
const req: IPCRequest = {
type: 'list-registered'
}
const { success, error, data } = await this.netIPC.request(req) as IPCReponse<IPCReponseData>
if (!success) {
console.error('Could not list registered PeerTube instances', error)
return
}
const table = new CliTable3({
head: [ 'instance', 'runner name', 'runner description' ]
})
for (const server of data.servers) {
table.push([ server.url, server.runnerName, server.runnerDescription ])
}
console.log(table.toString())
}
stop () {
this.netIPC.destroy()
}
}

View file

@ -0,0 +1,61 @@
import { ensureDir } from 'fs-extra/esm'
import { Server as NetIPC } from '@peertube/net-ipc'
import { pick } from '@peertube/peertube-core-utils'
import { RunnerServer } from '../../server/index.js'
import { ConfigManager } from '../config-manager.js'
import { logger } from '../logger.js'
import { IPCReponse, IPCReponseData, IPCRequest } from './shared/index.js'
export class IPCServer {
private netIPC: NetIPC
private runnerServer: RunnerServer
async run (runnerServer: RunnerServer) {
this.runnerServer = runnerServer
await ensureDir(ConfigManager.Instance.getSocketDirectory())
const socketPath = ConfigManager.Instance.getSocketPath()
this.netIPC = new NetIPC({ path: socketPath })
await this.netIPC.start()
logger.info(`IPC socket created on ${socketPath}`)
this.netIPC.on('request', async (req: IPCRequest, res) => {
try {
const data = await this.process(req)
this.sendReponse(res, { success: true, data })
} catch (err) {
logger.error('Cannot execute RPC call', err)
this.sendReponse(res, { success: false, error: err.message })
}
})
}
private async process (req: IPCRequest) {
switch (req.type) {
case 'register':
await this.runnerServer.registerRunner(pick(req, [ 'url', 'registrationToken', 'runnerName', 'runnerDescription' ]))
return undefined
case 'unregister':
await this.runnerServer.unregisterRunner(pick(req, [ 'url', 'runnerName' ]))
return undefined
case 'list-registered':
return Promise.resolve(this.runnerServer.listRegistered())
default:
throw new Error('Unknown RPC call ' + (req as any).type)
}
}
private sendReponse <T extends IPCReponseData> (
response: (data: any) => Promise<void>,
body: IPCReponse<T>
) {
response(body)
.catch(err => logger.error('Cannot send response after IPC request', err))
}
}

View file

@ -0,0 +1,2 @@
export * from './ipc-request.model.js'
export * from './ipc-response.model.js'

View file

@ -0,0 +1,15 @@
export type IPCRequest =
IPCRequestRegister |
IPCRequestUnregister |
IPCRequestListRegistered
export type IPCRequestRegister = {
type: 'register'
url: string
registrationToken: string
runnerName: string
runnerDescription?: string
}
export type IPCRequestUnregister = { type: 'unregister', url: string, runnerName: string }
export type IPCRequestListRegistered = { type: 'list-registered' }

View file

@ -0,0 +1,15 @@
export type IPCReponse <T extends IPCReponseData = undefined> = {
success: boolean
error?: string
data?: T
}
export type IPCReponseData =
// list registered
{
servers: {
runnerName: string
runnerDescription: string
url: string
}[]
}

View file

@ -0,0 +1,12 @@
import { pino } from 'pino'
import pretty from 'pino-pretty'
const logger = pino(pretty.default({
colorize: true
}))
logger.level = 'info'
export {
logger
}

View file

@ -0,0 +1,16 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "./",
"outDir": "./dist",
"rootDir": "src",
"tsBuildInfoFile": "./dist/.tsbuildinfo"
},
"references": [
{ "path": "../../packages/core-utils" },
{ "path": "../../packages/ffmpeg" },
{ "path": "../../packages/models" },
{ "path": "../../packages/node-utils" },
{ "path": "../../packages/server-commands" }
]
}

View file

@ -0,0 +1,345 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@iarna/toml@^2.2.5":
version "2.2.5"
resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
"@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz#44d752c1a2dc113f15f781b7cc4f53a307e3fa38"
integrity sha512-9bfjwDxIDWmmOKusUcqdS4Rw+SETlp9Dy39Xui9BEGEk19dDwH0jhipwFzEff/pFg95NKymc6TOTbRKcWeRqyQ==
"@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.2.tgz#f954f34355712212a8e06c465bc06c40852c6bb3"
integrity sha512-lwriRAHm1Yg4iDf23Oxm9n/t5Zpw1lVnxYU3HnJPTi2lJRkKTrps1KVgvL6m7WvmhYVt/FIsssWay+k45QHeuw==
"@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.2.tgz#45c63037f045c2b15c44f80f0393fa24f9655367"
integrity sha512-FU20Bo66/f7He9Fp9sP2zaJ1Q8L9uLPZQDub/WlUip78JlPeMbVL8546HbZfcW9LNciEXc8d+tThSJjSC+tmsg==
"@msgpackr-extract/msgpackr-extract-linux-arm@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.2.tgz#35707efeafe6d22b3f373caf9e8775e8920d1399"
integrity sha512-MOI9Dlfrpi2Cuc7i5dXdxPbFIgbDBGgKR5F2yWEa6FVEtSWncfVNKW5AKjImAQ6CZlBK9tympdsZJ2xThBiWWA==
"@msgpackr-extract/msgpackr-extract-linux-x64@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.2.tgz#091b1218b66c341f532611477ef89e83f25fae4f"
integrity sha512-gsWNDCklNy7Ajk0vBBf9jEx04RUxuDQfBse918Ww+Qb9HCPoGzS+XJTLe96iN3BVK7grnLiYghP/M4L8VsaHeA==
"@msgpackr-extract/msgpackr-extract-win32-x64@3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.2.tgz#0f164b726869f71da3c594171df5ebc1c4b0a407"
integrity sha512-O+6Gs8UeDbyFpbSh2CPEz/UOrrdWPTBYNblZK5CxxLisYt4kGX3Sc+czffFonyjiGSq3jWLwJS/CCJc7tBr4sQ==
"@peertube/net-ipc@^2.2.0":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@peertube/net-ipc/-/net-ipc-2.2.1.tgz#3d1c154a08b57cfea31ed760ec76fe2f69e35a19"
integrity sha512-RyKIGC3EeQ+xnSccf592qqsaXWrGp4wGfGl4W+wxDoZkwsThZJuiSbX8aCC1qZBHaDo3EuRH3ZrwsKpNjnyDAQ==
optionalDependencies:
fast-zlib "^2.0.1"
msgpackr "^1.3.2"
"@types/follow-redirects@1.14.4":
version "1.14.4"
resolved "https://registry.yarnpkg.com/@types/follow-redirects/-/follow-redirects-1.14.4.tgz#ca054d72ef574c77949fc5fff278b430fcd508ec"
integrity sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==
dependencies:
"@types/node" "*"
"@types/node@*":
version "20.11.20"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.20.tgz#f0a2aee575215149a62784210ad88b3a34843659"
integrity sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==
dependencies:
undici-types "~5.26.4"
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
dependencies:
event-target-shim "^5.0.0"
atomic-sleep@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b"
integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==
base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
buffer@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.2.1"
colorette@^2.0.7:
version "2.0.20"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
dateformat@^4.6.3:
version "4.6.3"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5"
integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
dependencies:
once "^1.4.0"
env-paths@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da"
integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==
event-target-shim@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
events@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
fast-copy@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.1.tgz#9e89ef498b8c04c1cd76b33b8e14271658a732aa"
integrity sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==
fast-redact@^3.1.1:
version "3.3.0"
resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.3.0.tgz#7c83ce3a7be4898241a46560d51de10f653f7634"
integrity sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==
fast-safe-stringify@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884"
integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==
fast-zlib@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/fast-zlib/-/fast-zlib-2.0.1.tgz#be624f592fc80ad8019ee2025d16a367a4e9b024"
integrity sha512-DCoYgNagM2Bt1VIpXpdGnRx4LzqJeYG0oh6Nf/7cWo6elTXkFGMw9CrRCYYUIapYNrozYMoyDRflx9mgT3Awyw==
follow-redirects@^1.15.5:
version "1.15.5"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020"
integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==
help-me@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/help-me/-/help-me-5.0.0.tgz#b1ebe63b967b74060027c2ac61f9be12d354a6f6"
integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==
ieee754@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
joycon@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03"
integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==
minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
msgpackr-extract@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz#e05ec1bb4453ddf020551bcd5daaf0092a2c279d"
integrity sha512-SdzXp4kD/Qf8agZ9+iTu6eql0m3kWm1A2y1hkpTeVNENutaB0BwHlSvAIaMxwntmRUAUjon2V4L8Z/njd0Ct8A==
dependencies:
node-gyp-build-optional-packages "5.0.7"
optionalDependencies:
"@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.2"
"@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.2"
"@msgpackr-extract/msgpackr-extract-linux-arm" "3.0.2"
"@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.2"
"@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.2"
"@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.2"
msgpackr@^1.3.2:
version "1.10.1"
resolved "https://registry.yarnpkg.com/msgpackr/-/msgpackr-1.10.1.tgz#51953bb4ce4f3494f0c4af3f484f01cfbb306555"
integrity sha512-r5VRLv9qouXuLiIBrLpl2d5ZvPt8svdQTl5/vMvE4nzDMyEX4sgW5yWhuBBj5UmgwOTWj8CIdSXn5sAfsHAWIQ==
optionalDependencies:
msgpackr-extract "^3.0.2"
node-gyp-build-optional-packages@5.0.7:
version "5.0.7"
resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz#5d2632bbde0ab2f6e22f1bbac2199b07244ae0b3"
integrity sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==
on-exit-leak-free@^2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8"
integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==
once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
pino-abstract-transport@^1.0.0, pino-abstract-transport@v1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz#083d98f966262164504afb989bccd05f665937a8"
integrity sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==
dependencies:
readable-stream "^4.0.0"
split2 "^4.0.0"
pino-pretty@^10.0.0:
version "10.3.1"
resolved "https://registry.yarnpkg.com/pino-pretty/-/pino-pretty-10.3.1.tgz#e3285a5265211ac6c7cd5988f9e65bf3371a0ca9"
integrity sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==
dependencies:
colorette "^2.0.7"
dateformat "^4.6.3"
fast-copy "^3.0.0"
fast-safe-stringify "^2.1.1"
help-me "^5.0.0"
joycon "^3.1.1"
minimist "^1.2.6"
on-exit-leak-free "^2.1.0"
pino-abstract-transport "^1.0.0"
pump "^3.0.0"
readable-stream "^4.0.0"
secure-json-parse "^2.4.0"
sonic-boom "^3.0.0"
strip-json-comments "^3.1.1"
pino-std-serializers@^6.0.0:
version "6.2.2"
resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz#d9a9b5f2b9a402486a5fc4db0a737570a860aab3"
integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==
pino@^8.11.0:
version "8.19.0"
resolved "https://registry.yarnpkg.com/pino/-/pino-8.19.0.tgz#ccc15ef736f103ec02cfbead0912bc436dc92ce4"
integrity sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==
dependencies:
atomic-sleep "^1.0.0"
fast-redact "^3.1.1"
on-exit-leak-free "^2.1.0"
pino-abstract-transport v1.1.0
pino-std-serializers "^6.0.0"
process-warning "^3.0.0"
quick-format-unescaped "^4.0.3"
real-require "^0.2.0"
safe-stable-stringify "^2.3.1"
sonic-boom "^3.7.0"
thread-stream "^2.0.0"
process-warning@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b"
integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==
process@^0.11.10:
version "0.11.10"
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
quick-format-unescaped@^4.0.3:
version "4.0.4"
resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz#93ef6dd8d3453cbc7970dd614fad4c5954d6b5a7"
integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==
readable-stream@^4.0.0:
version "4.5.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09"
integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==
dependencies:
abort-controller "^3.0.0"
buffer "^6.0.3"
events "^3.3.0"
process "^0.11.10"
string_decoder "^1.3.0"
real-require@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/real-require/-/real-require-0.2.0.tgz#209632dea1810be2ae063a6ac084fee7e33fba78"
integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-stable-stringify@^2.3.1:
version "2.4.3"
resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886"
integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==
secure-json-parse@^2.4.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/secure-json-parse/-/secure-json-parse-2.7.0.tgz#5a5f9cd6ae47df23dba3151edd06855d47e09862"
integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==
sonic-boom@^3.0.0, sonic-boom@^3.7.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.0.tgz#e442c5c23165df897d77c3c14ef3ca40dec66a66"
integrity sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==
dependencies:
atomic-sleep "^1.0.0"
split2@^4.0.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4"
integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==
string_decoder@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
thread-stream@^2.0.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/thread-stream/-/thread-stream-2.4.1.tgz#6d588b14f0546e59d3f306614f044bc01ce43351"
integrity sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==
dependencies:
real-require "^0.2.0"
undici-types@~5.26.4:
version "5.26.5"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==

View file

@ -3,7 +3,7 @@
"ignorePatterns": [
"projects/**/*",
"node_modules/",
"src/standalone/player/dist"
"src/standalone/embed-player-api/dist"
],
"overrides": [
{
@ -14,12 +14,12 @@
"project": [
"tsconfig.eslint.json"
],
"EXPERIMENTAL_useSourceOfProjectReferenceRedirect": true,
"createDefaultProgram": false
},
"extends": [
"../.eslintrc.json",
"plugin:@angular-eslint/ng-cli-compat",
"plugin:@angular-eslint/ng-cli-compat--formatting-add-on",
"plugin:@angular-eslint/recommended",
"plugin:@angular-eslint/template/process-inline-templates"
],
"rules": {
@ -155,6 +155,15 @@
"object-shorthand": [
"error",
"properties"
],
"quote-props": [
"error",
"consistent-as-needed"
],
"no-constant-binary-expression": "error",
"@typescript-eslint/unbound-method": [
"error",
{ "ignoreStatic": true }
]
}
},
@ -163,7 +172,8 @@
"*.html"
],
"extends": [
"plugin:@angular-eslint/template/recommended"
"plugin:@angular-eslint/template/recommended",
"plugin:@angular-eslint/template/accessibility"
],
"rules": {}
}

4
client/.gitignore vendored
View file

@ -12,5 +12,5 @@
/e2e/local.log
/e2e/browserstack.err
/e2e/screenshots
/src/standalone/player/build
/src/standalone/player/dist
/src/standalone/embed-player-api/build
/src/standalone/embed-player-api/dist

View file

@ -2,9 +2,7 @@
"extends": "stylelint-config-sass-guidelines",
"rules": {
"scss/at-import-no-partial-leading-underscore": null,
"color-hex-case": null,
"color-hex-length": null,
"order/properties-alphabetical-order": null,
"selector-pseudo-element-no-unknown": [
true,
{
@ -20,11 +18,10 @@
"selector-max-compound-selectors": 9,
"selector-no-qualifying-type": null,
"scss/at-extend-no-missing-placeholder": null,
"number-leading-zero": null,
"rule-empty-line-before": null,
"selector-max-id": null,
"scss/at-function-pattern": null,
"function-parentheses-space-inside": "never-single-line",
"scss/load-no-partial-leading-underscore": null,
"property-no-vendor-prefix": [
true,
{

View file

@ -29,6 +29,10 @@
"translation": "src/locale/angular.th-TH.xlf",
"baseHref": "/client/th-TH/"
},
"tr": {
"translation": "src/locale/angular.tr-TR.xlf",
"baseHref": "/client/tr-TR/"
},
"fi": {
"translation": "src/locale/angular.fi-FI.xlf",
"baseHref": "/client/fi-FI/"
@ -195,11 +199,14 @@
"path-browserify",
"deep-merge",
"escape-string-regexp",
"mousetrap",
"is-plain-object",
"parse-srcset",
"deepmerge",
"core-js/features/reflect"
"core-js/features/reflect",
"@formatjs/intl-locale/polyfill",
"@formatjs/intl-locale/should-polyfill",
"@formatjs/intl-pluralrules/polyfill-force",
"@formatjs/intl-pluralrules/should-polyfill"
],
"scripts": [],
"vendorChunk": true,
@ -276,25 +283,25 @@
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "PeerTube:build",
"proxyConfig": "proxy.config.json"
"proxyConfig": "proxy.config.json",
"buildTarget": "PeerTube:build"
},
"configurations": {
"production": {
"browserTarget": "PeerTube:build:production"
"buildTarget": "PeerTube:build:production"
},
"hmr": {
"browserTarget": "PeerTube:build:hmr"
"buildTarget": "PeerTube:build:hmr"
},
"ar-locale": {
"browserTarget": "PeerTube:build:ar-locale"
"buildTarget": "PeerTube:build:ar-locale"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "PeerTube:build"
"buildTarget": "PeerTube:build"
}
},
"lint": {
@ -310,7 +317,6 @@
}
}
},
"defaultProject": "PeerTube",
"schematics": {
"@schematics/angular:component": {
"prefix": "my",

View file

@ -10,14 +10,14 @@ export class AdminConfigPage {
}
await go('/admin/config/edit-custom#' + tab)
await $('.inner-form-title=' + waitTitles[tab]).waitForDisplayed()
await $('h2=' + waitTitles[tab]).waitForDisplayed()
}
async updateNSFWSetting (newValue: 'do_not_list' | 'blur' | 'display') {
const elem = $('#instanceDefaultNSFWPolicy')
await elem.waitForDisplayed()
await elem.scrollIntoView(false) // Avoid issues with fixed header on firefox
await elem.scrollIntoView({ block: 'center' }) // Avoid issues with fixed header
await elem.waitForClickable()
return elem.selectByAttribute('value', newValue)

View file

@ -1,4 +1,4 @@
import { go } from '../utils'
import { browserSleep, go, isAndroid } from '../utils'
export class LoginPage {
@ -23,12 +23,20 @@ export class LoginPage {
await $('input#username').setValue(username)
await $('input#password').setValue(password)
await browser.pause(1000)
await browserSleep(1000)
await $('form input[type=submit]').click()
const submit = $('.login-form-and-externals > form input[type=submit]')
await submit.click()
// Have to do this on Android, don't really know why
// I think we need to "escape" from the password input, so click twice on the submit button
if (isAndroid()) {
await browserSleep(2000)
await submit.click()
}
if (this.isMobileDevice) {
const menuToggle = $('.top-left-block span[role=button]')
const menuToggle = $('.top-left-block button')
await $('h2=Our content selection').waitForDisplayed()
@ -79,7 +87,7 @@ export class LoginPage {
await logout.click()
await browser.waitUntil(() => {
return $('.login-buttons-block, my-error-page a[href="/login"]').isDisplayed()
return $$('.login-buttons-block, my-error-page a[href="/login"]').some(e => e.isDisplayed())
})
}
@ -94,8 +102,8 @@ export class LoginPage {
}
private getSuffix () {
return browser.config.baseUrl
? browser.config.baseUrl.slice(-1)
return browser.options.baseUrl
? browser.options.baseUrl.slice(-1)
: '1'
}
}

View file

@ -1,4 +1,4 @@
import { getCheckbox, go } from '../utils'
import { getCheckbox, go, selectCustomSelect } from '../utils'
export class MyAccountPage {
@ -24,7 +24,7 @@ export class MyAccountPage {
const nsfw = $('#nsfwPolicy')
await nsfw.waitForDisplayed()
await nsfw.scrollIntoView(false) // Avoid issues with fixed header on firefox
await nsfw.scrollIntoView({ block: 'center' }) // Avoid issues with fixed header
await nsfw.waitForClickable()
await nsfw.selectByAttribute('value', newValue)
@ -36,7 +36,7 @@ export class MyAccountPage {
const p2p = await getCheckbox('p2pEnabled')
await p2p.waitForClickable()
await p2p.scrollIntoView(false) // Avoid issues with fixed header on firefox
await p2p.scrollIntoView({ block: 'center' }) // Avoid issues with fixed header
await p2p.click()
@ -47,7 +47,7 @@ export class MyAccountPage {
const submit = $('my-user-video-settings input[type=submit]')
await submit.waitForClickable()
await submit.scrollIntoView(false)
await submit.scrollIntoView({ block: 'center' }) // Avoid issues with fixed header
await submit.click()
}
@ -56,7 +56,7 @@ export class MyAccountPage {
async removeVideo (name: string) {
const container = await this.getVideoElement(name)
await container.$('.dropdown-toggle').click()
await container.$('my-action-dropdown .dropdown-toggle').click()
const deleteItem = () => {
return $$('.dropdown-menu .dropdown-item').find<WebdriverIO.Element>(async v => {
@ -117,6 +117,24 @@ export class MyAccountPage {
return go(url)
}
async updatePlaylistPrivacy (playlistUUID: string, privacy: 'Public' | 'Private' | 'Unlisted') {
go('/my-library/video-playlists/update/' + playlistUUID)
await $('a[href*="/my-library/video-playlists/update/"]').waitForDisplayed()
await selectCustomSelect('videoChannelId', 'Main root channel')
await selectCustomSelect('privacy', privacy)
const submit = await $('form input[type=submit]')
await submit.waitForClickable()
await submit.scrollIntoView()
await submit.click()
return browser.waitUntil(async () => {
return (await browser.getUrl()).includes('my-library/video-playlists')
})
}
// My account Videos
private async getVideoElement (name: string) {

View file

@ -29,29 +29,40 @@ export class PlayerPage {
}
async playAndPauseVideo (isAutoplay: boolean, waitUntilSec: number) {
const videojsElem = () => $('div.video-js')
await videojsElem().waitForExist()
// Autoplay is disabled on iOS and Safari
if (isIOS() || isSafari() || isMobileDevice()) {
// We can't play the video if it is not muted
await browser.execute(`document.querySelector('video').muted = true`)
await this.clickOnPlayButton()
} else if (isAutoplay === false) {
await this.clickOnPlayButton()
// Autoplay is disabled on mobile and Safari
if (isIOS() || isSafari() || isMobileDevice() || isAutoplay === false) {
await this.playVideo()
}
await $('div.video-js.vjs-has-started').waitForExist()
await browserSleep(2000)
await browser.waitUntil(async () => {
return (await this.getWatchVideoPlayerCurrentTime()) >= waitUntilSec
})
}, { timeout: Math.max(waitUntilSec * 2 * 1000, 30000) })
await videojsElem().click()
// Pause video
await $('div.video-js').click()
}
async playVideo () {
await $('div.video-js.vjs-paused, div.video-js.vjs-playing').waitForExist()
if (await $('div.video-js.vjs-playing').isExisting()) {
if (!isIOS()) return
// On iOS, the web browser may have aborted player autoplay, so check the video is still autoplayed
await browserSleep(5000)
if (await $('div.video-js.vjs-playing').isExisting()) return
}
// Autoplay is disabled on iOS and Safari
if (isIOS() || isSafari() || isMobileDevice()) {
// We can't play the video if it is not muted
await browser.execute(`document.querySelector('video').muted = true`)
}
return this.clickOnPlayButton()
}
@ -61,4 +72,15 @@ export class PlayerPage {
await playButton().waitForClickable()
await playButton().click()
}
async fillEmbedVideoPassword (videoPassword: string) {
const videoPasswordInput = $('input#video-password-input')
const confirmButton = await $('button#video-password-submit')
await videoPasswordInput.clearValue()
await videoPasswordInput.setValue(videoPassword)
await confirmButton.waitForClickable()
return confirmButton.click()
}
}

View file

@ -50,7 +50,7 @@ export class SignupPage {
await $('#password').setValue(options.password || 'password')
// Fix weird bug on firefox that "cannot scroll into view" when using just `setValue`
await $('#email').scrollIntoView(false)
await $('#email').scrollIntoView({ block: 'center' })
await $('#email').waitForClickable()
await $('#email').setValue(options.email || `${options.username}@example.com`)
}
@ -62,4 +62,26 @@ export class SignupPage {
await $('#displayName').setValue(options.displayName || `${options.name} channel display name`)
await $('#name').setValue(options.name)
}
async fullSignup ({ accountInfo, channelInfo }: {
accountInfo: {
username: string
password?: string
displayName?: string
email?: string
}
channelInfo: {
name: string
}
}) {
await this.clickOnRegisterInMenu()
await this.validateStep()
await this.checkTerms()
await this.validateStep()
await this.fillAccountStep(accountInfo)
await this.validateStep()
await this.fillChannelStep(channelInfo)
await this.validateStep()
await this.getEndMessage()
}
}

View file

@ -67,7 +67,7 @@ export class VideoListPage {
async getVideosListName () {
const elems = await $$('.videos .video-miniature .video-miniature-name')
const texts = await Promise.all(elems.map(e => e.getText()))
const texts = await elems.map(e => e.getText())
return texts.map(t => t.trim())
}

View file

@ -2,7 +2,7 @@ export class VideoSearchPage {
async search (search: string) {
await $('#search-video').setValue(search)
await $('my-header .icon-search').click()
await $('.search-button').click()
await browser.waitUntil(() => {
return $('my-video-miniature').isDisplayed()

View file

@ -64,6 +64,16 @@ export class VideoUploadPage {
return selectCustomSelect('privacy', 'Private')
}
async setAsPasswordProtected (videoPassword: string) {
selectCustomSelect('privacy', 'Password protected')
const videoPasswordInput = $('input#videoPassword')
await videoPasswordInput.waitForClickable()
await videoPasswordInput.clearValue()
return videoPasswordInput.setValue(videoPassword)
}
private getSecondStepSubmitButton () {
return $('.submit-container my-button')
}

View file

@ -9,11 +9,15 @@ export class VideoWatchPage {
waitWatchVideoName (videoName: string) {
if (this.isSafari) return browserSleep(5000)
// On mobile we display the first node, on desktop the second
// On mobile we display the first node, on desktop the second one
const index = this.isMobileDevice ? 0 : 1
return browser.waitUntil(async () => {
return (await $$('.video-info .video-info-name')[index].getText()).includes(videoName)
if (!await $('.video-info .video-info-name').isExisting()) return false
const elem = await $$('.video-info .video-info-name')[index]
return (await elem.getText()).includes(videoName) && elem.isDisplayed()
})
}
@ -30,9 +34,13 @@ export class VideoWatchPage {
}
async isDownloadEnabled () {
await this.clickOnMoreDropdownIcon()
try {
await this.clickOnMoreDropdownIcon()
return $('.dropdown-item .icon-download').isExisting()
return await $('.dropdown-item .icon-download').isExisting()
} catch {
return $('.action-button-download').isDisplayed()
}
}
areCommentsEnabled () {
@ -43,19 +51,25 @@ export class VideoWatchPage {
return $('my-privacy-concerns').isDisplayed()
}
async goOnAssociatedEmbed () {
async goOnAssociatedEmbed (passwordProtected = false) {
let url = await browser.getUrl()
url = url.replace('/w/', '/videos/embed/')
url = url.replace(':3333', ':9001')
await go(url)
await this.waitEmbedForDisplayed()
if (passwordProtected) await this.waitEmbedForVideoPasswordForm()
else await this.waitEmbedForDisplayed()
}
waitEmbedForDisplayed () {
return $('.vjs-big-play-button').waitForDisplayed()
}
waitEmbedForVideoPasswordForm () {
return $('#video-password-input').waitForDisplayed()
}
isEmbedWarningDisplayed () {
return $('.peertube-dock-description').isDisplayed()
}
@ -138,4 +152,78 @@ export class VideoWatchPage {
return elem()
}
isPasswordProtected () {
return $('#confirmInput').isExisting()
}
async fillVideoPassword (videoPassword: string) {
const videoPasswordInput = await $('input#confirmInput')
await videoPasswordInput.waitForClickable()
await videoPasswordInput.clearValue()
await videoPasswordInput.setValue(videoPassword)
const confirmButton = await $('input[value="Confirm"]')
await confirmButton.waitForClickable()
return confirmButton.click()
}
async like () {
const likeButton = await $('.action-button-like')
const isActivated = (await likeButton.getAttribute('class')).includes('activated')
let count: number
try {
count = parseInt(await $('.action-button-like > .count').getText())
} catch (error) {
count = 0
}
await likeButton.waitForClickable()
await likeButton.click()
if (isActivated) {
if (count === 1) {
return expect(!await $('.action-button-like > .count').isExisting())
} else {
return expect(parseInt(await $('.action-button-like > .count').getText())).toBe(count - 1)
}
} else {
return expect(parseInt(await $('.action-button-like > .count').getText())).toBe(count + 1)
}
}
async createThread (comment: string) {
const textarea = await $('my-video-comment-add textarea')
await textarea.waitForClickable()
await textarea.setValue(comment)
const confirmButton = await $('.comment-buttons .orange-button')
await confirmButton.waitForClickable()
await confirmButton.click()
const createdComment = await (await $('.comment-html p')).getText()
return expect(createdComment).toBe(comment)
}
async createReply (comment: string) {
const replyButton = await $('button.comment-action-reply')
await replyButton.waitForClickable()
await replyButton.scrollIntoView()
await replyButton.click()
const textarea = await $('my-video-comment my-video-comment-add textarea')
await textarea.waitForClickable()
await textarea.setValue(comment)
const confirmButton = await $('my-video-comment .comment-buttons .orange-button')
await confirmButton.waitForClickable()
await confirmButton.click()
const createdComment = await (await $('.is-child .comment-html p')).getText()
return expect(createdComment).toBe(comment)
}
}

View file

@ -31,8 +31,8 @@ describe('Private videos all workflow', () => {
return loginPage.loginOnPeerTube2()
})
it('Should play an internal webtorrent video', async () => {
await go(FIXTURE_URLS.INTERNAL_WEBTORRENT_VIDEO)
it('Should play an internal web video', async () => {
await go(FIXTURE_URLS.INTERNAL_WEB_VIDEO)
await videoWatchPage.waitWatchVideoName(internalVideoName)
await checkCorrectlyPlay(playerPage)
@ -52,8 +52,8 @@ describe('Private videos all workflow', () => {
await checkCorrectlyPlay(playerPage)
})
it('Should play an internal WebTorrent video in embed', async () => {
await go(FIXTURE_URLS.INTERNAL_EMBED_WEBTORRENT_VIDEO)
it('Should play an internal Web Video in embed', async () => {
await go(FIXTURE_URLS.INTERNAL_EMBED_WEB_VIDEO)
await videoWatchPage.waitEmbedForDisplayed()
await checkCorrectlyPlay(playerPage)

View file

@ -89,7 +89,7 @@ describe('Videos all workflow', () => {
let videoNameToExcept = videoName
if (isMobileDevice() || isSafari()) {
await go(FIXTURE_URLS.WEBTORRENT_VIDEO)
await go(FIXTURE_URLS.WEB_VIDEO)
videoNameToExcept = 'E2E tests'
} else {
await videoListPage.clickOnVideo(videoName)
@ -176,7 +176,7 @@ describe('Videos all workflow', () => {
await videoWatchPage.waitUntilVideoName(video2Name, 40 * 1000)
})
it('Should watch the webtorrent playlist in the embed', async () => {
it('Should watch the Web Video playlist in the embed', async () => {
if (isUploadUnsupported()) return
const accessToken = await browser.execute(`return window.localStorage.getItem('access_token');`)

View file

@ -1,7 +1,7 @@
import { LoginPage } from '../po/login.po'
import { VideoUploadPage } from '../po/video-upload.po'
import { VideoWatchPage } from '../po/video-watch.po'
import { go, isMobileDevice, isSafari, waitServerUp } from '../utils'
import { getScreenshotPath, go, isMobileDevice, isSafari, waitServerUp } from '../utils'
describe('Custom server defaults', () => {
let videoUploadPage: VideoUploadPage
@ -30,14 +30,21 @@ describe('Custom server defaults', () => {
await videoWatchPage.waitWatchVideoName('video')
expect(await videoWatchPage.getPrivacy()).toBe('Internal')
expect(await videoWatchPage.getLicence()).toBe('Attribution - Non Commercial')
expect(await videoWatchPage.isDownloadEnabled()).toBeFalsy()
expect(await videoWatchPage.areCommentsEnabled()).toBeFalsy()
})
const videoUrl = await browser.getUrl()
after(async function () {
expect(await videoWatchPage.getPrivacy()).toBe('Unlisted')
expect(await videoWatchPage.getLicence()).toBe('Attribution - Non Commercial')
expect(await videoWatchPage.areCommentsEnabled()).toBeFalsy()
// Owners can download their videos
expect(await videoWatchPage.isDownloadEnabled()).toBeTruthy()
// Logout to see if the download enabled is correct for anonymous users
await loginPage.logout()
await browser.url(videoUrl)
await videoWatchPage.waitWatchVideoName('video')
expect(await videoWatchPage.isDownloadEnabled()).toBeFalsy()
})
})
@ -83,4 +90,8 @@ describe('Custom server defaults', () => {
await checkP2P(false)
})
})
after(async () => {
await browser.saveScreenshot(getScreenshotPath('after-test.png'))
})
})

View file

@ -35,7 +35,7 @@ function checkEndMessage (options: {
}
{
const checkEmail = 'Check your emails'
const checkEmail = 'Check your email'
if (requiresEmailVerification) {
expect(message).toContain(checkEmail)
@ -243,8 +243,10 @@ describe('Signup', () => {
let emailPort: number
before(async () => {
const key = browser.options.baseUrl + '-emailPort'
// FIXME: typings are wrong, get returns a promise
emailPort = await (browser.sharedStore.get(browser.config.baseUrl + '-emailPort') as unknown as Promise<number>)
// FIXME: use * because the key is not properly escaped by the shared store when using get(key)
emailPort = (await (browser.sharedStore.get('*') as unknown as Promise<number>))[key]
await MockSMTPServer.Instance.collectEmails(emailPort, emails)
})

View file

@ -0,0 +1,231 @@
import { LoginPage } from '../po/login.po'
import { SignupPage } from '../po/signup.po'
import { PlayerPage } from '../po/player.po'
import { VideoUploadPage } from '../po/video-upload.po'
import { VideoWatchPage } from '../po/video-watch.po'
import { getScreenshotPath, go, isMobileDevice, isSafari, waitServerUp } from '../utils'
import { MyAccountPage } from '../po/my-account.po'
describe('Password protected videos', () => {
let videoUploadPage: VideoUploadPage
let loginPage: LoginPage
let videoWatchPage: VideoWatchPage
let signupPage: SignupPage
let playerPage: PlayerPage
let myAccountPage: MyAccountPage
let passwordProtectedVideoUrl: string
let playlistUrl: string
const seed = Math.random()
const passwordProtectedVideoName = seed + ' - password protected'
const publicVideoName1 = seed + ' - public 1'
const publicVideoName2 = seed + ' - public 2'
const videoPassword = 'password'
const regularUsername = 'user_1'
const regularUserPassword = 'user password'
const playlistName = seed + ' - playlist'
function testRateAndComment () {
it('Should add and remove like on video', async function () {
await videoWatchPage.like()
await videoWatchPage.like()
})
it('Should create thread on video', async function () {
await videoWatchPage.createThread('My first comment')
})
it('Should reply to thread on video', async function () {
await videoWatchPage.createReply('My first reply')
})
}
before(async () => {
await waitServerUp()
loginPage = new LoginPage(isMobileDevice())
videoUploadPage = new VideoUploadPage()
videoWatchPage = new VideoWatchPage(isMobileDevice(), isSafari())
signupPage = new SignupPage()
playerPage = new PlayerPage()
myAccountPage = new MyAccountPage()
await browser.maximizeWindow()
})
describe('Owner', function () {
before(async () => {
await loginPage.loginAsRootUser()
})
it('Should login, upload a public video and save it to a playlist', async () => {
await videoUploadPage.navigateTo()
await videoUploadPage.uploadVideo('video.mp4')
await videoUploadPage.validSecondUploadStep(publicVideoName1)
await videoWatchPage.clickOnSave()
await videoWatchPage.createPlaylist(playlistName)
await videoWatchPage.saveToPlaylist(playlistName)
await browser.pause(5000)
})
it('Should upload a password protected video', async () => {
await videoUploadPage.navigateTo()
await videoUploadPage.uploadVideo('video2.mp4')
await videoUploadPage.setAsPasswordProtected(videoPassword)
await videoUploadPage.validSecondUploadStep(passwordProtectedVideoName)
await videoWatchPage.waitWatchVideoName(passwordProtectedVideoName)
passwordProtectedVideoUrl = await browser.getUrl()
})
it('Should save to playlist the password protected video', async () => {
await videoWatchPage.clickOnSave()
await videoWatchPage.saveToPlaylist(playlistName)
})
it('Should upload a second public video and save it to playlist', async () => {
await videoUploadPage.navigateTo()
await videoUploadPage.uploadVideo('video3.mp4')
await videoUploadPage.validSecondUploadStep(publicVideoName2)
await videoWatchPage.clickOnSave()
await videoWatchPage.saveToPlaylist(playlistName)
})
it('Should play video without password', async function () {
await go(passwordProtectedVideoUrl)
expect(!await videoWatchPage.isPasswordProtected())
await videoWatchPage.waitWatchVideoName(passwordProtectedVideoName)
expect(await videoWatchPage.getPrivacy()).toBe('Password protected')
await playerPage.playAndPauseVideo(false, 2)
})
testRateAndComment()
it('Should play video on embed without password', async function () {
await videoWatchPage.goOnAssociatedEmbed()
await playerPage.playAndPauseVideo(false, 2)
})
it('Should have the playlist in my account', async function () {
await go('/')
await myAccountPage.navigateToMyPlaylists()
const videosNumberText = await myAccountPage.getPlaylistVideosText(playlistName)
expect(videosNumberText).toEqual('3 videos')
await myAccountPage.clickOnPlaylist(playlistName)
const count = await myAccountPage.countTotalPlaylistElements()
expect(count).toEqual(3)
})
it('Should update the playlist to public', async () => {
const url = await browser.getUrl()
const regex = /\/my-library\/video-playlists\/([^/]+)/i
const match = url.match(regex)
const uuid = match ? match[1] : null
expect(uuid).not.toBeNull()
await myAccountPage.updatePlaylistPrivacy(uuid, 'Public')
})
it('Should watch the playlist', async () => {
await myAccountPage.clickOnPlaylist(playlistName)
await myAccountPage.playPlaylist()
playlistUrl = await browser.getUrl()
await videoWatchPage.waitUntilVideoName(publicVideoName1, 40 * 1000)
await videoWatchPage.waitUntilVideoName(passwordProtectedVideoName, 40 * 1000)
await videoWatchPage.waitUntilVideoName(publicVideoName2, 40 * 1000)
})
after(async () => {
await loginPage.logout()
})
})
describe('Regular users', function () {
before(async () => {
await signupPage.fullSignup({
accountInfo: {
username: regularUsername,
password: regularUserPassword
},
channelInfo: {
name: 'user_1_channel'
}
})
})
it('Should requires password to play video', async function () {
await go(passwordProtectedVideoUrl)
expect(await videoWatchPage.isPasswordProtected())
await videoWatchPage.fillVideoPassword(videoPassword)
await videoWatchPage.waitWatchVideoName(passwordProtectedVideoName)
expect(await videoWatchPage.getPrivacy()).toBe('Password protected')
await playerPage.playAndPauseVideo(true, 2)
})
testRateAndComment()
it('Should requires password to play video on embed', async function () {
await videoWatchPage.goOnAssociatedEmbed(true)
await playerPage.fillEmbedVideoPassword(videoPassword)
await playerPage.playAndPauseVideo(false, 2)
})
it('Should watch the playlist without password protected video', async () => {
await go(playlistUrl)
await playerPage.playVideo()
await videoWatchPage.waitUntilVideoName(publicVideoName2, 40 * 1000)
})
after(async () => {
await loginPage.logout()
})
})
describe('Anonymous users', function () {
it('Should requires password to play video', async function () {
await go(passwordProtectedVideoUrl)
expect(await videoWatchPage.isPasswordProtected())
await videoWatchPage.fillVideoPassword(videoPassword)
await videoWatchPage.waitWatchVideoName(passwordProtectedVideoName)
expect(await videoWatchPage.getPrivacy()).toBe('Password protected')
await playerPage.playAndPauseVideo(true, 2)
})
it('Should requires password to play video on embed', async function () {
await videoWatchPage.goOnAssociatedEmbed(true)
await playerPage.fillEmbedVideoPassword(videoPassword)
await playerPage.playAndPauseVideo(false, 2)
})
it('Should watch the playlist without password protected video', async () => {
await go(playlistUrl)
await playerPage.playVideo()
await videoWatchPage.waitUntilVideoName(publicVideoName2, 40 * 1000)
})
})
after(async () => {
await browser.saveScreenshot(getScreenshotPath('after-test.png'))
})
})

View file

@ -51,15 +51,15 @@ describe('Videos list', () => {
async function checkCommonVideoListPages (policy: NSFWPolicy) {
const promisesWithFilters = [
videoListPage.goOnRootAccount,
videoListPage.goOnLocal,
videoListPage.goOnRecentlyAdded,
videoListPage.goOnTrending,
videoListPage.goOnRootChannel
videoListPage.goOnRootAccount.bind(videoListPage),
videoListPage.goOnLocal.bind(videoListPage),
videoListPage.goOnRecentlyAdded.bind(videoListPage),
videoListPage.goOnTrending.bind(videoListPage),
videoListPage.goOnRootChannel.bind(videoListPage)
]
for (const p of promisesWithFilters) {
await p.call(videoListPage)
await p()
const filter = await videoListPage.getNSFWFilter()
const filterText = await filter.getText()
@ -69,11 +69,11 @@ describe('Videos list', () => {
}
const promisesWithoutFilters = [
videoListPage.goOnRootAccountChannels,
videoListPage.goOnHomepage
videoListPage.goOnRootAccountChannels.bind(videoListPage),
videoListPage.goOnHomepage.bind(videoListPage)
]
for (const p of promisesWithoutFilters) {
await p.call(videoListPage)
await p()
await checkNormalVideo()
await checkNSFWVideo(policy)

View file

@ -8,6 +8,12 @@ function isMobileDevice () {
return platformName === 'android' || platformName === 'ios'
}
function isAndroid () {
const platformName = (browser.capabilities['platformName'] || '').toLowerCase()
return platformName === 'android'
}
function isSafari () {
return browser.capabilities['browserName'] &&
browser.capabilities['browserName'].toLowerCase() === 'safari'
@ -20,7 +26,6 @@ function isIOS () {
async function go (url: string) {
await browser.url(url)
// Hide notifications that could fail tests when hiding buttons
await browser.execute(() => {
const style = document.createElement('style')
style.innerHTML = 'p-toast { display: none }'
@ -41,6 +46,7 @@ export {
isMobileDevice,
isSafari,
isIOS,
isAndroid,
waitServerUp,
go,
browserSleep

View file

@ -66,7 +66,7 @@ function buildConfig (suiteFile: string = undefined) {
publish: {
download_enabled: false,
comments_enabled: false,
privacy: 4,
privacy: 2,
licence: 4
},
p2p: {
@ -93,5 +93,14 @@ function buildConfig (suiteFile: string = undefined) {
}
}
if (filename === 'video-password.e2e-spec.ts') {
return {
signup: {
enabled: true,
limit: -1
}
}
}
return {}
}

View file

@ -24,8 +24,6 @@ class MockSMTPServer {
this.maildev.on('new', email => {
this.emails.push(email)
console.log('pushed email', email)
})
this.maildev.listen(err => {

View file

@ -3,6 +3,8 @@ import { join, resolve } from 'path'
function runServer (appInstance: number, config: any = {}) {
const env = Object.create(process.env)
env['NODE_OPTIONS'] = ''
env['NODE_ENV'] = 'test'
env['NODE_APP_INSTANCE'] = appInstance + ''
@ -43,7 +45,10 @@ function runServer (appInstance: number, config: any = {}) {
function runCommand (command: string) {
return new Promise<void>((res, rej) => {
const p = exec(command, { cwd: getRootCWD() })
// Reset NODE_OPTIONS env set by webdriverio
const env = { ...process.env, NODE_OPTIONS: '' }
const p = exec(command, { env, cwd: getRootCWD() })
p.stderr.on('data', data => console.error(data.toString()))
p.on('error', err => rej(err))

View file

@ -1,14 +1,14 @@
const FIXTURE_URLS = {
INTERNAL_WEBTORRENT_VIDEO: 'https://peertube2.cpy.re/w/pwfz7NizSdPD4mJcbbmNwa?mode=webtorrent&start=0',
INTERNAL_WEB_VIDEO: 'https://peertube2.cpy.re/w/pwfz7NizSdPD4mJcbbmNwa?mode=web-video&start=0',
INTERNAL_HLS_VIDEO: 'https://peertube2.cpy.re/w/pwfz7NizSdPD4mJcbbmNwa?start=0',
INTERNAL_EMBED_WEBTORRENT_VIDEO: 'https://peertube2.cpy.re/videos/embed/pwfz7NizSdPD4mJcbbmNwa?mode=webtorrent&start=0',
INTERNAL_EMBED_WEB_VIDEO: 'https://peertube2.cpy.re/videos/embed/pwfz7NizSdPD4mJcbbmNwa?mode=web-video&start=0',
INTERNAL_EMBED_HLS_VIDEO: 'https://peertube2.cpy.re/videos/embed/pwfz7NizSdPD4mJcbbmNwa?start=0',
INTERNAL_HLS_ONLY_VIDEO: 'https://peertube2.cpy.re/w/tKQmHcqdYZRdCszLUiWM3V?start=0',
INTERNAL_EMBED_HLS_ONLY_VIDEO: 'https://peertube2.cpy.re/videos/embed/tKQmHcqdYZRdCszLUiWM3V?start=0',
WEBTORRENT_VIDEO: 'https://peertube2.cpy.re/w/122d093a-1ede-43bd-bd34-59d2931ffc5e',
WEB_VIDEO: 'https://peertube2.cpy.re/w/122d093a-1ede-43bd-bd34-59d2931ffc5e',
HLS_EMBED: 'https://peertube2.cpy.re/videos/embed/969bf103-7818-43b5-94a0-de159e13de50',
HLS_PLAYLIST_EMBED: 'https://peertube2.cpy.re/video-playlists/embed/73804a40-da9a-40c2-b1eb-2c6d9eec8f0a',

View file

@ -6,9 +6,13 @@
"esModuleInterop": true,
"module": "commonjs",
"target": "es5",
"typeRoots": [
"../node_modules/@types",
"../node_modules"
],
"types": [
"node",
"webdriverio/async",
"@wdio/globals/types",
"@wdio/mocha-framework",
"expect-webdriverio"
]

View file

@ -10,25 +10,39 @@ if (!key) throw new Error('Miss browser stack key')
function buildMainOptions (sessionName: string) {
return {
projectName: 'PeerTube',
buildName: 'Main E2E - ' + new Date().toISOString().split('T')[0],
buildName: 'Main E2E - ' + new Date().toISOString(),
sessionName,
consoleLogs: 'info',
networkLogs: true
}
}
function buildBStackDesktopOptions (sessionName: string, resolution: string, os?: string) {
function buildBStackDesktopOptions (options: {
sessionName: string
resolution: string
os?: string
osVersion?: string
}) {
const { sessionName, resolution, os, osVersion } = options
return {
'bstack:options': {
...buildMainOptions(sessionName),
os,
osVersion,
resolution
}
}
}
function buildBStackMobileOptions (sessionName: string, deviceName: string, osVersion: string) {
function buildBStackMobileOptions (options: {
sessionName: string
deviceName: string
osVersion: string
}) {
const { sessionName, deviceName, osVersion } = options
return {
'bstack:options': {
...buildMainOptions(sessionName),
@ -53,45 +67,45 @@ module.exports = {
{
browserName: 'Chrome',
...buildBStackDesktopOptions('Latest Chrome Desktop', '1280x1024')
...buildBStackDesktopOptions({ sessionName: 'Latest Chrome Desktop', resolution: '1280x1024', os: 'Windows', osVersion: '8' })
},
{
browserName: 'Firefox',
browserVersion: '78', // Very old ESR
...buildBStackDesktopOptions('Firefox ESR Desktop', '1280x1024', 'Windows')
...buildBStackDesktopOptions({ sessionName: 'Firefox ESR Desktop', resolution: '1280x1024', os: 'Windows', osVersion: '8' })
},
{
browserName: 'Safari',
browserVersion: '12.1',
...buildBStackDesktopOptions('Safari Desktop', '1280x1024')
...buildBStackDesktopOptions({ sessionName: 'Safari Desktop', resolution: '1280x1024' })
},
{
browserName: 'Firefox',
...buildBStackDesktopOptions('Firefox Latest', '1280x1024')
...buildBStackDesktopOptions({ sessionName: 'Firefox Latest', resolution: '1280x1024', os: 'Windows', osVersion: '8' })
},
{
browserName: 'Edge',
...buildBStackDesktopOptions('Edge Latest', '1280x1024')
...buildBStackDesktopOptions({ sessionName: 'Edge Latest', resolution: '1280x1024' })
},
{
browserName: 'Chrome',
...buildBStackMobileOptions('Latest Chrome Android', 'Samsung Galaxy S8', '7.0')
...buildBStackMobileOptions({ sessionName: 'Latest Chrome Android', deviceName: 'Samsung Galaxy S8', osVersion: '7.0' })
},
{
browserName: 'Safari',
...buildBStackMobileOptions('Safari iPhone', 'iPhone 8 Plus', '12.4')
...buildBStackMobileOptions({ sessionName: 'Safari iPhone', deviceName: 'iPhone 8', osVersion: '13' })
},
{
browserName: 'Safari',
...buildBStackMobileOptions('Safari iPad', 'iPad 7th', '13')
...buildBStackMobileOptions({ sessionName: 'Safari iPad', deviceName: 'iPad 7th', osVersion: '13' })
}
],

View file

@ -25,15 +25,15 @@ module.exports = {
capabilities: [
{
browserName: 'chrome',
acceptInsecureCerts: true,
'browserName': 'chrome',
'acceptInsecureCerts': true,
'goog:chromeOptions': {
args: [ '--disable-gpu', windowSizeArg ],
args: [ '--headless', '--disable-gpu', windowSizeArg ],
prefs
}
},
{
browserName: 'firefox',
'browserName': 'firefox',
'moz:firefoxOptions': {
binary: '/usr/bin/firefox-developer-edition',
args: [ '--headless', windowSizeArg ],
@ -43,7 +43,7 @@ module.exports = {
}
],
services: [ 'chromedriver', 'geckodriver', 'shared-store' ],
services: [ 'shared-store' ],
beforeSession: beforeLocalSession,
beforeSuite: beforeLocalSuite,

View file

@ -20,14 +20,15 @@ module.exports = {
capabilities: [
{
browserName: 'chrome',
'browserName': 'chrome',
'goog:chromeOptions': {
binary: '/usr/bin/google-chrome-stable',
args: [ '--headless', '--disable-gpu', windowSizeArg ],
prefs
}
},
{
browserName: 'firefox',
'browserName': 'firefox',
'moz:firefoxOptions': {
binary: '/usr/bin/firefox-developer-edition',
args: [ '--headless', windowSizeArg ],
@ -37,7 +38,7 @@ module.exports = {
}
],
services: [ 'chromedriver', 'geckodriver', 'shared-store' ],
services: [ 'shared-store' ],
beforeSession: beforeLocalSession,
beforeSuite: beforeLocalSuite,

View file

@ -59,7 +59,7 @@ export const config = {
// with `/`, the base url gets prepended, not including the path portion of your baseUrl.
// If your `url` parameter starts without a scheme or `/` (like `some/path`), the base url
// gets prepended directly.
baseUrl: 'http://localhost:9001',
baseUrl: 'http://127.0.0.1:9001',
//
// Default timeout for all waitFor* commands.
waitforTimeout: 5000,
@ -80,7 +80,7 @@ export const config = {
framework: 'mocha',
//
// The number of times to retry the entire specfile when it fails as a whole
specFileRetries: 1,
specFileRetries: 2,
//
// Delay in seconds between the spec file retry attempts
// specFileRetriesDelay: 0,
@ -107,19 +107,10 @@ export const config = {
tsNodeOpts: {
project: require('path').join(__dirname, './tsconfig.json')
},
tsConfigPathsOpts: {
baseUrl: './',
paths: {
'@server/*': [ '../../server/*' ],
'@shared/*': [ '../../shared/*' ]
}
}
},
before: function () {
require('expect-webdriverio')
require('./src/commands/upload')
}
} as Partial<WebdriverIO.Config>

View file

@ -1,6 +1,6 @@
{
"name": "peertube-client",
"version": "5.1.0",
"version": "6.1.0",
"private": true,
"license": "AGPL-3.0",
"author": {
@ -14,7 +14,7 @@
},
"scripts": {
"lint": "npm run lint-ts && npm run lint-scss",
"lint-ts": "eslint --ext .ts src/standalone/**/*.ts && npm run ng lint",
"lint-ts": "eslint --cache --ext .ts src/standalone/**/*.ts && npm run ng lint",
"lint-scss": "stylelint 'src/**/*.scss'",
"webpack": "webpack",
"eslint": "eslint",
@ -24,37 +24,44 @@
"ngx-extractor": "ngx-extractor",
"stylelint": "stylelint"
},
"workspaces": [
"../packages/*"
],
"typings": "*.d.ts",
"devDependencies": {
"@angular-devkit/build-angular": "^15.1.6",
"@angular-eslint/builder": "^15.2.1",
"@angular-eslint/eslint-plugin": "^15.2.1",
"@angular-eslint/eslint-plugin-template": "^15.2.1",
"@angular-eslint/schematics": "^15.2.1",
"@angular-eslint/template-parser": "^15.2.1",
"@angular/animations": "^15.1.5",
"@angular/cdk": "^15.1.4",
"@angular/cli": "^15.1.6",
"@angular/common": "^15.1.5",
"@angular/compiler": "^15.1.5",
"@angular/compiler-cli": "^15.1.5",
"@angular/core": "^15.1.5",
"@angular/forms": "^15.1.5",
"@angular/localize": "^15.1.5",
"@angular/platform-browser": "^15.1.5",
"@angular/platform-browser-dynamic": "^15.1.5",
"@angular/router": "^15.1.5",
"@angular/service-worker": "^15.1.5",
"@angular-devkit/build-angular": "^17.0.9",
"@angular-eslint/builder": "^17.1.1",
"@angular-eslint/eslint-plugin": "^17.1.1",
"@angular-eslint/eslint-plugin-template": "^17.1.1",
"@angular-eslint/schematics": "^17.1.1",
"@angular-eslint/template-parser": "^17.1.1",
"@angular/animations": "^17.0.8",
"@angular/cdk": "^17.0.4",
"@angular/cli": "^17.0.9",
"@angular/common": "^17.0.8",
"@angular/compiler": "^17.0.8",
"@angular/compiler-cli": "^17.0.8",
"@angular/core": "^17.0.8",
"@angular/forms": "^17.0.8",
"@angular/localize": "^17.0.8",
"@angular/platform-browser": "^17.0.8",
"@angular/platform-browser-dynamic": "^17.0.8",
"@angular/router": "^17.0.8",
"@angular/service-worker": "^17.0.8",
"@babel/core": "^7.18.5",
"@babel/preset-env": "^7.18.2",
"@ng-bootstrap/ng-bootstrap": "^14.0.1",
"@ng-select/ng-select": "^10.0.3",
"@formatjs/intl-locale": "^3.3.1",
"@formatjs/intl-pluralrules": "^5.2.2",
"@ng-bootstrap/ng-bootstrap": "^16.0.0",
"@ng-select/ng-select": "^12.0.4",
"@ngx-loading-bar/core": "^6.0.0",
"@ngx-loading-bar/http-client": "^6.0.0",
"@ngx-loading-bar/router": "^6.0.0",
"@peertube/maildev": "^1.2.0",
"@peertube/p2p-media-loader-core": "^1.0.14",
"@peertube/p2p-media-loader-hlsjs": "^1.0.14",
"@peertube/p2p-media-loader-core": "^1.0.15",
"@peertube/p2p-media-loader-hlsjs": "^1.0.15",
"@peertube/peertube-core-utils": "*",
"@peertube/peertube-models": "*",
"@peertube/videojs-contextmenu": "^5.5.0",
"@peertube/xliffmerge": "^2.0.3",
"@popperjs/core": "^2.11.5",
@ -64,83 +71,69 @@
"@types/jschannel": "^1.0.0",
"@types/linkifyjs": "^2.1.2",
"@types/lodash-es": "^4.17.0",
"@types/markdown-it": "^12.0.1",
"@types/markdown-it": "^13.0.2",
"@types/node": "^18.13.0",
"@types/sanitize-html": "2.6.2",
"@types/qrcode": "^1.5.5",
"@types/sanitize-html": "2.11.0",
"@types/sha.js": "^2.4.0",
"@types/video.js": "^7.3.40",
"@types/webtorrent": "^0.109.0",
"@typescript-eslint/eslint-plugin": "^5.43.0",
"@typescript-eslint/parser": "^5.43.0",
"@wdio/browserstack-service": "^7.25.2",
"@wdio/cli": "^7.25.2",
"@wdio/local-runner": "^7.25.2",
"@wdio/mocha-framework": "^7.25.2",
"@wdio/shared-store-service": "^7.25.2",
"@wdio/spec-reporter": "^7.25.1",
"angular2-hotkeys": "^13.1.0",
"angularx-qrcode": "15.0.1",
"@typescript-eslint/eslint-plugin": "^7.0.2",
"@typescript-eslint/parser": "^7.0.2",
"@wdio/browserstack-service": "^8.10.5",
"@wdio/cli": "^8.10.5",
"@wdio/local-runner": "^8.10.5",
"@wdio/mocha-framework": "^8.10.4",
"@wdio/shared-store-service": "^8.10.5",
"@wdio/spec-reporter": "^8.10.5",
"angularx-qrcode": "17.0.0",
"babel-loader": "^9.1.0",
"bootstrap": "^5.1.3",
"buffer": "^6.0.3",
"cache-chunk-store": "^3.0.0",
"chart.js": "^3.8.0",
"chartjs-plugin-zoom": "~1.2.1",
"chromedriver": "^110.0.0",
"chart.js": "^4.3.0",
"chartjs-plugin-zoom": "~2.0.1",
"core-js": "^3.22.8",
"css-loader": "^6.2.0",
"debug": "^4.3.1",
"dexie": "^3.2.2",
"eslint": "^8.28.0",
"eslint-plugin-import": "2.27.5",
"eslint-plugin-jsdoc": "^40.0.0",
"eslint-plugin-import": "2.29.1",
"eslint-plugin-jsdoc": "^48.1.0",
"eslint-plugin-prefer-arrow": "latest",
"expect-webdriverio": "^3.4.0",
"expect-webdriverio": "^4.2.3",
"focus-visible": "^5.0.2",
"geckodriver": "^3.2.0",
"hls.js": "1.3.3",
"html-loader": "^4.1.0",
"hls.js": "~1.3",
"html-loader": "^5.0.0",
"html-webpack-plugin": "^5.3.1",
"https-browserify": "^1.0.0",
"intl-messageformat": "^10.1.0",
"jschannel": "^1.0.2",
"linkify-html": "^4.0.2",
"linkifyjs": "^4.0.2",
"lodash-es": "^4.17.4",
"markdown-it": "13.0.1",
"markdown-it": "14.0.0",
"markdown-it-emoji": "^3.0.0",
"mini-css-extract-plugin": "^2.2.0",
"ngx-uploadx": "^5.1.0",
"ngx-uploadx": "^6.1.0",
"path-browserify": "^1.0.0",
"postcss": "^8.4.14",
"primeng": "^15.2.0",
"process": "^0.11.10",
"purify-css": "^1.2.5",
"querystring": "^0.2.1",
"primeng": "^17.3.1",
"raw-loader": "^4.0.2",
"rxjs": "^7.3.0",
"sanitize-html": "^2.1.2",
"sass": "^1.58.1",
"sass-loader": "^13.2.0",
"sass-loader": "^14.1.1",
"sha.js": "^2.4.11",
"socket.io-client": "^4.5.4",
"stream-browserify": "^3.0.0",
"stream-http": "^3.0.0",
"stylelint": "^15.1.0",
"stylelint-config-sass-guidelines": "^9.0.1",
"stylelint": "^16.2.1",
"stylelint-config-sass-guidelines": "^11.0.0",
"tinykeys": "^2.1.0",
"ts-loader": "^9.3.0",
"ts-node": "^10.9.1",
"tslib": "^2.4.0",
"typescript": "~4.9.5",
"url": "^0.11.0",
"typescript": "~5.2",
"video.js": "^7.19.2",
"videostream": "~3.2.1",
"wdio-chromedriver-service": "^7.3.2",
"wdio-geckodriver-service": "^3.0.2",
"webpack": "^5.73.0",
"webpack-bundle-analyzer": "^4.4.2",
"webpack-cli": "^5.0.1",
"webtorrent": "1.8.26",
"whatwg-fetch": "^3.0.0",
"zone.js": "~0.12.0"
"zone.js": "~0.14.2"
},
"dependencies": {}
}

View file

@ -1,28 +1,30 @@
<div class="row">
<h1 class="visually-hidden" i18n>Follows</h1>
<div class="margin-content mt-4">
<div class="row">
<h1 class="visually-hidden" i18n>Follows</h1>
<div class="col-xl-6 col-md-12">
<h2 i18n class="fs-5-5 mb-4 fw-semibold">Followers of {{ instanceName }} ({{ followersPagination.totalItems }})</h2>
<div class="col-xl-6 col-md-12">
<h2 i18n class="fs-5-5 mb-4 fw-semibold">Followers of {{ instanceName }} ({{ followersPagination.totalItems }})</h2>
<div i18n class="no-results" *ngIf="followersPagination.totalItems === 0">{{ instanceName }} does not have followers.</div>
<div i18n class="no-results" *ngIf="followersPagination.totalItems === 0">{{ instanceName }} does not have followers.</div>
<a *ngFor="let follower of followers" [href]="buildLink(follower)" target="_blank" rel="noopener noreferrer">
{{ follower }}
</a>
<a *ngFor="let follower of followers" [href]="follower.url" target="_blank" rel="noopener noreferrer">
{{ follower.name }}
</a>
<button i18n class="peertube-button-link grey-button mt-1" *ngIf="!loadedAllFollowers && canLoadMoreFollowers()" (click)="loadAllFollowers()">Show full list</button>
</div>
<div class="col-xl-6 col-md-12">
<h2 i18n class="fs-5-5 mb-4 fw-semibold">Subscriptions of {{ instanceName }} ({{ followingsPagination.totalItems }})</h2>
<div i18n class="no-results" *ngIf="followingsPagination.totalItems === 0">{{ instanceName }} does not have subscriptions.</div>
<a *ngFor="let following of followings" [href]="following.url" target="_blank" rel="noopener noreferrer">
{{ following.name }}
</a>
<button i18n class="peertube-button-link grey-button mt-1" *ngIf="!loadedAllFollowings && canLoadMoreFollowings()" (click)="loadAllFollowings()">Show full list</button>
</div>
<button i18n class="peertube-button-link grey-button mt-1" *ngIf="!loadedAllFollowers && canLoadMoreFollowers()" (click)="loadAllFollowers()">Show full list</button>
</div>
<div class="col-xl-6 col-md-12">
<h2 i18n class="fs-5-5 mb-4 fw-semibold">Subscriptions of {{ instanceName }} ({{ followingsPagination.totalItems }})</h2>
<div i18n class="no-results" *ngIf="followingsPagination.totalItems === 0">{{ instanceName }} does not have subscriptions.</div>
<a *ngFor="let following of followings" [href]="buildLink(following)" target="_blank" rel="noopener noreferrer">
{{ following }}
</a>
<button i18n class="peertube-button-link grey-button mt-1" *ngIf="!loadedAllFollowings && canLoadMoreFollowings()" (click)="loadAllFollowings()">Show full list</button>
</div>
</div>

View file

@ -1,20 +1,23 @@
import { SortMeta } from 'primeng/api'
import { Component, OnInit } from '@angular/core'
import { ComponentPagination, hasMoreItems, Notifier, RestService, ServerService } from '@app/core'
import { InstanceFollowService } from '@app/shared/shared-instance'
import { Actor } from '@shared/models/actors'
import { Actor } from '@peertube/peertube-models'
import { NgIf, NgFor } from '@angular/common'
import { InstanceFollowService } from '@app/shared/shared-instance/instance-follow.service'
@Component({
selector: 'my-about-follows',
templateUrl: './about-follows.component.html',
styleUrls: [ './about-follows.component.scss' ]
styleUrls: [ './about-follows.component.scss' ],
standalone: true,
imports: [ NgIf, NgFor ]
})
export class AboutFollowsComponent implements OnInit {
instanceName: string
followers: string[] = []
followings: string[] = []
followers: { name: string, url: string }[] = []
followings: { name: string, url: string }[] = []
loadedAllFollowers = false
loadedAllFollowings = false
@ -130,10 +133,13 @@ export class AboutFollowsComponent implements OnInit {
}
private formatFollow (actor: Actor) {
// Instance follow, only display host
if (actor.name === 'peertube') return actor.host
return {
// Instance follow, only display host
name: actor.name === 'peertube'
? actor.host
: actor.name + '@' + actor.host,
return actor.name + '@' + actor.host
url: actor.url
}
}
}

View file

@ -1,226 +1,232 @@
<div class="row">
<div class="col-md-12 col-xl-6">
<div class="banner" *ngIf="instanceBannerUrl">
<img [src]="instanceBannerUrl" alt="Instance banner">
</div>
<div class="d-flex justify-content-between">
<h1 i18n class="fw-semibold fs-5">About {{ instanceName }}</h1>
<div class="margin-content mt-4">
<div class="row ">
<div class="col-md-12 col-xl-6">
<a routerLink="/about/contact" i18n *ngIf="isContactFormEnabled" class="peertube-button-link orange-button h-100 d-flex align-items-center">Contact us</a>
</div>
<div class="d-flex justify-content-between">
<h1 i18n class="fw-semibold fs-5">About {{ instanceName }}</h1>
<div class="mb-4" *ngIf="categories.length !== 0 || languages.length !== 0">
<span *ngFor="let category of categories" class="pt-badge badge-primary">{{ category }}</span>
<a routerLink="/about/contact" i18n *ngIf="isContactFormEnabled" class="peertube-button-link orange-button h-100 d-flex align-items-center">Contact us</a>
</div>
<span *ngFor="let language of languages" class="pt-badge badge-secondary">{{ language }}</span>
</div>
<div class="mb-4" *ngIf="categories.length !== 0 || languages.length !== 0">
<span *ngFor="let category of categories" class="pt-badge badge-primary">{{ category }}</span>
<div class="mt-2">
<div class="block">{{ shortDescription }}</div>
<span *ngFor="let language of languages" class="pt-badge badge-secondary">{{ language }}</span>
</div>
<div i18n *ngIf="isNSFW" class="block mt-4 fw-semibold">This instance is dedicated to sensitive/NSFW content.</div>
</div>
<div class="mt-2">
<div class="block">{{ shortDescription }}</div>
<div class="anchor" id="administrators-and-sustainability"></div>
<a
*ngIf="aboutHTML.administrator || aboutHTML.maintenanceLifetime || aboutHTML.businessModel"
class="anchor-link"
routerLink="/about/instance"
fragment="administrators-and-sustainability"
#anchorLink
(click)="onClickCopyLink(anchorLink)"
>
<h2 i18n class="middle-title">
ADMINISTRATORS & SUSTAINABILITY
</h2>
</a>
<div i18n *ngIf="isNSFW" class="block mt-4 fw-semibold">This instance is dedicated to sensitive/NSFW content.</div>
</div>
<div class="block administrator" *ngIf="aboutHTML.administrator">
<div class="anchor" id="administrators"></div>
<div class="anchor" id="administrators-and-sustainability"></div>
<a
*ngIf="aboutHTML.administrator || aboutHTML.maintenanceLifetime || aboutHTML.businessModel"
class="anchor-link"
routerLink="/about/instance"
fragment="administrators"
fragment="administrators-and-sustainability"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Who we are</h3>
</a>
<div [innerHTML]="aboutHTML.administrator"></div>
</div>
<div class="block creation-reason" *ngIf="aboutHTML.creationReason">
<div class="anchor" id="creation-reason"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="creation-reason"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Why we created this instance</h3>
</a>
<div [innerHTML]="aboutHTML.creationReason"></div>
</div>
<div class="block maintenance-lifetime" *ngIf="aboutHTML.maintenanceLifetime">
<div class="anchor" id="maintenance-lifetime"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="maintenance-lifetime"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">How long we plan to maintain this instance</h3>
</a>
<div [innerHTML]="aboutHTML.maintenanceLifetime"></div>
</div>
<div class="block business-model" *ngIf="aboutHTML.businessModel">
<div class="anchor" id="business-model"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="business-model"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">How we will pay for keeping our instance running</h3>
</a>
<div [innerHTML]="aboutHTML.businessModel"></div>
</div>
<div class="anchor" id="information"></div>
<a
*ngIf="descriptionElement"
class="anchor-link"
routerLink="/about/instance"
fragment="information"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h2 i18n class="middle-title">
INFORMATION
</h2>
</a>
<div class="block description">
<div class="anchor" id="description"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="description"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Description</h3>
</a>
<my-custom-markup-container [content]="descriptionElement"></my-custom-markup-container>
</div>
<div myPluginSelector pluginSelectorId="about-instance-moderation">
<div class="anchor" id="moderation"></div>
<a
*ngIf="aboutHTML.moderationInformation || aboutHTML.codeOfConduct || aboutHTML.terms"
class="anchor-link"
routerLink="/about/instance"
fragment="moderation"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
(click)="onClickCopyLink(anchorLink)"
>
<h2 i18n class="middle-title">
MODERATION
ADMINISTRATORS & SUSTAINABILITY
</h2>
</a>
<div class="block moderation-information" *ngIf="aboutHTML.moderationInformation">
<div class="anchor" id="moderation-information"></div>
<div class="block administrator" *ngIf="aboutHTML.administrator">
<div class="anchor" id="administrators"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="moderation-information"
fragment="administrators"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Moderation information</h3>
<h3 i18n class="section-title">Who we are</h3>
</a>
<div [innerHTML]="aboutHTML.moderationInformation"></div>
<div [innerHTML]="aboutHTML.administrator"></div>
</div>
<div class="block code-of-conduct" *ngIf="aboutHTML.codeOfConduct">
<div class="anchor" id="code-of-conduct"></div>
<div class="block creation-reason" *ngIf="aboutHTML.creationReason">
<div class="anchor" id="creation-reason"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="code-of-conduct"
fragment="creation-reason"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Code of conduct</h3>
<h3 i18n class="section-title">Why we created this instance</h3>
</a>
<div [innerHTML]="aboutHTML.codeOfConduct"></div>
<div [innerHTML]="aboutHTML.creationReason"></div>
</div>
<div class="block terms">
<div class="anchor" id="terms"></div>
<div class="block maintenance-lifetime" *ngIf="aboutHTML.maintenanceLifetime">
<div class="anchor" id="maintenance-lifetime"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="terms"
fragment="maintenance-lifetime"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Terms</h3>
<h3 i18n class="section-title">How long we plan to maintain this instance</h3>
</a>
<div [innerHTML]="aboutHTML.terms"></div>
<div [innerHTML]="aboutHTML.maintenanceLifetime"></div>
</div>
</div>
<div myPluginSelector pluginSelectorId="about-instance-other-information">
<div class="anchor" id="other-information"></div>
<div class="block business-model" *ngIf="aboutHTML.businessModel">
<div class="anchor" id="business-model"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="business-model"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">How we will pay for keeping our instance running</h3>
</a>
<div [innerHTML]="aboutHTML.businessModel"></div>
</div>
<div class="anchor" id="information"></div>
<a
*ngIf="aboutHTML.hardwareInformation"
*ngIf="descriptionElement"
class="anchor-link"
routerLink="/about/instance"
fragment="other-information"
fragment="information"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h2 i18n class="middle-title">
OTHER INFORMATION
INFORMATION
</h2>
</a>
<div class="block hardware-information" *ngIf="aboutHTML.hardwareInformation">
<div class="anchor" id="hardware-information"></div>
<div class="block description">
<div class="anchor" id="description"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="hardware-information"
fragment="description"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Hardware information</h3>
<h3 i18n class="section-title">Description</h3>
</a>
<div [innerHTML]="aboutHTML.hardwareInformation"></div>
<my-custom-markup-container [content]="descriptionElement"></my-custom-markup-container>
</div>
<div myPluginSelector pluginSelectorId="about-instance-moderation">
<div class="anchor" id="moderation"></div>
<a
*ngIf="aboutHTML.moderationInformation || aboutHTML.codeOfConduct || aboutHTML.terms"
class="anchor-link"
routerLink="/about/instance"
fragment="moderation"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h2 i18n class="middle-title">
MODERATION
</h2>
</a>
<div class="block moderation-information" *ngIf="aboutHTML.moderationInformation">
<div class="anchor" id="moderation-information"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="moderation-information"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Moderation information</h3>
</a>
<div [innerHTML]="aboutHTML.moderationInformation"></div>
</div>
<div class="block code-of-conduct" *ngIf="aboutHTML.codeOfConduct">
<div class="anchor" id="code-of-conduct"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="code-of-conduct"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Code of conduct</h3>
</a>
<div [innerHTML]="aboutHTML.codeOfConduct"></div>
</div>
<div class="block terms">
<div class="anchor" id="terms"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="terms"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Terms</h3>
</a>
<div [innerHTML]="aboutHTML.terms"></div>
</div>
</div>
<div myPluginSelector pluginSelectorId="about-instance-other-information">
<div class="anchor" id="other-information"></div>
<a
*ngIf="aboutHTML.hardwareInformation"
class="anchor-link"
routerLink="/about/instance"
fragment="other-information"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h2 i18n class="middle-title">
OTHER INFORMATION
</h2>
</a>
<div class="block hardware-information" *ngIf="aboutHTML.hardwareInformation">
<div class="anchor" id="hardware-information"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="hardware-information"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h3 i18n class="section-title">Hardware information</h3>
</a>
<div [innerHTML]="aboutHTML.hardwareInformation"></div>
</div>
</div>
</div>
</div>
<div class="col-md-12 col-xl-6" myPluginSelector pluginSelectorId="about-instance-features">
<h2 class="visually-hidden" i18n>FEATURES</h2>
<my-instance-features-table></my-instance-features-table>
</div>
<div class="col-md-12 col-xl-6" myPluginSelector pluginSelectorId="about-instance-features">
<h2 class="visually-hidden" i18n>FEATURES</h2>
<my-instance-features-table></my-instance-features-table>
</div>
<div class="col" myPluginSelector pluginSelectorId="about-instance-statistics">
<div class="anchor" id="statistics"></div>
<div class="col" myPluginSelector pluginSelectorId="about-instance-statistics">
<div class="anchor" id="statistics"></div>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="statistics"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h2 i18n class="middle-title">STATISTICS</h2>
</a>
<a
class="anchor-link"
routerLink="/about/instance"
fragment="statistics"
#anchorLink
(click)="onClickCopyLink(anchorLink)">
<h2 i18n class="middle-title">STATISTICS</h2>
</a>
<my-instance-statistics [serverStats]="serverStats"></my-instance-statistics>
<my-instance-statistics [serverStats]="serverStats"></my-instance-statistics>
</div>
</div>
</div>

View file

@ -1,17 +1,33 @@
import { ViewportScroller } from '@angular/common'
import { NgFor, NgIf, ViewportScroller } from '@angular/common'
import { AfterViewChecked, Component, ElementRef, OnInit, ViewChild } from '@angular/core'
import { ActivatedRoute } from '@angular/router'
import { ActivatedRoute, RouterLink } from '@angular/router'
import { Notifier, ServerService } from '@app/core'
import { AboutHTML } from '@app/shared/shared-instance'
import { AboutHTML } from '@app/shared/shared-main/instance/instance.service'
import { maxBy } from '@peertube/peertube-core-utils'
import { HTMLServerConfig, ServerStats } from '@peertube/peertube-models'
import { copyToClipboard } from '@root-helpers/utils'
import { HTMLServerConfig, ServerStats } from '@shared/models/server'
import { CustomMarkupContainerComponent } from '../../shared/shared-custom-markup/custom-markup-container.component'
import { InstanceFeaturesTableComponent } from '../../shared/shared-instance/instance-features-table.component'
import { PluginSelectorDirective } from '../../shared/shared-main/plugins/plugin-selector.directive'
import { ResolverData } from './about-instance.resolver'
import { ContactAdminModalComponent } from './contact-admin-modal.component'
import { InstanceStatisticsComponent } from './instance-statistics.component'
@Component({
selector: 'my-about-instance',
templateUrl: './about-instance.component.html',
styleUrls: [ './about-instance.component.scss' ]
styleUrls: [ './about-instance.component.scss' ],
standalone: true,
imports: [
NgIf,
RouterLink,
NgFor,
CustomMarkupContainerComponent,
PluginSelectorDirective,
InstanceFeaturesTableComponent,
InstanceStatisticsComponent,
ContactAdminModalComponent
]
})
export class AboutInstanceComponent implements OnInit, AfterViewChecked {
@ViewChild('descriptionWrapper') descriptionWrapper: ElementRef<HTMLInputElement>
@ -20,6 +36,8 @@ export class AboutInstanceComponent implements OnInit, AfterViewChecked {
aboutHTML: AboutHTML
descriptionElement: HTMLDivElement
instanceBannerUrl: string
languages: string[] = []
categories: string[] = []
shortDescription = ''
@ -64,6 +82,10 @@ export class AboutInstanceComponent implements OnInit, AfterViewChecked {
this.shortDescription = about.instance.shortDescription
this.instanceBannerUrl = about.instance.banners.length !== 0
? maxBy(about.instance.banners, 'width').path
: undefined
this.serverConfig = this.serverService.getHTMLConfig()
this.route.data.subscribe(data => {

Some files were not shown because too many files have changed in this diff Show more