A Call for Developers – Jellyfin
jellyfin.org
jellyfin.org
I started my career as a C# dev, but now I only write C++. I miss C# dearly and have been badly wanting a project to flex those muscles on.
I guess I'll dive into jellyfin now. I've got a list of annoyances and now that I know it's C#, I'm ready to get fixing
I got back to writing C# full time earlier this year and it's a joy.
Maybe I'm just yelling at clouds, but I see more bloat than useful features recently.
Non-nullable reference types as default was a bad idea and I will die on this hill
Why?
But now we're in a situation where we still have nulls, but compiler warnings force us to decorate them and treat them the same as before. It obscures the difference between value and reference types. Plus the syntax implies Nullable<T>, which is something everyone should have learned to avoid when all it did was box value types.
The more correct solution would have been to finish the contract system that allowed you to declare a function argument as non-nullable.
Ultimately I think it was the wrong solution to something that wasn't a problem to begin with. Now we have muddied the syntax and the null situation is the same as it always has been.
I strongly disagree about the treatment of null values, if there's one thing I like about C# it's that (even if it's crude, it's better than Scala's way of doing it which is Maybe or Option or something, sorry, it's been a while.) Also C# doesn't 'force' you, you have to require it before it enforces no-nulls.
> It obscures the difference between value and reference types
How, and how is that a problem?
> Plus the syntax implies Nullable<T>, which is something everyone should have learned to avoid when all it did was box value types.
Err, now I'm getting really rusty. What are you saying here?
> The more correct solution would have been to finish the contract system that allowed you to declare a function argument as non-nullable.
That's effectively what the no-null enforcement does, only it applies inside a function as well (if you make it do so anyway).
I completely disagree that it "wasn't a problem to begin with" .Hoare called it his billion-dollar mistake, and that's an underestimate. And we haven't muddied the syntax because you enable no-nulls with a pragma, and the null situation is definitely not the same as it has always been. The compiler picks them up and reports them (like I said, rather crappily but it's a damn sight better than nothing).
I don't like this solution because it reuses something that I've learned is a Bad Thing. Though I'm sure the current implementation just stores a reference to the object in question.
But fundamentally, I think nulls are a good thing. Null carries information. If C/++ can handle null pointers for the last 40 years, I think C# can handle it. But then again, maybe this is a problem domain that I've just never encountered. The only problems I have with nulls is around ergonomics, but the null coalescing and safe access operators solve that for the most part. Maybe it's a bigger problem at scale, I really wouldn't know. At the scale I operate at, non-nullable reference types causes more headache than it solves problems
Could you give me a hint about these 'performance oriented primitives' please? (The only ones I can think of are structs versus classes) Edit: but isn't there a new thing where you can subtype a class without allocations, like Scala's record classes, or is that new in Java, can't remember.
In the example in the blogpost (Chromecast support), in the issue I was asking a bit about how I could help implement the feature (https://github.com/jellyfin/Swiftfin/issues/271#issuecomment...).
Even if there’s nothing I could have productively done to contribute to that feature, I would absolutely have gone to those getting started features.
So, I’d encourage the team to have a pretty quick hand in issues when people are asking to help to link to this blog post and getting started resources.
Finally, none of this is in anyway a criticism of how any interaction was handled. I super appreciate everyone that works on Jellyfin, and I know onboarding developers can often feel like/be more work than not. Just a suggestion for a good spot to add some CTA links that I think would convert reasonably well
Maybe I’ll give it another look.
[edit] incidentally, allowlist-based parental controls are one of the best tools to have, and basically nothing supports them, which is really frustrating.
Hell it probably sucks for them too, but they’ve gotten used to the suck and forgot about it.
Checkout Sapling and ReviewStack. They look promising.
I have it set up so the kids account can only watch things that have been given a particular tag. Due to how granular Plex tags are, this means you can give them a whole movie or TV show, some of a TV show, or a single episode
As it is right now, they have access to a reasonably large corpus of content, but nothing new; every time I acquire a new episode of bluey or something, my wife wants to watch it first. We basically always approve it, since we aren't that likely to object to most things you'd find in a kids show, but it's nice to have the peace of mind
I wish Jellyfin had something similar, as my current process involves manually tagging things with a tag that isn't visible, then removing that tag once I've reviewed it.
I've always felt that C# felt a bit out of place when not in a Windows system, but maybe I've been always wrong. Never had the opportunity (or need) to use it at work, so I'm pretty ignorant of how it behaves and how good the tooling is to write it from Mac or Linux.
OTOH I've read multiple times that it's a nicer Java and F# seems to be well liked around here, too.
But apart from that for a web app it's fine.
[1] https://github.com/OmniSharp/omnisharp-roslyn
[2] https://github.com/OmniSharp/csharp-language-server-protocol
Mono does still exist, but since like 2015 or so C# has been supported natively on Linux. No one really uses mono anymore AFAIK. Its only purpose is running dotnet framework apps as opposed to dotnet core
Once complete you will have the best linux environment to develop on :)
I do happen to like both PHP and Powershell (and C#)
I like the syntax, I like the languages.
I find Bash, python, and other "traditional" linux admin tools to be harder to use. Bash especially, I hate dealing with text streams, i would much rather pass objects around
And honestly, if that post IS the worst, this must be your first page on this website.
Also, I'd really love if people stopped exclusively attributing .NET's progress to Microsoft. Yes, MSFT does the steering and funding, and employs teams working on the ecosystem, but the development happens in the open, and a lot of runtime improvements have been community contributions.
It's fantastic and it runs natively on Linux.
Mono is still around and used for some niche use cases(WASM, interpreter, etc).
TLDR; C# the language is as good or even better on none-Windows nowadays.
But for backend and CLI stuff totally agree, works great on Linux
It is also true for GUIs if you're using Avalonia [0]. I use it to develop GUI apps on Linux, it works very well (Nothing I can show publicly, sadly).
Obviously it doesn't use native controls, but it is a solid GUI framework.
Console drawing is an enormous pain. I went to a lot of effort to optimize my console writes to construct graphics quickly, and it just does not work on Linux. I'd have to switch to a curses type library and it just makes me sad :(
A rather trivial PR for it is open since Feb 2023 with no addressable feedback: https://github.com/jellyfin/jellyfin/pull/9291
I guess the easier term could be: Hacktember.
I use it, it's fine.
It seemed too risky to expose Jellyfin to the web.
Exploring other options now, in particular emby.
It’s not great, having to SSH into the server and move files around as the kids get older. Works, but isn’t ideal. Really ugly results in some interfaces, but others (infuse IIRC?) at least provide combined “movie” and “tv” categories so you don’t have to try to remember which library some on-the-line film is in.
There are other approaches but they’re worse (more time-consuming and prone to letting things slip through)
The Jellyfin blog achieves one important criteria: when you click the logo at the top it takes you to the actual homepage, rather than a blog homepage. So if you want content on what Jellyfin is it’s only one click away.
It's not really a plex clone inasmuch as it's a truly self-hosted alternative, given that plex uses centralized auth (aka you're possibly back to VLC if your internet is out).
I've used Jellyfin for years now, hasn't really skipped a beat aside from dumping the entire library DB when it started without the library storage spun up, and even that was just a rescan overnight and everything was back and happy.
A bit of a turn off for wanting to help on the project....
There's also stuff like Hacktoberfest which used to encourage pointless PRs, and MOOCs or real courses which involve submitting PRs that often have no actual value to the project, which makes maintainers wary.
If anything it would make more sense to do it the other way around - make something useful, then once you are "in" they can wave through your non functional changes without much thought.
I have installed the Jellyfin server on a Linux box, and the Jellyfin app on a playback device (Google Chromecast with Google TV, GCCWGTV). When the app detects the playback device or TV doesn't support, say, the 7.1 Dolby audio stream in the media file being played, it asks the server to transcode the media to something it supports (eg. stereo audio). But while doing so, it transcodes both video and audio, forcibly, even though it's only the audio track that's causing the problem. The server is forced to transcode on-the-fly a perfectly supported H.264 stream to... another H.264 stream of the same bitrate, while this could be avoided... facepalm In theory this is rather simple to fix, as the Jellyfin server is built on ffmpeg, and ffmpeg is perfectly capable of leaving the video stream unmodified while transcoding only the audio stream. But the fact the developer(s) chose to implement it this inefficiently doesn't give me much confidence in the rest of their architectural choices. Maybe this inefficiency was inherited when they forked Emby, so in that case redirect my rant toward Emby :-)
Another issue with Jellyfin is it is incapable of DTS 5.1 passthrough. DTS stereo passthrough works. Dolby 5.1 passthrough works. But not DTS 5.1 passthrough. At least on GCCWGTV. That boggles my mind, given DTS 5.1 is so ubiquitous. So because Jellyfin doesn't do DTS 5.1 passthrough, I must transcode to stereo. And because it must transcode the audio, it must also transcode the video (see above), taxing heavily my server CPU whenever it's playing media.
I have also experimented with Kodi. Something in the scrapers breaks every 6 months. And for everyone who knows the scrapers are primordial in a nice user experience in Kodi. But for some reason, in Kodi, scrapers are not first-party components. They are third-party poorly-maintained junk that seems developed by random people exchanging source code patches on the kodi web forums. Like the Universal Movie Scraper code trying to pull the movie title and description and actors from IMDB. Guess how this is implemented? By some hot garbage of XML file hundreds of lines long, containing regexes that have to be entity-encoded by hand when edited. What is this? The 2000s? I get it, that IMDB disallows "scraping" in their ToS, so Kodi doesn't want to include scraping code in their codebase, but that doesn't justify the low code quality found in scrapers. Use an actual language (Python, C#, anything) with an HTML parsing library, not some junk regexes.
I hate to sound so negative, in the end I'm still grateful for these apps which are open source and free, developed by unpaid volunteers. So, thanks, but man, I get frustrated with low code quality.
I’ve been using Jellyfin for about three years. Spouse, kids, and friends use it without difficulty. My watching:working ratio is probably like 50:1 (mine personally, not combined for all users) or better, and I don’t do it all on easy mode (I’m including time learning and administrating ZFS pools, for instance)
My server’s too weak to transcode more than about DVD resolution videos at live-video speeds, is why I have to do it that way.
The Apple TV 4K does not support DTS passthrough, but Infuse will decode DTS on the device itself and pass it through to the receiver as uncompressed lossless multi-channel LPCM. I.e. the server is not transcoding in any capacity
The biggest hurdle for Plex, Jellyfin, etc is the variability of the devices and the nuances around what they do and don't support codec wise. Your experience with GTVWCC does surprise me, though. What should be happening is "Direct stream", where it transcodes the audio and just "repackages" the video.
I just tested in Firefox w/ a video that has 5.1 DTS audio. It transcoded the audio but just repackaged the video. It does seem to have done it all at once though, so the CPU was pegged for about 2 minutes while it transcoded the full 2h30m DTS track. Afterwards CPU was idle while still watching.
Lemme check my watched-videos…
Got one I must have watched at DTS-HD 5.1. But maybe the “HD” makes a difference.
Oh, here, DTS 5.1, no HD. This one definitely worked, I watched it like a month ago. Only audio track available on this video, so no chance I used a different one.
I’ve run into exactly one problem with my set-up, and I think it was some bad interaction between a particular frame-rate/resolution combo and my projector. Temporarily tweaking a tvOS setting (telling it not to switch video output to match sources) fixed it. Only seen it happen one time.
I do have a 7.1 audio receiver. Dunno if that matters for reproducing the issue.
Use MariaDB if you desire multiple device sync of watched and rated stuff.
This is a week old setup I guided a friend to do on the NAS.
I've always just had a Linux computer hooked up to the T.V. Add a little bit of ktorrent, VLC, and SMB. Never really had any problems with this and its much much simpler.
Multiple users, multiple locations, one setup. That's the value.
Both my non-tech wife and my four year old have figured out how to watch things. Which, is, my point. VLC, a directory browser, and ktorrent suite our needs so perfectly. Admittedly, the four year old hasn't figured out how to download torrents yet; but for my wife it was super simple to explain: "goto this website, search for desired show, only download from purple or green pirates."
My setup is slightly more complicated than I let on in the first post. We have multiple TVs, each hooked to a linux laptop (lenovo T430s, because I had one and the rest were cheap on ebay.). Then there's a NAS with SMB. All media is downloaded to the NAS, any T.V. can watch any downloaded media.
20 years ago, we'd connect any PC or Mac to the TV with HDMI and watch a movie or whatever we wanted.
All these media clients support downloading too for offline usage.
I'm glad that use case works for you. However, an inability to imagine a usecase where that could be of value than shitting on people who say they have that use case isn't a great look.
I meets the needs of my usecase and my family. We were using plex before but since it required central login for of network use it has been on the deprecation list for me. But the exact solution is not relevant to the need and use case that makes the quite a bit less work than other options for us.
I spend quite a bit of time with my family moving between locations so, yes we have internet for that. The timing isn't always pre-planned so offline media consumption can be tough. Additionally, we may leave with a couple hours notice and spend a week or more before we come home. In which case, we'll stream media from a different location than our primary residence.
Additionally, we record/watch things off our digital tv antenna to stream when we are out of range. Which gets a little tougher for a generic fileserver.
So for us, it's quite a bit less trouble than it's worth. It's all the same things that setting up a local media setup involves with the addition of an authenticated streaming frontend that can be setup to work with multiple clients in multiple locations and multiple times.
> how is the tether going to have any signal?
I have a phone plan? Your decisions would be different if you have different requirements and restrictions.
It's not like any of this requires expensive hardware, Intel Quicksync is on my £75 Wyse thin client acting as the server and can transcode perfectly for an iPhone/Android TV/etc.
Secondly, it isn't only doing those duties. It's also hooked up to stream TV so if I remember something I want to watch later it will record, and if I'm having to wait and there is nothing to read I can watch a show.
Can't do that with "putting files on a device".
But I'm probably not the intended user for these self hosted media servers. I don't watch a ton of stuff, and what I watch is generally on YouTube.
In an interface that is basically "Netflix" - so they can actually figure out how to use it.
You just listed like 4 applications, a linux box, and physical cables as your requirements. That is not a workable starting point for that discussion.
My requirements are "Go to jellyfin.[mydomain]" and log in. It works basically everywhere (I am currently watching content from my jellyfin server while on vacation in a different state as I type this).
Basically - you are optimizing for "low setup cost" as an admin. Jellyfin is optimizing for the entire group of people who will watch your content as users.
As an aside... Sonarr/Radarr/Jellyfin are just a different league than the old school "I'll download every episode myself" time sink. It takes some genuine effort to setup, and then everything is way better.
I understand favoring simplicity for a simple use case, but it obviously doesn't scratch every itch.
If you have more than one TV it's nice to use a cheap android TV device set up to connect to jellyfin on each rather than move your laptop around.
It's also good for a road warrior. I can VPN to my house and steam elsewhere, and it does transcoding on the fly so it works over bad connections too.
And if you want to use VLC or whatever you can still use the web UI to find the media you want and download it.
There are tons of benefits to Jellyfin if other people use your set-up.
Ignoring physical appearances, it presents large libraries nicely and allows you to use your phone or remote instead of needing to fiddle with a laptop.
A few other nice features: can stream different content to multiple devices, users can be given access to specific libraries, and content can be age gated.
My whole family uses Plex, they can operate it incredibly simply with a remote and don’t have to unplug and replug a thing. The simplicity is key, if you’re only catering for yourself/an exclusively techie audience then it’s not necessary.
You're thinking something like XMBC...
Jellyfin is more equivalent to a streaming app - but the backend is running in your private server.
Clients are available for the vast majority of consumer TV oses (Roku/Apple/AndroidTV/Web/Etc)
They're a pirate media app, like Plex. But the MOMENT you say that a thing doesn't work and they ask for examples, you're booted if you say it was this or that show.
Face it, this isn't for home movies. This is for bulk piracy loaded in from the Arrs suite. The more they are truthful with themselves with that, the better they'll succeed.
You can still buy physical media, and if you own that media, it’s totally legal to rip to digital storage.
Heck, in major nations (like the UK) ripping unencrypted media isn't legal.
I am not a lawyer, though.
https://www.govinfo.gov/content/pkg/FR-2021-10-28/pdf/2021-2...
There were campaigners asking for one but it wasn't given.