diff --git a/src/jukebox/jukebox/playlistgenerator.py b/src/jukebox/jukebox/playlistgenerator.py index b9f0223c6..7ce7de838 100755 --- a/src/jukebox/jukebox/playlistgenerator.py +++ b/src/jukebox/jukebox/playlistgenerator.py @@ -275,7 +275,7 @@ def get_directory_content(self, path='.'): logger.error(f" {e.__class__.__name__}: {e}") else: for m in content: - self.playlist.append({'type': TYPE_DECODE[m.filetype], 'name': m.name, 'path': m.path}) + self.playlist.append({'type': TYPE_DECODE[m.filetype], 'name': m.name, 'path': m.path, 'relpath': os.path.relpath(m.path, self._music_library_base_path)}) def _parse_nonrecusive(self, path='.'): return [x.path for x in self._get_directory_content(path) if x.filetype != TYPE_DIR] @@ -294,7 +294,7 @@ def _parse_recursive(self, path='.'): return recursive_playlist def parse(self, path='.', recursive=False): - """Parse the folder ``path`` and create a playlist from it's content + """Parse the folder ``path`` and create a playlist from its content :param path: Path to folder **relative** to ``music_library_base_path`` :param recursive: Parse folder recursivley, or stay in top-level folder diff --git a/src/webapp/public/locales/de/translation.json b/src/webapp/public/locales/de/translation.json index f3bd89782..d1a4391d6 100644 --- a/src/webapp/public/locales/de/translation.json +++ b/src/webapp/public/locales/de/translation.json @@ -138,8 +138,8 @@ "title": "Wähle ein Album, einen Ordner oder einen Song aus" }, "folders": { - "no-music": "Keine Musik vorhanden!", - "empty-folder": "Dieser Ordner ist leer!", + "no-music": "☝️ Keine Musik vorhanden!", + "empty-folder": "Dieser Ordner ist leer! 🙈", "show-folder-content": "Zeige den Ordnerinhalt an", "back-button-label": "Zurück" }, diff --git a/src/webapp/public/locales/en/translation.json b/src/webapp/public/locales/en/translation.json index 348d3771d..74fd9a696 100644 --- a/src/webapp/public/locales/en/translation.json +++ b/src/webapp/public/locales/en/translation.json @@ -138,8 +138,8 @@ "title": "Select an album, folder or song" }, "folders": { - "no-music": "No music found!", - "empty-folder": "This folder is empty!", + "no-music": "☝️ No music found!", + "empty-folder": "This folder is empty! 🙈", "show-folder-content": "Show folder content", "back-button-label": "Back" }, diff --git a/src/webapp/src/components/Cards/controls/actions/play-music/selected-folder.js b/src/webapp/src/components/Cards/controls/actions/play-music/selected-folder.js index bf1976fac..3191c36cf 100644 --- a/src/webapp/src/components/Cards/controls/actions/play-music/selected-folder.js +++ b/src/webapp/src/components/Cards/controls/actions/play-music/selected-folder.js @@ -8,7 +8,6 @@ import { import NoMusicSelected from './no-music-selected'; import FolderTypeAvatar from '../../../../Library/lists/folders/folder-type-avatar'; -import { DEFAULT_AUDIO_DIR } from '../../../../../config'; const SelectedFolder = ({ values: [folder] }) => { // TODO: Implement type correctly @@ -19,7 +18,7 @@ const SelectedFolder = ({ values: [folder] }) => { - + ); diff --git a/src/webapp/src/components/Library/lists/folders/folder-list-item.js b/src/webapp/src/components/Library/lists/folders/folder-list-item.js index 755feef15..3be77fbbc 100644 --- a/src/webapp/src/components/Library/lists/folders/folder-list-item.js +++ b/src/webapp/src/components/Library/lists/folders/folder-list-item.js @@ -13,7 +13,6 @@ import NavigateNextIcon from '@mui/icons-material/NavigateNext'; import request from '../../../../utils/request'; import FolderLink from './folder-link'; import FolderTypeAvatar from './folder-type-avatar'; -import { DEFAULT_AUDIO_DIR } from '../../../../config'; const FolderListItem = ({ folder, @@ -21,12 +20,12 @@ const FolderListItem = ({ registerMusicToCard, }) => { const { t } = useTranslation(); - const { type, name, path } = folder; + const { type, name, relpath } = folder; const playItem = () => { switch(type) { - case 'directory': return request('play_folder', { folder: path, recursive: true }); - case 'file': return request('play_single', { song_url: path.replace(`${DEFAULT_AUDIO_DIR}/`, '') }); + case 'directory': return request('play_folder', { folder: relpath, recursive: true }); + case 'file': return request('play_single', { song_url: relpath }); // TODO: Add missing Podcast // TODO: Add missing Stream default: return; @@ -35,8 +34,8 @@ const FolderListItem = ({ const registerItemToCard = () => { switch(type) { - case 'directory': return registerMusicToCard('play_folder', { folder: path, recursive: true }); - case 'file': return registerMusicToCard('play_single', { song_url: path.replace(`${DEFAULT_AUDIO_DIR}/`, '') }); + case 'directory': return registerMusicToCard('play_folder', { folder: relpath, recursive: true }); + case 'file': return registerMusicToCard('play_single', { song_url: relpath }); // TODO: Add missing Podcast // TODO: Add missing Stream default: return; @@ -50,7 +49,7 @@ const FolderListItem = ({ type === 'directory' ? diff --git a/src/webapp/src/components/Library/lists/folders/folder-list.js b/src/webapp/src/components/Library/lists/folders/folder-list.js index 36a9bcebd..2c656c702 100644 --- a/src/webapp/src/components/Library/lists/folders/folder-list.js +++ b/src/webapp/src/components/Library/lists/folders/folder-list.js @@ -1,12 +1,17 @@ import React, { memo } from 'react'; import { dropLast } from "ramda"; +import { useTranslation } from 'react-i18next'; -import { List } from '@mui/material'; +import { + List, + ListItem, + Typography, +} from '@mui/material'; import FolderListItem from './folder-list-item'; import FolderListItemBack from './folder-list-item-back'; -import { ROOT_DIRS } from '../../../../config'; +import { ROOT_DIR } from '../../../../config'; const FolderList = ({ dir, @@ -14,13 +19,15 @@ const FolderList = ({ isSelecting, registerMusicToCard, }) => { + const { t } = useTranslation(); + const getParentDir = (dir) => { - // TODO: ROOT_DIRS should be removed after paths are relative const decodedDir = decodeURIComponent(dir); + console.log(decodedDir) - if (ROOT_DIRS.includes(decodedDir)) return undefined; + if (decodedDir == ROOT_DIR) return undefined; - const parentDir = dropLast(1, decodedDir.split('/')).join('/'); + const parentDir = dropLast(1, decodedDir.split('/')).join('/') || ROOT_DIR; return parentDir; } @@ -30,10 +37,15 @@ const FolderList = ({ {parentDir && } - {folders.map((folder, key) => + {folders.length === 0 && + + {t('library.folders.empty-folder')} + + } + {folders.length > 0 && folders.map((folder, key) => { const { t } = useTranslation(); - const { dir = './' } = useParams(); + const { dir = ROOT_DIR } = useParams(); const [folders, setFolders] = useState([]); const [error, setError] = useState(null); const [isLoading, setIsLoading] = useState(true); @@ -49,9 +51,8 @@ const Folders = ({ if (isLoading) return ; if (error) return {t('library.loading-error')}; - if (!filteredFolders.length) { - if (musicFilter) return {`☝️ ${t('library.folders.no-music')}`}; - return {`${t('library.folders.empty-folder')} 🙈`}; + if (musicFilter && !filteredFolders.length) { + return {t('library.folders.no-music')}; } return ( diff --git a/src/webapp/src/config.js b/src/webapp/src/config.js index 482db205e..46a6ec1df 100644 --- a/src/webapp/src/config.js +++ b/src/webapp/src/config.js @@ -17,9 +17,7 @@ const SUBSCRIPTIONS = [ 'volume.level', ]; -const DEFAULT_AUDIO_DIR = '../../shared/audiofolders'; -const ROOT_DIRS = ['./', DEFAULT_AUDIO_DIR]; - +const ROOT_DIR = './'; // TODO: The reason why thos commands are empty objects is due to a legacy // situation where titles associated with those commands were stored here @@ -83,11 +81,10 @@ const JUKEBOX_ACTIONS_MAP = { const TIMER_STEPS = [0, 2, 5, 10, 15, 20, 30, 45, 60, 120, 180, 240]; export { - DEFAULT_AUDIO_DIR, JUKEBOX_ACTIONS_MAP, PUBSUB_ENDPOINT, REQRES_ENDPOINT, - ROOT_DIRS, + ROOT_DIR, SUBSCRIPTIONS, TIMER_STEPS, }