diff options
| author | syeopite <syeopite@syeopite.dev> | 2025-01-22 11:36:58 -0800 |
|---|---|---|
| committer | syeopite <syeopite@syeopite.dev> | 2025-01-22 11:36:58 -0800 |
| commit | 4a31da40009b0cf628b8c871d1cb1d18e7b8600d (patch) | |
| tree | 9850684f4a6c7e2f82259b9686ab779199280af6 /src | |
| parent | 831017f4037b5c65ef4e12d5b98f27d2fa06b414 (diff) | |
| parent | bba1769f4b42e1d2688308d7778c766b8e90e92b (diff) | |
| download | invidious-4a31da40009b0cf628b8c871d1cb1d18e7b8600d.tar.gz invidious-4a31da40009b0cf628b8c871d1cb1d18e7b8600d.tar.bz2 invidious-4a31da40009b0cf628b8c871d1cb1d18e7b8600d.zip | |
User: Ensure IO is properly closed when importing NewPipe subscriptions (#4346)
Diffstat (limited to 'src')
| -rw-r--r-- | src/invidious/user/imports.cr | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/src/invidious/user/imports.cr b/src/invidious/user/imports.cr index 533c18d9..007eb666 100644 --- a/src/invidious/user/imports.cr +++ b/src/invidious/user/imports.cr @@ -290,42 +290,39 @@ struct Invidious::User end def from_newpipe(user : User, body : String) : Bool - io = IO::Memory.new(body) + Compress::Zip::File.open(IO::Memory.new(body), true) do |file| + entry = file.entries.find { |file_entry| file_entry.filename == "newpipe.db" } + return false if entry.nil? + entry.open do |file_io| + # Ensure max size of 4MB + io_sized = IO::Sized.new(file_io, 0x400000) - Compress::Zip::File.open(io) do |file| - file.entries.each do |entry| - entry.open do |file_io| - # Ensure max size of 4MB - io_sized = IO::Sized.new(file_io, 0x400000) - - next if entry.filename != "newpipe.db" - - tempfile = File.tempfile(".db") - - begin - File.write(tempfile.path, io_sized.gets_to_end) - rescue - return false - end - - db = DB.open("sqlite3://" + tempfile.path) - - user.watched += db.query_all("SELECT url FROM streams", as: String) - .map(&.lchop("https://www.youtube.com/watch?v=")) + begin + temp = File.tempfile(".db") do |tempfile| + begin + File.write(tempfile.path, io_sized.gets_to_end) + rescue + return false + end - user.watched.uniq! - Invidious::Database::Users.update_watch_history(user) + DB.open("sqlite3://" + tempfile.path) do |db| + user.watched += db.query_all("SELECT url FROM streams", as: String) + .map(&.lchop("https://www.youtube.com/watch?v=")) - user.subscriptions += db.query_all("SELECT url FROM subscriptions", as: String) - .map(&.lchop("https://www.youtube.com/channel/")) + user.watched.uniq! + Invidious::Database::Users.update_watch_history(user) - user.subscriptions.uniq! - user.subscriptions = get_batch_channels(user.subscriptions) + user.subscriptions += db.query_all("SELECT url FROM subscriptions", as: String) + .map(&.lchop("https://www.youtube.com/channel/")) - Invidious::Database::Users.update_subscriptions(user) + user.subscriptions.uniq! + user.subscriptions = get_batch_channels(user.subscriptions) - db.close - tempfile.delete + Invidious::Database::Users.update_subscriptions(user) + end + end + ensure + temp.delete if !temp.nil? end end end |
