Skip to content

Commit 360bc34

Browse files
committed
minor fixes + more error logging + SpotifyImporter improvements
commit e31929c7c2ef2ba3c66253261177c4272772b264 Author: Benedikt Alkin <[email protected]> Date: Thu Jun 23 19:49:12 2022 +0200 Update SpotifyOperations.cs commit 9644b18 Author: Benedikt Alkin <[email protected]> Date: Thu Jun 23 19:42:37 2022 +0200 a commit 97ac2dd Author: Benedikt Alkin <[email protected]> Date: Wed Jun 22 23:58:22 2022 +0200 Update SpotifyImporter.cs commit d472b29 Author: Benedikt Alkin <[email protected]> Date: Wed Jun 22 00:14:22 2022 +0200 logging commit 18a6948 Author: Benedikt Alkin <[email protected]> Date: Tue Jun 21 23:40:14 2022 +0200 Update SpotifyImporter.cs
1 parent 421dd12 commit 360bc34

File tree

6 files changed

+108
-37
lines changed

6 files changed

+108
-37
lines changed

Backend/SpotifyOperations.cs

+57-31
Original file line numberDiff line numberDiff line change
@@ -283,55 +283,81 @@ public static async Task<bool> SyncPlaylistOutputNode(PlaylistOutputNode playlis
283283
if (playlistOutputNode.GeneratedPlaylistId == null)
284284
{
285285
// create playlist
286-
var request = new PlaylistCreateRequest(playlistOutputNode.PlaylistName)
286+
try
287287
{
288-
Description = "Automatically generated playlist by \"Song Tagger for Spotify\" (https://github.com/BenediktAlkin/SpotifySongTagger)"
289-
};
290-
var createdPlaylist = await Spotify.Playlists.Create(DataContainer.Instance.User.Id, request);
288+
var request = new PlaylistCreateRequest(playlistOutputNode.PlaylistName)
289+
{
290+
Description = "Automatically generated playlist by \"Song Tagger for Spotify\" (https://github.com/BenediktAlkin/SpotifySongTagger)"
291+
};
292+
var createdPlaylist = await Spotify.Playlists.Create(DataContainer.Instance.User.Id, request);
291293

292-
if (DatabaseOperations.EditPlaylistOutputNodeGeneratedPlaylistId(playlistOutputNode, createdPlaylist.Id))
293-
playlistOutputNode.GeneratedPlaylistId = createdPlaylist.Id;
294+
if (DatabaseOperations.EditPlaylistOutputNodeGeneratedPlaylistId(playlistOutputNode, createdPlaylist.Id))
295+
playlistOutputNode.GeneratedPlaylistId = createdPlaylist.Id;
296+
}
297+
catch(Exception e)
298+
{
299+
Logger.Error($"Failed to create playlist{Environment.NewLine}{e.Message}");
300+
return false;
301+
}
302+
294303
}
295304
else
296305
{
297-
var playlistDetails = await Spotify.Playlists.Get(playlistOutputNode.GeneratedPlaylistId);
298-
// like playlist if it was unliked
299-
var followCheckReq = new FollowCheckPlaylistRequest(new List<string> { DataContainer.Instance.User.Id });
300-
if (!(await Spotify.Follow.CheckPlaylist(playlistOutputNode.GeneratedPlaylistId, followCheckReq)).First())
301-
await Spotify.Follow.FollowPlaylist(playlistOutputNode.GeneratedPlaylistId);
302-
303-
// rename spotify playlist if name changed
304-
if (playlistDetails.Name != playlistOutputNode.PlaylistName)
306+
try
305307
{
306-
var changeNameReq = new PlaylistChangeDetailsRequest { Name = playlistOutputNode.PlaylistName };
307-
await Spotify.Playlists.ChangeDetails(playlistOutputNode.GeneratedPlaylistId, changeNameReq);
308-
}
308+
var playlistDetails = await Spotify.Playlists.Get(playlistOutputNode.GeneratedPlaylistId);
309+
// like playlist if it was unliked
310+
var followCheckReq = new FollowCheckPlaylistRequest(new List<string> { DataContainer.Instance.User.Id });
311+
if (!(await Spotify.Follow.CheckPlaylist(playlistOutputNode.GeneratedPlaylistId, followCheckReq)).First())
312+
await Spotify.Follow.FollowPlaylist(playlistOutputNode.GeneratedPlaylistId);
309313

314+
// rename spotify playlist if name changed
315+
if (playlistDetails.Name != playlistOutputNode.PlaylistName)
316+
{
317+
var changeNameReq = new PlaylistChangeDetailsRequest { Name = playlistOutputNode.PlaylistName };
318+
await Spotify.Playlists.ChangeDetails(playlistOutputNode.GeneratedPlaylistId, changeNameReq);
319+
}
310320

311-
// remove everything
312-
if (playlistDetails.Tracks.Total.Value > 0)
313-
{
314-
var request = new PlaylistRemoveItemsRequest
321+
322+
// remove everything
323+
if (playlistDetails.Tracks.Total.Value > 0)
315324
{
316-
Positions = Enumerable.Range(0, playlistDetails.Tracks.Total.Value).ToList(),
317-
SnapshotId = playlistDetails.SnapshotId,
318-
};
319-
await Spotify.Playlists.RemoveItems(playlistOutputNode.GeneratedPlaylistId, request);
325+
var request = new PlaylistRemoveItemsRequest
326+
{
327+
Positions = Enumerable.Range(0, playlistDetails.Tracks.Total.Value).ToList(),
328+
SnapshotId = playlistDetails.SnapshotId,
329+
};
330+
await Spotify.Playlists.RemoveItems(playlistOutputNode.GeneratedPlaylistId, request);
331+
}
332+
}
333+
catch(Exception e)
334+
{
335+
Logger.Error($"Failed to like/rename/remove_everything from playlist to generate{Environment.NewLine}{e.Message}");
336+
return false;
320337
}
321338
}
322339

