recurring loading working now

main
Guido Schweizer 2025-06-22 11:04:32 +02:00
parent 5eaad428ff
commit 98b28bcd4f
9 changed files with 70 additions and 84 deletions

View File

@ -14,7 +14,8 @@ main {
padding-left: 3vw; padding-left: 3vw;
padding-right: 3vw; padding-right: 3vw;
box-sizing: border-box; box-sizing: border-box;
margin-top: 4.5em; margin-top: 1.5em;
margin-bottom: 2.5em;
} }
.dashboard-widget { .dashboard-widget {

View File

@ -45,6 +45,7 @@ class SpotifyController < ApplicationController
begin begin
token_response = SpotifyClient.new(current_user).token_response_from_code(code) token_response = SpotifyClient.new(current_user).token_response_from_code(code)
Login.find_or_create_for_response!(current_user, token_response) Login.find_or_create_for_response!(current_user, token_response)
LoadUserActivitiesJob.perform_later(current_user)
true true
rescue RestClient::Exception, JSON::ParserError => e rescue RestClient::Exception, JSON::ParserError => e
Rails.logger.error("Spotify callback error: #{e.class} - #{e.message}") Rails.logger.error("Spotify callback error: #{e.class} - #{e.message}")

View File

@ -1,4 +0,0 @@
class LoadActivitiesJob < ApplicationJob
def perform
end
end

View File

@ -0,0 +1,13 @@
class LoadAllActivitiesJob < ApplicationJob
def perform
User.all.each do |user|
begin
next if user.logins.alive.empty?
LoadUserActivitiesJob.perform_later(user)
logger.info("Loading for #{user.id} scheduled")
rescue StandardError => e
Rails.logger.error("Loading for #{user.id} failed: #{e.class} - #{e.message}")
end
end
end
end

View File

@ -0,0 +1,32 @@
class LoadUserActivitiesJob < ApplicationJob
attr_reader :user
def perform(user)
logger.info("Loading for #{user.id} started")
@user = user
user.logins.alive.each do |login|
update_spotify(login)
end
end
def update_spotify(login)
client = SpotifyClient.new(login)
last_spotify_activity_at = latest_activity_iso(login.platform)
new_activities = client.load_since(last_spotify_activity_at)
create_action = CreateSpotifyActivity.new(user, new_activities)
create_action.perform
logger.info("Loading for #{user.id} finished with #{new_activities.size} new activities")
rescue StandardError => e
Rails.logger.error(e)
end
def latest_activity(platform)
latest = Activity.where(user: user, platform: platform).order(started_at: :desc).limit(1).last
latest.started_at&.to_datetime if latest.present?
end
def latest_activity_iso(platform)
latest = latest_activity(platform)
latest.strftime("%Q") if latest.present?
end
end

View File

@ -8,21 +8,23 @@ class CreateSpotifyActivity
# rubocop:disable Metrics/AbcSize # rubocop:disable Metrics/AbcSize
def perform def perform
response['items'].reverse.each do |play| counts = response["items"].size
Rails.logger.info("Saving #{counts} activities")
response["items"].reverse.each do |play|
activity = new_activity activity = new_activity
activity.item_ref = play['track']['id'] activity.item_ref = play["track"]["id"]
artist_names = play['track']['artists'].map { |a| a['name'] } artist_names = play["track"]["artists"].map { |a| a["name"] }
artists = artist_names.join(', ') artists = artist_names.join(", ")
title = "#{artists} - #{play['track']['name']}" title = "#{artists} - #{play['track']['name']}"
activity.item_title = title activity.item_title = title
activity.item_length = play['track']['duration'].to_s activity.item_length = play["track"]["duration"].to_s
activity.started_at = DateTime.parse(play['played_at']) activity.started_at = DateTime.parse(play["played_at"])
activity.save activity.save!
end end
end end
# rubocop:enable Metrics/AbcSize # rubocop:enable Metrics/AbcSize
def new_activity def new_activity
Activity.new(user: user, platform: 'spotify') Activity.new(user: user, platform: "spotify")
end end
end end

View File

@ -1,53 +0,0 @@
class LoadPlays
attr_reader :user
def initialize(user)
@user = user
end
def perform
user.logins.alive.each do |login|
if login.spotify?
update_spotify(login)
elsif login.netflix?
update_netflix(login)
else
puts "login #{login.id}, #{login.type} unknown"
end
end
end
def update_spotify(login)
client = Spotify.new(login)
last_spotify_activity_at = latest_activity_iso(login.platform)
new_activities = client.load_since(last_spotify_activity_at)
create_action = CreateSpotifyActivity.new(user, new_activities)
create_action.perform
rescue StandardError => e
Rails.logger.error(e)
LogLoadFailedWorker.perform_async(login.id)
end
def update_netflix(login)
client = Netflix.new(login)
latest_netflix_activity = latest_activity(login.platform)
new_activites = client.viewingactivity
create_action = CreateNetflixActivity.new(user, latest_netflix_activity, new_activites)
create_action.perform
rescue StandardError => e
Rails.logger.error(e)
LogLoadFailedWorker.perform_async(login.id)
# Rails.logger.info("trying to update shakti")
# ReloadShaktiPath.new.perform
end
def latest_activity(platform)
latest = Activity.where(user: user, platform: platform).order(started_at: :desc).limit(1).last
latest.started_at&.to_datetime if latest.present?
end
def latest_activity_iso(platform)
latest = latest_activity(platform)
latest.strftime('%Q') if latest.present?
end
end

View File

@ -24,12 +24,12 @@
<body> <body>
<%= render partial: 'layouts/header' %> <%= render partial: 'layouts/header' %>
<%= yield %>
<% if notice %> <% if notice %>
<p class="notice"><%= notice %></p> <p class="notice"><%= notice %></p>
<% end %> <% end %>
<% if alert %> <% if alert %>
<p class="alert"><%= alert %></p> <p class="alert"><%= alert %></p>
<% end %> <% end %>
<%= yield %>
</body> </body>
</html> </html>

View File

@ -1,17 +1,11 @@
# production: production:
# periodic_cleanup: recurring_load_all_activities:
# class: CleanSoftDeletedRecordsJob class: LoadAllActivitiesJob
# queue: background queue: background
# args: [ 1000, { batch_size: 500 } ] schedule: every 5 minutes
# schedule: every hour
# periodic_command:
# command: "SoftDeletedRecord.due.delete_all"
# priority: 2
# schedule: at 5am every day
# development:
# periodic_command:
# class: TestJob
# queue: background
# schedule: every minute
development:
recurring_load_all_activities:
class: LoadAllActivitiesJob
queue: background
schedule: every 15 seconds