Ensure IO is properly closed when importing NewPipe subscriptions

This commit is contained in:
ChunkyProgrammer 2023-12-20 00:13:11 -05:00
parent eda7444ca4
commit 67f98cb60d

View File

@ -290,26 +290,22 @@ struct Invidious::User
end end
def from_newpipe(user : User, body : String) : Bool def from_newpipe(user : User, body : String) : Bool
io = IO::Memory.new(body) Compress::Zip::File.open(IO::Memory.new(body), true) do |file|
Compress::Zip::File.open(io) do |file|
file.entries.each do |entry| file.entries.each do |entry|
entry.open do |file_io| entry.open do |file_io|
next if entry.filename != "newpipe.db"
# Ensure max size of 4MB # Ensure max size of 4MB
io_sized = IO::Sized.new(file_io, 0x400000) io_sized = IO::Sized.new(file_io, 0x400000)
next if entry.filename != "newpipe.db" temp = File.tempfile(".db") do |tempfile|
tempfile = File.tempfile(".db")
begin begin
File.write(tempfile.path, io_sized.gets_to_end) File.write(tempfile.path, io_sized.gets_to_end)
rescue rescue
return false return false
end end
db = DB.open("sqlite3://" + tempfile.path) DB.open("sqlite3://" + tempfile.path) do |db|
user.watched += db.query_all("SELECT url FROM streams", as: String) user.watched += db.query_all("SELECT url FROM streams", as: String)
.map(&.lchop("https://www.youtube.com/watch?v=")) .map(&.lchop("https://www.youtube.com/watch?v="))
@ -323,9 +319,9 @@ struct Invidious::User
user.subscriptions = get_batch_channels(user.subscriptions) user.subscriptions = get_batch_channels(user.subscriptions)
Invidious::Database::Users.update_subscriptions(user) Invidious::Database::Users.update_subscriptions(user)
end
db.close end
tempfile.delete temp.delete
end end
end end
end end