{"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","common/ToggleFieldsMenu.js","song/SongListActions.js","song/AlbumLinkField.js","common/useSelectedFields.js","common/QualityInfo.js","song/SongList.js","song/index.js","album/AlbumListActions.js","actions/albumView.js","album/AlbumTableView.js","album/AlbumGridView.js","album/AlbumList.js","album/AlbumSongs.js","album/AlbumDetails.js","album/AlbumActions.js","album/AlbumShow.js","album/index.js","artist/ArtistListActions.js","artist/ArtistList.js","artist/index.js","playlist/PlaylistListActions.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","useChangeThemeColor.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","enableUserEditing","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","decoded","jwtDecode","setItem","uid","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","setToggleableFields","obj","setOmittedFields","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","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","marginBottom","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","systemName","width","height","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","defaultValue","lbl","String","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","bpm","NumberField","comment","playDate","SongTitleField","showTrackNumbers","useTheme","currentTrack","queue","currentId","trackId","paused","isCurrent","Icon","PausedLight","PausedDark","PlayingLight","PlayingDark","FunctionField","trackNumber","padStart","Title","isDesktop","breakpoints","up","undefined","SongBulkActions","getPerPageOptions","admin","resources","list","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","renderSettingsMenuItemLink","resourceName","userResource","PersonIcon","SupervisorAccountIcon","renderUserMenuItemLink","AppBar","userMenu","paddingBottom","addPadding","keyHandlers","toggleSidebar","Layout","Menu","appBar","notification","TranscodingList","exporter","targetFormat","defaultBitRate","rowClick","Interpolate","TranscodingNote","TranscodingTitle","TranscodingEdit","Edit","SimpleForm","TextInput","required","SelectInput","choices","TranscodingCreate","Create","TranscodingShow","Show","SimpleShowLayout","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","useRedirect","useDeleteWithConfirmController","handleDialogOpen","handleDialogClose","handleDelete","Confirm","translateOptions","onConfirm","UserTitle","UserToolbar","showDelete","SaveButton","pristine","CurrentPasswordInput","formData","isMyself","changePassword","PasswordInput","NewPasswordInput","useMutation","mutate","refresh","useRefresh","canDelete","save","payload","returnPromise","undoable","email","FormDataConsumer","formDataProps","initialValue","menuIcon","columns","maxHeight","ToggleFieldsMenu","TopBarComponent","topbarComponent","toggleableColumns","settings","toggleableFields","omittedColumns","omittedFields","entries","selectedColumn","SongListActions","currentSort","displayedFilters","filterValues","showFilter","permanentFilter","onUnselectItems","maxResults","isNotSmall","TopToolbar","context","AlbumLinkField","useSelectedFields","defaultOff","resourceFields","filteredComponents","setFilteredComponents","omitted","arrayOf","llFormats","useStyle","QualityInfo","suffix","info","contextHeader","ratingField","SongFilter","SongList","year","quality","duration","MusicNoteOutlinedIcon","MusicNoteIcon","buttonGroup","leftButton","rightButton","AlbumViewToggler","showTitle","disableElevation","albumView","ButtonGroup","grid","AlbumListActions","columnIcon","AlbumDetails","AlbumTableView","hasShow","hasEdit","syncWithLocation","songCount","tileBar","tileBarMobile","albumArtistName","albumLink","useCoverStyles","cover","objectFit","getColsForWidth","Cover","withContentRect","measureRef","contentRect","bounds","AlbumGridTile","showArtist","noSsr","GridListTileBar","actionIcon","LoadedAlbumGrid","useListContext","isArtistView","artist_id","GridList","cellHeight","cols","GridListTile","gridListTile","albumListType","Loading","AlbumFilter","filterToQuery","searchText","AutocompleteInput","NullableBooleanInput","NumberInput","AlbumListTitle","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","imagePadding","animationDuration","imageTitle","mainSrc","onCloseRequest","AlbumActions","handlePlay","handlePlayNext","handlePlayLater","handleShuffle","handleDownload","AlbumShowLayout","useShowContext","ReferenceManyField","AlbumList","controllerProps","useShowController","ShowContextProvider","ArtistListActions","ArtistFilter","ArtistListView","handleArtistLink","history","useHistory","albumCount","ArtistList","MicNoneOutlinedIcon","MicIcon","PlaylistListActions","CreateButton","PlaylistFilter","TogglePublicInput","useUpdate","public","onFailure","togglePublic","canChange","Switch","PlaylistList","isRowSelectable","EditButton","SyncFragment","PlaylistTitle","PlaylistEdit","multiline","PlaylistCreate","PlaylistDetails","PlaylistSongBulkActions","mappedResource","ResourceContextProvider","BulkDeleteButton","ReorderableList","readOnly","PlaylistSongs","listContext","reorder","newPos","insert_before","handleDragEnd","from","toId","fromId","draggable","onDragEnd","nodeSelector","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","notifications","nextSong","findIndex","item","uuid","prevSong","togglePlay","volume","metaKey","playPrev","defaultOptions","mode","autoPlay","preload","autoPlayInitLoadPlayList","loadAudioErrorPlayNext","clearPriorAudioLists","showDestroy","showDownload","showReload","toggleMode","glassBg","showThemeSwitch","showMediaSession","restartCurrentOnPrev","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","isNaN","scrobbled","onAudioVolumeChange","setVolume","sqrt","onAudioPlay","ReactGA","category","image","silent","sendNotification","onAudioPause","onAudioEnded","currentPlayId","onCoverClick","onBeforeDestroy","quietUpdate","getAudioInstance","instance","retrieveTranslation","prepareLanguage","lang","removeEmpty","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","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","useChangeThemeColor","querySelector","setAttribute","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.6ff245cb.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 enableUserEditing: true,\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'\nimport jwtDecode from 'jwt-decode'\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 const decoded = jwtDecode(token)\n localStorage.setItem('token', token)\n localStorage.setItem('userId', decoded.uid)\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'\nexport const SET_TOGGLEABLE_FIELDS = 'SET_TOGGLEABLE_FIELDS'\nexport const SET_OMITTED_FIELDS = 'SET_OMITTED_FIELDS'\n\nexport const setNotificationsState = (enabled) => ({\n type: SET_NOTIFICATIONS_STATE,\n data: enabled,\n})\n\nexport const setToggleableFields = (obj) => ({\n type: SET_TOGGLEABLE_FIELDS,\n data: obj,\n})\n\nexport const setOmittedFields = (obj) => ({\n type: SET_OMITTED_FIELDS,\n data: obj,\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/keepalive`)\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 'blueimp-md5'\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 // TODO Store all items in one object\n localStorage.setItem('token', response.token)\n localStorage.setItem('userId', response.id)\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) {\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('userId')\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:not(:only-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:only-child': {\n margin: '1.5rem',\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 {\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 minWidth: '75vw',\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, .75)',\n },\n systemNameLink: {\n color: '#fff',\n },\n card: {\n border: '1px solid #282828',\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:not(:only-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:only-child': {\n margin: '1.5rem',\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 {\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 },\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&filter={}',\n },\n random: {\n icon: ,\n params: 'sort=random&order=ASC&filter={}',\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&filter={}',\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 Typography from '@material-ui/core/Typography'\nimport sanitizeFieldRestProps from './sanitizeFieldRestProps'\nimport md5 from 'blueimp-md5'\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 = record && 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'\nimport inflection from 'inflection'\n\nconst useQuickFilterStyles = makeStyles((theme) => ({\n chip: {\n marginBottom: theme.spacing(1),\n },\n}))\n\nexport const QuickFilter = ({ source, resource, label, defaultValue }) => {\n const translate = useTranslate()\n const classes = useQuickFilterStyles()\n let lbl = label || source\n if (typeof lbl === 'string' || lbl instanceof String) {\n if (label) {\n lbl = translate(lbl, {\n _: inflection.humanize(inflection.underscore(lbl)),\n })\n } else {\n lbl = translate(`resources.${resource}.fields.${source}`, {\n _: inflection.humanize(inflection.underscore(source)),\n })\n }\n }\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 'react-admin'\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 {\n BooleanField,\n DateField,\n TextField,\n NumberField,\n useTranslate,\n} 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 bpm: ,\n comment: ,\n }\n if (!record.discSubtitle) {\n delete data.discSubtitle\n }\n if (!record.comment) {\n delete data.comment\n }\n if (!record.bpm) {\n delete data.bpm\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 { 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) => 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'\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(\n (state) => 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 'react-admin'\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 'react-admin'\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 { open, selectedIds, onSuccess, duplicateSong, 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 PersonIcon from '@material-ui/icons/Person'\nimport SupervisorAccountIcon from '@material-ui/icons/SupervisorAccount'\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.name !== 'user' &&\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 resourceDefinition = (resourceName) =>\n resources.find((r) => r?.name === resourceName)\n\n const renderUserMenuItemLink = () => {\n const userResource = resourceDefinition('user')\n if (!userResource) {\n return null\n }\n if (permissions !== 'admin') {\n if (!config.enableUserEditing) {\n return null\n }\n userResource.icon = PersonIcon\n } else {\n userResource.icon = SupervisorAccountIcon\n }\n return renderSettingsMenuItemLink(\n userResource,\n permissions !== 'admin' ? localStorage.getItem('userId') : null\n )\n }\n\n const renderSettingsMenuItemLink = (resource, id) => {\n const label = translate(`resources.${resource.name}.name`, {\n smart_count: id ? 1 : 2,\n })\n const link = id ? `/${resource.name}/${id}` : `/${resource.name}`\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 {renderUserMenuItemLink()}\n {resources\n .filter(settingsResources)\n .map((r) => renderSettingsMenuItemLink(r))}\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 {\n useDeleteWithConfirmController,\n Button,\n Confirm,\n useNotify,\n useRedirect,\n} 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 { resource, record, basePath, className, onClick, ...rest } = props\n\n const notify = useNotify()\n const redirect = useRedirect()\n\n const onSuccess = () => {\n notify('resources.user.notifications.deleted')\n redirect('/user')\n }\n\n const { open, loading, handleDialogOpen, handleDialogClose, handleDelete } =\n useDeleteWithConfirmController({\n resource,\n record,\n basePath,\n onClick,\n onSuccess,\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, { useCallback } 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 useMutation,\n useNotify,\n useRedirect,\n useRefresh,\n FormDataConsumer,\n usePermissions,\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 = ({ showDelete, ...props }) => (\n <Toolbar {...props} classes={useStyles()}>\n <SaveButton disabled={props.pristine} />\n {showDelete && <DeleteUserButton />}\n </Toolbar>\n)\n\nconst CurrentPasswordInput = ({ formData, isMyself, ...rest }) => {\n const { permissions } = usePermissions()\n return formData.changePassword && (isMyself || permissions !== 'admin') ? (\n <PasswordInput className=\"ra-input\" source=\"currentPassword\" {...rest} />\n ) : null\n}\n\nconst NewPasswordInput = ({ formData, ...rest }) => {\n const translate = useTranslate()\n return formData.changePassword ? (\n <PasswordInput\n source=\"password\"\n className=\"ra-input\"\n label={translate('resources.user.fields.newPassword')}\n {...rest}\n />\n ) : null\n}\n\nconst UserEdit = (props) => {\n const { permissions } = props\n const translate = useTranslate()\n const [mutate] = useMutation()\n const notify = useNotify()\n const redirect = useRedirect()\n const refresh = useRefresh()\n\n const isMyself = props.id === localStorage.getItem('userId')\n const getNameHelperText = () =>\n isMyself && {\n helperText: translate('resources.user.helperTexts.name'),\n }\n const canDelete = permissions === 'admin' && !isMyself\n\n const save = useCallback(\n async (values) => {\n try {\n await mutate(\n {\n type: 'update',\n resource: 'user',\n payload: { id: values.id, data: values },\n },\n { returnPromise: true }\n )\n notify('resources.user.notifications.updated', 'info', {\n smart_count: 1,\n })\n permissions === 'admin' ? redirect('/user') : refresh()\n } catch (error) {\n if (error.body.errors) {\n return error.body.errors\n }\n }\n },\n [mutate, notify, permissions, redirect, refresh]\n )\n\n return (\n <Edit title={<UserTitle />} undoable={false} {...props}>\n <SimpleForm\n variant={'outlined'}\n toolbar={<UserToolbar showDelete={canDelete} />}\n save={save}\n >\n {permissions === 'admin' && (\n <TextInput source=\"userName\" validate={[required()]} />\n )}\n <TextInput\n source=\"name\"\n validate={[required()]}\n {...getNameHelperText()}\n />\n <TextInput source=\"email\" validate={[email()]} />\n <BooleanInput source=\"changePassword\" />\n <FormDataConsumer>\n {(formDataProps) => (\n <CurrentPasswordInput isMyself={isMyself} {...formDataProps} />\n )}\n </FormDataConsumer>\n <FormDataConsumer>\n {(formDataProps) => <NewPasswordInput {...formDataProps} />}\n </FormDataConsumer>\n\n {permissions === 'admin' && (\n <BooleanInput source=\"isAdmin\" initialValue={false} />\n )}\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}\n\nexport default UserEdit\n","import UserList from './UserList'\nimport UserEdit from './UserEdit'\nimport UserCreate from './UserCreate'\n\nexport default {\n list: UserList,\n edit: UserEdit,\n create: UserCreate,\n}\n","import React, { useCallback } from 'react'\nimport {\n BooleanInput,\n Create,\n TextInput,\n PasswordInput,\n required,\n email,\n SimpleForm,\n useTranslate,\n useMutation,\n useNotify,\n useRedirect,\n} from 'react-admin'\nimport { Title } from '../common'\n\nconst UserCreate = (props) => {\n const translate = useTranslate()\n const [mutate] = useMutation()\n const notify = useNotify()\n const redirect = useRedirect()\n const resourceName = translate('resources.user.name', { smart_count: 1 })\n const title = translate('ra.page.create', {\n name: `${resourceName}`,\n })\n\n const save = useCallback(\n async (values) => {\n try {\n await mutate(\n {\n type: 'create',\n resource: 'user',\n payload: { data: values },\n },\n { returnPromise: true }\n )\n notify('resources.user.notifications.created', 'info', {\n smart_count: 1,\n })\n redirect('/user')\n } catch (error) {\n if (error.body.errors) {\n return error.body.errors\n }\n }\n },\n [mutate, notify, redirect]\n )\n\n return (\n <Create title={<Title subTitle={title} />} {...props}>\n <SimpleForm save={save} 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, { useState } from 'react'\nimport PropTypes from 'prop-types'\nimport IconButton from '@material-ui/core/IconButton'\nimport Menu from '@material-ui/core/Menu'\nimport MenuItem from '@material-ui/core/MenuItem'\nimport { makeStyles, Typography } from '@material-ui/core'\nimport MoreVertIcon from '@material-ui/icons/MoreVert'\nimport Checkbox from '@material-ui/core/Checkbox'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { useTranslate } from 'react-admin'\nimport { setToggleableFields } from '../actions'\n\nconst useStyles = makeStyles({\n menuIcon: {\n position: 'relative',\n top: '-0.5em',\n },\n menu: {\n width: '24ch',\n },\n columns: {\n maxHeight: '21rem',\n overflow: 'auto',\n },\n title: {\n margin: '1rem',\n },\n})\n\nconst ToggleFieldsMenu = ({ resource, topbarComponent: TopBarComponent }) => {\n const [anchorEl, setAnchorEl] = useState(null)\n const dispatch = useDispatch()\n const translate = useTranslate()\n const toggleableColumns = useSelector(\n (state) => state.settings.toggleableFields[resource]\n )\n const omittedColumns =\n useSelector((state) => state.settings.omittedFields[resource]) || []\n\n const classes = useStyles()\n const open = Boolean(anchorEl)\n\n const handleOpen = (event) => {\n setAnchorEl(event.currentTarget)\n }\n const handleClose = () => {\n setAnchorEl(null)\n }\n\n const handleClick = (selectedColumn) => {\n dispatch(\n setToggleableFields({\n [resource]: {\n ...toggleableColumns,\n [selectedColumn]: !toggleableColumns[selectedColumn],\n },\n })\n )\n }\n\n return (\n <div className={classes.menuIcon}>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={handleOpen}\n >\n <MoreVertIcon />\n </IconButton>\n <Menu\n id=\"long-menu\"\n anchorEl={anchorEl}\n keepMounted\n open={open}\n onClose={handleClose}\n classes={{\n paper: classes.menu,\n }}\n >\n {TopBarComponent && <TopBarComponent />}\n {toggleableColumns ? (\n <div>\n <Typography className={classes.title}>\n {translate('ra.toggleFieldsMenu.columnsToDisplay')}\n </Typography>\n <div className={classes.columns}>\n {Object.entries(toggleableColumns).map(([key, val]) =>\n !omittedColumns.includes(key) ? (\n <MenuItem key={key} onClick={() => handleClick(key)}>\n <Checkbox checked={val} />\n {translate(`resources.${resource}.fields.${key}`)}\n </MenuItem>\n ) : null\n )}\n </div>\n </div>\n ) : null}\n </Menu>\n </div>\n )\n}\n\nexport default ToggleFieldsMenu\n\nToggleFieldsMenu.propTypes = {\n resource: PropTypes.string.isRequired,\n topbarComponent: PropTypes.elementType,\n}\n","import React, { cloneElement } from 'react'\nimport { sanitizeListRestProps, TopToolbar } from 'react-admin'\nimport { useMediaQuery } from '@material-ui/core'\nimport { ShuffleAllButton } from '../common'\nimport ToggleFieldsMenu from '../common/ToggleFieldsMenu'\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 const isNotSmall = useMediaQuery((theme) => theme.breakpoints.up('sm'))\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 {isNotSmall && <ToggleFieldsMenu resource=\"song\" />}\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, { useState, useEffect } from 'react'\nimport PropTypes from 'prop-types'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { setOmittedFields, setToggleableFields } from '../actions'\n\nconst useSelectedFields = ({\n resource,\n columns,\n omittedColumns = [],\n defaultOff = [],\n}) => {\n const dispatch = useDispatch()\n const resourceFields = useSelector(\n (state) => state.settings.toggleableFields\n )?.[resource]\n const omittedFields = useSelector((state) => state.settings.omittedFields)?.[\n resource\n ]\n\n const [filteredComponents, setFilteredComponents] = useState([])\n\n useEffect(() => {\n if (\n !resourceFields ||\n Object.keys(resourceFields).length !== Object.keys(columns).length\n ) {\n const obj = {}\n for (const key of Object.keys(columns)) {\n obj[key] = !defaultOff.includes(key)\n }\n dispatch(setToggleableFields({ [resource]: obj }))\n }\n if (!omittedFields) {\n dispatch(setOmittedFields({ [resource]: omittedColumns }))\n }\n }, [\n columns,\n defaultOff,\n dispatch,\n omittedColumns,\n omittedFields,\n resource,\n resourceFields,\n ])\n\n useEffect(() => {\n if (resourceFields) {\n const filtered = []\n const omitted = omittedColumns\n for (const [key, val] of Object.entries(columns)) {\n if (!val) omitted.push(key)\n else if (resourceFields[key]) filtered.push(val)\n }\n if (filteredComponents.length !== filtered.length)\n setFilteredComponents(filtered)\n if (omittedFields.length !== omitted.length)\n dispatch(setOmittedFields({ [resource]: omitted }))\n }\n }, [\n resourceFields,\n columns,\n dispatch,\n omittedColumns,\n omittedFields,\n resource,\n filteredComponents.length,\n ])\n\n return React.Children.toArray(filteredComponents)\n}\n\nexport default useSelectedFields\n\nuseSelectedFields.propTypes = {\n resource: PropTypes.string,\n columns: PropTypes.object,\n omittedColumns: PropTypes.arrayOf(PropTypes.string),\n defaultOff: PropTypes.arrayOf(PropTypes.string),\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 useSelectedFields from '../common/useSelectedFields'\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 const toggleableFields = React.useMemo(() => {\n return {\n album: 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 artist: <TextField source=\"artist\" />,\n trackNumber: isDesktop && <NumberField source=\"trackNumber\" />,\n playCount: isDesktop && (\n <NumberField source=\"playCount\" sortByOrder={'DESC'} />\n ),\n year: isDesktop && (\n <FunctionField\n source=\"year\"\n render={(r) => r.year || ''}\n sortByOrder={'DESC'}\n />\n ),\n quality: isDesktop && <QualityInfo source=\"quality\" sortable={false} />,\n duration: <DurationField source=\"duration\" />,\n rating: config.enableStarRating && (\n <RatingField\n source=\"rating\"\n sortByOrder={'DESC'}\n resource={'song'}\n className={classes.ratingField}\n />\n ),\n bpm: isDesktop && <NumberField source=\"bpm\" />,\n }\n }, [isDesktop, classes.ratingField])\n\n const columns = useSelectedFields({\n resource: 'song',\n columns: toggleableFields,\n defaultOff: ['bpm'],\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 {columns}\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 {\n Button,\n sanitizeListRestProps,\n TopToolbar,\n useTranslate,\n} from 'react-admin'\nimport {\n ButtonGroup,\n useMediaQuery,\n Typography,\n makeStyles,\n} 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, albumViewTable } from '../actions'\nimport ToggleFieldsMenu from '../common/ToggleFieldsMenu'\n\nconst useStyles = makeStyles({\n title: { margin: '1rem' },\n buttonGroup: { width: '100%', justifyContent: 'center' },\n leftButton: { paddingRight: '0.5rem' },\n rightButton: { paddingLeft: '0.5rem' },\n})\n\nconst AlbumViewToggler = React.forwardRef(\n ({ showTitle = true, disableElevation, fullWidth }, ref) => {\n const dispatch = useDispatch()\n const albumView = useSelector((state) => state.albumView)\n const classes = useStyles()\n const translate = useTranslate()\n return (\n <div ref={ref}>\n {showTitle && (\n <Typography className={classes.title}>\n {translate('ra.toggleFieldsMenu.layout')}\n </Typography>\n )}\n <ButtonGroup\n variant=\"text\"\n color=\"primary\"\n aria-label=\"text primary button group\"\n className={classes.buttonGroup}\n >\n <Button\n size=\"small\"\n className={classes.leftButton}\n label={translate('ra.toggleFieldsMenu.grid')}\n color={albumView.grid ? 'primary' : 'secondary'}\n onClick={() => dispatch(albumViewGrid())}\n >\n <ViewModuleIcon fontSize=\"inherit\" />\n </Button>\n <Button\n size=\"small\"\n className={classes.rightButton}\n label={translate('ra.toggleFieldsMenu.table')}\n color={albumView.grid ? 'secondary' : 'primary'}\n onClick={() => dispatch(albumViewTable())}\n >\n <ViewHeadlineIcon fontSize=\"inherit\" />\n </Button>\n </ButtonGroup>\n </div>\n )\n }\n)\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 isNotSmall = useMediaQuery((theme) => theme.breakpoints.up('sm'))\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 {isNotSmall ? (\n <ToggleFieldsMenu resource=\"album\" topbarComponent={AlbumViewToggler} />\n ) : (\n <AlbumViewToggler showTitle={false} />\n )}\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_TABLE = 'ALBUM_TABLE_MODE'\n\nexport const albumViewGrid = () => ({ type: ALBUM_MODE_GRID })\n\nexport const albumViewTable = () => ({ type: ALBUM_MODE_TABLE })\n","import React, { useMemo } 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'\nimport useSelectedFields from '../common/useSelectedFields'\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 AlbumTableView = ({\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\n const toggleableFields = useMemo(() => {\n return {\n artist: <ArtistLinkField source=\"artist\" />,\n songCount: isDesktop && (\n <NumberField source=\"songCount\" sortByOrder={'DESC'} />\n ),\n playCount: isDesktop && (\n <NumberField source=\"playCount\" sortByOrder={'DESC'} />\n ),\n year: (\n <RangeField source={'year'} sortBy={'maxYear'} sortByOrder={'DESC'} />\n ),\n duration: isDesktop && <DurationField source=\"duration\" />,\n rating: config.enableStarRating && (\n <RatingField\n source={'rating'}\n resource={'album'}\n sortByOrder={'DESC'}\n className={classes.ratingField}\n />\n ),\n }\n }, [classes.ratingField, isDesktop])\n\n const columns = useSelectedFields({\n resource: 'album',\n columns: toggleableFields,\n })\n\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 {columns}\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 AlbumTableView\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, useListContext, Loading } 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.name}\n className={classes.cover}\n />\n </div>\n )\n }\n)\n\nconst AlbumGridTile = ({ showArtist, record, basePath }) => {\n const classes = useStyles()\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'), {\n noSsr: true,\n })\n if (!record) {\n return null\n }\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 = ({ albumListType, loaded, loading, ...props }) => {\n const hide =\n (loading && albumListType === 'random') || !props.data || !props.ids\n return hide ? <Loading /> : <LoadedAlbumGrid {...props} />\n}\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 Pagination,\n ReferenceInput,\n SearchInput,\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 AlbumTableView from './AlbumTableView'\nimport AlbumGridView from './AlbumGridView'\nimport { AddToPlaylistDialog } from '../dialogs'\nimport albumLists, { defaultAlbumList } from './albumLists'\nimport config from '../config'\nimport useSelectedFields from '../common/useSelectedFields'\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 // Workaround to force album columns to appear the first time.\n // See https://github.com/navidrome/navidrome/pull/923#issuecomment-833004842\n // TODO: Find a better solution\n useSelectedFields({\n resource: 'album',\n columns: {\n artist: 'artist',\n songCount: 'songCount',\n playCount: 'playCount',\n year: 'year',\n duration: 'duration',\n rating: 'rating',\n },\n })\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 albumListType={albumListType} {...props} />\n ) : (\n <AlbumTableView {...props} />\n )}\n </List>\n <AddToPlaylistDialog />\n </>\n )\n}\n\nexport default withWidth()(AlbumList)\n","import React, { useMemo } from 'react'\nimport {\n BulkActionsToolbar,\n ListToolbar,\n TextField,\n NumberField,\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 useSelectedFields from '../common/useSelectedFields'\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\n const toggleableFields = useMemo(() => {\n return {\n trackNumber: isDesktop && (\n <TextField\n source=\"trackNumber\"\n sortBy=\"discNumber asc, trackNumber asc\"\n label=\"#\"\n sortable={false}\n />\n ),\n title: (\n <SongTitleField\n source=\"title\"\n sortable={false}\n showTrackNumbers={!isDesktop}\n />\n ),\n artist: isDesktop && <TextField source=\"artist\" sortable={false} />,\n duration: <DurationField source=\"duration\" sortable={false} />,\n quality: isDesktop && <QualityInfo source=\"quality\" sortable={false} />,\n bpm: isDesktop && <NumberField source=\"bpm\" sortable={false} />,\n rating: isDesktop && config.enableStarRating && (\n <RatingField\n source=\"rating\"\n resource={'albumSong'}\n sortable={false}\n className={classes.ratingField}\n />\n ),\n }\n }, [isDesktop, classes.ratingField])\n\n const columns = useSelectedFields({\n resource: 'albumSong',\n columns: toggleableFields,\n omittedColumns: ['title'],\n defaultOff: ['bpm'],\n })\n\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 {columns}\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, makeStyles } from '@material-ui/core'\nimport config from '../config'\nimport ToggleFieldsMenu from '../common/ToggleFieldsMenu'\n\nconst useStyles = makeStyles({\n toolbar: { display: 'flex', justifyContent: 'space-between', width: '100%' },\n})\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 classes = useStyles()\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n const isNotSmall = useMediaQuery((theme) => theme.breakpoints.up('sm'))\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 <div className={classes.toolbar}>\n <div>\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 </div>\n <div>{isNotSmall && <ToggleFieldsMenu resource=\"albumSong\" />}</div>\n </div>\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 width: '100%',\n },\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 { sanitizeListRestProps, TopToolbar } from 'react-admin'\nimport { useMediaQuery } from '@material-ui/core'\nimport ToggleFieldsMenu from '../common/ToggleFieldsMenu'\n\nconst ArtistListActions = ({ className, ...rest }) => {\n const isNotSmall = useMediaQuery((theme) => theme.breakpoints.up('sm'))\n\n return (\n <TopToolbar className={className} {...sanitizeListRestProps(rest)}>\n {isNotSmall && <ToggleFieldsMenu resource=\"artist\" />}\n </TopToolbar>\n )\n}\n\nexport default ArtistListActions\n","import React, { useMemo } 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'\nimport ArtistListActions from './ArtistListActions'\nimport useSelectedFields from '../common/useSelectedFields'\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\n const toggleableFields = useMemo(() => {\n return {\n albumCount: <NumberField source=\"albumCount\" sortByOrder={'DESC'} />,\n songCount: <NumberField source=\"songCount\" sortByOrder={'DESC'} />,\n playCount: <NumberField source=\"playCount\" sortByOrder={'DESC'} />,\n rating: config.enableStarRating && (\n <RatingField\n source=\"rating\"\n sortByOrder={'DESC'}\n resource={'artist'}\n className={classes.ratingField}\n />\n ),\n }\n }, [classes.ratingField])\n\n const columns = useSelectedFields({\n resource: 'artist',\n columns: toggleableFields,\n })\n\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 {columns}\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 actions={<ArtistListActions />}\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 sanitizeListRestProps,\n TopToolbar,\n CreateButton,\n useTranslate,\n} from 'react-admin'\nimport { useMediaQuery } from '@material-ui/core'\nimport ToggleFieldsMenu from '../common/ToggleFieldsMenu'\n\nconst PlaylistListActions = ({ className, ...rest }) => {\n const isNotSmall = useMediaQuery((theme) => theme.breakpoints.up('sm'))\n const translate = useTranslate()\n\n return (\n <TopToolbar className={className} {...sanitizeListRestProps(rest)}>\n <CreateButton basePath=\"/playlist\">\n {translate('ra.action.create')}\n </CreateButton>\n {isNotSmall && <ToggleFieldsMenu resource=\"playlist\" />}\n </TopToolbar>\n )\n}\n\nexport default PlaylistListActions\n","import React, { useMemo } 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 { useMediaQuery } from '@material-ui/core'\nimport { DurationField, List, Writable, isWritable } from '../common'\nimport useSelectedFields from '../common/useSelectedFields'\nimport PlaylistListActions from './PlaylistListActions'\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 const toggleableFields = useMemo(() => {\n return {\n owner: <TextField source=\"owner\" />,\n songCount: isDesktop && <NumberField source=\"songCount\" />,\n duration: isDesktop && <DurationField source=\"duration\" />,\n updatedAt: isDesktop && (\n <DateField source=\"updatedAt\" sortByOrder={'DESC'} />\n ),\n public: !isXsmall && (\n <TogglePublicInput\n source=\"public\"\n permissions={permissions}\n sortByOrder={'DESC'}\n />\n ),\n }\n }, [isDesktop, isXsmall, permissions])\n\n const columns = useSelectedFields({\n resource: 'playlist',\n columns: toggleableFields,\n })\n\n return (\n <List\n {...props}\n exporter={false}\n filters={<PlaylistFilter />}\n actions={<PlaylistListActions />}\n >\n <Datagrid\n rowClick=\"show\"\n isRowSelectable={(r) => isWritable(r && r.owner)}\n >\n <TextField source=\"name\" />\n {columns}\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, useMemo } from 'react'\nimport {\n BulkActionsToolbar,\n ListToolbar,\n TextField,\n NumberField,\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'\nimport useSelectedFields from '../common/useSelectedFields'\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 const toggleableFields = useMemo(() => {\n return {\n trackNumber: isDesktop && <TextField source=\"id\" label={'#'} />,\n title: <SongTitleField source=\"title\" showTrackNumbers={false} />,\n album: isDesktop && <AlbumLinkField source=\"album\" />,\n artist: isDesktop && <TextField source=\"artist\" />,\n duration: (\n <DurationField source=\"duration\" className={classes.draggable} />\n ),\n quality: isDesktop && <QualityInfo source=\"quality\" sortable={false} />,\n bpm: isDesktop && <NumberField source=\"bpm\" />,\n }\n }, [isDesktop, classes.draggable])\n\n const columns = useSelectedFields({\n resource: 'playlistTrack',\n columns: toggleableFields,\n defaultOff: ['bpm'],\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 {columns}\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, makeStyles } from '@material-ui/core'\nimport config from '../config'\nimport ToggleFieldsMenu from '../common/ToggleFieldsMenu'\n\nconst useStyles = makeStyles({\n toolbar: { display: 'flex', justifyContent: 'space-between', width: '100%' },\n})\n\nconst PlaylistActions = ({ className, ids, data, record, ...rest }) => {\n const dispatch = useDispatch()\n const translate = useTranslate()\n const classes = useStyles()\n const dataProvider = useDataProvider()\n const notify = useNotify()\n const isDesktop = useMediaQuery((theme) => theme.breakpoints.up('md'))\n const isNotSmall = useMediaQuery((theme) => theme.breakpoints.up('sm'))\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 <div className={classes.toolbar}>\n <div>\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 </div>\n <div>{isNotSmall && <ToggleFieldsMenu resource=\"playlistTrack\" />}</div>\n </div>\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 width: '100%',\n },\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 restartCurrentOnPrev: 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(\n (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 { 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 = 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_TABLE } 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_TABLE:\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 {\n SET_NOTIFICATIONS_STATE,\n SET_OMITTED_FIELDS,\n SET_TOGGLEABLE_FIELDS,\n} from '../actions'\n\nconst initialState = {\n notifications: false,\n toggleableFields: {},\n omittedFields: {},\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 case SET_TOGGLEABLE_FIELDS:\n return {\n ...previousState,\n toggleableFields: {\n ...previousState.toggleableFields,\n ...data,\n },\n }\n case SET_OMITTED_FIELDS:\n return {\n ...previousState,\n omittedFields: {\n ...previousState.omittedFields,\n ...data,\n },\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 { useEffect } from 'react'\nimport useCurrentTheme from './themes/useCurrentTheme'\n\nconst useChangeThemeColor = () => {\n const theme = useCurrentTheme()\n const color =\n theme.palette?.primary?.light || theme.palette?.primary?.main || '#ffffff'\n useEffect(() => {\n const themeColor = document.querySelector(\"meta[name='theme-color']\")\n themeColor.setAttribute('content', color)\n }, [color])\n}\n\nexport default useChangeThemeColor\n","import React, { useEffect } 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 { HotKeys } from 'react-hotkeys'\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 { keyMap } from './hotkeys'\nimport useChangeThemeColor from './useChangeThemeColor'\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 useChangeThemeColor()\n const dispatch = useDispatch()\n useEffect(() => {\n if (config.devActivityPanel) {\n setDispatch(dispatch)\n authProvider\n .checkAuth()\n .then(() => startEventStream())\n .catch(() => {}) // ignore if not logged in\n }\n }, [dispatch])\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 <Resource name=\"user\" {...user} options={{ subMenu: 'settings' }} />,\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 <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":""}