Added stuff
- Attempted to fix the status for when screensharing - Added the application icon
This commit is contained in:
parent
9330106c24
commit
3a164c5599
38 changed files with 260 additions and 222 deletions
BIN
.vs/JellyfinDiscordRPC/DesignTimeBuild/.dtbcache.v2
Normal file
BIN
.vs/JellyfinDiscordRPC/DesignTimeBuild/.dtbcache.v2
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
.vs/JellyfinDiscordRPC/v17/.futdcache.v2
Normal file
BIN
.vs/JellyfinDiscordRPC/v17/.futdcache.v2
Normal file
Binary file not shown.
53
.vs/JellyfinDiscordRPC/v17/DocumentLayout.backup.json
Normal file
53
.vs/JellyfinDiscordRPC/v17/DocumentLayout.backup.json
Normal file
|
@ -0,0 +1,53 @@
|
|||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}|JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj|c:\\users\\joshua\\documents\\github\\jellyfin-discord-rpc\\jellyfindiscordrpc\\jellyfindiscordrpc.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|",
|
||||
"RelativeMoniker": "D:0:0:{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}|JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj|solutionrelative:jellyfindiscordrpc\\jellyfindiscordrpc.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
|
||||
},
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}|JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj|c:\\users\\joshua\\documents\\github\\jellyfin-discord-rpc\\jellyfindiscordrpc\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||
"RelativeMoniker": "D:0:0:{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}|JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj|solutionrelative:jellyfindiscordrpc\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": 0,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "JellyfinDiscordRPC",
|
||||
"DocumentMoniker": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"RelativeDocumentMoniker": "JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"ToolTip": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"RelativeToolTip": "JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
|
||||
"WhenOpened": "2024-11-30T08:49:04.842Z",
|
||||
"EditorCaption": ""
|
||||
},
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 1,
|
||||
"Title": "Program.cs",
|
||||
"DocumentMoniker": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\Program.cs",
|
||||
"RelativeDocumentMoniker": "JellyfinDiscordRPC\\Program.cs",
|
||||
"ToolTip": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\Program.cs",
|
||||
"RelativeToolTip": "JellyfinDiscordRPC\\Program.cs",
|
||||
"ViewState": "AgIAANsAAAAAAAAAAAAAwBcBAAAmAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||
"WhenOpened": "2024-11-30T05:30:39.706Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
37
.vs/JellyfinDiscordRPC/v17/DocumentLayout.json
Normal file
37
.vs/JellyfinDiscordRPC/v17/DocumentLayout.json
Normal file
|
@ -0,0 +1,37 @@
|
|||
{
|
||||
"Version": 1,
|
||||
"WorkspaceRootPath": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\",
|
||||
"Documents": [
|
||||
{
|
||||
"AbsoluteMoniker": "D:0:0:{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}|JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj|c:\\users\\joshua\\documents\\github\\jellyfin-discord-rpc\\jellyfindiscordrpc\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||
"RelativeMoniker": "D:0:0:{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}|JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj|solutionrelative:jellyfindiscordrpc\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||
}
|
||||
],
|
||||
"DocumentGroupContainers": [
|
||||
{
|
||||
"Orientation": 0,
|
||||
"VerticalTabListWidth": 256,
|
||||
"DocumentGroups": [
|
||||
{
|
||||
"DockedWidth": 200,
|
||||
"SelectedChildIndex": 0,
|
||||
"Children": [
|
||||
{
|
||||
"$type": "Document",
|
||||
"DocumentIndex": 0,
|
||||
"Title": "Program.cs",
|
||||
"DocumentMoniker": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\Program.cs",
|
||||
"RelativeDocumentMoniker": "JellyfinDiscordRPC\\Program.cs",
|
||||
"ToolTip": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\Program.cs",
|
||||
"RelativeToolTip": "JellyfinDiscordRPC\\Program.cs",
|
||||
"ViewState": "AgIAAA4BAAAAAAAAAAAswBcBAAAmAAAAAAAAAA==",
|
||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||
"WhenOpened": "2024-11-30T05:30:39.706Z",
|
||||
"EditorCaption": ""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
BIN
.vs/ProjectEvaluation/jellyfindiscordrpc.metadata.v9.bin
Normal file
BIN
.vs/ProjectEvaluation/jellyfindiscordrpc.metadata.v9.bin
Normal file
Binary file not shown.
BIN
.vs/ProjectEvaluation/jellyfindiscordrpc.projects.v9.bin
Normal file
BIN
.vs/ProjectEvaluation/jellyfindiscordrpc.projects.v9.bin
Normal file
Binary file not shown.
BIN
.vs/ProjectEvaluation/jellyfindiscordrpc.strings.v9.bin
Normal file
BIN
.vs/ProjectEvaluation/jellyfindiscordrpc.strings.v9.bin
Normal file
Binary file not shown.
|
@ -1,20 +1,32 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.12.35514.174 d17.12
|
||||
VisualStudioVersion = 17.12.35514.174
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JellyfinDiscordRPC", "JellyfinDiscordRPC\JellyfinDiscordRPC.csproj", "{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Debug|x64.Build.0 = Debug|x64
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Debug|x86.ActiveCfg = Debug|x86
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Debug|x86.Build.0 = Debug|x86
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Release|x64.ActiveCfg = Release|x64
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Release|x64.Build.0 = Release|x64
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Release|x86.ActiveCfg = Release|x64
|
||||
{06FF6B5D-B070-4DB7-9A87-9B6E280A794D}.Release|x86.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
|
|
@ -5,10 +5,19 @@
|
|||
<TargetFramework>net9.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<Platforms>AnyCPU;x64;x86</Platforms>
|
||||
<PackageIcon>jellyfin.png</PackageIcon>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DiscordRichPresence" Version="1.2.1.24" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="assets\jellyfin.png">
|
||||
<Pack>True</Pack>
|
||||
<PackagePath>\</PackagePath>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -11,6 +11,7 @@ class Program
|
|||
private const string ConfigFilePath = "config.json";
|
||||
private static DiscordRpcClient _discordClient;
|
||||
private static Config _config;
|
||||
private static bool isScreenSharing = false; // Track screen sharing status
|
||||
|
||||
// Hard-code the Discord Client ID here
|
||||
private const string DiscordClientId = "1312264302601834578"; // Replace with your actual Discord client ID
|
||||
|
@ -29,6 +30,62 @@ class Program
|
|||
_discordClient.Initialize();
|
||||
|
||||
// Poll Jellyfin API for currently playing media
|
||||
var updateTask = UpdateRichPresence(); // Start the rich presence update task
|
||||
|
||||
// Command loop for toggling screen sharing
|
||||
while (true)
|
||||
{
|
||||
var command = Console.ReadLine()?.ToLower();
|
||||
if (command == "toggle")
|
||||
{
|
||||
ToggleScreenSharing();
|
||||
}
|
||||
else if (command == "exit")
|
||||
{
|
||||
break; // Exit the loop and end the program
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Invalid command. Type 'toggle' to toggle screen sharing or 'exit' to quit.");
|
||||
}
|
||||
}
|
||||
|
||||
await updateTask; // Wait for the rich presence update task to finish
|
||||
}
|
||||
|
||||
private static void ToggleScreenSharing()
|
||||
{
|
||||
isScreenSharing = !isScreenSharing; // Toggle the screen sharing state
|
||||
Console.WriteLine(isScreenSharing ? "Screen sharing enabled." : "Screen sharing disabled.");
|
||||
UpdateDiscordPresence(); // Manually update Discord presence when toggling screen sharing
|
||||
}
|
||||
|
||||
private static void UpdateDiscordPresence()
|
||||
{
|
||||
// Log the current status of screen sharing
|
||||
Console.WriteLine($"Updating Discord Presence. Screen Sharing: {isScreenSharing}");
|
||||
|
||||
// Ensure we immediately update the Discord presence when toggling screen sharing
|
||||
_discordClient.SetPresence(new RichPresence
|
||||
{
|
||||
Details = isScreenSharing ? "Sharing screen" : "Watching media",
|
||||
State = isScreenSharing ? "Screen sharing is active" : "Not sharing screen",
|
||||
Timestamps = new Timestamps
|
||||
{
|
||||
Start = DateTime.UtcNow
|
||||
},
|
||||
Assets = new Assets
|
||||
{
|
||||
LargeImageKey = isScreenSharing ? "screen_sharing" : "media_playing",
|
||||
LargeImageText = isScreenSharing ? "Screen sharing on Discord" : "Watching media on Jellyfin"
|
||||
}
|
||||
});
|
||||
|
||||
Console.WriteLine("Presence updated successfully.");
|
||||
}
|
||||
|
||||
private static async Task UpdateRichPresence()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
try
|
||||
|
@ -36,48 +93,53 @@ class Program
|
|||
var playingInfo = await GetCurrentlyPlaying().ConfigureAwait(false);
|
||||
if (playingInfo != null)
|
||||
{
|
||||
// Get the raw JToken from nowPlaying (instead of passing PlayingInfo)
|
||||
JToken nowPlaying = playingInfo.NowPlayingItem;
|
||||
|
||||
// Check if album art exists and pre-fetch it
|
||||
string largeImageKey = playingInfo.IsMusic
|
||||
? await GetAlbumCover(nowPlaying).ConfigureAwait(false) // Pass the JToken nowPlaying here
|
||||
? await GetAlbumCover(nowPlaying).ConfigureAwait(false)
|
||||
: await GetJellyfinLogo().ConfigureAwait(false);
|
||||
string largeImageText = playingInfo.IsMusic
|
||||
? nowPlaying["Album"]?.ToString() ?? "Unknown Album" // Extract album name or fallback to "Unknown Album"
|
||||
? nowPlaying["Album"]?.ToString() ?? "Unknown Album"
|
||||
: "Jellyfin Media Player";
|
||||
// Update Discord Rich Presence for music or video
|
||||
|
||||
string details = playingInfo.IsMusic
|
||||
? $"{playingInfo.Title}" // Show song name
|
||||
: $"Watching: {playingInfo.Title}"; // Show video title
|
||||
|
||||
string state = isScreenSharing ? "Sharing screen" : playingInfo.IsMusic
|
||||
? $"{playingInfo.Artist}" // Show artist name
|
||||
: $"Season {playingInfo.Season}, Episode {playingInfo.Episode}";
|
||||
|
||||
Console.WriteLine($"Updating presence with details: {details}, state: {state}");
|
||||
|
||||
_discordClient.SetPresence(new RichPresence
|
||||
{
|
||||
Details = playingInfo.IsMusic
|
||||
? $"{playingInfo.Title}" // Show song name
|
||||
: $"Watching: {playingInfo.Title}", // Show video title
|
||||
State = playingInfo.IsMusic
|
||||
? $"{playingInfo.Artist}" // Show artist only (no album name)
|
||||
: $"Season {playingInfo.Season}, Episode {playingInfo.Episode}",
|
||||
Details = details,
|
||||
State = state, // Dynamic state based on screen sharing or media
|
||||
Timestamps = new Timestamps
|
||||
{
|
||||
Start = DateTime.UtcNow - playingInfo.Progress, // Start time based on current progress
|
||||
End = DateTime.UtcNow + (playingInfo.Duration - playingInfo.Progress) // End time based on total duration
|
||||
Start = DateTime.UtcNow - playingInfo.Progress,
|
||||
End = DateTime.UtcNow + (playingInfo.Duration - playingInfo.Progress)
|
||||
},
|
||||
Assets = new Assets
|
||||
{
|
||||
LargeImageKey = largeImageKey, // Dynamically set image based on media type
|
||||
LargeImageText = largeImageText // Use album name or fallback text
|
||||
LargeImageKey = largeImageKey,
|
||||
LargeImageText = largeImageText
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
_discordClient.ClearPresence();
|
||||
Console.WriteLine("No media playing, clearing presence.");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error: {ex.Message}");
|
||||
Console.WriteLine($"Error fetching Jellyfin data: {ex.Message}");
|
||||
}
|
||||
|
||||
// Wait for a few seconds before polling again
|
||||
// Wait before polling again
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
@ -93,16 +155,13 @@ class Program
|
|||
var jsonResponse = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||
var json = JObject.Parse(jsonResponse);
|
||||
|
||||
// Attempt to get the logo URL
|
||||
var logoUrl = json["LogoUrl"]?.ToString();
|
||||
|
||||
// Fallback to a default logo if no logo URL is found
|
||||
return logoUrl ?? "jellyfin_logo";
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error fetching Jellyfin logo: {ex.Message}");
|
||||
return "jellyfin_logo"; // Default fallback in case of error
|
||||
return "jellyfin_logo"; // Default fallback
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,39 +169,21 @@ class Program
|
|||
{
|
||||
if (File.Exists(ConfigFilePath))
|
||||
{
|
||||
// Load configuration from file
|
||||
var configJson = File.ReadAllText(ConfigFilePath);
|
||||
_config = JsonSerializer.Deserialize<Config>(configJson);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Prompt user for configuration on first startup (without Discord Client ID)
|
||||
_config = new Config();
|
||||
Console.Write("Enter Jellyfin Server URL: ");
|
||||
_config.JellyfinBaseUrl = Console.ReadLine();
|
||||
Console.Write("Enter Jellyfin API Key: ");
|
||||
_config.JellyfinApiKey = Console.ReadLine();
|
||||
Console.Write("Enter Jellyfin User ID: ");
|
||||
_config.JellyfinUserId = Console.ReadLine();
|
||||
|
||||
do
|
||||
{
|
||||
Console.Write("Enter Jellyfin Server URL (e.g., http://your-jellyfin-server:8096): ");
|
||||
_config.JellyfinBaseUrl = Console.ReadLine();
|
||||
} while (string.IsNullOrWhiteSpace(_config.JellyfinBaseUrl));
|
||||
|
||||
do
|
||||
{
|
||||
Console.Write("Enter Jellyfin API Key: ");
|
||||
_config.JellyfinApiKey = Console.ReadLine();
|
||||
} while (string.IsNullOrWhiteSpace(_config.JellyfinApiKey));
|
||||
|
||||
Console.WriteLine("Go to the following URL and find your Jellyfin User ID:");
|
||||
Console.WriteLine(" http://<your-jellyfin-server>:PORTNUMBER/Users?api_key=<your-api-key>");
|
||||
do
|
||||
{
|
||||
Console.Write("Enter Jellyfin User ID: ");
|
||||
_config.JellyfinUserId = Console.ReadLine();
|
||||
} while (string.IsNullOrWhiteSpace(_config.JellyfinUserId));
|
||||
|
||||
// Save configuration to file (without Discord Client ID)
|
||||
var configJson = JsonSerializer.Serialize(_config, new JsonSerializerOptions { WriteIndented = true });
|
||||
File.WriteAllText(ConfigFilePath, configJson);
|
||||
|
||||
Console.WriteLine("Configuration saved to config.json.");
|
||||
}
|
||||
}
|
||||
|
@ -160,35 +201,29 @@ class Program
|
|||
|
||||
foreach (var session in sessions)
|
||||
{
|
||||
if (session["UserId"]?.ToString() == _config.JellyfinUserId &&
|
||||
session["NowPlayingItem"] != null)
|
||||
if (session["UserId"]?.ToString() == _config.JellyfinUserId && session["NowPlayingItem"] != null)
|
||||
{
|
||||
var nowPlaying = session["NowPlayingItem"]; // This is the raw JToken we need
|
||||
|
||||
// Extract media type
|
||||
var nowPlaying = session["NowPlayingItem"];
|
||||
var mediaType = nowPlaying["Type"]?.ToString();
|
||||
bool isMusic = mediaType?.ToLower() == "audio";
|
||||
|
||||
string albumCover = ""; // Default value for album cover
|
||||
string artist = "Unknown Artist"; // Default value for artist
|
||||
string albumCover = "";
|
||||
string artist = "Unknown Artist";
|
||||
|
||||
// If it's music, extract the album art and artist name
|
||||
if (isMusic)
|
||||
{
|
||||
albumCover = await GetAlbumCover(nowPlaying).ConfigureAwait(false); // Pass JToken (not PlayingInfo)
|
||||
albumCover = await GetAlbumCover(nowPlaying).ConfigureAwait(false);
|
||||
var artists = nowPlaying["Artists"]?.ToObject<JArray>();
|
||||
if (artists != null && artists.Count > 0)
|
||||
{
|
||||
artist = artists[0].ToString(); // Get the first artist from the array
|
||||
artist = artists[0].ToString();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// If it's video, set artist to Unknown Artist
|
||||
artist = "Unknown Artist";
|
||||
}
|
||||
|
||||
// Return the extracted data wrapped in the PlayingInfo object
|
||||
return new PlayingInfo
|
||||
{
|
||||
Title = nowPlaying["Name"]?.ToString(),
|
||||
|
@ -199,7 +234,7 @@ class Program
|
|||
Progress = TimeSpan.FromTicks((long)session["PlayState"]["PositionTicks"]),
|
||||
Duration = TimeSpan.FromTicks((long)nowPlaying["RunTimeTicks"]),
|
||||
IsMusic = isMusic,
|
||||
NowPlayingItem = nowPlaying // Add the raw NowPlayingItem JToken here
|
||||
NowPlayingItem = nowPlaying
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -214,44 +249,23 @@ class Program
|
|||
|
||||
private static async Task<string> GetAlbumCover(JToken nowPlaying)
|
||||
{
|
||||
// Try to get the album cover from the "MediaStreams" (audio specific)
|
||||
var mediaStreams = nowPlaying["MediaStreams"]?.ToObject<JArray>();
|
||||
if (mediaStreams != null)
|
||||
{
|
||||
// Look for the stream that indicates an image (usually "mjpeg" codec)
|
||||
foreach (var stream in mediaStreams)
|
||||
{
|
||||
if (stream["Codec"]?.ToString() == "mjpeg" && stream["Type"]?.ToString() == "EmbeddedImage")
|
||||
var imageTag = stream["ImageTag"]?.ToString();
|
||||
if (!string.IsNullOrEmpty(imageTag))
|
||||
{
|
||||
// Check for the image tag and try to form the image URL
|
||||
string imageTag = nowPlaying["ParentLogoImageTag"]?.ToString();
|
||||
if (!string.IsNullOrWhiteSpace(imageTag))
|
||||
{
|
||||
string itemId = nowPlaying["Id"]?.ToString();
|
||||
if (!string.IsNullOrWhiteSpace(itemId))
|
||||
{
|
||||
// Construct the URL for the album cover
|
||||
return $"{_config.JellyfinBaseUrl}/emby/Items/{itemId}/Images/Primary?tag={imageTag}&api_key={_config.JellyfinApiKey}";
|
||||
}
|
||||
}
|
||||
return imageTag; // Return the album cover image tag
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: Check if there is an explicit album cover URL in the item
|
||||
string albumArtUrl = nowPlaying["ImageTags"]?["Primary"]?.ToString();
|
||||
if (!string.IsNullOrWhiteSpace(albumArtUrl))
|
||||
{
|
||||
return $"{_config.JellyfinBaseUrl}/emby/Items/{nowPlaying["Id"]}/Images/Primary?tag={albumArtUrl}&api_key={_config.JellyfinApiKey}";
|
||||
}
|
||||
|
||||
// Fallback to a default cover if no album art is found
|
||||
return "default_cover";
|
||||
return "album_cover";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Config
|
||||
class Config
|
||||
{
|
||||
public string JellyfinBaseUrl { get; set; }
|
||||
public string JellyfinApiKey { get; set; }
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
https://go.microsoft.com/fwlink/?LinkID=208121.
|
||||
-->
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
<PublishDir>bin\Release\net9.0\publish\win-x64\</PublishDir>
|
||||
<PublishProtocol>FileSystem</PublishProtocol>
|
||||
<_TargetId>Folder</_TargetId>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
<SelfContained>false</SelfContained>
|
||||
<PublishSingleFile>false</PublishSingleFile>
|
||||
<PublishReadyToRun>false</PublishReadyToRun>
|
||||
</PropertyGroup>
|
||||
</Project>
|
BIN
JellyfinDiscordRPC/assets/jellyfin.png
Normal file
BIN
JellyfinDiscordRPC/assets/jellyfin.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
Binary file not shown.
|
@ -1,106 +0,0 @@
|
|||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v9.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v9.0": {
|
||||
"JellyfinDiscordRPC/1.0.0": {
|
||||
"dependencies": {
|
||||
"DiscordRichPresence": "1.2.1.24"
|
||||
},
|
||||
"runtime": {
|
||||
"JellyfinDiscordRPC.dll": {}
|
||||
}
|
||||
},
|
||||
"DiscordRichPresence/1.2.1.24": {
|
||||
"dependencies": {
|
||||
"Microsoft.Win32.Registry": "4.5.0",
|
||||
"Newtonsoft.Json": "13.0.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/DiscordRPC.dll": {
|
||||
"assemblyVersion": "1.2.1.24",
|
||||
"fileVersion": "1.2.1.24"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.NETCore.Platforms/2.0.0": {},
|
||||
"Microsoft.Win32.Registry/4.5.0": {
|
||||
"dependencies": {
|
||||
"System.Security.AccessControl": "4.5.0",
|
||||
"System.Security.Principal.Windows": "4.5.0"
|
||||
}
|
||||
},
|
||||
"Newtonsoft.Json/13.0.1": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||
"assemblyVersion": "13.0.0.0",
|
||||
"fileVersion": "13.0.1.25517"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Security.AccessControl/4.5.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "2.0.0",
|
||||
"System.Security.Principal.Windows": "4.5.0"
|
||||
}
|
||||
},
|
||||
"System.Security.Principal.Windows/4.5.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.NETCore.Platforms": "2.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"JellyfinDiscordRPC/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"DiscordRichPresence/1.2.1.24": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-DVmmlFQ/oQmidNRmZhPzYjC7ryaT4beWcKaMKPVw6fhOzM/HOoY6NOL4KMOYEnD4M7SNsODjleYimvUNIZcbiA==",
|
||||
"path": "discordrichpresence/1.2.1.24",
|
||||
"hashPath": "discordrichpresence.1.2.1.24.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.NETCore.Platforms/2.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-VdLJOCXhZaEMY7Hm2GKiULmn7IEPFE4XC5LPSfBVCUIA8YLZVh846gtfBJalsPQF2PlzdD7ecX7DZEulJ402ZQ==",
|
||||
"path": "microsoft.netcore.platforms/2.0.0",
|
||||
"hashPath": "microsoft.netcore.platforms.2.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Win32.Registry/4.5.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-+FWlwd//+Tt56316p00hVePBCouXyEzT86Jb3+AuRotTND0IYn0OO3obs1gnQEs/txEnt+rF2JBGLItTG+Be6A==",
|
||||
"path": "microsoft.win32.registry/4.5.0",
|
||||
"hashPath": "microsoft.win32.registry.4.5.0.nupkg.sha512"
|
||||
},
|
||||
"Newtonsoft.Json/13.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||
"path": "newtonsoft.json/13.0.1",
|
||||
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||
},
|
||||
"System.Security.AccessControl/4.5.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==",
|
||||
"path": "system.security.accesscontrol/4.5.0",
|
||||
"hashPath": "system.security.accesscontrol.4.5.0.nupkg.sha512"
|
||||
},
|
||||
"System.Security.Principal.Windows/4.5.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==",
|
||||
"path": "system.security.principal.windows/4.5.0",
|
||||
"hashPath": "system.security.principal.windows.4.5.0.nupkg.sha512"
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,12 +0,0 @@
|
|||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net9.0",
|
||||
"framework": {
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "9.0.0"
|
||||
},
|
||||
"configProperties": {
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -1,5 +0,0 @@
|
|||
{
|
||||
"JellyfinBaseUrl": "https://jellyfin.diamondcreeper.org",
|
||||
"JellyfinApiKey": "9b868f61663140d09406b50538c91b8a",
|
||||
"JellyfinUserId": "b4f8289c703c48f6aa827655ca209681"
|
||||
}
|
|
@ -14,7 +14,7 @@ using System.Reflection;
|
|||
[assembly: System.Reflection.AssemblyCompanyAttribute("JellyfinDiscordRPC")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+9330106c24c49cbac14fbc441fd4dfeb17b5e6b7")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("JellyfinDiscordRPC")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("JellyfinDiscordRPC")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
|
|
@ -1 +1 @@
|
|||
2e189d0dffba66b81eb9b145504dcd231f91e1098305af08ba9c25f348b380fa
|
||||
2850d7fb1b219d71ca36ce27f283a88484554fa270adaed893963d07cc96c066
|
||||
|
|
|
@ -8,7 +8,7 @@ build_property.PlatformNeutralAssembly =
|
|||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = JellyfinDiscordRPC
|
||||
build_property.ProjectDir = C:\Users\joshua\source\repos\JellyfinDiscordRPC\JellyfinDiscordRPC\
|
||||
build_property.ProjectDir = C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
build_property.EffectiveAnalysisLevelStyle = 9.0
|
||||
|
|
Binary file not shown.
|
@ -16,3 +16,21 @@ C:\Users\joshua\source\repos\JellyfinDiscordRPC\JellyfinDiscordRPC\obj\Debug\net
|
|||
C:\Users\joshua\source\repos\JellyfinDiscordRPC\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.pdb
|
||||
C:\Users\joshua\source\repos\JellyfinDiscordRPC\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.genruntimeconfig.cache
|
||||
C:\Users\joshua\source\repos\JellyfinDiscordRPC\JellyfinDiscordRPC\obj\Debug\net9.0\ref\JellyfinDiscordRPC.dll
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\bin\Debug\net9.0\JellyfinDiscordRPC.exe
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\bin\Debug\net9.0\JellyfinDiscordRPC.deps.json
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\bin\Debug\net9.0\JellyfinDiscordRPC.runtimeconfig.json
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\bin\Debug\net9.0\JellyfinDiscordRPC.dll
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\bin\Debug\net9.0\JellyfinDiscordRPC.pdb
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\bin\Debug\net9.0\DiscordRPC.dll
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\bin\Debug\net9.0\Newtonsoft.Json.dll
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.csproj.AssemblyReference.cache
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.GeneratedMSBuildEditorConfig.editorconfig
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.AssemblyInfoInputs.cache
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.AssemblyInfo.cs
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.csproj.CoreCompileInputs.cache
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\Jellyfin.FC5C5640.Up2Date
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.dll
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\refint\JellyfinDiscordRPC.dll
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.pdb
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\JellyfinDiscordRPC.genruntimeconfig.cache
|
||||
C:\Users\joshua\Documents\GitHub\jellyfin-discord-rpc\JellyfinDiscordRPC\obj\Debug\net9.0\ref\JellyfinDiscordRPC.dll
|
||||
|
|
Binary file not shown.
|
@ -1 +1 @@
|
|||
230f9294a7604eecab82305c77c4c9089de4c82cb2749e33c24c53a44ff224ba
|
||||
593d3e37ea484aac9177fb6433f49c519e46953c7db165fd924c9f5746fc869a
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,17 +1,17 @@
|
|||
{
|
||||
"format": 1,
|
||||
"restore": {
|
||||
"C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj": {}
|
||||
"C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj": {}
|
||||
},
|
||||
"projects": {
|
||||
"C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj": {
|
||||
"C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"projectUniqueName": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"projectName": "JellyfinDiscordRPC",
|
||||
"projectPath": "C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"projectPath": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"packagesPath": "C:\\Users\\joshua\\.nuget\\packages\\",
|
||||
"outputPath": "C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\obj\\",
|
||||
"outputPath": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||
|
|
|
@ -313,11 +313,11 @@
|
|||
"project": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"projectUniqueName": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"projectName": "JellyfinDiscordRPC",
|
||||
"projectPath": "C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"projectPath": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"packagesPath": "C:\\Users\\joshua\\.nuget\\packages\\",
|
||||
"outputPath": "C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\obj\\",
|
||||
"outputPath": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "1MP9+VdKfz0=",
|
||||
"dgSpecHash": "83oYIM0kfME=",
|
||||
"success": true,
|
||||
"projectFilePath": "C:\\Users\\joshua\\source\\repos\\JellyfinDiscordRPC\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"projectFilePath": "C:\\Users\\joshua\\Documents\\GitHub\\jellyfin-discord-rpc\\JellyfinDiscordRPC\\JellyfinDiscordRPC.csproj",
|
||||
"expectedPackageFiles": [
|
||||
"C:\\Users\\joshua\\.nuget\\packages\\discordrichpresence\\1.2.1.24\\discordrichpresence.1.2.1.24.nupkg.sha512",
|
||||
"C:\\Users\\joshua\\.nuget\\packages\\microsoft.netcore.platforms\\2.0.0\\microsoft.netcore.platforms.2.0.0.nupkg.sha512",
|
||||
|
|
Loading…
Add table
Reference in a new issue