diff options
| author | Ulysses Zhan <ulysseszhan@gmail.com> | 2023-10-14 15:49:33 -0700 |
|---|---|---|
| committer | Ulysses Zhan <ulysseszhan@gmail.com> | 2023-10-14 15:49:33 -0700 |
| commit | b9cbdce97631ab9ecd97a6c8cb6bcf7f6f951b99 (patch) | |
| tree | 90fb9e57e163335d63aec3579ea5d76daf4ab24f /src | |
| parent | 069e91d2a609b1df94bdfbb693335969b2a281d8 (diff) | |
| download | invidious-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.cr | 9 | ||||
| -rw-r--r-- | src/invidious/user/imports.cr | 21 | ||||
| -rw-r--r-- | src/invidious/views/user/data_control.ecr | 5 |
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> |
