Cache top tracks

This commit is contained in:
2023-06-12 16:48:37 +10:00
parent a50018f712
commit e075e6e3ef
7 changed files with 62 additions and 7 deletions

View File

@@ -5,14 +5,26 @@ module Adamantium
module Queries
module Posts
class TopTracks
include Deps["settings", "repos.post_repo"]
include Deps["settings", "repos.post_repo", "repos.top_track_repo"]
def call(slug:)
post = post_repo.fetch!(slug)
start_date = TimeMath.week.floor(post.published_at).to_i
end_date = TimeMath.week.ceil(post.published_at).to_i
top_tracks = top_track_repo.for_post(id: post.id)
return top_tracks unless top_tracks.empty?
lastfm = Lastfm.new(settings.lastfm_api_key, settings.lastfm_secret)
lastfm.user.get_weekly_track_chart(user: "dNitza", from: TimeMath.week.floor(post.published_at).to_i, to: TimeMath.week.ceil(post.published_at).to_i)
tracks = lastfm.user.get_weekly_track_chart(user: "dNitza", from: start_date, to: end_date)
if track = tracks.first
top_track_repo.upsert(post_id: post.id, name: track["name"], artist: track.dig("artist", "content"), url: track["url"], mb_id: track["mbid"])
end
top_track_repo.for_post(id: post.id)
end
end
end

View File

@@ -0,0 +1,17 @@
module Adamantium
module Repos
class TopTrackRepo < Adamantium::Repo[:top_tracks]
def for_post(id:)
top_tracks
.where(post_id: id)
.to_a
end
def upsert(post_id:, name:, artist:, url:, mb_id:)
top_tracks
.upsert({name: name, artist: artist, url: url, mb_id: mb_id, post_id: post_id},
{ target: :post_id, update: {name: name, artist: artist, url: url, mb_id: mb_id, post_id: post_id} })
end
end
end
end

View File

@@ -5,15 +5,15 @@ module Adamantium
config.layout = false
expose :name do |track:|
track["name"]
track.name
end
expose :artist do |track:|
track.dig("artist", "content")
track.artist
end
expose :url do |track:|
track["url"]
track.url
end
end
end