-
Notifications
You must be signed in to change notification settings - Fork 22
/
index.xml
1719 lines (1719 loc) · 183 KB
/
index.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jellyfin: The Free Software Media System</title><link>https://jellyfin.org/</link><description> Jellyfin: The Free Software Media System</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Tue, 02 Aug 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://jellyfin.org/index.xml" rel="self" type="application/rss+xml"/><item><title>Android TV version 0.14</title><link>https://jellyfin.org/posts/android-tv-14/</link><pubDate>Tue, 02 Aug 2022 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/android-tv-14/</guid><description><!-- markdownlint-disable MD033 MD036 -->
<p>Introducing Quick Connect, external trailers, improved crash reporting and more.</p>
<p>I&rsquo;m excited to announce the newest version of Jellyfin for Android TV. A lot of changes made it into the app this development cycle, including some exciting new features. We fixed a bunch of issues reported by our community and welcomed some new <a href="#contributors">contributors</a> that helped out on this update. In this post I&rsquo;ll talk about our most significant changes. A complete list of all changes is available in the <a href="#changelog">changelog</a>.</p>
<p>Enjoy this update and I&rsquo;ll see you with the next one!</p>
<p>- Niels</p>
<h2 id="minimum-server-version-changed-to-108">Minimum server version changed to 10.8</h2>
<p>Server requirements changed a bit. With this release, only version 10.8 or newer is supported. By dropping support for 10.7 we were able to add new features like Quick Connect and a new crash reporting implementation. As always we advise you to use the latest version of Jellyfin to get the latest bugfixes, features and security updates.</p>
<p>Go to the <a href="https://jellyfin.org/downloads/">download</a> page or read the <a href="https://jellyfin.org/docs/general/administration/installing.html">installing</a> documentation to start updating.</p>
<h2 id="improved-login">Improved login</h2>
<p>It&rsquo;s now a lot easier to get started with Jellyfin on your television using Quick Connect. With it, you no longer need to enter a password and instead will be prompted to open Jellyfin on another device, like your phone or computer, to enter a 6 digit code. This way of authentication is an alternative to passwords while keeping your server secure.</p>
<p>Another big change in the login section of the app are the redesigned screens for adding a server or user. These screens are now easier to read and use with bigger text and a better alignment for the on-screen keyboard. Google TV users will now see the keyboard on the right side of the television screen. This makes it possible to see connections errors without closing the keyboard.</p>
<p><img src="https://jellyfin.org/images/posts/android-tv-14/login-1.png" alt="Screenshot of the new login design"></p>
<h2 id="support-for-external-trailers">Support for external trailers</h2>
<p>The newly added support for external trailers allows the playback of trailers from YouTube, Vimeo and other video services. Previously only local trailers could be played. This feature is only available when a browser or video service app is installed to open the trailer.</p>
<p>Unfortunately this feature has some limitations. Some popular apps, like YouTube, don&rsquo;t make it easy to go back to the Jellyfin app. And in some television platforms you might see an error telling you there is no app to open the trailer. If this happens you should check if the YouTube/Vimeo/other app is installed. For an optimal experience we recommend using local trailers that play inside the Jellyfin app.</p>
<h2 id="changes-to-the-live-tv-guide">Changes to the Live TV guide</h2>
<p>The Live TV guide got some long awaited fixes and design tweaks. These include, but are not limited to:</p>
<ul>
<li>Fixed the incorrect sizing of channel images in some places</li>
<li>Fixed an issue where the guide could have some sizing problems with many channels</li>
<li>Fixed the &ldquo;null&rdquo; text when information was missing in a some places</li>
<li>Fixed guide sorting not always working</li>
<li>Removed the category images causing contrast issues</li>
<li>Restyled some buttons to use theme colors</li>
<li>Restyled the filter and options popups to the same design as other parts of the app</li>
</ul>
<h2 id="improved-browsing-grid">Improved browsing grid</h2>
<p>To make it easier to see a lot of items or just a few we have added two new image sizes in the grid view: smallest and extra large. Together with this change the sizing is now based on the actual size of your device, fixing some bugs on 4K displays. This might change the size you&rsquo;re used to a bit. We also fixed some issues with the vertical layout and now consider it a stable feature!</p>
<h2 id="new-crash-reporting">New crash reporting</h2>
<p>Back in 2020 with version 0.11 we added a crash reporting utility. This function helped us fix a lot of issues with the app. The crash reporting relied on a third-party service to collect the reports. We kept tight control of who could access this data, but never liked this approach as it did use a third-party service we have no control over. In this update the crash reporting code was rewritten and now sends all reports to your own Jellyfin server. The crash reports use a new format that makes it more readable for both the user and developers and includes details to identify and fix bugs even faster.</p>
<p>Crash reporting is now turned on by default. When the app crashes it will send a report to the last server you used. On fresh installations the report is queued until connecting to a server.</p>
<h2 id="markdown-support-for-item--server-descriptions">Markdown support for item &amp; server descriptions</h2>
<p>The support for basic HTML elements in item descriptions is extended to now also support Markdown. The same HTML and Markdown support is also added to server descriptions. With this change you can easily use <strong>bold</strong>, <em>italic</em> or <del>strikethrough</del> text.</p>
<h2 id="rewrite-of-websocket-code">Rewrite of WebSocket code</h2>
<p>We&rsquo;ve seen a lot of issues with WebSockets in the past. This was partially caused by outdated code in the app. This part of the app is now rewritten to use an up-to-date library via our own SDK. In our testing the connections are more stable and it allows us to add more code that relies on this connection in the future, like instant updates of items on the home screen and SyncPlay.</p>
<p>Visit our <a href="https://jellyfin.org/docs/general/networking/index.html">networking</a> documentation if you&rsquo;re using a reverse proxy and still have connection issues.</p>
<h2 id="contributors">Contributors</h2>
<p>Jellyfin apps are developed by our great contributors and we couldn&rsquo;t do it without them. Everyone is a volunteer that doesn&rsquo;t get paid by any organizations, so consider donating if you appreciate their work. A big shout-out to all contributors that made this release possible:</p>
<p><strong>Jellyfin Team</strong></p>
<ul>
<li><a href="https://github.com/nielsvanvelzen">@nielsvanvelzen</a> - Sponsor via <a href="https://github.com/sponsors/nielsvanvelzen">GitHub sponsors</a></li>
<li><a href="https://github.com/thornbill">@thornbill</a> - Sponsor via <a href="https://github.com/sponsors/thornbill">GitHub sponsors</a></li>
<li><a href="https://github.com/mueslimak3r">@mueslimak3r</a> - Sponsor via <a href="https://github.com/sponsors/mueslimak3r">GitHub sponsors</a></li>
<li><a href="https://github.com/AndreasGB">@AndreasGB</a></li>
<li><a href="https://github.com/crobibero">@crobibero</a></li>
</ul>
<p><strong>Other contributors</strong></p>
<ul>
<li><a href="https://github.com/Andy2244">@Andy2244</a></li>
<li><a href="https://github.com/DavidFair">@DavidFair</a></li>
<li><a href="https://github.com/tim-vk">@tim-vk</a></li>
<li><a href="https://github.com/ghostbuster84">@ghostbuster84</a></li>
<li><a href="https://github.com/Fallenbagel">@Fallenbagel</a></li>
<li><a href="https://github.com/dspencer001">@dspencer001</a></li>
</ul>
<h2 id="changelog">Changelog</h2>
<p>The complete changelog, with all pull requests merged for this release, is available on <a href="https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.14.0">GitHub</a>.</p>
<h2 id="download-now">Download now</h2>
<a class="NoLinkLook" href="https://play.google.com/store/apps/details?id=org.jellyfin.androidtv">
<img width="153" alt='Jellyfin for Android TV on Google Play' src="https://jellyfin.org/images/store-icons/google-play.png" />
</a>
<a class="NoLinkLook" href="https://www.amazon.com/gp/product/B07TX7Z725">
<img width="153" alt="Jellyfin for Fire TV at Amazon App Store" src="https://jellyfin.org/images/store-icons/amazon.png" />
</a>
<p>Direct downloads are available for side-loading at <a href="https://repo.jellyfin.org/releases/client/androidtv/">our repository</a> or in the <a href="https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.14.0">GitHub release</a>.
You can also join our <a href="https://play.google.com/apps/testing/org.jellyfin.androidtv">beta program on Google Play</a> to test new versions before they&rsquo;re released.</p></description></item><item><title>Jellyfin Roku Release - v1.5.0</title><link>https://jellyfin.org/posts/roku-v1.5.0/</link><pubDate>Mon, 25 Jul 2022 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/roku-v1.5.0/</guid><description><p>We are excited to announce the release of Jellyfin 1.5.0 for Roku! This update brings many new features to the Roku client and continues improving existing capabilities.</p>
<h2 id="new-features">New Features</h2>
<ul>
<li>Support for Quick Connect</li>
<li>Music playback (single song, album play, and Instant Mix)</li>
<li>Added “Network/Genre&quot; View Options to libraries</li>
<li>New user settings:
<ul>
<li>Jump back to the first item using back button</li>
<li>Blur unwatched episode images</li>
<li>Hide taglines on movie screen</li>
<li>Use splashscreen image as home background</li>
<li>Use splashscreen image as screensaver background</li>
</ul>
</li>
<li>Support for showing pre-roll videos</li>
<li>Improved Alpha Picker filter on library screens</li>
<li>And many more!</li>
</ul>
<h2 id="bugs-fixed">Bugs Fixed</h2>
<ul>
<li>Transcoding issue resulting from 10.8.0 server update</li>
<li>Crash when trying to read subtitle track for live tv</li>
<li>Periodic startup crash</li>
</ul>
<h2 id="additional-updates">Additional Updates</h2>
<ul>
<li>More text translations</li>
<li>Several important Programmer/Developer updates - making it quicker and easier for us to update the Roku client</li>
</ul>
<h2 id="download-now">Download Now</h2>
<p>Update your installed Jellyfin channel on your Roku device or install Jellyfin from the <a href="https://channelstore.roku.com/details/592369/jellyfin">Roku store</a>.</p>
<h2 id="full-release-notes">Full Release Notes</h2>
<p>The full (technical) release notes are available on <a href="https://github.com/jellyfin/jellyfin-roku/releases/tag/v1.5.0">GitHub</a>.</p>
<h2 id="contributors">Contributors</h2>
<ul>
<li><a href="https://github.com/jimdogx">@jimdogx</a></li>
<li><a href="https://github.com/candry7731">@candry7731</a></li>
<li><a href="https://github.com/1hitsong">@1hitsong</a></li>
<li><a href="https://github.com/cewert">@cewert</a></li>
<li><a href="https://github.com/renovate">@renovate</a></li>
</ul></description></item><item><title>Jellyfin for webOS - July 2022 Update</title><link>https://jellyfin.org/posts/webos-july2022/</link><pubDate>Fri, 08 Jul 2022 22:30:00 -0400</pubDate><guid>https://jellyfin.org/posts/webos-july2022/</guid><description><p>Finally, the big day is here. Jellyfin is now available on select LG Smart TVs.</p>
<h2 id="download">Download</h2>
<p>First, let&rsquo;s get the download links out of the way. The current release on the store will install on LG TVs with webOS 6+, which should be any fully updated TV from 2021 or newer.</p>
<p>For webOS 2/3/4/5:</p>
<ul>
<li>Download the <a href="https://github.com/jellyfin/jellyfin-webos/releases/latest">latest release</a></li>
<li>Install using Developer Mode (or other process)</li>
</ul>
<p>For newer TVs (2021+):</p>
<p align="center">
<a href="https://us.lgappstv.com/main/tvapp/detail?appId=1030579"><img alt="Enjoy on LG Smart TV" width="200" src="https://repo.jellyfin.org/releases/other/lg-badge/LG_BADGE_greyborders_817x242.png"/></a>
<br/>
<em><strong>Note:</strong> The Content Store version is currently only available for webOS 6+.</em>
</p>
<h2 id="whats-next">What&rsquo;s Next?</h2>
<p>We hope to bring this to more versions of webOS soon. There is one small bug to fix for webOS 5.x, and then we can resubmit with that update. Since the main QA testing work has been performed by LG, this process should be much faster. As time goes on, more enhancements and fixes will follow. It&rsquo;s hard to determine exactly how far back we&rsquo;ll successfully be able to support. We&rsquo;ll try our best to get as far back as webOS 3.x, but I am less optimistic about webOS 2.x and 1.x. If we get to 3.x, that brings us as far back as TVs from 2016 (running <a href="https://developer.chrome.com/docs/native-client/sdk/release-notes/#chrome-pepper-38-15-august-2014">Chromium 38</a> from 2014!). You can see what versions of the browser are included in older webOS versions in <a href="https://webostv.developer.lge.com/discover/specifications/web-engine/">LG&rsquo;s Documentation</a>.</p>
<p>If you want to follow along on our journey, you can have a look at the Issues listing on our <a href="https://github.com/jellyfin/jellyfin-webos/issues">webOS Repository</a>. I just have one request - don&rsquo;t comment unnecessarily. If you want to stay updated with a particular issue, there is a handy &ldquo;Subscribe&rdquo; button on the side that will email you updates.</p>
<p>It&rsquo;s important to note that the app itself is a wrapper around our server&rsquo;s web interface, so when you keep your Jellyfin server up to date, you automatically get a lot of the fixes right away. While the TV app will directly get occasional fixes, we don&rsquo;t anticipate having to update it very often. If you want to follow along with fixes to the web interface, just have a look at our <a href="https://github.com/jellyfin/jellyfin-web">jellyfin-web repository</a>.</p>
<p>Thank you for your patience with us so far. After this, there&rsquo;s still more work to be done. That&rsquo;s what happens when you&rsquo;re the person in charge of App Publishing to Google, Apple, Amazon, LG, Samsung, Microsoft, and Roku. I hope you enjoy this start, and we&rsquo;re gonna keep working to bring it to more of you.</p>
<p>Thanks,
Anthony</p>
<p><em>Your friendly neighbourhood Core Team member, App Publisher, Community/Social/Dev Relations manager, and macOS/Windows Tray maintainer!</em></p></description></item><item><title>Jellyfin Release - v10.8.0</title><link>https://jellyfin.org/posts/jellyfin-10-8-0/</link><pubDate>Fri, 10 Jun 2022 20:00:00 -0400</pubDate><guid>https://jellyfin.org/posts/jellyfin-10-8-0/</guid><description><p>After a rather long development cycle the Jellyfin team is proud to announce stable version 10.8! This release post will mostly cover the highlights with little prose, as there is so much to cover!</p>
<p><a href="https://jellyfin.org/downloads/" class="button button__accent">Download Jellyfin 10.8.0</a> <a href="https://github.com/jellyfin/jellyfin/releases/tag/v10.8.0" class="button hero__button">Read the full release notes</a></p>
<p>All of the changes, accumulated over nearly the last two years, are too many to easily list, so we&rsquo;ll break them down in the sections below and hope all of you find something enjoyable.</p>
<p>The major highlighted changes are:</p>
<ul>
<li>
<p>numerous improvements to Hardware Acceleration (HWA), including:</p>
<ul>
<li>
<p>Dolby Vision Profile 5 and 7 tone-mapping</p>
</li>
<li>
<p>CUDA-based tone-mapping for NVIDIA</p>
</li>
<li>
<p>extended OpenCL tone-mapping for Intel</p>
</li>
<li>
<p>hardware based subtitle burn in</p>
</li>
<li>
<p>Intel tone-mapping support for Windows</p>
</li>
<li>
<p>full OpenCL filtering for AMF on Windows</p>
</li>
<li>
<p>deprecation of OMX for raspberry pi, use V4L2 instead</p>
</li>
</ul>
</li>
<li>
<p>proper network interface binding and handling of proxied requests</p>
</li>
<li>
<p>various fixes for DLNA, Sync-Play and m3u HTTP streams</p>
</li>
<li>
<p>DLNA disabled by default</p>
</li>
<li>
<p>extended NFO metadata import</p>
</li>
<li>
<p>external audio and subtitle support including container (mks, mka)</p>
</li>
<li>
<p>extended plain folder parsing</p>
</li>
<li>
<p>enhanced detection and handling of DVD/BD ISOs and folders</p>
</li>
<li>
<p>extend TMDb metadata provider (series state, season names, tags, logos, etc)</p>
</li>
</ul>
<h2 id="server">Server</h2>
<p>Some major fixes include a number of HWA improvements, explicit network interface binding, DLNA improvements, better NFO parsing, configuration cleanup (relics of the migrations in 10.7.z), and numerous metadata improvements, as well as the migration to .NET 6 which provides a nice stable language base for future improvements.</p>
<p>A point-form list of the changes compiled by the team is:</p>
<ul>
<li>
<p>General:</p>
<ul>
<li>
<p>automatically migrate and cleanup config files</p>
</li>
<li>
<p>reduce memory footprint by various optimizations (e.g. reducing memory traffic)</p>
</li>
<li>
<p>rewrite QuickConnect</p>
</li>
<li>
<p>splashscreen in branding API (although not in use by any client yet)</p>
</li>
<li>
<p>various HDHomerun fixes and improvments</p>
</li>
<li>
<p>properly read filesize from symlinks</p>
</li>
<li>
<p>create output directory on file extraction</p>
</li>
<li>
<p>return path to pinfile on password reset</p>
</li>
<li>
<p>fix ombi auth through Jellyfin</p>
</li>
<li>
<p>include genre in related media generation</p>
</li>
<li>
<p>Implement more provider links for series, seasons, episodes and movies</p>
</li>
<li>
<p>properly handle gif</p>
</li>
<li>
<p>passwords are now hashed with 120000 iterations of PBKDF2-SHA512 instead of 1000 iterations of PBKDF2-SHA1, old passwords are migrated automatically on login</p>
</li>
<li>
<p>add config option to disable automatic server discovery</p>
</li>
</ul>
</li>
<li>
<p>Networking:</p>
<ul>
<li>
<p>fix explicit IP/interface binding</p>
</li>
<li>
<p>disable UPnP by default (only applies to new setups)</p>
</li>
<li>
<p>proper handling of published server URLs</p>
</li>
<li>
<p>disable DLNA server by default to avoid security risks</p>
</li>
</ul>
</li>
<li>
<p>HWA:</p>
<ul>
<li>
<p>implement CUDA-based tone-mapping for NVIDIA</p>
</li>
<li>
<p>extend Intel OpenCL tone-mapping (speed-wise on-par with VPP tone-mapping and therefore preferable)</p>
</li>
<li>
<p>implement full OpenCL HW filtering for AMD on Windows</p>
</li>
<li>
<p>implement hardware-based subtitle burn-in (significantly faster)</p>
</li>
<li>
<p>implement proper tone-mapping support on Windows</p>
</li>
<li>
<p>add CUDA &amp; OpenCL tone-mapping support for Dolby Vision profile 5 and 8</p>
</li>
<li>
<p>various other fixes for NVIDIA and Intel hardware acceleration</p>
</li>
<li>
<p>add support for AV1 hardware decoding on supported platforms</p>
</li>
<li>
<p>deprecate Raspberry Pi OMX/MMAL hardware acceleration in favour of V4L2</p>
</li>
</ul>
</li>
<li>
<p>Streaming/Transcoding:</p>
<ul>
<li>
<p>optimize and extend DLNA support</p>
</li>
<li>
<p>fixes for DLNA PlayTo and DLNA folders</p>
</li>
<li>
<p>fixes for DLNA seeking</p>
</li>
<li>
<p>extraction of attached fonts for subtitle transcoding/burn-in</p>
</li>
<li>
<p>small fixes to SyncPlay</p>
</li>
<li>
<p>add transcoding information to playback data</p>
</li>
<li>
<p>fix opus sampling rates on transcode</p>
</li>
<li>
<p>properly stream m3u over HTTP</p>
</li>
<li>
<p>add keyframe extraction for better seeking (WARNING: this is a really long running task)</p>
</li>
<li>
<p>overhaul streaming logic to only transcode incompatible streams</p>
</li>
<li>
<p>various fmp4 fixes</p>
</li>
</ul>
</li>
<li>
<p>NFO:</p>
<ul>
<li>
<p>add parsing of additional ids</p>
</li>
<li>
<p>proper importing of watched state</p>
</li>
<li>
<p>proper parsing of ratings</p>
</li>
<li>
<p>proper handling of thumb tags</p>
</li>
<li>
<p>add support for fanart tag</p>
</li>
<li>
<p>proper casting of NFO ids to internal ids</p>
</li>
</ul>
</li>
<li>
<p>Scanner/metadata providers:</p>
<ul>
<li>
<p>add ID parsing from folder names</p>
</li>
<li>
<p>extend ID parsing from filenames</p>
</li>
<li>
<p>refactor extras parsing (way faster)</p>
</li>
<li>
<p>refactor and harden parsing of plain folders (all movies in one folder)</p>
</li>
<li>
<p>refactor and extend external subtitle and external audio parsing (now supports containers too)</p>
</li>
<li>
<p>properly handle unprobed strm playback with external streams</p>
</li>
<li>
<p>add support for TMDB absolute and TV order</p>
</li>
<li>
<p>properly pass language to TMDB search queries</p>
</li>
<li>
<p>fetch TMDB parental rating for tvshows</p>
</li>
<li>
<p>enable fetching additional series states from TMDb</p>
</li>
<li>
<p>properly detect DolbyVision</p>
</li>
<li>
<p>enhance detection and handling of DVD/BD folders/ISOs</p>
</li>
<li>
<p>episode parser improvements</p>
</li>
<li>
<p>add ability to disable adult content in TMDb</p>
</li>
<li>
<p>add ability to configure image scale in TMDb</p>
</li>
<li>
<p>update artist split whitelist</p>
</li>
<li>
<p>make tag import and maxCastMembers configurable for TMDb</p>
</li>
<li>
<p>improve metadata merging</p>
</li>
<li>
<p>add ability to fetch logos with TMDb</p>
</li>
<li>
<p>add option to configure season name importing for TMDb</p>
</li>
</ul>
</li>
<li>
<p>Technical:</p>
<ul>
<li>
<p>upgrade to latest .NET 6 (fixes some of the quirks with network storage)</p>
</li>
<li>
<p>bump all dependencies</p>
</li>
<li>
<p>upgrade analyzers and properly handle warnings</p>
</li>
<li>
<p>proper generation and publishing of OpenAPI spec</p>
</li>
<li>
<p>add and extend tests for various subsystems</p>
</li>
<li>
<p>upgrade Docker images to Debian 11 Bullseye</p>
</li>
<li>
<p>include latest Intel Compute Runtime in Docker images</p>
</li>
<li>
<p>add health check to Docker images</p>
</li>
<li>
<p>remove unused docker volume for /media from Docker images</p>
</li>
<li>
<p>make flushing to disk async if possible</p>
</li>
</ul>
</li>
</ul>
<h2 id="web">Web</h2>
<p>Web has been moved completely to NPM (instead of Yarn), and several pages have been ported to React. Further many dozens of improvements and fixes have been made.</p>
<p>A point-form list of the changes compiled by the team is:</p>
<ul>
<li>
<p>switch to NPM</p>
</li>
<li>
<p>update all dependencies</p>
</li>
<li>
<p>introduce ReactJS and migrate some pages</p>
</li>
<li>
<p>redesign of mobile item detail views</p>
</li>
<li>
<p>SyncPlay improvements</p>
</li>
<li>
<p>user settings for custom CSS</p>
</li>
<li>
<p>fixes for TV layouts</p>
</li>
<li>
<p>book player improvements and new Continue Reading section</p>
</li>
<li>
<p>change SyncPlay icon</p>
</li>
<li>
<p>add support for custom links in sidebar (config file only)</p>
</li>
<li>
<p>add support for new QuickConnect</p>
</li>
<li>
<p>update settings to reflect server changes</p>
</li>
<li>
<p>properly name generated bundles for cache-invalidation on update</p>
</li>
<li>
<p>implement markdown for plugin changelog rendering</p>
</li>
<li>
<p>add hardware transcoding info to playback data</p>
</li>
<li>
<p>enable buffering in the web player</p>
</li>
<li>
<p>switch volume slider to exponential instead of linear scaling</p>
</li>
<li>
<p>remove tag filter limit</p>
</li>
<li>
<p>fixes for theme songs and videos</p>
</li>
<li>
<p>unify duration display</p>
</li>
<li>
<p>add item count to playlists</p>
</li>
<li>
<p>expand metadata editor</p>
</li>
<li>
<p>various fixes for webOS</p>
</li>
<li>
<p>fix and extend multiselect</p>
</li>
<li>
<p>save playback speed between media</p>
</li>
<li>
<p>introduce WebWorker for blurhash decoding</p>
</li>
<li>
<p>update translations</p>
</li>
<li>
<p>add apple device icon to activity log</p>
</li>
<li>
<p>save pdf &ldquo;playback&rdquo; on page finish</p>
</li>
<li>
<p>stack toasts</p>
</li>
<li>
<p>add paging to list view</p>
</li>
<li>
<p>display series level extras on series page</p>
</li>
<li>
<p>extend LiveTV pages</p>
</li>
<li>
<p>extend mediainfo dialogue</p>
</li>
<li>
<p>escape most HTML</p>
</li>
<li>
<p>add rewatching to next up</p>
</li>
<li>
<p>allow markdown in login disclaimer</p>
</li>
<li>
<p>fix theme colors</p>
</li>
<li>
<p>tackle accessibility issues</p>
</li>
<li>
<p>fix album track sorting if audio files have SortName tags</p>
</li>
<li>
<p>add track sorting for videos</p>
</li>
</ul>
<h2 id="ffmpeg">FFmpeg</h2>
<p>Our custom FFMpeg has been upgraded to version 5, along with numerous HWA enhancements and improvements.</p>
<p>A point-form list of the changes compiled by the team is:</p>
<ul>
<li>
<p>update to FFmpeg 5.0.x</p>
</li>
<li>
<p>rename Debuntu package to jellyfin-ffmpeg5 for backwards compatibility</p>
</li>
<li>
<p>update existing patches</p>
</li>
<li>
<p>add patches for CUDA and Intel Quick Sync tone-mapping improvements</p>
</li>
<li>
<p>add patches for AMD Vulkan-based HWA and tone-mapping</p>
</li>
<li>
<p>add patches for CUDA &amp; OpenCL tone-mapping support for Dolby Vision profiles 5 and 8</p>
</li>
<li>
<p>self-build and include latest Intel media-driver, required libraries and vainfo</p>
</li>
<li>
<p>migrate CI to Github Actions</p>
</li>
<li>
<p>add build script for win64</p>
</li>
<li>
<p>add required libs for QSV on 12th gen Intel hardware</p>
</li>
<li>
<p>add chromaprint</p>
</li>
<li>
<p>remove deprecated distros, add newly released distros</p>
</li>
<li>
<p>add patch to support long path names on Windows</p>
</li>
</ul>
<h2 id="plugins">Plugins</h2>
<p>All plugins have been updated for Jellyfin 10.8.0, as well as numerous day to day enhancements.</p>
<p>A point-form list of (some of) the changes compiled by the team is:</p>
<ul>
<li>
<p>migrate CI to templated Github Action workflows</p>
</li>
<li>
<p>fix trakt.tv plugin to actually be useable</p>
</li>
</ul>
<h2 id="translations">Translations</h2>
<p>Thanks to the many dozens of generous volunteers over at our Weblate (<a href="https://translate.jellyfin.org">https://translate.jellyfin.org</a>), thousands of new translations are available in Jellyfin 10.8.0 for over 3 dozen languages.</p>
<p>Happy watching!</p></description></item><item><title>Updating our iOS App</title><link>https://jellyfin.org/posts/ios-update-150/</link><pubDate>Wed, 08 Jun 2022 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/ios-update-150/</guid><description><p>With <a href="https://apps.apple.com/us/app/jellyfin-mobile/id1480192618?mt=8">Jellyfin Mobile</a>, our main iOS App, we have updated some frameworks that adjust our minimum iOS version.</p>
<p>Our main iOS app has been built using <a href="http://expo.dev">Expo</a>. It offers a unique take on a &ldquo;managed&rdquo; React Native experience that allows anyone to develop an app for iOS, even without using a Mac. It allowed us to get an app out quickly, and use the web interface that is a part of every Jellyfin install.</p>
<p>As time goes on, we keep Expo up to date in order to take advantage of security fixes, and help us use new features in the app itself. With our next app release, we move to <a href="https://blog.expo.dev/expo-sdk-43-aa9b3c7d5541">Expo 43</a>, which fully supports iOS 15, but must also drop support for iOS 10 and 11.</p>
<p>As a result, starting with version 1.5.0 of our Apple app, <strong>iOS/iPadOS 12 or newer is required.</strong></p>
<p>If your device is still on an older version of iOS, and you currently have the app downloaded, your experience will stay mostly the same for now. The installed version isn&rsquo;t being removed from the store, so you can still re-install it if needed - but your device won&rsquo;t receive any updates for it. As time goes on, and you update your Jellyfin server, you may encounter unexpected behaviour with the older iOS app.</p>
<p>If you haven&rsquo;t downloaded it before, or are running into issues, you can try a few different options:</p>
<ul>
<li>If your server is local (on your home network), try <a href="https://apps.apple.com/ca/app/vlc-media-player/id650377962">VLC media player</a>. It still supports devices as old as iOS 9, and can access the DLNA server built-in to Jellyfin.</li>
<li>If your server is remote, or you have the DLNA server disabled, you can try using Safari to access the normal Jellyfin interface.</li>
</ul>
<p>If you can&rsquo;t seem to get anything to work, feel free to get in touch and visit us in chat, or on Reddit. We&rsquo;ve got a great community of users who are always willing to help, and we&rsquo;re usually around as well. All the links are available on our <a href="https://jellyfin.org/contact/">contact page</a>.</p>
<hr>
<p>Thank you for using Jellyfin and supporting us this far.</p>
<p>Our iOS app is largely worked on by only one contributor, <a href="https://github.com/thornbill">@thornbill</a>, who gives generously of his spare time to develop the app and make improvements to it and our web interface. He, along with a few of our <a href="https://github.com/orgs/jellyfin/people">contributors</a> have donation pages setup either through GitHub Sponsors, or other sites like LiberaPay, Patreon and more. If you&rsquo;d like to support any of them, please see their profiles for more information.</p>
<p>If you&rsquo;d like to support Jellyfin as a whole (infrastructure and equipment costs only), you can visit our public ledger on <a href="https://opencollective.com/jellyfin">OpenCollective</a>. We&rsquo;re pretty well covered for now, so consider donating to contributors first.</p></description></item><item><title>Android TV v0.13</title><link>https://jellyfin.org/posts/android-tv-13/</link><pubDate>Thu, 17 Mar 2022 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/android-tv-13/</guid><description><!-- markdownlint-disable MD033 MD036 -->
<p>We&rsquo;re back with another release for Android TV and Fire TV users containing a lot of bugfixes!</p>
<p>As promised in the previous release post, the time between updates is getting shorter. We aim for future updates to happen significantly more frequently than the two years between 0.11 and 0.12. Today&rsquo;s update brings some new features and greatly improves playback of videos. Let&rsquo;s get started with the player changes.</p>
<h2 id="playback-changes">Playback changes</h2>
<p>Most changes in this release are related to playing video files, the so called playback code. A lot of changes were made, both bugfixes and new features! The full list is, as always, available in the <a href="https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.13.0">changelog</a>. The most notable changes are listed below.</p>
<h2 id="transcoding-updates">Transcoding updates</h2>
<p>A lot of issues with video are caused by the way the app transcodes video. We&rsquo;ve tweaked the transcoding behavior and found a lot of issues were fixed with those tweaks, issues like the video ending early or unexpectedly rewinding itself. Unfortunately these changes triggered some issues in Jellyfin 10.7 and we had to limit these changes to servers running Jellyfin 10.8. We recommend updating as soon as a stable server release is ready.</p>
<p>Additionally, we&rsquo;ve added support for more audio codecs. The added codecs include Dolby Digital, Digital Plus and TrueHD, as well as DTS and Linear PCM audio, all commonly found on DVDs and Blu-rays, but also a more universal AAC support. This change is comparable with the audio codec changes in the last release of our mobile app.</p>
<h3 id="version-selection">Version selection</h3>
<p>A much requested feature was the ability to add a version selector. We&rsquo;ve now added this function. A new button is now shown on the details page for a movie/episode/video that can be used to select which version to play.</p>
<p><img src="https://jellyfin.org/images/posts/androidtv-0-13-0/versionselection.png" alt="Screenshot of the new version selection"></p>
<h3 id="speed-control">Speed control</h3>
<p>It&rsquo;s now possible to change the speed of playback. You can slow down or speed up a video. The set speed is remembered so the next video plays at the same speed, until you restart the app or manually change it back. Speed control is not available for Live TV.</p>
<p><img src="https://jellyfin.org/images/posts/androidtv-0-13-0/speedcontrol.png" alt="Screenshot of the new speed controls"></p>
<h3 id="subtitle-preferences">Subtitle preferences</h3>
<p>Not everyone enjoyed the default <span style="background:#000;color:#fff;padding:4px;">subtitle styling</span> in the previous version, so now there are a few options to change it. It&rsquo;s now possible to change the size of the subtitles and to toggle between a black background or text outline. These preferences work for all text based subtitles. Image based subtitles like SubStation Alpha and VobSub still use their own styling.</p>
<h2 id="search--screen-saver">Search &amp; Screen saver</h2>
<p>You can now use the search function on Android TV to search in your Jellyfin libraries. This feature is supported for Android TV devices that do not use Google TV (like the new Chromecast). To get started, just search for a movie and press the &ldquo;Available on Jellyfin&rdquo; button.</p>
<p>Additionally, we&rsquo;ve added a screen saver that highlights your media. To enable it go to your system settings, open the screen saver category, and select the Jellyfin screen saver. On some devices this function may be called &ldquo;Daydream&rdquo;. The screen saver shows random series and movies with their backdrop.</p>
<h2 id="updated-preferences">Updated preferences</h2>
<p>The app has quite a lot of preferences. To make it easier to find the correct preference we&rsquo;ve divided them into a few categories and re-ordered all of them.</p>
<p>Some new preferences were added too. We&rsquo;ve added subtitle preferences (see above), the ability to (finally) change the home sections from within the app. And the licenses of third party libraries are now shown in the about section.</p>
<img src="https://jellyfin.org/images/posts/androidtv-0-13-0/newprefs.png" alt="Screenshot of the new preference categories" style="max-height:500px;" />
<h2 id="contributors">Contributors</h2>
<p>Like all releases, we couldn&rsquo;t do it without our contributors and your donations! Jellyfin is made entirely by volunteers that don&rsquo;t get paid for their work. A big shout-out to the following contributors that made this release possible:</p>
<p><strong>Jellyfin Team</strong></p>
<ul>
<li><a href="https://github.com/nielsvanvelzen">@nielsvanvelzen</a> - Donate via <a href="https://github.com/sponsors/nielsvanvelzen">GitHub sponsors</a></li>
<li><a href="https://github.com/mueslimak3r">@mueslimak3r</a> - Donate via <a href="https://github.com/sponsors/mueslimak3r">GitHub sponsors</a></li>
<li><a href="https://github.com/thornbill">@thornbill</a> - Donate via <a href="https://github.com/sponsors/thornbill">GitHub sponsors</a></li>
<li><a href="https://github.com/h1dden-da3m0n">@h1dden-da3m0n</a></li>
</ul>
<p><strong>Other contributors</strong></p>
<ul>
<li><a href="https://github.com/DavidFair">@DavidFair</a></li>
<li><a href="https://github.com/ElegyD">@ElegyD</a></li>
<li><a href="https://github.com/siankatabg">@siankatabg</a></li>
<li><a href="https://github.com/koying">@koying</a></li>
<li><a href="https://github.com/danieladov">@danieladov</a></li>
</ul>
<h2 id="changelog">Changelog</h2>
<p>Full changelog with all pull requests available on <a href="https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.13.0">GitHub</a>.</p>
<h2 id="download-now">Download Now</h2>
<a class="NoLinkLook" href="https://play.google.com/store/apps/details?id=org.jellyfin.androidtv">
<img width="153" alt='Jellyfin for Android TV on Google Play' src="https://jellyfin.org/images/store-icons/google-play.png" />
</a>
<a class="NoLinkLook" href="https://www.amazon.com/gp/product/B07TX7Z725">
<img width="153" alt="Jellyfin for Fire TV at Amazon App Store" src="https://jellyfin.org/images/store-icons/amazon.png" />
</a>
<p>Direct downloads are always available from <a href="https://repo.jellyfin.org/releases/client/androidtv/">our repository</a>.
You can also join our <a href="https://play.google.com/apps/testing/org.jellyfin.androidtv">beta program on Google Play</a> to test new versions.</p></description></item><item><title>Jellyfin Android v2.4.0 - More audio codecs, stability improvements and various tweaks</title><link>https://jellyfin.org/posts/android-v2.4.0/</link><pubDate>Thu, 04 Nov 2021 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/android-v2.4.0/</guid><description><p>Compared to the last major release, Jellyfin Android 2.4.0 isn&rsquo;t as feature packed, but it still includes some useful changes and various fixes. Read on to learn more!</p>
<p>The biggest improvement right of the start is support for additional audio codecs in the integrated video player, allowing even more media to direct play on your device. Specifically, that includes Dolby Digital, Digital Plus and TrueHD, as well as DTS and Linear PCM audio, all commonly found on DVDs and Blu-rays, but also a more universal AAC support.</p>
<p>Additionally, The integrated player now follows the rewind/fast forward preferences selected in the Jellyfin settings.</p>
<p>Apart from that, connection reliability was again improved, handling timeouts properly now and showing a progress indicator while the app connects (thus it won&rsquo;t be stuck on black screen anymore).</p>
<h2 id="download-now">Download Now</h2>
<a class="NoLinkLook" href="https://play.google.com/store/apps/details?id=org.jellyfin.mobile">
<img width="153" alt="Jellyfin on Google Play" src="https://jellyfin.org/images/store-icons/google-play.png" />
</a>
<a class="NoLinkLook" href="https://www.amazon.com/gp/product/B081RFTTQ9">
<img width="153" alt="Jellyfin on Amazon App Store" src="https://jellyfin.org/images/store-icons/amazon.png" />
</a>
<a class="NoLinkLook" href="https://f-droid.org/en/packages/org.jellyfin.mobile/">
<img width="153" alt="Jellyfin on F-Droid" src="https://jellyfin.org/images/store-icons/fdroid.png" />
</a>
<p>Direct downloads are always available from <a href="https://repo.jellyfin.org/releases/client/android/">our repository</a>.</p>
<h2 id="full-release-notes">Full Release Notes</h2>
<p>The full (technical) release notes are available on <a href="https://github.com/jellyfin/jellyfin-android/releases/tag/v2.4.0">GitHub</a>.</p>
<h2 id="contributors">Contributors</h2>
<p>As always, lots of great people contributed in this release:</p>
<h3 id="jellyfin-team">Jellyfin Team</h3>
<ul>
<li><a href="https://github.com/nielsvanvelzen">@nielsvanvelzen</a> - <a href="https://github.com/sponsors/nielsvanvelzen">Sponsor</a></li>
<li><a href="https://github.com/Maxr1998">@Maxr1998</a> - <a href="https://github.com/sponsors/Maxr1998">Sponsor</a></li>
</ul>
<h3 id="others">Others</h3>
<ul>
<li><a href="https://github.com/CarlosOlivo">@CarlosOlivo</a></li>
</ul>
<h3 id="contribute">Contribute</h3>
<p>If you have some experience with Android development and are interested in contributing yourself, feel free to dive into the source code <a href="https://github.com/jellyfin/jellyfin-android">on GitHub</a> and open pull requests!</p>
<p>Alternatively, you can help translating the app into your language on our <a href="https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/">Weblate</a>.</p></description></item><item><title>Android TV v0.12</title><link>https://jellyfin.org/posts/android-tv-12/</link><pubDate>Thu, 30 Sep 2021 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/android-tv-12/</guid><description><!-- markdownlint-disable MD033 MD036 -->
<p>Today we&rsquo;re bringing the Android TV app to 2021 with a modern design and tons of other changes.</p>
<p>Over 400 <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> pull requests containing 2400+ commits, 750+ changed files with 54000+ changed lines of code by roughly 50 contributors<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. This is the biggest update to the app we ever worked on. I&rsquo;ll talk a bit about why it is this big and why it took so long later in the post. But let&rsquo;s start with the part you probably came for: <strong>new features!</strong></p>
<h2 id="new-authentication-flow">New authentication flow</h2>
<p>We got a lot of complaints about our authentication flow. It wasn&rsquo;t obvious how to enable the auto-login option and managing multiple servers or users was not an easy task. We also didn&rsquo;t like this part of the app, and decided to completely revamp it! The rewritten sign-in screen looks more modern and is much easier to use. There is a new help section that links to our documentation to help new users get started with Jellyfin. The auto-discovery feature of the app now shows all servers instead of the first one, you can select one of those or manually enter your server address to connect. You can then proceed to add a user and start using the app. Users are automatically saved now with auto-login enabled by default.</p>
<div class="juxtapose">
<img data-label="0.11" src="https://jellyfin.org/images/posts/androidtv-0-12-0/11-user-select.png" />
<img data-label="0.12" src="https://jellyfin.org/images/posts/androidtv-0-12-0/12-user-select.png" />
</div>
<h2 id="updated-user-interface-design">Updated user interface design</h2>
<p>After logging in you will be presented with a modern look and feel in our refreshed user interface. A new toolbar is added to the top-right corner of the screen to open the search page, settings or to switch to a different user. No need to scroll down to the bottom of the home screen anymore.
Beneath this new toolbar is your media, like it always was, but the cards got a new look with the debatable colored backgrounds removed.</p>
<div class="juxtapose">
<img data-label="0.11" src="https://jellyfin.org/images/posts/androidtv-0-12-0/11-home.png" />
<img data-label="0.12" src="https://jellyfin.org/images/posts/androidtv-0-12-0/12-home.png" />
</div>
<p>The settings screen got a refresh too. It allows you to more easily change settings. Some new settings got added to customize the app to your own taste.</p>
<div class="juxtapose">
<img data-label="0.11" src="https://jellyfin.org/images/posts/androidtv-0-12-0/11-settings.png" />
<img data-label="0.12" src="https://jellyfin.org/images/posts/androidtv-0-12-0/12-settings.png" />
</div>
<p>The user interface when browsing inside libraries got some slight changes too. We&rsquo;re hoping to completely revamp this part of the app at some point, but that didn&rsquo;t stop us from making it slightly better now.</p>
<div class="juxtapose">
<img data-label="0.11" src="https://jellyfin.org/images/posts/androidtv-0-12-0/11-browse.png" />
<img data-label="0.12" src="https://jellyfin.org/images/posts/androidtv-0-12-0/12-browse.png" />
</div>
<div class="juxtapose">
<img data-label="0.11" src="https://jellyfin.org/images/posts/androidtv-0-12-0/11-details.png" />
<img data-label="0.12" src="https://jellyfin.org/images/posts/androidtv-0-12-0/12-details.png" />
</div>
<h3 id="themes">Themes</h3>
<p>The web client supported theming since forever but the Android TV app did not. That changes today with the introduction of three themes: Muted Purple together with Dark (Default) and Classic Emerald are now available in the app to supports basic theming. We&rsquo;re planning to expand this feature in the future with more themes and more variety between them. <em>Maybe we should add a light theme?</em></p>
<h3 id="new-video-player-design">New video player design</h3>
<p>The video player was completely redesigned to remove a lot of clutter and make it easier to use. The new design is bigger so you can more easily see the information on a television.</p>
<div class="juxtapose">
<img data-label="0.11" src="https://jellyfin.org/images/posts/androidtv-0-12-0/11-player.png" />
<img data-label="0.12" src="https://jellyfin.org/images/posts/androidtv-0-12-0/12-player.png" />
</div>
<p>The new video player design is just the beginning. A project to rewrite the playback code behind it is already in the works. This rewrite should help with the crashes and unnecessary transcoding that happens sometimes. It will also give us the opportunity to add new features like SyncPlay. But this doesn&rsquo;t mean the current code isn&rsquo;t being worked on anymore! We did fix some issues with the current video player code. Notable are changes for Fire TV to direct play more often and a lot of crashes got fixed.</p>
<h2 id="fixed-that-bug">Fixed that bug</h2>
<p>Together with all the visible changes we&rsquo;ve made tons of fixes to the code. We&rsquo;re now using <a href="https://kotlinlang.org">Kotlin</a> as our primary language to help us writing type-safe code, migrated completely to <a href="https://developer.android.com/jetpack/androidx/">AndroidX</a> for better device compatibility and made a brand new <a href="https://github.com/jellyfin/jellyfin-sdk-kotlin">SDK</a> that is slowly being integrated for a more secure and stable connetion with your server. All of these modernizations in the code allow us to more frequently release updates.</p>
<p>A complete list of all the fixed bugs can be found in our changelog linked below. It&rsquo;s a big list!</p>
<h2 id="going-forward">Going forward</h2>
<p>It took some time to get this release out. We didn&rsquo;t feel like the state of the app was good enough for a release for a while.
Fortunately we&rsquo;ve worked hard to make sure we did feel confident and here we are! Starting from this release we&rsquo;re changing some things
to make sure the next release won&rsquo;t take this long. Our brand new SDK that is already used in our Android app and third party apps is one of the tools helping us with faster releases. By having a more type-safe base we can prevent tons of crashes, allowing us to focus on actual features and bugs.</p>
<p>We&rsquo;re already working on some new stuff like the earlier mentioned rewrite of the playback code. We&rsquo;re using feature flags for this so we can work on this code while still being able to publish new versions. Other changes that we&rsquo;re looking into are more improvements to the user interface, better Live TV, better music support and more bugfixes!</p>
<h2 id="contributors">Contributors</h2>
<p>Like all releases, we couldn&rsquo;t do it without our contributors and your donations! Jellyfin is made entirely by volunteers that don&rsquo;t get paid for their work. A big shout-out to the following contributors that made this release possible:</p>
<p><strong>Jellyfin Team</strong></p>
<ul>
<li><a href="https://github.com/nielsvanvelzen">@nielsvanvelzen</a> - Donate via <a href="https://github.com/sponsors/nielsvanvelzen">GitHub sponsors</a></li>
<li><a href="https://github.com/thornbill">@thornbill</a> - Donate via <a href="https://github.com/sponsors/thornbill">GitHub sponsors</a></li>
<li><a href="https://github.com/MrChip53">@MrChip53</a></li>
<li><a href="https://github.com/AndreasGB">@AndreasGB</a></li>
</ul>
<p><strong>Other contributors</strong></p>
<ul>
<li><a href="https://github.com/linetrimmer">@linetrimmer</a></li>
<li><a href="https://github.com/Froghut">@Froghut</a></li>
<li><a href="https://github.com/koying">@koying</a></li>
<li><a href="https://github.com/Florianisme">@Florianisme</a></li>
<li><a href="https://github.com/jassycliq">@jassycliq</a></li>
<li><a href="https://github.com/tukilo">@tukilo</a></li>
<li><a href="https://github.com/vnidens">@vnidens</a></li>
<li><a href="https://github.com/Vardex">@Vardex</a></li>
<li><a href="https://github.com/MrLemur">@MrLemur</a></li>
<li><a href="https://github.com/willtrking">@willtrking</a></li>
<li><a href="https://github.com/sachk">@sachk</a></li>
<li><a href="https://github.com/PalAditya">@PalAditya</a></li>
<li><a href="https://github.com/okan35">@okan35</a></li>
<li><a href="https://github.com/jemlule">@jemlule</a></li>
<li><a href="https://github.com/jsquyres">@jsquyres</a></li>
<li><a href="https://github.com/ferferga">@ferferga</a></li>
<li><a href="https://github.com/Aerion">@Aerion</a></li>
<li><a href="https://github.com/dhiaayachi">@dhiaayachi</a></li>
<li><a href="https://github.com/jakeapp">@jakeapp</a></li>
<li><a href="https://github.com/GodTamIt">@GodTamIt</a></li>
<li><a href="https://github.com/JannikHoelling">@JannikHoelling</a></li>
</ul>
<h2 id="changelog">Changelog</h2>
<p>Full changelog with all pull requests available on <a href="https://github.com/jellyfin/jellyfin-androidtv/releases/tag/v0.12.0">GitHub</a>.</p>
<h2 id="download-now">Download Now</h2>
<a class="NoLinkLook" href="https://play.google.com/store/apps/details?id=org.jellyfin.androidtv">
<img width="153" alt='Jellyfin for Android TV on Google Play' src="https://jellyfin.org/images/store-icons/google-play.png" />
</a>
<a class="NoLinkLook" href="https://www.amazon.com/gp/product/B07TX7Z725">
<img width="153" alt="Jellyfin for Fire TV at Amazon App Store" src="https://jellyfin.org/images/store-icons/amazon.png" />
</a>
<p>Direct downloads are always available from <a href="https://repo.jellyfin.org/releases/client/androidtv/">our repository</a>.
You can also join our <a href="https://play.google.com/apps/testing/org.jellyfin.androidtv">beta program on Google Play</a> to test new versions.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://github.com/jellyfin/jellyfin-androidtv/projects/2?card_filter_query=is%3Apr+is%3Amerged">v0.12.0 project filtered by merged pull requests</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://github.com/jellyfin/jellyfin-androidtv/compare/v0.11.5...v0.12.0-beta.7">Git comparison between v0.11.5 and v0.12.0-beta.7</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div></description></item><item><title>Jellyfin Android v2.3.0 - Improved Integrated Player</title><link>https://jellyfin.org/posts/android-v2.3.0/</link><pubDate>Sun, 01 Aug 2021 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/android-v2.3.0/</guid><description><p>After a prolonged beta testing period, we&rsquo;re excited to announce that version 2.3.0 of the Jellyfin Android app is now available!</p>
<p>A lot things have changed since the last stable release, mainly to improve stability and compatibility with the Jellyfin Server.</p>
<p>Communication between the Android app and the server was updated to use <a href="https://github.com/jellyfin/jellyfin-sdk-kotlin">a new library</a> that supports more modern technologies which improves the development process and allows us to support additional features in the future, eventually resulting in a fully native app that&rsquo;s specifically optimized for phones.</p>
<p>Due to the library changes, the new version of the app <strong>only supports servers of version 10.7.0 or later</strong>, so make sure your server is up-to-date before you install the update!</p>
<h3 id="integrated-video-player-improvements">Integrated Video Player Improvements</h3>
<p>The integrated/native video player was especially reworked and supports playlists now (so that you can binge-watch your shows more easily), allows setting the playback speed and introduced an option in the client settings to remember the screen brightness applied through gestures.</p>
<img alt="Playback speed controls" src="https://jellyfin.org/images/posts/android-v2.3.0/exoplayer-speed-controls.png" />
<p>The Picture-in-Picture (PiP) mode now respects the aspect ratio of your media and will have smooth animations when entering it.
Soon, you&rsquo;ll also be able to select a bitrate limit to force transcoded streaming and reduce data usage, so please look forward to the next updates!</p>
<h2 id="polishing-and-bug-fixes">Polishing and Bug Fixes</h2>
<p>You can now set the location to download content to in the client settings.
There were also a lot of bug fixes which will improve the experience with the app, not only in the native player but also for Android Auto support and when casting media to Chromecast.</p>
<h2 id="download-now">Download Now</h2>
<a class="NoLinkLook" href="https://play.google.com/store/apps/details?id=org.jellyfin.mobile">
<img width="153" alt="Jellyfin on Google Play" src="https://jellyfin.org/images/store-icons/google-play.png" />
</a>
<a class="NoLinkLook" href="https://www.amazon.com/gp/product/B081RFTTQ9">
<img width="153" alt="Jellyfin on Amazon App Store" src="https://jellyfin.org/images/store-icons/amazon.png" />
</a>
<a class="NoLinkLook" href="https://f-droid.org/en/packages/org.jellyfin.mobile/">
<img width="153" alt="Jellyfin on F-Droid" src="https://jellyfin.org/images/store-icons/fdroid.png" />
</a>
<p>Direct downloads are always available from <a href="https://repo.jellyfin.org/releases/client/android/">our repository</a>.</p>
<h2 id="full-release-notes">Full Release Notes</h2>
<p>The full (technical) release notes are available on <a href="https://github.com/jellyfin/jellyfin-android/releases/tag/v2.3.0">GitHub</a>.</p>
<h2 id="contributors">Contributors</h2>
<p>As always, lots of great people contributed in this release:</p>
<h3 id="jellyfin-team">Jellyfin Team</h3>
<ul>
<li><a href="https://github.com/nielsvanvelzen">@nielsvanvelzen</a> - <a href="https://github.com/sponsors/nielsvanvelzen">Sponsor</a></li>
<li><a href="https://github.com/Maxr1998">@Maxr1998</a> - <a href="https://github.com/sponsors/Maxr1998">Sponsor</a></li>
<li><a href="https://github.com/h1dden-da3m0n">@h1dden-da3m0n</a> - <em>Special shout-out for helping with the migration to GitHub Actions!</em></li>
<li><a href="https://github.com/ferferga">@ferferga</a> - <a href="https://github.com/sponsors/ferferga">Sponsor</a></li>
</ul>
<h3 id="others">Others</h3>
<ul>
<li><a href="https://github.com/CarlosOlivo">@CarlosOlivo</a></li>
<li><a href="https://github.com/fedesenmartin">@fedesenmartin</a></li>
<li><a href="https://github.com/ThreeFive-O">@ThreeFive-O</a></li>
<li><a href="https://github.com/Codex-">@Codex-</a></li>
<li><a href="https://github.com/diederikdehaas">@diederikdehaas</a></li>
</ul>
<h3 id="contribute">Contribute</h3>
<p>If you have some experience with Android development and are interested in contributing yourself, feel free to dive into the source code <a href="https://github.com/jellyfin/jellyfin-android">on GitHub</a> and open pull requests!</p>
<p>Alternatively, you can help translating the app into your language on our <a href="https://translate.jellyfin.org/projects/jellyfin-android/jellyfin-android/">Weblate</a>.</p></description></item><item><title>Regarding the Android betas</title><link>https://jellyfin.org/posts/android-betas/</link><pubDate>Sat, 24 Jul 2021 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/android-betas/</guid><description><!-- markdownlint-disable MD033 -->
<p>With the release of the first Android TV 0.12 release beta, this is a good time to explain how our Android beta programs work and how to start using them. The mobile app has used a public beta channel for around a year now and with the Android TV app coming close to a new release we&rsquo;re adding a similar program for that as well.</p>
<h2 id="what-is-the-difference-between-release-and-beta">What is the difference between release and beta?</h2>
<p>A beta version is an early build of an upcoming release. This means that most of the new features are available but there might still be some issues. In the case of the Jellyfin Android apps, we might release a beta version because we expect issues or want to test something with a larger audience. Generally the beta cycle should only last a short period.</p>
<h2 id="should-i-use-a-beta-version">Should I use a beta version?</h2>
<p>Beta versions may contain issues. Those issues could vary from a small annoyance to a major issue that prevents you from signing in to your server. Do not use a beta version if you are unable to provide bug reports with app-logs and reproducible steps.</p>
<h2 id="how-do-i-report-problems">How do I report problems?</h2>
<p>If you encounter a problem, we would appreciate a detailed issue with app-logs and reproducible steps so we can fix the problem before release. To do this, you will need an account on GitHub and open an issue on the repository for the app.</p>
<ul>
<li><a href="https://github.com/jellyfin/jellyfin-androidtv/issues/new/choose">GitHub issues Android TV</a></li>
<li><a href="https://github.com/jellyfin/jellyfin-android/issues/new/choose">GitHub issues Android (mobile)</a></li>
</ul>
<h2 id="where-do-i-get-the-beta">Where do I get the beta?</h2>
<p>The beta releases are only available on the Google Play store or in our own repository. Users of F-Droid or the Amazon Appstore can sideload the apk files available in our repository or wait for the release.</p>
<h3 id="what-about-the-amazon-appstore">What about the Amazon Appstore?</h3>
<p>The Amazon Appstore has no options for beta apps. Therefore, we unfortunately cannot provide beta versions of the app to users who do not have a Play Store on their device.</p>
<h3 id="android-tv">Android TV</h3>
<a class="NoLinkLook" href="https://play.google.com/apps/testing/org.jellyfin.androidtv">
<img width="153" alt="Jellyfin for Android TV on Google Play" src="https://jellyfin.org/images/store-icons/google-play.png" />
</a>
<p>Direct downloads available in <a href="https://repo.jellyfin.org/releases/client/androidtv/">our repository</a>.</p>
<h3 id="android-mobile">Android (mobile)</h3>
<a class="NoLinkLook" href="https://play.google.com/apps/testing/org.jellyfin.mobile">
<img width="153" alt="Jellyfin on Google Play" src="https://jellyfin.org/images/store-icons/google-play.png" />
</a>
<p>Direct downloads available in <a href="https://repo.jellyfin.org/releases/client/android/">our repository</a>.</p></description></item><item><title>Introducing Jellyfin Media Player</title><link>https://jellyfin.org/posts/client-jmp/</link><pubDate>Sun, 18 Apr 2021 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/client-jmp/</guid><description><p>Jellyfin Media Player is a new Jellyfin client option intended to offer a more user-friendly experience. It takes the user interface from jellyfin-web, including the playback interface, and combines it with the extensive codec support from MPV.</p>
<img src="https://jellyfin.org/images/jmp/player.png" name="Player" />
<p>You can <a href="https://github.com/jellyfin/jellyfin-media-player/releases">download the client on GitHub</a>. It is also available on <a href="https://flathub.org/apps/details/com.github.iwalton3.jellyfin-media-player">FlatHub</a> and the <a href="https://aur.archlinux.org/packages/jellyfin-media-player/">AUR</a>.</p>
<h2 id="extensive-feature-set">Extensive Feature Set</h2>
<img src="https://jellyfin.org/images/jmp/config.png" name="Configuration Dialog" />
<p>Building on the open source foundation of Plex Media Player, this client has support for selecting audio devices and configuring audio passthrough. It also supports changing the refresh rate of your display to match the video content. You can control the client with some remote controls, game controllers, and media keys through jellyfin-web’s TV display mode, in addition to remote control through the Jellyfin mobile apps. While testing the client it was known to be controllable with a PS3 controller in TV mode.</p>
<p>Since the media player is built on MPV, the mpv.conf file may be used to install scripts and shaders, as well as for tweaking the playback characteristics to the user’s liking. The software is also known to work with SVP with some tweaking of configuration files.</p>
<h2 id="music-support">Music Support</h2>
<img src="https://jellyfin.org/images/jmp/music.png" name="Music Playback" />
<p>Jellyfin Media Player can also natively play music in addition to videos. Being built on jellyfin-web and implementing player support as plugins, all features of the web client are available as usual, including server management. The client can connect to and switch between multiple separate servers.</p>
<h2 id="extensive-cross-platform-support">Extensive Cross-Platform Support</h2>
<p>Through the help from several community contributions, Jellyfin Media Player now builds for Windows, macOS, and Linux. All release builds are automated through GitHub Actions. Linux users will be happy to know that Debian, Ubuntu, Flatpak, and AUR packages are available. Contributors are already improving the software’s foundation and have gotten it working on Wayland as well.</p></description></item><item><title>A Note About Privacy and Expo for iOS</title><link>https://jellyfin.org/posts/a-note-about-privacy-and-expo/</link><pubDate>Sat, 17 Apr 2021 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/a-note-about-privacy-and-expo/</guid><description><p>When it comes to Jellyfin, we guarantee that there is no involuntary tracking, from the server to the mobile apps. This still remains true, even with today&rsquo;s update to the Apple App Store.</p>
<p>In developing the Jellyfin Mobile app for iOS, we use a Javascript framework known as <a href="https://expo.io">Expo</a>. This framework is an integrated way of using <a href="https://reactnative.dev">React Native</a> to create mobile apps. For a variety of technical reasons, this has been the best way for us to deliver an iOS app, even with its current restrictions.</p>
<p>Starting with an update in December 2020, Apple has required all developers to submit Privacy Information with any new app, or any update to an app. There is an article covering these &ldquo;privacy badges&rdquo; available on Apple&rsquo;s website: &ldquo;<a href="https://support.apple.com/en-ca/HT211970">HT211970 - About privacy information on the App Store&hellip;</a>&rdquo;. As of our last Jellyfin Mobile update, we believed we were in the clear here - the Jellyfin app does not contain any code to track you or report any data. We declared this in our update information, and received the &ldquo;Data Not Collected&rdquo; badge.</p>
<p>However, we learned that Expo has an issue that prevents this from being true. In February, we were contacted by Apple, and received a notice that our badge was incorrect, and needs to be updated. We inquired into this further with Expo, in their forums: &ldquo;<a href="https://forums.expo.io/t/mail-from-app-store-connect-about-facebook-app-events/48927">Mail from App Store Connect about Facebook App Events</a>&rdquo;. When we use Expo to build the app (their &ldquo;managed&rdquo; workflow), their compiler automatically includes base code for a variety of different items, which includes code that can be used to provide analytics and tracking information. Even though we don&rsquo;t use any of these functions, this code is included in the final app binary, so we are now forced to declare that app can access the Device Identifier.</p>
<h2 id="i-want-to-stress-again-we-do-not-track-any-user-activity-or-collect-any-data">I want to stress again: <strong>We do not track any user activity or collect any data.</strong></h2>
<p>You can verify this by reviewing the code base here on GitHub: &ldquo;<a href="https://github.com/jellyfin/jellyfin-expo">jellyfin/jellyfin-expo</a>&rdquo;. Expo&rsquo;s current build process includes code that <em>could</em> be used for tracking, but it is never activated by our code, and we do not use it at all. Because this code is ultimately in the app, we have to update the badge on the App Store listing. As Expo explains on their <a href="https://docs.expo.io/distribution/app-stores/#ios-specific-guidelines">publishing details page</a>:</p>
<blockquote>
<p>Note: No data is sent to Branch, Facebook, Segment, or Amplitude from your app unless you explicitly do so using the APIs.</p>
</blockquote>
<p>In the <a href="https://forums.expo.io/t/mail-from-app-store-connect-about-facebook-app-events/48927">forum thread</a>, Expo has committed to a future update allowing their automated build service to only include the code modules that you actively use, which would allow us to return to the &ldquo;Data Not Collected&rdquo; badge. In an effort to help improve the app and add more features, we are looking to &ldquo;eject&rdquo; from Expo in the future, which means we can completely control the build process by ourselves.</p>
<hr>
<p>Thank you for using Jellyfin and supporting us this far. Our iOS app is largely developed only by one contributor, <a href="https://github.com/thornbill">@thornbill</a>, who gives generously of his spare time to develop the app and make it better all the time. He, along with a few of our <a href="https://github.com/orgs/jellyfin/people">contributors</a> have donation pages setup either through GitHub Sponsors, or other sites like LiberaPay, Patreon and more. If you&rsquo;d like to support any of them, please see their profiles for more information. If you&rsquo;d like to support Jellyfin as a whole (infrastructure and equipment costs only), you can visit our public ledger on <a href="https://opencollective.com/jellyfin">OpenCollective</a>. We&rsquo;re pretty well covered for now, so consider donating to contributors first.</p>
<p>Stay tuned for future posts talking about app updates, how we are committed to protecting privacy with Jellyfin, and on our contributor community, including how you can support them and development.</p>
<p>Best,
Anthony</p></description></item><item><title>The Jellyfin CDN: Mirrorbits for the masses</title><link>https://jellyfin.org/posts/mirrorbits-cdn/</link><pubDate>Mon, 12 Apr 2021 00:00:00 +0000</pubDate><guid>https://jellyfin.org/posts/mirrorbits-cdn/</guid><description><p>For many projects, distributing binary assets is easy: put the files on GitHub and you&rsquo;re done. It&rsquo;s not something many think about. But at Jellyfin, we needed something more robust, something able to handle our needs more elegantly than GitHub or a basic web server could. And both for those interested, and for those supporting other similar projects, I&rsquo;d like to share how we do it.</p>
<h2 id="prelude---pre-1060">Prelude - Pre-10.6.0</h2>
<p>Before our 10.6.0 release, we had a fairly simple repository setup: everything would build on a VPS, running Debian, called <code>build1</code>, in response to a GitHub web-hook. This server, located on Digital Ocean in the Toronto zone, housed both the build process as well as our main repository, served directly via NGiNX.</p>
<p>But this release was the first where we noticed a problem. Jellyfin is a global project, and while I&rsquo;m personally located in Ontario, Canada, the very vast majority of our users are not. And users, especially users in Europe and Asia, were having trouble downloading our releases. The main complaint was abysmally slow download speeds, and occasionally even full-on timeouts. We had to come up with a better solution.</p>
<p>As a DIYer at heart, and leading a project built by and for DIYers, I wasn&rsquo;t content to simply throw CloudFlare in front of the repo - my concerns with that provider notwithstanding. I wanted something we could control, and I went looking for a solution - how to effectively create a CDN for file downloads.</p>
<h2 id="enter-mirrorbits">Enter Mirrorbits</h2>
<p>Luckily, I wasn&rsquo;t alone. Many years before, another FLOSS project had encountered the same problem. VideoLAN, creators of the fantastic VLC Media Player, had the same issue of distributing files. So one of their talented developers created a solution: Mirrorbits.</p>
<p><a href="https://github.com/etix/mirrorbits">Mirrorbits</a> is a Go program with a single goal: provide a way to distribute requests from a single central repository to multiple geo-diverse repositories, based on the client&rsquo;s GeoIP information, handling availability and freshness seamlessly. It seemed to fit the bill exactly.</p>
<p>But there was a problem: documentation on how to actually run Mirrorbits was sparse, so it took quite a bit of trial-and-error to determine how to use it. I hope the following will help avoid this trouble for anyone else.</p>
<h2 id="file-layout">File Layout</h2>
<p>The first thing to consider is the layout of the files. In Jellyfin&rsquo;s case, our repository is large and sprawling, constituting many different components including the server, clients, plugins, and various secondary files. Mirrorbits requires everything to be housed under one directory, and we needed a way to synchronize this whole directory easily. We also had a problem of our &ldquo;archives&rdquo;, old stable releases that we did not need or want synchronized to all of our mirror servers wasting space.</p>
<p>The solution I came up with was the following directory structure:</p>
<pre tabindex="0"><code>/srv/repository
/mirror
/releases
/client
/server
/plugin
etc.
/debian
/dists
/pool
/ubuntu
/dists
/pool
/archive
etc.
/releases --symlink--&gt; /mirror/releases
/debian --symlink--&gt; /mirror/debian
etc.
</code></pre><p>In effect, everything is under a <code>/mirror</code> directory, with external symlinks to provide the root links we wanted.</p>
<h2 id="additional-vpses-and-synchronization">Additional VPSes and Synchronization</h2>
<p>The next step after crafting a usable file layout was to create some additional VPSes and determine how to synchronize the files.</p>
<p>Since our origin server is in Toronto, I wanted to ensure we had wide geographic coverage. as well as a dedicated CDN for the same region as the origin server, just in case it got overloaded. Thus, I created 4 additional VPSes:</p>
<ul>
<li><code>tor1.mirror.jellyfin.org</code>: Toronto, Ontario, Canada for North/South America East</li>
<li><code>sfo1.mirror.jellyfin.org</code>: San Francisco, California, USA for North/South America West</li>
<li><code>fra1.mirror.jellyfin.org</code>: Frankfurt, Germany (not France as commonly assumed!) for Europe and Africa</li>
<li><code>sgp1.mirror.jellyfin.org</code>: Singapore for Asia and Pacific</li>
</ul>
<p>One worry when first setting up these 4 VPSes was that they would not be enough, but so far, through another major release and several minor releases, we&rsquo;ve had the complaints about download speed completely stop, so they must be working. In future, as Digital Ocean expands, we&rsquo;d also be able to add other locations as well, for instance Bangalore, India, Africa, and perhaps additional Europe and South America instances.</p>
<p>With the VPSes created, I then looked into file synchronization, and there was only one program on my mind: <code>rsync</code>. But while most users know <code>rsync</code> for it&rsquo;s <code>scp</code>-replacement functionality over SSH, I wanted something more robust without the need for handling SSH keys, and able to be extended further in the future, perhaps to untrusted (and untrusting) 3rd-party mirrors.</p>
<p>I thus opted to use the <code>rsync</code> daemon mode. Listening on port 873, it&rsquo;s able to do everything <code>rsync</code>-over-SSH can do, only without encryption overhead or requiring SSH/shell authentication.</p>
<p>I first prepared the the local <code>/etc/rsyncd.conf</code> on the origin server (<code>build1</code>). By default, the Debian <code>rsync</code> package does not install the daemon service unless this file exists, but after adding it the daemon can be started.</p>
<p>To handle the aforementioned &ldquo;archives&rdquo;, I split the repository into two &ldquo;components&rdquo;: one with the archives, and one without. This would allow a given mirror to pull either the entire archive, or just the current stable repositories. And once we started offering the &ldquo;unstable&rdquo; builds that can be generated many dozens of times per day, I opted to include them in the &ldquo;archive&rdquo; component as well.</p>
<p>Here is our configuration:</p>
<pre tabindex="0"><code># /etc/rsyncd.conf
[mirror]
path = /srv/repository/mirror
comment = Jellyfin mirror (stable only)
exclude = *unstable* *archive*
[mirror-full]
path = /srv/repository/mirror
comment = Jellyfin mirror (all)
</code></pre><p>In many cases, it would be prudent to secure this, but since we wanted to open this up to anyone, I left the <code>rsync</code> endpoint completely exposed. Thus, if you want to host a local Jellyfin mirror - you can. Simply clone this rsync target and you&rsquo;ll have a full copy of the Jellyfin mirror!</p>
<p>On the mirror servers, we still needed to get the content however. Ultimately, I decided that every &ldquo;official&rdquo; mirror copying the <em>full</em> content (including archives and unstable builds) was more prudent, so all of them synchronize the <code>mirror-full</code> source.</p>
<p>Each node thus has a simple cron job, set to run every 15 minutes, that downloads an updated copy of the repository from the origin:</p>
<pre tabindex="0"><code># /etc/cron.d/mirror-sync
12,27,42,57 * * * * root rsync -au --delete rsync://build1.jellyfin.org/mirror-full/ /srv/repository/mirror/
</code></pre><p>The slightly odd times were chosen specifically - the goal for 3rd parties, if and when we officially support them, would be to synchronize every X minutes on even intervals, e.g. at <code>00</code>, <code>30</code>, etc., from these &ldquo;official&rdquo; mirrors, instead of from build1 directly. This therefore ensures they would always be up-to-date before that time comes around, ensuring no additional delays for 3rd party mirrors. We don&rsquo;t officially support this <em>yet</em>, but if our traffic continues to grow, we will probably expand to 3rd parties as well as additional Digital Ocean locations.</p>
<p>The <code>rsync</code> command should create the destination directory automatically, but to be prudent, I ensured it was created manually first. Thus, we now have 5 servers with exactly the same content, with the mirrors synchronizing from the origin every 15 minutes.</p>
<h2 id="web-server-configuration">Web server Configuration</h2>
<p>From the very beginning we have used NGiNX as the web server. The reasons are simple: maximum configuration flexibility, and performance. Apache has its place, but we didn&rsquo;t need its additional features, and early on budget was tight. I&rsquo;ve been so satisfied with it, I haven&rsquo;t even considered a change.</p>
<p>On the mirrors, the configuration is dead-simple. Only a single &ldquo;site&rdquo; is configured, providing full access to the repository directory. SSL is provided by Let&rsquo;s Encrypt.</p>
<pre tabindex="0"><code># /etc/nginx/sites-enabled/jellyfin-mirror (from fra1.mirror.jellyfin.org)
server {
listen [::]:80 default_server ipv6only=on;
listen 80 default_server;
listen [::]:443 ssl ipv6only=on;
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/fra1.mirror.jellyfin.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/fra1.mirror.jellyfin.org/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
server_name fra1.mirror.jellyfin.org _;
root /srv/repository;
index index.php index.html index.htm;
access_log /var/log/nginx/access.log;
aio threads;
directio 1M;
output_buffers 3 1M;