From 614607ae7167d986aa5be71e78ccf439ef288f6e Mon Sep 17 00:00:00 2001 From: mitteneer Date: Fri, 16 May 2025 01:05:32 -0400 Subject: [PATCH] Fix LastFM uploadig error I figured it out; if you have a song currently being played, then it doesn't have a date --- src/app/views/upload.zig | 22 ++++++++++++---------- src/types.zig | 26 +++++++++++++------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/app/views/upload.zig b/src/app/views/upload.zig index 220e2c9..2582ff4 100644 --- a/src/app/views/upload.zig +++ b/src/app/views/upload.zig @@ -147,7 +147,7 @@ pub fn post(request: *jetzig.Request) !jetzig.View { 2 => { if (params.getT(.string, "username")) |username| { _ = username; - const query: []const u8 = "https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=VAOTM&api_key=b0c410a48a6078a651e0832699e3cd41&limit=200&format=json"; + const query: []const u8 = "https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=VAOTM&api_key=b0c410a48a6078a651e0832699e3cd41&limit=1000&format=json"; const user_agent: []const u8 = "Zuletzt/0.0.1"; var client = Client{ .allocator = request.allocator }; var ar = std.ArrayList(u8).init(request.allocator); @@ -155,12 +155,13 @@ pub fn post(request: *jetzig.Request) !jetzig.View { const first_response = try ar.toOwnedSlice(); const json = try std.json.parseFromSliceLeaky(Data.LastFMWeb, request.allocator, first_response, .{ .ignore_unknown_fields = true }); - for (json.recenttracks.track) |scrobble| { + appends: for (json.recenttracks.track) |scrobble| { + if (scrobble.date == null) continue :appends; const pre_formatted_scrobble = Data.ImportedScrobble{ .track = scrobble.name, - .album = if (scrobble.album) |album| album.@"#text".? else "", - .artist = scrobble.artist.@"#text".?, - .date = try std.fmt.parseInt(i64, scrobble.date.uts, 10), + .album = if (scrobble.album) |album| album.@"#text" else "Not Provided", + .artist = scrobble.artist.@"#text", + .date = try std.fmt.parseInt(i64, scrobble.date.?.uts, 10), }; const formatted_scrobble = if (rule_list) |rl| @@ -195,18 +196,19 @@ pub fn post(request: *jetzig.Request) !jetzig.View { } const max_pages = (try std.fmt.parseInt(usize, json.recenttracks.@"@attr".totalPages, 10)) + 1; for (2..max_pages) |page| { - const rest_query: []const u8 = try std.fmt.allocPrint(request.allocator, "https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=VAOTM&api_key=b0c410a48a6078a651e0832699e3cd41&limit=200&page={}&format=json", .{page}); + const rest_query: []const u8 = try std.fmt.allocPrint(request.allocator, "https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=VAOTM&api_key=b0c410a48a6078a651e0832699e3cd41&limit=1000&page={}&format=json", .{page}); std.log.debug("{s}", .{rest_query}); _ = try client.fetch(.{ .response_storage = .{ .dynamic = &ar }, .location = .{ .url = rest_query }, .method = .GET, .headers = .{ .user_agent = .{ .override = user_agent } } }); const response = try ar.toOwnedSlice(); const json2 = try std.json.parseFromSliceLeaky(Data.LastFMWeb, request.allocator, response, .{ .ignore_unknown_fields = true }); - for (json2.recenttracks.track) |scrobble| { + appends: for (json2.recenttracks.track) |scrobble| { + if (scrobble.date == null) continue :appends; const pre_formatted_scrobble = Data.ImportedScrobble{ .track = scrobble.name, - .album = if (scrobble.album) |album| album.@"#text".? else "", - .artist = scrobble.artist.@"#text".?, - .date = try std.fmt.parseInt(i64, scrobble.date.uts, 10), + .album = if (scrobble.album) |album| album.@"#text" else "Not Provided", + .artist = scrobble.artist.@"#text", + .date = try std.fmt.parseInt(i64, scrobble.date.?.uts, 10), }; const formatted_scrobble = if (rule_list) |rl| diff --git a/src/types.zig b/src/types.zig index 898943a..202bce6 100644 --- a/src/types.zig +++ b/src/types.zig @@ -50,34 +50,34 @@ pub const LastFMWeb = struct { album: ?LastFMWebHyperlinkData = null, name: []const u8, mbid: ?[]const u8 = null, - image: ?[]struct { + image: []struct { size: []const u8, @"#text": []const u8, - } = null, - date: struct { + }, + date: ?struct { uts: []const u8, @"#text": []const u8, - }, - @"@attr": ?struct { - nowplaying: ?[]const u8 = null, } = null, - url: ?[]const u8 = null, + @"@attr": ?struct { + nowplaying: []const u8, + } = null, + url: []const u8, }, @"@attr": LastFMWebAttr, }, }; pub const LastFMWebAttr = struct { - perPage: ?[]const u8 = null, + perPage: []const u8, totalPages: []const u8, - page: ?[]const u8 = null, - user: ?[]const u8 = null, - total: ?[]const u8 = null, + page: []const u8, + user: []const u8, + total: []const u8, }; pub const LastFMWebHyperlinkData = struct { - mbid: ?[]const u8 = null, - @"#text": ?[]const u8 = null, + mbid: []const u8, + @"#text": []const u8, }; pub const Rule = struct {