Fix linting issues

1930-first-upload-in-a-batch-always-fails
wvffle 2022-11-27 12:15:43 +00:00 zatwierdzone przez Kasper Seweryn
rodzic 14c784e06d
commit fea7493725
48 zmienionych plików z 101161 dodań i 101227 usunięć

13
.vscode/settings.json vendored
Wyświetl plik

@ -2,20 +2,13 @@
"python.defaultInterpreterPath": "/workspace/funkwhale/api/.venv/bin/python", "python.defaultInterpreterPath": "/workspace/funkwhale/api/.venv/bin/python",
"python.testing.cwd": "/workspace/funkwhale/api", "python.testing.cwd": "/workspace/funkwhale/api",
"python.envFile": "/workspace/funkwhale/.gitpod/.env", "python.envFile": "/workspace/funkwhale/.gitpod/.env",
"python.testing.pytestArgs": [ "python.testing.pytestArgs": ["--cov=funkwhale_api", "tests/"],
"--cov=funkwhale_api",
"tests/"
],
"python.testing.unittestEnabled": false, "python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true, "python.testing.pytestEnabled": true,
"vitest.enable": true, "vitest.enable": true,
"vitest.commandLine": "yarn vitest", "vitest.commandLine": "yarn vitest",
"i18n-ally.localesPaths": [ "i18n-ally.localesPaths": ["front/src/locales"],
"front/src/locales"
],
"i18n-ally.pathMatcher": "*.json", "i18n-ally.pathMatcher": "*.json",
"i18n-ally.enabledFrameworks": [ "i18n-ally.enabledFrameworks": ["vue"],
"vue"
],
"i18n-ally.keystyle": "nested" "i18n-ally.keystyle": "nested"
} }

Wyświetl plik

@ -1,3 +1,11 @@
<i18n>
{
"en": {
"00:00": "00:00"
}
}
</i18n>
<script setup lang="ts"> <script setup lang="ts">
import type { QueueItemSource } from '~/types' import type { QueueItemSource } from '~/types'
@ -56,7 +64,7 @@ const store = useStore()
const labels = computed(() => ({ const labels = computed(() => ({
queue: t('components.Queue.label.queue'), queue: t('components.Queue.label.queue'),
populating: t('components.Queue.queue.label.populatingRadio'), populating: t('components.Queue.label.populatingRadio'),
duration: t('components.Queue.label.duration'), duration: t('components.Queue.label.duration'),
addArtistContentFilter: t('components.Queue.label.addArtistContentFilter'), addArtistContentFilter: t('components.Queue.label.addArtistContentFilter'),
restart: t('components.Queue.label.restart'), restart: t('components.Queue.label.restart'),
@ -129,8 +137,7 @@ const queueItems = computed(() => queue.value.map((track, index) => ({
remove: t('components.Queue.label.remove'), remove: t('components.Queue.label.remove'),
selectTrack: t('components.Queue.label.selectTrack'), selectTrack: t('components.Queue.label.selectTrack'),
favorite: t('components.Queue.label.favorite') favorite: t('components.Queue.label.favorite')
}, }
duration: time.durationFormatted(track.uploads[0]?.duration ?? 0) ?? ''
}) as QueueItemSource)) }) as QueueItemSource))
const reorderTracks = async (from: number, to: number) => { const reorderTracks = async (from: number, to: number) => {
@ -261,7 +268,11 @@ const coverType = useStorage('queue:cover-type', CoverType.COVER_ART)
@click="loadRandomPreset()" @click="loadRandomPreset()"
> >
<h1>{{ currentTrack.title }}</h1> <h1>{{ currentTrack.title }}</h1>
<h2>{{ currentTrack.artistName }} &mdash; {{ currentTrack.albumTitle }}</h2> <h2>
{{ currentTrack.artistName }}
<span class="symbol hyphen middle" />
{{ currentTrack.albumTitle }}
</h2>
</div> </div>
</Transition> </Transition>
</div> </div>
@ -313,14 +324,10 @@ const coverType = useStorage('queue:cover-type', CoverType.COVER_ART)
class="ui small warning message" class="ui small warning message"
> >
<h3 class="header"> <h3 class="header">
<translate translate-context="Sidebar/Player/No sources"> {{ $t('components.Queue.header.noSources') }}
The track has no available sources
</translate>
</h3> </h3>
<p v-if="hasNext && isPlaying"> <p v-if="hasNext && isPlaying">
<translate translate-context="Sidebar/Player/Error message.Paragraph"> {{ $t('components.Queue.message.automaticPlay') }}
The next track will play automatically in a few seconds
</translate>
<i class="loading spinner icon" /> <i class="loading spinner icon" />
</p> </p>
</div> </div>
@ -388,8 +395,8 @@ const coverType = useStorage('queue:cover-type', CoverType.COVER_ART)
<span class="right floated timer total">{{ time.parse(Math.round(duration)) }}</span> <span class="right floated timer total">{{ time.parse(Math.round(duration)) }}</span>
</template> </template>
<template v-else> <template v-else>
<span class="left floated timer">{{ durationFormatted(0) }}</span> <span class="left floated timer">{{ $t('components.Queue.meta.startTime') }}</span>
<span class="right floated timer">{{ durationFormatted(0) }}</span> <span class="right floated timer">{{ $t('components.Queue.meta.startTime') }}</span>
</template> </template>
</div> </div>
</div> </div>
@ -470,7 +477,7 @@ const coverType = useStorage('queue:cover-type', CoverType.COVER_ART)
class="ui basic primary button" class="ui basic primary button"
@click="$store.dispatch('radios/stop')" @click="$store.dispatch('radios/stop')"
> >
{{ $t('components.Queue.stopRadio') }} {{ $t('components.Queue.button.stopRadio') }}
</button> </button>
</div> </div>
</div> </div>

Wyświetl plik

@ -104,7 +104,7 @@ const moderationNotifications = computed(() =>
const showLanguageModal = ref(false) const showLanguageModal = ref(false)
const locale = ref(i18nLocale.value) const locale = ref(i18nLocale.value)
watch(locale, (locale) => { watch(locale, (locale) => {
// setI18nLanguage(locale) setI18nLanguage(locale)
}) })
const isProduction = import.meta.env.PROD const isProduction = import.meta.env.PROD

Wyświetl plik

@ -44,7 +44,7 @@ const toggle = () => {
<span v-else-if="isPending"> <span v-else-if="isPending">
{{ $t('components.audio.LibraryFollowButton.button.cancel') }} {{ $t('components.audio.LibraryFollowButton.button.cancel') }}
</span> </span>
<spanv-else> <span v-else>
{{ $t('components.audio.LibraryFollowButton.button.follow') }} {{ $t('components.audio.LibraryFollowButton.button.follow') }}
</span> </span>
</button> </button>

Wyświetl plik

@ -103,10 +103,10 @@ initializeFirstTrack()
const loopingTitle = computed(() => { const loopingTitle = computed(() => {
const mode = looping.value const mode = looping.value
return mode === LoopingMode.None return mode === LoopingMode.None
? t('components.audio.Player.label.loopingDisabledLabel') ? t('components.audio.Player.label.loopingDisabled')
: mode === LoopingMode.LoopTrack : mode === LoopingMode.LoopTrack
? t('components.audio.Player.label.loopingSingleLabel') ? t('components.audio.Player.label.loopingSingle')
: t('components.audio.Player.label.loopingWholeQueueLabel') : t('components.audio.Player.label.loopingWholeQueue')
}) })
const hideArtist = () => { const hideArtist = () => {
@ -276,8 +276,14 @@ const hideArtist = () => {
v-if="looping !== LoopingMode.None" v-if="looping !== LoopingMode.None"
class="ui circular tiny vibrant label" class="ui circular tiny vibrant label"
> >
<template v-if="looping === LoopingMode.LoopTrack">1</template> <span
<span v-else-if="looping === LoopingMode.LoopQueue" class="infinity symbol" /> v-if="looping === LoopingMode.LoopTrack"
class="symbol single"
/>
<span
v-else-if="looping === LoopingMode.LoopQueue"
class="infinity symbol"
/>
</span> </span>
</i> </i>
</button> </button>

Wyświetl plik

@ -1,5 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { useGettext } from 'vue3-gettext' import { useI18n } from 'vue-i18n'
import { computed } from 'vue' import { computed } from 'vue'
import { usePlayer } from '~/composables/audio/player' import { usePlayer } from '~/composables/audio/player'
@ -8,12 +8,12 @@ import { useQueue } from '~/composables/audio/queue'
const { hasPrevious, playPrevious, hasNext, playNext, currentTrack } = useQueue() const { hasPrevious, playPrevious, hasNext, playNext, currentTrack } = useQueue()
const { isPlaying } = usePlayer() const { isPlaying } = usePlayer()
const { $pgettext } = useGettext() const { t } = useI18n()
const labels = computed(() => ({ const labels = computed(() => ({
previous: $pgettext('Sidebar/Player/Icon.Tooltip', 'Previous track'), previous: t('components.audio.PlayerControls.labels.previous'),
play: $pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Play'), play: t('components.audio.PlayerControls.labels.play'),
pause: $pgettext('Sidebar/Player/Icon.Tooltip/Verb', 'Pause'), pause: t('components.audio.PlayerControls.labels.pause'),
next: $pgettext('Sidebar/Player/Icon.Tooltip', 'Next track') next: t('components.audio.PlayerControls.labels.next')
})) }))
</script> </script>

Wyświetl plik

@ -116,7 +116,7 @@ const actionsButtonLabel = computed(() => t('components.audio.podcast.MobileRow.
class="really discrete" class="really discrete"
:date="track.creation_date" :date="track.creation_date"
/> />
<span class="nospace middledot symbol" /> <span class="middledot symbol" />
<human-duration <human-duration
v-if="track.uploads[0] && track.uploads[0].duration" v-if="track.uploads[0] && track.uploads[0].duration"
:duration="track.uploads[0].duration" :duration="track.uploads[0].duration"
@ -127,7 +127,7 @@ const actionsButtonLabel = computed(() => t('components.audio.podcast.MobileRow.
class="track-meta mobile" class="track-meta mobile"
> >
{{ track.artist?.name }} {{ track.artist?.name }}
<span class="nospace middledot symbol" /> <span class="middledot symbol" />
<human-duration <human-duration
v-if="track.uploads[0] && track.uploads[0].duration" v-if="track.uploads[0] && track.uploads[0].duration"
:duration="track.uploads[0].duration" :duration="track.uploads[0].duration"

Wyświetl plik

@ -58,7 +58,7 @@ const created = (application: Application) => {
{{ $t('components.auth.ApplicationNew.link.settings') }} {{ $t('components.auth.ApplicationNew.link.settings') }}
</router-link> </router-link>
<h2 class="ui header"> <h2 class="ui header">
{{ title }} {{ labels.title }}
</h2> </h2>
<application-form <application-form
:defaults="defaults" :defaults="defaults"

Wyświetl plik

@ -725,7 +725,7 @@ fetchOwnedApps()
{{ $t('components.auth.Settings.description.changeEmail') }} {{ $t('components.auth.Settings.description.changeEmail') }}
</p> </p>
<p> <p>
{{ $t('components.auth.Settings.message.currentEmail', { email: email }) }} {{ $t('components.auth.Settings.message.currentEmail', { email: $store.state.auth.profile?.email }) }}
</p> </p>
<form <form
class="ui form" class="ui form"

Wyświetl plik

@ -2,10 +2,13 @@
import SemanticModal from '~/components/semantic/Modal.vue' import SemanticModal from '~/components/semantic/Modal.vue'
import useThemeList from '~/composables/useThemeList' import useThemeList from '~/composables/useThemeList'
import useTheme from '~/composables/useTheme' import useTheme from '~/composables/useTheme'
import { useVModel } from '@vueuse/core' import { useVModel } from '@vueuse/core'
import { computed } from 'vue' import { computed } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { SUPPORTED_LOCALES } from '~/init/locale'
interface Events { interface Events {
(e: 'update:show', value: boolean): void (e: 'update:show', value: boolean): void
(e: 'showLanguageModalEvent'): void (e: 'showLanguageModalEvent'): void
@ -94,7 +97,7 @@ const labels = computed(() => ({
<span class="left colon symbol" /> <span class="left colon symbol" />
</span> </span>
<div class="right floated"> <div class="right floated">
<span class="user-modal list-item">{{ $language.available[$language.current] }}</span> <span class="user-modal list-item">{{ SUPPORTED_LOCALES[$i18n.locale] }}</span>
<i class="action-hint chevron right icon" /> <i class="action-hint chevron right icon" />
</div> </div>
</div> </div>

Wyświetl plik

@ -306,7 +306,7 @@ useEventListener(window, 'beforeunload', (event) => {
class="ui warning label" class="ui warning label"
> >
{{ uploadedFilesCount + erroredFilesCount }} {{ uploadedFilesCount + erroredFilesCount }}
<span class="nospace slash symbol" /> <span class="slash symbol" />
{{ files.length }} {{ files.length }}
</div> </div>
<div <div
@ -314,7 +314,7 @@ useEventListener(window, 'beforeunload', (event) => {
:class="['ui', {'success': erroredFilesCount === 0}, {'danger': erroredFilesCount > 0}, 'label']" :class="['ui', {'success': erroredFilesCount === 0}, {'danger': erroredFilesCount > 0}, 'label']"
> >
{{ uploadedFilesCount + erroredFilesCount }} {{ uploadedFilesCount + erroredFilesCount }}
<span class="nospace slash symbol" /> <span class="slash symbol" />
{{ files.length }} {{ files.length }}
</div> </div>
</a> </a>
@ -335,7 +335,7 @@ useEventListener(window, 'beforeunload', (event) => {
class="ui warning label" class="ui warning label"
> >
{{ processedFilesCount }} {{ processedFilesCount }}
<span class="nospace slash symbol" /> <span class="slash symbol" />
{{ processableFiles }} {{ processableFiles }}
</div> </div>
<div <div
@ -343,7 +343,7 @@ useEventListener(window, 'beforeunload', (event) => {
:class="['ui', {'success': uploads.errored === 0}, {'danger': uploads.errored > 0}, 'label']" :class="['ui', {'success': uploads.errored === 0}, {'danger': uploads.errored > 0}, 'label']"
> >
{{ processedFilesCount }} {{ processedFilesCount }}
<span class="nospace slash symbol" /> <span class="slash symbol" />
{{ processableFiles }} {{ processableFiles }}
</div> </div>
</a> </a>

Wyświetl plik

@ -102,7 +102,7 @@ onMounted(() => $('.ui.dropdown').dropdown())
const { t } = useI18n() const { t } = useI18n()
const labels = computed(() => ({ const labels = computed(() => ({
searchPlaceholder: t('components.library.Radios.placeholder.search'), searchPlaceholder: t('components.library.Radios.placeholder.search'),
title: t('components.library.Podcasts.title') title: t('components.library.Radios.title')
})) }))
const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value].sort((a, b) => a - b))) const paginateOptions = computed(() => sortedUniq([12, 25, 50, paginateBy.value].sort((a, b) => a - b)))

Wyświetl plik

@ -165,7 +165,7 @@ const getCurrentState = (target?: StateTarget): ReviewState => {
<div class="ui inline form"> <div class="ui inline form">
<div class="fields"> <div class="fields">
<div class="ui field"> <div class="ui field">
<label for="search-edits">{{ $t('components.manage.library.EditsCardList.placeholder.search') }}</label> <label for="search-edits">{{ $t('components.manage.library.EditsCardList.label.search') }}</label>
<form @submit.prevent="query = search.value"> <form @submit.prevent="query = search.value">
<input <input
id="search-edits" id="search-edits"

Wyświetl plik

@ -97,7 +97,7 @@ const labels = computed(() => ({
href="#" href="#"
class="item disabled" class="item disabled"
> >
<span class="nospace ellipses symbol" /> <span class="ellipses symbol" />
</a> </a>
<a <a
v-else v-else

Wyświetl plik

@ -1,19 +1,18 @@
import type { Track, Upload } from '~/types' import type { Track, Upload } from '~/types'
import { createGlobalState, useNow, useStorage, useTimeAgo, whenever } from '@vueuse/core' import { createGlobalState, useNow, useStorage, useTimeAgo, whenever } from '@vueuse/core'
import { shuffle as shuffleArray, sum } from 'lodash-es'
import { computed, ref, shallowReactive, watchEffect } from 'vue' import { computed, ref, shallowReactive, watchEffect } from 'vue'
import { shuffle as shuffleArray, sum } from 'lodash-es'
import { useClamp } from '@vueuse/math' import { useClamp } from '@vueuse/math'
import { useI18n } from 'vue-i18n'
import { delMany, getMany, setMany } from '~/composables/data/indexedDB'
import { looping, LoopingMode, isPlaying } from '~/composables/audio/player'
import { useStore } from '~/store' import { useStore } from '~/store'
import { looping, LoopingMode, isPlaying } from '~/composables/audio/player'
import { delMany, getMany, setMany } from '~/composables/data/indexedDB'
import { setGain } from '~/composables/audio/audio-api'
import { useTracks } from '~/composables/audio/tracks' import { useTracks } from '~/composables/audio/tracks'
import { gettext } from '~/init/locale'
import axios from 'axios' import axios from 'axios'
import { setGain } from './audio-api'
export interface QueueTrackSource { export interface QueueTrackSource {
uuid: string uuid: string
@ -102,7 +101,7 @@ export const useQueue = createGlobalState(() => {
const { currentSound } = useTracks() const { currentSound } = useTracks()
const createQueueTrack = async (track: Track): Promise<QueueTrack> => { const createQueueTrack = async (track: Track): Promise<QueueTrack> => {
const { $pgettext } = gettext const { t } = useI18n()
const { default: store } = await import('~/store') const { default: store } = await import('~/store')
if (track.uploads.length === 0) { if (track.uploads.length === 0) {
@ -116,8 +115,8 @@ export const useQueue = createGlobalState(() => {
return { return {
id: track.id, id: track.id,
title: track.title, title: track.title,
artistName: track.artist?.name ?? $pgettext('*/*/*', 'Unknown artist'), artistName: track.artist?.name ?? t('composables.audio.queue.unknownArtist'),
albumTitle: track.album?.title ?? $pgettext('*/*/*', 'Unknown album'), albumTitle: track.album?.title ?? t('composables.audio.queue.unknownAlbum'),
position: track.position, position: track.position,
artistId: track.artist?.id ?? -1, artistId: track.artist?.id ?? -1,
albumId: track.album?.id ?? -1, albumId: track.album?.id ?? -1,

Wyświetl plik

@ -42,7 +42,7 @@
"title": "About", "title": "About",
"notApplicable": "N/A", "notApplicable": "N/A",
"header": { "header": {
"about":"About this pod", "about": "About this pod",
"rules": "Rules", "rules": "Rules",
"terms": "Terms and privacy policy", "terms": "Terms and privacy policy",
"features": "Features", "features": "Features",
@ -92,7 +92,7 @@
"title": "Home", "title": "Home",
"header": { "header": {
"welcome": "Welcome to {podName}!", "welcome": "Welcome to {podName}!",
"about":"About this Funkwhale pod", "about": "About this Funkwhale pod",
"statistics": "Statistics", "statistics": "Statistics",
"contact": "Contact", "contact": "Contact",
"aboutFunkwhale": "About Funkwhale", "aboutFunkwhale": "About Funkwhale",
@ -155,6 +155,7 @@
"Queue": { "Queue": {
"label": { "label": {
"queue": "Queue", "queue": "Queue",
"populatingRadio": "Fetching radio track...",
"duration": "Duration", "duration": "Duration",
"addArtistContentFilter": "Hide content from this artist…", "addArtistContentFilter": "Hide content from this artist…",
"restart": "Restart track", "restart": "Restart track",
@ -164,11 +165,16 @@
"play": "Play", "play": "Play",
"remove": "Remove", "remove": "Remove",
"selectTrack": "Select track", "selectTrack": "Select track",
"favorite": "Favorite track" "favorite": "Favorite track",
"enterFullscreen": "Enter fullscreen mode",
"exitFullscreen": "Exit fullscreen mode",
"showCoverArt": "Show Cover Art",
"showVisualizer": "Show MoonDrop visualizer"
}, },
"header": { "header": {
"failure": "The track cannot be loaded", "failure": "The track cannot be loaded",
"radio": "You have a radio playing" "radio": "You have a radio playing",
"noSources": "The track has no available sources."
}, },
"message": { "message": {
"automaticPlay": "The next track will play automatically in a few seconds…", "automaticPlay": "The next track will play automatically in a few seconds…",
@ -183,7 +189,8 @@
"stopRadio": "Stop radio" "stopRadio": "Stop radio"
}, },
"meta": { "meta": {
"queuePosition":"Track {index} of {length}" "queuePosition": "Track {index} of {length}",
"startTime": "00:00"
} }
}, },
"RemoteSearchForm": { "RemoteSearchForm": {
@ -263,7 +270,7 @@
"seekBack30": "Seek backwards 30s", "seekBack30": "Seek backwards 30s",
"seekForward30": "Seek forwards 30s", "seekForward30": "Seek forwards 30s",
"playPrevious": "Play previous track", "playPrevious": "Play previous track",
"playNext":"Play next track", "playNext": "Play next track",
"increaseVolume": "Increase volume", "increaseVolume": "Increase volume",
"decreaseVolume": "Decrease volume", "decreaseVolume": "Decrease volume",
"toggleMute": "Toggle mute", "toggleMute": "Toggle mute",
@ -581,7 +588,7 @@
}, },
"Widget": { "Widget": {
"button": { "button": {
"more":"Show more" "more": "Show more"
} }
} }
}, },
@ -649,6 +656,14 @@
"noResults": "Nothing found" "noResults": "Nothing found"
} }
} }
},
"PlayerControls": {
"labels": {
"previous": "Previous track",
"next": "Next track",
"pause": "Pause",
"play": "Play"
}
} }
}, },
"auth": { "auth": {
@ -659,7 +674,11 @@
}, },
"header": { "header": {
"appDetails": "Application Details", "appDetails": "Application Details",
"editApp": "Edit application" "editApp": "Edit application",
"appSecretWarning": "Keep a copy of this token in a safe place."
},
"message": {
"appSecretWarning": "You won't be able to see it again once you leave this screen."
}, },
"help": { "help": {
"appDetails": "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else." "appDetails": "Application ID and secret are really sensitive values and must be treated like passwords. Do not share those with anyone else."
@ -722,7 +741,7 @@
"unknownPermissions": "The application is also requesting the following unknown permissions:" "unknownPermissions": "The application is also requesting the following unknown permissions:"
}, },
"button": { "button": {
"authorize":"Authorize {app}" "authorize": "Authorize {app}"
}, },
"help": { "help": {
"copyCode": "You will be shown a code to copy-past in the application", "copyCode": "You will be shown a code to copy-past in the application",
@ -1285,12 +1304,10 @@
"shortcuts": "Keyboard shortcuts" "shortcuts": "Keyboard shortcuts"
}, },
"link": { "link": {
"options": "Options",
"profile": "Profile", "profile": "Profile",
"settings": "Settings", "settings": "Settings",
"logout": "Log out", "logout": "Log out",
"about": "About", "about": "About",
"shortcuts": "Keyboard shortcuts",
"support": "Help", "support": "Help",
"forum": "Forum", "forum": "Forum",
"docs": "Documentation", "docs": "Documentation",
@ -1546,7 +1563,7 @@
"suggest": "Suggest an edit on this artist" "suggest": "Suggest an edit on this artist"
}, },
"message": { "message": {
"remote":"This object is managed by another server, you cannot edit it." "remote": "This object is managed by another server, you cannot edit it."
} }
}, },
"Artists": { "Artists": {
@ -1575,7 +1592,7 @@
} }
}, },
"pagination": { "pagination": {
"results":"Results per page" "results": "Results per page"
}, },
"empty": { "empty": {
"noResults": "No results matching your query" "noResults": "No results matching your query"
@ -1779,8 +1796,7 @@
}, },
"label": { "label": {
"search": "Podcast title", "search": "Podcast title",
"tags": "Tags", "tags": "Tags"
"excludeCompilation": "Exclude Compilation Artists"
}, },
"button": { "button": {
"search": "Search", "search": "Search",
@ -1819,12 +1835,9 @@
"instance": "Instance radios", "instance": "Instance radios",
"user": "User radios" "user": "User radios"
}, },
"link": { "link": {},
},
"label": { "label": {
"search": "Search", "search": "Search"
"tags": "Tags"
}, },
"button": { "button": {
"search": "Search", "search": "Search",
@ -1874,10 +1887,9 @@
"delete": "Delete" "delete": "Delete"
}, },
"link": { "link": {
"domain":"View on {domain}", "domain": "View on {domain}",
"wikipedia":"Search on Wikipedia", "wikipedia": "Search on Wikipedia",
"discogs":"Search on Discogs", "discogs": "Search on Discogs",
"musicbrainz":"View on MusicBrainz",
"moderation": "Open in moderation interface", "moderation": "Open in moderation interface",
"django": "View in Django's admin" "django": "View in Django's admin"
}, },
@ -1936,7 +1948,7 @@
"suggest": "Suggest an edit on this track" "suggest": "Suggest an edit on this track"
}, },
"message": { "message": {
"remote":" This object is managed by another server, you cannot edit it." "remote": " This object is managed by another server, you cannot edit it."
} }
}, },
"radios": { "radios": {
@ -1982,7 +1994,7 @@
}, },
"Filter": { "Filter": {
"excludeLabel": "Exclude", "excludeLabel": "Exclude",
"matchingTracks":"{count} track matching combined filters | {count} tracks matching filter", "matchingTracks": "{count} track matching combined filters | {count} tracks matching filter",
"matchingTracksModalHeader": "Tracks matching filter", "matchingTracksModalHeader": "Tracks matching filter",
"cancelButton": "Cancel", "cancelButton": "Cancel",
"removeButton": "Remove" "removeButton": "Remove"
@ -2207,9 +2219,7 @@
"descending": "Descending" "descending": "Descending"
} }
}, },
"link": { "link": {},
"local": "Local"
},
"table": { "table": {
"tag": { "tag": {
"header": { "header": {
@ -2580,7 +2590,7 @@
"refused": "Refused", "refused": "Refused",
"approved": "Approved", "approved": "Approved",
"assignedTo": "Assigned to", "assignedTo": "Assigned to",
"resolutionDate":"Resolution date", "resolutionDate": "Resolution date",
"internalNotes": "Internal notes" "internalNotes": "Internal notes"
} }
}, },
@ -2650,8 +2660,9 @@
"header": { "header": {
"owner": "Owner", "owner": "Owner",
"status": "Status", "status": "Status",
"creationDate":"Creation date", "creationDate": "Creation date",
"expirationDate": "Expiration date", "expirationDate": "Expiration date",
"user": "User",
"code": "Code" "code": "Code"
} }
} }
@ -2791,7 +2802,7 @@
"playlists": { "playlists": {
"Card": { "Card": {
"meta": { "meta": {
"tracks":"No tracks | {tracks_count} track | {tracks_count} tracks" "tracks": "No tracks | {tracks_count} track | {tracks_count} tracks"
} }
}, },
"Editor": { "Editor": {
@ -2859,7 +2870,7 @@
"edit": "Edit" "edit": "Edit"
}, },
"header": { "header": {
"addToPlaylist":"Add to playlist", "addToPlaylist": "Add to playlist",
"track": "{title}, by {artist}", "track": "{title}, by {artist}",
"manage": "Manage playlists", "manage": "Manage playlists",
"addFailure": "The track can't be added to a playlist", "addFailure": "The track can't be added to a playlist",
@ -2907,6 +2918,8 @@
"startTagsRadio": "Start tags radio", "startTagsRadio": "Start tags radio",
"stopArtistsRadio": "Stop artists radio", "stopArtistsRadio": "Stop artists radio",
"startArtistsRadio": "Start artists radio", "startArtistsRadio": "Start artists radio",
"stopPlaylistsRadio": "Stop playlists radio",
"startPlaylistsRadio": "Start playlists radio",
"stopRadio": "Stop radio", "stopRadio": "Stop radio",
"startRadio": "Play radio" "startRadio": "Play radio"
}, },
@ -2947,8 +2960,9 @@
"usePlayOptions": { "usePlayOptions": {
"addToQueueMessage": "{count} tracks were added to your queue | {count} track was added to your queue | {count} tracks were added to your queue" "addToQueueMessage": "{count} tracks were added to your queue | {count} track was added to your queue | {count} tracks were added to your queue"
}, },
"useQueue": { "queue": {
"queueShuffled": "Queue shuffled!" "unknownArtist": "Unknown Artist",
"unknownAlbum": "Unknown Album"
} }
}, },
"locale": { "locale": {
@ -3029,7 +3043,6 @@
"albumTitle": "'Album name", "albumTitle": "'Album name",
"artistName": "'Artist name", "artistName": "'Artist name",
"name": "'Name", "name": "'Name",
"length": "'Duration",
"itemsCount": "'Items", "itemsCount": "'Items",
"size": "'Size", "size": "'Size",
"bitrate": "'Bitrate", "bitrate": "'Bitrate",
@ -3199,19 +3212,6 @@
} }
} }
}, },
"embed": {
"EmbedFrame": {
"error": {
"badResource": "Widget improperly configured (bad resource type {type}).",
"missingResourceId": "Widget improperly configured (missing resource id).",
"trackNotFound": "Track not found.",
"unauthenticated": "You need to login to access this resource.",
"unknownServer": "An unknown error occurred while loading track data from server.",
"trackUnavailable": "This track is unavailable.",
"unknownTrack": "An unknown error occurred while loading track data."
}
}
},
"init": { "init": {
"axios": { "axios": {
"rateLimitDelay": "You sent too many requests and have been rate limited, please try again in {delay}", "rateLimitDelay": "You sent too many requests and have been rate limited, please try again in {delay}",
@ -3435,7 +3435,7 @@
}, },
"ArtistDetail": { "ArtistDetail": {
"warning": { "warning": {
"stats":"Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object" "stats": "Statistics are computed from known activity and content on your instance, and do not reflect general activity for this object"
}, },
"header": { "header": {
"local": "Local", "local": "Local",
@ -3554,7 +3554,6 @@
"audioContent": { "audioContent": {
"cachedSize": "Cached size", "cachedSize": "Cached size",
"totalSize": "Total size" "totalSize": "Total size"
} }
} }
}, },
@ -3580,7 +3579,6 @@
"content": { "content": {
"warning": "The tag will be removed and unlinked from any existing entity. This action is irreversible." "warning": "The tag will be removed and unlinked from any existing entity. This action is irreversible."
} }
} }
}, },
"table": { "table": {
@ -4203,7 +4201,7 @@
"size": "Total size of the files in this library" "size": "Total size of the files in this library"
}, },
"meta": { "meta": {
"tracks":"No tracks | {count} track | {count} tracks" "tracks": "No tracks | {count} track | {count} tracks"
}, },
"button": { "button": {
"upload": "Upload" "upload": "Upload"
@ -4285,7 +4283,7 @@
}, },
"label": { "label": {
"name": "Name", "name": "Name",
"description" :"Description", "description": "Description",
"visibility": "Visibility" "visibility": "Visibility"
}, },
"button": { "button": {
@ -4307,7 +4305,7 @@
"loading": { "loading": {
"libraries": "Loading libraries…" "libraries": "Loading libraries…"
}, },
"header":{ "header": {
"libraries": "My libraries" "libraries": "My libraries"
}, },
"empty": { "empty": {

Wyświetl plik

@ -127,70 +127,34 @@ span.diff.removed {
} }
.symbol { .symbol {
&.left::after {
padding-right: 0.25em;
}
&.right::after {
padding-left: 0.25em;
}
&.middle::after {
padding: 0 0.25em;
}
&.at::after { &.at::after {
content: "@"; content: "@";
} }
&.slash { &.slash::after {
&.left::after {
padding-right: 0.25em;
content: "/"; content: "/";
} }
&.right::after { &.pipe::after {
padding-left: 0.25em;
content: "/";
}
&.middle::after {
padding: 0.25em;
content: "/";
}
&.nospace::after {
content: "/";
}
}
&.pipe {
&.left::after {
padding-right: 0.25em;
content: "|"; content: "|";
} }
&.right::after { &.middledot::after {
padding-left: 0.25em;
content: "|";
}
&.middle::after {
padding: 0.25em;
content: "|";
}
}
&.middledot {
&.left::before {
padding-right: 0.25em;
content: "·"; content: "·";
} }
&.right::after {
padding-left: 0.25em;
content: "·";
}
&.middle::after {
padding: 0.25em;
content: "·";
}
&.nospace::after {
content: "·";
}
}
&.infinity::after { &.infinity::after {
content: ""; content: "";
} }
@ -203,58 +167,22 @@ span.diff.removed {
content: "#"; content: "#";
} }
&.ellipses { &.ellipses::after {
&.nospace::after {
content: ""; content: "";
} }
&.middle::after {
padding: 0.25em;
content: "";
}
}
&.doubledot::after { &.doubledot::after {
content: ".."; content: "..";
} }
&.hyphen { &.hyphen::after {
&.left::before {
padding-right: 0.25em;
content: "-"; content: "-";
} }
&.right { &.colon::after {
padding-left: 0.25em;
content: "-";
}
&.middle::after {
padding: 0.25em;
content: "-";
}
}
&.colon {
&.left::before {
padding-right: 0.25em;
content: ":"; content: ":";
} }
&.right::after {
padding-left: 0.25em;
content: ":";
}
&.middle::after {
padding: 0.25em;
content: ":";
}
}
&.percent::after { &.percent::after {
content: "%"; content: "%";
} }

Wyświetl plik

@ -93,7 +93,7 @@ const deletePlaylist = async () => {
<div class="content"> <div class="content">
{{ playlist.name }} {{ playlist.name }}
<div class="sub header"> <div class="sub header">
{{ $t('views.playlists.Detail.meta.tracks', {count: tracks_count, username: playlist.user.username}) }} {{ $t('views.playlists.Detail.meta.tracks', {count: playlist.tracks_count, username: playlist.user.username}) }}
<br> <br>
<duration :seconds="playlist.duration" /> <duration :seconds="playlist.duration" />
</div> </div>

Wyświetl plik

@ -3925,6 +3925,16 @@ json5@^2.1.3, json5@^2.2.0, json5@^2.2.1:
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
jsonc-eslint-parser@2.1.0, jsonc-eslint-parser@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.1.0.tgz#4c126b530aa583d85308d0b3041ff81ce402bbb2"
integrity sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g==
dependencies:
acorn "^8.5.0"
eslint-visitor-keys "^3.0.0"
espree "^9.0.0"
semver "^7.3.5"
jsonc-eslint-parser@^1.0.1: jsonc-eslint-parser@^1.0.1:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz#8cbe99f6f5199acbc5a823c4c0b6135411027fa6" resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz#8cbe99f6f5199acbc5a823c4c0b6135411027fa6"
@ -3936,16 +3946,6 @@ jsonc-eslint-parser@^1.0.1:
espree "^6.0.0" espree "^6.0.0"
semver "^6.3.0" semver "^6.3.0"
jsonc-eslint-parser@^2.0.0, jsonc-eslint-parser@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.1.0.tgz#4c126b530aa583d85308d0b3041ff81ce402bbb2"
integrity sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g==
dependencies:
acorn "^8.5.0"
eslint-visitor-keys "^3.0.0"
espree "^9.0.0"
semver "^7.3.5"
jsonfile@^6.0.1: jsonfile@^6.0.1:
version "6.1.0" version "6.1.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"