323340
// sync with spotify
324341
const int BATCH_SIZE = 100;
325342
playlistOutputNode.CalculateOutputResult();
326343
var tracks = playlistOutputNode.OutputResult;
327-
for (var i = 0; i < tracks.Count; i += BATCH_SIZE)
344+
try
345+
{
346+
for (var i = 0; i < tracks.Count; i += BATCH_SIZE)
347+
{
348+
var request = new PlaylistAddItemsRequest(
349+
Enumerable.Range(0, Math.Min(tracks.Count - i, BATCH_SIZE))
350+
.Select(j => $"spotify:track:{tracks[i + j].Id}")
351+
.ToList());
352+
await Spotify.Playlists.AddItems(playlistOutputNode.GeneratedPlaylistId, request);
353+
}
354+
}
355+
catch(Exception e)
328356
{
329-
var request = new PlaylistAddItemsRequest(
330-
Enumerable.Range(0, Math.Min(tracks.Count - i, BATCH_SIZE))
331-
.Select(j => $"spotify:track:{tracks[i + j].Id}")
332-
.ToList());
333-
await Spotify.Playlists.AddItems(playlistOutputNode.GeneratedPlaylistId, request);
357+
Logger.Error($"Failed to add track to playlist{Environment.NewLine}{e.Message}");
358+
return false;
334359
}
360+
335361
Logger.Information($"synchronized PlaylistOutputNode {playlistOutputNode.PlaylistName} to spotify");
336362
return true;
337363
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Backend;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading.Tasks;
7+
8+
namespace DatabaseToSpotifyLibraryImporter
9+
{
10+
public static class DatabaseCleaner
11+
{
12+
public static void Clean()
13+
{
14+
// remove generated playlist ids (to trigger creation of new playlists when running a generator)
15+
// else the existing playlist would be overwritten
16+
using var db = ConnectionManager.NewContext();
17+
var playlistOutputNodes = db.PlaylistOutputNodes.ToList();
18+
foreach (var node in playlistOutputNodes)
19+
node.GeneratedPlaylistId = null;
20+
db.SaveChanges();
21+
}
22+
}
23+
}

