Skip to content

Commit b9edbef

Browse files
committed
Fix Track/Disc numbers for Discogs
1 parent 2011bd4 commit b9edbef

2 files changed

Lines changed: 64 additions & 2 deletions

File tree

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System.Text.RegularExpressions;
2+
using MiniMediaMetadataAPI.Application.Models.Database.Discogs;
3+
4+
namespace MiniMediaMetadataAPI.Application.Helpers;
5+
6+
public static class DiscogsHelper
7+
{
8+
public static int GetDiscNumber(DiscogsReleaseTrack track)
9+
{
10+
//let's not process this weird stuff, not sure what it means this "arrow"
11+
if (track.Position.Contains('→'))
12+
{
13+
return 0;
14+
}
15+
16+
//couldn't Discogs come to just 1 standard... this makes no sense to me
17+
string cdRegexPrefix = "^[(]{0,1}(CD|CDR|cd|cdr|CD\\-Rom){0,}[ ]*([0-9]*)";
18+
string cdRegexPostfix = "(CD|CDR|cd|cdr|CD\\-Rom){1,}([0-9]*)$";
19+
20+
//try postfix first otherwise we grab the Tracknumber by accident
21+
var postfixMatch = Regex.Match(track.Position, cdRegexPostfix);
22+
if (postfixMatch.Success)
23+
{
24+
return int.TryParse(postfixMatch.Groups.Values.LastOrDefault()?.Value, out var discNumber) ? discNumber : 0;
25+
}
26+
27+
var prefixMatch = Regex.Match(track.Position, cdRegexPrefix);
28+
if (prefixMatch.Success)
29+
{
30+
return int.TryParse(prefixMatch.Groups.Values.LastOrDefault()?.Value, out var discNumber) ? discNumber : 0;
31+
}
32+
return 0;
33+
}
34+
35+
public static string GetTrackNumber(DiscogsReleaseTrack track)
36+
{
37+
//let's not process this weird stuff, not sure what it means this "arrow"
38+
if (track.Position.Contains('→'))
39+
{
40+
return string.Empty;
41+
}
42+
43+
//couldn't Discogs come to just 1 standard... this makes no sense to me
44+
//cd/CD/cdr/CDR optional prefix
45+
//get optional CD Number
46+
//try get tracknumber
47+
//try get tracknumber from "xx-yy"
48+
//try get tracknumber that has prefix "Track" before it
49+
string trackRegexPrefix = "^[(]{0,1}(CD|CDR|cd|cdr|CD\\\\-Rom){0,}[ ]*([0-9A-Z]*)[)]{0,1}[ \\\\-\\\\.\\\\\\/]*([0-9]*)[\\- ]*([0-9]*)(Track[ ]*([0-9]*))*";
50+
51+
var prefixMatch = Regex.Match(track.Position, trackRegexPrefix);
52+
if (prefixMatch.Success)
53+
{
54+
return int.TryParse(prefixMatch.Groups.Values.LastOrDefault()?.Value, out var trackNumber) ? trackNumber.ToString() : string.Empty;
55+
}
56+
57+
return string.Empty;
58+
}
59+
}

MiniMediaMetadataAPI.Application/Services/SearchTrackService.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using System.Diagnostics;
2+
using System.Text.RegularExpressions;
23
using MiniMediaMetadataAPI.Application.Enums;
4+
using MiniMediaMetadataAPI.Application.Helpers;
35
using MiniMediaMetadataAPI.Application.Models;
6+
using MiniMediaMetadataAPI.Application.Models.Database.Discogs;
47
using MiniMediaMetadataAPI.Application.Models.Entities;
58
using MiniMediaMetadataAPI.Application.Repositories;
69

@@ -219,8 +222,8 @@ public async Task<SearchTrackResponse> SearchTrack(
219222
Url = string.Empty,
220223
Duration = !string.IsNullOrWhiteSpace(track.Duration) ? (TimeSpan.TryParseExact(track.Duration, ["m\\:ss", "h\\:mm\\:ss"], null, out var span) ? span : TimeSpan.Zero) : TimeSpan.Zero,
221224
Explicit = track.Title?.Contains("(explicit") == true,
222-
DiscNumber = track.Position.Contains("-") ? (int.TryParse(track.Position.Split('-')[0], out int disc) ? disc : 1) : 1,
223-
TrackNumber = track.Position.Contains("-") ? (int.TryParse(track.Position.Split('-')[1], out int trackNumber) ? trackNumber.ToString() : track.Position) : track.Position,
225+
DiscNumber = DiscogsHelper.GetDiscNumber(track),
226+
TrackNumber = DiscogsHelper.GetTrackNumber(track),
224227
Label = string.Empty,
225228
ISRC = track.Release.Identifiers
226229
.Where(id => string.Equals(id.Type, "ISRC"))

0 commit comments

Comments
 (0)