Don't forget to lycansubscribe
1require_relative 'importers/likes_importer' 2require_relative 'importers/posts_importer' 3require_relative 'importers/reposts_importer' 4require_relative 'item_queue' 5require_relative 'post_downloader' 6 7class ImportManager 8 attr_accessor :report, :time_limit, :logger, :log_status_updates 9 10 def initialize(user) 11 @user = user 12 end 13 14 def start(sets) 15 importers = [] 16 sets = [sets] unless sets.is_a?(Array) 17 18 sets.each do |set| 19 case set 20 when 'likes' 21 importers << LikesImporter.new(@user) 22 when 'reposts' 23 importers << RepostsImporter.new(@user) 24 when 'posts' 25 importers << PostsImporter.new(@user) 26 when 'all' 27 importers += [ 28 LikesImporter.new(@user), 29 RepostsImporter.new(@user), 30 PostsImporter.new(@user) 31 ] 32 else 33 raise "Invalid collection: #{set}" 34 end 35 end 36 37 queued_items = @user.all_items_in_queue(:import).sort_by(&:time).reverse 38 queue = ItemQueue.new(queued_items) 39 40 downloader = PostDownloader.new 41 downloader.report = @report 42 downloader.logger = @logger 43 44 download_thread = Thread.new do 45 @logger&.info "Starting downloader thread for #{@user}" if @log_status_updates 46 47 downloader.import_from_queue(queue) 48 49 @logger&.info "Ended downloader thread for #{@user}" if @log_status_updates 50 end 51 52 import_threads = importers.map do |import| 53 import.item_queue = queue 54 import.report = @report 55 import.logger = @logger 56 57 Thread.new do 58 @logger&.info "Starting #{import.class} thread for #{@user}" if @log_status_updates 59 60 import.run_import(@time_limit) 61 62 @logger&.info "Ended #{import.class} thread for #{@user}" if @log_status_updates 63 end 64 end 65 66 import_threads.each { |i| i.join } 67 68 @logger&.info "Finished all importer threads for #{@user}, waiting for downloader" if @log_status_updates 69 70 downloader.stop_when_empty = true 71 download_thread.join 72 end 73end