diff --git a/src/invidious/routes/subscriptions.cr b/src/invidious/routes/subscriptions.cr index 1de655d20..06cb1469d 100644 --- a/src/invidious/routes/subscriptions.cr +++ b/src/invidious/routes/subscriptions.cr @@ -80,14 +80,15 @@ module Invidious::Routes::Subscriptions subscriptions.sort_by!(&.author.downcase) if action_takeout - if format == "json" - env.response.content_type = "application/json" - env.response.headers["content-disposition"] = "attachment" + env.response.content_type = "application/json" + env.response.headers["content-disposition"] = "attachment" + if format == "json" return Invidious::User::Export.to_invidious(user) + elsif format == "newpipe_json" + return Invidious::User::Export.to_newpipe(subscriptions) else env.response.content_type = "application/xml" - env.response.headers["content-disposition"] = "attachment" export = XML.build do |xml| xml.element("opml", version: "1.1") do xml.element("body") do diff --git a/src/invidious/user/exports.cr b/src/invidious/user/exports.cr index 3fa468bad..db4de441d 100644 --- a/src/invidious/user/exports.cr +++ b/src/invidious/user/exports.cr @@ -2,6 +2,26 @@ struct Invidious::User module Export extend self + def to_newpipe(subscriptions) + return JSON.build do |json| + json.object do + json.field "subscriptions" do + json.array do + subscriptions.each do |channel| + json.object do + json.field "service_id", 0 + json.field "url", "https://www.youtube.com/channel/" + channel.id + json.field "name", channel.author + end + end + end + end + json.field "app_version", "0.29.0" + json.field "app_version_int", 1014 + end + end + end + def to_invidious(user : User) playlists = Invidious::Database::Playlists.select_like_iv(user.email) diff --git a/src/invidious/views/user/data_control.ecr b/src/invidious/views/user/data_control.ecr index 1ada97122..f12cff6e5 100644 --- a/src/invidious/views/user/data_control.ecr +++ b/src/invidious/views/user/data_control.ecr @@ -60,6 +60,10 @@ <%= I18n.translate(locale, "Export subscriptions as OPML (for NewPipe & FreeTube)") %> +
+ <%= I18n.translate(locale, "Export subscriptions as JSON (for NewPipe)") %> +
+
<%= I18n.translate(locale, "Export data as JSON") %>