DatabaseToSpotifyLibraryImporter/Program.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
if (!await ConnectionManager.Instance.TryInitFromSavedToken())
3030
await ConnectionManager.Instance.Login(rememberMe: true);
3131

32+
DatabaseCleaner.Clean();
3233

33-
await SpotifyCleaner.ClearLibrary();
34-
await SpotifyImporter.Import();
34+
35+
// only needed if sync is needed
36+
// await SpotifyCleaner.ClearLibrary();
37+
// await SpotifyImporter.Import();

DatabaseToSpotifyLibraryImporter/SpotifyCleaner.cs

+6
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ private static async Task<List<T>> GetAll<T>(Paging<T> page)
1818
{
1919
var all = new List<T>();
2020
await foreach (var item in Spotify.Paginate(page))
21+
{
2122
all.Add(item);
23+
if (all.Count % 100 == 0)
24+
Logger.Information($"fetched {all.Count}/{page.Total}");
25+
}
26+
27+
2228
return all;
2329
}
2430

DatabaseToSpotifyLibraryImporter/SpotifyImporter.cs

+16-3
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ public static async Task ImportLikedSongs()
3232
{
3333
var ids = allSongs.Skip(i).Take(limit).ToList();
3434
if (!await Spotify.Library.SaveTracks(new LibrarySaveTracksRequest(ids)))
35-
Logger.Error($"failed importing songs {i} - {i * limit + limit}");
35+
Logger.Error($"failed importing songs {i} - {i + limit}");
36+
else
37+
Logger.Information($"imported songs {i} - {i + limit}/{allSongs.Count}");
3638
}
3739
Logger.Information("imported songs");
3840
}
3941
public static async Task ImportLikedPlaylists()
4042
{
41-
const int limit = 50;
43+
const int limit = 1;
4244
using var db = ConnectionManager.NewContext();
4345
var allPlaylists = db.Playlists.Include(p => p.Tracks).ToList();
4446

@@ -54,7 +56,18 @@ public static async Task ImportLikedPlaylists()
5456
for (var j = 0; j < playlist.Tracks.Count; j += limit)
5557
{
5658
var uris = playlist.Tracks.Skip(j).Take(limit).Select(t => $"spotify:track:{t.Id}").ToList();
57-
await Spotify.Playlists.AddItems(spotifyPlaylist!.Id, new PlaylistAddItemsRequest(uris));
59+
try
60+
{
61+
await Spotify.Playlists.AddItems(spotifyPlaylist.Id, new PlaylistAddItemsRequest(uris));
62+
Logger.Information($"imported songs {j}-{j + limit}/{playlist.Tracks.Count}");
63+
}
64+
catch (Exception ex)
65+
{
66+
var uri_str = uris.Aggregate((s1, s2) => $"{s1}{Environment.NewLine}{s2}");
67+
Logger.Error($"failed to add track(s):{ex}{Environment.NewLine}{uri_str}");
68+
}
69+
70+
5871
}
5972
}
6073
else

SpotifySongTagger/Views/PlaylistGenerator.xaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@
203203
SelectedItem="{Binding SelectedGraphGeneratorPage}">
204204
<ListBox.ItemTemplate>
205205
<DataTemplate>
206-
<TextBlock Margin="0 0.5 0 0" Text="{Binding Name}" VerticalAlignment="Center"/>
206+
<TextBlock Margin="0 0.4 0 0" Text="{Binding Name}" VerticalAlignment="Center"/>
207207
</DataTemplate>
208208
</ListBox.ItemTemplate>
209209
</ListBox>

0 commit comments

Comments
 (0)