|
@@ -0,0 +1,237 @@
|
|
|
|
+<script setup lang="ts">
|
|
|
|
+import { defineAsyncComponent, ref } from "vue";
|
|
|
|
+import { useRouter } from "vue-router";
|
|
|
|
+import Toast from "toasters";
|
|
|
|
+import { useWebsocketsStore } from "@/stores/websockets";
|
|
|
|
+import { useLongJobsStore } from "@/stores/longJobs";
|
|
|
|
+import { useModalsStore } from "@/stores/modals";
|
|
|
|
+import { useUserAuthStore } from "@/stores/userAuth";
|
|
|
|
+import utils from "@/utils";
|
|
|
|
+
|
|
|
|
+const InfoIcon = defineAsyncComponent(
|
|
|
|
+ () => import("@/components/InfoIcon.vue")
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+const router = useRouter();
|
|
|
|
+
|
|
|
|
+const { socket } = useWebsocketsStore();
|
|
|
|
+
|
|
|
|
+const { openModal } = useModalsStore();
|
|
|
|
+
|
|
|
|
+const { setJob } = useLongJobsStore();
|
|
|
|
+
|
|
|
|
+const { hasPermission } = useUserAuthStore();
|
|
|
|
+</script>
|
|
|
|
+
|
|
|
|
+<template>
|
|
|
|
+ <div>
|
|
|
|
+ <page-metadata title="Admin | Songs | Import" />
|
|
|
|
+ <div class="admin-tab import-tab">
|
|
|
|
+ <div class="card">
|
|
|
|
+ <h1>Import Artist</h1>
|
|
|
|
+ <p>Import artist</p>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="section-row">
|
|
|
|
+ <div class="card left-section">
|
|
|
|
+ <h4>Start New Import</h4>
|
|
|
|
+ <hr class="section-horizontal-rule" />
|
|
|
|
+
|
|
|
|
+ <!-- <div v-if="false && createImport.stage === 1" class="stage">
|
|
|
|
+ <label class="label">Import Method</label>
|
|
|
|
+ <div class="control is-expanded select">
|
|
|
|
+ <select v-model="createImport.importMethod">
|
|
|
|
+ <option value="youtube">YouTube</option>
|
|
|
|
+ </select>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div class="control is-expanded">
|
|
|
|
+ <button
|
|
|
|
+ class="button is-primary"
|
|
|
|
+ @click.prevent="submitCreateImport(1)"
|
|
|
|
+ >
|
|
|
|
+ <i class="material-icons">navigate_next</i>
|
|
|
|
+ Next
|
|
|
|
+ </button>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div
|
|
|
|
+ v-else-if="
|
|
|
|
+ createImport.stage === 2 &&
|
|
|
|
+ createImport.importMethod === 'youtube'
|
|
|
|
+ "
|
|
|
|
+ class="stage"
|
|
|
|
+ >
|
|
|
|
+ <label class="label"
|
|
|
|
+ >YouTube URL
|
|
|
|
+ <info-icon
|
|
|
|
+ tooltip="YouTube playlist or channel URLs may be provided"
|
|
|
|
+ />
|
|
|
|
+ </label>
|
|
|
|
+ <div class="control is-expanded">
|
|
|
|
+ <input
|
|
|
|
+ class="input"
|
|
|
|
+ type="text"
|
|
|
|
+ placeholder="YouTube Playlist or Channel URL"
|
|
|
|
+ v-model="createImport.youtubeUrl"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ <div class="control is-expanded">
|
|
|
|
+ <input
|
|
|
|
+ class="input"
|
|
|
|
+ type="number"
|
|
|
|
+ placeholder="Max"
|
|
|
|
+ v-model="createImport.max"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ <div class="control is-expanded checkbox-control">
|
|
|
|
+ <label class="switch">
|
|
|
|
+ <input
|
|
|
|
+ type="checkbox"
|
|
|
|
+ id="import-music-only"
|
|
|
|
+ v-model="createImport.isImportingOnlyMusic"
|
|
|
|
+ />
|
|
|
|
+ <span class="slider round"></span>
|
|
|
|
+ </label>
|
|
|
|
+
|
|
|
|
+ <label class="label" for="import-music-only">
|
|
|
|
+ Import Music Only
|
|
|
|
+ <info-icon
|
|
|
|
+ tooltip="Only import videos from YouTube identified as music"
|
|
|
|
+ @click.prevent
|
|
|
|
+ />
|
|
|
|
+ </label>
|
|
|
|
+ </div>
|
|
|
|
+ <!!-- <div class="control is-expanded">
|
|
|
|
+ <input
|
|
|
|
+ class="input"
|
|
|
|
+ type="text"
|
|
|
|
+ placeholder="Comment"
|
|
|
|
+ v-model="createImport.comment"
|
|
|
|
+ />
|
|
|
|
+ </div> --!>
|
|
|
|
+
|
|
|
|
+ <div class="control is-expanded">
|
|
|
|
+ <button
|
|
|
|
+ class="control is-expanded button is-primary"
|
|
|
|
+ @click.prevent="submitCreateImport(2)"
|
|
|
|
+ >
|
|
|
|
+ <i class="material-icons icon-with-button"
|
|
|
|
+ >publish</i
|
|
|
|
+ >
|
|
|
|
+ Import
|
|
|
|
+ </button>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+
|
|
|
|
+ <div v-if="createImport.stage === 3" class="stage">
|
|
|
|
+ <p class="has-text-centered import-started">
|
|
|
|
+ Import Started
|
|
|
|
+ </p>
|
|
|
|
+
|
|
|
|
+ <div class="control is-expanded">
|
|
|
|
+ <button
|
|
|
|
+ class="button is-info"
|
|
|
|
+ @click.prevent="submitCreateImport(3)"
|
|
|
|
+ >
|
|
|
|
+ <i class="material-icons icon-with-button"
|
|
|
|
+ >restart_alt</i
|
|
|
|
+ >
|
|
|
|
+ Start Again
|
|
|
|
+ </button>
|
|
|
|
+ </div>
|
|
|
|
+ </div> -->
|
|
|
|
+ </div>
|
|
|
|
+ <div class="card right-section">
|
|
|
|
+ <h4>Manage Imports</h4>
|
|
|
|
+ <hr class="section-horizontal-rule" />
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<style lang="less" scoped>
|
|
|
|
+.admin-tab.import-tab {
|
|
|
|
+ .section-row {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ height: 100%;
|
|
|
|
+
|
|
|
|
+ .card {
|
|
|
|
+ max-height: 100%;
|
|
|
|
+ overflow-y: auto;
|
|
|
|
+ flex-grow: 1;
|
|
|
|
+
|
|
|
|
+ .control.is-expanded {
|
|
|
|
+ .button {
|
|
|
|
+ width: 100%;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ &:not(:last-of-type) {
|
|
|
|
+ margin-bottom: 10px !important;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ &:last-of-type {
|
|
|
|
+ margin-bottom: 0 !important;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .control.is-grouped > .button {
|
|
|
|
+ &:not(:last-child) {
|
|
|
|
+ border-radius: @border-radius 0 0 @border-radius;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ &:last-child {
|
|
|
|
+ border-radius: 0 @border-radius @border-radius 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .left-section {
|
|
|
|
+ height: 100%;
|
|
|
|
+ max-width: 400px;
|
|
|
|
+ margin-right: 20px !important;
|
|
|
|
+
|
|
|
|
+ .checkbox-control label.label {
|
|
|
|
+ margin-left: 10px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .import-started {
|
|
|
|
+ font-size: 18px;
|
|
|
|
+ font-weight: 600;
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .right-section {
|
|
|
|
+ max-width: calc(100% - 400px);
|
|
|
|
+
|
|
|
|
+ .row-options .material-icons.import-album-icon {
|
|
|
|
+ background-color: var(--purple);
|
|
|
|
+ color: var(--white);
|
|
|
|
+ border-color: var(--purple);
|
|
|
|
+ font-size: 20px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @media screen and (max-width: 1200px) {
|
|
|
|
+ .card {
|
|
|
|
+ flex-basis: 100%;
|
|
|
|
+ max-height: unset;
|
|
|
|
+
|
|
|
|
+ &.left-section {
|
|
|
|
+ max-width: unset;
|
|
|
|
+ margin-right: 0 !important;
|
|
|
|
+ margin-bottom: 10px !important;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ &.right-section {
|
|
|
|
+ max-width: unset;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+</style>
|