You're likely in for a treat if you haven't written C# in a while. The language has evolved quite a bit, especially around all kinds of nice ergonomics. Interesting things like pattern matching, using statements, and performance oriented primitives.
I got back to writing C# full time earlier this year and it's a joy.
Lots of reasons, but mainly that I don't consider null values to be a fault of the language. Even if it were, this doesn't solve that problem.
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.
Agreed that Microsoft is adding features for the sake of setting C# apart rather than making it a better language (IMO).
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).
The question mark to denote a nullable type is inherited from the .net framework days. You'd use that to mark a value type as nullable, which is syntactic sugar for Nullable<T>. Internally, that object stores a bool for IsNull and it packs your value into an Object. When dealing with value types, this results in a copy-by-value every time you access it, which is bad in most cases.
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
I must admit to disliking C#'s functional libraries. I have wasted so much time trying to get the buggers into a pipeline. It becomes agonising in a way that doing the same thing in Scala was so very much a dream. I keep discovering the hard way, just don't do it (or just get a whole lot more experienced at it, although I don't know how without going through the pain barrier, and deeper each time, like Inception).
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.
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
I looked at adding a much-requested and not-that-hard-to-add feature a while back (allowlist-by-tag), got as far as figuring out where to add it in the server code… but bailed when I realized I’d need to shepherd PRs through at least two repos to get the feature delivered, while juggling both repos to do integration testing. Monorepos for tightly-coupled code are so nice…
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.
They’re a decent bandaid for a company already suffering from multiple-reposis. Cross-repo changes, stacked PRs. It’s not the ideal starting point but it’s less pain than the status quo.
Fwiw, Plex parental controls are absurdly flexible.
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
> every time I acquire a new episode of bluey or something, my wife wants to watch it first
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.
Is it possible to automate that via webhook or something similar? You could have whatever media acquisition program you use set that tag, and then remove it whenever you're done. Would eliminate 50% of the steps, until more granular abilities are added
I believe there's an API and I could maintain a microservice to do that for me, but there are probably a bunch of people who want a similar feature and don't want to have to run a microservice to achieve it.
I was frustrated about the allow-list for the longest time but someone on Reddit showed me how you can do allow-list on Plex. I forget the terminology (and you have to be careful because there are both tags and labels, I had been trying the wrong one) but you basically create a label and set the children accounts to only see content tagged with that label.
As a developer who only works on Linux systems, how is the dev story for C#? I guess Mono is still a thing, and that's the runtime that C# projects use to run, right?
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.
It's a little funky on Arch to get it installed and with the death of Mono the only option for IDE is microsoft's closed version of vs code as the c# plugin doesn't work on vscodium. (And much like Java, lots of C# language design assumes you're using an IDE).
They do but it's not as smooth as rust or Python. It is obvious that not many people use neovim or similar editors. Like, last time I used it Microsoft broke their own LSP protocol and fixed it in the vscode extension.
C# on Linux is only slightly more annoying than Windows. You have to make some effort to install the SDKs and naturally some of the system APIs behave slightly differently, but overall I have only a very slight preference for windows here.
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
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
It's just .NET now, without the Core part. Mono remains a runtime flavour for special targets but it's being slowly phased out in favour of CLR even on those special targets (for example iOS which has historically relied on MonoAOT, but now can be targeted with NativeAOT too).
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.
Also Mono and the rest of .NET are in the same open source repositories today and it isn't as much a case of replacement as a proper code refactor and merge over the course of the last several years (by both Microsoft and a large open source community).
C# runs natively on Linux (have done for many years now). AFAIK even on Azure people prefer to run it on Linux machines (including the place I work for). Performance wise I believe it runs equal to faster. A lot of C# devs (majority) now work on none Windows machines (they were very quick to add support for the new Mac arch as well).
TLDR; C# the language is as good or even better on none-Windows nowadays.
CLI is one of my biggest pain points with C# on Linux. A lot of the Console functions simply don't work because they're expecting an entirely different kind of console. Just clearing the screen doesn't work, you have to sneakily pass a "clear" string to the input stream, or something like that.
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 :(
To be fair, the only real good solution that works for native crossplat GUI applications is Flutter. Most other offerings always end up being worse one way or another than Avalonia/MAUI/Uno.
I just took a look at their GitHub repos, and the main one has 90+ PRs open for some for over 8 months with no feedback. What is the point of this call to action if the current team can't handle the current PR volume? As it stands more PRs won't help the project.
I didn’t know they needed developers. I’m an avid Plex user but C# developer by trade. Cloned the server and web projects and worked on my first issue!
Are the existing clients that bad? I tried one years ago, and I didn’t have any issue with the Jellyfin client. I only stopped using Jellyfin because Locast was killed off and that was my main thing I was doing with it.
I've been using Swiftfin since I got an Apple TV, and it's... okay. Lacks a lot of sorting/filtering options, gets janky and starts loading movie cards in the wrong place if you scroll too fast, and sometimes stops updating the progress bar for the rest of the movie if you pause it, but it's still useable enough.
I really want to use Jellyfin. I made the switch a while ago, but I went back to Plex once I found out that many of Jellyfin's APIs are unauthenticated, including video streams!
It seemed too risky to expose Jellyfin to the web.
Hopefully chromecast functionality for Jellyfin iOS finally gets developed, that's literally the only reason I use Plex instead of Jellyfin. It'd be great if someone with chromecast API skills hopped in and helped the team out!
Best option right now is to have separate libraries. Adult accounts (password protected) see all libraries, kid accounts only see kid libraries.
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)
It is a bit funny to me that reading this, I can only guess that Jellyfin is a... Plex clone? I guess the writer assumes I already know about/want to improve the product which IS its intended audience, but coming from HN I'm just like what... is... it...
That’s just the nature of HN, you can post absolutely any link on here and I don’t think it’s reasonable to expect a blog post author to accommodate someone arriving on the page with zero context.
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.
Jellyfin is a fork of Emby, that happened when emby close-sourced a bunch of things and pissed everyone off.
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.
You're confusing Hacker News with your chat application or your e-mail. Links posted here are not specifically directed towards you as an individual, they're for the general public to reflect on.
Around a year ago I jumped in, picked up some tasks, submitted one or two PRs to fix where exceptions were being used for flow control, basic stuff to give the maintainers confidence that I could contribute. All they did was say those exceptions -- which happen every time the app starts -- don't need to be fixed.
A bit of a turn off for wanting to help on the project....
I don't know the full context of the situation, but when you have a limited amount of time to tend to PRs, it doesn't make sense to review non functional changes. It also depends on what their testing situation is like. Are they relying on their canary users to report issues, or do they have integration tests?
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.
Sorry for the rant, but as someone who has used Jellyfin and similar apps like Kodi, I have to say I find their code quality and general software architecture to be crap. I wish there was a good alternative. A few examples:
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.
Not sure about code quality (what I’ve seen of Jellyfin seems fine-ish?) but I can attest that I tried probably a half-dozen times over a span of years (from when it was still XBMC, up to about 3-4 years ago) to use Kodi, and I don’t think my watching:screwing-with-the-system ratio ever got much better than 1:1, and nobody else around would use it, after perhaps a tentative and disastrous initial attempt.
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)
I agree, Kodi requires constant maintenance and tweaking. Jellyfin seems better overall(?) But I'm really frustrated with this transcoding issue. Or the fact it's incapable of DTS 5.1 passthrough on GCCWGTV (even their site https://jellyfin.org/docs/general/clients/codec-support/ says Jellyfin has been tested with DTS mono only, not DTS 5.1).
So I have an Apple TV 4K, but I don't use the official client. I use Infuse.
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.
Probably? I’ve got and have watched a lot of stuff, and have a reeeaaallly big screen so favor files large enough that including raw audio streams from the source is fairly common.
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.
Scrape with tinymediamanager. Make kodi use local info only (jpg/nfo files in movie folders - scraped by tmm). New stuff goes into a todo folder, scrape new files from the todo folder and then move it to the movie/tvshow folder.
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 do not understand why anyone uses Jellyfin, I've tried it twice, and it seems soo finicky and opinionated.
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.
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.
12 years ago me and my then girlfriend used to torrent a USB pen drive full of the series and movies we wanted to watch and just plug it into a Sony TV and watch. Including subtitles when we wanted. You could put that USB pen drive in your pocket to continue watching at a friends house.
20 years ago, we'd connect any PC or Mac to the TV with HDMI and watch a movie or whatever we wanted.
To me it seems to be much more trouble than it's worth. Setting up a server and installing clients, pirating a bunch of content to put on your server. Then using the client to download files since you won't have signal (how is the tether going to have any signal?). I guess it's fun for hackers to tinker with this stuff, but just putting the file on the device like we did 12 years ago seems much easier.
> To me it seems to be much more trouble than it's worth.
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.
The only additional step is installing a server application, you would probably have installed VLC or something to use anyway on the client. Having a box to store your stuff, ripping or downloading to it is still the same regardless of installing a client or not.
> 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.
What I mean with signal for the tether is that in the example of watching stuff on an iPad in the car, you'll probably be in places where there is no signal and then it doesn't matter if the chip is in the iPad or in your phone – you still can't get signal.
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.
Or you could purchase inFuse, point it to a Samba server and literally walk away and be done. They even support connecting to a Jellyfin backend. Paying for commercial software that works out of the box, I know, the horror, I'm literally shaking.
An actual metadata-aware browsing system that works from my couch, controlled by an ordinary remote or by my phone, is great, too. “Sort by release year” or “what else do I have by this director?” work seamlessly.
Jellyfin lets me flexibly provide whatever video/music content I want to my family.
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.
Do you live with non-technical people or have visitors to your house? I have a kid and a wife who isn’t as nerdy as I am. Plex just works. I can show a babysitter or a grandparent how to use it in about a minute. Can’t say the same for a Linux box, as much as I’d love for that to be the solution.
Hooking the video out of a computer to a TV isn't the only use case. Once you can stream to any device and multiples of them, transcoding on the fly, with a good UX that saves your spot and tells you what's new with artwork and what seasons or special cuts are available, each attached to user profiles for multiple people, with good search including in metadata, and toss in the ability to download subtitles on demand and whatever else, you will be well on your way to reinventing Jellyfin and other plex-alikes!
I understand favoring simplicity for a simple use case, but it obviously doesn't scratch every itch.
There’s little benefit if you’re the only one using it and are happy with it. Aside from TV-attached PCs sometimes being a lot fiddlier at providing fully-correct video and audio output than dedicated streaming boxes.
There are tons of benefits to Jellyfin if other people use your set-up.
I agree. Media specific OSes are just okay but I have no problem about plugging my laptop into an HDMI cable to watch something. I have no anxiety about how a laptop sitting on a tv stand will look.
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.
The abstraction between the two is a very minimal difference. My point stands is that as far as how things are controlled is a minimal issue. Streaming to multiple devices, library access, and age gates are nice features but they’re all mostly unnecessary and born out of the anxiety that the laptop connected to an HDMI port isn’t good enough.
I don’t think anyone is using Jellyfin because they have anxiety about what their laptop looks like on a TV stand.
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.
because it's easy for the end users. which is probably the most important feature rather than ease of control for devs. This has often been my experience in most things. They seem to be optimized for the end user and not the configurator.
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.
In the USA it is definitely not legal to rip any physical media that has any DRM, which is practically all DVDs and Bluray movies (because of the DMCA). But I think you'd be hard-pressed to find anyone with a moral stance against doing so.
Breaking DRM to rip physical media isn't legal in basically any mainstream country in the world (since membership of the WTO requires you to pass an anti-circumvention law).
Heck, in major nations (like the UK) ripping unencrypted media isn't legal.
My understanding is that the librarian of Congress has granted an exemption to the DMCA anti-circumvention clause to allow ripping DVDs for non-infringing fair use purposes, including personal backups.
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