diff --git a/src/Jellyfin.Plugin.MediaBar/Configuration/PluginConfiguration.cs b/src/Jellyfin.Plugin.MediaBar/Configuration/PluginConfiguration.cs
index 28117ae..e9fbbd7 100644
--- a/src/Jellyfin.Plugin.MediaBar/Configuration/PluginConfiguration.cs
+++ b/src/Jellyfin.Plugin.MediaBar/Configuration/PluginConfiguration.cs
@@ -11,5 +11,9 @@ namespace Jellyfin.Plugin.MediaBar.Configuration
public class PluginConfiguration : BasePluginConfiguration
{
public MediaBarState Enabled { get; set; } = MediaBarState.Enabled;
+
+ public bool UseAvatarsFile { get; set; } = true;
+
+ public string AvatarsPlaylist { get; set; } = string.Empty;
}
}
\ No newline at end of file
diff --git a/src/Jellyfin.Plugin.MediaBar/Configuration/config.html b/src/Jellyfin.Plugin.MediaBar/Configuration/config.html
index a1298fb..b86fc59 100644
--- a/src/Jellyfin.Plugin.MediaBar/Configuration/config.html
+++ b/src/Jellyfin.Plugin.MediaBar/Configuration/config.html
@@ -28,6 +28,24 @@
Whether the media bar should appear or not.
+
+
+
+ Use physical avatars file
+
+
+
+
+
+
If checked, the plugin will look for a list.txt file in the avatars directory at the root of jellyfin-web.
+
+
@@ -49,6 +67,8 @@
Dashboard.showLoadingMsg();
const config = {
Enabled: document.querySelector("[data-id=enabledSelect]").value,
+ UseAvatarsFile: document.querySelector("[data-id=chkUseAvatarsFile]").checked,
+ AvatarsPlaylist: document.querySelector("[data-id=txtAvatarsPlaylist]").value,
};
window.ApiClient.updatePluginConfiguration(MediaBarConfig.pluginId, config)
@@ -65,6 +85,8 @@
window.ApiClient.getPluginConfiguration(MediaBarConfig.pluginId)
.then(function (config) {
document.querySelector("[data-id=enabledSelect]").value = config.Enabled;
+ document.querySelector("[data-id=chkUseAvatarsFile]").checked = config.UseAvatarsFile;
+ document.querySelector("[data-id=txtAvatarsPlaylist]").value = config.AvatarsPlaylist;
})
.catch(function (error) {
console.error(error);
diff --git a/src/Jellyfin.Plugin.MediaBar/Controllers/MediaBarController.cs b/src/Jellyfin.Plugin.MediaBar/Controllers/MediaBarController.cs
index c92f19e..92f053a 100644
--- a/src/Jellyfin.Plugin.MediaBar/Controllers/MediaBarController.cs
+++ b/src/Jellyfin.Plugin.MediaBar/Controllers/MediaBarController.cs
@@ -1,8 +1,12 @@
using System.Reflection;
-using System.Text.RegularExpressions;
+using Jellyfin.Extensions;
using Jellyfin.Plugin.MediaBar.Helpers;
using Jellyfin.Plugin.MediaBar.Model;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Playlists;
using Microsoft.AspNetCore.Mvc;
+using MediaBrowser.Controller.Entities.TV;
namespace Jellyfin.Plugin.MediaBar.Controllers
{
@@ -33,6 +37,19 @@ namespace Jellyfin.Plugin.MediaBar.Controllers
return Content(fileContents, contentType);
}
+ [HttpPost("Avatar/List")]
+ public ActionResult GetAvatarsList([FromBody] PatchRequestPayload payload, [FromServices] IPlaylistManager playlistManager, [FromServices] IUserManager userManager)
+ {
+ string? content = TransformationPatches.AvatarsList(payload, playlistManager, userManager);
+
+ if (content == null)
+ {
+ return NotFound();
+ }
+
+ return Content(content, "text/plain");
+ }
+
[HttpPost("Patch/IndexHtml")]
public ActionResult PatchIndexHtml([FromBody] PatchRequestPayload payload)
{
diff --git a/src/Jellyfin.Plugin.MediaBar/Helpers/TransformationPatches.cs b/src/Jellyfin.Plugin.MediaBar/Helpers/TransformationPatches.cs
index 4036197..19f28ed 100644
--- a/src/Jellyfin.Plugin.MediaBar/Helpers/TransformationPatches.cs
+++ b/src/Jellyfin.Plugin.MediaBar/Helpers/TransformationPatches.cs
@@ -1,11 +1,78 @@
using System.Reflection;
using System.Text.RegularExpressions;
+using Jellyfin.Extensions;
using Jellyfin.Plugin.MediaBar.Model;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Playlists;
namespace Jellyfin.Plugin.MediaBar.Helpers
{
public static class TransformationPatches
{
+ public static string? AvatarsList(PatchRequestPayload payload, IPlaylistManager playlistManager, IUserManager userManager)
+ {
+ if (MediaBarPlugin.Instance.Configuration.UseAvatarsFile)
+ {
+ return payload.Contents;
+ }
+
+ IEnumerable allUserIds = userManager.UsersIds;
+
+ Playlist? playlist = null;
+ Guid? userIdToUse = null;
+
+ foreach (Guid userId in allUserIds)
+ {
+ playlist = playlistManager.GetPlaylists(userId)
+ .FirstOrDefault(x => x.Name == MediaBarPlugin.Instance.Configuration.AvatarsPlaylist);
+
+ if (playlist != null)
+ {
+ userIdToUse = userId;
+ break;
+ }
+ }
+
+ if (playlist == null || userIdToUse == null)
+ {
+ return payload.Contents;
+ }
+
+ IEnumerable> itemsRaw = playlist.GetManageableItems()
+ .Where(i => i.Item2.IsVisible(userManager.GetUserById(userIdToUse.Value)));
+
+ StringWriter stringWriter = new StringWriter();
+
+ stringWriter.WriteLine(MediaBarPlugin.Instance.Configuration.AvatarsPlaylist);
+
+ List idsWritten = new List();
+
+ foreach (Tuple item in itemsRaw)
+ {
+ BaseItem itemToUse = item.Item2;
+ if (item.Item2 is Episode episode)
+ {
+ itemToUse = episode.Series;
+ }
+
+ if (!idsWritten.Contains(itemToUse.Id))
+ {
+ idsWritten.Add(itemToUse.Id);
+ }
+ }
+
+ idsWritten.Shuffle();
+
+ foreach (Guid id in idsWritten)
+ {
+ stringWriter.WriteLine(id);
+ }
+
+ return stringWriter.ToString();
+ }
+
public static string IndexHtml(PatchRequestPayload payload)
{
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream($"{typeof(MediaBarPlugin).Namespace}.Inject.index.html")!;
diff --git a/src/Jellyfin.Plugin.MediaBar/MediaBarPlugin.cs b/src/Jellyfin.Plugin.MediaBar/MediaBarPlugin.cs
index c1d97fa..419d685 100644
--- a/src/Jellyfin.Plugin.MediaBar/MediaBarPlugin.cs
+++ b/src/Jellyfin.Plugin.MediaBar/MediaBarPlugin.cs
@@ -11,9 +11,12 @@ namespace Jellyfin.Plugin.MediaBar
public override Guid Id => Guid.Parse("08f615ea-2107-4f04-89cc-091035f54448");
public override string Name => "Media Bar";
-
+
+ public static MediaBarPlugin Instance { get; private set; } = null!;
+
public MediaBarPlugin(IApplicationPaths applicationPaths, IXmlSerializer xmlSerializer, IServiceProvider serviceProvider) : base(applicationPaths, xmlSerializer)
{
+ Instance = this;
}
public IEnumerable GetPages()
diff --git a/src/Jellyfin.Plugin.MediaBar/Services/StartupService.cs b/src/Jellyfin.Plugin.MediaBar/Services/StartupService.cs
index e00f8b9..f2e905f 100644
--- a/src/Jellyfin.Plugin.MediaBar/Services/StartupService.cs
+++ b/src/Jellyfin.Plugin.MediaBar/Services/StartupService.cs
@@ -7,6 +7,8 @@ using Jellyfin.Plugin.MediaBar.Helpers;
using Jellyfin.Plugin.MediaBar.Model;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Playlists;
using MediaBrowser.Model.Tasks;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
@@ -27,12 +29,17 @@ namespace Jellyfin.Plugin.MediaBar.Services
private readonly IServerApplicationHost m_serverApplicationHost;
private readonly ILogger m_logger;
private readonly NamedPipeService m_namedPipeService;
+ private readonly IUserManager m_userManager;
+ private readonly IPlaylistManager m_playlistManager;
- public StartupService(IServerApplicationHost serverApplicationHost, ILogger logger, NamedPipeService namedPipeService)
+ public StartupService(IServerApplicationHost serverApplicationHost, ILogger logger, NamedPipeService namedPipeService,
+ IUserManager userManager, IPlaylistManager playlistManager)
{
m_serverApplicationHost = serverApplicationHost;
m_logger = logger;
m_namedPipeService = namedPipeService;
+ m_userManager = userManager;
+ m_playlistManager = playlistManager;
}
public async Task ExecuteAsync(IProgress progress, CancellationToken cancellationToken)
@@ -71,6 +78,19 @@ namespace Jellyfin.Plugin.MediaBar.Services
payloads.Add(payload);
}
+ {
+ JObject payload = new JObject();
+ payload.Add("id", "8d374d6b-3c5b-464a-a2a2-96e92fa81345");
+ payload.Add("fileNamePattern", "avatars/list.txt");
+ payload.Add("transformationEndpoint", "/MediaBar/Avatar/List");
+ payload.Add("transformationPipe", "Jellyfin.Plugin.MediaBar.AvatarsList");
+ RegisterPipeEndpoint("Jellyfin.Plugin.MediaBar.AvatarsList", innerPayload =>
+ {
+ return TransformationPatches.AvatarsList(innerPayload, m_playlistManager, m_userManager) ?? "";
+ });
+
+ payloads.Add(payload);
+ }
string fileTransformationPipeName = "Jellyfin.Plugin.FileTransformation.NamedPipe";
MethodInfo? getPipePathMethod = typeof(PipeStream).GetMethod("GetPipePath", BindingFlags.Static | BindingFlags.NonPublic);
@@ -87,7 +107,7 @@ namespace Jellyfin.Plugin.MediaBar.Services
await pipeClient.WriteAsync(BitConverter.GetBytes((long)payloadBytes.Length));
await pipeClient.WriteAsync(payloadBytes, 0, payloadBytes.Length);
-
+
pipeClient.ReadByte();
await pipeClient.DisposeAsync();