mirror of
https://github.com/Dvorinka/swingmusic-extended.git
synced 2026-06-03 20:13:02 +00:00
prevent type coercion
- remove unused imports - minor refactors and cleanups
This commit is contained in:
@@ -58,7 +58,5 @@ class Handler(PatternMatchingEventHandler):
|
|||||||
print(event.dest_path)
|
print(event.dest_path)
|
||||||
|
|
||||||
|
|
||||||
# if __name__ == '__main__':
|
|
||||||
watch = OnMyWatch()
|
watch = OnMyWatch()
|
||||||
# watch.run()
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,11 +3,9 @@ input[type="range"] {
|
|||||||
margin-right: 15px;
|
margin-right: 15px;
|
||||||
width: calc(100% - 2px);
|
width: calc(100% - 2px);
|
||||||
height: 0.3rem;
|
height: 0.3rem;
|
||||||
background: rgb(59, 57, 57);
|
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
background-image: linear-gradient($blue, $blue);
|
background-size: 0 100%;
|
||||||
background-size: 0% 100%;
|
background: rgb(59, 57, 57) linear-gradient($blue, $blue) no-repeat;
|
||||||
background-repeat: no-repeat;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Input Thumb */
|
/* Input Thumb */
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.shadow-sm {
|
.shadow-sm {
|
||||||
box-shadow: 0rem 0rem .5rem rgb(0, 0, 0);
|
box-shadow: 0 0 .5rem rgb(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.shadow-md {
|
.shadow-md {
|
||||||
@@ -195,46 +195,46 @@ button {
|
|||||||
|
|
||||||
@-webkit-keyframes similarAlbums {
|
@-webkit-keyframes similarAlbums {
|
||||||
0% {
|
0% {
|
||||||
background-position: 0% 38%;
|
background-position: 0 38%;
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
background-position: 100% 63%;
|
background-position: 100% 63%;
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
background-position: 0% 38%;
|
background-position: 0 38%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@-moz-keyframes similarAlbums {
|
@-moz-keyframes similarAlbums {
|
||||||
0% {
|
0% {
|
||||||
background-position: 0% 38%;
|
background-position: 0 38%;
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
background-position: 100% 63%;
|
background-position: 100% 63%;
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
background-position: 0% 38%;
|
background-position: 0 38%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@-o-keyframes similarAlbums {
|
@-o-keyframes similarAlbums {
|
||||||
0% {
|
0% {
|
||||||
background-position: 0% 38%;
|
background-position: 0 38%;
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
background-position: 100% 63%;
|
background-position: 100% 63%;
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
background-position: 0% 38%;
|
background-position: 0 38%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@keyframes similarAlbums {
|
@keyframes similarAlbums {
|
||||||
0% {
|
0% {
|
||||||
background-position: 0% 38%;
|
background-position: 0 38%;
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
background-position: 100% 63%;
|
background-position: 100% 63%;
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
background-position: 0% 38%;
|
background-position: 0 38%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ export default {
|
|||||||
height: 10rem;
|
height: 10rem;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: rgb(196, 58, 58);
|
background-color: rgb(196, 58, 58);
|
||||||
box-shadow: 0px 0px 2rem rgb(0, 0, 0);
|
box-shadow: 0 0 2rem rgb(0, 0, 0);
|
||||||
bottom: -10rem;
|
bottom: -10rem;
|
||||||
left: 7rem;
|
left: 7rem;
|
||||||
transform: rotate(45deg) translate(-1rem, -9rem);
|
transform: rotate(45deg) translate(-1rem, -9rem);
|
||||||
@@ -74,7 +74,7 @@ export default {
|
|||||||
background-color: $blue;
|
background-color: $blue;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
transform: translateX(-11rem) translateY(7rem);
|
transform: translateX(-11rem) translateY(7rem);
|
||||||
box-shadow: 0px 0px 2rem rgb(0, 0, 0);
|
box-shadow: 0 0 2rem rgb(0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.bio {
|
.bio {
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ export default {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
left: -4.2rem;
|
left: -4.2rem;
|
||||||
top: 3rem;
|
top: 3rem;
|
||||||
box-shadow: 0px 0px 1.5rem rgb(0, 0, 0);
|
box-shadow: 0 0 1.5rem rgb(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.rect {
|
.rect {
|
||||||
@@ -96,7 +96,7 @@ export default {
|
|||||||
background-color: rgb(196, 58, 58);
|
background-color: rgb(196, 58, 58);
|
||||||
transform: rotate(-45deg) translate(20%, -50%);
|
transform: rotate(-45deg) translate(20%, -50%);
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
box-shadow: 0px 0px 2rem rgb(0, 0, 0);
|
box-shadow: 0 0 2rem rgb(0, 0, 0);
|
||||||
transition: all 0.5s ease-in-out;
|
transition: all 0.5s ease-in-out;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
@@ -114,7 +114,7 @@ export default {
|
|||||||
background-color: $blue;
|
background-color: $blue;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
transform: translateX(-11rem) translateY(7rem);
|
transform: translateX(-11rem) translateY(7rem);
|
||||||
box-shadow: 0px 0px 2rem rgba(0, 0, 0, 0.164);
|
box-shadow: 0 0 2rem rgba(0, 0, 0, 0.164);
|
||||||
transition: all 0.5s ease-in-out;
|
transition: all 0.5s ease-in-out;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
@@ -145,9 +145,7 @@ export default {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 0 1rem 0 1rem;
|
padding: 0 1rem 0 14rem;
|
||||||
position: relative;
|
|
||||||
padding-left: 14rem;
|
|
||||||
|
|
||||||
.art {
|
.art {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|||||||
@@ -26,7 +26,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from "vue";
|
|
||||||
import "../../assets/css/BottomBar/BottomBar.scss";
|
import "../../assets/css/BottomBar/BottomBar.scss";
|
||||||
import SongCard from "./SongCard.vue";
|
import SongCard from "./SongCard.vue";
|
||||||
import Progress from "../shared/Progress.vue";
|
import Progress from "../shared/Progress.vue";
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="title ellip">{{ track.title }}</div>
|
<div class="title ellip">{{ track.title }}</div>
|
||||||
<div class="separator no-border"></div>
|
<div class="separator no-border"></div>
|
||||||
<div class="artists ellip" v-if="track.artists[0] != ''">
|
<div class="artists ellip" v-if="track.artists[0] !== ''">
|
||||||
<span v-for="artist in putCommas(track.artists)" :key="artist">{{
|
<span v-for="artist in putCommas(track.artists)" :key="artist">{{
|
||||||
artist
|
artist
|
||||||
}}</span>
|
}}</span>
|
||||||
|
|||||||
@@ -16,9 +16,8 @@
|
|||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
class="search-input"
|
class="search-input"
|
||||||
placeholder="Ctrl + F"
|
placeholder="/"
|
||||||
v-model="query"
|
v-model="query"
|
||||||
@keyup.enter="search()"
|
|
||||||
/>
|
/>
|
||||||
<div class="search-icon image"></div>
|
<div class="search-icon image"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -109,8 +108,7 @@ export default {
|
|||||||
|
|
||||||
border-radius: $small;
|
border-radius: $small;
|
||||||
background-color: rgb(24, 22, 22);
|
background-color: rgb(24, 22, 22);
|
||||||
padding: $small;
|
padding: $small $small $small 2.25rem;
|
||||||
padding-left: 2.25rem;
|
|
||||||
|
|
||||||
.icon {
|
.icon {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from "vue";
|
|
||||||
|
|
||||||
const menus = [
|
const menus = [
|
||||||
{
|
{
|
||||||
@@ -71,10 +70,9 @@ const props = defineProps({
|
|||||||
}
|
}
|
||||||
|
|
||||||
.side-nav-container {
|
.side-nav-container {
|
||||||
padding: $small;
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
padding-top: 10px;
|
padding: 10px $small $small;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
|
|
||||||
|
|||||||
@@ -132,14 +132,14 @@ export default {
|
|||||||
transition: all 0.5s ease-in-out;
|
transition: all 0.5s ease-in-out;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-position: 0%;
|
background-position: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
margin-left: 1rem;
|
margin-left: 1rem;
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
text-shadow: 0px 0px 80px rgb(0, 0, 0);
|
text-shadow: 0 0 80px rgb(0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
color: rgb(255, 255, 255);
|
color: rgb(255, 255, 255);
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
border-radius: $smaller;
|
border-radius: $smaller;
|
||||||
box-shadow: 0px 0px 1rem rgba(0, 0, 0, 0.479);
|
box-shadow: 0 0 1rem rgba(0, 0, 0, 0.479);
|
||||||
|
|
||||||
@include phone-only {
|
@include phone-only {
|
||||||
// border: solid;
|
// border: solid;
|
||||||
@@ -64,12 +64,11 @@
|
|||||||
height: 10rem;
|
height: 10rem;
|
||||||
bottom: $small;
|
bottom: $small;
|
||||||
left: $small;
|
left: $small;
|
||||||
padding: $small;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: flex-end;
|
align-items: flex-end;
|
||||||
padding-bottom: 3.5rem;
|
padding: $small $small 3.5rem;
|
||||||
box-shadow: 0px 0px 1.5rem rgba(0, 0, 0, 0.658);
|
box-shadow: 0 0 1.5rem rgba(0, 0, 0, 0.658);
|
||||||
|
|
||||||
@include phone-only {
|
@include phone-only {
|
||||||
width: calc(100% - 1rem);
|
width: calc(100% - 1rem);
|
||||||
|
|||||||
@@ -2,14 +2,14 @@
|
|||||||
<div class="r-sidebar">
|
<div class="r-sidebar">
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<div class="r-content border">
|
<div class="r-content border">
|
||||||
<div class="r-dash" v-show="current_tab == tabs.home">
|
<div class="r-dash" v-show="current_tab === tabs.home">
|
||||||
<DashBoard />
|
<DashBoard />
|
||||||
</div>
|
</div>
|
||||||
<div class="r-search" v-show="current_tab == tabs.search">
|
<div class="r-search" v-show="current_tab === tabs.search">
|
||||||
<Search />
|
<Search />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="r-queue" v-show="current_tab == tabs.queue">
|
<div class="r-queue" v-show="current_tab === tabs.queue">
|
||||||
<UpNext />
|
<UpNext />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="r-tabs">
|
<div class="r-tabs">
|
||||||
<div v-for="tab in props.tabs"
|
<div v-for="tab in props.tabs"
|
||||||
@click="changeTab(tab)"
|
@click="changeTab(tab)"
|
||||||
:key="tab"
|
:key="tab"
|
||||||
class="image t-item"
|
class="image t-item"
|
||||||
:class="{ active_tab: props.current_tab == tab }, `${tab}`"
|
:class="{ active_tab: props.current_tab === tab }, `${tab}`"
|
||||||
></div>
|
></div>
|
||||||
<div>
|
<div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>import { onMounted } from 'vue';
|
<script setup>
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
current_tab: String,
|
current_tab: String,
|
||||||
@@ -21,7 +21,7 @@ const props = defineProps({
|
|||||||
const emit = defineEmits(['changeTab'])
|
const emit = defineEmits(['changeTab'])
|
||||||
|
|
||||||
function changeTab(tab) {
|
function changeTab(tab) {
|
||||||
if (tab == props.current_tab) return;
|
if (tab === props.current_tab) return;
|
||||||
|
|
||||||
emit('changeTab', tab)
|
emit('changeTab', tab)
|
||||||
}
|
}
|
||||||
@@ -41,8 +41,7 @@ function changeTab(tab) {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
height: 2.45rem;
|
height: 2.45rem;
|
||||||
background-size: 1.5rem;
|
background-size: 1.5rem;
|
||||||
border-radius: 0;
|
border-radius: $small 0 0 $small;
|
||||||
border-radius: $small 0 0 $small;
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: rgba(128, 128, 128, 0.281);
|
background-color: rgba(128, 128, 128, 0.281);
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
v-if="
|
v-if="
|
||||||
!artists.artists.length &&
|
!artists.artists.length &&
|
||||||
!tracks.tracks.length &&
|
!tracks.tracks.length &&
|
||||||
!albums.albums.length && query.length != 0
|
!albums.albums.length && query.length !== 0
|
||||||
"
|
"
|
||||||
class="no-res"
|
class="no-res"
|
||||||
>
|
>
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
No results for <span class="highlight rounded">{{ query }}</span>
|
No results for <span class="highlight rounded">{{ query }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="query.length == 0" class="no-res">
|
<div v-else-if="query.length === 0" class="no-res">
|
||||||
<div class="no-res-text">Find your music 🔍😀</div>
|
<div class="no-res-text">Find your music 🔍😀</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -123,14 +123,14 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
watch(query, (new_query) => {
|
watch(query, (new_query) => {
|
||||||
if (query.value == "" || query.value == " " || query.value.length < 2) {
|
if (query.value === "" || query.value === " " || query.value.length < 2) {
|
||||||
albums.albums = [];
|
albums.albums = [];
|
||||||
artists.artists = [];
|
artists.artists = [];
|
||||||
tracks.tracks = [];
|
tracks.tracks = [];
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
;
|
|
||||||
|
|
||||||
searchMusic(new_query).then((res) => {
|
searchMusic(new_query).then((res) => {
|
||||||
albums.albums = res.albums.albums;
|
albums.albums = res.albums.albums;
|
||||||
|
|||||||
@@ -36,13 +36,14 @@ export default {
|
|||||||
height: 7em;
|
height: 7em;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
margin-bottom: $small;
|
margin-bottom: $small;
|
||||||
background: url("../../assets/images/null.webp");
|
|
||||||
background-size: 7rem 7rem;
|
background-size: 7rem 7rem;
|
||||||
|
background: url("../../assets/images/null.webp");
|
||||||
|
background-size: 100% 100%;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center;
|
background-position: top;
|
||||||
transition: all 0.5s ease-in-out;
|
transition: all 0.5s ease-in-out;
|
||||||
border: solid 1px rgba(5, 5, 5, 0.055);
|
border: solid 1px rgba(5, 5, 5, 0.055);
|
||||||
box-shadow: 0px 0px 80px rgb(0, 0, 0);
|
box-shadow: 0 0 80px rgb(0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<tr class="songlist-item" :class="{ current: current.track_id == song.track_id }">
|
<tr class="songlist-item" :class="{ current: current.track_id === song.track_id }">
|
||||||
<td class="index">{{ index }}</td>
|
<td class="index">{{ index }}</td>
|
||||||
<td class="flex" @click="emitUpdate(song)">
|
<td class="flex" @click="emitUpdate(song)">
|
||||||
<div
|
<div
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="now-playing-track image"
|
class="now-playing-track image"
|
||||||
v-if="current.track_id == song.track_id"
|
v-if="current.track_id === song.track_id"
|
||||||
:class="{ active: is_playing, not_active: !is_playing }"
|
:class="{ active: is_playing, not_active: !is_playing }"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td class="song-artists">
|
<td class="song-artists">
|
||||||
<div class="ellip" v-if="song.artists[0] != ''">
|
<div class="ellip" v-if="song.artists[0] !== ''">
|
||||||
<span
|
<span
|
||||||
class="artist"
|
class="artist"
|
||||||
v-for="artist in putCommas(song.artists)"
|
v-for="artist in putCommas(song.artists)"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
class="track-item h-1"
|
class="track-item h-1"
|
||||||
@click="playThis(props.track)"
|
@click="playThis(props.track)"
|
||||||
:class="{
|
:class="{
|
||||||
currentInQueue: current.track_id == props.track.track_id,
|
currentInQueue: current.track_id === props.track.track_id,
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
class="now-playing-track image"
|
class="now-playing-track image"
|
||||||
v-if="current.track_id == props.track.track_id"
|
v-if="current.track_id === props.track.track_id"
|
||||||
:class="{ active: is_playing, not_active: !is_playing }"
|
:class="{ active: is_playing, not_active: !is_playing }"
|
||||||
></div>
|
></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -44,7 +44,7 @@ const putCommas = perks.putCommas;
|
|||||||
const is_playing = ref(playAudio.playing);
|
const is_playing = ref(playAudio.playing);
|
||||||
|
|
||||||
const playThis = (song) => {
|
const playThis = (song) => {
|
||||||
playAudio.playAudio(song.filepath);
|
playAudio.playAudio(song.track_id);
|
||||||
perks.current.value = song;
|
perks.current.value = song;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -58,11 +58,10 @@ const playThis = (song) => {
|
|||||||
.track-item {
|
.track-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 0.5rem;
|
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 4rem;
|
height: 4rem;
|
||||||
padding-left: 4rem;
|
padding: 0.5rem 0.5rem 0.5rem 4rem;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|||||||
@@ -10,13 +10,11 @@ const getAlbumTracks = async (name, artist) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
const message = `An error has occured: ${res.status}`;
|
const message = `An error has occurred: ${res.status}`;
|
||||||
throw new Error(message);
|
throw new Error(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await res.json();
|
return await res.json();
|
||||||
|
|
||||||
return data;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const getAlbumArtists = async (name, artist) => {
|
const getAlbumArtists = async (name, artist) => {
|
||||||
@@ -30,7 +28,7 @@ const getAlbumArtists = async (name, artist) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
const message = `An error has occured: ${res.status}`;
|
const message = `An error has occurred: ${res.status}`;
|
||||||
throw new Error(message);
|
throw new Error(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +47,7 @@ const getAlbumBio = async (name, artist) => {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
const message = `An error has occured: ${res.status}`;
|
const message = `An error has occurred: ${res.status}`;
|
||||||
throw new Error(message);
|
throw new Error(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-12
@@ -1,24 +1,24 @@
|
|||||||
let base_uri = "http://0.0.0.0:9876";
|
let base_uri = "http://0.0.0.0:9876";
|
||||||
|
|
||||||
const getTracksAndDirs = async (path) => {
|
const getTracksAndDirs = async (path) => {
|
||||||
let url;
|
let url;
|
||||||
|
|
||||||
const encoded_path = encodeURIComponent(path.replaceAll("/", "|"));
|
const encoded_path = encodeURIComponent(path.replaceAll("/", "|"));
|
||||||
url = url = `${base_uri}/f/${encoded_path}`;
|
url = url = `${base_uri}/f/${encoded_path}`;
|
||||||
|
|
||||||
const res = await fetch(url);
|
const res = await fetch(url);
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
const message = `An error has occured: ${res.status}`;
|
const message = `An error has occurred: ${res.status}`;
|
||||||
throw new Error(message);
|
throw new Error(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
|
|
||||||
const songs = data.files;
|
const songs = data.files;
|
||||||
const folders = data.folders;
|
const folders = data.folders;
|
||||||
|
|
||||||
return { songs, folders };
|
return {songs, folders};
|
||||||
};
|
};
|
||||||
|
|
||||||
export default getTracksAndDirs;
|
export default getTracksAndDirs;
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ function updateNext(song_) {
|
|||||||
(item) => item.track_id === song_.track_id
|
(item) => item.track_id === song_.track_id
|
||||||
);
|
);
|
||||||
|
|
||||||
if (index == queue.value.length - 1) {
|
if (index === queue.value.length - 1) {
|
||||||
next.value = queue.value[0];
|
next.value = queue.value[0];
|
||||||
state.prev.value = queue.value[queue.value.length - 2];
|
state.prev.value = queue.value[queue.value.length - 2];
|
||||||
} else if (index == 0) {
|
} else if (index === 0) {
|
||||||
next.value = queue.value[1];
|
next.value = queue.value[1];
|
||||||
} else {
|
} else {
|
||||||
next.value = queue.value[index + 1];
|
next.value = queue.value[index + 1];
|
||||||
@@ -55,9 +55,9 @@ function updatePrev(song) {
|
|||||||
(item) => item.track_id === song.track_id
|
(item) => item.track_id === song.track_id
|
||||||
);
|
);
|
||||||
|
|
||||||
if (index == 0) {
|
if (index === 0) {
|
||||||
prev.value = queue.value[queue.value.length - 1];
|
prev.value = queue.value[queue.value.length - 1];
|
||||||
} else if (index == queue.value.length - 1) {
|
} else if (index === queue.value.length - 1) {
|
||||||
prev.value = queue.value[index - 1];
|
prev.value = queue.value[index - 1];
|
||||||
} else {
|
} else {
|
||||||
prev.value = queue.value[index - 1];
|
prev.value = queue.value[index - 1];
|
||||||
@@ -81,7 +81,7 @@ const readQueue = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const updateQueue = async (song, type) => {
|
const updateQueue = async (song, type) => {
|
||||||
playAudio.playAudio(song.filepath);
|
playAudio.playAudio(song.track_id);
|
||||||
let list;
|
let list;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@@ -151,7 +151,7 @@ window.addEventListener("keydown", (e) => {
|
|||||||
|
|
||||||
switch (e.key) {
|
switch (e.key) {
|
||||||
case "ArrowRight":
|
case "ArrowRight":
|
||||||
if (target.tagName == "INPUT") return;
|
if (target.tagName === "INPUT") return;
|
||||||
|
|
||||||
{
|
{
|
||||||
if (!key_down_fired) {
|
if (!key_down_fired) {
|
||||||
@@ -169,7 +169,7 @@ window.addEventListener("keydown", (e) => {
|
|||||||
case "ArrowLeft":
|
case "ArrowLeft":
|
||||||
{
|
{
|
||||||
if (!key_down_fired) {
|
if (!key_down_fired) {
|
||||||
if (target.tagName == "INPUT") return;
|
if (target.tagName === "INPUT") return;
|
||||||
|
|
||||||
key_down_fired = true;
|
key_down_fired = true;
|
||||||
|
|
||||||
@@ -186,7 +186,7 @@ window.addEventListener("keydown", (e) => {
|
|||||||
case " ":
|
case " ":
|
||||||
{
|
{
|
||||||
if (!key_down_fired) {
|
if (!key_down_fired) {
|
||||||
if (target.tagName == "INPUT") return;
|
if (target.tagName === "INPUT") return;
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
key_down_fired = true;
|
key_down_fired = true;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ref } from "@vue/reactivity";
|
import {ref} from "@vue/reactivity";
|
||||||
|
|
||||||
import perks from "./perks";
|
import perks from "./perks";
|
||||||
import media from "./mediaNotification.js";
|
import media from "./mediaNotification.js";
|
||||||
@@ -11,77 +11,77 @@ const current_time = ref(0);
|
|||||||
|
|
||||||
const playing = ref(state.is_playing);
|
const playing = ref(state.is_playing);
|
||||||
|
|
||||||
const url = "http://0.0.0.0:8901/";
|
const url = "http://0.0.0.0:9876/file/";
|
||||||
|
|
||||||
const playAudio = (path) => {
|
const playAudio = (track_id) => {
|
||||||
const elem = document.getElementsByClassName('progress-bar')[0];
|
const elem = document.getElementsByClassName('progress-bar')[0];
|
||||||
const bottom_elem = document.getElementsByClassName('progress-bar')[1];
|
const bottom_elem = document.getElementsByClassName('progress-bar')[1];
|
||||||
|
|
||||||
const full_path = url + encodeURIComponent(path);
|
const full_path = url + encodeURIComponent(track_id);
|
||||||
|
|
||||||
new Promise((resolve, reject) => {
|
new Promise((resolve, reject) => {
|
||||||
audio.src = full_path;
|
audio.src = full_path;
|
||||||
audio.oncanplaythrough = resolve;
|
audio.oncanplaythrough = resolve;
|
||||||
audio.onerror = reject;
|
audio.onerror = reject;
|
||||||
})
|
|
||||||
.then(() => {
|
|
||||||
audio.play();
|
|
||||||
perks.focusCurrent()
|
|
||||||
|
|
||||||
state.is_playing.value = true;
|
|
||||||
|
|
||||||
audio.ontimeupdate = () => {
|
|
||||||
current_time.value = audio.currentTime;
|
|
||||||
pos.value = (audio.currentTime / audio.duration) * 1000;
|
|
||||||
let bg_size = ((audio.currentTime / audio.duration)*100)
|
|
||||||
|
|
||||||
elem.style.backgroundSize = `${bg_size}% 100%`;
|
|
||||||
bottom_elem.style.backgroundSize = `${bg_size}% 100%`;
|
|
||||||
};
|
|
||||||
})
|
})
|
||||||
.catch((err) => console.log(err));
|
.then(() => {
|
||||||
|
audio.play().then(() => {
|
||||||
|
perks.focusCurrent()
|
||||||
|
state.is_playing.value = true;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
audio.ontimeupdate = () => {
|
||||||
|
current_time.value = audio.currentTime;
|
||||||
|
pos.value = (audio.currentTime / audio.duration) * 1000;
|
||||||
|
let bg_size = ((audio.currentTime / audio.duration) * 100)
|
||||||
|
|
||||||
|
elem.style.backgroundSize = `${bg_size}% 100%`;
|
||||||
|
bottom_elem.style.backgroundSize = `${bg_size}% 100%`;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.catch((err) => console.log(err));
|
||||||
};
|
};
|
||||||
|
|
||||||
function playNext() {
|
function playNext() {
|
||||||
playAudio(perks.next.value.filepath);
|
playAudio(perks.next.value.track_id);
|
||||||
perks.current.value = perks.next.value;
|
perks.current.value = perks.next.value;
|
||||||
media.showMediaNotif();
|
media.showMediaNotif();
|
||||||
}
|
}
|
||||||
|
|
||||||
function playPrev() {
|
function playPrev() {
|
||||||
playAudio(state.prev.value.filepath);
|
playAudio(state.prev.value.track_id);
|
||||||
perks.current.value = perks.prev.value;
|
perks.current.value = perks.prev.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function seek(position) {
|
function seek(position) {
|
||||||
audio.currentTime = (position / 1000) * audio.duration;
|
audio.currentTime = (position / 1000) * audio.duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
function playPause() {
|
function playPause() {
|
||||||
if (audio.src === "") {
|
if (audio.src === "") {
|
||||||
playAudio(perks.current.value.filepath);
|
playAudio(perks.current.value.filepath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audio.paused) {
|
if (audio.paused) {
|
||||||
audio.play();
|
audio.play();
|
||||||
} else {
|
} else {
|
||||||
audio.pause();
|
audio.pause();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
audio.addEventListener("play", () => {
|
audio.addEventListener("play", () => {
|
||||||
state.is_playing.value = true;
|
state.is_playing.value = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
audio.addEventListener("pause", () => {
|
audio.addEventListener("pause", () => {
|
||||||
state.is_playing.value = false;
|
state.is_playing.value = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
audio.addEventListener("ended", () => {
|
audio.addEventListener("ended", () => {
|
||||||
playNext();
|
playNext();
|
||||||
});
|
});
|
||||||
|
|
||||||
export default { playAudio, playNext, playPrev, playPause, seek, pos, playing, current_time };
|
export default {playAudio, playNext, playPrev, playPause, seek, pos, playing, current_time};
|
||||||
|
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
|
|||||||
@@ -3,41 +3,41 @@ import Router from "@/router";
|
|||||||
import album from "./album.js";
|
import album from "./album.js";
|
||||||
import state from "./state.js";
|
import state from "./state.js";
|
||||||
|
|
||||||
function toAlbum(title, artist) {
|
async function toAlbum(title, artist) {
|
||||||
state.loading.value = true;
|
state.loading.value = true;
|
||||||
album
|
album
|
||||||
.getAlbumTracks(title, artist)
|
.getAlbumTracks(title, artist)
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
state.album_song_list.value = data.songs;
|
state.album_song_list.value = data.songs;
|
||||||
state.album_info.value = data.info;
|
state.album_info.value = data.info;
|
||||||
})
|
})
|
||||||
.then(
|
.then(
|
||||||
album.getAlbumArtists(title, artist).then((data) => {
|
await album.getAlbumArtists(title, artist).then((data) => {
|
||||||
state.album_artists.value = data;
|
state.album_artists.value = data;
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.then(
|
.then(
|
||||||
album.getAlbumBio(title, artist).then((data) => {
|
await album.getAlbumBio(title, artist).then((data) => {
|
||||||
if (data == "None") {
|
if (data === "None") {
|
||||||
state.album_bio.value = null;
|
state.album_bio.value = null;
|
||||||
} else {
|
} else {
|
||||||
state.album_bio.value = data;
|
state.album_bio.value = data;
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
Router.push({
|
Router.push({
|
||||||
name: "AlbumView",
|
name: "AlbumView",
|
||||||
params: {
|
params: {
|
||||||
album: title,
|
album: title,
|
||||||
artist: artist,
|
artist: artist,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
state.loading.value = false;
|
state.loading.value = false;
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ref, customRef } from 'vue'
|
import {customRef, ref} from 'vue'
|
||||||
|
|
||||||
const debounce = (fn, delay = 0, immediate = false) => {
|
const debounce = (fn, delay = 0, immediate = false) => {
|
||||||
let timeout
|
let timeout
|
||||||
@@ -14,21 +14,20 @@ const debounce = (fn, delay = 0, immediate = false) => {
|
|||||||
|
|
||||||
const useDebouncedRef = (initialValue, delay, immediate) => {
|
const useDebouncedRef = (initialValue, delay, immediate) => {
|
||||||
const state = ref(initialValue)
|
const state = ref(initialValue)
|
||||||
const debouncedRef = customRef((track, trigger) => ({
|
return customRef((track, trigger) => ({
|
||||||
get() {
|
get() {
|
||||||
track()
|
track()
|
||||||
return state.value
|
return state.value
|
||||||
},
|
},
|
||||||
set: debounce(
|
set: debounce(
|
||||||
value => {
|
value => {
|
||||||
state.value = value
|
state.value = value
|
||||||
trigger()
|
trigger()
|
||||||
},
|
},
|
||||||
delay,
|
delay,
|
||||||
immediate
|
immediate
|
||||||
),
|
),
|
||||||
}))
|
}))
|
||||||
return debouncedRef
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default useDebouncedRef
|
export default useDebouncedRef
|
||||||
|
|||||||
+1
-1
@@ -12,4 +12,4 @@ const emitter = mitt();
|
|||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
app.use(router);
|
app.use(router);
|
||||||
app.provide('emitter', emitter);
|
app.provide('emitter', emitter);
|
||||||
app.mount('#app');
|
app.mount('#app');
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
import { onMounted } from "@vue/runtime-core";
|
import { onMounted } from "@vue/runtime-core";
|
||||||
import { onUnmounted } from "@vue/runtime-core";
|
import { onUnmounted } from "@vue/runtime-core";
|
||||||
import { watch, ref } from "vue";
|
import { watch } from "vue";
|
||||||
import Header from "../components/AlbumView/Header.vue";
|
import Header from "../components/AlbumView/Header.vue";
|
||||||
import AlbumBio from "../components/AlbumView/AlbumBio.vue";
|
import AlbumBio from "../components/AlbumView/AlbumBio.vue";
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ export default {
|
|||||||
watch(
|
watch(
|
||||||
() => route.params,
|
() => route.params,
|
||||||
() => {
|
() => {
|
||||||
if (route.name == "AlbumView") {
|
if (route.name === "AlbumView") {
|
||||||
routeLoader.toAlbum(route.params.album, route.params.artist);
|
routeLoader.toAlbum(route.params.album, route.params.artist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+25
-25
@@ -1,26 +1,26 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="f-view-parent" class="card-dark">
|
<div id="f-view-parent" class="border rounded card-dark">
|
||||||
<div class="fixed">
|
<div class="fixed">
|
||||||
<Header :path="path" :first_song="songs[0]" @search="updateQueryString" />
|
<Header :path="path" :first_song="songs[0]" @search="updateQueryString"/>
|
||||||
</div>
|
</div>
|
||||||
<div id="scrollable" ref="scrollable">
|
<div id="scrollable" ref="scrollable">
|
||||||
<FolderList :folders="folders" />
|
<FolderList :folders="folders"/>
|
||||||
<div class="separator" v-if="folders.length && songs.length"></div>
|
<div class="separator" v-if="folders.length && songs.length"></div>
|
||||||
<SongList :songs="songs" />
|
<SongList :songs="songs"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { computed, ref } from "@vue/reactivity";
|
import {computed, ref} from "@vue/reactivity";
|
||||||
import { useRoute } from "vue-router";
|
import {useRoute} from "vue-router";
|
||||||
|
|
||||||
import SongList from "@/components/FolderView/SongList.vue";
|
import SongList from "@/components/FolderView/SongList.vue";
|
||||||
import FolderList from "@/components/FolderView/FolderList.vue";
|
import FolderList from "@/components/FolderView/FolderList.vue";
|
||||||
import Header from "@/components/FolderView/Header.vue";
|
import Header from "@/components/FolderView/Header.vue";
|
||||||
|
|
||||||
import getTracksAndDirs from "../composables/getFiles.js";
|
import getTracksAndDirs from "../composables/getFiles.js";
|
||||||
import { onMounted, watch } from "@vue/runtime-core";
|
import {onMounted, watch} from "@vue/runtime-core";
|
||||||
import state from "@/composables/state.js";
|
import state from "@/composables/state.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -46,9 +46,9 @@ export default {
|
|||||||
if (query.value.length > 1) {
|
if (query.value.length > 1) {
|
||||||
for (let i = 0; i < song_list.value.length; i++) {
|
for (let i = 0; i < song_list.value.length; i++) {
|
||||||
if (
|
if (
|
||||||
song_list.value[i].title
|
song_list.value[i].title
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
.includes(query.value.toLowerCase())
|
.includes(query.value.toLowerCase())
|
||||||
) {
|
) {
|
||||||
songs_.push(song_list.value[i]);
|
songs_.push(song_list.value[i]);
|
||||||
}
|
}
|
||||||
@@ -66,9 +66,9 @@ export default {
|
|||||||
if (query.value.length > 1) {
|
if (query.value.length > 1) {
|
||||||
for (let i = 0; i < folders_list.value.length; i++) {
|
for (let i = 0; i < folders_list.value.length; i++) {
|
||||||
if (
|
if (
|
||||||
folders_list.value[i].name
|
folders_list.value[i].name
|
||||||
.toLowerCase()
|
.toLowerCase()
|
||||||
.includes(query.value.toLowerCase())
|
.includes(query.value.toLowerCase())
|
||||||
) {
|
) {
|
||||||
folders_.push(folders_list.value[i]);
|
folders_.push(folders_list.value[i]);
|
||||||
}
|
}
|
||||||
@@ -84,19 +84,19 @@ export default {
|
|||||||
const getDirData = (path) => {
|
const getDirData = (path) => {
|
||||||
state.loading.value = true;
|
state.loading.value = true;
|
||||||
getTracksAndDirs(path)
|
getTracksAndDirs(path)
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
scrollable.value.scrollTop = 0;
|
scrollable.value.scrollTop = 0;
|
||||||
|
|
||||||
state.folder_song_list.value = data.songs;
|
state.folder_song_list.value = data.songs;
|
||||||
state.folder_list.value = data.folders;
|
state.folder_list.value = data.folders;
|
||||||
|
|
||||||
state.loading.value = false;
|
state.loading.value = false;
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
query.value = "";
|
query.value = "";
|
||||||
}, 100);
|
}, 100);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
getDirData(path.value);
|
getDirData(path.value);
|
||||||
@@ -130,7 +130,7 @@ export default {
|
|||||||
position: relative;
|
position: relative;
|
||||||
padding: 4rem $small 0 $small;
|
padding: 4rem $small 0 $small;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
margin: 0;
|
margin: $small;
|
||||||
}
|
}
|
||||||
|
|
||||||
#f-view-parent .fixed {
|
#f-view-parent .fixed {
|
||||||
|
|||||||
Reference in New Issue
Block a user