mirror of
https://github.com/TeamPiped/Piped.git
synced 2024-08-14 23:57:27 +00:00
clone playlist from youtube
This commit is contained in:
parent
4a4e28007f
commit
6c3eb2304d
5 changed files with 32 additions and 5 deletions
|
@ -2,7 +2,7 @@
|
||||||
<ErrorHandler v-if="playlist && playlist.error" :message="playlist.message" :error="playlist.error" />
|
<ErrorHandler v-if="playlist && playlist.error" :message="playlist.message" :error="playlist.error" />
|
||||||
|
|
||||||
<div v-if="playlist" v-show="!playlist.error">
|
<div v-if="playlist" v-show="!playlist.error">
|
||||||
<h1 class="text-center" v-text="playlist.name" />
|
<h1 class="text-center my-4" v-text="playlist.name" />
|
||||||
|
|
||||||
<div class="grid grid-cols-2">
|
<div class="grid grid-cols-2">
|
||||||
<div>
|
<div>
|
||||||
|
@ -15,7 +15,10 @@
|
||||||
<div class="right-2vw absolute">
|
<div class="right-2vw absolute">
|
||||||
<strong v-text="`${playlist.videos} ${$t('video.videos')}`" />
|
<strong v-text="`${playlist.videos} ${$t('video.videos')}`" />
|
||||||
<br />
|
<br />
|
||||||
<a :href="getRssUrl">
|
<button class="btn mr-1" v-if="authenticated && !isPipedPlaylist" @click="clonePlaylist">
|
||||||
|
{{ $t("actions.clone_playlist") }}<font-awesome-icon class="ml-3" icon="clone" />
|
||||||
|
</button>
|
||||||
|
<a class="btn" :href="getRssUrl">
|
||||||
<font-awesome-icon icon="rss" />
|
<font-awesome-icon icon="rss" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -59,6 +62,10 @@ export default {
|
||||||
getRssUrl: _this => {
|
getRssUrl: _this => {
|
||||||
return _this.authApiUrl() + "/rss/playlists/" + _this.$route.query.list;
|
return _this.authApiUrl() + "/rss/playlists/" + _this.$route.query.list;
|
||||||
},
|
},
|
||||||
|
isPipedPlaylist() {
|
||||||
|
// FIXME: this checks whether it's a YouTube or a Piped playlist
|
||||||
|
return this.$route.query.list.includes("-");
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.getPlaylistData();
|
this.getPlaylistData();
|
||||||
|
@ -109,6 +116,22 @@ export default {
|
||||||
removeVideo(index) {
|
removeVideo(index) {
|
||||||
this.playlist.relatedStreams.splice(index, 1);
|
this.playlist.relatedStreams.splice(index, 1);
|
||||||
},
|
},
|
||||||
|
async clonePlaylist() {
|
||||||
|
const playlistId = this.$route.query.list;
|
||||||
|
this.fetchJson(this.authApiUrl() + "/import/playlist", null, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
Authorization: this.getAuthToken(),
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
playlistId: playlistId,
|
||||||
|
}),
|
||||||
|
}).then(resp => {
|
||||||
|
if (!resp.error) {
|
||||||
|
alert(this.$t("actions.clone_playlist_success"));
|
||||||
|
} else alert(resp.error);
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -244,7 +244,7 @@
|
||||||
class="input w-auto"
|
class="input w-auto"
|
||||||
type="password"
|
type="password"
|
||||||
/>
|
/>
|
||||||
<a class="btn w-auto" style="margin-left: 0.5em" @click="deleteAccount" v-t="'actions.delete_account'" />
|
<a class="btn w-auto ml-2" @click="deleteAccount" v-t="'actions.delete_account'" />
|
||||||
<br />
|
<br />
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<h1 class="text-center" v-text="$route.query.search_query" />
|
<h1 class="text-center my-2" v-text="$route.query.search_query" />
|
||||||
|
|
||||||
<label for="ddlSearchFilters">
|
<label for="ddlSearchFilters">
|
||||||
<strong v-text="`${$t('actions.filter')}:`" />
|
<strong v-text="`${$t('actions.filter')}:`" />
|
||||||
|
|
|
@ -86,7 +86,9 @@
|
||||||
"minimize_recommendations_default": "Minimize Recommendations by default",
|
"minimize_recommendations_default": "Minimize Recommendations by default",
|
||||||
"invalidate_session": "Logout all devices",
|
"invalidate_session": "Logout all devices",
|
||||||
"different_auth_instance": "Use a different instance for authentication",
|
"different_auth_instance": "Use a different instance for authentication",
|
||||||
"instance_auth_selection": "Autentication Instance Selection"
|
"instance_auth_selection": "Autentication Instance Selection",
|
||||||
|
"clone_playlist": "Clone Playlist",
|
||||||
|
"clone_playlist_success": "Successfully cloned!"
|
||||||
},
|
},
|
||||||
"comment": {
|
"comment": {
|
||||||
"pinned_by": "Pinned by",
|
"pinned_by": "Pinned by",
|
||||||
|
|
|
@ -17,6 +17,7 @@ import {
|
||||||
faCirclePlus,
|
faCirclePlus,
|
||||||
faCircleMinus,
|
faCircleMinus,
|
||||||
faXmark,
|
faXmark,
|
||||||
|
faClone,
|
||||||
} from "@fortawesome/free-solid-svg-icons";
|
} from "@fortawesome/free-solid-svg-icons";
|
||||||
import { faGithub, faBitcoin, faYoutube } from "@fortawesome/free-brands-svg-icons";
|
import { faGithub, faBitcoin, faYoutube } from "@fortawesome/free-brands-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
|
||||||
|
@ -40,6 +41,7 @@ library.add(
|
||||||
faCirclePlus,
|
faCirclePlus,
|
||||||
faCircleMinus,
|
faCircleMinus,
|
||||||
faXmark,
|
faXmark,
|
||||||
|
faClone,
|
||||||
);
|
);
|
||||||
|
|
||||||
import router from "@/router/router.js";
|
import router from "@/router/router.js";
|
||||||
|
|
Loading…
Reference in a new issue