dawarich/app/services/photoprism/request_photos.rb

89 lines
2.1 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
class Photoprism::RequestPhotos
attr_reader :user, :photoprism_api_base_url, :photoprism_api_key, :start_date, :end_date
def initialize(user, start_date: '1970-01-01', end_date: nil)
@user = user
2024-12-02 12:21:12 -05:00
@photoprism_api_base_url = URI.parse("#{user.settings['photoprism_url']}/api/v1/photos")
@photoprism_api_key = user.settings['photoprism_api_key']
@start_date = start_date
@end_date = end_date
end
def call
raise ArgumentError, 'Photoprism URL is missing' if user.settings['photoprism_url'].blank?
2024-12-02 11:22:36 -05:00
raise ArgumentError, 'Photoprism API key is missing' if photoprism_api_key.blank?
data = retrieve_photoprism_data
2024-12-02 12:21:12 -05:00
return [] if data[0]['error'].present?
time_framed_data(data, start_date, end_date)
end
private
def retrieve_photoprism_data
data = []
offset = 0
while offset < 1_000_000
2024-12-02 11:22:36 -05:00
response_data = fetch_page(offset)
2024-12-02 12:21:12 -05:00
break if response_data.blank? || response_data[0]['error'].present?
2024-12-02 11:22:36 -05:00
data << response_data
offset += 1000
end
2024-12-02 12:21:12 -05:00
data.flatten
end
2024-12-02 11:22:36 -05:00
def fetch_page(offset)
response = HTTParty.get(
photoprism_api_base_url,
headers: headers,
query: request_params(offset)
)
2024-12-02 12:21:12 -05:00
if response.code != 200
Rails.logger.info "Photoprism API returned #{response.code}: #{response.body}"
Rails.logger.debug "Photoprism API request params: #{request_params(offset).inspect}"
end
2024-12-02 11:22:36 -05:00
JSON.parse(response.body)
end
def headers
{
'Authorization' => "Bearer #{photoprism_api_key}",
'accept' => 'application/json'
}
end
def request_params(offset = 0)
2024-12-02 11:22:36 -05:00
params = offset.zero? ? default_params : default_params.merge(offset: offset)
params[:before] = end_date if end_date.present?
params
end
def default_params
{
q: '',
public: true,
quality: 3,
after: start_date,
2024-12-02 12:21:12 -05:00
count: 1000
}
end
2024-12-02 12:21:12 -05:00
def time_framed_data(data, start_date, end_date)
data.flatten.select do |photo|
taken_at = DateTime.parse(photo['TakenAtLocal'])
end_date ||= Time.current
taken_at.between?(start_date.to_datetime, end_date.to_datetime)
end
end
end