Hey all! Things are changing with my plugins are more and more people start to use them and report issues. In order to make it easier for me to manage I'm splitting bugs and features into different areas. For feature requests please head over to https://features.iamparadox.dev/ where you'll be able to signin with GitHub and make a feature request. For bugs please report them on the relevant GitHub repo and they will be added to the project board when I've seen them. I've found myself struggling to know when issues are made and such recently so I'm also planning to create a system that will monitor a particular view for new issues that come up and send me a notification which should hopefully allow me to keep more up to date and act faster on various issues.
As with a lot of devs, I am very momentum based in my personal life coding and there are often times when these projects may appear dormant, I assure you now that I don't plan to let these projects go stale for a long time, there just might be times where there isn't an update or response for a couple weeks, but I'll try to keep that better than it has been. With all new releases to Jellyfin I will be updating as soon as possible, I have already made a start on 10.11.0 and will release an update to my plugins hopefully not long after that version is officially released!
Home Screen Sections (HSS) is a Jellyfin plugin which allows users to update their web client's home screen to be a bit more dynamic and more "Netflixy".
A lot of the sections included are the base sections that would appear in a vanilla instance of Jellyfin. This has been done because using HSS hasn't been integrated to work side by side with the vanilla home screen and instead wholesale replaces it. Since a lot of the sections are useful and contain everything you'd want in a home screen they've been included for convenience.
NOTE: Its worth noting that the sections that have been created are one's that I myself use for my own instance, if there is a section that's missing/you'd like to request, you can open a feature request on my features dashboard: https://features.iamparadox.dev/ or implement it yourself and open a PR to have it merged or create a plugin that is integrated with this one (see below)!
These vanilla sections are listed here:
The sections that are new for this plugin (and most likely the reason you would use this plugin in the first place) are outlined here:
Latest Movies/TV Shows
Because You Watched
Watch Again
Genre
Discover
My Requests
Upcoming
10.10.7, with 10.11.x also officially supported.https://www.iamparadox.dev/jellyfin/plugins/manifest.json to your plugin repositories.Home Screen Sections from the Catalogue.If you find an issue with any of the sections or usage of the plugin, please open an issue on GitHub.
The likelihood is the plugin hasn't been updated for that version of Jellyfin and the plugins are strictly 1 version compatible. Please wait until an update has been pushed. If you can see the version number in the release assets then please make an issue, but if its not in the assets, please wait. I know Jellyfin has updated, I'll update when I can.
This is common, particularly on a fresh install. The first thing you should try is the following
The easiest way to confirm whether the user is using the modular home settings is to check whether the movie posters are portrait or landscape. Due to how the cards are delivered from the backend all cards are forced to be landscape
If you would like to help translate this plugin into your language, follow the below steps:
The plugin is setup to support language codes and language + region codes. Please use the ISO 639-1 language codes for file names. If you're including region code as well please format as en-GB where region codes are from ISO 3166.
If you need to add a genre to the translation list, please add it at the bottom of the language file (below the line break) with the below rules:
GenreName (e.g. SciFi or GameShow instead of Sci-Fi or Game Show)<Genre> Movies please add the key in the format <Genre>Movies (without the angle brackets) to the very bottom of the file.
de.json for an example with "ComedyMovies"[!NOTE]
The initial translations were generated using AI and may not be perfect. If you find any issues with the translations, please feel free to open a PR to resolve them; I am unfortunately very monolingual, so I won't be able to spot any issues myself.
src/Jellyfin.Plugin.HomeScreenSections/_LocalizationYou're more than welcome to contribute to this plugin in any way that betters it, whether that's new sections or bug/performance fixes! I only ask that you follow the same code style as myself. A few points to note:
var unless you have to due to differing namespaces between JF versions (honestly, I'm not going to gripe for the odd one, but it's good to try at least)As a general rule of thumb, please try to blend in with the codebase, I use a mutated hungarian notation for my coding style, I will ask for this to be followed.
After following these guidelines, please create a pull request and I'll review it as soon as I can. For more complex changes, I may ask you to rebase to the experimental branch to give it extra testing before it gets merged across.
Please declare your AI usage, if any, and if you have used AI for your change, please also declare your coding experience without AI. This won't impact whether the change is merged, it will allow me to properly and correctly review the change to ensure that nothing slips through the net.
This is great an' all but I want a section that doesn't exist here. Can I make one?
Yep! Home Screen Sections exposes a static interface which can be used to register sections.
Due to issues with Jellyfin's plugins being loaded into different load contexts this cannot be referenced directly. Instead you can use reflection to invoke the plugin directly to register your section.
{
"id": "00000000-0000-0000-0000-000000000000", // Guid
"displayText": "", // What text should be displayed by default for your section
"limit": 1, // The number of times this section can appear up to
"route": "", // The route that should be linked on the section header, if applicable
"additionalData": "", // Any accompanying data you want sent to your results handler
"resultsAssembly": GetType().Assembly.FullName, // Example value is a string from C# that should be resolved before adding to json
"resultsClass": "", // The name of the class that should be invoked from the above assembly
"resultsMethod": "" // The name of the function that should be invoked from the above class
}
Assembly? homeScreenSectionsAssembly =
AssemblyLoadContext.All.SelectMany(x => x.Assemblies).FirstOrDefault(x =>
x.FullName?.Contains(".HomeScreenSections") ?? false);
if (homeScreenSectionsAssembly != null)
{
Type? pluginInterfaceType = homeScreenSectionsAssembly.GetType("Jellyfin.Plugin.HomeScreenSections.PluginInterface");
if (pluginInterfaceType != null)
{
pluginInterfaceType.GetMethod("RegisterSection")?.Invoke(null, new object?[] { payload });
}
}
When your section results method is invoked you will receive an object representing the following json format (it will try to serialize it to the type you specify in the signature)
{
"UserId": "", // The GUID of the user that is requesting the section
"AdditionalData": "" // The additional data you sent in the registration
}
You must make sure that your section results method returns a QueryResult<BaseItemDto>.
C#
73.5%
HTML
17.4%
JavaScript
8.5%
Hey all! Things are changing with my plugins are more and more people start to use them and report issues. In order to make it easier for me to manage I'm splitting bugs and features into different areas. For feature requests please head over to https://features.iamparadox.dev/ where you'll be able to signin with GitHub and make a feature request. For bugs please report them on the relevant GitHub repo and they will be added to the project board when I've seen them. I've found myself struggling to know when issues are made and such recently so I'm also planning to create a system that will monitor a particular view for new issues that come up and send me a notification which should hopefully allow me to keep more up to date and act faster on various issues.
As with a lot of devs, I am very momentum based in my personal life coding and there are often times when these projects may appear dormant, I assure you now that I don't plan to let these projects go stale for a long time, there just might be times where there isn't an update or response for a couple weeks, but I'll try to keep that better than it has been. With all new releases to Jellyfin I will be updating as soon as possible, I have already made a start on 10.11.0 and will release an update to my plugins hopefully not long after that version is officially released!
Home Screen Sections (HSS) is a Jellyfin plugin which allows users to update their web client's home screen to be a bit more dynamic and more "Netflixy".
A lot of the sections included are the base sections that would appear in a vanilla instance of Jellyfin. This has been done because using HSS hasn't been integrated to work side by side with the vanilla home screen and instead wholesale replaces it. Since a lot of the sections are useful and contain everything you'd want in a home screen they've been included for convenience.
NOTE: Its worth noting that the sections that have been created are one's that I myself use for my own instance, if there is a section that's missing/you'd like to request, you can open a feature request on my features dashboard: https://features.iamparadox.dev/ or implement it yourself and open a PR to have it merged or create a plugin that is integrated with this one (see below)!
These vanilla sections are listed here:
The sections that are new for this plugin (and most likely the reason you would use this plugin in the first place) are outlined here:
Latest Movies/TV Shows
Because You Watched
Watch Again
Genre
Discover
My Requests
Upcoming
10.10.7, with 10.11.x also officially supported.https://www.iamparadox.dev/jellyfin/plugins/manifest.json to your plugin repositories.Home Screen Sections from the Catalogue.If you find an issue with any of the sections or usage of the plugin, please open an issue on GitHub.
The likelihood is the plugin hasn't been updated for that version of Jellyfin and the plugins are strictly 1 version compatible. Please wait until an update has been pushed. If you can see the version number in the release assets then please make an issue, but if its not in the assets, please wait. I know Jellyfin has updated, I'll update when I can.
This is common, particularly on a fresh install. The first thing you should try is the following
The easiest way to confirm whether the user is using the modular home settings is to check whether the movie posters are portrait or landscape. Due to how the cards are delivered from the backend all cards are forced to be landscape
If you would like to help translate this plugin into your language, follow the below steps:
The plugin is setup to support language codes and language + region codes. Please use the ISO 639-1 language codes for file names. If you're including region code as well please format as en-GB where region codes are from ISO 3166.
If you need to add a genre to the translation list, please add it at the bottom of the language file (below the line break) with the below rules:
GenreName (e.g. SciFi or GameShow instead of Sci-Fi or Game Show)<Genre> Movies please add the key in the format <Genre>Movies (without the angle brackets) to the very bottom of the file.
de.json for an example with "ComedyMovies"[!NOTE]
The initial translations were generated using AI and may not be perfect. If you find any issues with the translations, please feel free to open a PR to resolve them; I am unfortunately very monolingual, so I won't be able to spot any issues myself.
src/Jellyfin.Plugin.HomeScreenSections/_LocalizationYou're more than welcome to contribute to this plugin in any way that betters it, whether that's new sections or bug/performance fixes! I only ask that you follow the same code style as myself. A few points to note:
var unless you have to due to differing namespaces between JF versions (honestly, I'm not going to gripe for the odd one, but it's good to try at least)As a general rule of thumb, please try to blend in with the codebase, I use a mutated hungarian notation for my coding style, I will ask for this to be followed.
After following these guidelines, please create a pull request and I'll review it as soon as I can. For more complex changes, I may ask you to rebase to the experimental branch to give it extra testing before it gets merged across.
Please declare your AI usage, if any, and if you have used AI for your change, please also declare your coding experience without AI. This won't impact whether the change is merged, it will allow me to properly and correctly review the change to ensure that nothing slips through the net.
This is great an' all but I want a section that doesn't exist here. Can I make one?
Yep! Home Screen Sections exposes a static interface which can be used to register sections.
Due to issues with Jellyfin's plugins being loaded into different load contexts this cannot be referenced directly. Instead you can use reflection to invoke the plugin directly to register your section.
{
"id": "00000000-0000-0000-0000-000000000000", // Guid
"displayText": "", // What text should be displayed by default for your section
"limit": 1, // The number of times this section can appear up to
"route": "", // The route that should be linked on the section header, if applicable
"additionalData": "", // Any accompanying data you want sent to your results handler
"resultsAssembly": GetType().Assembly.FullName, // Example value is a string from C# that should be resolved before adding to json
"resultsClass": "", // The name of the class that should be invoked from the above assembly
"resultsMethod": "" // The name of the function that should be invoked from the above class
}
Assembly? homeScreenSectionsAssembly =
AssemblyLoadContext.All.SelectMany(x => x.Assemblies).FirstOrDefault(x =>
x.FullName?.Contains(".HomeScreenSections") ?? false);
if (homeScreenSectionsAssembly != null)
{
Type? pluginInterfaceType = homeScreenSectionsAssembly.GetType("Jellyfin.Plugin.HomeScreenSections.PluginInterface");
if (pluginInterfaceType != null)
{
pluginInterfaceType.GetMethod("RegisterSection")?.Invoke(null, new object?[] { payload });
}
}
When your section results method is invoked you will receive an object representing the following json format (it will try to serialize it to the type you specify in the signature)
{
"UserId": "", // The GUID of the user that is requesting the section
"AdditionalData": "" // The additional data you sent in the registration
}
You must make sure that your section results method returns a QueryResult<BaseItemDto>.
C#
73.5%
HTML
17.4%
JavaScript
8.5%