Create buffer for signed hashes rather than using arraylist
Also fixes bug with artistalbums hash. i64 will only ever take up 20 characters
This commit is contained in:
parent
cd8c798bd4
commit
682eebc951
1 changed files with 13 additions and 9 deletions
|
|
@ -89,6 +89,8 @@ pub fn post(request: *jetzig.Request) !jetzig.View {
|
||||||
var albumsongs = try job.params.put("albumsongs", .object);
|
var albumsongs = try job.params.put("albumsongs", .object);
|
||||||
var albumsongsartists = try job.params.put("albumsongsartists", .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| {
|
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) {
|
if (scrobble.date > latest_timestamp * std.time.ns_per_s or scrobble.date < earliest_timestamp * std.time.ns_per_s) {
|
||||||
limited_tracks += 1;
|
limited_tracks += 1;
|
||||||
|
|
@ -124,18 +126,20 @@ pub fn post(request: *jetzig.Request) !jetzig.View {
|
||||||
try album_hash_string.appendSlice(artist);
|
try album_hash_string.appendSlice(artist);
|
||||||
const artist_hash = std.hash.Fnv1a_64.hash(artist);
|
const artist_hash = std.hash.Fnv1a_64.hash(artist);
|
||||||
try stored_artist_hashes.append(artist_hash);
|
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);
|
if (artists.get(signed_hash_string) == null) try artists.put(signed_hash_string, artist);
|
||||||
}
|
}
|
||||||
|
|
||||||
try album_hash_string.appendSlice(complete_scrobble.album);
|
try album_hash_string.appendSlice(complete_scrobble.album);
|
||||||
const album_hash = std.hash.Fnv1a_64.hash(album_hash_string.items);
|
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);
|
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| {
|
for (stored_artist_hashes.items) |artist_hash| {
|
||||||
const artistalbum_hash = pair(artist_hash, album_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) {
|
if (tracks.get(signed_artistalbums_hash_string) == null) {
|
||||||
var artistalbum = try artistalbums.put(signed_artistalbums_hash_string, .object);
|
var artistalbum = try artistalbums.put(signed_artistalbums_hash_string, .object);
|
||||||
try artistalbum.put("artist", @as(i64, @bitCast(artist_hash)));
|
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.album);
|
||||||
try track_hash_string.appendSlice(complete_scrobble.track);
|
try track_hash_string.appendSlice(complete_scrobble.track);
|
||||||
const track_hash = std.hash.Fnv1a_64.hash(track_hash_string.items);
|
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);
|
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 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| {
|
if (albumsongs.get(signed_albumsong_hash_string)) |albumsong| {
|
||||||
var albumsong_scrobbles = albumsong.get("scrobbles");
|
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 {
|
} else {
|
||||||
var albumsong = try albumsongs.put(signed_albumsong_hash_string, .object);
|
var albumsong = try albumsongs.put(signed_albumsong_hash_string, .object);
|
||||||
try albumsong.put("album", @as(i64, @bitCast(album_hash)));
|
try albumsong.put("album", @as(i64, @bitCast(album_hash)));
|
||||||
try albumsong.put("song", @as(i64, @bitCast(track_hash)));
|
try albumsong.put("song", @as(i64, @bitCast(track_hash)));
|
||||||
var albumsong_scrobbles = try albumsong.put("scrobbles", .array);
|
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| {
|
for (complete_scrobble.artists_track) |artist| {
|
||||||
const artist_hash = std.hash.Fnv1a_64.hash(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);
|
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 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) {
|
if (albumsongsartists.get(signed_albumsongsartist_hash_string) == null) {
|
||||||
var albumsongartist = try albumsongsartists.put(signed_albumsongsartist_hash_string, .object);
|
var albumsongartist = try albumsongsartists.put(signed_albumsongsartist_hash_string, .object);
|
||||||
try albumsongartist.put("albumsong", @as(i64, @bitCast(albumsong_hash)));
|
try albumsongartist.put("albumsong", @as(i64, @bitCast(albumsong_hash)));
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue