mirror of
https://github.com/tcsenpai/swingmusic.git
synced 2025-07-28 13:41:42 +00:00
client: request folder lists from server
This commit is contained in:
parent
803c813786
commit
701f61250e
1
server/.gitignore
vendored
1
server/.gitignore
vendored
@ -1 +0,0 @@
|
|||||||
.vscode
|
|
@ -14,6 +14,7 @@ requests = "*"
|
|||||||
watchdog = "*"
|
watchdog = "*"
|
||||||
progress = "*"
|
progress = "*"
|
||||||
pillow = "*"
|
pillow = "*"
|
||||||
|
gunicorn = "*"
|
||||||
|
|
||||||
[dev-packages]
|
[dev-packages]
|
||||||
autopep8 = "*"
|
autopep8 = "*"
|
||||||
|
10
server/Pipfile.lock
generated
10
server/Pipfile.lock
generated
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"hash": {
|
"hash": {
|
||||||
"sha256": "99f472c203bd38494cccddd96820194910b1693da8ea6ed6d4b141895ff3002e"
|
"sha256": "ac6887caf42c4ea723d7e1e9fc8a94cb42b2cd815c447eb2afd0f35a73f314e1"
|
||||||
},
|
},
|
||||||
"pipfile-spec": 6,
|
"pipfile-spec": 6,
|
||||||
"requires": {
|
"requires": {
|
||||||
@ -55,6 +55,14 @@
|
|||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==3.0.10"
|
"version": "==3.0.10"
|
||||||
},
|
},
|
||||||
|
"gunicorn": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e",
|
||||||
|
"sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==20.1.0"
|
||||||
|
},
|
||||||
"idna": {
|
"idna": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
|
"sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff",
|
||||||
|
@ -10,8 +10,3 @@ def create_app():
|
|||||||
app.register_blueprint(api.bp, url_prefix='/')
|
app.register_blueprint(api.bp, url_prefix='/')
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
app = create_app()
|
|
||||||
app.run(debug=True)
|
|
||||||
|
6
server/manage.py
Normal file
6
server/manage.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from app import create_app
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = create_app()
|
||||||
|
app.run(debug=True, threaded=True, host="127.0.0.1", port=9876)
|
@ -1,10 +1,14 @@
|
|||||||
export PORT=8000
|
export PORT=8000
|
||||||
export music_dir="/home/cwilvx/Music/"
|
export music_dir="/home/cwilvx/Music/"
|
||||||
|
|
||||||
export FLASK_APP=app
|
# export FLASK_APP=app
|
||||||
export FLASK_DEBUG=1
|
# export FLASK_DEBUG=1
|
||||||
export FLASK_RUN_PORT=8008
|
# export FLASK_RUN_PORT=8008
|
||||||
|
|
||||||
# export music_dirs="['/home/cwilvx/Music/', '/home/cwilvx/FreezerMusic']"
|
# export music_dirs="['/home/cwilvx/Music/', '/home/cwilvx/FreezerMusic']"
|
||||||
|
|
||||||
flask run
|
# flask run
|
||||||
|
|
||||||
|
python manage.py
|
||||||
|
|
||||||
|
# gunicorn -b 0.0.0.0:9876 --workers=4 "wsgi:create_app()" --log-level=debug
|
5
server/wsgi.py
Normal file
5
server/wsgi.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from app import create_app
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app = create_app()
|
||||||
|
app.run(debug=True, threaded=True)
|
@ -1,29 +1,32 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="f-container rounded">
|
<div class="f-container rounded">
|
||||||
<p>folders in this directory</p>
|
<p v-if="folders.length">folders in this directory</p>
|
||||||
<div id="f-items">
|
<div id="f-items" v-if="folders.length">
|
||||||
<router-link :to="{ path: '/' }" v-for="folder in folders" :key="folder">
|
<router-link
|
||||||
|
:to="{ name: 'FolderView', params: { path: folder.path } }"
|
||||||
|
v-for="folder in folders"
|
||||||
|
:key="folder"
|
||||||
|
>
|
||||||
<div class="f-item rounded">
|
<div class="f-item rounded">
|
||||||
<span class="f-item-text">{{ folder.name }}</span>
|
<div class="f-item-text ellip">{{ folder.name }}</div>
|
||||||
|
<div class="f-item-count">{{ folder.count }} tracks</div>
|
||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<p>No folders in this directory</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Folders from "../../data/folders.js";
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
setup() {
|
props: ["folders"],
|
||||||
const folders = Folders.folders;
|
setup() {},
|
||||||
|
|
||||||
return { folders };
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style lang="scss">
|
||||||
.f-container {
|
.f-container {
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
background: rgba(31, 30, 30, 0.521);
|
background: rgba(31, 30, 30, 0.521);
|
||||||
@ -49,7 +52,6 @@ export default {
|
|||||||
min-width: 14.4rem;
|
min-width: 14.4rem;
|
||||||
min-height: 5rem;
|
min-height: 5rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
position: relative;
|
position: relative;
|
||||||
background-image: url(../../assets/icons/folder.svg);
|
background-image: url(../../assets/icons/folder.svg);
|
||||||
@ -57,21 +59,23 @@ export default {
|
|||||||
background-position: 1rem;
|
background-position: 1rem;
|
||||||
background-size: 10% 100%;
|
background-size: 10% 100%;
|
||||||
background-color: rgba(80, 80, 80, 0.247);
|
background-color: rgba(80, 80, 80, 0.247);
|
||||||
|
|
||||||
|
.f-item-count {
|
||||||
|
position: absolute;
|
||||||
|
top: 70%;
|
||||||
|
left: 3rem;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: rgba(255, 255, 255, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.f-item-text {
|
||||||
|
position: absolute;
|
||||||
|
left: 3rem;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.f-container .f-item:hover {
|
.f-container .f-item:hover {
|
||||||
background-color: rgba(0, 0, 0, 0.527);
|
background-color: rgba(0, 0, 0, 0.527);
|
||||||
}
|
}
|
||||||
|
|
||||||
.f-container .f-item-text {
|
|
||||||
position: absolute;
|
|
||||||
left: 3rem;
|
|
||||||
text-align: left;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-line-clamp: 1;
|
|
||||||
line-clamp: 1;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
@ -45,7 +45,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
<hr />
|
<hr />
|
||||||
<router-link :to="{ name: 'FolderView' }">
|
<router-link :to="{ name: 'FolderView', params: { path: ' ' } }">
|
||||||
<div class="nav-button" id="folders-button">
|
<div class="nav-button" id="folders-button">
|
||||||
<div class="in">
|
<div class="in">
|
||||||
<div class="nav-icon image" id="folders-icon"></div>
|
<div class="nav-icon image" id="folders-icon"></div>
|
||||||
@ -54,7 +54,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</router-link>
|
</router-link>
|
||||||
<hr />
|
<hr />
|
||||||
<router-link :to="{ name: 'FolderView' }">
|
<router-link :to="{ name: 'FolderView', params: { path: ' ' } }">
|
||||||
<div class="nav-button" id="folders-button">
|
<div class="nav-button" id="folders-button">
|
||||||
<div class="in">
|
<div class="in">
|
||||||
<div class="nav-icon image" id="settings-icon"></div>
|
<div class="nav-icon image" id="settings-icon"></div>
|
||||||
@ -104,7 +104,7 @@ export default {
|
|||||||
.collapsed .nav-button {
|
.collapsed .nav-button {
|
||||||
font-size: smaller;
|
font-size: smaller;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
transition: all .2s ease-in-out;
|
transition: all 0.2s ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-nav-container .nav-button:hover {
|
.side-nav-container .nav-button:hover {
|
||||||
|
23
src/composables/getFiles.js
Normal file
23
src/composables/getFiles.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { ref } from "@vue/reactivity";
|
||||||
|
|
||||||
|
let home_url = "http://127.0.0.1:9876";
|
||||||
|
|
||||||
|
const getData = async (path) => {
|
||||||
|
const songs = ref(null);
|
||||||
|
const folders = ref(null);
|
||||||
|
|
||||||
|
const res = await fetch(`${home_url}/?f=${path}`);
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
const message = `An erro has occured: ${res.status}`;
|
||||||
|
throw new Error(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await res.json();
|
||||||
|
songs.value = data.songs;
|
||||||
|
folders.value = data.folders;
|
||||||
|
|
||||||
|
return { songs, folders };
|
||||||
|
};
|
||||||
|
|
||||||
|
export default getData;
|
@ -1,17 +0,0 @@
|
|||||||
const scrollLeftX = (artists_dom) => {
|
|
||||||
const dom = artists_dom.value;
|
|
||||||
dom.scrollBy({
|
|
||||||
left: -700,
|
|
||||||
behavior: "smooth",
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const scrollRightX = (artists_dom) => {
|
|
||||||
const dom = artists_dom.value;
|
|
||||||
dom.scrollBy({
|
|
||||||
left: 700,
|
|
||||||
behavior: "smooth",
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export { scrollLeftX, scrollRightX, };
|
|
@ -15,7 +15,7 @@ const routes = [
|
|||||||
component: Home,
|
component: Home,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/folder",
|
path: "/folder:path",
|
||||||
name: "FolderView",
|
name: "FolderView",
|
||||||
component: FolderView,
|
component: FolderView,
|
||||||
},
|
},
|
||||||
|
@ -12,11 +12,13 @@
|
|||||||
<div class="separator" id="av-sep"></div>
|
<div class="separator" id="av-sep"></div>
|
||||||
<AlbumBio />
|
<AlbumBio />
|
||||||
<div class="separator" id="av-sep"></div>
|
<div class="separator" id="av-sep"></div>
|
||||||
<FromTheSameArtist/>
|
<FromTheSameArtist />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
// import { useRoute } from 'vue-router'
|
||||||
|
|
||||||
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";
|
||||||
import FromTheSameArtist from "../components/AlbumView/FromTheSameArtist.vue";
|
import FromTheSameArtist from "../components/AlbumView/FromTheSameArtist.vue";
|
||||||
@ -32,6 +34,7 @@ export default {
|
|||||||
SongList,
|
SongList,
|
||||||
FeaturedArtists,
|
FeaturedArtists,
|
||||||
},
|
},
|
||||||
|
setup() {},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -5,16 +5,21 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="scrollable">
|
<div id="scrollable">
|
||||||
<SongList />
|
<SongList />
|
||||||
<FolderList />
|
<FolderList :folders="folders" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { ref } from "@vue/reactivity";
|
||||||
|
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 SearchBox from "@/components/FolderView/SearchBox.vue";
|
import SearchBox from "@/components/FolderView/SearchBox.vue";
|
||||||
|
|
||||||
|
import getData from "../composables/getFiles.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
SongList,
|
SongList,
|
||||||
@ -22,8 +27,22 @@ export default {
|
|||||||
SearchBox,
|
SearchBox,
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const path = route.params.path;
|
||||||
|
|
||||||
|
console.log(path);
|
||||||
|
|
||||||
|
const songs = ref([]);
|
||||||
|
const folders = ref([]);
|
||||||
|
|
||||||
|
getData("/Music").then((data) => {
|
||||||
|
songs.value = data.songs.value;
|
||||||
|
folders.value = data.folders.value;
|
||||||
|
});
|
||||||
return {
|
return {
|
||||||
//
|
songs,
|
||||||
|
folders,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -43,7 +62,7 @@ export default {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
height: min-content;
|
height: min-content;
|
||||||
width: calc(100% - 2rem);
|
width: calc(100% - 2rem);
|
||||||
top: .5rem;
|
top: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#scrollable {
|
#scrollable {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user