From d595e9d2c40ab06942db7d5ec973c4dc00ea1bf4 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Mon, 28 Nov 2022 14:51:17 +0100 Subject: [PATCH] add import functionality --- src/components/PlaylistsPage.vue | 84 +++++++++++++++++++++++++------- src/locales/en.json | 3 +- 2 files changed, 68 insertions(+), 19 deletions(-) diff --git a/src/components/PlaylistsPage.vue b/src/components/PlaylistsPage.vue index e2e0b84f..e00da943 100644 --- a/src/components/PlaylistsPage.vue +++ b/src/components/PlaylistsPage.vue @@ -4,10 +4,16 @@
-
@@ -100,22 +106,26 @@ export default { else this.playlists = this.playlists.filter(playlist => playlist.id !== id); }); }, - createPlaylist() { + onCreatePlaylist() { const name = prompt(this.$t("actions.create_playlist")); - if (name) - this.fetchJson(this.authApiUrl() + "/user/playlists/create", null, { - method: "POST", - body: JSON.stringify({ - name: name, - }), - headers: { - Authorization: this.getAuthToken(), - "Content-Type": "application/json", - }, - }).then(json => { - if (json.error) alert(json.error); - else this.fetchPlaylists(); - }); + if (!name) return; + this.createPlaylist(name).then(json => { + if (json.error) alert(json.error); + else this.fetchPlaylists(); + }); + }, + async createPlaylist(name) { + let json = await this.fetchJson(this.authApiUrl() + "/user/playlists/create", null, { + method: "POST", + body: JSON.stringify({ + name: name, + }), + headers: { + Authorization: this.getAuthToken(), + "Content-Type": "application/json", + }, + }); + return json; }, exportPlaylists() { if (!this.playlists) return; @@ -147,6 +157,44 @@ export default { } onSuccess(playlistJson); }, + importPlaylists() { + const file = this.$refs.fileSelector.files[0]; + file.text().then(text => { + let playlists = JSON.parse(text).playlists; + if (!playlists.length) { + alert(this.$t("actions.no_valid_playlists")); + return; + } + let importedCount = 0; + for (var i = 0; i < playlists.length; i++) { + this.createPlaylistWithVideos(playlists[i], () => { + importedCount++; + if (playlists.length != importedCount) return; + window.location.reload(); + }); + } + }); + }, + async createPlaylistWithVideos(playlist, onSuccess) { + let newPlaylist = await this.createPlaylist(playlist.name); + console.log(newPlaylist); + let videoIds = playlist.videos.map(url => url.replace("https://youtube.com/watch?v=", "")); + await this.addVideosToPlaylist(newPlaylist.playlistId, videoIds); + onSuccess(); + }, + async addVideosToPlaylist(playlistId, videoIds) { + await this.fetchJson(this.authApiUrl() + "/user/playlists/add", null, { + method: "POST", + body: JSON.stringify({ + playlistId: playlistId, + videoIds: videoIds, + }), + headers: { + Authorization: this.getAuthToken(), + "Content-Type": "application/json", + }, + }); + }, }, }; diff --git a/src/locales/en.json b/src/locales/en.json index fab0ced3..8d3782a1 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -118,7 +118,8 @@ "status_page": "Status", "source_code": "Source code", "instance_donations": "Instance donations", - "reply_count": "{count} replies" + "reply_count": "{count} replies", + "no_valid_playlists": "The file doesn't contain valid playlists!" }, "comment": { "pinned_by": "Pinned by {author}",