--- /dev/null
+# frozen_string_literal: true
+
+require 'thor'
+require_relative 'mastodon/media_cli'
+
+module Mastodon
+ class CLI < Thor
+ desc 'media SUBCOMMAND ...ARGS', 'manage media files'
+ subcommand 'media', Mastodon::MediaCLI
+ end
+end
--- /dev/null
+# frozen_string_literal: true
+
+require_relative '../../config/boot'
+require_relative '../../config/environment'
+
+# rubocop:disable Rails/Output
+
+module Mastodon
+ class MediaCLI < Thor
+ option :days, type: :numeric, default: 7
+ option :background, type: :boolean, default: false
+ desc 'remove', 'remove remote media files'
+ long_desc <<-DESC
+ Removes locally cached copies of media attachments from other servers.
+
+ The --days option specifies how old media attachments have to be before
+ they are removed. It defaults to 7 days.
+
+ With the --background option, instead of deleting the files sequentially,
+ they will be queued into Sidekiq and the command will exit as soon as
+ possible. In Sidekiq they will be processed with higher concurrency, but
+ it may impact other operations of the Mastodon server, and it may overload
+ the underlying file storage.
+ DESC
+ def remove
+ time_ago = options[:days].days.ago
+ queued = 0
+
+ MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).select(:id).reorder(nil).find_in_batches do |media_attachments|
+ if options[:background]
+ queued += media_attachments.size
+ Maintenance::UncacheMediaWorker.push_bulk(media_attachments.map(&:id))
+ else
+ media_attachments.each do |m|
+ Maintenance::UncacheMediaWorker.new.perform(m)
+ print '.'
+ end
+ end
+ end
+
+ puts
+ puts "Scheduled the deletion of #{queued} media attachments" if options[:background]
+ end
+ end
+end
+
+# rubocop:enable Rails/Output
desc 'Remove cached remote media attachments that are older than NUM_DAYS. By default 7 (week)'
task remove_remote: :environment do
- time_ago = ENV.fetch('NUM_DAYS') { 7 }.to_i.days.ago
- nb_media_attachments = 0
-
- MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).select(:id).reorder(nil).find_in_batches do |media_attachments|
- nb_media_attachments += media_attachments.length
- Maintenance::UncacheMediaWorker.push_bulk(media_attachments.map(&:id))
- end
- puts "Scheduled the deletion of #{nb_media_attachments} media attachments"
+ require_relative '../mastodon/media_cli'
+ cli = Mastodon::MediaCLI.new([], days: ENV['NUM_DAYS'] || 7)
+ cli.invoke(:remove)
end
desc 'Set unknown attachment type for remote-only attachments'