Skip to content

Commit a6be8f5

Browse files
committed
Improved pulling similar tidal tracks
1 parent ec5ae85 commit a6be8f5

2 files changed

Lines changed: 82 additions & 18 deletions

File tree

MiniMediaScanner/Repositories/UpdateTidalRepository.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,4 +391,35 @@ await base.Connection
391391
similarIsrc
392392
}, transaction: base.Transaction);
393393
}
394+
395+
public async Task<bool> HasSimilarTrackRecordsAsync(int trackId)
396+
{
397+
string query = @"
398+
select 1 from tidal_track_similar
399+
where trackId = @trackId";
400+
401+
return (await base.Connection
402+
.ExecuteScalarAsync<int>(query, param: new
403+
{
404+
trackId
405+
}, transaction: base.Transaction)) == 1;
406+
}
407+
408+
public async Task<List<int>> GetMissingSimilarTrackIdsByArtistIdAsync(int artistId)
409+
{
410+
string query = @"
411+
select track.TrackId
412+
from tidal_artist artist
413+
join tidal_album album on album.artistid = artist.artistid
414+
join tidal_track track on track.albumid = album.albumid
415+
left join tidal_track_similar sim on sim.trackid = track.trackid
416+
where artist.artistid = @artistId and sim.trackid is null";
417+
418+
return (await base.Connection
419+
.QueryAsync<int>(query, param: new
420+
{
421+
artistId
422+
}, transaction: base.Transaction))
423+
.ToList();
424+
}
394425
}

MiniMediaScanner/Services/TidalService.cs

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public async Task UpdateArtistByIdAsync(int artistId,
9191
await _updateTidalRepository.CommitAsync();
9292
return;
9393
}
94-
94+
9595
//fetch all the albums available of the artist
9696
//by going through the next page cursor
9797
//populating the artist object
@@ -121,6 +121,8 @@ public async Task UpdateArtistByIdAsync(int artistId,
121121
.Where(x => x.Type == "albums")
122122
.ToList();
123123

124+
await PullMissingSimilarTracksAsync(artistId, _updateTidalRepository, callback, artistInfo, albums.Count);
125+
124126
if (albums.Count >= _ignoreArtistAlbumAmount)
125127
{
126128
await _updateTidalRepository.CommitAsync();
@@ -304,7 +306,6 @@ await _updateTidalRepository.UpsertAlbumExternalLinkAsync(int.Parse(album.Id),
304306
?.Items
305307
?.Data
306308
?.FirstOrDefault(x => x.Id == track.Id);
307-
308309

309310
callback?.Invoke(new UpdateTidalCallback(artistId,
310311
artistInfo.Data.Attributes.Name,
@@ -360,24 +361,9 @@ await _updateTidalRepository.UpsertTrackAsync(int.Parse(track.Id),
360361
trackNumber.Meta.VolumeNumber,
361362
trackNumber.Meta.TrackNumber,
362363
track.Attributes.Version ?? string.Empty);
363-
364-
var similarTracks = await _tidalAPIService.GetSimilarTracksByTrackIdAsync(int.Parse(track.Id));
365364

366-
foreach (var similarTrack in similarTracks.Data)
367-
{
368-
string similarIsrc = similarTracks.Included
369-
?.Where(x => x.Id == similarTrack.Id)
370-
?.Select(x => x.Attributes.ISRC)
371-
?.FirstOrDefault() ?? string.Empty;
372-
373-
await _updateTidalRepository.UpsertSimilarTrackAsync(
374-
int.Parse(track.Id),
375-
int.Parse(similarTrack.Id),
376-
similarIsrc);
377-
}
378-
365+
await ProcessSimilarTrackAsync(int.Parse(track.Id), _updateTidalRepository);
379366
}
380-
381367
progress++;
382368
}
383369

@@ -397,6 +383,53 @@ await _updateTidalRepository.UpsertSimilarTrackAsync(
397383
}
398384
}
399385

386+
private async Task PullMissingSimilarTracksAsync(
387+
int artistId,
388+
UpdateTidalRepository updateTidalRepository,
389+
Action<UpdateTidalCallback>? callback,
390+
TidalSearchResponse artistInfo,
391+
int albumCount)
392+
{
393+
List<int> trackIdsMissingSimilar = await updateTidalRepository.GetMissingSimilarTrackIdsByArtistIdAsync(artistId);
394+
395+
int repullProgress = 1;
396+
foreach(int trackId in trackIdsMissingSimilar)
397+
{
398+
await ProcessSimilarTrackAsync(trackId, updateTidalRepository);
399+
400+
callback?.Invoke(new UpdateTidalCallback(artistId,
401+
artistInfo.Data.Attributes.Name,
402+
string.Empty,
403+
albumCount,
404+
UpdateTidalStatus.Updating,
405+
0,
406+
$"Pulling missing similar tracks {repullProgress} of {trackIdsMissingSimilar.Count} processed"));
407+
repullProgress++;
408+
}
409+
}
410+
411+
private async Task ProcessSimilarTrackAsync(int trackId, UpdateTidalRepository updateTidalRepository)
412+
{
413+
if (!await updateTidalRepository.HasSimilarTrackRecordsAsync(trackId))
414+
{
415+
var similarTracks = await _tidalAPIService.GetSimilarTracksByTrackIdAsync(trackId);
416+
417+
foreach (var similarTrack in similarTracks?.Data ?? [])
418+
{
419+
string similarIsrc = similarTracks
420+
?.Included
421+
?.Where(x => x.Id == similarTrack.Id)
422+
?.Select(x => x.Attributes.ISRC)
423+
?.FirstOrDefault() ?? string.Empty;
424+
425+
await updateTidalRepository.UpsertSimilarTrackAsync(
426+
trackId,
427+
int.Parse(similarTrack.Id),
428+
similarIsrc);
429+
}
430+
}
431+
}
432+
400433
private async Task<TidalSearchResponse?> InsertArtistInfoAsync(int artistId, bool ignorePeventCheck = false)
401434
{
402435
UpdateTidalRepository _updateTidalRepository = new UpdateTidalRepository(_connectionString);

0 commit comments

Comments
 (0)