mirror of
https://github.com/Dvorinka/swingmusic-extended.git
synced 2026-06-04 04:23:01 +00:00
Merge branch 'master' into try-folder-banner
~ Merge component spacing edits to the try-folder-banner branch
This commit is contained in:
@@ -37,7 +37,6 @@ class RipAlbumImage:
|
||||
|
||||
|
||||
class ValidateAlbumThumbs:
|
||||
|
||||
@staticmethod
|
||||
def remove_obsolete():
|
||||
"""
|
||||
@@ -54,6 +53,10 @@ class ValidateAlbumThumbs:
|
||||
|
||||
if e is None:
|
||||
os.remove(entry.path)
|
||||
break
|
||||
|
||||
if os.path.getsize(entry.path) == 0:
|
||||
os.remove(entry.path)
|
||||
|
||||
@staticmethod
|
||||
def find_lost_thumbnails():
|
||||
@@ -61,9 +64,7 @@ class ValidateAlbumThumbs:
|
||||
Re-rip lost album thumbnails
|
||||
"""
|
||||
entries = os.scandir(THUMBS_PATH)
|
||||
entries = [
|
||||
Thumbnail(entry.name) for entry in entries if entry.is_file()
|
||||
]
|
||||
entries = [Thumbnail(entry.name) for entry in entries if entry.is_file()]
|
||||
|
||||
albums = helpers.Get.get_all_albums()
|
||||
thumbs = [(album.hash + ".webp") for album in albums]
|
||||
|
||||
@@ -9,7 +9,7 @@ from mutagen.id3 import ID3
|
||||
from PIL import Image
|
||||
|
||||
|
||||
def return_album_art(filepath: str):
|
||||
def parse_album_art(filepath: str):
|
||||
"""
|
||||
Returns the album art for a given audio file.
|
||||
"""
|
||||
@@ -36,9 +36,12 @@ def extract_thumb(filepath: str, webp_path: str) -> bool:
|
||||
tsize = settings.THUMB_SIZE
|
||||
|
||||
if os.path.exists(img_path):
|
||||
return True
|
||||
img_size = os.path.getsize(filepath)
|
||||
|
||||
album_art = return_album_art(filepath)
|
||||
if img_size > 0:
|
||||
return True
|
||||
|
||||
album_art = parse_album_art(filepath)
|
||||
|
||||
if album_art is not None:
|
||||
img = Image.open(BytesIO(album_art))
|
||||
|
||||
@@ -96,11 +96,4 @@ onStartTyping(() => {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 0 $small;
|
||||
margin-top: $small;
|
||||
overflow: auto;
|
||||
padding-right: $small !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
|
||||
.grid {
|
||||
background-color: $primary;
|
||||
display: grid;
|
||||
height: 100%;
|
||||
padding-right: $small;
|
||||
|
||||
|
||||
+32
-24
@@ -1,5 +1,6 @@
|
||||
@import "../css/ProgressBar.scss";
|
||||
@import "mixins.scss";
|
||||
// @import "./moz.scss";
|
||||
|
||||
:root {
|
||||
--separator: #ffffff46;
|
||||
@@ -86,26 +87,47 @@ a {
|
||||
display: none;
|
||||
}
|
||||
|
||||
input[type="search"] {
|
||||
height: 2.25rem !important;
|
||||
}
|
||||
|
||||
.l-container {
|
||||
display: grid;
|
||||
grid-template-columns: min-content 1fr min-content;
|
||||
grid-template-rows: 3.5rem 1fr 1fr;
|
||||
grid-auto-flow: row;
|
||||
grid-template-rows: max-content 1fr max-content;
|
||||
grid-template-areas:
|
||||
"l-sidebar nav search-input"
|
||||
"l-sidebar content r-sidebar"
|
||||
"l-sidebar content r-sidebar"
|
||||
"l-sidebar content tabs";
|
||||
width: 100%;
|
||||
align-content: center;
|
||||
max-width: 2720px;
|
||||
height: 100vh;
|
||||
height: calc(100vh - 1rem);
|
||||
margin: 0 auto;
|
||||
gap: 1rem;
|
||||
margin: $small;
|
||||
}
|
||||
|
||||
#tabs {
|
||||
grid-area: tabs;
|
||||
height: 3.5rem;
|
||||
margin-top: -$small;
|
||||
}
|
||||
|
||||
#acontent {
|
||||
grid-area: content;
|
||||
max-width: 1955px;
|
||||
overflow: hidden auto;
|
||||
margin-top: -$small;
|
||||
|
||||
.nav {
|
||||
margin: $small;
|
||||
width: calc(100% - 1rem);
|
||||
}
|
||||
}
|
||||
|
||||
.tabs {
|
||||
grid-area: tabs;
|
||||
border-left: solid 1px $gray3;
|
||||
|
||||
@include tablet-landscape {
|
||||
display: none;
|
||||
@@ -124,7 +146,6 @@ a {
|
||||
width: 17rem;
|
||||
grid-area: l-sidebar;
|
||||
background-color: $black;
|
||||
margin: $small;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
@@ -153,24 +174,10 @@ a {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#acontent {
|
||||
grid-area: content;
|
||||
width: 100%;
|
||||
max-width: 1955px;
|
||||
padding: $small;
|
||||
padding-left: 0;
|
||||
overflow: auto;
|
||||
margin: 0 auto;
|
||||
|
||||
.nav {
|
||||
margin: $small;
|
||||
width: calc(100% - 1rem);
|
||||
}
|
||||
}
|
||||
|
||||
.r-sidebar {
|
||||
grid-area: r-sidebar;
|
||||
border-left: solid 1px $gray3;
|
||||
margin-top: -$small;
|
||||
width: 29rem;
|
||||
}
|
||||
|
||||
.image {
|
||||
@@ -203,13 +210,13 @@ a {
|
||||
/* width */
|
||||
|
||||
::-webkit-scrollbar {
|
||||
width: 0.5rem;
|
||||
width: 3px;
|
||||
}
|
||||
|
||||
/* Track */
|
||||
|
||||
::-webkit-scrollbar-track {
|
||||
background: rgba(51, 51, 51, 0.459);
|
||||
background: transparent;
|
||||
border-radius: 1rem;
|
||||
}
|
||||
|
||||
@@ -259,6 +266,7 @@ a {
|
||||
background-position: 0 38%;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes similarAlbums {
|
||||
0% {
|
||||
background-position: 0 38%;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
// Styles that only apply on our dear Firefox
|
||||
|
||||
@-moz-document url-prefix() {
|
||||
#acontent {
|
||||
padding-right: 1rem !important;
|
||||
}
|
||||
|
||||
#ap-page {
|
||||
width: 100% !important;
|
||||
padding-right: 1rem !important;
|
||||
}
|
||||
|
||||
.ap-page-bottom-container {
|
||||
width: calc(100% - 1rem) !important;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="1600"
|
||||
height="900"
|
||||
viewBox="0 0 1600 900"
|
||||
version="1.1"
|
||||
id="svg13"
|
||||
sodipodi:docname="noise-texture.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata17">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="714"
|
||||
id="namedview15"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.26222222"
|
||||
inkscape:cx="28.104465"
|
||||
inkscape:cy="117.7106"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="28"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg13" />
|
||||
<defs
|
||||
id="defs9">
|
||||
<radialGradient
|
||||
id="a"
|
||||
gradientTransform="matrix(1 1 -1 1 0.5 -0.5)">
|
||||
<stop
|
||||
stop-color="#455A64"
|
||||
stop-opacity="0"
|
||||
offset="0.25"
|
||||
id="stop2"
|
||||
style="stop-color:#222222;stop-opacity:0" />
|
||||
<stop
|
||||
stop-color="#455A64"
|
||||
stop-opacity="0.5"
|
||||
offset="0.75"
|
||||
id="stop4"
|
||||
style="stop-color:#222222;stop-opacity:0.50196081" />
|
||||
<stop
|
||||
stop-color="#455A64"
|
||||
stop-opacity="1"
|
||||
offset="1"
|
||||
id="stop6"
|
||||
style="stop-color:#222222;stop-opacity:1" />
|
||||
</radialGradient>
|
||||
</defs>
|
||||
<rect
|
||||
width="1600"
|
||||
height="900"
|
||||
fill="url(#a)"
|
||||
id="rect11" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
@@ -15,6 +15,7 @@
|
||||
v-motion-slide-from-left
|
||||
class="rounded shadow-lg"
|
||||
/>
|
||||
<img class="filter rounded" src="../../assets/images/noise-texture.svg" alt="" />
|
||||
</div>
|
||||
<div class="info" :class="{ nocontrast: isLight() }">
|
||||
<div class="top" v-motion-slide-from-top>
|
||||
@@ -187,6 +188,7 @@ function theyContrast(color1: string, color2: string) {
|
||||
.art {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
position: relative;
|
||||
|
||||
img {
|
||||
height: 16rem;
|
||||
@@ -194,6 +196,11 @@ function theyContrast(color1: string, color2: string) {
|
||||
object-fit: cover;
|
||||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.filter {
|
||||
position: absolute;
|
||||
// display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.nocontrast {
|
||||
|
||||
@@ -31,7 +31,7 @@ defineProps<{
|
||||
grid-template-columns: max-content 1fr;
|
||||
padding-right: 1rem;
|
||||
align-items: center;
|
||||
background-color: $gray4;
|
||||
background-color: $gray3;
|
||||
transition: all 0.2s ease;
|
||||
border-radius: 0.75rem;
|
||||
|
||||
|
||||
@@ -1,37 +1,31 @@
|
||||
<template>
|
||||
<div class="f-container rounded" :class="{ no_f: !props.folders.length }">
|
||||
<div id="f-items" v-if="props.folders.length">
|
||||
<div class="f-container rounded">
|
||||
<div id="f-items" class="rounded">
|
||||
<FolderItem
|
||||
v-for="folder in props.folders"
|
||||
:key="folder"
|
||||
v-for="folder in folders"
|
||||
:key="JSON.stringify(folder)"
|
||||
:folder="folder"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
<script setup lang="ts">
|
||||
import { Folder } from "@/interfaces";
|
||||
import FolderItem from "./FolderItem.vue";
|
||||
|
||||
const props = defineProps({
|
||||
folders: {
|
||||
type: Array,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
defineProps<{
|
||||
folders: Folder[];
|
||||
}>();
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
.no_f {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#f-items {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
|
||||
gap: $medium;
|
||||
border-bottom: 1px solid $gray3;
|
||||
padding-bottom: .55rem;
|
||||
padding: $small;
|
||||
margin-bottom: 1rem;
|
||||
background-color: $gray5;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -130,9 +130,10 @@ function getTracks() {
|
||||
}
|
||||
|
||||
.table {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow-y: hidden;
|
||||
background-color: $gray5;
|
||||
padding: $small 0;
|
||||
|
||||
.current {
|
||||
a {
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
<style lang="scss">
|
||||
.r-home {
|
||||
height: calc(100% - 1rem);
|
||||
padding: 0 $small $small 0;
|
||||
margin-top: $small;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -27,9 +27,7 @@ const tabs = useTabStore();
|
||||
|
||||
<style lang="scss">
|
||||
.r-sidebar {
|
||||
width: 29em;
|
||||
background-color: rgba(4, 12, 34, 0.103);
|
||||
padding: 0 $small;
|
||||
|
||||
|
||||
@include phone-only {
|
||||
display: none;
|
||||
@@ -64,18 +62,6 @@ const tabs = useTabStore();
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.tab-keys {
|
||||
display: none;
|
||||
width: 3rem;
|
||||
right: 0;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
grid-area: tabs;
|
||||
border-radius: 0;
|
||||
overflow: hidden;
|
||||
border-left: solid 1px $gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -36,7 +36,6 @@ function loadMore() {
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
|
||||
flex-wrap: wrap;
|
||||
gap: 0.75rem;
|
||||
|
||||
@@ -35,7 +35,6 @@ function loadMore() {
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
@@ -36,7 +36,6 @@ function loadMore() {
|
||||
}
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
|
||||
flex-wrap: wrap;
|
||||
gap: 0.75rem;
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
class="rounded"
|
||||
v-model="search.query"
|
||||
placeholder="Search your library"
|
||||
type="text"
|
||||
type="search"
|
||||
@focus="focusThis()"
|
||||
@blur="unfocusThis()"
|
||||
/>
|
||||
@@ -32,8 +32,9 @@ function unfocusThis() {
|
||||
|
||||
<style lang="scss">
|
||||
#gsearch-input {
|
||||
padding: $small;
|
||||
display: flex;
|
||||
height: max-content;
|
||||
// margin-bottom: $smaller;
|
||||
|
||||
@include tablet-landscape {
|
||||
display: none;
|
||||
@@ -44,12 +45,12 @@ function unfocusThis() {
|
||||
border-radius: 0.4rem;
|
||||
position: relative;
|
||||
display: flex;
|
||||
gap: $small;
|
||||
background-color: $red;
|
||||
background-color: $gray4;
|
||||
height: 2.25rem;
|
||||
|
||||
.icon {
|
||||
width: 2rem;
|
||||
width: 2.25rem;
|
||||
aspect-ratio: 1;
|
||||
background-image: url("../../assets/icons/search.svg");
|
||||
background-size: 1.5rem;
|
||||
margin-left: $smaller;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="tabs">
|
||||
<div class="tabs" id="tabs">
|
||||
<div class="cont rounded">
|
||||
<div
|
||||
v-for="tab in tabs.tabs"
|
||||
@@ -22,8 +22,8 @@ const tabs = useTabStore();
|
||||
|
||||
<style lang="scss">
|
||||
.tabs {
|
||||
padding: $small;
|
||||
height: 4.25rem;
|
||||
grid-area: tabs;
|
||||
height: 100%;
|
||||
|
||||
.cont {
|
||||
background-color: $black;
|
||||
@@ -58,7 +58,6 @@ const tabs = useTabStore();
|
||||
.t-item {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.search {
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
<Loader />
|
||||
</div>
|
||||
<div class="right">
|
||||
<div class="more image"></div>
|
||||
<Search />
|
||||
</div>
|
||||
</div>
|
||||
@@ -78,16 +77,12 @@ watch(
|
||||
);
|
||||
</script>
|
||||
|
||||
<!-- !!use nav store to sync the title component!! -->
|
||||
|
||||
<style lang="scss">
|
||||
.topnav {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr min-content max-content;
|
||||
padding-bottom: 1rem;
|
||||
margin: $small $small 0 0;
|
||||
border-bottom: 1px solid $gray3;
|
||||
height: 3rem;
|
||||
// border-bottom: 1px solid $gray3;
|
||||
// padding-bottom: $small;
|
||||
|
||||
.left {
|
||||
display: grid;
|
||||
@@ -115,16 +110,6 @@ watch(
|
||||
width: 100%;
|
||||
display: flex;
|
||||
gap: $small;
|
||||
|
||||
.more {
|
||||
width: 2.25rem;
|
||||
aspect-ratio: 1;
|
||||
height: 100%;
|
||||
background-color: $gray5;
|
||||
background-image: url("../../assets/icons/more.svg");
|
||||
transform: rotate(90deg);
|
||||
border-radius: $small;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -14,9 +14,13 @@
|
||||
|
||||
<style lang="scss">
|
||||
#nav-search {
|
||||
// border: solid 1px $gray2;
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
gap: $small;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
input[type="search"] {
|
||||
background-color: $gray5;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div
|
||||
class="songlist-item rounded"
|
||||
class="songlist-item"
|
||||
:class="[
|
||||
{ current: isCurrent },
|
||||
{ contexton: context_on },
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="ap-container noscroll">
|
||||
<div class="ap-container noscroll rounded">
|
||||
<div id="ap-page">
|
||||
<header class="ap-page-header" ref="apheader">
|
||||
<slot name="header"></slot>
|
||||
@@ -101,13 +101,28 @@ function toggleBottom() {
|
||||
.ap-container {
|
||||
height: 100%;
|
||||
position: relative;
|
||||
margin-right: -$small;
|
||||
width: calc(100% + 1rem);
|
||||
|
||||
#ap-page {
|
||||
overflow: auto;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
display: grid;
|
||||
grid-template-rows: 18rem 1fr;
|
||||
gap: 1rem;
|
||||
padding-right: $small;
|
||||
width: calc(100% - $small);
|
||||
|
||||
.ap-page-content {
|
||||
padding-bottom: 16rem;
|
||||
}
|
||||
}
|
||||
|
||||
.ap-page-bottom-container {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
height: 15rem;
|
||||
width: calc(100% - $small);
|
||||
width: calc(100% - 1.25rem);
|
||||
background-color: $gray;
|
||||
transition: all 0.5s ease !important;
|
||||
overscroll-behavior: contain;
|
||||
@@ -164,21 +179,7 @@ function toggleBottom() {
|
||||
}
|
||||
|
||||
.addbottompadding {
|
||||
padding-bottom: 17rem;
|
||||
}
|
||||
}
|
||||
|
||||
#ap-page {
|
||||
padding-right: $small;
|
||||
height: 100%;
|
||||
position: relative;
|
||||
overflow: auto;
|
||||
display: grid;
|
||||
grid-template-rows: $banner-height 1fr;
|
||||
gap: 1rem;
|
||||
|
||||
.ap-page-content {
|
||||
padding-bottom: calc($banner-height - 1rem);
|
||||
padding-bottom: 16rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -63,7 +63,6 @@ onBeforeRouteUpdate((to, from) => {
|
||||
|
||||
#scrollable {
|
||||
overflow-y: auto;
|
||||
height: calc(100% - $small);
|
||||
scrollbar-color: grey transparent;
|
||||
|
||||
.banner {
|
||||
|
||||
@@ -25,7 +25,6 @@ const pStore = usePStore();
|
||||
scrollbar-color: $gray2 transparent;
|
||||
|
||||
.grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user