Don't forget to lycansubscribe

rake task for importing & printing progress

Changed files
+64 -1
app
lib
tasks
+2
Rakefile
··· 6 6 7 7 if ENV['ARLOG'] == '1' 8 8 ActiveRecord::Base.logger = Logger.new(STDOUT) 9 + else 10 + ActiveRecord::Base.logger = nil 9 11 end
+6 -1
app/importer.rb
··· 6 6 require_relative 'models/user' 7 7 8 8 class Importer 9 - attr_accessor :post_queue 9 + attr_accessor :post_queue, :report 10 10 11 11 def initialize(user_did) 12 12 @did = DID.new(user_did) ··· 23 23 24 24 def import_likes(time_limit = nil) 25 25 params = { repo: @did, collection: 'app.bsky.feed.like', limit: 100 } 26 + count = 0 26 27 27 28 loop do 28 29 response = @minisky.get_request('com.atproto.repo.listRecords', params) 29 30 30 31 records = response['records'] 31 32 cursor = response['cursor'] 33 + 34 + count += records.length 35 + @report&.update(importer: { imported_likes: count, oldest_date: Time.parse(records.last['value']['createdAt']) }) 32 36 33 37 process_likes(records) 34 38 params[:cursor] = cursor ··· 66 70 67 71 if @post_queue 68 72 @post_queue.push(like_stub) 73 + @report&.update(queue: { length: @post_queue.length }) 69 74 end 70 75 end 71 76 rescue StandardError => e
+8
app/post_downloader.rb
··· 5 5 require_relative 'models/user' 6 6 7 7 class PostDownloader 8 + attr_accessor :report 9 + 8 10 def initialize 9 11 @pds_cache = {} 10 12 end 11 13 12 14 def import_from_queue(queue) 15 + count = 0 16 + 13 17 loop do 14 18 like = queue.pop 19 + @report&.update(queue: { length: queue.length }) 15 20 16 21 begin 17 22 post = import_post(like.post_uri) 18 23 like.update!(post: post, post_uri: nil) 24 + count += 1 25 + 26 + @report&.update(downloader: { downloaded_posts: count, oldest_date: like.time }) 19 27 rescue StandardError => e 20 28 puts "Error in PostDownloader: #{like.post_uri}: #{e}" 21 29 end
+48
lib/tasks/import.rake
··· 1 + require_relative '../../app/importer' 2 + require_relative '../../app/post_downloader' 3 + 4 + class ImportReport 5 + def initialize 6 + @data = {} 7 + @start = Time.now 8 + end 9 + 10 + def update(data) 11 + data.each do |k, v| 12 + @data[k] ||= {} 13 + @data[k].update(v) 14 + end 15 + 16 + render 17 + end 18 + 19 + def render 20 + print " " * 80 + "\r" 21 + puts "Elapsed time: #{(Time.now - @start).to_i} s" 22 + print " " * 80 + "\r" 23 + puts "Importer: imported likes = #{@data.dig(:importer, :imported_likes) || 0} (until: #{@data.dig(:importer, :oldest_date)})" 24 + print " " * 80 + "\r" 25 + puts "Downloader: imported posts = #{@data.dig(:downloader, :downloaded_posts) || 0} (until: #{@data.dig(:downloader, :oldest_date)})" 26 + print "\e[3A" 27 + end 28 + end 29 + 30 + task :import_user do 31 + unless ENV['USER'] 32 + raise "Required USER parameter missing" 33 + end 34 + 35 + queue = Queue.new 36 + report = ImportReport.new 37 + 38 + importer = Importer.new(ENV['USER']) 39 + importer.post_queue = queue 40 + importer.report = report 41 + 42 + downloader = PostDownloader.new 43 + downloader.report = report 44 + 45 + Thread.new { downloader.import_from_queue(queue) } 46 + 47 + importer.run_import(ENV['UNTIL']) 48 + end