require_relative 'importers/likes_importer' require_relative 'importers/posts_importer' require_relative 'importers/reposts_importer' require_relative 'item_queue' require_relative 'post_downloader' class ImportManager attr_accessor :report, :time_limit, :logger, :log_status_updates def initialize(user) @user = user end def start(sets) importers = [] sets = [sets] unless sets.is_a?(Array) sets.each do |set| case set when 'likes' importers << LikesImporter.new(@user) when 'reposts' importers << RepostsImporter.new(@user) when 'posts' importers << PostsImporter.new(@user) when 'all' importers += [ LikesImporter.new(@user), RepostsImporter.new(@user), PostsImporter.new(@user) ] else raise "Invalid collection: #{set}" end end queued_items = @user.all_items_in_queue(:import).sort_by(&:time).reverse queue = ItemQueue.new(queued_items) downloader = PostDownloader.new downloader.report = @report downloader.logger = @logger download_thread = Thread.new do @logger&.info "Starting downloader thread for #{@user}" if @log_status_updates downloader.import_from_queue(queue) @logger&.info "Ended downloader thread for #{@user}" if @log_status_updates end import_threads = importers.map do |import| import.item_queue = queue import.report = @report import.logger = @logger Thread.new do @logger&.info "Starting #{import.class} thread for #{@user}" if @log_status_updates import.run_import(@time_limit) @logger&.info "Ended #{import.class} thread for #{@user}" if @log_status_updates end end import_threads.each { |i| i.join } @logger&.info "Finished all importer threads for #{@user}, waiting for downloader" if @log_status_updates downloader.stop_when_empty = true download_thread.join end end