summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorUlysses Zhan <ulysseszhan@gmail.com>2023-10-14 15:49:33 -0700
committerUlysses Zhan <ulysseszhan@gmail.com>2023-10-14 15:49:33 -0700
commitb9cbdce97631ab9ecd97a6c8cb6bcf7f6f951b99 (patch)
tree90fb9e57e163335d63aec3579ea5d76daf4ab24f /src
parent069e91d2a609b1df94bdfbb693335969b2a281d8 (diff)
downloadinvidious-b9cbdce97631ab9ecd97a6c8cb6bcf7f6f951b99.tar.gz
invidious-b9cbdce97631ab9ecd97a6c8cb6bcf7f6f951b99.tar.bz2
invidious-b9cbdce97631ab9ecd97a6c8cb6bcf7f6f951b99.zip
add: importing watch history from YouTube
Diffstat (limited to 'src')
-rw-r--r--src/invidious/routes/preferences.cr9
-rw-r--r--src/invidious/user/imports.cr21
-rw-r--r--src/invidious/views/user/data_control.ecr5
3 files changed, 35 insertions, 0 deletions
diff --git a/src/invidious/routes/preferences.cr b/src/invidious/routes/preferences.cr
index abe0f34e..112535bd 100644
--- a/src/invidious/routes/preferences.cr
+++ b/src/invidious/routes/preferences.cr
@@ -319,6 +319,15 @@ module Invidious::Routes::PreferencesRoute
response: error_template(415, "Invalid playlist file uploaded")
)
end
+ when "import_youtube_wh"
+ filename = part.filename || ""
+ success = Invidious::User::Import.from_youtube_wh(user, body, filename, type)
+
+ if !success
+ haltf(env, status_code: 415,
+ response: error_template(415, "Invalid watch history file uploaded")
+ )
+ end
when "import_freetube"
Invidious::User::Import.from_freetube(user, body)
when "import_newpipe_subscriptions"
diff --git a/src/invidious/user/imports.cr b/src/invidious/user/imports.cr
index 86d0ce6e..744b4431 100644
--- a/src/invidious/user/imports.cr
+++ b/src/invidious/user/imports.cr
@@ -218,6 +218,27 @@ struct Invidious::User
end
end
+ def from_youtube_wh(user : User, body : String, filename : String, type : String) : Bool
+ extension = filename.split(".").last
+
+ if extension == "json" || type == "application/json"
+ data = JSON.parse(body)
+ watched = data.as_a.compact_map do |item|
+ next unless url = item["titleUrl"]?
+ next unless match = url.as_s.match(/\?v=(?<video_id>[a-zA-Z0-9_-]+)$/)
+ puts match["video_id"]
+ match["video_id"]
+ end
+ watched.reverse! # YouTube have newest first
+ user.watched += watched
+ user.watched.uniq!
+ Invidious::Database::Users.update_watch_history(user)
+ return true
+ else
+ return false
+ end
+ end
+
# -------------------
# Freetube
# -------------------
diff --git a/src/invidious/views/user/data_control.ecr b/src/invidious/views/user/data_control.ecr
index 27654b40..9ce42c99 100644
--- a/src/invidious/views/user/data_control.ecr
+++ b/src/invidious/views/user/data_control.ecr
@@ -27,6 +27,11 @@
</div>
<div class="pure-control-group">
+ <label for="import_youtube_wh"><%= translate(locale, "Import YouTube watch history (.json)") %></label>
+ <input type="file" id="import_youtube_wh" name="import_youtube_wh">
+ </div>
+
+ <div class="pure-control-group">
<label for="import_freetube"><%= translate(locale, "Import FreeTube subscriptions (.db)") %></label>
<input type="file" id="import_freetube" name="import_freetube">
</div>