Compare commits
2 Commits
36a94819c5
...
90eca9e76a
Author | SHA1 | Date | |
---|---|---|---|
Thord Johansson | 90eca9e76a | ||
Thord Johansson | c349ead544 |
92
Program.cs
92
Program.cs
|
@ -44,9 +44,9 @@ public class LbzRpcService
|
||||||
throw new ApplicationException("Configuration file not found. Please create a config.ini file with your tokens and user information.");
|
throw new ApplicationException("Configuration file not found. Please create a config.ini file with your tokens and user information.");
|
||||||
}
|
}
|
||||||
|
|
||||||
IniData data = config.ReadFile("config.ini");
|
IniData config_data = config.ReadFile("config.ini");
|
||||||
listenBrainz = new ListenBrainz();
|
listenBrainz = new ListenBrainz();
|
||||||
client = new DiscordRpcClient(data["general"]["discord_token"]);
|
client = new DiscordRpcClient(config_data["general"]["discord_token"]);
|
||||||
|
|
||||||
void InitializeDiscordRpc()
|
void InitializeDiscordRpc()
|
||||||
{
|
{
|
||||||
|
@ -84,8 +84,8 @@ public class LbzRpcService
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var username = data["general"]["listenbrainz_username"];
|
var username = config_data["general"]["listenbrainz_username"];
|
||||||
var ignoredPlayers = data["general"]["ignored_sources"].Split(",", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
var ignoredPlayers = config_data["general"]["ignored_sources"].Split(",", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||||
|
|
||||||
var listen = listenBrainz.GetPlayingNow(username);
|
var listen = listenBrainz.GetPlayingNow(username);
|
||||||
if (listen != null)
|
if (listen != null)
|
||||||
|
@ -137,7 +137,7 @@ public class LbzRpcService
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var youtubeId = GetYoutubeId(listenData.AdditionalInfo.OriginUrl);
|
var youtubeId = GetYoutubeId(listenData.AdditionalInfo.OriginUrl);
|
||||||
albumArtUrl = "https://img.youtube.com/vi/" + youtubeId + "/0.jpg";
|
albumArtUrl = "https://img.youtube.com/vi/" + youtubeId + "/mqdefault.jpg";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (lastRecording != listenData.AdditionalInfo?.RecordingId.ToString()) // MusicBrainz ID available
|
else if (lastRecording != listenData.AdditionalInfo?.RecordingId.ToString()) // MusicBrainz ID available
|
||||||
|
@ -154,28 +154,45 @@ public class LbzRpcService
|
||||||
|
|
||||||
buttons.Add(new Button() { Label = $"{username} on ListenBrainz", Url = $"https://listenbrainz.org/user/{username}" });
|
buttons.Add(new Button() { Label = $"{username} on ListenBrainz", Url = $"https://listenbrainz.org/user/{username}" });
|
||||||
|
|
||||||
if (listenData.AdditionalInfo?.ReleaseId != null)
|
string? newAlbumArt = null;
|
||||||
|
|
||||||
|
if (config_data["general"]["prioritise_musicbrainz"] == "true" && listenData.AdditionalInfo?.ReleaseId != null)
|
||||||
{
|
{
|
||||||
albumArtUrl = "https://coverartarchive.org/release/" + listenData.AdditionalInfo?.ReleaseId + "/front-250.jpg";
|
newAlbumArt = "https://coverartarchive.org/release/" + listenData.AdditionalInfo?.ReleaseId + "/front-250.jpg";
|
||||||
}
|
}
|
||||||
else if (listenData.Release != null)
|
else if (config_data["general"]["prioritise_musicbrainz"] == "true" && listenData.Release != null)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Searching for release {0} on MusicBrainz", listenData.Release);
|
var release = FindMusicBrainzRelease(listenData.Release);
|
||||||
Query q = new("LBZ-DRPC", new Version(1, 0, 0));
|
newAlbumArt = "https://coverartarchive.org/release/" + release?.Item.Id + "/front-250.jpg";
|
||||||
var release = q.FindReleases(listenData.Release, 1).Results?.FirstOrDefault();
|
}
|
||||||
if (release != null)
|
|
||||||
|
if (newAlbumArt == null)
|
||||||
|
{
|
||||||
|
if ((listenData.AdditionalInfo?.OriginUrl?.ToString().Contains("youtube") == true
|
||||||
|
|| listenData.AdditionalInfo?.OriginUrl?.ToString().Contains("youtu.be") == true)
|
||||||
|
&& GetYoutubeId(listenData.AdditionalInfo.OriginUrl) != null)
|
||||||
{
|
{
|
||||||
albumArtUrl = "https://coverartarchive.org/release/" + release?.Item.Id + "/front-250.jpg";
|
newAlbumArt = "https://img.youtube.com/vi/" + GetYoutubeId(listenData.AdditionalInfo.OriginUrl) + "/0.jpg";
|
||||||
|
}
|
||||||
|
else if (listenData.AdditionalInfo?.ReleaseId != null)
|
||||||
|
{
|
||||||
|
newAlbumArt = "https://coverartarchive.org/release/" + listenData.AdditionalInfo?.ReleaseId + "/front-250.jpg";
|
||||||
|
}
|
||||||
|
else if (listenData.Release != null)
|
||||||
|
{
|
||||||
|
var release = FindMusicBrainzRelease(listenData.Release);
|
||||||
|
newAlbumArt = "https://coverartarchive.org/release/" + release?.Item.Id + "/front-250.jpg";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Console.WriteLine("Album art URL: " + albumArtUrl);
|
Console.WriteLine("Album art URL: " + (newAlbumArt ?? "(none)"));
|
||||||
|
albumArtUrl = newAlbumArt ?? "";
|
||||||
}
|
}
|
||||||
|
|
||||||
client.SetPresence(new RichPresence()
|
client.SetPresence(new RichPresence()
|
||||||
{
|
{
|
||||||
Details = $"{listenData.Name}",
|
Details = $"{listenData.Name}",
|
||||||
State = (listenData.Release != null && listenData.Release != listenData.Name) ? $"{listenData.Artist} ({listenData.Release})" : listenData.Artist,
|
State = (listenData.Release != null && listenData.Release != listenData.Name) ? $"{listenData.Release} ({listenData.Artist})" : listenData.Artist,
|
||||||
Buttons = buttons.ToArray(),
|
Buttons = buttons.ToArray(),
|
||||||
Assets = new Assets()
|
Assets = new Assets()
|
||||||
{
|
{
|
||||||
|
@ -198,7 +215,7 @@ public class LbzRpcService
|
||||||
client.ClearPresence();
|
client.ClearPresence();
|
||||||
}
|
}
|
||||||
|
|
||||||
var interval = int.Parse(data["general"]["poll_interval"]);
|
var interval = int.Parse(config_data["general"]["poll_interval"]);
|
||||||
while (interval > 0 && running)
|
while (interval > 0 && running)
|
||||||
{
|
{
|
||||||
Thread.Sleep(1000);
|
Thread.Sleep(1000);
|
||||||
|
@ -207,12 +224,49 @@ public class LbzRpcService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ISearchResult<IRelease>? FindMusicBrainzRelease(string release)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Searching for release {0} on MusicBrainz", release);
|
||||||
|
Query q = new("LBZ-DRPC", new Version(1, 0, 0));
|
||||||
|
var results = q.FindReleases(release, 5).Results;
|
||||||
|
|
||||||
|
if (results != null && results.Any())
|
||||||
|
{
|
||||||
|
// Find the result with the exact release title
|
||||||
|
var exactMatch = results.FirstOrDefault(r => EqualsAlphanumeric(r.Item.Title, release));
|
||||||
|
if (exactMatch != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Found match (alphanumeric): {0}", release);
|
||||||
|
return exactMatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If exact match not found, return the result with the highest score
|
||||||
|
var highestScore = results.OrderByDescending(r => r.Score).FirstOrDefault();
|
||||||
|
Console.WriteLine("Found match (highest scoring): {0}", release);
|
||||||
|
return highestScore;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool EqualsAlphanumeric(string? a, string b)
|
||||||
|
{
|
||||||
|
return a?.Where(b => char.IsLetterOrDigit(b) || char.IsWhiteSpace(b)).SequenceEqual(b.Where(c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c))) == true;
|
||||||
|
}
|
||||||
|
|
||||||
private string? GetYoutubeId(Uri originUrl)
|
private string? GetYoutubeId(Uri originUrl)
|
||||||
{
|
{
|
||||||
var query = HttpUtility.ParseQueryString(originUrl.Query);
|
if (originUrl.ToString().Contains("youtu.be"))
|
||||||
if (query["v"] != null)
|
|
||||||
{
|
{
|
||||||
return query["v"];
|
return originUrl.Segments.Last();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var query = HttpUtility.ParseQueryString(originUrl.Query);
|
||||||
|
if (query["v"] != null)
|
||||||
|
{
|
||||||
|
return query["v"];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue