diff --git a/src/app/views/upload.zig b/src/app/views/upload.zig index 3e9e8ba..b21fa17 100644 --- a/src/app/views/upload.zig +++ b/src/app/views/upload.zig @@ -89,6 +89,8 @@ pub fn post(request: *jetzig.Request) !jetzig.View { var albumsongs = try job.params.put("albumsongs", .object); var albumsongsartists = try job.params.put("albumsongsartists", .object); + var hash_buffer = [_]u8{undefined} ** 20; // A minimum i64 needs 19 digits + 1 negative sign + appends: for (imported_scrobbles) |scrobble| { if (scrobble.date > latest_timestamp * std.time.ns_per_s or scrobble.date < earliest_timestamp * std.time.ns_per_s) { limited_tracks += 1; @@ -124,18 +126,20 @@ pub fn post(request: *jetzig.Request) !jetzig.View { try album_hash_string.appendSlice(artist); const artist_hash = std.hash.Fnv1a_64.hash(artist); try stored_artist_hashes.append(artist_hash); - const signed_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{@as(i64, @bitCast(artist_hash))}); + //const signed_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{@as(i64, @bitCast(artist_hash))}); + const signed_hash_string = try std.fmt.bufPrint(&hash_buffer, "{}", .{@as(i64, @bitCast(artist_hash))}); if (artists.get(signed_hash_string) == null) try artists.put(signed_hash_string, artist); } try album_hash_string.appendSlice(complete_scrobble.album); const album_hash = std.hash.Fnv1a_64.hash(album_hash_string.items); - const signed_album_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{@as(i64, @bitCast(album_hash))}); + const signed_album_hash_string = try std.fmt.bufPrint(&hash_buffer, "{}", .{@as(i64, @bitCast(album_hash))}); if (albums.get(signed_album_hash_string) == null) try albums.put(signed_album_hash_string, complete_scrobble.album); for (stored_artist_hashes.items) |artist_hash| { const artistalbum_hash = pair(artist_hash, album_hash); - const signed_artistalbums_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{@as(i64, @bitCast(artistalbum_hash))}); + //const signed_artistalbums_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{@as(i64, @bitCast(artistalbum_hash))}); + const signed_artistalbums_hash_string = try std.fmt.bufPrint(&hash_buffer, "{}", .{@as(i64, @bitCast(artistalbum_hash))}); if (tracks.get(signed_artistalbums_hash_string) == null) { var artistalbum = try artistalbums.put(signed_artistalbums_hash_string, .object); try artistalbum.put("artist", @as(i64, @bitCast(artist_hash))); @@ -147,28 +151,28 @@ pub fn post(request: *jetzig.Request) !jetzig.View { try track_hash_string.appendSlice(complete_scrobble.album); try track_hash_string.appendSlice(complete_scrobble.track); const track_hash = std.hash.Fnv1a_64.hash(track_hash_string.items); - const signed_track_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{@as(i64, @bitCast(track_hash))}); + const signed_track_hash_string = try std.fmt.bufPrint(&hash_buffer, "{}", .{@as(i64, @bitCast(track_hash))}); if (tracks.get(signed_track_hash_string) == null) try tracks.put(signed_track_hash_string, complete_scrobble.track); const albumsong_hash = pair(album_hash, track_hash); - const signed_albumsong_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{@as(i64, @bitCast(albumsong_hash))}); + const signed_albumsong_hash_string = try std.fmt.bufPrint(&hash_buffer, "{}", .{@as(i64, @bitCast(albumsong_hash))}); if (albumsongs.get(signed_albumsong_hash_string)) |albumsong| { var albumsong_scrobbles = albumsong.get("scrobbles"); - try albumsong_scrobbles.?.append(complete_scrobble.date); + try albumsong_scrobbles.?.append(@divFloor(complete_scrobble.date, std.time.ns_per_us)); // MICROSECONDS } else { var albumsong = try albumsongs.put(signed_albumsong_hash_string, .object); try albumsong.put("album", @as(i64, @bitCast(album_hash))); try albumsong.put("song", @as(i64, @bitCast(track_hash))); var albumsong_scrobbles = try albumsong.put("scrobbles", .array); - try albumsong_scrobbles.append(complete_scrobble.date); + try albumsong_scrobbles.append(@divFloor(complete_scrobble.date, std.time.ns_per_us)); // MICROSECONDS } for (complete_scrobble.artists_track) |artist| { const artist_hash = std.hash.Fnv1a_64.hash(artist); - const signed_artist_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{@as(i64, @bitCast(artist_hash))}); + const signed_artist_hash_string = try std.fmt.bufPrint(&hash_buffer, "{}", .{@as(i64, @bitCast(artist_hash))}); if (artists.get(signed_artist_hash_string) == null) try artists.put(signed_artist_hash_string, artist); const albumsongsartist_hash = pair(albumsong_hash, artist_hash); - const signed_albumsongsartist_hash_string = try std.fmt.allocPrint(request.allocator, "{}", .{albumsongsartist_hash}); + const signed_albumsongsartist_hash_string = try std.fmt.bufPrint(&hash_buffer, "{}", .{@as(i64, @bitCast(albumsongsartist_hash))}); if (albumsongsartists.get(signed_albumsongsartist_hash_string) == null) { var albumsongartist = try albumsongsartists.put(signed_albumsongsartist_hash_string, .object); try albumsongartist.put("albumsong", @as(i64, @bitCast(albumsong_hash)));