+2
Rakefile
+2
Rakefile
+6
-1
app/importer.rb
+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
+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
+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