|
@@ -1,10 +1,5 @@
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
import { defineAsyncComponent, ref } from "vue";
|
|
import { defineAsyncComponent, ref } from "vue";
|
|
-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 {
|
|
import {
|
|
TableColumn,
|
|
TableColumn,
|
|
TableFilter,
|
|
TableFilter,
|
|
@@ -19,16 +14,6 @@ const AdvancedTable = defineAsyncComponent(
|
|
const RunJobDropdown = defineAsyncComponent(
|
|
const RunJobDropdown = defineAsyncComponent(
|
|
() => import("@/components/RunJobDropdown.vue")
|
|
() => import("@/components/RunJobDropdown.vue")
|
|
);
|
|
);
|
|
-const SongThumbnail = defineAsyncComponent(
|
|
|
|
- () => import("@/components/SongThumbnail.vue")
|
|
|
|
-);
|
|
|
|
-
|
|
|
|
-const { setJob } = useLongJobsStore();
|
|
|
|
-
|
|
|
|
-const { socket } = useWebsocketsStore();
|
|
|
|
-
|
|
|
|
-const userAuthStore = useUserAuthStore();
|
|
|
|
-const { hasPermission } = userAuthStore;
|
|
|
|
|
|
|
|
const columnDefault = ref<TableColumn>({
|
|
const columnDefault = ref<TableColumn>({
|
|
sortable: true,
|
|
sortable: true,
|
|
@@ -49,26 +34,7 @@ const columns = ref<TableColumn[]>([
|
|
resizable: false,
|
|
resizable: false,
|
|
minWidth: 85,
|
|
minWidth: 85,
|
|
defaultWidth: 85
|
|
defaultWidth: 85
|
|
- // (hasPermission("songs.create") || hasPermission("songs.update")) &&
|
|
|
|
- // hasPermission("youtube.removeVideos")
|
|
|
|
- // ? 129
|
|
|
|
- // : 85,
|
|
|
|
- // defaultWidth:
|
|
|
|
- // (hasPermission("songs.create") || hasPermission("songs.update")) &&
|
|
|
|
- // hasPermission("youtube.removeVideos")
|
|
|
|
- // ? 129
|
|
|
|
- // : 85
|
|
|
|
},
|
|
},
|
|
- // {
|
|
|
|
- // name: "thumbnailImage",
|
|
|
|
- // displayName: "Thumb",
|
|
|
|
- // properties: ["youtubeId"],
|
|
|
|
- // sortable: false,
|
|
|
|
- // minWidth: 75,
|
|
|
|
- // defaultWidth: 75,
|
|
|
|
- // maxWidth: 75,
|
|
|
|
- // resizable: false
|
|
|
|
- // },
|
|
|
|
{
|
|
{
|
|
name: "channelId",
|
|
name: "channelId",
|
|
displayName: "Channel ID",
|
|
displayName: "Channel ID",
|
|
@@ -142,27 +108,6 @@ const filters = ref<TableFilter[]>([
|
|
filterTypes: ["datetimeBefore", "datetimeAfter"],
|
|
filterTypes: ["datetimeBefore", "datetimeAfter"],
|
|
defaultFilterType: "datetimeBefore"
|
|
defaultFilterType: "datetimeBefore"
|
|
}
|
|
}
|
|
- // {
|
|
|
|
- // name: "importJob",
|
|
|
|
- // displayName: "Import Job",
|
|
|
|
- // property: "importJob",
|
|
|
|
- // filterTypes: ["special"],
|
|
|
|
- // defaultFilterType: "special"
|
|
|
|
- // },
|
|
|
|
- // {
|
|
|
|
- // name: "songId",
|
|
|
|
- // displayName: "Song ID",
|
|
|
|
- // property: "songId",
|
|
|
|
- // filterTypes: ["contains", "exact", "regex"],
|
|
|
|
- // defaultFilterType: "contains"
|
|
|
|
- // },
|
|
|
|
- // {
|
|
|
|
- // name: "uploadedAt",
|
|
|
|
- // displayName: "Uploaded At",
|
|
|
|
- // property: "uploadedAt",
|
|
|
|
- // filterTypes: ["datetimeBefore", "datetimeAfter"],
|
|
|
|
- // defaultFilterType: "datetimeBefore"
|
|
|
|
- // }
|
|
|
|
]);
|
|
]);
|
|
const events = ref<TableEvents>({
|
|
const events = ref<TableEvents>({
|
|
adminRoom: "youtubeChannels",
|
|
adminRoom: "youtubeChannels",
|
|
@@ -178,78 +123,11 @@ const events = ref<TableEvents>({
|
|
});
|
|
});
|
|
const bulkActions = ref<TableBulkActions>({ width: 200 });
|
|
const bulkActions = ref<TableBulkActions>({ width: 200 });
|
|
const jobs = ref([]);
|
|
const jobs = ref([]);
|
|
-// if (hasPermission("media.recalculateAllRatings"))
|
|
|
|
|
|
+
|
|
jobs.value.push({
|
|
jobs.value.push({
|
|
name: "Get missing YouTube channels from YouTube video's",
|
|
name: "Get missing YouTube channels from YouTube video's",
|
|
socket: "youtube.getMissingChannels"
|
|
socket: "youtube.getMissingChannels"
|
|
});
|
|
});
|
|
-
|
|
|
|
-const { openModal } = useModalsStore();
|
|
|
|
-
|
|
|
|
-// const rowToSong = row => ({
|
|
|
|
-// mediaSource: `youtube:${row.channelId}`
|
|
|
|
-// });
|
|
|
|
-
|
|
|
|
-// const editOne = row => {
|
|
|
|
-// openModal({
|
|
|
|
-// modal: "editSong",
|
|
|
|
-// props: { song: rowToSong(row) }
|
|
|
|
-// });
|
|
|
|
-// };
|
|
|
|
-
|
|
|
|
-// const editMany = selectedRows => {
|
|
|
|
-// if (selectedRows.length === 1) editOne(rowToSong(selectedRows[0]));
|
|
|
|
-// else {
|
|
|
|
-// const songs = selectedRows.map(rowToSong);
|
|
|
|
-// openModal({ modal: "editSong", props: { songs } });
|
|
|
|
-// }
|
|
|
|
-// };
|
|
|
|
-
|
|
|
|
-// const importAlbum = selectedRows => {
|
|
|
|
-// const mediaSources = selectedRows.map(
|
|
|
|
-// ({ youtubeId }) => `youtube:${youtubeId}`
|
|
|
|
-// );
|
|
|
|
-// console.log(77988, mediaSources);
|
|
|
|
-// socket.dispatch("songs.getSongsFromMediaSources", mediaSources, res => {
|
|
|
|
-// if (res.status === "success") {
|
|
|
|
-// openModal({
|
|
|
|
-// modal: "importAlbum",
|
|
|
|
-// props: { songs: res.data.songs }
|
|
|
|
-// });
|
|
|
|
-// } else new Toast("Could not get songs.");
|
|
|
|
-// });
|
|
|
|
-// };
|
|
|
|
-
|
|
|
|
-// const bulkEditPlaylist = selectedRows => {
|
|
|
|
-// openModal({
|
|
|
|
-// modal: "bulkEditPlaylist",
|
|
|
|
-// props: {
|
|
|
|
-// mediaSources: selectedRows.map(row => `youtube:${row.youtubeId}`)
|
|
|
|
-// }
|
|
|
|
-// });
|
|
|
|
-// };
|
|
|
|
-
|
|
|
|
-// const removeVideos = videoIds => {
|
|
|
|
-// let id;
|
|
|
|
-// let title;
|
|
|
|
-
|
|
|
|
-// socket.dispatch("youtube.removeVideos", videoIds, {
|
|
|
|
-// cb: () => {},
|
|
|
|
-// onProgress: res => {
|
|
|
|
-// if (res.status === "started") {
|
|
|
|
-// id = res.id;
|
|
|
|
-// title = res.title;
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
-// if (id)
|
|
|
|
-// setJob({
|
|
|
|
-// id,
|
|
|
|
-// name: title,
|
|
|
|
-// ...res
|
|
|
|
-// });
|
|
|
|
-// }
|
|
|
|
-// });
|
|
|
|
-// };
|
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<template>
|
|
<template>
|
|
@@ -274,66 +152,6 @@ const { openModal } = useModalsStore();
|
|
:max-width="1140"
|
|
:max-width="1140"
|
|
:bulk-actions="bulkActions"
|
|
:bulk-actions="bulkActions"
|
|
>
|
|
>
|
|
- <template #column-options="slotProps">
|
|
|
|
- <div class="row-options">
|
|
|
|
- <!-- <button
|
|
|
|
- class="button is-primary icon-with-button material-icons"
|
|
|
|
- @click="
|
|
|
|
- openModal({
|
|
|
|
- modal: 'viewYoutubeChannel',
|
|
|
|
- props: {
|
|
|
|
- channelId: slotProps.item.channelId
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- "
|
|
|
|
- :disabled="slotProps.item.removed"
|
|
|
|
- content="View Video"
|
|
|
|
- v-tippy
|
|
|
|
- >
|
|
|
|
- open_in_full
|
|
|
|
- </button>
|
|
|
|
- <button
|
|
|
|
- v-if="
|
|
|
|
- hasPermission('songs.create') ||
|
|
|
|
- hasPermission('songs.update')
|
|
|
|
- "
|
|
|
|
- class="button is-primary icon-with-button material-icons"
|
|
|
|
- @click="editOne(slotProps.item)"
|
|
|
|
- :disabled="slotProps.item.removed"
|
|
|
|
- :content="
|
|
|
|
- !!slotProps.item.songId
|
|
|
|
- ? 'Edit Song'
|
|
|
|
- : 'Create song from video'
|
|
|
|
- "
|
|
|
|
- v-tippy
|
|
|
|
- >
|
|
|
|
- music_note
|
|
|
|
- </button>
|
|
|
|
- <button
|
|
|
|
- v-if="hasPermission('youtube.removeVideos')"
|
|
|
|
- class="button is-danger icon-with-button material-icons"
|
|
|
|
- @click.prevent="
|
|
|
|
- openModal({
|
|
|
|
- modal: 'confirm',
|
|
|
|
- props: {
|
|
|
|
- message:
|
|
|
|
- 'Removing this video will remove it from all playlists and cause a ratings recalculation.',
|
|
|
|
- onCompleted: () =>
|
|
|
|
- removeVideos(slotProps.item._id)
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- "
|
|
|
|
- :disabled="slotProps.item.removed"
|
|
|
|
- content="Delete Video"
|
|
|
|
- v-tippy
|
|
|
|
- >
|
|
|
|
- delete_forever
|
|
|
|
- </button> -->
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
- <!-- <template #column-thumbnailImage="slotProps">
|
|
|
|
- <song-thumbnail class="song-thumbnail" :song="slotProps.item" />
|
|
|
|
- </template> -->
|
|
|
|
<template #column-channelId="slotProps">
|
|
<template #column-channelId="slotProps">
|
|
<a
|
|
<a
|
|
:href="`https://www.youtube.com/channels/${slotProps.item.channelId}`"
|
|
:href="`https://www.youtube.com/channels/${slotProps.item.channelId}`"
|
|
@@ -357,80 +175,6 @@ const { openModal } = useModalsStore();
|
|
utils.getDateFormatted(slotProps.item.createdAt)
|
|
utils.getDateFormatted(slotProps.item.createdAt)
|
|
}}</span>
|
|
}}</span>
|
|
</template>
|
|
</template>
|
|
- <template #bulk-actions="slotProps">
|
|
|
|
- <div class="bulk-actions">
|
|
|
|
- <!-- <i
|
|
|
|
- v-if="
|
|
|
|
- hasPermission('songs.create') ||
|
|
|
|
- hasPermission('songs.update')
|
|
|
|
- "
|
|
|
|
- class="material-icons create-songs-icon"
|
|
|
|
- @click.prevent="editMany(slotProps.item)"
|
|
|
|
- content="Create/edit songs from videos"
|
|
|
|
- v-tippy
|
|
|
|
- tabindex="0"
|
|
|
|
- >
|
|
|
|
- music_note
|
|
|
|
- </i>
|
|
|
|
- <i
|
|
|
|
- v-if="
|
|
|
|
- hasPermission('songs.create') ||
|
|
|
|
- hasPermission('songs.update')
|
|
|
|
- "
|
|
|
|
- class="material-icons import-album-icon"
|
|
|
|
- @click.prevent="importAlbum(slotProps.item)"
|
|
|
|
- content="Import album from videos"
|
|
|
|
- v-tippy
|
|
|
|
- tabindex="0"
|
|
|
|
- >
|
|
|
|
- album
|
|
|
|
- </i>
|
|
|
|
- <i
|
|
|
|
- v-if="hasPermission('playlists.songs.add')"
|
|
|
|
- class="material-icons playlist-bulk-edit-icon"
|
|
|
|
- @click.prevent="bulkEditPlaylist(slotProps.item)"
|
|
|
|
- content="Add To Playlist"
|
|
|
|
- v-tippy
|
|
|
|
- tabindex="0"
|
|
|
|
- >
|
|
|
|
- playlist_add
|
|
|
|
- </i>
|
|
|
|
- <i
|
|
|
|
- v-if="hasPermission('youtube.removeVideos')"
|
|
|
|
- class="material-icons delete-icon"
|
|
|
|
- @click.prevent="
|
|
|
|
- openModal({
|
|
|
|
- modal: 'confirm',
|
|
|
|
- props: {
|
|
|
|
- message:
|
|
|
|
- 'Removing these videos will remove them from all playlists and cause a ratings recalculation.',
|
|
|
|
- onCompleted: () =>
|
|
|
|
- removeVideos(
|
|
|
|
- slotProps.item.map(
|
|
|
|
- video => video._id
|
|
|
|
- )
|
|
|
|
- )
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- "
|
|
|
|
- content="Delete Videos"
|
|
|
|
- v-tippy
|
|
|
|
- tabindex="0"
|
|
|
|
- >
|
|
|
|
- delete_forever
|
|
|
|
- </i> -->
|
|
|
|
- </div>
|
|
|
|
- </template>
|
|
|
|
</advanced-table>
|
|
</advanced-table>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
-
|
|
|
|
-<style lang="less" scoped>
|
|
|
|
-// :deep(.song-thumbnail) {
|
|
|
|
-// width: 50px;
|
|
|
|
-// height: 50px;
|
|
|
|
-// min-width: 50px;
|
|
|
|
-// min-height: 50px;
|
|
|
|
-// margin: 0 auto;
|
|
|
|
-// }
|
|
|
|
-</style>
|
|
|