{"version":3,"sources":["icons/android-icon-192x192.png","icons/playing-light.gif","icons/playing-dark.gif","icons/paused-light.png","icons/paused-dark.png","config.js","utils/baseUrl.js","utils/docsUrl.js","utils/formatters.js","utils/notifications.js","dataProvider/httpClient.js","dataProvider/wrapperDataProvider.js","consts.js","dataProvider/index.js","actions/audioplayer.js","actions/dialogs.js","actions/settings.js","eventStream.js","actions/serverEvents.js","authProvider.js","layout/Notification.js","themes/dark.js","themes/extradark.js","themes/green.js","themes/spotify.js","themes/ligera.js","themes/index.js","themes/light.js","themes/useCurrentTheme.js","layout/Login.js","layout/Logout.js","layout/SubMenu.js","layout/DynamicMenuIcon.js","album/albumLists.js","dialogs/DialogTitle.js","dialogs/DialogContent.js","dialogs/AboutDialog.js","common/AddToPlaylistButton.js","common/ArtistLinkField.js","common/BatchPlayButton.js","common/BitrateField.js","subsonic/index.js","common/useToggleLove.js","common/LoveButton.js","common/ContextMenus.js","common/DocLink.js","common/DurationField.js","common/Pagination.js","common/List.js","common/sanitizeFieldRestProps.js","common/MultiLineTextField.js","common/PlayButton.js","common/QuickFilter.js","common/RangeField.js","common/ShuffleAllButton.js","common/SimpleList.js","common/SizeField.js","common/SongContextMenu.js","common/SongDatagrid.js","common/SongDetails.js","common/SongTitleField.js","common/Title.js","common/SongBulkActions.js","common/useAlbumsPerPage.js","common/Writable.js","common/SongSimpleList.js","common/ArtistSimpleList.js","common/RatingField.js","common/useRating.js","dialogs/SelectPlaylistInput.js","dialogs/DuplicateSongDialog.js","dialogs/AddToPlaylistDialog.js","hotkeys.js","dialogs/HelpDialog.js","layout/Menu.js","layout/PersonalMenu.js","layout/ActivityPanel.js","common/useInterval.js","layout/UserMenu.js","layout/AppBar.js","layout/Layout.js","transcoding/TranscodingList.js","transcoding/TranscodingNote.js","transcoding/TranscodingEdit.js","transcoding/TranscodingCreate.js","transcoding/TranscodingShow.js","transcoding/index.js","player/PlayerList.js","player/PlayerEdit.js","player/index.js","user/UserList.js","user/DeleteUserButton.js","user/UserEdit.js","user/index.js","user/UserCreate.js","song/SongListActions.js","song/AlbumLinkField.js","common/QualityInfo.js","song/SongList.js","song/index.js","album/AlbumListActions.js","actions/albumView.js","album/AlbumListView.js","album/AlbumGridView.js","album/AlbumList.js","album/AlbumSongs.js","album/AlbumDetails.js","album/AlbumActions.js","album/AlbumShow.js","album/index.js","artist/ArtistList.js","artist/index.js","playlist/PlaylistList.js","playlist/PlaylistEdit.js","playlist/PlaylistCreate.js","playlist/PlaylistDetails.js","playlist/PlaylistSongBulkActions.js","playlist/PlaylistSongs.js","playlist/PlaylistActions.js","playlist/PlaylistShow.js","playlist/index.js","audioplayer/PlayerToolbar.js","audioplayer/Player.js","i18n/provider.js","personal/Personal.js","i18n/useGetLanguageChoices.js","actions/themes.js","routes.js","reducers/themeReducer.js","reducers/dialogReducer.js","reducers/playQueue.js","reducers/albumView.js","reducers/activityReducer.js","reducers/settingsReducer.js","store/createAdminStore.js","store/persistState.js","App.js","serviceWorker.js","index.js"],"names":["module","exports","config","defaultConfig","version","firstTime","baseURL","loginBackgroundURL","enableTranscodingConfig","enableDownloads","enableFavourites","losslessFormats","welcomeMessage","gaTrackingId","devActivityPanel","devFastAccessCoverArt","enableStarRating","defaultTheme","appConfig","JSON","parse","window","__APP_CONFIG__","e","baseUrl","path","parts","push","replace","join","docsUrl","formatBytes","bytes","decimals","k","dm","sizes","i","Math","floor","log","parseFloat","pow","toFixed","formatDuration","d","days","f","map","v","toString","length","filter","checkForNotificationPermission","Notification","permission","httpClient","url","options","headers","Headers","Accept","token","localStorage","getItem","set","fetchUtils","fetchJson","then","response","get","setItem","dataProvider","jsonServerProvider","mapResource","resource","params","plsId","playlist_id","wrapperDataProvider","getList","r","p","getOne","getMany","getManyReference","update","updateMany","create","delete","deleteMany","setTrack","data","type","filterSongs","ids","reduce","acc","id","addTracks","playNext","shuffleTracks","shuffled","Object","keys","j","random","forEach","shuffle","playTracks","selectedId","songs","scrobble","submit","currentPlaying","audioInfo","openAddToPlaylist","selectedIds","onSuccess","setNotificationsState","enabled","currentIntervalCheck","es","dispatch","timeout","getEventStream","a","EventSource","setTimeout","value","clearTimeout","close","startEventStream","eventHandler","throttle","event","name","processEvent","trailing","console","Promise","reject","newStream","onmessage","onerror","catch","authProvider","login","username","password","request","Request","method","body","stringify","fetch","status","Error","statusText","json","jwtDecode","avatar","isAdmin","salt","generateSubsonicSalt","generateSubsonicToken","error","message","stack","logout","removeItems","clearServiceWorkerCache","resolve","checkAuth","checkError","getPermissions","role","getIdentity","fullName","removeItem","caches","keyList","key","md5","uuidv4","slice","props","anchorOrigin","vertical","horizontal","themeName","palette","primary","main","secondary","blue","overrides","MuiFormGroup","root","color","NDLogin","systemNameLink","icon","welcome","card","minWidth","backgroundColor","button","boxShadow","player","theme","background","paper","default","contrastText","light","green","spotifyGreen","musicListActions","padding","alignItems","margin","border","transform","transition","borderRadius","display","typography","fontFamily","h6","fontSize","MuiMenuItem","MuiDivider","MuiButton","textSecondary","label","paddingRight","paddingLeft","MuiDrawer","paddingTop","MuiTableRow","MuiTableCell","borderBottom","head","textTransform","letterSpacing","MuiAppBar","positionFixed","NDAlbumGridView","albumName","marginTop","fontWeight","albumSubtitle","albumContainer","albumPlayButton","NDPlaylistDetails","container","title","details","NDAlbumDetails","cardContents","recordName","recordArtist","recordMeta","commentBlock","NDAlbumShow","albumActions","NDPlaylistShow","playlistActions","NDAudioPlayer","audioTitle","songTitle","songInfo","systemName","marginBottom","width","height","RaLayout","content","RaList","RaListToolbar","toolbar","RaSearchInput","input","RaFilterButton","marginRight","RaPaginationActions","currentPageButton","actions","marginLeft","bLight","LightTheme","dark","MuiFilledInput","DarkTheme","ExtraDarkTheme","GreenTheme","LigeraTheme","text","MuiAutocomplete","popper","MuiCard","MuiPopover","MuiTypography","colorTextSecondary","MuiDialog","MuiFormLabel","MuiCheckbox","MuiIconButton","containedPrimary","textPrimary","colorSecondary","NDAppBar","NDSubMenu","textDecoration","overflow","RaDatagridHeaderCell","RaAutocompleteSuggestionList","suggestionsPaper","RaLink","link","RaLogout","RaMenuItemLink","active","RaSidebar","drawerPaper","RaBulkActionsToolbar","SpotifyTheme","prefersLightMode","useMediaQuery","useSelector","state","themes","find","t","useStyles","makeStyles","flexDirection","minHeight","justifyContent","backgroundRepeat","backgroundSize","backgroundPosition","flexWrap","form","renderInput","meta","touched","inputProps","TextField","helperText","fullWidth","FormLogin","loading","handleSubmit","validate","translate","useTranslate","classes","onSubmit","render","noValidate","className","Card","src","Logo","alt","href","target","rel","dangerouslySetInnerHTML","__html","autoFocus","component","disabled","CardActions","variant","CircularProgress","size","thickness","FormSignUp","Login","location","useState","setLoading","notify","useNotify","useLogin","useDispatch","useCallback","auth","nextPathname","validateLogin","values","errors","validateSignup","match","confirmPassword","LoginWithTheme","useCurrentTheme","ThemeProvider","createMuiTheme","handleClick","onClick","Logout","spacing","sidebarIsOpen","sidebarIsClosed","SubMenu","handleToggle","isOpen","children","dense","header","MenuItem","ListItemIcon","Typography","Tooltip","placement","Collapse","in","unmountOnExit","disablePadding","Divider","DynamicMenuIcon","activeIcon","useLocation","pathname","startsWith","createElement","propTypes","PropTypes","string","isRequired","object","all","AlbumOutlinedIcon","AlbumIcon","starred","FavoriteBorderIcon","FavoriteIcon","topRated","StarBorderIcon","StarIcon","recentlyAdded","LibraryAddOutlinedIcon","LibraryAddIcon","recentlyPlayed","VideoLibraryOutlinedIcon","VideoLibraryIcon","mostPlayed","DialogTitle","withStyles","closeButton","position","right","top","grey","onClose","other","disableTypography","IconButton","aria-label","DialogContent","MuiDialogContent","links","homepage","reddit","twitter","discord","source","featureRequests","LinkToVersion","TableCell","align","split","commitID","includes","Link","AboutDialog","open","Dialog","onBackdropClick","aria-labelledby","dividers","TableContainer","Paper","Table","TableBody","TableRow","scope","_","inflection","humanize","underscore","AddToPlaylistButton","unselectAll","useUnselectAll","aria-controls","aria-haspopup","useGetHandleArtistClick","useAlbumsPerPage","perPage","ArtistLinkField","withWidth","record","artistLink","to","albumArtistId","stopPropagation","albumArtist","defaultProps","addLabel","BatchPlayButton","action","useDataProvider","caption","tracks","cur","BitrateField","command","URLSearchParams","append","ts","Date","getTime","getCoverArtUrl","updatedAt","coverArtId","submission","download","star","unstar","setRating","rating","useToggleLove","mountedRef","useRef","useEffect","current","refreshRecord","toggleLove","toggle","subsonic","love","visibility","visible","loved","LoveButton","Button","rest","handleToggleLove","preventDefault","noWrap","whiteSpace","menu","ContextMenu","showLove","songQueryParams","anchorEl","setAnchorEl","play","needData","addToQueue","addToPlaylist","handleItemClick","getAttribute","extractSongsData","Boolean","clsx","currentTarget","keepMounted","AlbumContextMenu","pagination","page","sort","field","order","album_id","disc_number","discNumber","ArtistContextMenu","album_artist_id","DurationField","Pagination","rowsPerPageOptions","List","subTitle","args","smart_count","sanitizeFieldRestProps","allowEmpty","basePath","cellClassName","emptyText","formClassName","headerClassName","linkType","locale","sortable","sortBy","sortByOrder","textAlign","translateChoice","MultiLineTextField","memo","firstLine","maxLines","lines","line","idx","data-testid","PlayButton","playAlbum","useQuickFilterStyles","chip","QuickFilter","lbl","Chip","formatRange","nameCapitalized","charAt","toUpperCase","min","max","range","RangeField","ShuffleAllButton","filters","res","song","tertiary","float","opacity","LinkOrNot","classesOverride","linkToRecord","SimpleList","hasBulkActions","leftAvatar","leftIcon","primaryText","onToggleItem","rightAvatar","rightIcon","secondaryText","tertiaryText","total","sanitizeListRestProps","ListItem","ListItemAvatar","Avatar","ListItemText","ListItemSecondaryAction","SizeField","SongContextMenu","onAddToPlaylist","playNow","mediaFileId","subtitle","textOverflow","verticalAlign","discIcon","row","cursor","headerStyle","contextMenu","DiscSubtitleRow","colSpan","contextAlwaysVisible","hover","discSubtitle","albumId","SongDatagridRow","firstTracks","onClickDiscSubtitle","fields","React","Children","toArray","c","isValidElement","childCount","has","expand","SongDatagridBody","showDiscSubtitles","playDisc","idsToPlay","useMemo","Set","last","clear","SongDatagrid","Datagrid","tableCell","SongDetails","album","genre","compilation","BooleanField","bitRate","DateField","showTime","playCount","comment","playDate","SongTitleField","showTrackNumbers","useTheme","currentTrack","currentId","trackId","paused","isCurrent","Icon","PausedLight","PausedDark","PlayingLight","PlayingDark","FunctionField","trackNumber","padStart","Title","isDesktop","breakpoints","up","undefined","SongBulkActions","getPerPageOptions","admin","resources","getPerPage","isWritable","owner","Writable","child","cloneElement","listItem","artist","timeStamp","SongSimpleList","ArtistSimpleList","show","hide","RatingField","refreshRating","val","useRating","rate","handleRating","Rating","emptyIcon","onChange","newValue","createFilterOptions","checkbox","SelectPlaylistInput","useGetList","option","checkedIcon","Autocomplete","multiple","disableCloseOnSelect","newState","playlistObject","inputValue","filterOptions","filtered","clearOnBlur","handleHomeEndKeys","openOnFocus","selectOnFocus","getOptionLabel","renderOption","selected","Fragment","Checkbox","checked","freeSolo","DuplicateSongDialog","handleClickClose","handleSkip","DialogActions","AddToPlaylistDialog","addToPlaylistDialog","duplicateSong","duplicateIds","setValue","check","setCheck","playlistId","distinctIds","trackIds","Array","isArray","len","maxWidth","pls","newlyAdded","pop","dupSng","some","dupIds","openDuplicateSongWarning","createAndAddToPlaylist","distinctSongs","indexOf","keyMap","SHOW_HELP","sequence","group","TOGGLE_MENU","TOGGLE_PLAY","PREV_SONG","NEXT_SONG","VOL_UP","VOL_DOWN","TOGGLE_LOVE","HelpTable","getApplicationKeyMap","ReactDOM","createPortal","sequences","description","document","HelpDialog","setOpen","handlers","allowChanges","translatedResourceName","pluralize","withRouter","onMenuClick","isXsmall","down","ui","sidebarOpen","getResources","menuAlbumList","menuLibrary","menuSettings","setState","renderResourceMenuItemLink","MenuItemLink","activeClassName","subItems","subMenu","hasList","albumLists","al","albumListAddress","exact","renderAlbumMenuItemLink","menuItem","PersonalMenu","forwardRef","ref","wrapper","progress","left","zIndex","counterStatus","getUptime","serverStart","now","startTime","Uptime","activity","uptime","setUptime","callback","delay","savedCallback","setInterval","clearInterval","useInterval","ActivityPanel","scanStatus","triggerScan","full","fullScan","resp","scanStatusUpdate","Badge","badgeContent","scanning","Popover","transformOrigin","CardContent","Box","flex","folderCount","user","usernameWrap","UserMenu","useGetIdentity","loaded","identity","handleClose","aria-owns","MenuList","elevation","AboutMenuItem","titleAccess","settingsResources","CustomUserMenu","permissions","usePermissions","AppBar","userMenu","paddingBottom","addPadding","queue","keyHandlers","toggleSidebar","Layout","Menu","appBar","notification","TranscodingList","exporter","targetFormat","defaultBitRate","rowClick","Interpolate","TranscodingNote","TranscodingTitle","resourceName","TranscodingEdit","Edit","SimpleForm","TextInput","required","SelectInput","choices","TranscodingCreate","Create","defaultValue","TranscodingShow","Show","SimpleShowLayout","list","edit","TransformIcon","PlayerFilter","Filter","SearchInput","alwaysOn","PlayerList","client","userName","maxBitRate","ReferenceField","reference","PlayerTitle","ReferenceInput","resettable","BooleanInput","RadioIcon","UserFilter","UserList","bulkActionButtons","lastLoginAt","toLocaleString","deleteButton","fade","DeleteUserButton","redirect","useDeleteWithConfirmController","handleDialogOpen","handleDialogClose","handleDelete","Confirm","translateOptions","onConfirm","UserTitle","UserToolbar","SaveButton","email","PasswordInput","initialValue","Group","SongListActions","currentSort","displayedFilters","filterValues","showFilter","permanentFilter","onUnselectItems","maxResults","TopToolbar","context","AlbumLinkField","llFormats","useStyle","QualityInfo","suffix","info","contextHeader","ratingField","SongFilter","SongList","NumberField","year","MusicNoteOutlinedIcon","MusicNoteIcon","AlbumListActions","albumView","ButtonGroup","grid","columnIcon","AlbumDetails","AlbumListView","hasShow","hasEdit","syncWithLocation","tileBar","tileBarMobile","albumArtistName","albumLink","useCoverStyles","cover","objectFit","getColsForWidth","Cover","withContentRect","measureRef","contentRect","bounds","AlbumGridTile","showArtist","GridListTileBar","actionIcon","LoadedAlbumGrid","useListContext","isArtistView","artist_id","GridList","cellHeight","cols","GridListTile","gridListTile","Loading","AlbumFilter","filterToQuery","searchText","AutocompleteInput","NullableBooleanInput","NumberInput","AlbumListTitle","albumListType","listTitle","perPageOptions","search","listParams","transitions","bulkActionsDisplayed","noResults","AlbumSongs","useVersion","ListToolbar","BulkActionsToolbar","SanitizedAlbumSongs","removeAlbumCommentsFromSongs","coverParent","loveButton","wordBreak","pointerCursor","AlbumComment","expanded","setExpanded","formatted","handleExpandClick","collapsedHeight","isLightboxOpen","setLightboxOpen","imageUrl","fullImageUrl","handleOpenLightbox","handleCloseLightbox","CardMedia","genreDateLine","genreYear","songCount","imagePadding","animationDuration","imageTitle","mainSrc","onCloseRequest","AlbumActions","handlePlay","handlePlayNext","handlePlayLater","handleShuffle","handleDownload","AlbumShowLayout","useShowContext","ReferenceManyField","AlbumList","controllerProps","useShowController","ShowContextProvider","ArtistFilter","ArtistListView","handleArtistLink","history","useHistory","ArtistList","MicNoneOutlinedIcon","MicIcon","PlaylistFilter","TogglePublicInput","useUpdate","public","undoable","onFailure","togglePublic","canChange","Switch","PlaylistList","isRowSelectable","EditButton","SyncFragment","formData","PlaylistTitle","PlaylistEdit","multiline","FormDataConsumer","formDataProps","PlaylistCreate","PlaylistDetails","PlaylistSongBulkActions","mappedResource","ResourceContextProvider","BulkDeleteButton","ReorderableList","readOnly","PlaylistSongs","listContext","refresh","useRefresh","reorder","newPos","insert_before","handleDragEnd","from","toId","fromId","onDragEnd","nodeSelector","draggable","SanitizedPlaylistSongs","ListBase","PlaylistActions","getAllSongsAndDispatch","curr","handleExport","blob","Blob","URL","createObjectURL","appendChild","click","parentNode","removeChild","PlaylistShowLayout","QueueMusicOutlinedIcon","QueueMusicIcon","Placeholder","Toolbar","useGetOne","toggling","PlayerToolbar","qualityInfo","artistAlbum","audioInstance","AudioTitle","isMobile","qi","singer","Player","playerTheme","authenticated","useAuthState","showNotifications","settings","notifications","nextSong","findIndex","item","uuid","prevSong","togglePlay","volume","metaKey","playPrev","defaultOptions","mode","autoPlay","preload","autoPlayInitLoadPlayList","loadAudioErrorPlayNext","clearPriorAudioLists","showDestroy","showDownload","showReload","toggleMode","glassBg","showThemeSwitch","showMediaSession","defaultPosition","volumeFade","fadeIn","fadeOut","renderAudioTitle","playListsText","openText","closeText","notContentText","clickToPlayText","clickToPauseText","nextTrackText","previousTrackText","reloadText","volumeText","toggleLyricText","toggleMiniModeText","destroyText","downloadText","removeAudioListsText","clickToDeleteText","emptyLyricText","playModeText","orderLoop","singleLoop","shufflePlay","playIndex","audioLists","extendsContent","defaultVolume","onAudioListsChange","currentPlayIndex","onAudioProgress","ended","currentTime","duration","isNaN","scrobbled","onAudioVolumeChange","setVolume","sqrt","onAudioPlay","ReactGA","category","image","silent","sendNotification","onAudioPause","onAudioEnded","currentPlayId","onCoverClick","onBeforeDestroy","quietUpdate","getAudioInstance","instance","retrieveTranslation","prepareLanguage","lang","removeEmpty","obj","hasOwnProperty","albumSong","playlistTrack","ra","boolean","null","deepmerge","en","polyglotI18nProvider","i18nProvider","changeLocale","defaultLocale","openInNewTab","focus","HelpMsg","SelectLanguage","setLocale","useSetLocale","useLocale","b","localeCompare","useGetLanguageChoices","SelectTheme","currentTheme","themeChoices","payload","SelectDefaultView","NotificationsToggle","currentSetting","notAvailable","isSecureContext","FormControl","FormControlLabel","control","requestPermission","FormHelperText","Personal","themeReducer","previousState","addToPlaylistDialogReducer","mapToAudioLists","artistId","musicSrc","initialState","playQueueReducer","newQueue","foundPos","albumViewReducer","defaultState","count","activityReducer","settingsReducer","customReducers","reducer","combineReducers","adminReducer","router","connectRouter","saga","rootSaga","adminSaga","fork","sagaMiddleware","createSagaMiddleware","composeEnhancers","compose","persistedState","serializedState","err","loadState","store","createStore","USER_LOGOUT","applyMiddleware","routerMiddleware","subscribe","getState","saveState","pick","run","createHashHistory","initialize","listen","pageview","App","createAdminStore","Admin","disableTelemetry","customRoutes","layout","loginPage","logoutButton","Resource","playlist","transcoding","AppWithHotkeys","isLocalhost","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","getElementById","process","origin","addEventListener","contentType","ready","unregister","reload","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.93d9e8ab.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/android-icon-192x192.c3d506d5.png\";","module.exports = \"data:image/gif;base64,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\"","module.exports = \"data:image/gif;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAAAAACreq1xAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAnRSTlMAAHaTzTgAAAACYktHRAD/h4/MvwAAAAd0SU1FB+UDFw4UEte6vnAAAAAnSURBVFjD7cyhEQAACMSwX4X9l8ThEFguUVVNAAAAgDdq7G0IAHDWO+8PeYnJa4QAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDMtMjNUMTQ6MTg6NTkrMDA6MDAXgf/NAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAzLTIzVDE0OjE4OjU5KzAwOjAwZtxHcQAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABQCAAAAACreq1xAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAnRSTlMAAHaTzTgAAAACYktHRAD/h4/MvwAAAAd0SU1FB+UDFw4UNuu5WqEAAAAnSURBVFjD7cyhEQAACMSw339OBsHhEFguUVVNAAAAgDdq7G0IAHDWlC1q4c5Yf/kAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDMtMjNUMTQ6MTg6NTkrMDA6MDAXgf/NAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAzLTIzVDE0OjE4OjU5KzAwOjAwZtxHcQAAAABJRU5ErkJggg==\"","// These defaults are only used in development mode. When bundled in the app,\n// the __APP_CONFIG__ object is dynamically filled by the ServeIndex function,\n// in the /server/app/serve_index.go\nconst defaultConfig = {\n version: 'dev',\n firstTime: false,\n baseURL: '',\n // Login backgrounds from https://unsplash.com/collections/1065384/music-wallpapers\n loginBackgroundURL: 'https://source.unsplash.com/collection/1065384/1600x900',\n enableTranscodingConfig: true,\n enableDownloads: true,\n enableFavourites: true,\n losslessFormats: 'FLAC,WAV,ALAC,DSF',\n welcomeMessage: '',\n gaTrackingId: '',\n devActivityPanel: true,\n devFastAccessCoverArt: false,\n enableStarRating: true,\n defaultTheme: 'Dark',\n}\n\nlet config\n\ntry {\n const appConfig = JSON.parse(window.__APP_CONFIG__)\n\n config = {\n ...defaultConfig,\n ...appConfig,\n }\n} catch (e) {\n config = defaultConfig\n}\n\nexport default config\n","import config from '../config'\n\nexport const baseUrl = (path) => {\n const base = config.baseURL || ''\n const parts = [base]\n parts.push(path.replace(/^\\//, ''))\n return parts.join('/')\n}\n","export const docsUrl = (path) => `https://www.navidrome.org${path}`\n","export const formatBytes = (bytes, decimals = 2) => {\n if (bytes === 0) return '0 Bytes'\n\n const k = 1024\n const dm = decimals < 0 ? 0 : decimals\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]\n}\n\nexport const formatDuration = (d) => {\n const days = Math.floor(d / 86400)\n const hours = Math.floor(d / 3600) % 24\n const minutes = Math.floor(d / 60) % 60\n const seconds = Math.floor(d % 60)\n const f = [hours, minutes, seconds]\n .map((v) => v.toString())\n .map((v) => (v.length !== 2 ? '0' + v : v))\n .filter((v, i) => v !== '00' || i > 0)\n .join(':')\n\n return `${days > 0 ? days + ':' : ''}${f}`\n}\n","export const sendNotification = (title, body = '', image = '') => {\n checkForNotificationPermission()\n new Notification(title, {\n body: body,\n icon: image,\n silent: true,\n })\n}\n\nconst checkForNotificationPermission = () => {\n return 'Notification' in window && Notification.permission === 'granted'\n}\n","import { fetchUtils } from 'react-admin'\nimport { baseUrl } from '../utils'\nimport config from '../config'\n\nconst customAuthorizationHeader = 'X-ND-Authorization'\n\nconst httpClient = (url, options = {}) => {\n url = baseUrl(url)\n if (!options.headers) {\n options.headers = new Headers({ Accept: 'application/json' })\n }\n const token = localStorage.getItem('token')\n if (token) {\n options.headers.set(customAuthorizationHeader, `Bearer ${token}`)\n }\n return fetchUtils.fetchJson(url, options).then((response) => {\n const token = response.headers.get(customAuthorizationHeader)\n if (token) {\n localStorage.setItem('token', token)\n // Avoid going to create admin dialog after logout/login without a refresh\n config.firstTime = false\n }\n return response\n })\n}\n\nexport default httpClient\n","import jsonServerProvider from 'ra-data-json-server'\nimport httpClient from './httpClient'\nimport { REST_URL } from '../consts'\n\nconst dataProvider = jsonServerProvider(REST_URL, httpClient)\n\nconst mapResource = (resource, params) => {\n switch (resource) {\n case 'albumSong':\n return ['song', params]\n\n case 'playlistTrack':\n // /api/playlistTrack?playlist_id=123 => /api/playlist/123/tracks\n let plsId = '0'\n if (params.filter) {\n plsId = params.filter.playlist_id\n }\n return [`playlist/${plsId}/tracks`, params]\n\n default:\n return [resource, params]\n }\n}\n\nconst wrapperDataProvider = {\n ...dataProvider,\n getList: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.getList(r, p)\n },\n getOne: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.getOne(r, p)\n },\n getMany: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.getMany(r, p)\n },\n getManyReference: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.getManyReference(r, p)\n },\n update: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.update(r, p)\n },\n updateMany: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.updateMany(r, p)\n },\n create: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.create(r, p)\n },\n delete: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.delete(r, p)\n },\n deleteMany: (resource, params) => {\n const [r, p] = mapResource(resource, params)\n return dataProvider.deleteMany(r, p)\n },\n}\n\nexport default wrapperDataProvider\n","export const REST_URL = '/app/api'\n\nexport const M3U_MIME_TYPE = 'audio/x-mpegurl'\n\nexport const AUTO_THEME_ID = 'AUTO_THEME_ID'\n","import httpClient from './httpClient'\nimport wrapperDataProvider from './wrapperDataProvider'\n\nexport { httpClient }\n\nexport default wrapperDataProvider\n","export const PLAYER_ADD_TRACKS = 'PLAYER_ADD_TRACKS'\nexport const PLAYER_PLAY_NEXT = 'PLAYER_PLAY_NEXT'\nexport const PLAYER_SET_TRACK = 'PLAYER_SET_TRACK'\nexport const PLAYER_SYNC_QUEUE = 'PLAYER_SYNC_QUEUE'\nexport const PLAYER_CLEAR_QUEUE = 'PLAYER_CLEAR_QUEUE'\nexport const PLAYER_SCROBBLE = 'PLAYER_SCROBBLE'\nexport const PLAYER_PLAY_TRACKS = 'PLAYER_PLAY_TRACKS'\nexport const PLAYER_CURRENT = 'PLAYER_CURRENT'\nexport const PLAYER_SET_VOLUME = 'PLAYER_SET_VOLUME'\n\nexport const setTrack = (data) => ({\n type: PLAYER_SET_TRACK,\n data,\n})\n\nexport const filterSongs = (data, ids) => {\n if (!ids) {\n return data\n }\n return ids.reduce((acc, id) => ({ ...acc, [id]: data[id] }), {})\n}\n\nexport const addTracks = (data, ids) => {\n const songs = filterSongs(data, ids)\n return {\n type: PLAYER_ADD_TRACKS,\n data: songs,\n }\n}\n\nexport const playNext = (data, ids) => {\n const songs = filterSongs(data, ids)\n return {\n type: PLAYER_PLAY_NEXT,\n data: songs,\n }\n}\n\nexport const shuffle = (data) => {\n const ids = Object.keys(data)\n for (let i = ids.length - 1; i > 0; i--) {\n let j = Math.floor(Math.random() * (i + 1))\n ;[ids[i], ids[j]] = [ids[j], ids[i]]\n }\n const shuffled = {}\n // The \"_\" is to force the object key to be a string, so it keeps the order when adding to object\n // or else the keys will always be in the same (numerically) order\n ids.forEach((id) => (shuffled['_' + id] = data[id]))\n return shuffled\n}\n\nexport const shuffleTracks = (data, ids) => {\n const songs = filterSongs(data, ids)\n const shuffled = shuffle(songs)\n const firstId = Object.keys(shuffled)[0]\n return {\n type: PLAYER_PLAY_TRACKS,\n id: firstId,\n data: shuffled,\n }\n}\n\nexport const playTracks = (data, ids, selectedId) => {\n const songs = filterSongs(data, ids)\n return {\n type: PLAYER_PLAY_TRACKS,\n id: selectedId || Object.keys(songs)[0],\n data: songs,\n }\n}\n\nexport const syncQueue = (id, data) => ({\n type: PLAYER_SYNC_QUEUE,\n id,\n data,\n})\n\nexport const clearQueue = () => ({\n type: PLAYER_CLEAR_QUEUE,\n})\n\nexport const scrobble = (id, submit) => ({\n type: PLAYER_SCROBBLE,\n id,\n submit,\n})\n\nexport const currentPlaying = (audioInfo) => ({\n type: PLAYER_CURRENT,\n data: audioInfo,\n})\n\nexport const setVolume = (volume) => ({\n type: PLAYER_SET_VOLUME,\n data: { volume },\n})\n","export const ADD_TO_PLAYLIST_OPEN = 'ADD_TO_PLAYLIST_OPEN'\nexport const ADD_TO_PLAYLIST_CLOSE = 'ADD_TO_PLAYLIST_CLOSE'\nexport const DUPLICATE_SONG_WARNING_OPEN = 'DUPLICATE_SONG_WARNING_OPEN'\nexport const DUPLICATE_SONG_WARNING_CLOSE = 'DUPLICATE_SONG_WARNING_CLOSE'\nexport const openAddToPlaylist = ({ selectedIds, onSuccess }) => ({\n type: ADD_TO_PLAYLIST_OPEN,\n selectedIds,\n onSuccess,\n})\n\nexport const closeAddToPlaylist = () => ({\n type: ADD_TO_PLAYLIST_CLOSE,\n})\n\nexport const openDuplicateSongWarning = (duplicateIds) => ({\n type: DUPLICATE_SONG_WARNING_OPEN,\n duplicateIds,\n})\n\nexport const closeDuplicateSongDialog = () => ({\n type: DUPLICATE_SONG_WARNING_CLOSE,\n})\n","export const SET_NOTIFICATIONS_STATE = 'SET_NOTIFICATIONS_STATE'\n\nexport const setNotificationsState = (enabled) => ({\n type: SET_NOTIFICATIONS_STATE,\n data: enabled,\n})\n","import { baseUrl } from './utils'\nimport throttle from 'lodash.throttle'\nimport { processEvent, serverDown } from './actions'\nimport { httpClient } from './dataProvider'\nimport { REST_URL } from './consts'\n\nconst defaultIntervalCheck = 20000\nconst reconnectIntervalCheck = 2000\nlet currentIntervalCheck = reconnectIntervalCheck\nlet es = null\nlet dispatch = null\nlet timeout = null\n\nconst getEventStream = async () => {\n if (!es) {\n // Call `keepalive` to refresh the jwt token\n await httpClient(`${REST_URL}/keepalive/eventSource`)\n es = new EventSource(\n baseUrl(`${REST_URL}/events?jwt=${localStorage.getItem('token')}`)\n )\n }\n return es\n}\n\n// Reestablish the event stream after 20 secs of inactivity\nconst setTimeout = (value) => {\n currentIntervalCheck = value\n if (timeout) {\n window.clearTimeout(timeout)\n }\n timeout = window.setTimeout(async () => {\n if (es) {\n es.close()\n }\n es = null\n await startEventStream()\n }, currentIntervalCheck)\n}\n\nconst stopEventStream = () => {\n if (es) {\n es.close()\n }\n es = null\n if (timeout) {\n window.clearTimeout(timeout)\n }\n timeout = null\n}\n\nconst setDispatch = (dispatchFunc) => {\n dispatch = dispatchFunc\n}\n\nconst eventHandler = throttle(\n (event) => {\n const data = JSON.parse(event.data)\n if (data.name !== 'keepAlive') {\n dispatch(processEvent(data.name, data))\n }\n setTimeout(defaultIntervalCheck) // Reset timeout on every received message\n },\n 100,\n { trailing: true }\n)\n\nconst startEventStream = async () => {\n setTimeout(currentIntervalCheck)\n if (!localStorage.getItem('token')) {\n console.log('Cannot create a unauthenticated EventSource connection')\n return Promise.reject()\n }\n return getEventStream()\n .then((newStream) => {\n newStream.onmessage = eventHandler\n newStream.onerror = (e) => {\n console.log('EventStream error', e)\n setTimeout(reconnectIntervalCheck)\n dispatch(serverDown())\n }\n return newStream\n })\n .catch((e) => {\n console.log(`Error connecting to server:`, e)\n })\n}\n\nexport { setDispatch, startEventStream, stopEventStream }\n","export const EVENT_SCAN_STATUS = 'scanStatus'\nexport const EVENT_SERVER_START = 'serverStart'\n\nexport const processEvent = (type, data) => {\n return {\n type,\n data: data,\n }\n}\n\nexport const scanStatusUpdate = (data) => ({\n type: EVENT_SCAN_STATUS,\n data: data,\n})\n\nexport const serverDown = () => ({\n type: EVENT_SERVER_START,\n data: {},\n})\n","import jwtDecode from 'jwt-decode'\nimport md5 from 'md5-hex'\nimport { v4 as uuidv4 } from 'uuid'\nimport { baseUrl } from './utils'\nimport config from './config'\nimport { startEventStream, stopEventStream } from './eventStream'\n\nconst authProvider = {\n login: ({ username, password }) => {\n let url = baseUrl('/app/login')\n if (config.firstTime) {\n url = baseUrl('/app/createAdmin')\n }\n const request = new Request(url, {\n method: 'POST',\n body: JSON.stringify({ username, password }),\n headers: new Headers({ 'Content-Type': 'application/json' }),\n })\n return fetch(request)\n .then((response) => {\n if (response.status < 200 || response.status >= 300) {\n throw new Error(response.statusText)\n }\n return response.json()\n })\n .then((response) => {\n // Validate token\n jwtDecode(response.token)\n localStorage.setItem('token', response.token)\n localStorage.setItem('name', response.name)\n localStorage.setItem('username', response.username)\n response.avatar && localStorage.setItem('avatar', response.avatar)\n localStorage.setItem('role', response.isAdmin ? 'admin' : 'regular')\n const salt = generateSubsonicSalt()\n localStorage.setItem('subsonic-salt', salt)\n localStorage.setItem(\n 'subsonic-token',\n generateSubsonicToken(password, salt)\n )\n // Avoid going to create admin dialog after logout/login without a refresh\n config.firstTime = false\n if (config.devActivityPanel) {\n startEventStream()\n }\n return response\n })\n .catch((error) => {\n if (\n error.message === 'Failed to fetch' ||\n error.stack === 'TypeError: Failed to fetch'\n ) {\n throw new Error('errors.network_error')\n }\n\n throw new Error(error)\n })\n },\n\n logout: () => {\n stopEventStream()\n removeItems()\n try {\n clearServiceWorkerCache()\n } catch (e) {\n console.log('Error clearing service worker cache:', e)\n }\n return Promise.resolve()\n },\n\n checkAuth: () =>\n localStorage.getItem('token') ? Promise.resolve() : Promise.reject(),\n\n checkError: ({ status }) => {\n if (status === 401 || status === 403) {\n removeItems()\n return Promise.reject()\n }\n return Promise.resolve()\n },\n\n getPermissions: () => {\n const role = localStorage.getItem('role')\n return role ? Promise.resolve(role) : Promise.reject()\n },\n\n getIdentity: () => {\n return {\n id: localStorage.getItem('username'),\n fullName: localStorage.getItem('name'),\n avatar: localStorage.getItem('avatar'),\n }\n },\n}\n\nconst removeItems = () => {\n localStorage.removeItem('token')\n localStorage.removeItem('name')\n localStorage.removeItem('username')\n localStorage.removeItem('avatar')\n localStorage.removeItem('role')\n localStorage.removeItem('subsonic-salt')\n localStorage.removeItem('subsonic-token')\n}\n\nconst clearServiceWorkerCache = () => {\n window.caches &&\n caches.keys().then(function (keyList) {\n for (let key of keyList) caches.delete(key)\n })\n}\n\nconst generateSubsonicSalt = () => {\n const h = md5(uuidv4())\n return h.slice(0, 6)\n}\n\nconst generateSubsonicToken = (password, salt) => {\n return md5(password + salt)\n}\n\nexport default authProvider\n","import React from 'react'\nimport { Notification as RANotification } from 'react-admin'\n\nconst Notification = (props) => (\n \n)\n\nexport default Notification\n","import blue from '@material-ui/core/colors/blue'\n\nexport default {\n themeName: 'Dark',\n palette: {\n primary: {\n main: '#90caf9',\n },\n secondary: blue,\n type: 'dark',\n },\n overrides: {\n MuiFormGroup: {\n root: {\n color: 'white',\n },\n },\n NDLogin: {\n systemNameLink: {\n color: '#0085ff',\n },\n icon: {},\n welcome: {\n color: '#eee',\n },\n card: {\n minWidth: 300,\n backgroundColor: '#424242ed',\n },\n avatar: {},\n button: {\n boxShadow: '3px 3px 5px #000000a3',\n },\n },\n },\n player: {\n theme: 'dark',\n },\n}\n","import blue from '@material-ui/core/colors/blue'\n\nexport default {\n themeName: 'Extra Dark',\n palette: {\n background: {\n paper: '#000000',\n default: '#000000',\n },\n primary: {\n main: '#0f60b6',\n contrastText: '#909090',\n },\n secondary: blue,\n type: 'dark',\n },\n overrides: {\n MuiFormGroup: {\n root: {\n color: 'white',\n },\n },\n NDLogin: {\n systemNameLink: {\n color: '#fff',\n },\n welcome: {\n color: '#eee',\n },\n },\n },\n player: {\n theme: 'dark',\n },\n}\n","import green from '@material-ui/core/colors/green'\n\nexport default {\n themeName: 'Green',\n palette: {\n primary: {\n light: green['300'],\n main: green['500'],\n },\n secondary: {\n main: green['900'],\n contrastText: '#fff',\n },\n type: 'dark',\n },\n overrides: {\n MuiFormGroup: {\n root: {\n color: 'white',\n },\n },\n NDLogin: {\n systemNameLink: {\n color: '#fff',\n },\n welcome: {\n color: '#eee',\n },\n },\n },\n player: {\n theme: 'dark',\n },\n}\n","const spotifyGreen = {\n 300: '#62ec83',\n 500: '#1db954',\n 900: '#008827',\n}\n\n// For Album, Playlist\nconst musicListActions = {\n padding: '1rem 0',\n alignItems: 'center',\n '@global': {\n button: {\n margin: 5,\n border: '1px solid transparent',\n backgroundColor: 'inherit',\n color: '#b3b3b3',\n '&:hover': {\n border: '1px solid #b3b3b3',\n backgroundColor: 'inherit !important',\n },\n },\n 'button:first-child': {\n '@media screen and (max-width: 720px)': {\n transform: 'scale(1.5)',\n margin: '1rem',\n '&:hover': {\n transform: 'scale(1.6) !important',\n },\n },\n transform: 'scale(2)',\n margin: '1.5rem',\n minWidth: 0,\n padding: 5,\n transition: 'transform .3s ease',\n background: spotifyGreen['500'],\n color: '#fff',\n borderRadius: 500,\n border: 0,\n '&:hover': {\n transform: 'scale(2.1)',\n backgroundColor: `${spotifyGreen['500']} !important`,\n border: 0,\n },\n },\n 'button:first-child>span:first-child': {\n padding: 0,\n },\n 'button:first-child>span:first-child>span': {\n display: 'none',\n },\n 'button>span:first-child>span, button:not(:first-child)>span:first-child>svg': {\n color: '#b3b3b3',\n },\n },\n}\n\nexport default {\n themeName: 'Spotify-ish',\n typography: {\n fontFamily: \"system-ui, 'Helvetica Neue', Helvetica, Arial\",\n h6: {\n fontSize: '1rem', // AppBar title\n },\n },\n palette: {\n primary: {\n light: spotifyGreen['300'],\n main: spotifyGreen['500'],\n },\n secondary: {\n main: '#fff',\n contrastText: '#fff',\n },\n background: {\n default: '#121212',\n paper: '#121212',\n },\n type: 'dark',\n },\n overrides: {\n MuiFormGroup: {\n root: {\n color: spotifyGreen['500'],\n },\n },\n MuiMenuItem: {\n root: {\n fontSize: '0.875rem',\n },\n },\n MuiDivider: {\n root: {\n margin: '.75rem 0',\n },\n },\n MuiButton: {\n root: {\n background: spotifyGreen['500'],\n color: '#fff',\n border: '1px solid transparent',\n borderRadius: 500,\n '&:hover': {\n background: `${spotifyGreen['900']} !important`,\n },\n },\n textSecondary: {\n border: '1px solid #b3b3b3',\n background: '#000',\n '&:hover': {\n border: '1px solid #fff !important',\n background: '#000 !important',\n },\n },\n label: {\n color: '#fff',\n paddingRight: '1rem',\n paddingLeft: '0.7rem',\n },\n },\n MuiDrawer: {\n root: {\n background: '#000',\n paddingTop: '10px',\n },\n },\n MuiTableRow: {\n root: {\n padding: '10px 0',\n transition: 'background-color .3s ease',\n '&:hover': {\n backgroundColor: '#1d1d1d !important',\n },\n '@global': {\n 'td:nth-child(4)': {\n color: '#fff !important',\n },\n },\n },\n },\n MuiTableCell: {\n root: {\n borderBottom: '1px solid #1d1d1d',\n padding: '10px !important',\n color: '#b3b3b3 !important',\n },\n head: {\n borderBottom: '1px solid #282828',\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n letterSpacing: 1.2,\n },\n },\n MuiAppBar: {\n positionFixed: {\n backgroundColor: '#000 !important',\n boxShadow: 'none',\n },\n },\n NDAlbumGridView: {\n albumName: {\n marginTop: '0.5rem',\n fontWeight: 700,\n textTransform: 'none',\n color: '#fff',\n },\n albumSubtitle: {\n color: '#b3b3b3',\n },\n albumContainer: {\n backgroundColor: '#181818',\n borderRadius: '.5rem',\n padding: '.75rem',\n transition: 'background-color .3s ease',\n '&:hover': {\n backgroundColor: '#282828',\n },\n },\n albumPlayButton: {\n backgroundColor: spotifyGreen['500'],\n borderRadius: '50%',\n boxShadow: '0 8px 8px rgb(0 0 0 / 30%)',\n padding: '0.35rem',\n transition: 'padding .3s ease',\n '&:hover': {\n background: `${spotifyGreen['500']} !important`,\n padding: '0.45rem',\n },\n },\n },\n NDPlaylistDetails: {\n container: {\n background: 'linear-gradient(#1d1d1d, transparent)',\n borderRadius: 0,\n paddingTop: '2.5rem !important',\n boxShadow: 'none',\n },\n title: {\n fontSize: 'calc(1.5rem + 1.5vw);',\n fontWeight: 700,\n color: '#fff',\n },\n details: {\n fontSize: '.875rem',\n color: 'rgba(255,255,255, 0.8)',\n },\n },\n NDAlbumDetails: {\n root: {\n background: 'linear-gradient(#1d1d1d, transparent)',\n borderRadius: 0,\n boxShadow: 'none',\n },\n cardContents: {\n alignItems: 'center',\n paddingTop: '1.5rem',\n },\n recordName: {\n fontSize: 'calc(1rem + 1.5vw);',\n fontWeight: 700,\n },\n recordArtist: {\n fontSize: '.875rem',\n fontWeight: 700,\n },\n recordMeta: {\n fontSize: '.875rem',\n color: 'rgba(255,255,255, 0.8)',\n },\n commentBlock: {\n fontSize: '.875rem',\n color: 'rgba(255,255,255, 0.8)',\n },\n },\n NDAlbumShow: {\n albumActions: musicListActions,\n },\n NDPlaylistShow: {\n playlistActions: musicListActions,\n },\n NDAudioPlayer: {\n audioTitle: {\n color: '#fff',\n fontSize: '0.875rem',\n },\n songTitle: {\n fontWeight: 400,\n },\n songInfo: {\n fontSize: '0.675rem',\n color: '#b3b3b3',\n },\n player: {\n border: '10px solid blue',\n },\n },\n NDLogin: {\n main: {\n boxShadow: 'inset 0 0 0 2000px rgba(0, 0, 0, .8)',\n },\n systemNameLink: {\n color: '#fff',\n },\n systemName: {\n marginTop: '0.5em',\n marginBottom: '1em',\n },\n icon: {\n backgroundColor: 'inherit',\n width: '5em',\n height: '5em',\n },\n card: {\n background: 'none',\n boxShadow: 'none',\n padding: '10px 0',\n minWidth: 360,\n },\n avatar: {\n marginBottom: 0,\n },\n },\n RaLayout: {\n content: {\n padding: '0 !important',\n background: 'linear-gradient(#171717, #121212)',\n },\n },\n RaList: {\n content: {\n backgroundColor: 'inherit',\n },\n },\n RaListToolbar: {\n toolbar: {\n padding: '0 .55rem !important',\n },\n },\n RaSearchInput: {\n input: {\n paddingLeft: '.9rem',\n border: 0,\n },\n },\n RaFilterButton: {\n root: {\n marginRight: '1rem',\n },\n },\n RaPaginationActions: {\n currentPageButton: {\n border: '1px solid #b3b3b3',\n },\n button: {\n backgroundColor: 'inherit',\n minWidth: 48,\n margin: '0 4px',\n border: '1px solid #282828',\n '@global': {\n '> .MuiButton-label': {\n padding: 0,\n },\n },\n },\n actions: {\n '@global': {\n '.next-page': {\n marginLeft: 8,\n marginRight: 8,\n },\n '.previous-page': {\n marginRight: 8,\n },\n },\n },\n },\n },\n player: {\n theme: 'dark',\n },\n}\n","const bLight = {\n 300: '#0054df',\n 500: '#ffffff',\n}\nconst musicListActions = {\n padding: '1rem 0',\n alignItems: 'center',\n '@global': {\n button: {\n margin: 5,\n border: '1px solid #cccccc',\n backgroundColor: '#fff',\n color: '#b3b3b3',\n '&:hover': {\n border: '1px solid #224bff',\n backgroundColor: 'inherit !important',\n },\n },\n 'button:first-child': {\n '@media screen and (max-width: 720px)': {\n transform: 'scale(1.5)',\n margin: '1rem',\n '&:hover': {\n transform: 'scale(1.6) !important',\n },\n },\n transform: 'scale(2)',\n margin: '1.5rem',\n minWidth: 0,\n padding: 5,\n transition: 'transform .3s ease',\n background: bLight['500'],\n color: '#fff',\n borderRadius: 500,\n border: 0,\n '&:hover': {\n transform: 'scale(2.1)',\n backgroundColor: `${bLight['500']} !important`,\n border: 0,\n boxShadow: '0px 0px 4px 0px #5656567d',\n },\n },\n 'button:first-child>span:first-child': {\n padding: 0,\n color: bLight['300'],\n },\n 'button:first-child>span:first-child>span': {\n display: 'none',\n },\n 'button>span:first-child>span, button:not(:first-child)>span:first-child>svg': {\n color: '#656565',\n },\n },\n}\n\nexport default {\n themeName: 'Ligera',\n palette: {\n primary: {\n light: bLight['300'],\n main: '#464646',\n },\n secondary: {\n main: '#000',\n contrastText: '#fff',\n },\n background: {\n default: '#f0f2f5',\n paper: 'inherit',\n },\n text: {\n secondary: '#232323',\n },\n },\n typography: {\n fontFamily: \"system-ui, 'Helvetica Neue', Helvetica, Arial\",\n h6: {\n fontSize: '1rem',\n },\n },\n overrides: {\n MuiAutocomplete: {\n popper: {\n background: bLight['500'],\n },\n },\n MuiCard: {\n root: {\n marginLeft: '1%',\n marginRight: '1%',\n background: bLight['500'],\n },\n },\n MuiPopover: {\n paper: {\n backgroundColor: bLight['500'],\n '& .MuiListItemIcon-root': {\n color: '#656565',\n },\n },\n },\n MuiTypography: {\n colorTextSecondary: {\n color: '#0a0a0a',\n },\n },\n MuiDialog: {\n paper: {\n backgroundColor: bLight['500'],\n },\n },\n MuiFormGroup: {\n root: {\n color: bLight['500'],\n },\n },\n MuiMenuItem: {\n root: {\n fontSize: '0.875rem',\n },\n },\n MuiDivider: {\n root: {\n margin: '.75rem 0',\n },\n },\n MuiFormLabel: {\n root: {\n color: '#91b1b0',\n },\n },\n MuiCheckbox: {\n root: {\n color: '#616161',\n },\n },\n MuiIconButton: {\n label: {},\n },\n MuiButton: {\n root: {\n background: '#fff',\n color: '#000',\n border: '1px solid transparent',\n borderRadius: 500,\n '&:hover': {\n background: `${bLight['300']} !important`,\n color: '#fff',\n },\n },\n containedPrimary: {\n backgroundColor: '#fff',\n },\n textPrimary: {\n backgroundColor: bLight['300'],\n '& span': {\n color: '#fff',\n },\n '&:hover': {\n backgroundColor: '#3079ff !important',\n },\n },\n textSecondary: {\n border: '1px solid #b3b3b3',\n background: '#fff',\n '&:hover': {\n border: '1px solid #fff !important',\n background: '#dedede !important',\n },\n },\n label: {\n color: '#000',\n paddingRight: '1rem',\n paddingLeft: '0.7rem',\n },\n },\n MuiDrawer: {\n root: {\n background: bLight['500'],\n paddingTop: '10px',\n boxShadow: '-14px -7px 20px black',\n },\n '&:hover': {\n backgroundColor: '#000',\n },\n },\n MuiTableRow: {\n root: {\n padding: '10px 0',\n transition: 'background-color .3s ease',\n '&:hover': {\n backgroundColor: '#e4e4e4 !important',\n },\n '@global': {\n 'td:nth-child(4)': {\n color: '#3c3c3c !important',\n },\n },\n },\n head: {\n backgroundColor: '#e0efff',\n },\n },\n MuiTableCell: {\n root: {\n borderBottom: '1px solid #1d1d1d',\n padding: '10px !important',\n color: '#656565 !important',\n },\n head: {\n borderBottom: '1px solid #282828',\n fontSize: '0.75rem',\n textTransform: 'uppercase',\n letterSpacing: 1.2,\n },\n },\n MuiAppBar: {\n positionFixed: {\n background: `${bLight['500']} !important`,\n boxShadow: '13px -12px 20px 0px #000',\n },\n colorSecondary: {\n color: bLight['300'],\n },\n },\n NDAppBar: {\n icon: {\n color: '#fff',\n },\n },\n NDAlbumGridView: {\n albumName: {\n marginTop: '0.5rem',\n fontWeight: 700,\n textTransform: 'none',\n color: '#000000b0',\n },\n albumSubtitle: {\n color: '#000000ad',\n display: 'block',\n },\n albumContainer: {\n backgroundColor: '#e0efff7d',\n borderRadius: '.5rem',\n padding: '.75rem',\n transition: 'background-color .3s ease',\n '&:hover': {\n backgroundColor: '#c6dbff',\n },\n },\n albumPlayButton: {\n backgroundColor: bLight['500'],\n borderRadius: '50%',\n boxShadow: '0 8px 8px rgb(0 0 0 / 30%)',\n padding: '0.35rem',\n transition: 'padding .3s ease',\n color: bLight['300'],\n '&:hover': {\n background: `${bLight['300']} !important`,\n padding: '0.45rem',\n color: bLight['500'],\n },\n },\n },\n NDPlaylistDetails: {\n container: {\n borderRadius: 0,\n paddingTop: '2.5rem !important',\n boxShadow: 'none',\n },\n title: {\n fontSize: 'calc(1.5rem + 1.5vw);',\n fontWeight: 700,\n color: '#000000b0',\n },\n details: {\n fontSize: '.875rem',\n color: 'rgba(255,255,255, 0.8)',\n },\n },\n NDAlbumDetails: {\n root: {\n borderRadius: 0,\n boxShadow: '-1px 1px 6px 0px #00000057',\n },\n cardContents: {\n alignItems: 'center',\n paddingTop: '1.5rem',\n },\n recordName: {\n fontSize: 'calc(1rem + 1.5vw);',\n fontWeight: 700,\n },\n recordArtist: {\n fontSize: '.875rem',\n fontWeight: 700,\n },\n recordMeta: {\n fontSize: '.875rem',\n color: 'rgb(113 113 113 / 80%)',\n },\n commentBlock: {\n fontSize: '.875rem',\n color: 'rgb(113 113 113 / 80%)',\n },\n },\n NDAlbumShow: {\n albumActions: musicListActions,\n },\n NDPlaylistShow: {\n playlistActions: musicListActions,\n },\n NDSubMenu: {\n icon: {\n color: '#656565',\n },\n },\n NDAudioPlayer: {\n audioTitle: {\n color: '#000',\n fontSize: '0.875rem',\n },\n songTitle: {\n fontWeight: 400,\n },\n songInfo: {\n fontSize: '0.675rem',\n color: '#b3b3b3',\n },\n player: {},\n },\n NDLogin: {\n actions: {\n '& button': {\n backgroundColor: '#3c9cff',\n },\n },\n systemNameLink: {\n textDecoration: 'none',\n color: bLight['300'],\n },\n systemName: {\n marginTop: '0.5em',\n marginBottom: '1em',\n },\n icon: {\n backgroundColor: 'transparent',\n width: '100px',\n height: '100px',\n },\n card: {\n minWidth: 300,\n marginTop: '6em',\n overflow: 'visible',\n backgroundColor: '#ffffffe6',\n },\n avatar: {\n marginTop: '-50px',\n },\n },\n RaLayout: {\n content: {\n padding: '0 !important',\n },\n },\n RaListToolbar: {\n toolbar: {\n padding: '0 .55rem !important',\n },\n },\n RaDatagridHeaderCell: {\n icon: {\n color: '#717171 !important',\n },\n },\n RaSearchInput: {\n input: {\n paddingLeft: '.9rem',\n border: 0,\n },\n },\n RaFilterButton: {\n root: {\n marginRight: '1rem',\n '& button': {\n color: '#0f0f0f',\n backgroundColor: '#fff',\n '& span': {\n color: '#101010',\n },\n '&:hover': {\n backgroundColor: '#dedede !important',\n },\n },\n },\n },\n RaAutocompleteSuggestionList: {\n suggestionsPaper: {\n backgroundColor: '#fff',\n },\n },\n RaLink: {\n link: {\n color: '#287eff',\n },\n },\n RaLogout: {\n icon: {\n color: '#f90000!important',\n },\n },\n RaMenuItemLink: {\n root: {\n color: '#232323 !important',\n '& .MuiListItemIcon-root': {\n color: '#656565',\n },\n },\n active: {\n backgroundColor: '#44a0ff1f',\n color: '#232323 !important',\n '& .MuiListItemIcon-root': {\n color: '#0066ff',\n },\n },\n },\n RaSidebar: {\n drawerPaper: {\n '@media (min-width: 0px) and (max-width: 599.95px)': {\n backgroundColor: `${bLight['500']} !important`,\n },\n },\n },\n RaBulkActionsToolbar: {\n toolbar: {\n backgroundColor: bLight['500'],\n },\n },\n RaPaginationActions: {\n button: {\n backgroundColor: 'inherit',\n minWidth: 48,\n margin: '0 4px',\n border: '1px solid #282828',\n '@global': {\n '> .MuiButton-label': {\n padding: 0,\n },\n },\n },\n actions: {\n '@global': {\n '.next-page': {\n marginLeft: 8,\n marginRight: 8,\n },\n '.previous-page': {\n marginRight: 8,\n },\n },\n },\n },\n },\n player: {\n theme: 'light',\n },\n}\n","import LightTheme from './light'\nimport DarkTheme from './dark'\nimport ExtraDarkTheme from './extradark'\nimport GreenTheme from './green'\nimport SpotifyTheme from './spotify'\nimport LigeraTheme from './ligera'\n\nexport default {\n // Classic default themes\n LightTheme,\n DarkTheme,\n\n // New themes should be added here, in alphabetic order\n ExtraDarkTheme,\n GreenTheme,\n LigeraTheme,\n SpotifyTheme,\n}\n","export default {\n themeName: 'Light',\n palette: {\n secondary: {\n light: '#5f5fc4',\n dark: '#001064',\n main: '#3f51b5',\n contrastText: '#fff',\n },\n },\n overrides: {\n MuiFilledInput: {\n root: {\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n '&$disabled': {\n backgroundColor: 'rgba(0, 0, 0, 0.04)',\n },\n },\n },\n NDLogin: {\n main: {\n '& .MuiFormLabel-root': {\n color: '#000000',\n },\n '& .MuiFormLabel-root.Mui-focused': {\n color: '#0085ff',\n },\n '& .MuiFormLabel-root.Mui-error': {\n color: '#f44336',\n },\n '& .MuiInput-underline:after': {\n borderBottom: '2px solid #0085ff',\n },\n },\n card: {\n minWidth: 300,\n marginTop: '6em',\n backgroundColor: '#ffffffe6',\n },\n avatar: {},\n icon: {},\n button: {\n boxShadow: '3px 3px 5px #000000a3',\n },\n systemNameLink: {\n color: '#0085ff',\n },\n },\n },\n player: {\n theme: 'light',\n },\n}\n","import { useSelector } from 'react-redux'\nimport useMediaQuery from '@material-ui/core/useMediaQuery'\nimport themes from './index'\nimport { AUTO_THEME_ID } from '../consts'\nimport config from '../config'\n\nexport default () => {\n const prefersLightMode = useMediaQuery('(prefers-color-scheme: light)')\n return useSelector((state) => {\n if (state.theme === AUTO_THEME_ID) {\n return prefersLightMode ? themes.LightTheme : themes.DarkTheme\n }\n const themeName =\n state.theme ||\n Object.keys(themes).find(\n (t) => themes[t].themeName === config.defaultTheme\n ) ||\n 'DarkTheme'\n return themes[themeName]\n })\n}\n","import React, { useState, useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport { Field, Form } from 'react-final-form'\nimport { useDispatch } from 'react-redux'\nimport Button from '@material-ui/core/Button'\nimport Card from '@material-ui/core/Card'\nimport CardActions from '@material-ui/core/CardActions'\nimport CircularProgress from '@material-ui/core/CircularProgress'\nimport TextField from '@material-ui/core/TextField'\nimport { createMuiTheme, makeStyles } from '@material-ui/core/styles'\nimport { ThemeProvider } from '@material-ui/styles'\nimport Logo from '../icons/android-icon-192x192.png'\nimport { useLogin, useNotify, useTranslate } from 'react-admin'\n\nimport Notification from './Notification'\nimport useCurrentTheme from '../themes/useCurrentTheme'\nimport config from '../config'\nimport { clearQueue } from '../actions'\n\nconst useStyles = makeStyles(\n (theme) => ({\n main: {\n display: 'flex',\n flexDirection: 'column',\n minHeight: '100vh',\n alignItems: 'center',\n justifyContent: 'flex-start',\n background: `url(${config.loginBackgroundURL})`,\n backgroundRepeat: 'no-repeat',\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n },\n card: {\n minWidth: 300,\n marginTop: '6em',\n overflow: 'visible',\n },\n avatar: {\n margin: '1em',\n display: 'flex',\n justifyContent: 'center',\n marginTop: '-3em',\n },\n icon: {\n backgroundColor: 'transparent',\n width: '6.3em',\n height: '6.3em',\n },\n systemName: {\n marginTop: '1em',\n display: 'flex',\n justifyContent: 'center',\n color: '#3f51b5', //theme.palette.grey[500]\n },\n welcome: {\n marginTop: '1em',\n padding: '0 1em 1em 1em',\n display: 'flex',\n justifyContent: 'center',\n flexWrap: 'wrap',\n color: '#3f51b5', //theme.palette.grey[500]\n },\n form: {\n padding: '0 1em 1em 1em',\n },\n input: {\n marginTop: '1em',\n },\n actions: {\n padding: '0 1em 1em 1em',\n },\n button: {},\n systemNameLink: {\n textDecoration: 'none',\n },\n }),\n { name: 'NDLogin' }\n)\n\nconst renderInput = ({\n meta: { touched, error } = {},\n input: { ...inputProps },\n ...props\n}) => (\n \n)\n\nconst FormLogin = ({ loading, handleSubmit, validate }) => {\n const translate = useTranslate()\n const classes = useStyles()\n\n return (\n (\n
\n
\n \n
\n {'logo'}\n
\n
\n \n Navidrome\n \n
\n {config.welcomeMessage && (\n \n )}\n
\n
\n \n
\n
\n \n
\n
\n \n \n {loading && }\n {translate('ra.auth.sign_in')}\n \n \n
\n \n
\n
\n )}\n />\n )\n}\n\nconst FormSignUp = ({ loading, handleSubmit, validate }) => {\n const translate = useTranslate()\n const classes = useStyles()\n\n return (\n (\n
\n
\n \n
\n {'logo'}\n
\n
\n {translate('ra.auth.welcome1')}\n
\n
\n {translate('ra.auth.welcome2')}\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n \n {loading && }\n {translate('ra.auth.buttonCreateAdmin')}\n \n \n
\n \n
\n
\n )}\n />\n )\n}\nconst Login = ({ location }) => {\n const [loading, setLoading] = useState(false)\n const translate = useTranslate()\n const notify = useNotify()\n const login = useLogin()\n const dispatch = useDispatch()\n\n const handleSubmit = useCallback(\n (auth) => {\n setLoading(true)\n dispatch(clearQueue())\n login(auth, location.state ? location.state.nextPathname : '/').catch(\n (error) => {\n setLoading(false)\n notify(\n typeof error === 'string'\n ? error\n : typeof error === 'undefined' || !error.message\n ? 'ra.auth.sign_in_error'\n : error.message,\n 'warning'\n )\n }\n )\n },\n [dispatch, login, notify, setLoading, location]\n )\n\n const validateLogin = useCallback(\n (values) => {\n const errors = {}\n if (!values.username) {\n errors.username = translate('ra.validation.required')\n }\n if (!values.password) {\n errors.password = translate('ra.validation.required')\n }\n return errors\n },\n [translate]\n )\n\n const validateSignup = useCallback(\n (values) => {\n const errors = validateLogin(values)\n const regex = /^\\w+$/g\n if (values.username && !values.username.match(regex)) {\n errors.username = translate('ra.validation.invalidChars')\n }\n if (!values.confirmPassword) {\n errors.confirmPassword = translate('ra.validation.required')\n }\n if (values.confirmPassword !== values.password) {\n errors.confirmPassword = translate('ra.validation.passwordDoesNotMatch')\n }\n return errors\n },\n [translate, validateLogin]\n )\n\n if (config.firstTime) {\n return (\n \n )\n }\n return (\n \n )\n}\n\nLogin.propTypes = {\n authProvider: PropTypes.func,\n previousRoute: PropTypes.string,\n}\n\n// We need to put the ThemeProvider decoration in another component\n// Because otherwise the useStyles() hook used in Login won't get\n// the right theme\nconst LoginWithTheme = (props) => {\n const theme = useCurrentTheme()\n return (\n \n \n \n )\n}\n\nexport default LoginWithTheme\n","import React, { useCallback } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Logout } from 'react-admin'\nimport { clearQueue } from '../actions'\n\nexport default (props) => {\n const dispatch = useDispatch()\n const handleClick = useCallback(() => dispatch(clearQueue()), [dispatch])\n\n return (\n \n \n \n )\n}\n","import React, { Fragment } from 'react'\nimport ExpandMore from '@material-ui/icons/ExpandMore'\nimport List from '@material-ui/core/List'\nimport MenuItem from '@material-ui/core/MenuItem'\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\nimport Typography from '@material-ui/core/Typography'\nimport Divider from '@material-ui/core/Divider'\nimport Collapse from '@material-ui/core/Collapse'\nimport Tooltip from '@material-ui/core/Tooltip'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { useTranslate } from 'react-admin'\n\nconst useStyles = makeStyles(\n (theme) => ({\n icon: { minWidth: theme.spacing(5) },\n sidebarIsOpen: {\n paddingLeft: 25,\n transition: 'padding-left 195ms cubic-bezier(0.4, 0, 0.6, 1) 0ms',\n },\n sidebarIsClosed: {\n paddingLeft: 0,\n transition: 'padding-left 195ms cubic-bezier(0.4, 0, 0.6, 1) 0ms',\n },\n }),\n {\n name: 'NDSubMenu',\n }\n)\n\nconst SubMenu = ({\n handleToggle,\n sidebarIsOpen,\n isOpen,\n name,\n icon,\n children,\n dense,\n}) => {\n const translate = useTranslate()\n const classes = useStyles()\n\n const header = (\n \n \n {isOpen ? : icon}\n \n \n {translate(name)}\n \n \n )\n\n return (\n \n {sidebarIsOpen || isOpen ? (\n header\n ) : (\n \n {header}\n \n )}\n \n \n {children}\n \n \n \n \n )\n}\n\nexport default SubMenu\n","import PropTypes from 'prop-types'\nimport { useLocation } from 'react-router-dom'\nimport { createElement } from 'react'\n\nconst DynamicMenuIcon = ({ icon, activeIcon, path }) => {\n const location = useLocation()\n\n if (!activeIcon) {\n return createElement(icon, { 'data-testid': 'icon' })\n }\n\n return location.pathname.startsWith('/' + path)\n ? createElement(activeIcon, { 'data-testid': 'activeIcon' })\n : createElement(icon, { 'data-testid': 'icon' })\n}\n\nDynamicMenuIcon.propTypes = {\n path: PropTypes.string.isRequired,\n icon: PropTypes.object.isRequired,\n activeIcon: PropTypes.object,\n}\n\nexport default DynamicMenuIcon\n","import React from 'react'\nimport ShuffleIcon from '@material-ui/icons/Shuffle'\nimport LibraryAddIcon from '@material-ui/icons/LibraryAdd'\nimport VideoLibraryIcon from '@material-ui/icons/VideoLibrary'\nimport RepeatIcon from '@material-ui/icons/Repeat'\nimport AlbumIcon from '@material-ui/icons/Album'\nimport FavoriteIcon from '@material-ui/icons/Favorite'\nimport FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder'\nimport StarIcon from '@material-ui/icons/Star'\nimport StarBorderIcon from '@material-ui/icons/StarBorder'\nimport AlbumOutlinedIcon from '@material-ui/icons/AlbumOutlined'\nimport LibraryAddOutlinedIcon from '@material-ui/icons/LibraryAddOutlined'\nimport VideoLibraryOutlinedIcon from '@material-ui/icons/VideoLibraryOutlined'\nimport config from '../config'\nimport DynamicMenuIcon from '../layout/DynamicMenuIcon'\n\nexport default {\n all: {\n icon: (\n \n ),\n params: 'sort=name&order=ASC',\n },\n random: {\n icon: ,\n params: 'sort=random&order=ASC',\n },\n ...(config.enableFavourites && {\n starred: {\n icon: (\n \n ),\n params: 'sort=starred_at&order=DESC&filter={\"starred\":true}',\n },\n }),\n ...(config.enableStarRating && {\n topRated: {\n icon: (\n \n ),\n params: 'sort=rating&order=DESC&filter={\"has_rating\":true}',\n },\n }),\n recentlyAdded: {\n icon: (\n \n ),\n params: 'sort=recently_added&order=DESC',\n },\n recentlyPlayed: {\n icon: (\n \n ),\n params: 'sort=play_date&order=DESC&filter={\"recently_played\":true}',\n },\n mostPlayed: {\n icon: ,\n params: 'sort=play_count&order=DESC&filter={\"recently_played\":true}',\n },\n}\n\nexport const defaultAlbumList = 'recentlyAdded'\n","import { withStyles } from '@material-ui/core/styles'\nimport MuiDialogTitle from '@material-ui/core/DialogTitle'\nimport Typography from '@material-ui/core/Typography'\nimport IconButton from '@material-ui/core/IconButton'\nimport CloseIcon from '@material-ui/icons/Close'\nimport React from 'react'\n\nconst styles = (theme) => ({\n root: {\n margin: 0,\n padding: theme.spacing(2),\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n})\n\nexport const DialogTitle = withStyles(styles)((props) => {\n const { children, classes, onClose, ...other } = props\n return (\n \n {children}\n \n \n \n \n )\n})\n","import { withStyles } from '@material-ui/core/styles'\nimport MuiDialogContent from '@material-ui/core/DialogContent'\n\nexport const DialogContent = withStyles((theme) => ({\n root: {\n padding: theme.spacing(2),\n },\n}))(MuiDialogContent)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Link from '@material-ui/core/Link'\nimport Dialog from '@material-ui/core/Dialog'\nimport IconButton from '@material-ui/core/IconButton'\nimport TableContainer from '@material-ui/core/TableContainer'\nimport Table from '@material-ui/core/Table'\nimport TableBody from '@material-ui/core/TableBody'\nimport TableRow from '@material-ui/core/TableRow'\nimport TableCell from '@material-ui/core/TableCell'\nimport Paper from '@material-ui/core/Paper'\nimport FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder'\nimport inflection from 'inflection'\nimport { useTranslate } from 'react-admin'\nimport config from '../config'\nimport { DialogTitle } from './DialogTitle'\nimport { DialogContent } from './DialogContent'\n\nconst links = {\n homepage: 'navidrome.org',\n reddit: 'reddit.com/r/Navidrome',\n twitter: 'twitter.com/navidrome',\n discord: 'discord.gg/xh7j7yF',\n source: 'github.com/navidrome/navidrome',\n featureRequests: 'github.com/navidrome/navidrome/issues',\n}\n\nconst LinkToVersion = ({ version }) => {\n if (version === 'dev') {\n return {version}\n }\n\n const parts = version.split(' ')\n const commitID = parts[1].replace(/[()]/g, '')\n const isSnapshot = version.includes('SNAPSHOT')\n const url = isSnapshot\n ? `https://github.com/navidrome/navidrome/compare/v${\n parts[0].split('-')[0]\n }...${commitID}`\n : `https://github.com/navidrome/navidrome/releases/tag/v${parts[0]}`\n return (\n \n \n {parts[0]}\n \n {' (' + commitID + ')'}\n \n )\n}\n\nconst AboutDialog = ({ open, onClose }) => {\n const translate = useTranslate()\n return (\n \n \n Navidrome Music Server\n \n \n \n \n \n \n \n {translate('menu.version')}:\n \n \n \n {Object.keys(links).map((key) => {\n return (\n \n \n {translate(`about.links.${key}`, {\n _: inflection.humanize(inflection.underscore(key)),\n })}\n :\n \n \n \n {links[key]}\n \n \n \n )\n })}\n \n \n \n \n \n \n \n \n \n \n ko-fi.com/deluan\n \n \n \n \n
\n
\n
\n \n )\n}\n\nAboutDialog.propTypes = {\n open: PropTypes.bool.isRequired,\n onClose: PropTypes.func.isRequired,\n}\n\nexport { AboutDialog, LinkToVersion }\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { useDispatch } from 'react-redux'\nimport { Button, useTranslate, useUnselectAll } from 'react-admin'\nimport PlaylistAddIcon from '@material-ui/icons/PlaylistAdd'\nimport { openAddToPlaylist } from '../actions'\n\nexport const AddToPlaylistButton = ({ resource, selectedIds, className }) => {\n const translate = useTranslate()\n const dispatch = useDispatch()\n const unselectAll = useUnselectAll()\n\n const handleClick = () => {\n dispatch(\n openAddToPlaylist({ selectedIds, onSuccess: () => unselectAll(resource) })\n )\n }\n\n return (\n \n \n \n )\n}\n\nAddToPlaylistButton.propTypes = {\n resource: PropTypes.string.isRequired,\n selectedIds: PropTypes.arrayOf(PropTypes.string).isRequired,\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Link } from 'react-admin'\nimport { useAlbumsPerPage } from './index'\nimport { withWidth } from '@material-ui/core'\n\nexport const useGetHandleArtistClick = (width) => {\n const [perPage] = useAlbumsPerPage(width)\n\n return (id) => {\n return `/album?filter={\"artist_id\":\"${id}\"}&order=ASC&sort=maxYear&displayedFilters={\"compilation\":true}&perPage=${perPage}`\n }\n}\n\nexport const ArtistLinkField = withWidth()(({ record, className, width }) => {\n const artistLink = useGetHandleArtistClick(width)\n return (\n e.stopPropagation()}\n className={className}\n >\n {record.albumArtist}\n \n )\n})\n\nArtistLinkField.propTypes = {\n record: PropTypes.object,\n className: PropTypes.string,\n}\n\nArtistLinkField.defaultProps = {\n addLabel: true,\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport {\n Button,\n useDataProvider,\n useTranslate,\n useUnselectAll,\n useNotify,\n} from 'react-admin'\nimport { useDispatch } from 'react-redux'\n\nexport const BatchPlayButton = ({\n resource,\n selectedIds,\n action,\n label,\n icon,\n className,\n}) => {\n const dispatch = useDispatch()\n const translate = useTranslate()\n const dataProvider = useDataProvider()\n const unselectAll = useUnselectAll()\n const notify = useNotify()\n\n const addToQueue = () => {\n dataProvider\n .getMany(resource, { ids: selectedIds })\n .then((response) => {\n // Add tracks to a map for easy lookup by ID, needed for the next step\n const tracks = response.data.reduce(\n (acc, cur) => ({ ...acc, [cur.id]: cur }),\n {}\n )\n // Add the tracks to the queue in the selection order\n dispatch(action(tracks, selectedIds))\n })\n .catch(() => {\n notify('ra.page.error', 'warning')\n })\n unselectAll(resource)\n }\n\n const caption = translate(label)\n return (\n \n {icon}\n \n )\n}\n\nBatchPlayButton.propTypes = {\n action: PropTypes.func.isRequired,\n label: PropTypes.string.isRequired,\n icon: PropTypes.object.isRequired,\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nexport const BitrateField = ({ record = {}, source }) => {\n return {`${record[source]} kbps`}\n}\n\nBitrateField.propTypes = {\n label: PropTypes.string,\n record: PropTypes.object,\n source: PropTypes.string.isRequired,\n}\n\nBitrateField.defaultProps = {\n addLabel: true,\n}\n","import { fetchUtils } from 'react-admin'\nimport { baseUrl } from '../utils'\n\nconst url = (command, id, options) => {\n const params = new URLSearchParams()\n params.append('u', localStorage.getItem('username'))\n params.append('t', localStorage.getItem('subsonic-token'))\n params.append('s', localStorage.getItem('subsonic-salt'))\n params.append('f', 'json')\n params.append('v', '1.8.0')\n params.append('c', 'NavidromeUI')\n id && params.append('id', id)\n if (options) {\n if (options.ts) {\n options['_'] = new Date().getTime()\n delete options.ts\n }\n Object.keys(options).forEach((k) => {\n params.append(k, options[k])\n })\n }\n const url = `/rest/${command}?${params.toString()}`\n return baseUrl(url)\n}\n\nconst scrobble = (id, submit) =>\n fetchUtils.fetchJson(url('scrobble', id, { submission: submit }))\n\nconst star = (id) => fetchUtils.fetchJson(url('star', id))\n\nconst unstar = (id) => fetchUtils.fetchJson(url('unstar', id))\n\nconst download = (id) => (window.location.href = url('download', id))\n\nconst getCoverArtUrl = (record, size) => {\n const options = {\n ...(record.updatedAt && { _: record.updatedAt }),\n ...(size && { size }),\n }\n return url('getCoverArt', record.coverArtId || 'not_found', options)\n}\n\nconst setRating = (id, rating) =>\n fetchUtils.fetchJson(url('setRating', id, { rating }))\n\nexport default {\n url,\n getCoverArtUrl,\n scrobble,\n download,\n star,\n unstar,\n setRating,\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { useDataProvider, useNotify } from 'react-admin'\nimport subsonic from '../subsonic'\n\nexport const useToggleLove = (resource, record = {}) => {\n const [loading, setLoading] = useState(false)\n const notify = useNotify()\n\n const mountedRef = useRef(false)\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const dataProvider = useDataProvider()\n\n const refreshRecord = useCallback(() => {\n dataProvider.getOne(resource, { id: record.id }).then(() => {\n if (mountedRef.current) {\n setLoading(false)\n }\n })\n }, [dataProvider, record.id, resource])\n\n const toggleLove = () => {\n const toggle = record.starred ? subsonic.unstar : subsonic.star\n\n setLoading(true)\n toggle(record.id)\n .then(refreshRecord)\n .catch((e) => {\n console.log('Error toggling love: ', e)\n notify('ra.page.error', 'warning')\n if (mountedRef.current) {\n setLoading(false)\n }\n })\n }\n\n return [toggleLove, loading]\n}\n","import React, { useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport FavoriteIcon from '@material-ui/icons/Favorite'\nimport FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder'\nimport IconButton from '@material-ui/core/IconButton'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { useToggleLove } from './useToggleLove'\n\nconst useStyles = makeStyles({\n love: {\n color: (props) => props.color,\n visibility: (props) =>\n props.visible === false ? 'hidden' : props.loved ? 'visible' : 'inherit',\n },\n})\n\nexport const LoveButton = ({\n resource,\n record,\n color,\n visible,\n size,\n component: Button,\n addLabel,\n disabled,\n ...rest\n}) => {\n const classes = useStyles({ color, visible, loved: record.starred })\n const [toggleLove, loading] = useToggleLove(resource, record)\n\n const handleToggleLove = useCallback(\n (e) => {\n e.preventDefault()\n toggleLove()\n e.stopPropagation()\n },\n [toggleLove]\n )\n\n return (\n \n {record.starred ? (\n \n ) : (\n \n )}\n \n )\n}\n\nLoveButton.propTypes = {\n resource: PropTypes.string.isRequired,\n record: PropTypes.object.isRequired,\n visible: PropTypes.bool,\n color: PropTypes.string,\n size: PropTypes.string,\n component: PropTypes.object,\n disabled: PropTypes.bool,\n}\n\nLoveButton.defaultProps = {\n addLabel: true,\n record: {},\n visible: true,\n size: 'small',\n color: 'inherit',\n component: IconButton,\n disabled: false,\n}\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { useDispatch } from 'react-redux'\nimport IconButton from '@material-ui/core/IconButton'\nimport Menu from '@material-ui/core/Menu'\nimport MenuItem from '@material-ui/core/MenuItem'\nimport MoreVertIcon from '@material-ui/icons/MoreVert'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { useDataProvider, useNotify, useTranslate } from 'react-admin'\nimport clsx from 'clsx'\nimport {\n playNext,\n addTracks,\n playTracks,\n shuffleTracks,\n openAddToPlaylist,\n} from '../actions'\nimport subsonic from '../subsonic'\nimport { LoveButton } from './LoveButton'\nimport config from '../config'\nimport { formatBytes } from '../utils'\n\nconst useStyles = makeStyles({\n noWrap: {\n whiteSpace: 'nowrap',\n },\n menu: {\n color: (props) => props.color,\n },\n})\n\nconst ContextMenu = ({\n resource,\n showLove,\n record,\n color,\n className,\n songQueryParams,\n}) => {\n const classes = useStyles({ color })\n const dataProvider = useDataProvider()\n const dispatch = useDispatch()\n const translate = useTranslate()\n const notify = useNotify()\n const [anchorEl, setAnchorEl] = useState(null)\n\n const options = {\n play: {\n enabled: true,\n needData: true,\n label: translate('resources.album.actions.playAll'),\n action: (data, ids) => dispatch(playTracks(data, ids)),\n },\n playNext: {\n enabled: true,\n needData: true,\n label: translate('resources.album.actions.playNext'),\n action: (data, ids) => dispatch(playNext(data, ids)),\n },\n addToQueue: {\n enabled: true,\n needData: true,\n label: translate('resources.album.actions.addToQueue'),\n action: (data, ids) => dispatch(addTracks(data, ids)),\n },\n shuffle: {\n enabled: true,\n needData: true,\n label: translate('resources.album.actions.shuffle'),\n action: (data, ids) => dispatch(shuffleTracks(data, ids)),\n },\n addToPlaylist: {\n enabled: true,\n needData: true,\n label: translate('resources.album.actions.addToPlaylist'),\n action: (data, ids) => dispatch(openAddToPlaylist({ selectedIds: ids })),\n },\n download: {\n enabled: config.enableDownloads && record.size,\n needData: false,\n label: `${translate('resources.album.actions.download')} (${formatBytes(\n record.size\n )})`,\n action: () => subsonic.download(record.id),\n },\n }\n\n const handleClick = (e) => {\n e.preventDefault()\n setAnchorEl(e.currentTarget)\n e.stopPropagation()\n }\n\n const handleOnClose = (e) => {\n e.preventDefault()\n setAnchorEl(null)\n e.stopPropagation()\n }\n\n let extractSongsData = function (response) {\n const data = response.data.reduce(\n (acc, cur) => ({ ...acc, [cur.id]: cur }),\n {}\n )\n const ids = response.data.map((r) => r.id)\n return { data, ids }\n }\n\n const handleItemClick = (e) => {\n setAnchorEl(null)\n const key = e.target.getAttribute('value')\n if (options[key].needData) {\n dataProvider\n .getList('albumSong', songQueryParams)\n .then((response) => {\n let { data, ids } = extractSongsData(response)\n options[key].action(data, ids)\n })\n .catch(() => {\n notify('ra.page.error', 'warning')\n })\n } else {\n options[key].action()\n }\n\n e.stopPropagation()\n }\n\n const open = Boolean(anchorEl)\n\n return (\n \n \n \n \n \n \n {Object.keys(options).map(\n (key) =>\n options[key].enabled && (\n \n {options[key].label}\n \n )\n )}\n \n \n )\n}\n\nexport const AlbumContextMenu = (props) =>\n props.record ? (\n \n ) : null\n\nAlbumContextMenu.propTypes = {\n record: PropTypes.object,\n discNumber: PropTypes.number,\n color: PropTypes.string,\n showLove: PropTypes.bool,\n}\n\nAlbumContextMenu.defaultProps = {\n showLove: true,\n addLabel: true,\n}\n\nexport const ArtistContextMenu = (props) =>\n props.record ? (\n \n ) : null\n\nArtistContextMenu.propTypes = {\n record: PropTypes.object,\n color: PropTypes.string,\n showLove: PropTypes.bool,\n}\n\nArtistContextMenu.defaultProps = {\n showLove: true,\n addLabel: true,\n}\n","import React from 'react'\nimport { docsUrl } from '../utils'\n\nexport const DocLink = ({ path, children }) => (\n \n {children}\n \n)\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { formatDuration } from '../utils'\n\nexport const DurationField = ({ record = {}, source }) => {\n try {\n return {formatDuration(record[source])}\n } catch (e) {\n console.log('Error in DurationField! Record:', record)\n return 00:00\n }\n}\n\nDurationField.propTypes = {\n label: PropTypes.string,\n record: PropTypes.object,\n source: PropTypes.string.isRequired,\n}\n\nDurationField.defaultProps = {\n addLabel: true,\n}\n","import React from 'react'\nimport { Pagination as RAPagination } from 'react-admin'\n\nexport const Pagination = (props) => (\n \n)\n","import React from 'react'\nimport { List as RAList } from 'react-admin'\nimport { Pagination } from './Pagination'\nimport { Title } from './index'\n\nexport const List = (props) => {\n const { resource } = props\n return (\n \n }\n perPage={15}\n pagination={}\n {...props}\n />\n )\n}\n","const sanitizeFieldRestProps = ({\n addLabel,\n allowEmpty,\n basePath,\n cellClassName,\n className,\n emptyText,\n formClassName,\n fullWidth,\n headerClassName,\n label,\n linkType,\n link,\n locale,\n record,\n resource,\n sortable,\n sortBy,\n sortByOrder,\n source,\n textAlign,\n translateChoice,\n ...props\n}) => props\n\nexport default sanitizeFieldRestProps\n","import React, { memo } from 'react'\nimport get from 'lodash.get'\nimport Typography from '@material-ui/core/Typography'\nimport sanitizeFieldRestProps from './sanitizeFieldRestProps'\nimport md5 from 'md5-hex'\n\nexport const MultiLineTextField = memo(\n ({\n className,\n emptyText,\n source,\n record,\n firstLine,\n maxLines,\n addLabel,\n ...rest\n }) => {\n const value = get(record, source)\n let lines = value ? value.split('\\n') : []\n if (maxLines || firstLine) {\n lines = lines.slice(firstLine, maxLines)\n }\n\n return (\n \n {lines.length === 0 && emptyText\n ? emptyText\n : lines.map((line, idx) =>\n line === '' ? (\n
\n ) : (\n \n )\n )}\n \n )\n }\n)\n\nMultiLineTextField.defaultProps = {\n record: {},\n addLabel: true,\n firstLine: 0,\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow'\nimport { IconButton } from '@material-ui/core'\nimport { useDispatch } from 'react-redux'\nimport { useDataProvider } from 'react-admin'\nimport { playTracks } from '../actions'\n\nexport const PlayButton = ({ record, size, className }) => {\n let extractSongsData = function (response) {\n const data = response.data.reduce(\n (acc, cur) => ({ ...acc, [cur.id]: cur }),\n {}\n )\n const ids = response.data.map((r) => r.id)\n return { data, ids }\n }\n const dataProvider = useDataProvider()\n const dispatch = useDispatch()\n const playAlbum = (record) => {\n dataProvider\n .getList('albumSong', {\n pagination: { page: 1, perPage: -1 },\n sort: { field: 'discNumber, trackNumber', order: 'ASC' },\n filter: { album_id: record.id, disc_number: record.discNumber },\n })\n .then((response) => {\n let { data, ids } = extractSongsData(response)\n dispatch(playTracks(data, ids))\n })\n }\n\n return (\n {\n e.stopPropagation()\n e.preventDefault()\n playAlbum(record)\n }}\n aria-label=\"play\"\n className={className}\n size={size}\n >\n \n \n )\n}\n\nPlayButton.propTypes = {\n record: PropTypes.object.isRequired,\n size: PropTypes.string,\n className: PropTypes.string,\n}\n\nPlayButton.defaultProps = {\n size: 'small',\n}\n","import React from 'react'\nimport { Chip, makeStyles } from '@material-ui/core'\nimport { useTranslate } from 'react-admin'\n\nconst useQuickFilterStyles = makeStyles((theme) => ({\n chip: {\n marginBottom: theme.spacing(1),\n },\n}))\n\nexport const QuickFilter = ({ source, label }) => {\n const translate = useTranslate()\n const classes = useQuickFilterStyles()\n const lbl = label || `resources.song.fields.${source}`\n return \n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\n\nexport const formatRange = (record, source) => {\n const nameCapitalized = source.charAt(0).toUpperCase() + source.slice(1)\n const min = record[`min${nameCapitalized}`]\n const max = record[`max${nameCapitalized}`]\n let range = []\n if (min) {\n range.push(min)\n }\n if (max && max !== min) {\n range.push(max)\n }\n return range.join('-')\n}\n\nexport const RangeField = ({ className, record = {}, source }) => {\n return {formatRange(record, source)}\n}\n\nRangeField.propTypes = {\n label: PropTypes.string,\n record: PropTypes.object,\n source: PropTypes.string.isRequired,\n}\n\nRangeField.defaultProps = {\n addLabel: true,\n}\n","import React from 'react'\nimport { Button, useDataProvider, useNotify, useTranslate } from 'react-admin'\nimport { useDispatch } from 'react-redux'\nimport ShuffleIcon from '@material-ui/icons/Shuffle'\nimport { playTracks } from '../actions'\nimport PropTypes from 'prop-types'\n\nexport const ShuffleAllButton = ({ filters }) => {\n const translate = useTranslate()\n const dataProvider = useDataProvider()\n const dispatch = useDispatch()\n const notify = useNotify()\n\n const handleOnClick = () => {\n dataProvider\n .getList('song', {\n pagination: { page: 1, perPage: 200 },\n sort: { field: 'random', order: 'ASC' },\n filter: filters,\n })\n .then((res) => {\n const data = {}\n res.data.forEach((song) => {\n data[song.id] = song\n })\n dispatch(playTracks(data))\n })\n .catch(() => {\n notify('ra.page.error', 'warning')\n })\n }\n\n return (\n \n \n \n )\n}\n\nShuffleAllButton.propTypes = {\n filters: PropTypes.object,\n}\nShuffleAllButton.defaultProps = {\n filters: {},\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Avatar from '@material-ui/core/Avatar'\nimport List from '@material-ui/core/List'\nimport ListItem from '@material-ui/core/ListItem'\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar'\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'\nimport ListItemText from '@material-ui/core/ListItemText'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { Link } from 'react-router-dom'\nimport { linkToRecord, sanitizeListRestProps } from 'ra-core'\n\nconst useStyles = makeStyles(\n {\n link: {\n textDecoration: 'none',\n color: 'inherit',\n },\n tertiary: { float: 'right', opacity: 0.541176 },\n },\n { name: 'RaSimpleList' }\n)\n\nconst LinkOrNot = ({\n classes: classesOverride,\n linkType,\n basePath,\n id,\n record,\n children,\n}) => {\n const classes = useStyles({ classes: classesOverride })\n return linkType === 'edit' || linkType === true ? (\n \n {children}\n \n ) : linkType === 'show' ? (\n \n {children}\n \n ) : typeof linkType === 'function' ? (\n linkType(id, basePath, record)}>{children}\n ) : (\n {children}\n )\n}\n\nexport const SimpleList = ({\n basePath,\n className,\n classes: classesOverride,\n data,\n hasBulkActions,\n ids,\n loading,\n leftAvatar,\n leftIcon,\n linkType,\n onToggleItem,\n primaryText,\n rightAvatar,\n rightIcon,\n secondaryText,\n selectedIds,\n tertiaryText,\n total,\n ...rest\n}) => {\n const classes = useStyles({ classes: classesOverride })\n return (\n (loading || total > 0) && (\n \n {ids.map((id) => (\n \n \n {leftIcon && (\n {leftIcon(data[id], id)}\n )}\n {leftAvatar && (\n \n {leftAvatar(data[id], id)}\n \n )}\n \n {primaryText(data[id], id)}\n {tertiaryText && (\n \n {tertiaryText(data[id], id)}\n \n )}\n \n }\n secondary={secondaryText && secondaryText(data[id], id)}\n />\n {(rightAvatar || rightIcon) && (\n \n {rightAvatar && {rightAvatar(data[id], id)}}\n {rightIcon && (\n {rightIcon(data[id], id)}\n )}\n \n )}\n \n \n ))}\n \n )\n )\n}\n\nSimpleList.propTypes = {\n basePath: PropTypes.string,\n className: PropTypes.string,\n classes: PropTypes.object,\n data: PropTypes.object,\n hasBulkActions: PropTypes.bool.isRequired,\n ids: PropTypes.array,\n leftAvatar: PropTypes.func,\n leftIcon: PropTypes.func,\n linkType: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.bool,\n PropTypes.func,\n ]).isRequired,\n onToggleItem: PropTypes.func,\n primaryText: PropTypes.func,\n rightAvatar: PropTypes.func,\n rightIcon: PropTypes.func,\n secondaryText: PropTypes.func,\n selectedIds: PropTypes.arrayOf(PropTypes.any).isRequired,\n tertiaryText: PropTypes.func,\n}\n\nSimpleList.defaultProps = {\n linkType: 'edit',\n hasBulkActions: false,\n selectedIds: [],\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { formatBytes } from '../utils'\n\nexport const SizeField = ({ record = {}, source }) => {\n return {formatBytes(record[source])}\n}\n\nSizeField.propTypes = {\n label: PropTypes.string,\n record: PropTypes.object,\n source: PropTypes.string.isRequired,\n}\n\nSizeField.defaultProps = {\n addLabel: true,\n}\n","import React, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { useDispatch } from 'react-redux'\nimport { useTranslate } from 'react-admin'\nimport { IconButton, Menu, MenuItem } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport MoreVertIcon from '@material-ui/icons/MoreVert'\nimport clsx from 'clsx'\nimport { playNext, addTracks, setTrack, openAddToPlaylist } from '../actions'\nimport subsonic from '../subsonic'\nimport { LoveButton } from './LoveButton'\nimport config from '../config'\nimport { formatBytes } from '../utils'\n\nconst useStyles = makeStyles({\n noWrap: {\n whiteSpace: 'nowrap',\n },\n})\n\nexport const SongContextMenu = ({\n resource,\n record,\n showLove,\n onAddToPlaylist,\n className,\n}) => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const translate = useTranslate()\n const [anchorEl, setAnchorEl] = useState(null)\n const options = {\n playNow: {\n enabled: true,\n label: translate('resources.song.actions.playNow'),\n action: (record) => dispatch(setTrack(record)),\n },\n playNext: {\n enabled: true,\n label: translate('resources.song.actions.playNext'),\n action: (record) => dispatch(playNext({ [record.id]: record })),\n },\n addToQueue: {\n enabled: true,\n label: translate('resources.song.actions.addToQueue'),\n action: (record) => dispatch(addTracks({ [record.id]: record })),\n },\n addToPlaylist: {\n enabled: true,\n label: translate('resources.song.actions.addToPlaylist'),\n action: (record) =>\n dispatch(\n openAddToPlaylist({\n selectedIds: [record.mediaFileId || record.id],\n onSuccess: (id) => onAddToPlaylist(id),\n })\n ),\n },\n download: {\n enabled: config.enableDownloads,\n label: `${translate('resources.song.actions.download')} (${formatBytes(\n record.size\n )})`,\n action: (record) => subsonic.download(record.mediaFileId || record.id),\n },\n }\n\n const handleClick = (e) => {\n setAnchorEl(e.currentTarget)\n e.stopPropagation()\n }\n\n const handleClose = (e) => {\n setAnchorEl(null)\n e.stopPropagation()\n }\n\n const handleItemClick = (e) => {\n e.preventDefault()\n setAnchorEl(null)\n const key = e.target.getAttribute('value')\n options[key].action(record)\n e.stopPropagation()\n }\n\n const open = Boolean(anchorEl)\n\n return (\n \n \n \n \n \n \n {Object.keys(options).map(\n (key) =>\n options[key].enabled && (\n \n {options[key].label}\n \n )\n )}\n \n \n )\n}\n\nSongContextMenu.propTypes = {\n resource: PropTypes.string.isRequired,\n record: PropTypes.object.isRequired,\n onAddToPlaylist: PropTypes.func,\n showLove: PropTypes.bool,\n}\n\nSongContextMenu.defaultProps = {\n onAddToPlaylist: () => {},\n record: {},\n resource: 'song',\n showLove: true,\n addLabel: true,\n}\n","import React, { isValidElement, useMemo, useCallback } from 'react'\nimport { useDispatch } from 'react-redux'\nimport { Datagrid, PureDatagridBody, PureDatagridRow } from 'react-admin'\nimport { TableCell, TableRow, Typography } from '@material-ui/core'\nimport PropTypes from 'prop-types'\nimport { makeStyles } from '@material-ui/core/styles'\nimport AlbumIcon from '@material-ui/icons/Album'\nimport clsx from 'clsx'\nimport { playTracks } from '../actions'\nimport { AlbumContextMenu } from '../common'\n\nconst useStyles = makeStyles({\n subtitle: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n verticalAlign: 'middle',\n },\n discIcon: {\n verticalAlign: 'text-top',\n marginRight: '4px',\n },\n row: {\n cursor: 'pointer',\n '&:hover': {\n '& $contextMenu': {\n visibility: 'visible',\n },\n },\n },\n headerStyle: {\n '& thead': {\n boxShadow: '0px 3px 3px rgba(0, 0, 0, 0.15)',\n },\n '& th': {\n fontWeight: 'bold',\n padding: '15px',\n },\n },\n contextMenu: {\n visibility: 'hidden',\n },\n})\n\nconst DiscSubtitleRow = ({\n record,\n onClick,\n colSpan,\n contextAlwaysVisible,\n}) => {\n const classes = useStyles()\n const handlePlayDisc = (discNumber) => () => {\n onClick(discNumber)\n }\n return (\n \n \n \n \n {record.discNumber}\n {record.discSubtitle && `: ${record.discSubtitle}`}\n \n \n \n \n \n \n )\n}\n\nexport const SongDatagridRow = ({\n record,\n children,\n firstTracks,\n contextAlwaysVisible,\n onClickDiscSubtitle,\n className,\n ...rest\n}) => {\n const classes = useStyles()\n const fields = React.Children.toArray(children).filter((c) =>\n isValidElement(c)\n )\n if (!record || !record.title) {\n return null\n }\n const childCount = fields.length\n return (\n <>\n {firstTracks.has(record.id) && (\n \n )}\n \n {fields}\n \n \n )\n}\n\nSongDatagridRow.propTypes = {\n record: PropTypes.object,\n children: PropTypes.node,\n firstTracks: PropTypes.instanceOf(Set),\n contextAlwaysVisible: PropTypes.bool,\n onClickDiscSubtitle: PropTypes.func,\n}\n\nSongDatagridRow.defaultProps = {\n onClickDiscSubtitle: () => {},\n}\n\nconst SongDatagridBody = ({\n contextAlwaysVisible,\n showDiscSubtitles,\n ...rest\n}) => {\n const dispatch = useDispatch()\n const { ids, data } = rest\n\n const playDisc = useCallback(\n (discNumber) => {\n const idsToPlay = ids.filter((id) => data[id].discNumber === discNumber)\n dispatch(playTracks(data, idsToPlay))\n },\n [dispatch, data, ids]\n )\n\n const firstTracks = useMemo(() => {\n if (!ids) {\n return new Set()\n }\n const set = new Set(\n ids\n .filter((i) => data[i])\n .reduce((acc, id) => {\n const last = acc && acc[acc.length - 1]\n if (\n acc.length === 0 ||\n (last && data[id].discNumber !== data[last].discNumber)\n ) {\n acc.push(id)\n }\n return acc\n }, [])\n )\n if (!showDiscSubtitles || set.size < 2) {\n set.clear()\n }\n return set\n }, [ids, data, showDiscSubtitles])\n\n return (\n \n }\n />\n )\n}\n\nexport const SongDatagrid = ({\n contextAlwaysVisible,\n showDiscSubtitles,\n ...rest\n}) => {\n const classes = useStyles()\n return (\n \n }\n />\n )\n}\n\nSongDatagrid.propTypes = {\n contextAlwaysVisible: PropTypes.bool,\n showDiscSubtitles: PropTypes.bool,\n classes: PropTypes.object,\n}\n","import React from 'react'\nimport Paper from '@material-ui/core/Paper'\nimport Table from '@material-ui/core/Table'\nimport TableBody from '@material-ui/core/TableBody'\nimport TableCell from '@material-ui/core/TableCell'\nimport TableContainer from '@material-ui/core/TableContainer'\nimport TableRow from '@material-ui/core/TableRow'\nimport { BooleanField, DateField, TextField, useTranslate } from 'react-admin'\nimport inflection from 'inflection'\nimport { BitrateField, SizeField } from './index'\nimport { MultiLineTextField } from './MultiLineTextField'\nimport { makeStyles } from '@material-ui/core/styles'\n\nconst useStyles = makeStyles({\n tableCell: {\n width: '17.5%',\n },\n})\n\nexport const SongDetails = (props) => {\n const classes = useStyles()\n const translate = useTranslate()\n const { record } = props\n const data = {\n path: ,\n album: ,\n discSubtitle: ,\n albumArtist: ,\n genre: ,\n compilation: ,\n bitRate: ,\n size: ,\n updatedAt: ,\n playCount: ,\n comment: ,\n }\n if (!record.discSubtitle) {\n delete data.discSubtitle\n }\n if (!record.comment) {\n delete data.comment\n }\n if (record.playCount > 0) {\n data.playDate = \n }\n return (\n \n \n \n {Object.keys(data).map((key) => {\n return (\n \n \n {translate(`resources.song.fields.${key}`, {\n _: inflection.humanize(inflection.underscore(key)),\n })}\n :\n \n {data[key]}\n \n )\n })}\n \n
\n
\n )\n}\n","import { makeStyles } from '@material-ui/core/styles'\nimport React from 'react'\nimport PropTypes from 'prop-types'\nimport { useSelector } from 'react-redux'\nimport { FunctionField } from 'react-admin'\nimport get from 'lodash.get'\nimport { useTheme } from '@material-ui/core/styles'\nimport PlayingLight from '../icons/playing-light.gif'\nimport PlayingDark from '../icons/playing-dark.gif'\nimport PausedLight from '../icons/paused-light.png'\nimport PausedDark from '../icons/paused-dark.png'\n\nconst useStyles = makeStyles({\n icon: {\n width: '32px',\n height: '32px',\n verticalAlign: 'text-top',\n marginLeft: '-8px',\n marginTop: '-7px',\n paddingRight: '3px',\n },\n text: {\n verticalAlign: 'text-top',\n },\n})\n\nexport const SongTitleField = ({ showTrackNumbers, ...props }) => {\n const theme = useTheme()\n const classes = useStyles()\n const { record } = props\n const currentTrack = useSelector((state) => get(state, 'queue.current', {}))\n const currentId = currentTrack.trackId\n const paused = currentTrack.paused\n const isCurrent =\n currentId && (currentId === record.id || currentId === record.mediaFileId)\n\n const trackName = (r) => {\n const name = r.title\n if (r.trackNumber && showTrackNumbers) {\n return r.trackNumber.toString().padStart(2, '0') + ' ' + name\n }\n return name\n }\n\n const Icon = () => {\n let icon\n if (paused) {\n icon = theme.palette.type === 'light' ? PausedLight : PausedDark\n } else {\n icon = theme.palette.type === 'light' ? PlayingLight : PlayingDark\n }\n return (\n \n )\n }\n\n return (\n <>\n {isCurrent && }\n \n \n )\n}\n\nSongTitleField.propTypes = {\n record: PropTypes.object,\n showTrackNumbers: PropTypes.bool,\n}\n\nSongTitleField.defaultProps = {\n record: {},\n showTrackNumbers: false,\n}\n","import React from 'react'\nimport { useMediaQuery } from '@material-ui/core'\nimport { useTranslate } from 'react-admin'\n\nexport const Title = ({ subTitle, args }) => {\n const translate = useTranslate()\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n const text = translate(subTitle, { ...args, _: subTitle })\n\n if (isDesktop) {\n return Navidrome {text ? ` - ${text}` : ''}\n }\n return {text ? text : 'Navidrome'}\n}\n","import React, { Fragment, useEffect } from 'react'\nimport { useUnselectAll } from 'react-admin'\nimport { addTracks, playNext, playTracks } from '../actions'\nimport { RiPlayList2Fill, RiPlayListAddFill } from 'react-icons/ri'\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow'\nimport { BatchPlayButton } from './index'\nimport { AddToPlaylistButton } from './AddToPlaylistButton'\nimport { makeStyles } from '@material-ui/core/styles'\n\nconst useStyles = makeStyles((theme) => ({\n button: {\n color: theme.palette.type === 'dark' ? 'white' : undefined,\n },\n}))\n\nexport const SongBulkActions = (props) => {\n const classes = useStyles()\n const unselectAll = useUnselectAll()\n useEffect(() => {\n unselectAll(props.resource)\n }, [unselectAll, props.resource])\n return (\n \n }\n className={classes.button}\n />\n }\n className={classes.button}\n />\n }\n className={classes.button}\n />\n \n \n )\n}\n","import { useSelector } from 'react-redux'\nimport get from 'lodash.get'\n\nconst getPerPage = (width) => {\n if (width === 'xs') return 12\n if (width === 'sm') return 12\n if (width === 'md') return 12\n if (width === 'lg') return 18\n return 36\n}\n\nconst getPerPageOptions = (width) => {\n const options = [3, 6, 12]\n if (width === 'xs') return [12]\n if (width === 'sm') return [12]\n if (width === 'md') return options.map((v) => v * 4)\n return options.map((v) => v * 6)\n}\n\nexport const useAlbumsPerPage = (width) => {\n const perPage =\n useSelector((state) =>\n get(state.admin.resources, ['album', 'list', 'params', 'perPage'])\n ) || getPerPage(width)\n\n return [perPage, getPerPageOptions(width)]\n}\n","import { cloneElement, Children, isValidElement } from 'react'\n\nexport const isWritable = (owner) => {\n return (\n localStorage.getItem('username') === owner ||\n localStorage.getItem('role') === 'admin'\n )\n}\n\nexport const isReadOnly = (owner) => {\n return !isWritable(owner)\n}\n\nexport const Writable = (props) => {\n const { record = {}, children } = props\n if (isWritable(record.owner)) {\n return Children.map(children, (child) =>\n isValidElement(child) ? cloneElement(child, props) : child\n )\n }\n return null\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport List from '@material-ui/core/List'\nimport ListItem from '@material-ui/core/ListItem'\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'\nimport ListItemText from '@material-ui/core/ListItemText'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { sanitizeListRestProps } from 'ra-core'\nimport { DurationField, SongContextMenu, RatingField } from './index'\nimport { setTrack } from '../actions'\nimport { useDispatch } from 'react-redux'\nimport config from '../config'\n\nconst useStyles = makeStyles(\n {\n link: {\n textDecoration: 'none',\n color: 'inherit',\n },\n listItem: {\n padding: '10px',\n },\n title: {\n paddingRight: '10px',\n width: '80%',\n },\n secondary: {\n marginTop: '-3px',\n width: '96%',\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n },\n artist: {\n paddingRight: '30px',\n },\n timeStamp: {\n float: 'right',\n color: '#fff',\n fontWeight: '200',\n opacity: 0.6,\n fontSize: '12px',\n padding: '2px',\n },\n rightIcon: {\n top: '26px',\n },\n },\n { name: 'RaSongSimpleList' }\n)\n\nexport const SongSimpleList = ({\n basePath,\n className,\n classes: classesOverride,\n data,\n hasBulkActions,\n ids,\n loading,\n onToggleItem,\n selectedIds,\n total,\n ...rest\n}) => {\n const dispatch = useDispatch()\n const classes = useStyles({ classes: classesOverride })\n return (\n (loading || total > 0) && (\n \n {ids.map(\n (id) =>\n data[id] && (\n dispatch(setTrack(data[id]))}>\n \n {data[id].title}\n }\n secondary={\n <>\n \n \n {data[id].artist}\n \n \n \n \n \n {config.enableStarRating && (\n \n )}\n \n }\n />\n \n \n \n \n \n \n \n )\n )}\n \n )\n )\n}\n\nSongSimpleList.propTypes = {\n basePath: PropTypes.string,\n className: PropTypes.string,\n classes: PropTypes.object,\n data: PropTypes.object,\n hasBulkActions: PropTypes.bool.isRequired,\n ids: PropTypes.array,\n onToggleItem: PropTypes.func,\n selectedIds: PropTypes.arrayOf(PropTypes.any).isRequired,\n}\n\nSongSimpleList.defaultProps = {\n hasBulkActions: false,\n selectedIds: [],\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport List from '@material-ui/core/List'\nimport ListItem from '@material-ui/core/ListItem'\nimport ListItemIcon from '@material-ui/core/ListItemIcon'\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction'\nimport ListItemText from '@material-ui/core/ListItemText'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { sanitizeListRestProps } from 'ra-core'\nimport { ArtistContextMenu, RatingField } from './index'\nimport config from '../config'\n\nconst useStyles = makeStyles(\n {\n listItem: {\n padding: '10px',\n },\n title: {\n paddingRight: '10px',\n width: '80%',\n },\n rightIcon: {\n top: '26px',\n },\n },\n { name: 'RaArtistSimpleList' }\n)\n\nexport const ArtistSimpleList = ({\n linkType,\n className,\n classes: classesOverride,\n data,\n hasBulkActions,\n ids,\n loading,\n selectedIds,\n total,\n ...rest\n}) => {\n const classes = useStyles({ classes: classesOverride })\n return (\n (loading || total > 0) && (\n \n {ids.map(\n (id) =>\n data[id] && (\n linkType(id)}>\n \n \n
{data[id].name}
\n {config.enableStarRating && (\n \n )}\n \n }\n />\n \n \n \n \n \n
\n
\n )\n )}\n
\n )\n )\n}\n\nArtistSimpleList.propTypes = {\n className: PropTypes.string,\n classes: PropTypes.object,\n data: PropTypes.object,\n hasBulkActions: PropTypes.bool.isRequired,\n ids: PropTypes.array,\n selectedIds: PropTypes.arrayOf(PropTypes.any).isRequired,\n}\n\nArtistSimpleList.defaultProps = {\n hasBulkActions: false,\n selectedIds: [],\n}\n","import React, { useCallback } from 'react'\nimport PropTypes from 'prop-types'\nimport Rating from '@material-ui/lab/Rating'\nimport { makeStyles } from '@material-ui/core/styles'\nimport StarBorderIcon from '@material-ui/icons/StarBorder'\nimport clsx from 'clsx'\nimport { useRating } from './useRating'\n\nconst useStyles = makeStyles({\n rating: {\n color: (props) => props.color,\n visibility: (props) => (props.visible === false ? 'hidden' : 'inherit'),\n },\n show: {\n visibility: 'visible !important',\n },\n hide: {\n visibility: 'hidden',\n },\n})\n\nexport const RatingField = ({\n resource,\n record,\n visible,\n className,\n size,\n color,\n}) => {\n const [rate, rating] = useRating(resource, record)\n const classes = useStyles({ visible, rating: record.rating, color })\n\n const stopPropagation = (e) => {\n e.stopPropagation()\n }\n\n const handleRating = useCallback(\n (e, val) => {\n rate(val, e.target.name)\n },\n [rate]\n )\n\n return (\n stopPropagation(e)}>\n 0 ? classes.show : classes.hide\n )}\n value={rating}\n size={size}\n emptyIcon={}\n onChange={(e, newValue) => handleRating(e, newValue)}\n />\n \n )\n}\nRatingField.propTypes = {\n resource: PropTypes.string.isRequired,\n record: PropTypes.object.isRequired,\n visible: PropTypes.bool,\n size: PropTypes.string,\n}\n\nRatingField.defaultProps = {\n record: {},\n visible: true,\n size: 'small',\n color: 'inherit',\n}\n","import { useState, useCallback, useEffect, useRef } from 'react'\nimport { useDataProvider, useNotify } from 'react-admin'\nimport subsonic from '../subsonic'\n\nexport const useRating = (resource, record) => {\n const [loading, setLoading] = useState(false)\n const notify = useNotify()\n const dataProvider = useDataProvider()\n const mountedRef = useRef(false)\n const rating = record.rating\n\n useEffect(() => {\n mountedRef.current = true\n return () => {\n mountedRef.current = false\n }\n }, [])\n\n const refreshRating = useCallback(() => {\n dataProvider\n .getOne(resource, { id: record.id })\n .then(() => {\n if (mountedRef.current) {\n setLoading(false)\n }\n })\n .catch((e) => {\n console.log('Error encountered: ' + e)\n })\n }, [dataProvider, record, resource])\n\n const rate = (val, id) => {\n setLoading(true)\n subsonic\n .setRating(id, val)\n .then(refreshRating)\n .catch((e) => {\n console.log('Error setting star rating: ', e)\n notify('ra.page.error', 'warning')\n if (mountedRef.current) {\n setLoading(false)\n }\n })\n }\n\n return [rate, rating, loading]\n}\n","import React from 'react'\nimport TextField from '@material-ui/core/TextField'\nimport Checkbox from '@material-ui/core/Checkbox'\nimport CheckBoxIcon from '@material-ui/icons/CheckBox'\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank'\nimport Autocomplete, {\n createFilterOptions,\n} from '@material-ui/lab/Autocomplete'\nimport { useGetList, useTranslate } from 'react-admin'\nimport PropTypes from 'prop-types'\nimport { isWritable } from '../common'\nimport { makeStyles } from '@material-ui/core'\n\nconst filter = createFilterOptions()\n\nconst useStyles = makeStyles({\n root: { width: '100%' },\n checkbox: { marginRight: 8 },\n})\n\nexport const SelectPlaylistInput = ({ onChange }) => {\n const classes = useStyles()\n const translate = useTranslate()\n const { ids, data } = useGetList(\n 'playlist',\n { page: 1, perPage: -1 },\n { field: 'name', order: 'ASC' },\n {}\n )\n\n const options =\n ids &&\n ids.map((id) => data[id]).filter((option) => isWritable(option.owner))\n\n const handleOnChange = (event, newValue) => {\n let newState = []\n if (newValue && newValue.length) {\n newValue.forEach((playlistObject) => {\n if (playlistObject.inputValue) {\n newState.push({\n name: playlistObject.inputValue,\n })\n } else if (typeof playlistObject === 'string') {\n newState.push({\n name: playlistObject,\n })\n } else {\n newState.push(playlistObject)\n }\n })\n }\n onChange(newState)\n }\n\n const icon = \n const checkedIcon = \n\n return (\n {\n const filtered = filter(options, params)\n\n // Suggest the creation of a new value\n if (params.inputValue !== '') {\n filtered.push({\n inputValue: params.inputValue,\n name: translate('resources.playlist.actions.addNewPlaylist', {\n name: params.inputValue,\n }),\n })\n }\n\n return filtered\n }}\n clearOnBlur\n handleHomeEndKeys\n openOnFocus\n selectOnFocus\n id=\"select-playlist-input\"\n options={options}\n getOptionLabel={(option) => {\n // Value selected with enter, right from the input\n if (typeof option === 'string') {\n return option\n }\n // Add \"xxx\" option created dynamically\n if (option.inputValue) {\n return option.inputValue\n }\n // Regular option\n return option.name\n }}\n renderOption={(option, { selected }) => (\n \n \n {option.name}\n \n )}\n className={classes.root}\n freeSolo\n renderInput={(params) => (\n \n )}\n />\n )\n}\n\nSelectPlaylistInput.propTypes = {\n onChange: PropTypes.func.isRequired,\n}\n","import React from 'react'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n} from '@material-ui/core'\n\nimport { useTranslate } from 'react-admin'\n\nconst DuplicateSongDialog = ({\n open,\n handleClickClose,\n handleSubmit,\n handleSkip,\n}) => {\n const translate = useTranslate()\n\n return (\n \n \n {translate('resources.playlist.message.duplicate_song')}\n \n \n {translate('resources.playlist.message.song_exist')}\n \n \n \n \n \n \n \n )\n}\n\nexport default DuplicateSongDialog\n","import React, { useState } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useDataProvider, useNotify, useTranslate } from 'react-admin'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n} from '@material-ui/core'\nimport {\n closeAddToPlaylist,\n closeDuplicateSongDialog,\n openDuplicateSongWarning,\n} from '../actions'\nimport { SelectPlaylistInput } from './SelectPlaylistInput'\nimport DuplicateSongDialog from './DuplicateSongDialog'\n\nexport const AddToPlaylistDialog = () => {\n const {\n open,\n selectedIds,\n onSuccess,\n duplicateSong,\n duplicateIds,\n } = useSelector((state) => state.addToPlaylistDialog)\n const dispatch = useDispatch()\n const translate = useTranslate()\n const notify = useNotify()\n const [value, setValue] = useState({})\n const [check, setCheck] = useState(false)\n const dataProvider = useDataProvider()\n const createAndAddToPlaylist = (playlistObject) => {\n dataProvider\n .create('playlist', {\n data: { name: playlistObject.name },\n })\n .then((res) => {\n addToPlaylist(res.data.id)\n })\n .catch((error) => notify(`Error: ${error.message}`, 'warning'))\n }\n\n const addToPlaylist = (playlistId, distinctIds) => {\n const trackIds = Array.isArray(distinctIds) ? distinctIds : selectedIds\n dataProvider\n .create('playlistTrack', {\n data: { ids: trackIds },\n filter: { playlist_id: playlistId },\n })\n .then(() => {\n const len = trackIds.length\n notify('message.songsAddedToPlaylist', 'info', { smart_count: len })\n onSuccess && onSuccess(value, len)\n })\n .catch(() => {\n notify('ra.page.error', 'warning')\n })\n }\n\n const checkDuplicateSong = (playlistObject) => {\n dataProvider\n .getOne('playlist', { id: playlistObject.id })\n .then((res) => {\n const tracks = res.data.tracks\n if (tracks) {\n const dupSng = tracks.filter((song) =>\n selectedIds.some((id) => id === song.id)\n )\n\n if (dupSng.length) {\n const dupIds = dupSng.map((song) => song.id)\n dispatch(openDuplicateSongWarning(dupIds))\n }\n }\n setCheck(true)\n })\n .catch((error) => {\n console.error(error)\n notify('ra.page.error', 'warning')\n })\n }\n\n const handleSubmit = (e) => {\n value.forEach((playlistObject) => {\n if (playlistObject.id) {\n addToPlaylist(playlistObject.id, playlistObject.distinctIds)\n } else {\n createAndAddToPlaylist(playlistObject)\n }\n })\n setCheck(false)\n setValue({})\n dispatch(closeAddToPlaylist())\n e.stopPropagation()\n }\n\n const handleClickClose = (e) => {\n setCheck(false)\n setValue({})\n dispatch(closeAddToPlaylist())\n e.stopPropagation()\n }\n\n const handleChange = (pls) => {\n if (!value.length || pls.length > value.length) {\n let newlyAdded = pls.slice(-1).pop()\n if (newlyAdded.id) {\n setCheck(false)\n checkDuplicateSong(newlyAdded)\n } else setCheck(true)\n } else if (pls.length === 0) setCheck(false)\n setValue(pls)\n }\n\n const handleDuplicateClose = () => {\n dispatch(closeDuplicateSongDialog())\n }\n const handleDuplicateSubmit = () => {\n dispatch(closeDuplicateSongDialog())\n }\n const handleSkip = () => {\n const distinctSongs = selectedIds.filter(\n (id) => duplicateIds.indexOf(id) < 0\n )\n value.slice(-1).pop().distinctIds = distinctSongs\n dispatch(closeDuplicateSongDialog())\n }\n\n return (\n <>\n \n \n {translate('resources.playlist.actions.selectPlaylist')}\n \n \n \n \n \n \n \n {translate('ra.action.add')}\n \n \n \n \n \n )\n}\n","import config from './config'\nconst keyMap = {\n SHOW_HELP: { name: 'show_help', sequence: 'shift+?', group: 'Global' },\n TOGGLE_MENU: { name: 'toggle_menu', sequence: 'm', group: 'Global' },\n TOGGLE_PLAY: { name: 'toggle_play', sequence: 'space', group: 'Player' },\n PREV_SONG: { name: 'prev_song', sequence: 'left', group: 'Player' },\n NEXT_SONG: { name: 'next_song', sequence: 'right', group: 'Player' },\n VOL_UP: { name: 'vol_up', sequence: '=', group: 'Player' },\n VOL_DOWN: { name: 'vol_down', sequence: '-', group: 'Player' },\n ...(config.enableFavourites && {\n TOGGLE_LOVE: { name: 'toggle_love', sequence: 'l', group: 'Player' },\n }),\n}\n\nexport { keyMap }\n","import React, { useCallback, useState } from 'react'\nimport ReactDOM from 'react-dom'\nimport { Dialog } from '@material-ui/core'\nimport { getApplicationKeyMap, GlobalHotKeys } from 'react-hotkeys'\nimport TableContainer from '@material-ui/core/TableContainer'\nimport Paper from '@material-ui/core/Paper'\nimport Table from '@material-ui/core/Table'\nimport TableBody from '@material-ui/core/TableBody'\nimport TableRow from '@material-ui/core/TableRow'\nimport TableCell from '@material-ui/core/TableCell'\nimport { useTranslate } from 'react-admin'\nimport inflection from 'inflection'\nimport { keyMap } from '../hotkeys'\nimport { DialogTitle } from './DialogTitle'\nimport { DialogContent } from './DialogContent'\n\nconst HelpTable = (props) => {\n const keyMap = getApplicationKeyMap()\n const translate = useTranslate()\n return ReactDOM.createPortal(\n \n \n {translate('help.title')}\n \n \n \n \n \n {Object.keys(keyMap).map((key) => {\n const { sequences, name } = keyMap[key]\n const description = translate(`help.hotkeys.${name}`, {\n _: inflection.humanize(name),\n })\n return (\n \n \n {description}\n \n \n {sequences.map(({ sequence }) => (\n {sequence}\n ))}\n \n \n )\n })}\n \n
\n
\n
\n
,\n document.body\n )\n}\n\nexport const HelpDialog = (props) => {\n const [open, setOpen] = useState(false)\n\n const handleClickClose = (e) => {\n setOpen(false)\n e.stopPropagation()\n }\n\n const handlers = {\n SHOW_HELP: useCallback(() => setOpen(true), [setOpen]),\n }\n\n return (\n <>\n \n \n \n )\n}\n","import React, { useState } from 'react'\nimport { useSelector } from 'react-redux'\nimport { makeStyles, useMediaQuery } from '@material-ui/core'\nimport { useTranslate, MenuItemLink, getResources } from 'react-admin'\nimport { withRouter } from 'react-router-dom'\nimport LibraryMusicIcon from '@material-ui/icons/LibraryMusic'\nimport ViewListIcon from '@material-ui/icons/ViewList'\nimport AlbumIcon from '@material-ui/icons/Album'\nimport SubMenu from './SubMenu'\nimport inflection from 'inflection'\nimport albumLists from '../album/albumLists'\nimport { HelpDialog } from '../dialogs'\n\nconst useStyles = makeStyles((theme) => ({\n active: {\n color: theme.palette.text.primary,\n fontWeight: 'bold',\n },\n}))\n\nconst translatedResourceName = (resource, translate) =>\n translate(`resources.${resource.name}.name`, {\n smart_count: 2,\n _:\n resource.options && resource.options.label\n ? translate(resource.options.label, {\n smart_count: 2,\n _: resource.options.label,\n })\n : inflection.humanize(inflection.pluralize(resource.name)),\n })\n\nconst Menu = ({ onMenuClick, dense, logout }) => {\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n const open = useSelector((state) => state.admin.ui.sidebarOpen)\n const translate = useTranslate()\n const classes = useStyles()\n const resources = useSelector(getResources)\n\n // TODO State is not persisted in mobile when you close the sidebar menu. Move to redux?\n const [state, setState] = useState({\n menuAlbumList: true,\n menuLibrary: true,\n menuSettings: false,\n })\n\n const handleToggle = (menu) => {\n setState((state) => ({ ...state, [menu]: !state[menu] }))\n }\n\n const renderResourceMenuItemLink = (resource) => (\n }\n onClick={onMenuClick}\n sidebarIsOpen={open}\n dense={dense}\n />\n )\n\n const renderAlbumMenuItemLink = (type, al) => {\n const resource = resources.find((r) => r.name === 'album')\n if (!resource) {\n return null\n }\n\n const albumListAddress = `/album/${type}`\n\n const name = translate(`resources.album.lists.${type || 'default'}`, {\n _: translatedResourceName(resource, translate),\n })\n\n return (\n }\n onClick={onMenuClick}\n sidebarIsOpen={open}\n dense={dense}\n exact\n />\n )\n }\n\n const subItems = (subMenu) => (resource) =>\n resource.hasList && resource.options && resource.options.subMenu === subMenu\n\n return (\n
\n handleToggle('menuAlbumList')}\n isOpen={state.menuAlbumList}\n sidebarIsOpen={open}\n name=\"menu.albumList\"\n icon={}\n dense={dense}\n >\n {Object.keys(albumLists).map((type) =>\n renderAlbumMenuItemLink(type, albumLists[type])\n )}\n \n handleToggle('menuLibrary')}\n isOpen={state.menuLibrary}\n sidebarIsOpen={open}\n name=\"menu.library\"\n icon={}\n dense={dense}\n >\n {resources.filter(subItems('library')).map(renderResourceMenuItemLink)}\n \n {resources.filter(subItems(undefined)).map(renderResourceMenuItemLink)}\n {isXsmall && logout}\n \n
\n )\n}\n\nexport default withRouter(Menu)\n","import React, { forwardRef } from 'react'\nimport { MenuItemLink, useTranslate } from 'react-admin'\nimport { makeStyles } from '@material-ui/core'\nimport TuneIcon from '@material-ui/icons/Tune'\n\nconst useStyles = makeStyles((theme) => ({\n menuItem: {\n color: theme.palette.text.secondary,\n },\n}))\n\nconst PersonalMenu = forwardRef(({ onClick, sidebarIsOpen, dense }, ref) => {\n const translate = useTranslate()\n const classes = useStyles()\n return (\n }\n onClick={onClick}\n className={classes.menuItem}\n sidebarIsOpen={sidebarIsOpen}\n dense={dense}\n />\n )\n})\n\nexport default PersonalMenu\n","import React, { useState, useEffect } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { fetchUtils, useTranslate } from 'react-admin'\nimport {\n Popover,\n Badge,\n CircularProgress,\n IconButton,\n makeStyles,\n Tooltip,\n Card,\n CardContent,\n CardActions,\n Divider,\n Box,\n} from '@material-ui/core'\nimport { FiActivity } from 'react-icons/fi'\nimport { BiError } from 'react-icons/bi'\nimport { VscSync } from 'react-icons/vsc'\nimport { GiMagnifyingGlass } from 'react-icons/gi'\nimport subsonic from '../subsonic'\nimport { scanStatusUpdate } from '../actions'\nimport { useInterval } from '../common'\nimport { formatDuration } from '../utils'\n\nconst useStyles = makeStyles((theme) => ({\n wrapper: {\n position: 'relative',\n color: (props) => (props.up ? null : 'orange'),\n },\n progress: {\n color: theme.palette.primary.light,\n position: 'absolute',\n top: 10,\n left: 10,\n zIndex: 1,\n },\n button: {\n color: 'inherit',\n zIndex: 2,\n },\n counterStatus: {\n minWidth: '15em',\n },\n}))\n\nconst getUptime = (serverStart) =>\n formatDuration((Date.now() - serverStart.startTime) / 1000)\n\nconst Uptime = () => {\n const serverStart = useSelector((state) => state.activity.serverStart)\n const [uptime, setUptime] = useState(getUptime(serverStart))\n useInterval(() => {\n setUptime(getUptime(serverStart))\n }, 1000)\n return {uptime}\n}\n\nconst ActivityPanel = () => {\n const serverStart = useSelector((state) => state.activity.serverStart)\n const up = serverStart && serverStart.startTime\n const classes = useStyles({ up })\n const translate = useTranslate()\n const [anchorEl, setAnchorEl] = useState(null)\n const open = Boolean(anchorEl)\n const dispatch = useDispatch()\n const scanStatus = useSelector((state) => state.activity.scanStatus)\n\n const handleMenuOpen = (event) => setAnchorEl(event.currentTarget)\n const handleMenuClose = () => setAnchorEl(null)\n const triggerScan = (full) => () =>\n fetch(subsonic.url('startScan', null, { fullScan: full }))\n\n // Get updated status on component mount\n useEffect(() => {\n fetchUtils\n .fetchJson(subsonic.url('getScanStatus'))\n .then((resp) => resp.json['subsonic-response'])\n .then((data) => {\n if (data.status === 'ok') {\n dispatch(scanStatusUpdate(data.scanStatus))\n }\n })\n }, [dispatch])\n\n return (\n
\n \n \n \n {up ? : }\n \n \n \n {scanStatus.scanning && (\n \n )}\n \n \n \n \n \n {translate('activity.serverUptime')}:\n \n \n {up ? : translate('activity.serverDown')}\n \n \n \n \n \n \n \n {translate('activity.totalScanned')}:\n \n \n {scanStatus.folderCount || '-'}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n )\n}\n\nexport default ActivityPanel\n","// From https://overreacted.io/making-setinterval-declarative-with-react-hooks/\n\nimport { useEffect, useRef } from 'react'\n\nexport const useInterval = (callback, delay) => {\n const savedCallback = useRef()\n\n // Remember the latest callback.\n useEffect(() => {\n savedCallback.current = callback\n }, [callback])\n\n // Set up the interval.\n useEffect(() => {\n function tick() {\n savedCallback.current()\n }\n if (delay !== null) {\n let id = setInterval(tick, delay)\n return () => clearInterval(id)\n }\n }, [delay])\n}\n","import * as React from 'react'\nimport { Children, cloneElement, isValidElement, useState } from 'react'\nimport PropTypes from 'prop-types'\nimport { useTranslate, useGetIdentity } from 'react-admin'\nimport {\n Tooltip,\n IconButton,\n Popover,\n MenuList,\n Avatar,\n Card,\n CardContent,\n Divider,\n Typography,\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport AccountCircle from '@material-ui/icons/AccountCircle'\n\nconst useStyles = makeStyles((theme) => ({\n user: {},\n avatar: {\n width: theme.spacing(4),\n height: theme.spacing(4),\n },\n username: {\n maxWidth: '11em',\n marginTop: '-0.7em',\n marginBottom: '-1em',\n },\n usernameWrap: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n}))\n\nconst UserMenu = (props) => {\n const [anchorEl, setAnchorEl] = useState(null)\n const translate = useTranslate()\n const { loaded, identity } = useGetIdentity()\n const classes = useStyles(props)\n\n const { children, label, icon, logout } = props\n if (!logout && !children) return null\n const open = Boolean(anchorEl)\n\n const handleMenu = (event) => setAnchorEl(event.currentTarget)\n const handleClose = () => setAnchorEl(null)\n\n return (\n
\n \n \n {loaded && identity.avatar ? (\n \n ) : (\n icon\n )}\n \n \n \n \n {loaded && (\n \n \n {identity.fullName}\n \n \n )}\n \n {Children.map(children, (menuItem) =>\n isValidElement(menuItem)\n ? cloneElement(menuItem, {\n onClick: handleClose,\n })\n : null\n )}\n {logout}\n \n \n
\n )\n}\n\nUserMenu.propTypes = {\n children: PropTypes.node,\n label: PropTypes.string.isRequired,\n logout: PropTypes.element,\n}\n\nUserMenu.defaultProps = {\n label: 'menu.settings',\n icon: ,\n}\n\nexport default UserMenu\n","import React, { createElement, forwardRef } from 'react'\nimport {\n AppBar as RAAppBar,\n MenuItemLink,\n useTranslate,\n usePermissions,\n getResources,\n} from 'react-admin'\nimport { useSelector } from 'react-redux'\nimport { makeStyles, MenuItem, ListItemIcon, Divider } from '@material-ui/core'\nimport ViewListIcon from '@material-ui/icons/ViewList'\nimport InfoIcon from '@material-ui/icons/Info'\nimport { AboutDialog } from '../dialogs'\nimport PersonalMenu from './PersonalMenu'\nimport ActivityPanel from './ActivityPanel'\nimport UserMenu from './UserMenu'\nimport config from '../config'\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n color: theme.palette.text.secondary,\n },\n active: {\n color: theme.palette.text.primary,\n },\n icon: { minWidth: theme.spacing(5) },\n }),\n {\n name: 'NDAppBar',\n }\n)\n\nconst AboutMenuItem = forwardRef(({ onClick, ...rest }, ref) => {\n const classes = useStyles(rest)\n const translate = useTranslate()\n const [open, setOpen] = React.useState(false)\n\n const handleOpen = () => {\n setOpen(true)\n }\n const handleClose = () => {\n onClick && onClick()\n setOpen(false)\n }\n const label = translate('menu.about')\n return (\n <>\n \n \n \n \n {label}\n \n \n \n )\n})\n\nconst settingsResources = (resource) =>\n resource.hasList &&\n resource.options &&\n resource.options.subMenu === 'settings'\n\nconst CustomUserMenu = ({ onClick, ...rest }) => {\n const translate = useTranslate()\n const resources = useSelector(getResources)\n const classes = useStyles(rest)\n const { permissions } = usePermissions()\n\n const renderSettingsMenuItemLink = (resource) => {\n const label = translate(`resources.${resource.name}.name`, {\n smart_count: 2,\n })\n return (\n \n }\n onClick={onClick}\n sidebarIsOpen={true}\n />\n )\n }\n\n return (\n <>\n {config.devActivityPanel && permissions === 'admin' && }\n \n \n \n {resources.filter(settingsResources).map(renderSettingsMenuItemLink)}\n \n \n \n \n )\n}\n\nconst AppBar = (props) => } />\n\nexport default AppBar\n","import React, { useCallback } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Layout, toggleSidebar } from 'react-admin'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { HotKeys } from 'react-hotkeys'\nimport Menu from './Menu'\nimport AppBar from './AppBar'\nimport Notification from './Notification'\nimport useCurrentTheme from '../themes/useCurrentTheme'\n\nconst useStyles = makeStyles({\n root: { paddingBottom: (props) => (props.addPadding ? '80px' : 0) },\n})\n\nexport default (props) => {\n const theme = useCurrentTheme()\n const queue = useSelector((state) => state.queue)\n const classes = useStyles({ addPadding: queue.queue.length > 0 })\n const dispatch = useDispatch()\n\n const keyHandlers = {\n TOGGLE_MENU: useCallback(() => dispatch(toggleSidebar()), [dispatch]),\n }\n\n return (\n \n \n \n )\n}\n","import React from 'react'\nimport { Datagrid, TextField } from 'react-admin'\nimport { useMediaQuery } from '@material-ui/core'\nimport { SimpleList, List } from '../common'\nimport config from '../config'\n\nconst TranscodingList = (props) => {\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n return (\n \n {isXsmall ? (\n r.name}\n secondaryText={(r) => `format: ${r.targetFormat}`}\n tertiaryText={(r) => r.defaultBitRate}\n />\n ) : (\n \n \n \n \n \n \n )}\n \n )\n}\n\nexport default TranscodingList\n","import React from 'react'\nimport { Card, CardContent, Typography, Box } from '@material-ui/core'\nimport { useTranslate } from 'react-admin'\n\nexport const Interpolate = ({ message, field, children }) => {\n const split = message.split(`%{${field}}`)\n return (\n \n {split[0]}\n {children}\n {split[1]}\n \n )\n}\nexport const TranscodingNote = ({ message }) => {\n const translate = useTranslate()\n return (\n \n \n \n \n {translate('message.note')}:\n {' '}\n \n \n ND_ENABLETRANSCODINGCONFIG=true\n \n \n \n \n \n )\n}\n","import React from 'react'\nimport {\n Edit,\n required,\n SelectInput,\n SimpleForm,\n TextInput,\n useTranslate,\n} from 'react-admin'\nimport { Title } from '../common'\nimport { TranscodingNote } from './TranscodingNote'\n\nconst TranscodingTitle = ({ record }) => {\n const translate = useTranslate()\n const resourceName = translate('resources.transcoding.name', {\n smart_count: 1,\n })\n return \n}\n\nconst TranscodingEdit = (props) => {\n return (\n <>\n <TranscodingNote message={'message.transcodingEnabled'} />\n\n <Edit title={<TranscodingTitle />} {...props}>\n <SimpleForm variant={'outlined'}>\n <TextInput source=\"name\" validate={[required()]} />\n <TextInput source=\"targetFormat\" validate={[required()]} />\n <SelectInput\n source=\"defaultBitRate\"\n choices={[\n { id: 32, name: '32' },\n { id: 48, name: '48' },\n { id: 64, name: '64' },\n { id: 80, name: '80' },\n { id: 96, name: '96' },\n { id: 112, name: '112' },\n { id: 128, name: '128' },\n { id: 160, name: '160' },\n { id: 192, name: '192' },\n { id: 256, name: '256' },\n { id: 320, name: '320' },\n ]}\n />\n <TextInput source=\"command\" fullWidth validate={[required()]} />\n </SimpleForm>\n </Edit>\n </>\n )\n}\n\nexport default TranscodingEdit\n","import React from 'react'\nimport {\n TextInput,\n SelectInput,\n Create,\n required,\n SimpleForm,\n useTranslate,\n} from 'react-admin'\nimport { Title } from '../common'\n\nconst TranscodingTitle = () => {\n const translate = useTranslate()\n const resourceName = translate('resources.transcoding.name', {\n smart_count: 1,\n })\n const title = translate('ra.page.create', {\n name: `${resourceName}`,\n })\n return <Title subTitle={title} />\n}\n\nconst TranscodingCreate = (props) => (\n <Create title={<TranscodingTitle />} {...props}>\n <SimpleForm variant={'outlined'}>\n <TextInput source=\"name\" validate={[required()]} />\n <TextInput source=\"targetFormat\" validate={[required()]} />\n <SelectInput\n source=\"defaultBitRate\"\n choices={[\n { id: 32, name: '32' },\n { id: 48, name: '48' },\n { id: 64, name: '64' },\n { id: 80, name: '80' },\n { id: 96, name: '96' },\n { id: 112, name: '112' },\n { id: 128, name: '128' },\n { id: 160, name: '160' },\n { id: 192, name: '192' },\n { id: 256, name: '256' },\n { id: 320, name: '320' },\n ]}\n defaultValue={192}\n />\n <TextInput\n source=\"command\"\n fullWidth\n validate={[required()]}\n helperText={\n <span>\n Substitutions: <br />\n %s: File path <br />\n %b: BitRate (in kbps)\n <br />\n </span>\n }\n />\n </SimpleForm>\n </Create>\n)\n\nexport default TranscodingCreate\n","import React from 'react'\nimport { Show, SimpleShowLayout, TextField } from 'react-admin'\nimport { Title } from '../common'\nimport { TranscodingNote } from './TranscodingNote'\n\nconst TranscodingTitle = ({ record }) => {\n return <Title subTitle={`Transcoding ${record ? record.name : ''}`} />\n}\n\nconst TranscodingShow = (props) => {\n return (\n <>\n <TranscodingNote message={'message.transcodingDisabled'} />\n\n <Show title={<TranscodingTitle />} {...props}>\n <SimpleShowLayout>\n <TextField source=\"name\" />\n <TextField source=\"targetFormat\" />\n <TextField source=\"defaultBitRate\" />\n <TextField source=\"command\" />\n </SimpleShowLayout>\n </Show>\n </>\n )\n}\n\nexport default TranscodingShow\n","import TransformIcon from '@material-ui/icons/Transform'\nimport TranscodingList from './TranscodingList'\nimport TranscodingEdit from './TranscodingEdit'\nimport TranscodingCreate from './TranscodingCreate'\nimport TranscodingShow from './TranscodingShow'\nimport config from '../config'\n\nexport default {\n list: TranscodingList,\n edit: config.enableTranscodingConfig && TranscodingEdit,\n create: config.enableTranscodingConfig && TranscodingCreate,\n show: !config.enableTranscodingConfig && TranscodingShow,\n icon: TransformIcon,\n}\n","import React from 'react'\nimport {\n Datagrid,\n TextField,\n DateField,\n FunctionField,\n ReferenceField,\n Filter,\n SearchInput,\n} from 'react-admin'\nimport { useMediaQuery } from '@material-ui/core'\nimport { SimpleList, List } from '../common'\n\nconst PlayerFilter = (props) => (\n <Filter {...props} variant={'outlined'}>\n <SearchInput source=\"name\" alwaysOn />\n </Filter>\n)\n\nconst PlayerList = ({ permissions, ...props }) => {\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n return (\n <List\n {...props}\n sort={{ field: 'lastSeen', order: 'DESC' }}\n exporter={false}\n filters={<PlayerFilter />}\n >\n {isXsmall ? (\n <SimpleList\n primaryText={(r) => r.client}\n secondaryText={(r) => r.userName}\n tertiaryText={(r) => (r.maxBitRate ? r.maxBitRate : '-')}\n />\n ) : (\n <Datagrid rowClick=\"edit\">\n <TextField source=\"name\" />\n {permissions === 'admin' && <TextField source=\"userName\" />}\n <ReferenceField source=\"transcodingId\" reference=\"transcoding\">\n <TextField source=\"name\" />\n </ReferenceField>\n <FunctionField\n source=\"maxBitRate\"\n render={(r) => (r.maxBitRate ? r.maxBitRate : '-')}\n />\n <DateField source=\"lastSeen\" showTime sortByOrder={'DESC'} />\n </Datagrid>\n )}\n </List>\n )\n}\n\nexport default PlayerList\n","import React from 'react'\nimport {\n TextInput,\n BooleanInput,\n TextField,\n Edit,\n required,\n SimpleForm,\n SelectInput,\n ReferenceInput,\n useTranslate,\n} from 'react-admin'\nimport { Title } from '../common'\n\nconst PlayerTitle = ({ record }) => {\n const translate = useTranslate()\n const resourceName = translate('resources.player.name', { smart_count: 1 })\n return <Title subTitle={`${resourceName} ${record ? record.name : ''}`} />\n}\n\nconst PlayerEdit = (props) => (\n <Edit title={<PlayerTitle />} {...props}>\n <SimpleForm variant={'outlined'}>\n <TextInput source=\"name\" validate={[required()]} />\n <ReferenceInput\n source=\"transcodingId\"\n reference=\"transcoding\"\n sort={{ field: 'name', order: 'ASC' }}\n >\n <SelectInput source=\"name\" resettable />\n </ReferenceInput>\n <SelectInput\n source=\"maxBitRate\"\n choices={[\n { id: 32, name: '32' },\n { id: 48, name: '48' },\n { id: 64, name: '64' },\n { id: 80, name: '80' },\n { id: 96, name: '96' },\n { id: 112, name: '112' },\n { id: 128, name: '128' },\n { id: 160, name: '160' },\n { id: 192, name: '192' },\n { id: 256, name: '256' },\n { id: 320, name: '320' },\n { id: 0, name: '-' },\n ]}\n />\n <BooleanInput source=\"reportRealPath\" fullWidth />\n <TextField source=\"client\" />\n <TextField source=\"userName\" />\n </SimpleForm>\n </Edit>\n)\n\nexport default PlayerEdit\n","import RadioIcon from '@material-ui/icons/Radio'\nimport PlayerList from './PlayerList'\nimport PlayerEdit from './PlayerEdit'\n\nexport default {\n list: PlayerList,\n edit: PlayerEdit,\n icon: RadioIcon,\n}\n","import React from 'react'\nimport {\n BooleanField,\n Datagrid,\n Filter,\n DateField,\n SearchInput,\n SimpleList,\n TextField,\n} from 'react-admin'\nimport { useMediaQuery } from '@material-ui/core'\nimport { List } from '../common'\n\nconst UserFilter = (props) => (\n <Filter {...props} variant={'outlined'}>\n <SearchInput source=\"name\" alwaysOn />\n </Filter>\n)\n\nconst UserList = (props) => {\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n\n return (\n <List\n {...props}\n sort={{ field: 'userName', order: 'ASC' }}\n exporter={false}\n bulkActionButtons={false}\n filters={<UserFilter />}\n >\n {isXsmall ? (\n <SimpleList\n primaryText={(record) => record.userName}\n secondaryText={(record) =>\n record.lastLoginAt && new Date(record.lastLoginAt).toLocaleString()\n }\n tertiaryText={(record) => (record.isAdmin ? '[admin]️' : '')}\n />\n ) : (\n <Datagrid rowClick=\"edit\">\n <TextField source=\"userName\" />\n <TextField source=\"name\" />\n <BooleanField source=\"isAdmin\" />\n <DateField source=\"lastLoginAt\" sortByOrder={'DESC'} />\n <DateField source=\"updatedAt\" sortByOrder={'DESC'} />\n </Datagrid>\n )}\n </List>\n )\n}\n\nexport default UserList\n","import React from 'react'\nimport DeleteIcon from '@material-ui/icons/Delete'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { fade } from '@material-ui/core/styles/colorManipulator'\nimport clsx from 'clsx'\nimport { useDeleteWithConfirmController, Button, Confirm } from 'react-admin'\n\nconst useStyles = makeStyles(\n (theme) => ({\n deleteButton: {\n color: theme.palette.error.main,\n '&:hover': {\n backgroundColor: fade(theme.palette.error.main, 0.12),\n // Reset on mouse devices\n '@media (hover: none)': {\n backgroundColor: 'transparent',\n },\n },\n },\n }),\n { name: 'RaDeleteWithConfirmButton' }\n)\n\nconst DeleteUserButton = (props) => {\n const {\n resource,\n record,\n basePath,\n redirect = 'list',\n className,\n onClick,\n ...rest\n } = props\n const {\n open,\n loading,\n handleDialogOpen,\n handleDialogClose,\n handleDelete,\n } = useDeleteWithConfirmController({\n resource,\n record,\n redirect,\n basePath,\n onClick,\n })\n\n const classes = useStyles(props)\n return (\n <>\n <Button\n onClick={handleDialogOpen}\n label=\"ra.action.delete\"\n className={clsx('ra-delete-button', classes.deleteButton, className)}\n key=\"button\"\n {...rest}\n >\n <DeleteIcon />\n </Button>\n <Confirm\n isOpen={open}\n loading={loading}\n title=\"message.delete_user_title\"\n content=\"message.delete_user_content\"\n translateOptions={{\n name: record.name,\n }}\n onConfirm={handleDelete}\n onClose={handleDialogClose}\n />\n </>\n )\n}\n\nexport default DeleteUserButton\n","import React from 'react'\nimport { makeStyles } from '@material-ui/core/styles'\nimport {\n TextInput,\n BooleanInput,\n DateField,\n PasswordInput,\n Edit,\n required,\n email,\n SimpleForm,\n useTranslate,\n Toolbar,\n SaveButton,\n} from 'react-admin'\nimport { Title } from '../common'\nimport DeleteUserButton from './DeleteUserButton'\n\nconst useStyles = makeStyles({\n toolbar: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n})\n\nconst UserTitle = ({ record }) => {\n const translate = useTranslate()\n const resourceName = translate('resources.user.name', { smart_count: 1 })\n return <Title subTitle={`${resourceName} ${record ? record.name : ''}`} />\n}\n\nconst UserToolbar = (props) => (\n <Toolbar {...props} classes={useStyles()}>\n <SaveButton />\n <DeleteUserButton />\n </Toolbar>\n)\n\nconst UserEdit = (props) => (\n <Edit title={<UserTitle />} {...props}>\n <SimpleForm variant={'outlined'} toolbar={<UserToolbar />}>\n <TextInput source=\"userName\" validate={[required()]} />\n <TextInput source=\"name\" validate={[required()]} />\n <TextInput source=\"email\" validate={[email()]} />\n <PasswordInput source=\"password\" validate={[required()]} />\n <BooleanInput source=\"isAdmin\" initialValue={false} />\n <DateField variant=\"body1\" source=\"lastLoginAt\" showTime />\n {/*<DateField source=\"lastAccessAt\" showTime />*/}\n <DateField variant=\"body1\" source=\"updatedAt\" showTime />\n <DateField variant=\"body1\" source=\"createdAt\" showTime />\n </SimpleForm>\n </Edit>\n)\n\nexport default UserEdit\n","import Group from '@material-ui/icons/Group'\nimport UserList from './UserList'\nimport UserEdit from './UserEdit'\nimport UserCreate from './UserCreate'\n\nexport default {\n list: UserList,\n edit: UserEdit,\n create: UserCreate,\n icon: Group,\n}\n","import React from 'react'\nimport {\n BooleanInput,\n Create,\n TextInput,\n PasswordInput,\n required,\n email,\n SimpleForm,\n useTranslate,\n} from 'react-admin'\nimport { Title } from '../common'\n\nconst UserCreate = (props) => {\n const translate = useTranslate()\n const resourceName = translate('resources.user.name', { smart_count: 1 })\n const title = translate('ra.page.create', {\n name: `${resourceName}`,\n })\n return (\n <Create title={<Title subTitle={title} />} {...props}>\n <SimpleForm redirect=\"list\" variant={'outlined'}>\n <TextInput source=\"userName\" validate={[required()]} />\n <TextInput source=\"name\" validate={[required()]} />\n <TextInput source=\"email\" validate={[email()]} />\n <PasswordInput source=\"password\" validate={[required()]} />\n <BooleanInput source=\"isAdmin\" defaultValue={false} />\n </SimpleForm>\n </Create>\n )\n}\n\nexport default UserCreate\n","import React, { cloneElement } from 'react'\nimport { sanitizeListRestProps, TopToolbar } from 'react-admin'\nimport { ShuffleAllButton } from '../common'\n\nexport const SongListActions = ({\n currentSort,\n className,\n resource,\n filters,\n displayedFilters,\n filterValues,\n permanentFilter,\n exporter,\n basePath,\n selectedIds,\n onUnselectItems,\n showFilter,\n maxResults,\n total,\n ids,\n ...rest\n}) => {\n return (\n <TopToolbar className={className} {...sanitizeListRestProps(rest)}>\n {filters &&\n cloneElement(filters, {\n resource,\n showFilter,\n displayedFilters,\n filterValues,\n context: 'button',\n })}\n <ShuffleAllButton filters={filterValues} />\n </TopToolbar>\n )\n}\n\nSongListActions.defaultProps = {\n selectedIds: [],\n onUnselectItems: () => null,\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { Link } from 'react-admin'\n\nexport const AlbumLinkField = (props) => (\n <Link\n to={`/album/${props.record.albumId}/show`}\n onClick={(e) => e.stopPropagation()}\n >\n {props.record.album}\n </Link>\n)\n\nAlbumLinkField.propTypes = {\n sortBy: PropTypes.string,\n sortByOrder: PropTypes.oneOf(['ASC', 'DESC']),\n}\n\nAlbumLinkField.defaultProps = {\n addLabel: true,\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Chip from '@material-ui/core/Chip'\nimport config from '../config'\nimport { makeStyles } from '@material-ui/core'\nimport clsx from 'clsx'\n\nconst llFormats = new Set(config.losslessFormats.split(','))\nconst placeholder = 'N/A'\n\nconst useStyle = makeStyles(\n (theme) => ({\n chip: {\n transform: 'scale(0.8)',\n },\n }),\n {\n name: 'NDQualityInfo',\n }\n)\n\nexport const QualityInfo = ({ record, size, className }) => {\n const classes = useStyle()\n let { suffix, bitRate } = record\n let info = placeholder\n\n if (suffix) {\n suffix = suffix.toUpperCase()\n info = suffix\n if (!llFormats.has(suffix)) {\n info += ' ' + bitRate\n }\n }\n\n return (\n <Chip\n className={clsx(classes.chip, className)}\n variant=\"outlined\"\n size={size}\n label={info}\n />\n )\n}\n\nQualityInfo.propTypes = {\n record: PropTypes.object.isRequired,\n size: PropTypes.string,\n className: PropTypes.string,\n}\n\nQualityInfo.defaultProps = {\n record: {},\n size: 'small',\n}\n","import React from 'react'\nimport {\n Filter,\n FunctionField,\n NumberField,\n SearchInput,\n TextField,\n} from 'react-admin'\nimport { useMediaQuery } from '@material-ui/core'\nimport FavoriteIcon from '@material-ui/icons/Favorite'\nimport {\n DurationField,\n List,\n SongContextMenu,\n SongDatagrid,\n SongDetails,\n QuickFilter,\n SongTitleField,\n SongSimpleList,\n RatingField,\n} from '../common'\nimport { useDispatch } from 'react-redux'\nimport { setTrack } from '../actions'\nimport { SongBulkActions } from '../common'\nimport { SongListActions } from './SongListActions'\nimport { AlbumLinkField } from './AlbumLinkField'\nimport { AddToPlaylistDialog } from '../dialogs'\nimport { makeStyles } from '@material-ui/core/styles'\nimport FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder'\nimport config from '../config'\nimport { QualityInfo } from '../common/QualityInfo'\n\nconst useStyles = makeStyles({\n contextHeader: {\n marginLeft: '3px',\n marginTop: '-2px',\n verticalAlign: 'text-top',\n },\n row: {\n '&:hover': {\n '& $contextMenu': {\n visibility: 'visible',\n },\n '& $ratingField': {\n visibility: 'visible',\n },\n },\n },\n contextMenu: {\n visibility: 'hidden',\n },\n ratingField: {\n visibility: 'hidden',\n },\n})\n\nconst SongFilter = (props) => (\n <Filter {...props} variant={'outlined'}>\n <SearchInput source=\"title\" alwaysOn />\n {config.enableFavourites && (\n <QuickFilter\n source=\"starred\"\n label={<FavoriteIcon fontSize={'small'} />}\n defaultValue={true}\n />\n )}\n </Filter>\n)\n\nconst SongList = (props) => {\n const classes = useStyles()\n const dispatch = useDispatch()\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n\n const handleRowClick = (id, basePath, record) => {\n dispatch(setTrack(record))\n }\n\n return (\n <>\n <List\n {...props}\n sort={{ field: 'title', order: 'ASC' }}\n exporter={false}\n bulkActionButtons={<SongBulkActions />}\n actions={<SongListActions />}\n filters={<SongFilter />}\n perPage={isXsmall ? 50 : 15}\n >\n {isXsmall ? (\n <SongSimpleList />\n ) : (\n <SongDatagrid\n expand={<SongDetails />}\n rowClick={handleRowClick}\n contextAlwaysVisible={!isDesktop}\n classes={{ row: classes.row }}\n >\n <SongTitleField source=\"title\" showTrackNumbers={false} />\n {isDesktop && (\n <AlbumLinkField\n source=\"album\"\n sortBy={\n 'album, order_album_artist_name, disc_number, track_number, title'\n }\n sortByOrder={'ASC'}\n />\n )}\n <TextField source=\"artist\" />\n {isDesktop && <NumberField source=\"trackNumber\" />}\n {isDesktop && (\n <NumberField source=\"playCount\" sortByOrder={'DESC'} />\n )}\n {isDesktop && (\n <FunctionField\n source=\"year\"\n render={(r) => r.year || ''}\n sortByOrder={'DESC'}\n />\n )}\n {isDesktop && <QualityInfo source=\"quality\" sortable={false} />}\n <DurationField source=\"duration\" />\n {config.enableStarRating && (\n <RatingField\n source=\"rating\"\n sortByOrder={'DESC'}\n resource={'song'}\n className={classes.ratingField}\n />\n )}\n <SongContextMenu\n source={'starred'}\n sortBy={'starred ASC, starredAt ASC'}\n sortByOrder={'DESC'}\n sortable={config.enableFavourites}\n className={classes.contextMenu}\n label={\n config.enableFavourites && (\n <FavoriteBorderIcon\n fontSize={'small'}\n className={classes.contextHeader}\n />\n )\n }\n />\n </SongDatagrid>\n )}\n </List>\n <AddToPlaylistDialog />\n </>\n )\n}\n\nexport default SongList\n","import React from 'react'\nimport SongList from './SongList'\nimport MusicNoteOutlinedIcon from '@material-ui/icons/MusicNoteOutlined'\nimport MusicNoteIcon from '@material-ui/icons/MusicNote'\nimport DynamicMenuIcon from '../layout/DynamicMenuIcon'\n\nexport default {\n list: SongList,\n icon: (\n <DynamicMenuIcon\n path={'song'}\n icon={MusicNoteOutlinedIcon}\n activeIcon={MusicNoteIcon}\n />\n ),\n}\n","import React, { cloneElement } from 'react'\nimport { Button, sanitizeListRestProps, TopToolbar } from 'react-admin'\nimport { ButtonGroup } from '@material-ui/core'\nimport ViewHeadlineIcon from '@material-ui/icons/ViewHeadline'\nimport ViewModuleIcon from '@material-ui/icons/ViewModule'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { albumViewGrid, albumViewList } from '../actions'\n\nconst AlbumListActions = ({\n currentSort,\n className,\n resource,\n filters,\n displayedFilters,\n filterValues,\n permanentFilter,\n exporter,\n basePath,\n selectedIds,\n onUnselectItems,\n showFilter,\n maxResults,\n total,\n fullWidth,\n ...rest\n}) => {\n const dispatch = useDispatch()\n const albumView = useSelector((state) => state.albumView)\n\n return (\n <TopToolbar className={className} {...sanitizeListRestProps(rest)}>\n {filters &&\n cloneElement(filters, {\n resource,\n showFilter,\n displayedFilters,\n filterValues,\n context: 'button',\n })}\n <ButtonGroup\n variant=\"text\"\n color=\"primary\"\n aria-label=\"text primary button group\"\n >\n <Button\n size=\"small\"\n color={albumView.grid ? 'primary' : 'secondary'}\n onClick={() => dispatch(albumViewGrid())}\n >\n <ViewModuleIcon fontSize=\"inherit\" />\n </Button>\n <Button\n size=\"small\"\n color={albumView.grid ? 'secondary' : 'primary'}\n onClick={() => dispatch(albumViewList())}\n >\n <ViewHeadlineIcon fontSize=\"inherit\" />\n </Button>\n </ButtonGroup>\n </TopToolbar>\n )\n}\n\nAlbumListActions.defaultProps = {\n selectedIds: [],\n onUnselectItems: () => null,\n}\n\nexport default AlbumListActions\n","export const ALBUM_MODE_GRID = 'ALBUM_GRID_MODE'\nexport const ALBUM_MODE_LIST = 'ALBUM_LIST_MODE'\n\nexport const albumViewGrid = () => ({ type: ALBUM_MODE_GRID })\n\nexport const albumViewList = () => ({ type: ALBUM_MODE_LIST })\n","import React from 'react'\nimport Paper from '@material-ui/core/Paper'\nimport Table from '@material-ui/core/Table'\nimport TableBody from '@material-ui/core/TableBody'\nimport inflection from 'inflection'\nimport TableCell from '@material-ui/core/TableCell'\nimport TableContainer from '@material-ui/core/TableContainer'\nimport TableRow from '@material-ui/core/TableRow'\nimport {\n BooleanField,\n Datagrid,\n DateField,\n NumberField,\n Show,\n TextField,\n useTranslate,\n} from 'react-admin'\nimport { useMediaQuery } from '@material-ui/core'\nimport FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder'\nimport { makeStyles } from '@material-ui/core/styles'\nimport {\n ArtistLinkField,\n DurationField,\n RangeField,\n SimpleList,\n MultiLineTextField,\n AlbumContextMenu,\n RatingField,\n} from '../common'\nimport config from '../config'\n\nconst useStyles = makeStyles({\n columnIcon: {\n marginLeft: '3px',\n marginTop: '-2px',\n verticalAlign: 'text-top',\n },\n row: {\n '&:hover': {\n '& $contextMenu': {\n visibility: 'visible',\n },\n '& $ratingField': {\n visibility: 'visible',\n },\n },\n },\n tableCell: {\n width: '17.5%',\n },\n contextMenu: {\n visibility: 'hidden',\n },\n ratingField: {\n visibility: 'hidden',\n },\n})\n\nconst AlbumDetails = (props) => {\n const classes = useStyles()\n const translate = useTranslate()\n const { record } = props\n const data = {\n albumArtist: <TextField record={record} source=\"albumArtist\" />,\n genre: <TextField record={record} source=\"genre\" />,\n compilation: <BooleanField record={record} source=\"compilation\" />,\n updatedAt: <DateField record={record} source=\"updatedAt\" showTime />,\n comment: <MultiLineTextField record={record} source=\"comment\" />,\n }\n if (!record.comment) {\n delete data.comment\n }\n return (\n <Show {...props} title=\" \">\n <TableContainer component={Paper}>\n <Table aria-label=\"album details\" size=\"small\">\n <TableBody>\n {Object.keys(data).map((key) => {\n return (\n <TableRow key={`${record.id}-${key}`}>\n <TableCell\n component=\"th\"\n scope=\"row\"\n className={classes.tableCell}\n >\n {translate(`resources.album.fields.${key}`, {\n _: inflection.humanize(inflection.underscore(key)),\n })}\n :\n </TableCell>\n <TableCell align=\"left\">{data[key]}</TableCell>\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </TableContainer>\n </Show>\n )\n}\n\nconst AlbumListView = ({\n hasShow,\n hasEdit,\n hasList,\n syncWithLocation,\n ...rest\n}) => {\n const classes = useStyles()\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n return isXsmall ? (\n <SimpleList\n primaryText={(r) => r.name}\n secondaryText={(r) => (\n <>\n {r.albumArtist}\n {config.enableStarRating && (\n <>\n <br />\n <RatingField\n record={r}\n sortByOrder={'DESC'}\n source={'rating'}\n resource={'album'}\n size={'small'}\n />\n </>\n )}\n </>\n )}\n tertiaryText={(r) => (\n <>\n <RangeField record={r} source={'year'} sortBy={'maxYear'} />\n      \n </>\n )}\n linkType={'show'}\n rightIcon={(r) => <AlbumContextMenu record={r} />}\n {...rest}\n />\n ) : (\n <Datagrid\n expand={<AlbumDetails />}\n rowClick={'show'}\n classes={{ row: classes.row }}\n {...rest}\n >\n <TextField source=\"name\" />\n <ArtistLinkField source=\"artist\" />\n {isDesktop && <NumberField source=\"songCount\" sortByOrder={'DESC'} />}\n {isDesktop && <NumberField source=\"playCount\" sortByOrder={'DESC'} />}\n <RangeField source={'year'} sortBy={'maxYear'} sortByOrder={'DESC'} />\n {isDesktop && <DurationField source=\"duration\" />}\n {config.enableStarRating && (\n <RatingField\n source={'rating'}\n resource={'album'}\n sortByOrder={'DESC'}\n className={classes.ratingField}\n />\n )}\n <AlbumContextMenu\n source={'starred'}\n sortBy={'starred ASC, starredAt ASC'}\n sortByOrder={'DESC'}\n sortable={config.enableFavourites}\n className={classes.contextMenu}\n label={\n config.enableFavourites && (\n <FavoriteBorderIcon\n fontSize={'small'}\n className={classes.columnIcon}\n />\n )\n }\n />\n </Datagrid>\n )\n}\n\nexport default AlbumListView\n","import React from 'react'\nimport {\n GridList,\n GridListTile,\n Typography,\n GridListTileBar,\n useMediaQuery,\n} from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport withWidth from '@material-ui/core/withWidth'\nimport { Link } from 'react-router-dom'\nimport { linkToRecord, Loading, useListContext } from 'react-admin'\nimport { withContentRect } from 'react-measure'\nimport subsonic from '../subsonic'\nimport {\n AlbumContextMenu,\n PlayButton,\n ArtistLinkField,\n RangeField,\n} from '../common'\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n margin: '20px',\n },\n tileBar: {\n transition: 'all 150ms ease-out',\n opacity: 0,\n textAlign: 'left',\n marginBottom: '3px',\n background:\n 'linear-gradient(to top, rgba(0,0,0,0.7) 0%,rgba(0,0,0,0.4) 70%,rgba(0,0,0,0) 100%)',\n },\n tileBarMobile: {\n textAlign: 'left',\n marginBottom: '3px',\n background:\n 'linear-gradient(to top, rgba(0,0,0,0.7) 0%,rgba(0,0,0,0.4) 70%,rgba(0,0,0,0) 100%)',\n },\n albumArtistName: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n textAlign: 'left',\n fontSize: '1em',\n },\n albumName: {\n fontSize: '14px',\n color: theme.palette.type === 'dark' ? '#eee' : 'black',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n albumSubtitle: {\n fontSize: '12px',\n color: theme.palette.type === 'dark' ? '#c5c5c5' : '#696969',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n },\n link: {\n position: 'relative',\n display: 'block',\n textDecoration: 'none',\n '&:hover $tileBar': {\n opacity: 1,\n },\n },\n albumLink: {\n position: 'relative',\n display: 'block',\n textDecoration: 'none',\n },\n albumContainer: {},\n albumPlayButton: { color: 'white' },\n }),\n { name: 'NDAlbumGridView' }\n)\n\nconst useCoverStyles = makeStyles({\n cover: {\n display: 'inline-block',\n width: '100%',\n objectFit: 'contain',\n height: (props) => props.height,\n },\n})\n\nconst getColsForWidth = (width) => {\n if (width === 'xs') return 2\n if (width === 'sm') return 3\n if (width === 'md') return 4\n if (width === 'lg') return 6\n return 9\n}\n\nconst Cover = withContentRect('bounds')(\n ({ album, measureRef, contentRect }) => {\n // Force height to be the same as the width determined by the GridList\n // noinspection JSSuspiciousNameCombination\n const classes = useCoverStyles({ height: contentRect.bounds.width })\n return (\n <div ref={measureRef}>\n <img\n src={subsonic.getCoverArtUrl(album, 300)}\n alt={album.album}\n className={classes.cover}\n />\n </div>\n )\n }\n)\n\nconst AlbumGridTile = ({ showArtist, record, basePath }) => {\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n const classes = useStyles()\n\n return (\n <div className={classes.albumContainer}>\n <Link\n className={classes.link}\n to={linkToRecord(basePath, record.id, 'show')}\n >\n <Cover album={record} />\n <GridListTileBar\n className={isDesktop ? classes.tileBar : classes.tileBarMobile}\n subtitle={\n <PlayButton\n className={classes.albumPlayButton}\n record={record}\n size=\"small\"\n />\n }\n actionIcon={<AlbumContextMenu record={record} color={'white'} />}\n />\n </Link>\n <Link\n className={classes.albumLink}\n to={linkToRecord(basePath, record.id, 'show')}\n >\n <Typography className={classes.albumName}>{record.name}</Typography>\n </Link>\n {showArtist ? (\n <ArtistLinkField record={record} className={classes.albumSubtitle} />\n ) : (\n <RangeField\n record={record}\n source={'year'}\n sortBy={'maxYear'}\n sortByOrder={'DESC'}\n className={classes.albumSubtitle}\n />\n )}\n </div>\n )\n}\n\nconst LoadedAlbumGrid = ({ ids, data, basePath, width }) => {\n const classes = useStyles()\n const { filterValues } = useListContext()\n const isArtistView = !!(filterValues && filterValues.artist_id)\n\n return (\n <div className={classes.root}>\n <GridList\n component={'div'}\n cellHeight={'auto'}\n cols={getColsForWidth(width)}\n spacing={20}\n >\n {ids.map((id) => (\n <GridListTile className={classes.gridListTile} key={id}>\n <AlbumGridTile\n record={data[id]}\n basePath={basePath}\n showArtist={!isArtistView}\n />\n </GridListTile>\n ))}\n </GridList>\n </div>\n )\n}\n\nconst AlbumGridView = ({ loading, ...props }) =>\n loading ? <Loading /> : <LoadedAlbumGrid {...props} />\n\nexport default withWidth()(AlbumGridView)\n","import React from 'react'\nimport { useSelector } from 'react-redux'\nimport { Redirect, useLocation } from 'react-router-dom'\nimport {\n AutocompleteInput,\n Filter,\n NullableBooleanInput,\n NumberInput,\n ReferenceInput,\n SearchInput,\n Pagination,\n useTranslate,\n} from 'react-admin'\nimport FavoriteIcon from '@material-ui/icons/Favorite'\nimport { withWidth } from '@material-ui/core'\nimport { List, QuickFilter, Title, useAlbumsPerPage } from '../common'\nimport AlbumListActions from './AlbumListActions'\nimport AlbumListView from './AlbumListView'\nimport AlbumGridView from './AlbumGridView'\nimport { AddToPlaylistDialog } from '../dialogs'\nimport albumLists, { defaultAlbumList } from './albumLists'\nimport config from '../config'\n\nconst AlbumFilter = (props) => {\n const translate = useTranslate()\n return (\n <Filter {...props} variant={'outlined'}>\n <SearchInput source=\"name\" alwaysOn />\n <ReferenceInput\n label={translate('resources.album.fields.artist')}\n source=\"artist_id\"\n reference=\"artist\"\n sort={{ field: 'name', order: 'ASC' }}\n filterToQuery={(searchText) => ({ name: [searchText] })}\n >\n <AutocompleteInput emptyText=\"-- None --\" />\n </ReferenceInput>\n <NullableBooleanInput source=\"compilation\" />\n <NumberInput source=\"year\" />\n {config.enableFavourites && (\n <QuickFilter\n source=\"starred\"\n label={<FavoriteIcon fontSize={'small'} />}\n defaultValue={true}\n />\n )}\n </Filter>\n )\n}\n\nconst AlbumListTitle = ({ albumListType }) => {\n const translate = useTranslate()\n let title = translate('resources.album.name', { smart_count: 2 })\n if (albumListType) {\n let listTitle = translate(`resources.album.lists.${albumListType}`, {\n smart_count: 2,\n })\n title = `${title} - ${listTitle}`\n }\n return <Title subTitle={title} args={{ smart_count: 2 }} />\n}\n\nconst AlbumList = (props) => {\n const { width } = props\n const albumView = useSelector((state) => state.albumView)\n const [perPage, perPageOptions] = useAlbumsPerPage(width)\n const location = useLocation()\n\n const albumListType = location.pathname\n .replace(/^\\/album/, '')\n .replace(/^\\//, '')\n\n // If it does not have filter/sort params (usually coming from Menu),\n // reload with correct filter/sort params\n if (!location.search) {\n const type =\n albumListType || localStorage.getItem('defaultView') || defaultAlbumList\n const listParams = albumLists[type]\n if (listParams) {\n return <Redirect to={`/album/${type}?${listParams.params}`} />\n }\n }\n\n return (\n <>\n <List\n {...props}\n exporter={false}\n bulkActionButtons={false}\n actions={<AlbumListActions />}\n filters={<AlbumFilter />}\n perPage={perPage}\n pagination={<Pagination rowsPerPageOptions={perPageOptions} />}\n title={<AlbumListTitle albumListType={albumListType} />}\n >\n {albumView.grid ? (\n <AlbumGridView {...props} />\n ) : (\n <AlbumListView {...props} />\n )}\n </List>\n <AddToPlaylistDialog />\n </>\n )\n}\n\nexport default withWidth()(AlbumList)\n","import React from 'react'\nimport {\n BulkActionsToolbar,\n ListToolbar,\n TextField,\n useVersion,\n useListContext,\n} from 'react-admin'\nimport clsx from 'clsx'\nimport { useDispatch } from 'react-redux'\nimport { Card, useMediaQuery } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder'\nimport { playTracks } from '../actions'\nimport {\n DurationField,\n SongBulkActions,\n SongContextMenu,\n SongDatagrid,\n SongDetails,\n SongTitleField,\n RatingField,\n} from '../common'\nimport { AddToPlaylistDialog } from '../dialogs'\nimport { QualityInfo } from '../common/QualityInfo'\nimport config from '../config'\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {},\n main: {\n display: 'flex',\n },\n content: {\n marginTop: 0,\n transition: theme.transitions.create('margin-top'),\n position: 'relative',\n flex: '1 1 auto',\n [theme.breakpoints.down('xs')]: {\n boxShadow: 'none',\n },\n },\n bulkActionsDisplayed: {\n marginTop: -theme.spacing(8),\n transition: theme.transitions.create('margin-top'),\n },\n actions: {\n zIndex: 2,\n display: 'flex',\n justifyContent: 'flex-end',\n flexWrap: 'wrap',\n },\n noResults: { padding: 20 },\n columnIcon: {\n marginLeft: '3px',\n marginTop: '-2px',\n verticalAlign: 'text-top',\n },\n toolbar: {\n justifyContent: 'flex-start',\n },\n row: {\n '&:hover': {\n '& $contextMenu': {\n visibility: 'visible',\n },\n '& $ratingField': {\n visibility: 'visible',\n },\n },\n },\n contextMenu: {\n visibility: (props) => (props.isDesktop ? 'hidden' : 'visible'),\n },\n ratingField: {\n visibility: 'hidden',\n },\n }),\n { name: 'RaList' }\n)\n\nconst AlbumSongs = (props) => {\n const { data, ids } = props\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n const classes = useStyles({ isDesktop })\n const dispatch = useDispatch()\n const version = useVersion()\n return (\n <>\n <ListToolbar\n classes={{ toolbar: classes.toolbar }}\n actions={props.actions}\n {...props}\n />\n <div className={classes.main}>\n <Card\n className={clsx(classes.content, {\n [classes.bulkActionsDisplayed]: props.selectedIds.length > 0,\n })}\n key={version}\n >\n <BulkActionsToolbar {...props}>\n <SongBulkActions />\n </BulkActionsToolbar>\n <SongDatagrid\n expand={isXsmall ? null : <SongDetails />}\n rowClick={(id) => dispatch(playTracks(data, ids, id))}\n {...props}\n hasBulkActions={true}\n showDiscSubtitles={true}\n contextAlwaysVisible={!isDesktop}\n classes={{ row: classes.row }}\n >\n {isDesktop && (\n <TextField\n source=\"trackNumber\"\n sortBy=\"discNumber asc, trackNumber asc\"\n label=\"#\"\n sortable={false}\n />\n )}\n <SongTitleField\n source=\"title\"\n sortable={false}\n showTrackNumbers={!isDesktop}\n />\n {isDesktop && <TextField source=\"artist\" sortable={false} />}\n <DurationField source=\"duration\" sortable={false} />\n {isDesktop && <QualityInfo source=\"quality\" sortable={false} />}\n {isDesktop && config.enableStarRating && (\n <RatingField\n source=\"rating\"\n resource={'albumSong'}\n sortable={false}\n className={classes.ratingField}\n />\n )}\n <SongContextMenu\n source={'starred'}\n sortable={false}\n className={classes.contextMenu}\n label={\n config.enableFavourites && (\n <FavoriteBorderIcon\n fontSize={'small'}\n className={classes.columnIcon}\n />\n )\n }\n />\n </SongDatagrid>\n </Card>\n </div>\n <AddToPlaylistDialog />\n </>\n )\n}\n\nexport const removeAlbumCommentsFromSongs = ({ album, data }) => {\n if (album?.comment && data) {\n Object.values(data).forEach((song) => {\n song.comment = ''\n })\n }\n}\n\nconst SanitizedAlbumSongs = (props) => {\n removeAlbumCommentsFromSongs(props)\n\n const { loaded, loading, total, ...rest } = useListContext(props)\n return <>{loaded && <AlbumSongs {...rest} actions={props.actions} />}</>\n}\n\nexport default SanitizedAlbumSongs\n","import React, { useMemo, useCallback } from 'react'\nimport {\n Card,\n CardContent,\n CardMedia,\n Collapse,\n makeStyles,\n Typography,\n useMediaQuery,\n} from '@material-ui/core'\nimport { useTranslate } from 'react-admin'\nimport clsx from 'clsx'\nimport Lightbox from 'react-image-lightbox'\nimport 'react-image-lightbox/style.css'\nimport subsonic from '../subsonic'\nimport {\n ArtistLinkField,\n DurationField,\n formatRange,\n SizeField,\n LoveButton,\n RatingField,\n} from '../common'\nimport config from '../config'\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {\n [theme.breakpoints.down('xs')]: {\n padding: '0.7em',\n minWidth: '20em',\n },\n [theme.breakpoints.up('sm')]: {\n padding: '1em',\n minWidth: '32em',\n },\n },\n cardContents: {\n display: 'flex',\n },\n details: {\n display: 'flex',\n flexDirection: 'column',\n },\n content: {\n flex: '2 0 auto',\n },\n coverParent: {\n [theme.breakpoints.down('xs')]: {\n height: '8em',\n width: '8em',\n minWidth: '8em',\n },\n [theme.breakpoints.up('sm')]: {\n height: '10em',\n width: '10em',\n minWidth: '10em',\n },\n [theme.breakpoints.up('lg')]: {\n height: '15em',\n width: '15em',\n minWidth: '15em',\n },\n },\n cover: {\n objectFit: 'contain',\n cursor: 'pointer',\n display: 'block',\n width: '100%',\n height: '100%',\n },\n loveButton: {\n top: theme.spacing(-0.2),\n left: theme.spacing(0.5),\n },\n commentBlock: {\n display: 'inline-block',\n marginTop: '1em',\n float: 'left',\n wordBreak: 'break-all',\n },\n pointerCursor: {\n cursor: 'pointer',\n },\n recordName: {},\n recordArtist: {},\n recordMeta: {},\n }),\n {\n name: 'NDAlbumDetails',\n }\n)\n\nconst AlbumComment = ({ record }) => {\n const classes = useStyles()\n const [expanded, setExpanded] = React.useState(false)\n\n const lines = record.comment.split('\\n')\n const formatted = useMemo(() => {\n return lines.map((line, idx) => (\n <span key={record.id + '-comment-' + idx}>\n <span dangerouslySetInnerHTML={{ __html: line }} />\n <br />\n </span>\n ))\n }, [lines, record.id])\n\n const handleExpandClick = useCallback(() => {\n setExpanded(!expanded)\n }, [expanded, setExpanded])\n\n return (\n <Collapse\n collapsedHeight={'1.5em'}\n in={expanded}\n timeout={'auto'}\n className={clsx(\n classes.commentBlock,\n lines.length > 1 && classes.pointerCursor\n )}\n >\n <Typography variant={'body1'} onClick={handleExpandClick}>\n {formatted}\n </Typography>\n </Collapse>\n )\n}\n\nconst AlbumDetails = ({ record }) => {\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('lg'))\n const classes = useStyles()\n const [isLightboxOpen, setLightboxOpen] = React.useState(false)\n const translate = useTranslate()\n\n const genreYear = (record) => {\n let genreDateLine = []\n if (record.genre) {\n genreDateLine.push(record.genre)\n }\n const year = formatRange(record, 'year')\n if (year) {\n genreDateLine.push(year)\n }\n return genreDateLine.join(' · ')\n }\n\n const imageUrl = subsonic.getCoverArtUrl(record, 300)\n const fullImageUrl = subsonic.getCoverArtUrl(record)\n\n const handleOpenLightbox = React.useCallback(() => setLightboxOpen(true), [])\n const handleCloseLightbox = React.useCallback(\n () => setLightboxOpen(false),\n []\n )\n return (\n <Card className={classes.root}>\n <div className={classes.cardContents}>\n <div className={classes.coverParent}>\n <CardMedia\n component={'img'}\n src={imageUrl}\n width=\"400\"\n height=\"400\"\n className={classes.cover}\n onClick={handleOpenLightbox}\n title={record.name}\n />\n </div>\n <div className={classes.details}>\n <CardContent className={classes.content}>\n <Typography\n variant={isDesktop ? 'h5' : 'h6'}\n className={classes.recordName}\n >\n {record.name}\n {config.enableFavourites && (\n <LoveButton\n className={classes.loveButton}\n record={record}\n resource={'album'}\n size={isDesktop ? 'default' : 'small'}\n aria-label=\"love\"\n color=\"primary\"\n />\n )}\n </Typography>\n <Typography component=\"h6\" className={classes.recordArtist}>\n <ArtistLinkField record={record} />\n </Typography>\n <Typography component=\"p\" className={classes.recordMeta}>\n {genreYear(record)}\n </Typography>\n <Typography component=\"p\" className={classes.recordMeta}>\n {record.songCount}{' '}\n {translate('resources.song.name', {\n smart_count: record.songCount,\n })}\n {' · '} <DurationField record={record} source={'duration'} />{' '}\n {' · '}\n <SizeField record={record} source=\"size\" />\n </Typography>\n {config.enableStarRating && (\n <div>\n <RatingField\n record={record}\n resource={'album'}\n size={isDesktop ? 'medium' : 'small'}\n />\n </div>\n )}\n {isDesktop && record['comment'] && <AlbumComment record={record} />}\n </CardContent>\n </div>\n </div>\n {!isDesktop && record['comment'] && <AlbumComment record={record} />}\n {isLightboxOpen && (\n <Lightbox\n imagePadding={50}\n animationDuration={200}\n imageTitle={record.name}\n mainSrc={fullImageUrl}\n onCloseRequest={handleCloseLightbox}\n />\n )}\n </Card>\n )\n}\n\nexport default AlbumDetails\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport { useDispatch } from 'react-redux'\nimport {\n Button,\n sanitizeListRestProps,\n TopToolbar,\n useTranslate,\n} from 'react-admin'\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow'\nimport ShuffleIcon from '@material-ui/icons/Shuffle'\nimport CloudDownloadOutlinedIcon from '@material-ui/icons/CloudDownloadOutlined'\nimport { RiPlayListAddFill, RiPlayList2Fill } from 'react-icons/ri'\nimport { playNext, addTracks, playTracks, shuffleTracks } from '../actions'\nimport subsonic from '../subsonic'\nimport { formatBytes } from '../utils'\nimport { useMediaQuery } from '@material-ui/core'\nimport config from '../config'\n\nconst AlbumActions = ({\n className,\n ids,\n data,\n record,\n permanentFilter,\n ...rest\n}) => {\n const dispatch = useDispatch()\n const translate = useTranslate()\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n\n const handlePlay = React.useCallback(() => {\n dispatch(playTracks(data, ids))\n }, [dispatch, data, ids])\n\n const handlePlayNext = React.useCallback(() => {\n dispatch(playNext(data, ids))\n }, [dispatch, data, ids])\n\n const handlePlayLater = React.useCallback(() => {\n dispatch(addTracks(data, ids))\n }, [dispatch, data, ids])\n\n const handleShuffle = React.useCallback(() => {\n dispatch(shuffleTracks(data, ids))\n }, [dispatch, data, ids])\n\n const handleDownload = React.useCallback(() => {\n subsonic.download(record.id)\n }, [record])\n\n return (\n <TopToolbar className={className} {...sanitizeListRestProps(rest)}>\n <Button\n onClick={handlePlay}\n label={translate('resources.album.actions.playAll')}\n >\n <PlayArrowIcon />\n </Button>\n <Button\n onClick={handleShuffle}\n label={translate('resources.album.actions.shuffle')}\n >\n <ShuffleIcon />\n </Button>\n <Button\n onClick={handlePlayNext}\n label={translate('resources.album.actions.playNext')}\n >\n <RiPlayList2Fill />\n </Button>\n <Button\n onClick={handlePlayLater}\n label={translate('resources.album.actions.addToQueue')}\n >\n <RiPlayListAddFill />\n </Button>\n {config.enableDownloads && (\n <Button\n onClick={handleDownload}\n label={\n translate('resources.album.actions.download') +\n (isDesktop ? ` (${formatBytes(record.size)})` : '')\n }\n >\n <CloudDownloadOutlinedIcon />\n </Button>\n )}\n </TopToolbar>\n )\n}\n\nAlbumActions.propTypes = {\n record: PropTypes.object.isRequired,\n selectedIds: PropTypes.arrayOf(PropTypes.number),\n}\n\nAlbumActions.defaultProps = {\n record: {},\n selectedIds: [],\n onUnselectItems: () => null,\n}\n\nexport default AlbumActions\n","import React from 'react'\nimport {\n ReferenceManyField,\n ShowContextProvider,\n useShowContext,\n useShowController,\n} from 'react-admin'\nimport { makeStyles } from '@material-ui/core/styles'\nimport AlbumSongs from './AlbumSongs'\nimport AlbumDetails from './AlbumDetails'\nimport AlbumActions from './AlbumActions'\n\nconst useStyles = makeStyles(\n (theme) => ({\n albumActions: {},\n }),\n {\n name: 'NDAlbumShow',\n }\n)\n\nconst AlbumShowLayout = (props) => {\n const { loading, ...context } = useShowContext(props)\n const { record } = context\n const classes = useStyles()\n\n return (\n <>\n {record && <AlbumDetails {...context} />}\n {record && (\n <ReferenceManyField\n {...context}\n addLabel={false}\n reference=\"albumSong\"\n target=\"album_id\"\n sort={{ field: 'album', order: 'ASC' }}\n perPage={0}\n pagination={null}\n >\n <AlbumSongs\n resource={'albumSong'}\n exporter={false}\n album={record}\n actions={\n <AlbumActions className={classes.albumActions} record={record} />\n }\n />\n </ReferenceManyField>\n )}\n </>\n )\n}\n\nconst AlbumShow = (props) => {\n const controllerProps = useShowController(props)\n return (\n <ShowContextProvider value={controllerProps}>\n <AlbumShowLayout {...props} {...controllerProps} />\n </ShowContextProvider>\n )\n}\n\nexport default AlbumShow\n","import AlbumList from './AlbumList'\nimport AlbumShow from './AlbumShow'\n\nexport default {\n list: AlbumList,\n show: AlbumShow,\n}\n","import React from 'react'\nimport { useHistory } from 'react-router-dom'\nimport {\n Datagrid,\n Filter,\n NumberField,\n SearchInput,\n TextField,\n} from 'react-admin'\nimport { useMediaQuery, withWidth } from '@material-ui/core'\nimport FavoriteIcon from '@material-ui/icons/Favorite'\nimport FavoriteBorderIcon from '@material-ui/icons/FavoriteBorder'\nimport { AddToPlaylistDialog } from '../dialogs'\nimport {\n ArtistContextMenu,\n List,\n QuickFilter,\n useGetHandleArtistClick,\n ArtistSimpleList,\n RatingField,\n} from '../common'\nimport { makeStyles } from '@material-ui/core/styles'\nimport config from '../config'\n\nconst useStyles = makeStyles({\n contextHeader: {\n marginLeft: '3px',\n marginTop: '-2px',\n verticalAlign: 'text-top',\n },\n row: {\n '&:hover': {\n '& $contextMenu': {\n visibility: 'visible',\n },\n '& $ratingField': {\n visibility: 'visible',\n },\n },\n },\n contextMenu: {\n visibility: 'hidden',\n },\n ratingField: {\n visibility: 'hidden',\n },\n})\n\nconst ArtistFilter = (props) => (\n <Filter {...props} variant={'outlined'}>\n <SearchInput source=\"name\" alwaysOn />\n {config.enableFavourites && (\n <QuickFilter\n source=\"starred\"\n label={<FavoriteIcon fontSize={'small'} />}\n defaultValue={true}\n />\n )}\n </Filter>\n)\n\nconst ArtistListView = ({ hasShow, hasEdit, hasList, width, ...rest }) => {\n const classes = useStyles()\n const handleArtistLink = useGetHandleArtistClick(width)\n const history = useHistory()\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n return isXsmall ? (\n <ArtistSimpleList\n linkType={(id) => history.push(handleArtistLink(id))}\n {...rest}\n />\n ) : (\n <Datagrid rowClick={handleArtistLink} classes={{ row: classes.row }}>\n <TextField source=\"name\" />\n <NumberField source=\"albumCount\" sortByOrder={'DESC'} />\n <NumberField source=\"songCount\" sortByOrder={'DESC'} />\n <NumberField source=\"playCount\" sortByOrder={'DESC'} />\n {config.enableStarRating && (\n <RatingField\n source=\"rating\"\n sortByOrder={'DESC'}\n resource={'artist'}\n className={classes.ratingField}\n />\n )}\n <ArtistContextMenu\n source={'starred'}\n sortBy={'starred ASC, starredAt ASC'}\n sortByOrder={'DESC'}\n sortable={config.enableFavourites}\n className={classes.contextMenu}\n label={\n config.enableFavourites && (\n <FavoriteBorderIcon\n fontSize={'small'}\n className={classes.contextHeader}\n />\n )\n }\n />\n </Datagrid>\n )\n}\n\nconst ArtistList = (props) => {\n return (\n <>\n <List\n {...props}\n sort={{ field: 'name', order: 'ASC' }}\n exporter={false}\n bulkActionButtons={false}\n filters={<ArtistFilter />}\n >\n <ArtistListView {...props} />\n </List>\n <AddToPlaylistDialog />\n </>\n )\n}\n\nexport default withWidth()(ArtistList)\n","import React from 'react'\nimport ArtistList from './ArtistList'\nimport DynamicMenuIcon from '../layout/DynamicMenuIcon'\nimport MicNoneOutlinedIcon from '@material-ui/icons/MicNoneOutlined'\nimport MicIcon from '@material-ui/icons/Mic'\n\nexport default {\n list: ArtistList,\n icon: (\n <DynamicMenuIcon\n path={'artist'}\n icon={MicNoneOutlinedIcon}\n activeIcon={MicIcon}\n />\n ),\n}\n","import React from 'react'\nimport {\n Datagrid,\n DateField,\n EditButton,\n Filter,\n NumberField,\n SearchInput,\n TextField,\n useUpdate,\n useNotify,\n} from 'react-admin'\nimport Switch from '@material-ui/core/Switch'\nimport { DurationField, List, Writable, isWritable } from '../common'\nimport { useMediaQuery } from '@material-ui/core'\n\nconst PlaylistFilter = (props) => (\n <Filter {...props} variant={'outlined'}>\n <SearchInput source=\"name\" alwaysOn />\n </Filter>\n)\n\nconst TogglePublicInput = ({ permissions, resource, record = {}, source }) => {\n const notify = useNotify()\n const [togglePublic] = useUpdate(\n resource,\n record.id,\n {\n ...record,\n public: !record.public,\n },\n {\n undoable: false,\n onFailure: (error) => {\n console.log(error)\n notify('ra.page.error', 'warning')\n },\n }\n )\n\n const handleClick = (e) => {\n togglePublic()\n e.stopPropagation()\n }\n\n const canChange =\n permissions === 'admin' ||\n localStorage.getItem('username') === record['owner']\n\n return (\n <Switch\n checked={record[source]}\n onClick={handleClick}\n disabled={!canChange}\n />\n )\n}\n\nconst PlaylistList = ({ permissions, ...props }) => {\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n\n return (\n <List {...props} exporter={false} filters={<PlaylistFilter />}>\n <Datagrid\n rowClick=\"show\"\n isRowSelectable={(r) => isWritable(r && r.owner)}\n >\n <TextField source=\"name\" />\n <TextField source=\"owner\" />\n {isDesktop && <NumberField source=\"songCount\" />}\n {isDesktop && <DurationField source=\"duration\" />}\n {isDesktop && <DateField source=\"updatedAt\" sortByOrder={'DESC'} />}\n {!isXsmall && (\n <TogglePublicInput\n source=\"public\"\n permissions={permissions}\n sortByOrder={'DESC'}\n />\n )}\n <Writable>\n <EditButton />\n </Writable>\n </Datagrid>\n </List>\n )\n}\n\nexport default PlaylistList\n","import React, { Fragment } from 'react'\n\nimport {\n Edit,\n FormDataConsumer,\n SimpleForm,\n TextInput,\n TextField,\n BooleanInput,\n required,\n useTranslate,\n} from 'react-admin'\nimport { Title } from '../common'\n\nconst SyncFragment = ({ formData, variant, ...rest }) => {\n return (\n <Fragment>\n {formData.path && <BooleanInput source=\"sync\" {...rest} />}\n {formData.path && <TextField source=\"path\" {...rest} />}\n </Fragment>\n )\n}\n\nconst PlaylistTitle = ({ record }) => {\n const translate = useTranslate()\n const resourceName = translate('resources.playlist.name', { smart_count: 1 })\n return <Title subTitle={`${resourceName} \"${record ? record.name : ''}\"`} />\n}\n\nconst PlaylistEdit = (props) => (\n <Edit title={<PlaylistTitle />} {...props}>\n <SimpleForm redirect=\"list\" variant={'outlined'}>\n <TextInput source=\"name\" validate={required()} />\n <TextInput multiline source=\"comment\" />\n <BooleanInput source=\"public\" />\n <FormDataConsumer>\n {(formDataProps) => <SyncFragment {...formDataProps} />}\n </FormDataConsumer>\n </SimpleForm>\n </Edit>\n)\n\nexport default PlaylistEdit\n","import React from 'react'\nimport {\n Create,\n SimpleForm,\n TextInput,\n BooleanInput,\n required,\n useTranslate,\n} from 'react-admin'\nimport { Title } from '../common'\n\nconst PlaylistCreate = (props) => {\n const translate = useTranslate()\n const resourceName = translate('resources.playlist.name', { smart_count: 1 })\n const title = translate('ra.page.create', {\n name: `${resourceName}`,\n })\n return (\n <Create title={<Title subTitle={title} />} {...props}>\n <SimpleForm redirect=\"list\" variant={'outlined'}>\n <TextInput source=\"name\" validate={required()} />\n <TextInput multiline source=\"comment\" />\n <BooleanInput source=\"public\" initialValue={true} />\n </SimpleForm>\n </Create>\n )\n}\n\nexport default PlaylistCreate\n","import React from 'react'\nimport { Card, CardContent, Typography } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport { useTranslate } from 'react-admin'\nimport { DurationField, SizeField } from '../common'\n\nconst useStyles = makeStyles(\n (theme) => ({\n container: {\n [theme.breakpoints.down('xs')]: {\n padding: '0.7em',\n minWidth: '24em',\n },\n [theme.breakpoints.up('sm')]: {\n padding: '1em',\n minWidth: '32em',\n },\n },\n details: {\n display: 'inline-block',\n verticalAlign: 'top',\n [theme.breakpoints.down('xs')]: {\n width: '14em',\n },\n [theme.breakpoints.up('sm')]: {\n width: '26em',\n },\n [theme.breakpoints.up('lg')]: {\n width: '38em',\n },\n },\n title: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n }),\n {\n name: 'NDPlaylistDetails',\n }\n)\n\nconst PlaylistDetails = (props) => {\n const { record = {} } = props\n const translate = useTranslate()\n const classes = useStyles()\n\n return (\n <Card className={classes.container}>\n <CardContent className={classes.details}>\n <Typography variant=\"h5\" className={classes.title}>\n {record.name || translate('ra.page.loading')}\n </Typography>\n <Typography component=\"h6\">{record.comment}</Typography>\n <Typography component=\"p\">\n {record.songCount ? (\n <span>\n {record.songCount}{' '}\n {translate('resources.song.name', {\n smart_count: record.songCount,\n })}\n {' · '}\n <DurationField record={record} source={'duration'} />\n {' · '}\n <SizeField record={record} source={'size'} />\n </span>\n ) : (\n <span> </span>\n )}\n </Typography>\n </CardContent>\n </Card>\n )\n}\n\nexport default PlaylistDetails\n","import React, { Fragment, useEffect } from 'react'\nimport {\n BulkDeleteButton,\n useUnselectAll,\n ResourceContextProvider,\n} from 'react-admin'\nimport PropTypes from 'prop-types'\n\n// Replace original resource with \"fake\" one for removing tracks from playlist\nconst PlaylistSongBulkActions = ({\n playlistId,\n resource,\n onUnselectItems,\n ...rest\n}) => {\n const unselectAll = useUnselectAll()\n useEffect(() => {\n unselectAll('playlistTrack')\n }, [unselectAll])\n\n const mappedResource = `playlist/${playlistId}/tracks`\n return (\n <ResourceContextProvider value={mappedResource}>\n <Fragment>\n <BulkDeleteButton\n {...rest}\n resource={mappedResource}\n onClick={onUnselectItems}\n />\n </Fragment>\n </ResourceContextProvider>\n )\n}\n\nPlaylistSongBulkActions.propTypes = {\n playlistId: PropTypes.string.isRequired,\n}\n\nexport default PlaylistSongBulkActions\n","import React, { useCallback } from 'react'\nimport {\n BulkActionsToolbar,\n ListToolbar,\n TextField,\n useRefresh,\n useDataProvider,\n useNotify,\n useVersion,\n useListContext,\n ListBase,\n} from 'react-admin'\nimport clsx from 'clsx'\nimport { useDispatch } from 'react-redux'\nimport { Card, useMediaQuery } from '@material-ui/core'\nimport { makeStyles } from '@material-ui/core/styles'\nimport ReactDragListView from 'react-drag-listview'\nimport {\n DurationField,\n SongDetails,\n SongContextMenu,\n SongDatagrid,\n SongTitleField,\n} from '../common'\nimport { AddToPlaylistDialog } from '../dialogs'\nimport { AlbumLinkField } from '../song/AlbumLinkField'\nimport { playTracks } from '../actions'\nimport PlaylistSongBulkActions from './PlaylistSongBulkActions'\nimport { QualityInfo } from '../common/QualityInfo'\n\nconst useStyles = makeStyles(\n (theme) => ({\n root: {},\n main: {\n display: 'flex',\n },\n content: {\n marginTop: 0,\n transition: theme.transitions.create('margin-top'),\n position: 'relative',\n flex: '1 1 auto',\n [theme.breakpoints.down('xs')]: {\n boxShadow: 'none',\n },\n },\n bulkActionsDisplayed: {\n marginTop: -theme.spacing(8),\n transition: theme.transitions.create('margin-top'),\n },\n actions: {\n zIndex: 2,\n display: 'flex',\n justifyContent: 'flex-end',\n flexWrap: 'wrap',\n },\n noResults: { padding: 20 },\n toolbar: {\n justifyContent: 'flex-start',\n },\n row: {\n '&:hover': {\n '& $contextMenu': {\n visibility: 'visible',\n },\n },\n },\n contextMenu: {\n visibility: (props) => (props.isDesktop ? 'hidden' : 'visible'),\n },\n }),\n { name: 'RaList' }\n)\n\nconst ReorderableList = ({ readOnly, children, ...rest }) => {\n if (readOnly) {\n return children\n }\n return <ReactDragListView {...rest}>{children}</ReactDragListView>\n}\n\nconst PlaylistSongs = ({ playlistId, readOnly, actions, ...props }) => {\n const listContext = useListContext()\n const { data, ids, onUnselectItems } = listContext\n const isXsmall = useMediaQuery((theme) => theme.breakpoints.down('xs'))\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n const classes = useStyles({ isDesktop })\n const dispatch = useDispatch()\n const dataProvider = useDataProvider()\n const refresh = useRefresh()\n const notify = useNotify()\n const version = useVersion()\n\n const onAddToPlaylist = useCallback(\n (pls) => {\n if (pls.id === playlistId) {\n refresh()\n }\n },\n [playlistId, refresh]\n )\n\n const reorder = useCallback(\n (playlistId, id, newPos) => {\n dataProvider\n .update('playlistTrack', {\n id,\n data: { insert_before: newPos },\n filter: { playlist_id: playlistId },\n })\n .then(() => {\n refresh()\n })\n .catch(() => {\n notify('ra.page.error', 'warning')\n })\n },\n [dataProvider, notify, refresh]\n )\n\n const handleDragEnd = useCallback(\n (from, to) => {\n const toId = ids[to]\n const fromId = ids[from]\n reorder(playlistId, fromId, toId)\n },\n [playlistId, reorder, ids]\n )\n\n return (\n <>\n <ListToolbar\n classes={{ toolbar: classes.toolbar }}\n filters={props.filters}\n actions={actions}\n {...listContext}\n />\n <div className={classes.main}>\n <Card\n className={clsx(classes.content, {\n [classes.bulkActionsDisplayed]: listContext.selectedIds.length > 0,\n })}\n key={version}\n >\n <BulkActionsToolbar {...listContext}>\n <PlaylistSongBulkActions\n playlistId={playlistId}\n onUnselectItems={onUnselectItems}\n />\n </BulkActionsToolbar>\n <ReorderableList\n readOnly={readOnly}\n onDragEnd={handleDragEnd}\n nodeSelector={'tr'}\n >\n <SongDatagrid\n expand={!isXsmall && <SongDetails />}\n rowClick={(id) => dispatch(playTracks(data, ids, id))}\n {...listContext}\n hasBulkActions={true}\n contextAlwaysVisible={!isDesktop}\n classes={{ row: classes.row }}\n >\n {isDesktop && <TextField source=\"id\" label={'#'} />}\n <SongTitleField source=\"title\" showTrackNumbers={false} />\n {isDesktop && <AlbumLinkField source=\"album\" />}\n {isDesktop && <TextField source=\"artist\" />}\n <DurationField source=\"duration\" className={classes.draggable} />\n {isDesktop && <QualityInfo source=\"quality\" sortable={false} />}\n <SongContextMenu\n onAddToPlaylist={onAddToPlaylist}\n showLove={false}\n className={classes.contextMenu}\n />\n </SongDatagrid>\n </ReorderableList>\n </Card>\n </div>\n <AddToPlaylistDialog />\n {React.cloneElement(props.pagination, listContext)}\n </>\n )\n}\n\nconst SanitizedPlaylistSongs = (props) => {\n const { loaded, ...rest } = props\n return (\n <>\n {loaded && (\n <>\n <ListBase {...props}>\n <PlaylistSongs\n playlistId={props.id}\n actions={props.actions}\n pagination={props.pagination}\n {...rest}\n />\n </ListBase>\n </>\n )}\n </>\n )\n}\n\nexport default SanitizedPlaylistSongs\n","import React from 'react'\nimport { useDispatch } from 'react-redux'\nimport {\n Button,\n sanitizeListRestProps,\n TopToolbar,\n useTranslate,\n useDataProvider,\n useNotify,\n} from 'react-admin'\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow'\nimport ShuffleIcon from '@material-ui/icons/Shuffle'\nimport CloudDownloadOutlinedIcon from '@material-ui/icons/CloudDownloadOutlined'\nimport { RiPlayListAddFill, RiPlayList2Fill } from 'react-icons/ri'\nimport QueueMusicIcon from '@material-ui/icons/QueueMusic'\nimport { httpClient } from '../dataProvider'\nimport { playNext, addTracks, playTracks, shuffleTracks } from '../actions'\nimport { M3U_MIME_TYPE, REST_URL } from '../consts'\nimport subsonic from '../subsonic'\nimport PropTypes from 'prop-types'\nimport { formatBytes } from '../utils'\nimport { useMediaQuery } from '@material-ui/core'\nimport config from '../config'\n\nconst PlaylistActions = ({ className, ids, data, record, ...rest }) => {\n const dispatch = useDispatch()\n const translate = useTranslate()\n const dataProvider = useDataProvider()\n const notify = useNotify()\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n\n const getAllSongsAndDispatch = React.useCallback(\n (action) => {\n if (ids.length === record.songCount) {\n return dispatch(action(data, ids))\n }\n\n dataProvider\n .getList('playlistTrack', {\n pagination: { page: 1, perPage: 0 },\n sort: { field: 'id', order: 'ASC' },\n filter: { playlist_id: record.id },\n })\n .then((res) => {\n const data = res.data.reduce(\n (acc, curr) => ({ ...acc, [curr.id]: curr }),\n {}\n )\n dispatch(action(data))\n })\n .catch(() => {\n notify('ra.page.error', 'warning')\n })\n },\n [dataProvider, dispatch, record, data, ids, notify]\n )\n\n const handlePlay = React.useCallback(() => {\n getAllSongsAndDispatch(playTracks)\n }, [getAllSongsAndDispatch])\n\n const handlePlayNext = React.useCallback(() => {\n getAllSongsAndDispatch(playNext)\n }, [getAllSongsAndDispatch])\n\n const handlePlayLater = React.useCallback(() => {\n getAllSongsAndDispatch(addTracks)\n }, [getAllSongsAndDispatch])\n\n const handleShuffle = React.useCallback(() => {\n getAllSongsAndDispatch(shuffleTracks)\n }, [getAllSongsAndDispatch])\n\n const handleDownload = React.useCallback(() => {\n subsonic.download(record.id)\n }, [record])\n\n const handleExport = React.useCallback(\n () =>\n httpClient(`${REST_URL}/playlist/${record.id}/tracks`, {\n headers: new Headers({ Accept: M3U_MIME_TYPE }),\n }).then((res) => {\n const blob = new Blob([res.body], { type: M3U_MIME_TYPE })\n const url = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `${record.name}.m3u`\n document.body.appendChild(link)\n link.click()\n link.parentNode.removeChild(link)\n }),\n [record]\n )\n\n return (\n <TopToolbar className={className} {...sanitizeListRestProps(rest)}>\n <Button\n onClick={handlePlay}\n label={translate('resources.album.actions.playAll')}\n >\n <PlayArrowIcon />\n </Button>\n <Button\n onClick={handleShuffle}\n label={translate('resources.album.actions.shuffle')}\n >\n <ShuffleIcon />\n </Button>\n <Button\n onClick={handlePlayNext}\n label={translate('resources.album.actions.playNext')}\n >\n <RiPlayList2Fill />\n </Button>\n <Button\n onClick={handlePlayLater}\n label={translate('resources.album.actions.addToQueue')}\n >\n <RiPlayListAddFill />\n </Button>\n {config.enableDownloads && (\n <Button\n onClick={handleDownload}\n label={\n translate('resources.album.actions.download') +\n (isDesktop ? ` (${formatBytes(record.size)})` : '')\n }\n >\n <CloudDownloadOutlinedIcon />\n </Button>\n )}\n <Button\n onClick={handleExport}\n label={translate('resources.playlist.actions.export')}\n >\n <QueueMusicIcon />\n </Button>\n </TopToolbar>\n )\n}\n\nPlaylistActions.propTypes = {\n record: PropTypes.object.isRequired,\n selectedIds: PropTypes.arrayOf(PropTypes.number),\n}\n\nPlaylistActions.defaultProps = {\n record: {},\n selectedIds: [],\n onUnselectItems: () => null,\n}\n\nexport default PlaylistActions\n","import React from 'react'\nimport {\n ReferenceManyField,\n ShowContextProvider,\n useShowContext,\n useShowController,\n Pagination as RaPagination,\n} from 'react-admin'\nimport { makeStyles } from '@material-ui/core/styles'\nimport PlaylistDetails from './PlaylistDetails'\nimport PlaylistSongs from './PlaylistSongs'\nimport PlaylistActions from './PlaylistActions'\nimport { Title, isReadOnly } from '../common'\nconst useStyles = makeStyles(\n (theme) => ({\n playlistActions: {},\n }),\n {\n name: 'NDPlaylistShow',\n }\n)\n\nconst PlaylistShowLayout = (props) => {\n const { loading, ...context } = useShowContext(props)\n const { record } = context\n const classes = useStyles()\n\n return (\n <>\n {record && <PlaylistDetails {...context} />}\n {record && (\n <ReferenceManyField\n {...context}\n addLabel={false}\n reference=\"playlistTrack\"\n target=\"playlist_id\"\n sort={{ field: 'id', order: 'ASC' }}\n perPage={100}\n filter={{ playlist_id: props.id }}\n >\n <PlaylistSongs\n {...props}\n readOnly={isReadOnly(record.owner)}\n title={<Title subTitle={record.name} />}\n actions={\n <PlaylistActions\n className={classes.playlistActions}\n record={record}\n />\n }\n resource={'playlistTrack'}\n exporter={false}\n pagination={<RaPagination rowsPerPageOptions={[100, 250, 500]} />}\n />\n </ReferenceManyField>\n )}\n </>\n )\n}\n\nconst PlaylistShow = (props) => {\n const controllerProps = useShowController(props)\n return (\n <ShowContextProvider value={controllerProps}>\n <PlaylistShowLayout {...props} {...controllerProps} />\n </ShowContextProvider>\n )\n}\n\nexport default PlaylistShow\n","import React from 'react'\nimport QueueMusicOutlinedIcon from '@material-ui/icons/QueueMusicOutlined'\nimport QueueMusicIcon from '@material-ui/icons/QueueMusic'\nimport DynamicMenuIcon from '../layout/DynamicMenuIcon'\nimport PlaylistList from './PlaylistList'\nimport PlaylistEdit from './PlaylistEdit'\nimport PlaylistCreate from './PlaylistCreate'\nimport PlaylistShow from './PlaylistShow'\n\nexport default {\n list: PlaylistList,\n create: PlaylistCreate,\n edit: PlaylistEdit,\n show: PlaylistShow,\n icon: (\n <DynamicMenuIcon\n path={'playlist'}\n icon={QueueMusicOutlinedIcon}\n activeIcon={QueueMusicIcon}\n />\n ),\n}\n","import React, { useCallback } from 'react'\nimport { useLocation } from 'react-router-dom'\nimport { useGetOne } from 'react-admin'\nimport { GlobalHotKeys } from 'react-hotkeys'\nimport { LoveButton, useToggleLove } from '../common'\nimport { keyMap } from '../hotkeys'\nimport config from '../config'\n\nconst Placeholder = () =>\n config.enableFavourites && <LoveButton disabled={true} resource={'song'} />\n\nconst Toolbar = ({ id }) => {\n const location = useLocation()\n const resource = location.pathname.startsWith('/song') ? 'song' : 'albumSong'\n const { data, loading } = useGetOne(resource, id)\n const [toggleLove, toggling] = useToggleLove(resource, data)\n\n const handlers = {\n TOGGLE_LOVE: useCallback(() => toggleLove(), [toggleLove]),\n }\n return (\n <>\n <GlobalHotKeys keyMap={keyMap} handlers={handlers} allowChanges />\n {config.enableFavourites && (\n <LoveButton\n record={data}\n resource={resource}\n disabled={loading || toggling}\n />\n )}\n </>\n )\n}\n\nconst PlayerToolbar = ({ id }) => (id ? <Toolbar id={id} /> : <Placeholder />)\n\nexport default PlayerToolbar\n","import React, { useCallback, useMemo } from 'react'\nimport ReactGA from 'react-ga'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Link } from 'react-router-dom'\nimport { useAuthState, useDataProvider, useTranslate } from 'react-admin'\nimport ReactJkMusicPlayer from 'react-jinke-music-player'\nimport 'react-jinke-music-player/assets/index.css'\nimport {\n createMuiTheme,\n makeStyles,\n ThemeProvider,\n} from '@material-ui/core/styles'\nimport { useMediaQuery } from '@material-ui/core'\nimport { GlobalHotKeys } from 'react-hotkeys'\nimport clsx from 'clsx'\nimport subsonic from '../subsonic'\nimport {\n scrobble,\n syncQueue,\n currentPlaying,\n setVolume,\n clearQueue,\n} from '../actions'\nimport config from '../config'\nimport PlayerToolbar from './PlayerToolbar'\nimport { sendNotification } from '../utils'\nimport { keyMap } from '../hotkeys'\nimport useCurrentTheme from '../themes/useCurrentTheme'\nimport { QualityInfo } from '../common/QualityInfo'\n\nconst useStyle = makeStyles(\n (theme) => ({\n audioTitle: {\n textDecoration: 'none',\n color: theme.palette.primary.dark,\n },\n songTitle: {\n fontWeight: 'bold',\n '&:hover + $qualityInfo': {\n opacity: 1,\n },\n },\n songInfo: {\n display: 'block',\n },\n qualityInfo: {\n marginTop: '-4px',\n opacity: 0,\n transition: 'all 500ms ease-out',\n },\n player: {\n display: (props) => (props.visible ? 'block' : 'none'),\n '@media screen and (max-width:810px)': {\n '& .sound-operation': {\n display: 'none',\n },\n },\n '& .progress-bar-content': {\n display: 'flex',\n flexDirection: 'column',\n },\n '& .play-mode-title': {\n 'pointer-events': 'none',\n },\n },\n artistAlbum: {\n marginTop: '2px',\n },\n }),\n { name: 'NDAudioPlayer' }\n)\n\nlet audioInstance = null\n\nconst AudioTitle = React.memo(({ audioInfo, isMobile }) => {\n const classes = useStyle()\n const className = classes.audioTitle\n const isDesktop = useMediaQuery('(min-width:810px)')\n\n if (!audioInfo.name) {\n return ''\n }\n\n const qi = { suffix: audioInfo.suffix, bitRate: audioInfo.bitRate }\n\n return (\n <Link to={`/album/${audioInfo.albumId}/show`} className={className}>\n <span>\n <span className={clsx(classes.songTitle, 'songTitle')}>\n {audioInfo.name}\n </span>\n {isDesktop && (\n <QualityInfo record={qi} className={classes.qualityInfo} />\n )}\n </span>\n {!isMobile && (\n <div className={classes.artistAlbum}>\n <span className={clsx(classes.songInfo, 'songInfo')}>\n {`${audioInfo.singer} - ${audioInfo.album}`}\n </span>\n </div>\n )}\n </Link>\n )\n})\n\nconst Player = () => {\n const translate = useTranslate()\n const theme = useCurrentTheme()\n const playerTheme = (theme.player && theme.player.theme) || 'dark'\n const dataProvider = useDataProvider()\n const dispatch = useDispatch()\n const queue = useSelector((state) => state.queue)\n const current = queue.current || {}\n const { authenticated } = useAuthState()\n const showNotifications = useSelector(\n (state) => state.settings.notifications || false\n )\n\n const visible = authenticated && queue.queue.length > 0\n const classes = useStyle({ visible })\n // Match the medium breakpoint defined in the material-ui theme\n // See https://material-ui.com/customization/breakpoints/#breakpoints\n const isDesktop = useMediaQuery('(min-width:810px)')\n\n const nextSong = useCallback(() => {\n const idx = queue.queue.findIndex(\n (item) => item.uuid === queue.current.uuid\n )\n return idx !== null ? queue.queue[idx + 1] : null\n }, [queue])\n\n const prevSong = useCallback(() => {\n const idx = queue.queue.findIndex(\n (item) => item.uuid === queue.current.uuid\n )\n return idx !== null ? queue.queue[idx - 1] : null\n }, [queue])\n\n const keyHandlers = {\n TOGGLE_PLAY: (e) => {\n e.preventDefault()\n audioInstance && audioInstance.togglePlay()\n },\n VOL_UP: () =>\n (audioInstance.volume = Math.min(1, audioInstance.volume + 0.1)),\n VOL_DOWN: () =>\n (audioInstance.volume = Math.max(0, audioInstance.volume - 0.1)),\n PREV_SONG: useCallback(\n (e) => {\n if (!e.metaKey && prevSong()) audioInstance && audioInstance.playPrev()\n },\n [prevSong]\n ),\n NEXT_SONG: useCallback(\n (e) => {\n if (!e.metaKey && nextSong()) audioInstance && audioInstance.playNext()\n },\n [nextSong]\n ),\n }\n\n const defaultOptions = {\n theme: playerTheme,\n bounds: 'body',\n mode: 'full',\n autoPlay: false,\n preload: true,\n autoPlayInitLoadPlayList: true,\n loadAudioErrorPlayNext: false,\n clearPriorAudioLists: false,\n showDestroy: true,\n showDownload: false,\n showReload: false,\n toggleMode: !isDesktop,\n glassBg: false,\n showThemeSwitch: false,\n showMediaSession: true,\n defaultPosition: {\n top: 300,\n left: 120,\n },\n volumeFade: { fadeIn: 200, fadeOut: 200 },\n renderAudioTitle: (audioInfo, isMobile) => (\n <AudioTitle audioInfo={audioInfo} isMobile={isMobile} />\n ),\n locale: {\n playListsText: translate('player.playListsText'),\n openText: translate('player.openText'),\n closeText: translate('player.closeText'),\n notContentText: translate('player.notContentText'),\n clickToPlayText: translate('player.clickToPlayText'),\n clickToPauseText: translate('player.clickToPauseText'),\n nextTrackText: translate('player.nextTrackText'),\n previousTrackText: translate('player.previousTrackText'),\n reloadText: translate('player.reloadText'),\n volumeText: translate('player.volumeText'),\n toggleLyricText: translate('player.toggleLyricText'),\n toggleMiniModeText: translate('player.toggleMiniModeText'),\n destroyText: translate('player.destroyText'),\n downloadText: translate('player.downloadText'),\n removeAudioListsText: translate('player.removeAudioListsText'),\n clickToDeleteText: (name) =>\n translate('player.clickToDeleteText', { name }),\n emptyLyricText: translate('player.emptyLyricText'),\n playModeText: {\n order: translate('player.playModeText.order'),\n orderLoop: translate('player.playModeText.orderLoop'),\n singleLoop: translate('player.playModeText.singleLoop'),\n shufflePlay: translate('player.playModeText.shufflePlay'),\n },\n },\n }\n\n const options = useMemo(() => {\n return {\n ...defaultOptions,\n clearPriorAudioLists: queue.clear,\n autoPlay: queue.clear || queue.playIndex === 0,\n playIndex: queue.playIndex,\n audioLists: queue.queue.map((item) => item),\n extendsContent: <PlayerToolbar id={current.trackId} />,\n defaultVolume: queue.volume,\n }\n }, [\n queue.clear,\n queue.queue,\n queue.volume,\n queue.playIndex,\n current,\n defaultOptions,\n ])\n\n const onAudioListsChange = useCallback(\n (currentPlayIndex, audioLists) =>\n dispatch(syncQueue(currentPlayIndex, audioLists)),\n [dispatch]\n )\n\n const onAudioProgress = useCallback(\n (info) => {\n if (info.ended) {\n document.title = 'Navidrome'\n }\n\n // See https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble\n const progress = (info.currentTime / info.duration) * 100\n if (\n isNaN(info.duration) ||\n info.duration < 30 ||\n (progress < 50 && info.currentTime < 240)\n ) {\n return\n }\n\n const item = queue.queue.find((item) => item.trackId === info.trackId)\n if (item && !item.scrobbled) {\n dispatch(scrobble(info.trackId, true))\n subsonic.scrobble(info.trackId, true)\n }\n },\n [dispatch, queue.queue]\n )\n\n const onAudioVolumeChange = useCallback(\n // sqrt to compensate for the logarithmic volume\n (volume) => dispatch(setVolume(Math.sqrt(volume))),\n [dispatch]\n )\n\n const onAudioPlay = useCallback(\n (info) => {\n dispatch(currentPlaying(info))\n if (info.duration) {\n document.title = `${info.name} - ${info.singer} - Navidrome`\n dispatch(scrobble(info.trackId, false))\n subsonic.scrobble(info.trackId, false)\n if (config.gaTrackingId) {\n ReactGA.event({\n category: 'Player',\n action: 'Play song',\n label: `${info.name} - ${info.singer}`,\n })\n }\n if (showNotifications) {\n sendNotification(\n info.name,\n `${info.singer} - ${info.album}`,\n info.cover\n )\n }\n }\n },\n [dispatch, showNotifications]\n )\n\n const onAudioPause = useCallback((info) => dispatch(currentPlaying(info)), [\n dispatch,\n ])\n\n const onAudioEnded = useCallback(\n (currentPlayId, audioLists, info) => {\n dispatch(currentPlaying(info))\n dataProvider\n .getOne('keepalive', { id: info.trackId })\n .catch((e) => console.log('Keepalive error:', e))\n },\n [dispatch, dataProvider]\n )\n\n const onCoverClick = useCallback((mode, audioLists, audioInfo) => {\n if (mode === 'full') {\n window.location.href = `#/album/${audioInfo.albumId}/show`\n }\n }, [])\n\n const onBeforeDestroy = useCallback(() => {\n return new Promise((resolve, reject) => {\n dispatch(clearQueue())\n reject()\n })\n }, [dispatch])\n\n if (!visible) {\n document.title = 'Navidrome'\n }\n\n return (\n <ThemeProvider theme={createMuiTheme(theme)}>\n <ReactJkMusicPlayer\n {...options}\n quietUpdate\n className={classes.player}\n onAudioListsChange={onAudioListsChange}\n onAudioProgress={onAudioProgress}\n onAudioPlay={onAudioPlay}\n onAudioPause={onAudioPause}\n onAudioEnded={onAudioEnded}\n onAudioVolumeChange={onAudioVolumeChange}\n onCoverClick={onCoverClick}\n onBeforeDestroy={onBeforeDestroy}\n getAudioInstance={(instance) => {\n audioInstance = instance\n }}\n />\n <GlobalHotKeys handlers={keyHandlers} keyMap={keyMap} allowChanges />\n </ThemeProvider>\n )\n}\n\nexport { Player }\n","import polyglotI18nProvider from 'ra-i18n-polyglot'\nimport deepmerge from 'deepmerge'\nimport dataProvider from '../dataProvider'\nimport en from './en.json'\nimport { i18nProvider } from './index'\n\n// Only returns current selected locale if its translations are found in localStorage\nconst defaultLocale = function () {\n const locale = localStorage.getItem('locale')\n const current = JSON.parse(localStorage.getItem('translation'))\n if (current && current.id === locale) {\n // Asynchronously reload the translation from the server\n retrieveTranslation(locale).then(() => {\n i18nProvider.changeLocale(locale)\n })\n return locale\n }\n return 'en'\n}\n\nfunction retrieveTranslation(locale) {\n return dataProvider.getOne('translation', { id: locale }).then((res) => {\n localStorage.setItem('translation', JSON.stringify(res.data))\n return prepareLanguage(JSON.parse(res.data.data))\n })\n}\n\nconst removeEmpty = (obj) => {\n for (let k in obj) {\n if (obj.hasOwnProperty(k) && typeof obj[k] === 'object') {\n removeEmpty(obj[k])\n } else {\n if (!obj[k]) {\n delete obj[k]\n }\n }\n }\n}\n\nconst prepareLanguage = (lang) => {\n removeEmpty(lang)\n // Make \"albumSong\" and \"playlistTrack\" resource use the same translations as \"song\"\n lang.resources.albumSong = lang.resources.song\n lang.resources.playlistTrack = lang.resources.song\n // ra.boolean.null should always be empty\n lang.ra.boolean.null = ''\n // Fallback to english translations\n return deepmerge(en, lang)\n}\n\nexport default polyglotI18nProvider((locale) => {\n // English is bundled\n if (locale === 'en') {\n return prepareLanguage(en)\n }\n // If the requested locale is in already loaded, return it\n const current = JSON.parse(localStorage.getItem('translation'))\n if (current && current.id === locale) {\n return prepareLanguage(JSON.parse(current.data))\n }\n // If not, get it from the server, and store it in localStorage\n return retrieveTranslation(locale)\n}, defaultLocale())\n","import React from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport {\n Card,\n FormControl,\n FormHelperText,\n FormControlLabel,\n Switch,\n} from '@material-ui/core'\nimport {\n SelectInput,\n SimpleForm,\n Title,\n useLocale,\n useNotify,\n useSetLocale,\n useTranslate,\n} from 'react-admin'\nimport { makeStyles } from '@material-ui/core/styles'\nimport HelpOutlineIcon from '@material-ui/icons/HelpOutline'\nimport { changeTheme, setNotificationsState } from '../actions'\nimport themes from '../themes'\nimport { docsUrl } from '../utils'\nimport { useGetLanguageChoices } from '../i18n'\nimport albumLists, { defaultAlbumList } from '../album/albumLists'\nimport { AUTO_THEME_ID } from '../consts'\n\nconst useStyles = makeStyles({\n root: { marginTop: '1em' },\n})\n\nconst helpKey = '_help'\n\nfunction openInNewTab(url) {\n const win = window.open(url, '_blank')\n win.focus()\n}\n\nconst HelpMsg = ({ caption }) => (\n <>\n <HelpOutlineIcon />\n    {caption}\n </>\n)\n\nconst SelectLanguage = (props) => {\n const translate = useTranslate()\n const setLocale = useSetLocale()\n const locale = useLocale()\n const { choices } = useGetLanguageChoices()\n\n choices.push({\n id: helpKey,\n name: <HelpMsg caption={'Help to translate'} />,\n })\n\n return (\n <SelectInput\n {...props}\n source=\"language\"\n label={translate('menu.personal.options.language')}\n defaultValue={locale}\n choices={choices}\n translateChoice={false}\n onChange={(event) => {\n if (event.target.value === helpKey) {\n openInNewTab(docsUrl('/docs/developers/translations/'))\n return\n }\n setLocale(event.target.value).then(() => {\n localStorage.setItem('locale', event.target.value)\n })\n }}\n />\n )\n}\n\nconst SelectTheme = (props) => {\n const translate = useTranslate()\n const dispatch = useDispatch()\n const currentTheme = useSelector((state) => state.theme)\n const themeChoices = [\n {\n id: AUTO_THEME_ID,\n name: 'Auto',\n },\n ]\n themeChoices.push(\n ...Object.keys(themes).map((key) => {\n return { id: key, name: themes[key].themeName }\n })\n )\n themeChoices.push({\n id: helpKey,\n name: <HelpMsg caption={'Create your own'} />,\n })\n return (\n <SelectInput\n {...props}\n source=\"theme\"\n label={translate('menu.personal.options.theme')}\n defaultValue={currentTheme}\n translateChoice={false}\n choices={themeChoices}\n onChange={(event) => {\n if (event.target.value === helpKey) {\n openInNewTab(docsUrl('/docs/developers/creating-themes/'))\n return\n }\n dispatch(changeTheme(event.target.value))\n }}\n />\n )\n}\n\nconst SelectDefaultView = (props) => {\n const translate = useTranslate()\n const current = localStorage.getItem('defaultView') || defaultAlbumList\n const choices = Object.keys(albumLists).map((type) => ({\n id: type,\n name: translate(`resources.album.lists.${type}`),\n }))\n\n return (\n <SelectInput\n {...props}\n source=\"defaultView\"\n label={translate('menu.personal.options.defaultView')}\n defaultValue={current}\n choices={choices}\n translateChoice={false}\n onChange={(event) => {\n localStorage.setItem('defaultView', event.target.value)\n }}\n />\n )\n}\n\nconst NotificationsToggle = () => {\n const translate = useTranslate()\n const dispatch = useDispatch()\n const notify = useNotify()\n const currentSetting = useSelector((state) => state.settings.notifications)\n const notAvailable = !('Notification' in window) || !window.isSecureContext\n\n if (\n (currentSetting && Notification.permission !== 'granted') ||\n notAvailable\n ) {\n dispatch(setNotificationsState(false))\n }\n\n const toggleNotifications = (event) => {\n if (currentSetting && !event.target.checked) {\n dispatch(setNotificationsState(false))\n } else {\n if (Notification.permission === 'denied') {\n notify(translate('message.notifications_blocked'), 'warning')\n } else {\n Notification.requestPermission().then((permission) => {\n dispatch(setNotificationsState(permission === 'granted'))\n })\n }\n }\n }\n\n return (\n <FormControl>\n <FormControlLabel\n control={\n <Switch\n id={'notifications'}\n color=\"primary\"\n checked={currentSetting}\n disabled={notAvailable}\n onChange={toggleNotifications}\n />\n }\n label={\n <span>\n {translate('menu.personal.options.desktop_notifications')}\n </span>\n }\n />\n {notAvailable && (\n <FormHelperText id=\"notifications-disabled-helper-text\">\n {translate('message.notifications_not_available')}\n </FormHelperText>\n )}\n </FormControl>\n )\n}\n\nconst Personal = () => {\n const translate = useTranslate()\n const classes = useStyles()\n\n return (\n <Card className={classes.root}>\n <Title title={'Navidrome - ' + translate('menu.personal.name')} />\n <SimpleForm toolbar={null} variant={'outlined'}>\n <SelectTheme />\n <SelectLanguage />\n <SelectDefaultView />\n <NotificationsToggle />\n </SimpleForm>\n </Card>\n )\n}\n\nexport default Personal\n","// React Hook to get a list of all languages available. English is hardcoded\nimport { useGetList } from 'react-admin'\n\nexport default () => {\n const { ids, data, loaded, loading } = useGetList(\n 'translation',\n { page: 1, perPage: -1 },\n { field: '', order: '' },\n {}\n )\n\n const choices = [{ id: 'en', name: 'English' }]\n if (loaded) {\n ids.forEach((id) => choices.push({ id: id, name: data[id].name }))\n }\n choices.sort((a, b) => a.name.localeCompare(b.name))\n\n return { choices, loaded, loading }\n}\n","export const CHANGE_THEME = 'CHANGE_THEME'\n\nexport const changeTheme = (theme) => ({\n type: CHANGE_THEME,\n payload: theme,\n})\n","import React from 'react'\nimport { Route } from 'react-router-dom'\nimport Personal from './personal/Personal'\n\nexport default [<Route exact path=\"/personal\" render={() => <Personal />} />]\n","import { CHANGE_THEME } from '../actions'\nimport config from '../config'\nimport themes from '../themes'\n\nconst defaultTheme = () => {\n return (\n Object.keys(themes).find(\n (t) => themes[t].themeName === config.defaultTheme\n ) || 'DarkTheme'\n )\n}\n\nexport const themeReducer = (\n previousState = defaultTheme(),\n { type, payload }\n) => {\n if (type === CHANGE_THEME) {\n return payload\n }\n return previousState\n}\n","import {\n ADD_TO_PLAYLIST_CLOSE,\n ADD_TO_PLAYLIST_OPEN,\n DUPLICATE_SONG_WARNING_OPEN,\n DUPLICATE_SONG_WARNING_CLOSE,\n} from '../actions'\n\nexport const addToPlaylistDialogReducer = (\n previousState = {\n open: false,\n duplicateSong: false,\n },\n payload\n) => {\n const { type } = payload\n switch (type) {\n case ADD_TO_PLAYLIST_OPEN:\n return {\n ...previousState,\n open: true,\n selectedIds: payload.selectedIds,\n onSuccess: payload.onSuccess,\n }\n case ADD_TO_PLAYLIST_CLOSE:\n return { ...previousState, open: false, onSuccess: undefined }\n case DUPLICATE_SONG_WARNING_OPEN:\n return {\n ...previousState,\n duplicateSong: true,\n duplicateIds: payload.duplicateIds,\n }\n case DUPLICATE_SONG_WARNING_CLOSE:\n return { ...previousState, duplicateSong: false }\n default:\n return previousState\n }\n}\n","import 'react-jinke-music-player/assets/index.css'\nimport get from 'lodash.get'\nimport { v4 as uuidv4 } from 'uuid'\nimport subsonic from '../subsonic'\nimport config from '../config'\n\nimport {\n PLAYER_CLEAR_QUEUE,\n PLAYER_SET_VOLUME,\n PLAYER_CURRENT,\n PLAYER_ADD_TRACKS,\n PLAYER_PLAY_NEXT,\n PLAYER_SET_TRACK,\n PLAYER_SYNC_QUEUE,\n PLAYER_SCROBBLE,\n PLAYER_PLAY_TRACKS,\n} from '../actions'\n\nconst mapToAudioLists = (item) => {\n // If item comes from a playlist, id is mediaFileId\n const id = item.mediaFileId || item.id\n return {\n trackId: id,\n name: item.title,\n singer: item.artist,\n album: item.album,\n albumId: item.albumId,\n artistId: item.albumArtistId,\n duration: item.duration,\n suffix: item.suffix,\n bitRate: item.bitRate,\n musicSrc: subsonic.url('stream', id, { ts: true }),\n cover: subsonic.getCoverArtUrl(\n {\n coverArtId: config.devFastAccessCoverArt ? item.albumId : id,\n updatedAt: item.updatedAt,\n },\n 300\n ),\n scrobbled: false,\n uuid: uuidv4(),\n }\n}\n\nconst initialState = {\n queue: [],\n clear: true,\n current: {},\n volume: 1,\n playIndex: 0,\n}\n\nexport const playQueueReducer = (previousState = initialState, payload) => {\n let queue, current\n let newQueue\n const { type, data } = payload\n switch (type) {\n case PLAYER_CLEAR_QUEUE:\n return initialState\n case PLAYER_SET_VOLUME:\n return {\n ...previousState,\n playIndex: undefined,\n volume: data.volume,\n }\n case PLAYER_CURRENT:\n queue = previousState.queue\n current = data.ended\n ? {}\n : {\n trackId: data.trackId,\n uuid: data.uuid,\n paused: data.paused,\n }\n return {\n ...previousState,\n current,\n playIndex: undefined,\n volume: data.volume,\n }\n case PLAYER_ADD_TRACKS:\n queue = previousState.queue\n Object.keys(data).forEach((id) => {\n queue.push(mapToAudioLists(data[id]))\n })\n return { ...previousState, queue, clear: false, playIndex: undefined }\n case PLAYER_PLAY_NEXT:\n current = get(previousState.current, 'uuid', '')\n newQueue = []\n let foundPos = false\n previousState.queue.forEach((item) => {\n newQueue.push(item)\n if (item.uuid === current) {\n foundPos = true\n Object.keys(data).forEach((id) => {\n newQueue.push(mapToAudioLists(data[id]))\n })\n }\n })\n if (!foundPos) {\n Object.keys(data).forEach((id) => {\n newQueue.push(mapToAudioLists(data[id]))\n })\n }\n return {\n ...previousState,\n queue: newQueue,\n clear: true,\n playIndex: undefined,\n }\n case PLAYER_SET_TRACK:\n return {\n ...previousState,\n queue: [mapToAudioLists(data)],\n clear: true,\n playIndex: 0,\n }\n case PLAYER_SYNC_QUEUE:\n current = data.length > 0 ? previousState.current : {}\n return {\n ...previousState,\n queue: data,\n clear: false,\n playIndex: undefined,\n current,\n }\n case PLAYER_SCROBBLE:\n newQueue = previousState.queue.map((item) => {\n return {\n ...item,\n scrobbled:\n item.scrobbled || (item.trackId === payload.id && payload.submit),\n }\n })\n return {\n ...previousState,\n queue: newQueue,\n playIndex: undefined,\n clear: false,\n }\n case PLAYER_PLAY_TRACKS:\n queue = []\n let match = false\n Object.keys(data).forEach((id) => {\n if (id === payload.id) {\n match = true\n }\n if (match) {\n queue.push(mapToAudioLists(data[id]))\n }\n })\n return {\n ...previousState,\n queue,\n playIndex: 0,\n clear: true,\n }\n default:\n return previousState\n }\n}\n","import { ALBUM_MODE_GRID, ALBUM_MODE_LIST } from '../actions'\n\nexport const albumViewReducer = (\n previousState = {\n grid: true,\n },\n payload\n) => {\n const { type } = payload\n switch (type) {\n case ALBUM_MODE_GRID:\n case ALBUM_MODE_LIST:\n return { ...previousState, grid: type === ALBUM_MODE_GRID }\n default:\n return previousState\n }\n}\n","import { EVENT_SCAN_STATUS, EVENT_SERVER_START } from '../actions'\n\nconst defaultState = {\n scanStatus: { scanning: false, folderCount: 0, count: 0 },\n}\n\nexport const activityReducer = (\n previousState = {\n scanStatus: defaultState,\n },\n payload\n) => {\n const { type, data } = payload\n switch (type) {\n case EVENT_SCAN_STATUS:\n return { ...previousState, scanStatus: data }\n case EVENT_SERVER_START:\n return {\n ...previousState,\n serverStart: {\n startTime: data.startTime && Date.parse(data.startTime),\n },\n }\n default:\n return previousState\n }\n}\n","import { SET_NOTIFICATIONS_STATE } from '../actions'\n\nconst initialState = {\n notifications: false,\n}\n\nexport const settingsReducer = (previousState = initialState, payload) => {\n const { type, data } = payload\n switch (type) {\n case SET_NOTIFICATIONS_STATE:\n return {\n ...previousState,\n notifications: data,\n }\n default:\n return previousState\n }\n}\n","import { applyMiddleware, combineReducers, compose, createStore } from 'redux'\nimport { routerMiddleware, connectRouter } from 'connected-react-router'\nimport createSagaMiddleware from 'redux-saga'\nimport { all, fork } from 'redux-saga/effects'\nimport { adminReducer, adminSaga, USER_LOGOUT } from 'react-admin'\nimport throttle from 'lodash.throttle'\nimport pick from 'lodash.pick'\nimport { loadState, saveState } from './persistState'\n\nexport default ({\n authProvider,\n dataProvider,\n history,\n customReducers = {},\n}) => {\n const reducer = combineReducers({\n admin: adminReducer,\n router: connectRouter(history),\n ...customReducers,\n })\n const resettableAppReducer = (state, action) =>\n reducer(action.type !== USER_LOGOUT ? state : undefined, action)\n\n const saga = function* rootSaga() {\n yield all([adminSaga(dataProvider, authProvider)].map(fork))\n }\n const sagaMiddleware = createSagaMiddleware()\n\n const composeEnhancers =\n (process.env.NODE_ENV === 'development' &&\n typeof window !== 'undefined' &&\n window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&\n window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({\n trace: true,\n traceLimit: 25,\n })) ||\n compose\n\n const persistedState = loadState()\n const store = createStore(\n resettableAppReducer,\n persistedState,\n composeEnhancers(applyMiddleware(sagaMiddleware, routerMiddleware(history)))\n )\n\n store.subscribe(\n throttle(() => {\n const state = store.getState()\n saveState({\n theme: state.theme,\n queue: pick(state.queue, ['queue', 'volume']),\n albumView: state.albumView,\n settings: state.settings,\n })\n }),\n 1000\n )\n\n sagaMiddleware.run(saga)\n return store\n}\n","export const loadState = () => {\n try {\n const serializedState = localStorage.getItem('state')\n if (serializedState === null) {\n return undefined\n }\n return JSON.parse(serializedState)\n } catch (err) {\n return undefined\n }\n}\n\nexport const saveState = (state) => {\n try {\n const serializedState = JSON.stringify(state)\n localStorage.setItem('state', serializedState)\n } catch (err) {\n // Ignore write errors\n }\n}\n","import React from 'react'\nimport ReactGA from 'react-ga'\nimport 'react-jinke-music-player/assets/index.css'\nimport { Provider, useDispatch } from 'react-redux'\nimport { createHashHistory } from 'history'\nimport { Admin as RAAdmin, Resource } from 'react-admin'\nimport dataProvider from './dataProvider'\nimport authProvider from './authProvider'\nimport { Layout, Login, Logout } from './layout'\nimport transcoding from './transcoding'\nimport player from './player'\nimport user from './user'\nimport song from './song'\nimport album from './album'\nimport artist from './artist'\nimport playlist from './playlist'\nimport { Player } from './audioplayer'\nimport customRoutes from './routes'\nimport {\n themeReducer,\n addToPlaylistDialogReducer,\n playQueueReducer,\n albumViewReducer,\n activityReducer,\n settingsReducer,\n} from './reducers'\nimport createAdminStore from './store/createAdminStore'\nimport { i18nProvider } from './i18n'\nimport config from './config'\nimport { setDispatch, startEventStream } from './eventStream'\nimport { HotKeys } from 'react-hotkeys'\nimport { keyMap } from './hotkeys'\n\nconst history = createHashHistory()\n\nif (config.gaTrackingId) {\n ReactGA.initialize(config.gaTrackingId)\n history.listen((location) => {\n ReactGA.pageview(location.pathname)\n })\n ReactGA.pageview(window.location.pathname)\n}\n\nconst App = () => (\n <Provider\n store={createAdminStore({\n authProvider,\n dataProvider,\n history,\n customReducers: {\n queue: playQueueReducer,\n albumView: albumViewReducer,\n theme: themeReducer,\n addToPlaylistDialog: addToPlaylistDialogReducer,\n activity: activityReducer,\n settings: settingsReducer,\n },\n })}\n >\n <Admin />\n </Provider>\n)\n\nconst Admin = (props) => {\n const dispatch = useDispatch()\n if (config.devActivityPanel) {\n setDispatch(dispatch)\n authProvider\n .checkAuth()\n .then(() => startEventStream())\n .catch(() => {}) // ignore if not logged in\n }\n\n return (\n <RAAdmin\n disableTelemetry\n dataProvider={dataProvider}\n authProvider={authProvider}\n i18nProvider={i18nProvider}\n customRoutes={customRoutes}\n history={history}\n layout={Layout}\n loginPage={Login}\n logoutButton={Logout}\n {...props}\n >\n {(permissions) => [\n <Resource name=\"album\" {...album} options={{ subMenu: 'albumList' }} />,\n <Resource name=\"artist\" {...artist} options={{ subMenu: 'library' }} />,\n <Resource name=\"song\" {...song} options={{ subMenu: 'library' }} />,\n <Resource\n name=\"playlist\"\n {...playlist}\n options={{ subMenu: 'library' }}\n />,\n permissions === 'admin' ? (\n <Resource name=\"user\" {...user} options={{ subMenu: 'settings' }} />\n ) : null,\n <Resource\n name=\"player\"\n {...player}\n options={{ subMenu: 'settings' }}\n />,\n permissions === 'admin' ? (\n <Resource\n name=\"transcoding\"\n {...transcoding}\n options={{ subMenu: 'settings' }}\n />\n ) : (\n <Resource name=\"transcoding\" />\n ),\n <Resource name=\"albumSong\" />,\n <Resource name=\"translation\" />,\n <Resource name=\"playlistTrack\" />,\n <Resource name=\"keepalive\" />,\n\n <Player />,\n ]}\n </RAAdmin>\n )\n}\n\nconst AppWithHotkeys = () => (\n <HotKeys keyMap={keyMap}>\n <App />\n </HotKeys>\n)\n\nexport default AppWithHotkeys\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n)\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href)\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/navidrome-service-worker.js`\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config)\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n )\n })\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config)\n }\n })\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing\n if (installingWorker == null) {\n return\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n )\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration)\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.')\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration)\n }\n }\n }\n }\n }\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error)\n })\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type')\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload()\n })\n })\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config)\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n )\n })\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister()\n })\n .catch((error) => {\n console.error(error.message)\n })\n }\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport App from './App'\nimport * as serviceWorker from './serviceWorker'\n\nReactDOM.render(<App />, document.getElementById('root'))\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.register()\n"],"sourceRoot":""}